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

3
我正在使用VS2012开发一个WPF C#应用程序,其中我有来自解决方案中不同项目的UserControl。 如果可能的话,我想在整个解决方案中的一个地方本地化所有UI字符串。
看起来locbaml并没有为这种情况做好准备,因为似乎对于每个类库,我都需要为每个类库DLL创建一个单独的资源DLL?
有人能给我一些关于如何应用各种本地化技术到具有多个项目的解决方案的最佳实践指南吗?
感谢任何建议。 Corey。

WPF本地化扩展可以直接完成此操作,只需在XAML中定义程序集即可,如下所示:lex:ResxLocalizationProvider.DefaultAssembly="MyTranslationAssembly" - Shahin Dohan
2个回答

6

我稍微修改了一下我的帖子,以使其更具包容性:

这里详细介绍了最佳实践。

事实上,你有三个选择。

  1. 自行本地化——手动创建自己的XML/文本文件/数据库解决方案。
  2. 使用locbaml进行本地化。这不允许在应用程序中动态切换语言。
  3. 使用resx文件进行本地化。这允许根据所选的实现动态切换应用程序中的语言。

最佳实践页面概述了许多情况下locbaml最优秀的地方,但resx文件比较易于移植(格式很简单),并且可以满足动态语言切换的要求。

如果你选择(1),你将独立完成。祝你好运!:)

如果你选择使用locbaml (2),最好先将字符串抽象为ResourceDictionary问题,从而可以将所有字符串放入一个文件中进行本地化。请参见此处:如何:使用 ResourceDictionary 管理可本地化的字符串资源

链接的文章详细介绍了使用locbaml,但你只需要使用它来本地化单个ResourceDictionary。以这种方式将资源整洁地隔离开来,应该可以让你的工作更轻松。请注意,如果需要,ResourceDictionaries可以按类别分割——只需确定对于您的项目而言,是一个单一的文件还是多个较小的文件更好。

如果您选择使用resx文件(3),并希望支持无痛运行时语言切换,此短教程/示例代码提供了一个很好的起点。它是为Prism编写的,但可以在Prism之外使用,没有困难。还有其他更简单的方法,也使用resx文件,但如果你想要最佳途径,我的意见是你正在看它。唯一的(或许)主要缺陷是,这种方法不适用于Silverlight。这是一个WPF问题,但我意识到对某些人可能是一个问题。


你如何处理多种本地化字符串语言?你需要能够从多个ResourceDictionaries中进行选择的能力? - pathrider
你是想构建不同的本地化包(例如:拥有程序的西班牙语、英语、德语等版本),还是在同一应用程序中启用动态语言更改(因此一个应用程序具有多个语言包)?前者是 locbaml 的使用方式,因此如果您需要使用 locbaml(项目要求等),则基本上无法更改。您是否需要在运行时动态切换语言的能力? - ianschol
实际上,我已经修改了我的帖子。有了新的信息,你应该能够采取任何一种方法! - ianschol

-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的唯一可行方法是使用某些本地化工具。

选择本地化工具时必须小心。它必须执行以下两个操作。

  1. 本地化XAML和RESX
  2. 将本地化的XAML和RESX编译成卫星程序集文件。

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


我的主要问题是如何在XAML中引用另一个项目中的字符串,以及在多项目场景中如何选择不同语言的“字符串集”。这里有很多很棒的信息,但还没有回答这两个问题。 - pathrider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接