字符串的WPF本地化 - 在不同的项目之间共享?

时间:2012-11-09 21:01:10

标签: c# wpf localization

我正在开发VS2012下的WPF C#应用程序,我在解决方案中的不同项目中有来自不同来源的UserControl。如果可以的话,我想在一个地方将整个解决方案中的所有UI字符串本地化。

似乎locbaml并没有真正设置为这种东西,因为它出现在每个类库中,我需要为每个类库DLL创建一个单独的资源DLL?

有人可以给我一些关于最佳实践方法的指导吗?我无法弄清楚如何将各种本地化技术应用于具有多个项目的解决方案。

感谢您的任何建议。 科里。

2 个答案:

答案 0 :(得分:4)

稍微修改我的帖子以便更具包容性:

Overarching best practices are detailed on the MSDN here.

真的,你有三个选择。

  1. 自己进行本地化 - 手动滚动您自己的XML /文本文件/数据库解决方案。
  2. 使用locbaml进行本地化。这不允许在应用程序中进行动态语言切换。
  3. 使用resx文件进行本地化。这允许在应用程序中动态语言切换,具体取决于所选择的实现。
  4. 有许多场景中locbaml是最佳的,这些场景在最佳实践页面上列出,但resx文件相当便携(格式很简单),并且满足动态语言交换的要求。

    如果您决定选择(1),那么您就是自己的。一帆风顺! :)

    如果您选择使用locbaml(2),最好通过首先将字符串抽象为ResourceDictionary来解决问题,允许您将所有字符串放入一个文件以进行本地化。见这里:How to: Use a ResourceDictionary to Manage Localizable String Resources

    链接文章的详细信息仍然使用locbaml,但您只需要使用它来本地化单个ResourceDictionary。以这种方式保持资源整齐隔离应该会让您的生活更轻松。请注意,如果需要,可以分类地对ResourceDictionaries进行拆分 - 只需要考虑一个单片文件或多个较小的文件是否适合您的项目。

    如果您选择使用resx文件(3)并希望支持无痛的运行时语言切换,this short tutorial\example code provides an excellent starting point.它是用Prism编写的,但可以在Prism之外使用而没有任何困难。还有其他更简单的方法也使用resx文件,但如果你想要最佳方法,恕我直言,你正在看它。一个(可能是?)主要警告是这种方法不适用于Silverlight。这是一个WPF问题,但我意识到这可能是某些人的担忧。

答案 1 :(得分:-1)

WPF使用两种资源格式:XAML和RESX。遗憾的是,几乎所有最佳实践以及此处的所有答案都建议用复杂且难以维护的RESX字符串引用替换XAML中的普通和简单字符串。

例如,如果你有

<TextBlock Text="Hello World"/>

然后“最佳实践”建议摆脱XAML字符串,将其添加到RESX中,最后用引用替换XAML

<TextBlock Text="{Binding Path=Resource1.HelloText, Source={StaticResource LocalizedString }}"/>

+

<data name="LocalizedString" xml:space="preserve">
  <value>Hello World</value>
</data>

不要那样做。只将RESX放在代码中使用的字符串中。保留XAML的所有字符串。本地化RESX和XAML文件。最后编译包含本地化RESX和XAML的附属程序集文件。

Visual Studio或locbaml只能本地化RESX。您可以使用文本编辑器手动本地化XAML,但我不建议这样做。本地化的XAML必须与原始XAML相同。这意味着结构必须相同。它必须包含原始XAML的所有组件,属性和事件。本地化XAML的唯一可行方法是使用一些本地化工具。

选择本地化工具时必须小心。它必须执行以下两件事。

  1. 本地化XAML和RESX
  2. 将本地化的XAML和RESX编译为附属程序集文件。
  3. 使用这样的本地化工具后,您的本地化不仅变得更加容易,而且您还可以将用户控件放在自己的程序集中,或将其链接到使用它的所有项目。