2012-11-09 49 views
3

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

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

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

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

+0

WPF本地化扩展可以开箱即用,只需在您的XAML中定义程序集就像这样:'lex:ResxLocalizationProvider.DefaultAssembly =“MyTranslationAssembly”' –

回答

3

修订我的文章有点更具包容性:

Overarching best practices are detailed on the MSDN here.

真的,你有三种选择。

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

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问题,但我意识到这可能是一些人的关注。

+0

如何处理多语言的本地化字符串?你需要从几个资源词典中进行选择的能力? – cardinalPilot

+0

您是否正在尝试构建不同的本地化软件包(即:拥有您的程序的西班牙语,英语,德语等版本),还是在同一应用程序中启用动态语言更改(因此一个应用程序具有多种语言包)?前者是如何使用locbaml,所以如果你需要使用locbaml(项目需求等),你几乎坚持使用它。您是否需要在运行时动态地移动语言的能力? – ianschol

+0

其实,我继续修改我的帖子。您应该能够采取任何方法与新的信息! – ianschol

-1

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

例如,如果你有

<TextBlock Text="Hello World"/> 

那么“最佳实践”建议摆脱XAML字符串,将其添加到RESX,最后参照

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

+ 

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

更换XAML不要那样做。将RESX仅用于您的代码中使用的那些字符串。保持XAML的所有字符串不变。本地化RESX和XAML文件。最后编译包含本地化RESX和XAML的卫星程序集文件。

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

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

  1. 本地化XAML和RESX
  2. 编译局部XAML和RESX到卫星组件文件。

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

+0

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

相关问题