我正在尝试创建一个本地化系统来处理我们应用程序中的不同语言。我有一个通用模块,可以发生所有魔法,View Models可以根据语言获取正确的字符串值。
应用程序语言,例如"en_US"
传递给Common Modules LocaleLanguage
类,然后该类应返回包含与该语言相关的所有字符串的必需对象。 E.g:
public object GetLangaugeClass()
{
switch (language)
{
case "en_US":
return new en_US();
....
default:
return new en_US();
}
}
每个en_US
等类都有公共字符串。我试图使用Xml文件,但这并没有奏效。
问题是返回的object
是一个对象,这阻止我访问类公共字符串。有关如何解决这个问题的任何想法?
答案 0 :(得分:0)
您可以使用ResourceManager
课程和satellite assemblies进行本地化。这样,您就不需要为每种语言创建单独的类。
当您设置DefaultThreadCurrentUICulture
时,ResourceManager
会在相应的文件夹中查找资源。
CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.GetCultureInfo("en-US");
资源文件需要位于" en-US"在这种情况下的文件夹。
然后,您可以调用ResourceManager
的{{3}}方法来获取您的本地化字符串。
Assembly executingAssembly = Assembly.GetExecutingAssembly();
ResourceManager resourceManager = new ResourceManager("Resources", executingAssembly);
string localizedString = resourceManager.GetString("resourceKey");
要从.resources.dll
文件创建附属程序集(resx
文件),您需要使用GetString
和resgen
。 resgen
创建.resources
文件,al
生成dll
。
答案 1 :(得分:0)
解决方案是从类中返回Dictionary<string, string>
而不是包含字符串字段的类。语言类例如en_US
每个都会有一个类添加的列表。例如:en_US
:
LanguageUS.Add("name", "Test US Name");
然后GetLanguageClass
返回一个字典:
case "en_US":
return new en_US().LanguageUS;
然后可以使用密钥来获取所需的值。