亲爱的,我正在开发一个需要支持两种或更多语言的mvc应用程序,并涵盖不同国家的UI。 我希望获得一些最佳方法的指导,以便存储语言和门户的用户选择。 我一直在阅读,似乎:
任何想法,优点缺点将不胜感激。谢谢。 brgds。
答案 0 :(得分:2)
我使用了这个schema,我很满意。
它在路线中有语言。结果很方便:
答案 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。