2015-07-11 103 views
4

我正在開發使用MVC的多語言(英語,阿拉伯語)應用程序。此應用程序應根據資源文件顯示標籤和數據。MVC DisplayName和DisplayFor全球化

數據庫被設計成存儲在同一表中的翻譯的字段例如

Gender[Id, Name,ArabicName] 
    Person[Id,FirstName,FatherName,FamilyName,ArabicFirstName, 
      ArabicFatherName,ArabicFamilyName,GenderId] 

我管理通過使用NameArabicName字段之間進行切換來顯示基於所述資源的所有dropdownlist

 ViewBag.Gender= new SelectList(mEntities.Genders.ToList(), "Id", 
             Resources.Global.Name); 
    // Name value in the Global.resx is Name and in Global.ar.resx is ArabicName 

並且還通過使用以下項顯示LabelFor

[Display(Name="FirstName", ResourceType =typeof(Resources.Global))] 
public string FirstName{get;set;} 

我的問題,是有可能使用DisplayFor,以及如何在MVC實現這一目標的FirstNameArabicFirstName之間切換?

例如,以顯示:FirstName = Antony for english , ArabicFirstName = انطوان for arabic

+0

您可以使用相同的DisplayFor添加一些這樣的事情在模型和使用FirstName1 insted的名字[NotMapped] 公共字符串FirstName1 {獲取{返回.Dictionary.Dict.ResourceManager.GetString(FirstName); }} – Siva

回答

1

我提出了以下解決方法,使事情的工作

  1. 在資源文件中的標籤和數據值之間的區別我用convension:

FirstName代表標籤,FirstNameResource代表數據

示例資源文件將是這樣的:

FirstName => value = First Name (for english), الاسم الاول (for arabic) 
    FirstNameResource = > value = FirstName (for english) , ArabicFirstName (for arabic) 
  • 我編碼以下的HtmlHelper

    public static MvcHtmlString DisplayResourceFor<TModel, TValue>(this HtmlHelper<TModel> helper, 
        Expression<Func<TModel, TValue>> expression) 
    { 
        var rm = new ResourceManager("Resources.Global", 
         System.Reflection.Assembly.Load("App_GlobalResources")); 
        var resource = rm.GetString(string.Format("{0}Resource", 
         ExpressionHelper.GetExpressionText(expression))); 
        var value = helper.ViewContext.ViewData.GetViewDataInfo(resource).Value.ToString(); 
        return MvcHtmlString.Create(value); 
    } 
    
  • 可以使用此擴展如下:

    @ Html.DisplayResourceFor(m => m.FirstName)

  • 這種解決方法幫助我解決了這個問題,但也許還有另一個直接的解決方案。