无法从 Windows Phone 8.1 访问 .NET 4.5 PCL 中的本地化资源

Unable to access localized resources in .NET 4.5 PCL from Windows Phone 8.1

我无法访问面向 .NET 4.5 的便携式 Class 库中的本地化字符串资源。

我允许用户 select 第一页上的语言,并在其他页面上拥有本地化体验。我试图通过使用代码

获取资源来实现这一目标
MyTextBloxk.Text = PasswordResetMethod_Page.Title;

PasswordResetMethod_Page 是从 .resx

自动生成的 class

在 WP 8.1 模拟器上一切正常,但是当我尝试将它部署到真实设备时,我得到了

Error : DEP6810 : MdilXapCompile.exe failed with error code 1004. See log file 'C:\Projects\WP81-ResourceBug\ResourceBugRepro.WP81\obj\Debug\MDIL\MDILXapCompileLog.txt' for more details.

Error: Compile filter argument specified non-existent file: C:\Projects\WP81-ResourceBug\ResourceBugRepro.WP81\obj\Debug\MSIL\ar\ResourceLib.resources.dll

Invalid argument

重现:

  1. 克隆回购 https://github.com/konradbartecki/WP81-ResourceBug
  2. 设置WP8.1为启动项目
  3. 部署到设备

在模拟器上工作正常,部署到真实设备时不起作用

不幸的是,on Phil Hoff blog 中描述的解决方法对我来说不太适用。 我已经开发了自己的解决方法。事实证明,如果您使用 .resx 文件仅存储字符串值,那么您可以轻松地将它们转换为 .resw。

所以我正在做的是自动转换来自 PCL 的所有 .resx 文件,并将其放入我的 Windows Phone 8.1 项目中的原生结构化文件夹中,并在每次构建时使用刷新它们我写的这个工具。

https://github.com/konradbartecki/ResxHell

然后我可以通过这样的代码轻松访问我的字符串资源

var resourceLoader = new ResourceLoader();
var localizedText = resourceLoader.GetString("MyCustomReswFile/MyCustom");

为了更好的绑定,我最终创建了 ValueConventer 和小型本地化助手 class,看看这个要点:Binding from .resw files example

通过使用它,您可以在 xaml 页面中执行以下操作:

//For resource in file Page.Login.resw and string ID "NotUserYet"
<TextBlock Text="{Binding ConverterParameter=Page.Login/NotUserYet, Converter={StaticResource ResString}, Mode=OneWay, Source={StaticResource ResString}}"/>

string localizedtext = LocalizationHelper.GetString("MyCustomReswFile", "MyStringId");