Windows.Globalization.ApplicationLanguages.ManifestLanguages生成的语言代码错误

时间:2016-08-08 16:38:36

标签: localization uwp

我使用Multilingual App Toolkit以多种语言本地化我的UWP应用 这里有一些关于MultilingualResourcesFolder和Strings文件夹在项目中的样子的屏幕截图

多语种资源

enter image description here

的字符串

enter image description here

所有文件都填充了正确的值。

在应用程序中,我检索可用语言列表 Windows.Globalization.ApplicationLanguages.ManifestLanguages并迭代它们。迭代产生这些结果

  • PT-PT
  • RO-RO
  • RU
  • SK
  • SL

这很奇怪,因为语言是以相同的方式声明的,但是对于某些语言,语言代码包含语言环境,而对于某些语言代码则不然,我无法理解。

在我声明它们的方式中,迭代应该产生

  • PT-PT
  • RO-RO
  • RU-RU
  • SK-SK
  • SL-SL

我尝试通过替换像这样的x-generate手动声明appxmanifest中的语言

<Resources>
    <Resource Language="ru-ru"/>
    <Resource Language="sk-sk"/>
    <Resource Language="pt-pt"/>
    <Resource Language="sk-sk"/>
    <Resource Language="sl-sl"/>
</Resources

但结果是一样的。

我需要让应用程序识别语言环境以及每种语言的语言。 有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

我会让但丁跟进,但我很好奇为什么这个名单很有意思?例如:用户场景是什么?

UWP列出了它可以为其提供数据的语言,以及Region&amp;语言设置收集用户理解的语言列表。因此,Windows会确定哪种语言最适合用户和应用程序语言,资源加载器使用该语言。所以我很好奇缺少什么情景?

答案 1 :(得分:0)

好的,我有一个解决方案给你。你正在处理一个单独的问题,这就是为什么清单中的x-generate没有做正确的事情(或者是它?)。我正在调查那边。

所以,这是你想要的方法:

public static string GetLocaleFromLanguage(string identifier)
{
    int result;

    StringBuilder localeName = new StringBuilder(500);
    result = LocaleFunctions.ResolveLocaleName(identifier, localeName, 500);

    StringBuilder localeDisplay = new StringBuilder(500);
    result = LocaleFunctions.GetLocaleInfoEx(localeName.ToString(), LCTYPE.LOCALE_SENGLISHDISPLAYNAME, localeDisplay, 500);
    return localeDisplay.ToString();
}

当然,你需要外部人员:

class LocaleFunctions
{
    // pInvoke declarations

    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern int GetLocaleInfoEx(String lpLocaleName, LCTYPE LCType, StringBuilder lpLCData, int cchData);

    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern int ResolveLocaleName(string lpNameToResolve, StringBuilder lpLocaleName, int cchLocaleName);
}

不幸的是,您还需要LCTYPE的声明。可以在以下链接找到该代码:http://www.pinvoke.net/default.aspx/Enums/LCTYPE.html (这是一大块代码,我不想在这里复制它。

在我的代码中,我手动将以下语言资源添加到我的清单中(同样,我不确定为什么x-generate没有在这里添加俄语语言环境,但这可以解决它):

<Resources>
    <Resource Language="EN-US" />
    <Resource Language="ES-ES" />
    <Resource Language="ES-MX" />
    <Resource Language="PT-PT" />
    <Resource Language="RO-RO" />
    <Resource Language="RU-RU" />
    <Resource Language="RU-UA" />
</Resources>

这是我用来调用的方法:

private void button_Click(object sender, RoutedEventArgs e)
{
    string output = "";
    foreach (string thisManifestLanguage in Windows.Globalization.ApplicationLanguages.ManifestLanguages)
    {
        output += thisManifestLanguage + ": ";
        string ResolvedName = LocalizationTesting.LocaleTest.GetLocaleFromLanguage(thisManifestLanguage);
        output += ResolvedName + "\n";
    }

    this.outputText.Text = output;
}

当我打电话给我时,我得到的输出是:

en-US: English (United States)
es-ES: Spanish (Spain, International Sort)
es-MX: Spanish (Mexico)
pt-PT: Portuguese (Portugal)
ro-RO: Romanian (Romania)
ru: Russian (Russia)
ru-UA: Russian (Ukraine)

我应该指出,在GetLocaleFromLanguage中,“ru”的localeName获取“ru-RU”,所以如果你正在寻找,那也是可用的。

如果这不符合您的需求,请告诉我。我会看看我是否可以理解为什么在我的情况下,我必须明确地将ru-UA添加到我的清单中。