2016-05-06 42 views
0

我有一個多語言網站,瀏覽內容(包括標記)可以因語言而異。這就是爲什麼我不能將字符串本地化並將其放入資源中。如何本地化ASP.NET中的結構HTML視圖?

例如,我的觀點在俄羅斯:

<div class="card"> 
    <div class="card-image"> 
     <img src="~/Images/CardHeaders/Business_CreditsSME.jpg" /> 
    </div> 
    <div class="card-content"> 
     Text 
    </div>    
</div> 

查看英文:

<p>Text</p> 

我看到兩種方式來本地化此:

  1. 創建Page.cshtml和Page.en.cshtml,並在控制器中創建一個自定義的LocaleView()方法,該方法將使用本地化的視圖文件。

    • 問題是視圖並不總是不一樣。這意味着有時我會複製標記。
  2. 將我資源中的所有HTML標記原樣複製,並使用Html.Raw(Resources.PageView)

    • 這不是方便地創建,修改或讀取HTML,位於資源蒼蠅
    • 此外,我不喜歡在所有Html.Raw方法和不喜歡使用它的任何地方

你如何本地化不同結構的大觀點?

+0

我唯一能想到的方式是在控制器方法中有髒代碼,以便擁有一個開關盒並返回所需的視圖。 –

回答

0

非常好的問題!

在這兩個選項之間,第一個看起來更好一點。

但我通常會做的一件事。它創建了一個HTML助手來定位本地化視圖。

所以,你將能夠使用它的觀點是這樣的:

@Html.RenderLocale("YourView", ...); 

然後,在你RenderLocale,更改文件路徑,用戶想要的視圖。

public static string RenderLocale(this HtmlHelper helper, string target, ...) 
{ 
    var filePath = this.getLocaleFilePath(target); //it returns yourView.cshtml or yourView.ru.cshtml 
    return this.Action(filePath); // it renders or performs the action you want  
} 
1

我已經結合了兩種解決方案。

  1. 我已經重寫View方法在我的基本控制器,使它看起來對存在的局部視圖。現在,如果我的觀點相差太大,我簡單地創建View.en.cshtml文件,它會自動由一個控制器處理:

    public abstract class BaseController : Controller 
    { 
        protected override ViewResult View(string viewName, string masterName, object model) 
        { 
         if (string.IsNullOrEmpty(viewName)) 
          viewName = (string)RouteData.Values["action"]; 
    
         string localizedViewName = $"{viewName}.{CultureInfo.CurrentCulture.Name}"; 
         bool hasLocalizedView = ViewEngines.Engines 
          .FindPartialView(ControllerContext, localizedViewName) 
          .View != null; 
    
         return base.View(hasLocalizedView ? localizedViewName : viewName, masterName, model); 
        } 
    } 
    
  2. 如果我的觀點具有相同的結構,然後我不創建單獨的文件,只是使用具有本地化的字符串相同的觀點中這樣說:

    <div class="card"> 
        <div class="card-image"> 
         <img src="~/Images/CardHeaders/Business_CreditsSME.jpg" /> 
        </div> 
        <div class="card-content"> 
         @GlobalResources.LocalizedText 
        </div>    
    </div> 
    

結構現在看起來像:

- Views 
-- About 
--- History.cshtml 
--- History.kk.cshtml 
--- History.en.cshtml 
--- Vacancies.cshtml 

其中Vacancies.cshtml文件使用資源本地化一個頁面,History*文件本地化就像一個沒有資源的純文本。