Xamarin.Forms:UWP 应用的本地化

Posted

技术标签:

【中文标题】Xamarin.Forms:UWP 应用的本地化【英文标题】:Xamarin.Forms: Localization of the UWP app 【发布时间】:2018-02-14 18:09:31 【问题描述】:

如果我在 UWP 设备上运行我的应用程序,我会在 Output 窗口中收到以下警告:

MakePRI:警告 0xdef00522:找到语言“en,de”的资源,但未找到默认语言的资源:“de-DE,en-US”。更改默认语言或使用默认语言限定资源。 http://go.microsoft.com/fwlink/?LinkId=231899

不知道这是否相关,但我也得到了

1>C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\AppxPackage\Microsoft.AppXPackage.Targets(2459,5):警告:APPX4001:构建属性 AppxBundlePlatforms 未明确设置,而是根据当前建筑架构计算。使用“创建应用程序包”向导或编辑项目文件进行设置。

This page 声明,我有特定于语言的资源,但我没有使用语言标签进行限定。我怎样才能知道这些是哪些资源?

我在Assets 文件夹中有图像,但它们与语言无关。此外,我将Package.appxmanifest 中的默认语言设置为de-DE。如果我从警告中搜索语言缩写,我只能在Debug 输出文件夹中找到priconfig.xmlAppxManifest.xml

我应该怎么做才能消除这个警告?

编辑:

如果我添加一个AppResources.en-US.resx 文件,警告似乎会消失(目前我已将en-US 设置为Package.appxmanifest 中的默认语言)。另外,我有一个AppResources.de.resxAppResources.resx 的文件(应该是en)。但是为什么sample project 不需要这样的文件,尽管应该有相同的设置?我错过了什么?

【问题讨论】:

此消息与字符串有关。你有任何 Resources.resw 文件吗?它们通常位于 UWP 项目中的 Strings 文件夹下,例如 f.e.字符串->en-us->Resources.resw。我怀疑您那里有名为“en”和“de”的文件夹,尝试将它们重命名为“en-us”和“de-de”。 我有 resw 文件,但仅在调试构建工件中。 UWP 项目中目前没有 Strings 文件夹。 这可能是问题所在。我不是 100% 确定本地化在 xamarin.forms 中是如何工作的,但在纯 UWP 项目中,如果您声明了支持的语言,则需要拥有带有特定于语言的子文件夹的 Strings 文件夹。更多信息here. Here 是 XF 的描述,但只提到了 WP8。我不知道我是否必须对 UWP 执行相同的步骤。本地化方法使用resx 文件,所以我认为不需要额外的字符串(也许只有当我在本地做某事时)。 图像只有在需要本地化时才应该本地化。否则,您只是不将它们放在特定于语言的文件夹中,所以是的,您可以将它们全部放在 Assets 中。而且,如果您使用 xamarin.forms 本地化方式,您似乎确实不需要 UWP 项目中的字符串。 【参考方案1】:

如果我添加 AppResources.en-US.resx 文件(目前我在 Package.appxmanifest 中将 en-US 设置为默认语言),警告似乎消失了。此外,我有一个 AppResources.de.resx 和 AppResources.resx 文件(应该是 en)。但是为什么示例项目不需要这样的文件,尽管应该有相同的设置?我错过了什么?

正如你所说,AppResources.resx 是 en。您可以展开 Portable Class Library (PCL) 项目中的 Properties 节点并双击 AssemblyInfo.cs 文件。将以下行添加到文件中以将中性资源汇编语言设置为英语:

[assembly: NeutralResourcesLanguage("en")]

这会通知资源管理器应用程序的默认区域性,从而确保当应用程序在英语语言环境中运行时,将显示在语言中性 RESX 文件 (AppResources.resx) 中定义的字符串。

您已将en-US 设置为Package.appxmanifest 中的默认语言,但是没有对应的文件。所以它会抛出警告。

示例项目的默认语言是en-US,没有对应的文件。它也向我提出了同样的警告。如果将默认语言修改为en,则警告消失。因为它在AssemblyInfo.cs 文件中将AppResources.resx 设置为en

你可以参考AssemblyInfo,Supported languages。

【讨论】:

所以如果我做对了,Package.appxmanifest 中的默认语言不需要 4 个字符的字符串。如果我将其设置为en 并将中性资源汇编语言定义为en 我应该没问题?哪种语言是默认语言有关系吗? 是的,它不需要 4 个字符的字符串,并且无论哪种语言是默认语言。但是,这三个部分中设置的语言需要相同。 你指的是哪三个部分? Package.appxmanifestAssemblyInfo.cs 在 PCL 中和...?如果我在示例 UsingResxLocalization 中将语言设置为 en,我仍然会得到 Resources found for language(s) 'en,de,de-ch,es,fr,id,ja, ms,pt,pt-br,zh-hans,zh-hant' 但没有找到默认语言的资源:'en-US'。 现在我在我的项目和真实设备上尝试了它同样的结果。警告不会消失。我是否应该将NeutralResourcesLanguage 也添加到 UWP 项目的AssemblyInfo.cs 中?这似乎也没有改变它。我正在使用安装了 Xamarin 4.6.0.299 的 VS2015。 三个部分是Package.appxmanifestAssemblyInfo.csAppResources.resx。要对此进行测试,您应该首先重建您的 pcl 库。并尝试在发布模型中运行您的项目。 好的,在发布模式下警告消失了,但在调试模式下没有。这是为什么呢?【参考方案2】:

只是为了扩展 Nico Zhu 的回答 - MSFT 如果您使用的是 .Net Standard,则没有 assemblyInfo.cs 文件,因为所有内容都存储在 csproj 文件中。因此,只需转到共享项目的属性并将项目中性语言更改为您的 resx 默认文件。 或者您可以右键单击项目并编辑项目和下面的行。

对我来说,问题是,从 PCL 转换为 Net Standard 后,UWP 应用程序突然没有选择 en-US 的默认资源文件。我认识到,因为我在 assmeblyInfo.cs 中有此设置,并且由于它已被删除,因此它不起作用。但不知何故,它适用于 android 项目。

  <PropertyGroup>
     <NeutralLanguage>en-US</NeutralLanguage>
  </PropertyGroup>

【讨论】:

以上是关于Xamarin.Forms:UWP 应用的本地化的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 VS for Xamarin.Forms UWP 应用程序上的调试错误?

无法在发布模式下为 UWP 构建 Xamarin.Forms 应用

将 UWP 标头模板中的图标与 xamarin.forms 一起使用

Xamarin.Forms UWP 中的内存泄漏

如何更改 Xamarin.Forms UWP 应用程序的强调色?

在 Xamarin.Forms UWP 应用程序中拦截鼠标后退按钮