在Windows桌面和Windows应用商店之间共享字符串资源

时间:2014-01-26 13:19:12

标签: wpf localization windows-runtime windows-phone embedded-resource

我正在使用Windows桌面和Windows商店的应用程序,我将来可能会添加Windows Phone。我在库中拥有大部分逻辑,并为不同的平台创建不同的GUI。

我想本地化我的应用程序,并希望在平台之间共享字符串资源。但是我该怎么做?

对于Windows桌面,最常见的方法似乎是使用resx文件。这是一个简短的例子:

http://compositeextensions.codeplex.com/discussions/52910

对于Windows应用程序,使用resw文件,这是一个例子:

http://msdn.microsoft.com/en-us/library/windows/apps/hh965326.aspx

这些解决方案都是特定于平台的,我不喜欢:-(。我真的希望将我的所有字符串都放在一个文件/语言中,并且能够在所有平台上使用它。对此有什么解决方案吗? / p>

2014年2月17日更新:据我所知,resx和resw文件的格式相同。 Windows商店应用程序中缺少的是没有为resw文件生成类文件。如果我能得到这样的文件,我的问题就会得到解决。然后我可以在我的视图模型中放置该类的实例,并通过属性访问所有文本。

WPF应用程序中生成的类文件几乎可以正常工作。问题是这一行看起来像这样:

global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ResxTest.Properties.StringTest", typeof(StringTest).Assembly);

要进行编译,我需要将其更改为:

global::System.Resources.ResourceManager temp = new System.Resources.ResourceManager("ResxTest.Properties.StringTest", typeof(StringTest).GetTypeInfo().Assembly);

但是无法在我的Windows应用商店应用中加载资源ResxTest.Properties.StringTest。出于某种原因,我需要将我的资源重命名为Resource.resw并使用名称“Resource”加载它。我尝试了所有类型的名称,但这是唯一有效的名称。使用名称MyApplication.MyResource永远不会起作用。

我不确定自己是否走在正确的轨道上。我几乎是如此绝望,我将自己的解决方案转换为我需要的所有字符串的XML文件到一个巨大的类,我可以用来获取没有任何资源文件的所有字符串。但我认为那是丑陋和欺骗所以我希望有人能给我一个更好的主意: - )。

2014年2月24日更新:我错了!使用Portable类库可以很好地工作。如果我使用它,我可以在我的视图模型中放置一个自动生成的C#类的实例,并访问该对象的所有字符串。

但是,如果我使用普通的库,在Windows应用商店应用程序中的功能不正常(WPF很好)。我试图从一个可工作的类库中将所有文件复制到Windows商店类库。当我尝试创建自动生成文件的实例时,我总是得到:

  

mscorlib.dll中发生了'System.Resources.MissingManifestResourceException'类型的异常,但未在用户代码中处理

     

其他信息:无法为包中的资源文件“MetroLib.StringResources”加载资源...

非常烦人,因为我正在使用Visual Studio的快速版本,其中无法使用便携式类库。所以我可能会开发自己的解决方案来从资源文件生成类(这也给了我一些其他的好处)。但我仍然很好奇我做错了什么。

4 个答案:

答案 0 :(得分:3)

我终于解决了这个问题。我只是开发了一个简单的工具(ResToCode)来将资源文件转换为纯C#类。与Visual Studios resgen.exe正在做的很相似,但有一些额外的功能。它的效果非常好所以我很高兴:-)。

CodeProject上的任何人都可以使用该工具:

http://www.codeproject.com/Articles/744528/ResToCode-Localization-tool-for-Windows-Desktop-St

答案 1 :(得分:1)

您可以将所有资源放在Portable类库中,并在所有平台上使用这些库。您可能必须检查您正在使用的.NET框架版本。并非所有平台的所有版本都提供可移植库。

http://msdn.microsoft.com/en-us/library/vstudio/hh871422(v=vs.110).aspx

http://msdn.microsoft.com/en-us/library/vstudio/gg597391(v=vs.110).aspx#members

答案 2 :(得分:1)

你看过Multilingual App Toolkit了吗?它使翻译保持行业标准XLIFF format,并可以为Windows和Windows Phone生成资源文件。

答案 3 :(得分:0)

我对Portable Class Libraries的MissingManifestResourceException也有同样的问题。今天我创建了一个新的可移植类库,其中包含另一个名称(没有字符串' Resources' in):它就像一个魅力。不知道为什么之前没有工作(也许是资源的名称)。