2011-04-28 32 views
3

親愛的所有人,我正在開發一個mvc應用程序,需要支持兩種或更多種語言並覆蓋不同國家的用戶界面。 我希望收到一些最佳方法的指導,以便存儲用戶對語言和門戶的選擇。 從來就一直在閱讀它似乎是:國際化mvc3 - 這是最好的方法?會話,cookie?

  • 它可以被存儲在cookie中讀取這些值作爲永久的數據,並在一定的價值變化
  • 他們寧願在設置信息的另一種情況重新創建的cookie會話中的httpcontext。
  • 另一種方法是使用基本控制器在考慮區域設置選擇的情況下更改數據。

任何想法,優點缺點將不勝感激。提前感謝。 brgds。

回答

2

我用這個schema,我很滿意。

它在路線中有語言。這真可謂是方便:

  • 在某些時候,你將不得不通過電子郵件發送鏈接到一個網頁與choosen語言
  • SEO
  • 它很容易在開發和翻譯過程中的語言之間進行切換
  • 與負載平衡器沒有問題
  • 前端測試更穩定,如果你可以在URL定義語言
+0

好吧,似乎URL詳細國際化點。非常感謝。! sebasitan。 – 2011-04-28 22:48:01

+0

@Malcom_Frexner,但是您僅使用全局asax中的路由? – 2011-04-29 04:18:09

1

會話/ cookies是good for this purpose

+0

喜達林,非常感謝。任何建議或教程,以處理這種方法?我主要關心的是如何在用戶選擇數據中保留我的應用程序,同時考慮到他們不僅可以選擇語言,而且可以選擇基於它將覆蓋多次的事實。 brgds! – 2011-04-28 20:26:56

+0

@sebastian_h,你是否按照我的答案鏈接? – 2011-04-28 20:27:59

+0

uauu,不,我讀它像文字..對不起@Darin_Dimitrov:S。我在過去讀過他的文章,甚至嗨發佈了一個新的不鼓勵使用這種方法,並使用這個,而不是http://adamyan.blogspot.com/2010_07_01_archive.html集中在路線......但它似乎更專注於網址生成和seo問題。我會再讀一遍。謝謝 – 2011-04-28 20:34:59

2

我發現枚舉的國際化或者從各自的資源文件的枚舉獲取文本的方法是通過繼承DescriptionAttribute類

public class EnumResourceAttribute : DescriptionAttribute 
{ 

    public Type ResourceType { get; private set; } 
    public string ResourceName { get; private set; } 
    public int SortOrder { get; private set; } 
    public EnumResourceAttribute(Type ResourceType, 
         string ResourceName, 
         int SortOrder) 
    { 

     this.ResourceType = ResourceType; 
     this.ResourceName = ResourceName; 
     this.SortOrder = SortOrder; 
    } 
} 

創建另一個靜態類,將提供的GetString和GetStrings擴展方法來創建一個屬性類。

public static class EnumHelper 
{ 
    public static string GetString(this Enum value) 
    { 
     EnumResourceAttribute ea = 
     (EnumResourceAttribute)value.GetType().GetField(value.ToString()) 
     .GetCustomAttributes(typeof(EnumResourceAttribute), false) 
     .FirstOrDefault(); 
     if (ea != null) 
     { 
      PropertyInfo pi = ea.ResourceType 
      .GetProperty(CommonConstants.ResourceManager); 
      if (pi != null) 
      { 
       ResourceManager rm = (ResourceManager)pi 
       .GetValue(null, null); 
       return rm.GetString(ea.ResourceName); 
      } 

     } 
     return string.Empty; 
    } 


    public static IList GetStrings(this Type enumType) 
    { 
     List<string> stringList = new List<string>(); 
     FieldInfo[] fiArray = enumType.GetFields(); 
     foreach (FieldInfo fi in fiArray) 
     { 
      EnumResourceAttribute ea = 
       (EnumResourceAttribute)fi 
        .GetCustomAttributes(typeof(EnumResourceAttribute), false) 
        .FirstOrDefault(); 
      if (ea != null) 
      { 
       PropertyInfo pi = ea.ResourceType 
            .GetProperty(CommonConstants.ResourceManager); 
       if (pi != null) 
       { 
        ResourceManager rm = (ResourceManager)pi 
              .GetValue(null, null); 
        stringList.Add(rm.GetString(ea.ResourceName)); 
       } 
      } 
     } 
     return stringList.ToList(); 
    } 
} 

並在您的枚舉的元素,你可以這樣寫:

public enum Priority 
{ 
     [EnumResourceAttribute(typeof(Resources.AdviceModule), Resources.ResourceNames.AdviceCreateAdviceExternaPriorityMemberHigh, 1)] 
     High, 
     [EnumResourceAttribute(typeof(Resources.AdviceModule), Resources.ResourceNames.AdviceCreateAdviceExternaPriorityMemberRoutine, 2)] 
     Routine 
} 

Resources.ResourceNames.AdviceCreateAdviceExternaPriorityMemberHigh & Resources.ResourceNames.AdviceCreateAdviceExternaPriorityMemberRoutine是在資源文件中的常量,也可以說其值的字符串可以在不同的文化提供。

如果要實現在MVC架構的Web應用程序,然後創建一個屬性

private IList result; 
public IList Result 
     { 
      get 
      { 
       result = typeof(Priority).GetStrings(); 
       return result; 
      } 
     } 

,並在您.cshtml文件,您可以枚舉只綁定到你的下拉列表,如:

@Html.DropDownListFor(model => Model.vwClinicalInfo.Priority, new SelectList(Model.Result)) 
+0

偉大的信息@swati我會嘗試你的解決方案。 brgds! – 2011-09-27 14:31:43