3

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

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

谁能给我一些关于最佳实践方法的指导?我不知道如何将各种本地化技术应用于具有多个项目的解决方案。

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

4

2 回答 2

6

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

MSDN 上详细介绍了总体最佳实践。

真的,你有三个选择。

  1. 自己本地化 - 手动滚动您自己的 XML/文本文件/数据库解决方案。
  2. 使用 locbaml 进行本地化。这不允许在应用程序内进行动态语言切换。
  3. 使用 resx 文件进行本地化。这确实允许在应用程序内进行动态语言切换,具体取决于所选的实现。

有很多 locbaml 最佳的场景,在最佳实践页面上进行了概述,但是 resx 文件具有合理的可移植性(格式很简单),并且可以满足动态语言交换的要求。

如果您决定使用(1),那么您就靠自己了。神速!:)

如果您选择使用 locbaml (2),最好先将字符串抽象到 ResourceDictionary 中来解决问题,这样您就可以将所有字符串放入一个文件中进行本地化。请参阅此处:如何:使用 ResourceDictionary 管理可本地化的字符串资源

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

如果您选择使用 resx 文件 (3) 并希望支持无痛的运行时语言切换,那么这个简短的教程\示例代码提供了一个很好的起点。 它是在考虑 Prism 的情况下编写的,但可以在 Prism 之外毫无困难地使用。还有其他更简单的方法也使用 resx 文件,但是如果您想要最好的方法,恕我直言,您正在研究它。一个(也许?)主要警告是这种方法不适用于 Silverlight。这是一个 WPF 问题,但我意识到这可能是某些人关心的问题。

于 2012-11-10T02:27:56.347 回答
-2

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

例如,如果你有

<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 编译为附属程序集文件。

一旦您使用了这样的本地化工具,您的本地化不仅会变得更加容易,而且您还可以将用户控件放置在自己的程序集中或将其链接到使用它的所有项目。

于 2012-11-17T08:03:08.337 回答