从我们项目的开始,我们一直在将字符串存储在资源文件'MyResources.resx'中,这样做是为了支持将来本地化软件的可能性。
我们一直使用以下语法来引用字符串:
<TextBlock Text="{x:Static MyResources.Hello}" />
这是正确的,还是我们应该使用以下内容:
<TextBlock Text="{Binding Source={x:Static MyResources.Hello}}" />
我最近才遇到第二种语法,所以我有点担心我们一直在使用的内容实际上不会在运行时更改文本!
另外,将resx文件放在主项目中是否可以,或者它应该驻留在自己的项目中?从我看到的关于本地化过程的一点点来看,它似乎涉及生成一个新的DLL - 这是整个项目的“完整版本”,还是(以某种方式)只是将已翻译的resx文件提取到DLL?
答案 0 :(得分:1)
对于静态本地化,您不需要在运行时动态切换语言,您的第一个示例是最直接的解决方案。 x:Static
的开销相对较小。它很好而且轻巧。
第二种语法不会对您的情况产生影响:您绑定的资源属性不会引发更改通知,因此如果您在运行时更改MyResources.Culture
,UI将不会反映任何更改。在任何一种情况下,只有新创建的UI元素才会反映新语言。
如果你做需要动态切换语言,这些方法都不够。有一些资源可以帮助你,但如果你可以通过你拥有的东西,它会让你的生活更轻松。还有一个中间立场:您可以创建一个自定义MarkupExtension
,它接收文本资源ID并提供本地化文本。最初,它可以简单地深入研究您的resx
资源,但您可能会在以后将其重构为更动态的解决方案(如果您决定需要它)。
从我看到的关于本地化过程的一点点来看,它似乎涉及生成一个新的DLL - 这是整个项目的“完整版本”,还是(以某种方式)只是提取已翻译的resx文件(s )进入DLL?
我相信你指的是satellite assembly。我记得,卫星集合包含特定文化的本地化资源,但仅此而已。您可以将它们与主应用程序或库捆绑在一起,资源基础结构将根据运行时CultureInfo
选择要探测资源的程序集。