翻译PCL中的字符串

时间:2016-02-02 12:32:15

标签: c# localization

我的项目中有一系列本地化文件。我当前的语言环境在de-CH中,但服务器的模式是英语。

在我的PCL中,有没有办法将de-CH字符串转换为英文形式?

翻译在标准的resx文件中。

1 个答案:

答案 0 :(得分:0)

以下对我有用:

我在en-US文件夹中创建了一个英文资源文件的PCL项目:

<?xml version="1.0" encoding="utf-8"?>
<root>
  ...
  <data name="GoodMorning" xml:space="preserve">
    <value>Good morning!</value>
  </data>
</root>

...和de-CH文件夹中的瑞士资源文件:

<?xml version="1.0" encoding="utf-8"?>
<root>
  ...
  <data name="GoodMorning" xml:space="preserve">
    <value>Guten Morgen!</value>
  </data>
</root>

这会生成两个可以直接使用的包装类,例如

string english = en_US.Resources.GoodMorning; // Returns "Good morning!"
string swiss = de_CH.Resources.GoodMorning;   // Returns "Guten morgen!"

......这可能会回答你的问题。如果没有,ResourceManager.GetString方法的重载为CultureInfo;这也许是一条可行的道路。

所有这些都假定您拥有资源ID;如果你有瑞士字符串的并想要找到相应的英文字符串,事情会变得复杂一些。当然,您可以使用的工具取决于您的PCL所针对的平台。

编辑:

鉴于瑞士字符串,您可以使用反射进行查找以获取属性值。为简单起见,这假设瑞士语和英语资源完全相同 - 现实代码可能必须处理一种或两种语言中缺少的字符串:

public static string GetEnglishString(string swiss)
{
    Type englishResources = typeof(en_US.Resources);
    Type swissResources = typeof(de_CH.Resources);
    PropertyInfo[] infos = swissResources.GetProperties(BindingFlags.NonPublic | BindingFlags.Static);
    foreach (PropertyInfo info in infos.Where(info => "Culture" != info.Name && "ResourceManager" != info.Name))
    {
        string value = info.GetValue(null, null) as string;
        if (value == swiss)
        {
            PropertyInfo englishProperty = englishResources.GetProperty(
                info.Name,
                BindingFlags.NonPublic | BindingFlags.Static);
            string english = englishProperty.GetValue(null, null) as string;
            return english;
        }
    }

    return null;
}

这需要System.Reflection.TypeExtensions,可通过NuGet获得。在现实生活中,只做一次并设置一个瑞士语到英语Dictionary。并祈祷瑞士字符串集不包含重复值。 : - )