国际化mvc -哪个是最好的方法?会话cookie

本文关键字:方法 会话 cookie mvc 国际化 | 更新日期: 2023-09-27 17:53:54

亲爱的大家,我正在开发一个mvc应用程序,需要支持两种或多种语言,并覆盖不同国家的UI。我想收到一些最佳方法的指导,以便存储用户选择的语言和门户。我一直在阅读,似乎:

  • 它可以存储在cookie中,读取这些值作为永久数据,并在某些值更改时重新创建该cookie
  • 另一种情况,他们更喜欢在会话的httpcontext中设置信息。
  • 另一种方法是使用基本控制器来更改数据,同时考虑到区域设置的选择。

如果有任何意见,我将不胜感激。提前感谢。brgds .

国际化mvc -哪个是最好的方法?会话cookie

我使用了这个模式,我很满意。

它在路由中有语言。这是很方便的:

  • 在某些情况下,您将不得不通过电子邮件发送链接到所选语言的页面
  • SEO
  • 在开发和翻译过程中很容易在语言之间切换
  • 负载均衡器没有问题
  • 如果你能在url中定义语言,
  • 前端测试会更稳定。

我找到的使枚举国际化或从各自的资源文件中获取枚举文本的方法是通过继承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和GetString提供扩展方法。

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();
    }
}

在Enum的元素上可以写:

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文件中,你可以绑定enum到你的下拉列表,如:

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

会话/cookie适合此目的。