【问题标题】:internationalization mvc3 - which is the best approach? session, cookie?国际化 mvc3 - 这是最好的方法?会话,cookie?
【发布时间】:2023-03-13 02:36:02
【问题描述】:

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

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

任何想法,利弊将不胜感激。在此先感谢。 brgds。

【问题讨论】:

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


    【解决方案1】:

    我用过这个schema,我很满意。

    它有路线中的语言。事实证明这很方便:

    • 在某些时候,您必须通过电子邮件发送指向所选语言页面的链接
    • 搜索引擎优化
    • 在开发和翻译过程中可以轻松切换语言
    • 您的负载平衡器没有问题
    • 如果可以在 url 中定义语言,前端测试会更稳定

    【讨论】:

    • 好的,似乎 url 详细说明了国际化的要点。太感谢了。!塞巴斯坦。
    • @Malcom_Frexner 但您只使用全局 asax 中的路由?
    【解决方案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 & 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))
    

    【讨论】:

    • 很棒的信息@swati 我会试试你的解决方案。 brgds!
    【解决方案3】:

    会话/cookie 为 good for this purpose

    【讨论】:

    • 嗨达林,非常感谢。为了处理这种方法,有什么建议或教程吗?我最关心的是如何在我的应用程序中保留用户选择数据,考虑到他们不仅可以选择语言,还可以选择国家,因为它会覆盖不止一次。 brgds!
    • @sebastian_h,您是否点击了我回答中的链接?
    • uauu,不,我像文字一样阅读它......对不起@Darin_Dimitrov:S。我过去读过他的帖子,甚至你也发布了一个新的帖子,不鼓励使用这种方法,而是使用 adamyan.blogspot.com/2010_07_01_archive.html 专注于路线......但它似乎更专注于 url 生成和 seo 问题。我会再读一遍。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多