【问题标题】:Sharing string resources between Windows desktop and Windows store app在 Windows 桌面和 Windows 商店应用程序之间共享字符串资源
【发布时间】:2014-02-17 06:56:56
【问题描述】:

我正在使用适用于 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

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

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);

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

我不确定我是否走在正确的轨道上。我几乎非常绝望,以至于我将制作自​​己的解决方案,如果我将包含所有我需要的字符串的 XML 文件转换为一个具有属性的大型类,我可以使用这些属性在没有任何资源文件的情况下获取所有字符串。但我认为这是丑陋和作弊,所以我希望有人能给我一个更好的主意:-)。

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您可以将所有资源放在一个可移植类库中,并在所有平台上使用这些库。您可能需要检查您使用的 .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

      【讨论】:

      • 谢谢。我已经在使用 Portable 类库了,我把所有的逻辑都放在那里了。但是我没有资源来正常工作。我可以添加一个 resx 文件并在 Windows 桌面中使用它,但我还没有让它在 Windows Store 上工作。或者我根本不知道如何正确编写语法:-)。任何想法?这也适用于多种语言吗?
      • 您公开方法以返回可移植库中的资源。只需从您的 Windows 商店应用程序中调用可移植库的这些方法。这里有一个本地化资源的例子。 msdn.microsoft.com/en-us/library/vstudio/…
      • 如果我只想在代码中获取字符串,那就太好了。但是我可以在 xaml 文件中使用它吗?在桌面应用程序中,我可以编写类似 的内容,但是 Windows Store 应用程序呢?
      【解决方案3】:

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

      【讨论】:

      • 谢谢,有一段时间它看起来很有希望。但后来我发现不支持桌面应用程序:-(。但我希望他们继续开发它。我喜欢这个想法。目前我认为这比它应该更难处理:-(。
      【解决方案4】:

      便携式类库的 MissingManifestResourceException 也有同样的问题。今天我用另一个名字创建了一个新的可移植类库(其中没有字符串'Resources'):它就像一个魅力。不知道为什么这以前不起作用(可能是资源的名称)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-14
        • 1970-01-01
        • 1970-01-01
        • 2012-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多