为视图模型创建Langauge本地化C#

时间:2017-01-04 06:44:57

标签: c# localization cross-platform mvvmcross

我正在尝试创建一个本地化系统来处理我们应用程序中的不同语言。我有一个通用模块,可以发生所有魔法,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是一个对象,这阻止我访问类公共字符串。有关如何解决这个问题的任何想法?

2 个答案:

答案 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文件),您需要使用GetStringresgenresgen创建.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;

然后可以使用密钥来获取所需的值。