ResourceManager为默认区域性返回null

时间:2018-01-17 20:16:10

标签: xamarin xamarin.forms localization resx .net-standard

我正在使用.NET标准库处理Xamarin Forms应用。我已使用the docs中提到的TranslateExtension。我添加了三个资源文件:

  • AppResources.resx(带有匹配的代码隐藏文件,自动生成)
  • AppResources.nl.resx(荷兰语翻译)
  • AppResources.fr.resx(英文翻译)

调试(UWP)应用程序时,我无法显示默认文化(英文)。以下行返回null:

ResMgr.Value.GetString(Text, ci);

我添加了一些用于调试的行,而其他两种语言确实返回了已翻译的值:

ResMgr.Value.GetString(Text, new CultureInfo("nl")); // OK
ResMgr.Value.GetString(Text, new CultureInfo("fr")); // OK
ResMgr.Value.GetString(Text, new CultureInfo("en")); // returns null

这可能是什么原因?

我尝试的事情:

  • 我已将密钥复制粘贴到所有资源文件中,因此我排除了拼写错误的资源密钥。
  • 我测试了"en-GB""en-US"CultureInfo.InvariantCulture
  • 我已将appxmanifest中的默认语言从en-US更改为en

3 个答案:

答案 0 :(得分:1)

On UWP, watch that your resource name does not have a period in it.

您可能还需要告诉UWP项目它的默认语言是什么。这可以通过添加<PropertyGroup>(使用适合您的方案的文化)在顶部<DefaultLanguage>en-US</DefaultLanguage>元素(没有条件的元素)中的.csproj中完成。

不要忘记为包含资源的程序集设置[assembly: NeutralResourcesLanguage("en-US")] - 这是.NET Standard 2.0和PCL所必需的。

答案 1 :(得分:0)

好吧,好像你有“nl”和“fr”的resx文件(你说的工作正常)但你没有“en”的文件。如果你想获得这样的英文价值,我认为你需要一个“en”文件,就像你对“nl”和“fr”一样

答案 2 :(得分:0)

我注意到你讲的是 NET标准库

PCL 迁移到 .NET标准

后,

ResourceManager.GetString开始为新条目提供null

我还观察到文件 AppResources.Designer.cs 从解决方案资源管理器中消失(但我不知道如何,仍在考虑中),并且在VS res编辑中< strong> AppResources.resx ,访问修饰符No Code Generation

以下是我采取的措施:

  • 我双击 AppResources.resx 并将访问修饰符设置为内部或公共
  • 在.NET Standard中,您可能无法再看到&#34;查看代码&#34;来自resx文件;所以,我点击了AppResources.resx-&gt;打开 - &gt;源代码编辑器并将新创建的条目复制到所有其他* .fr(在您的情况下也是* .nl)...

注意

  1. 在上下文菜单中,您应该看到运行自定义工具。您可能需要删除旧的 AppResources.Designer.cs 并执行&#34;运行自定义工具&#34;
  2. 不要忘记清除解决方案(或olny UWP和标准库),关闭VS,删除所有.\bin.\obj并重新启动VS.这是为了确保您的问题得到修复或使用非常新生成的真实代码:)