国际化mvc3 - 哪种方法最好?会话,饼干?

时间:2011-04-28 20:17:54

标签: c# asp.net-mvc-3 internationalization

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

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

任何想法,优点缺点将不胜感激。谢谢。 brgds。

3 个答案:

答案 0 :(得分:2)

我使用了这个schema,我很满意。

它在路线中有语言。结果很方便:

  • 在某些时候,您必须通过电子邮件发送指向选择语言的页面的链接
  • SEO
  • 在开发和翻译过程中很容易在语言之间切换
  • 您的负载均衡器没有问题
  • 如果您可以在网址中定义语言,
  • 前端测试会更稳定

答案 1 :(得分:2)

我发现用于Enums国际化或从各个Resource文件获取Enums文本的方法是通过继承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();
    }
}

关于你的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&amp; 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))

答案 2 :(得分:1)

会话/ Cookie是good for this purpose