我使用Multilingual App Toolkit以多种语言本地化我的UWP应用 这里有一些关于MultilingualResourcesFolder和Strings文件夹在项目中的样子的屏幕截图
多语种资源
的字符串
所有文件都填充了正确的值。
在应用程序中,我检索可用语言列表
Windows.Globalization.ApplicationLanguages.ManifestLanguages
并迭代它们。迭代产生这些结果
这很奇怪,因为语言是以相同的方式声明的,但是对于某些语言,语言代码包含语言环境,而对于某些语言代码则不然,我无法理解。
在我声明它们的方式中,迭代应该产生
我尝试通过替换像这样的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
但结果是一样的。
我需要让应用程序识别语言环境以及每种语言的语言。 有人可以帮忙吗?
答案 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添加到我的清单中。