为什么我的应用程序找不到默认的附属组件en-US资源?

时间:2013-10-03 11:27:52

标签: c# wpf xaml localization resx

我正在使用WPF创建一个多语言应用程序。我正在使用静态资源,存储在.resx / res文件中的字符串使文本出现在用户的文化中。

这是项目目录结构的一部分:

  • 资源
    • GreetingWindowRes.resx(这是en-US的默认设置)
    • GreetingsWindowRes.de-DE.resx

在.csproj中,我有:<UICulture>en-US</UICulture>

在AssemblyInfo.cs中:[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]

编译后,我可以看到资源文件出现:

  • zh-CN / MyApp.resources.dll
  • de-DE / MyApp.resources.dll

所以我绑定到GreetingWindow.xaml中的静态字符串资源:

<windows:MyWindowBase x:Class="CommanderDotNET.MyApp.Windows.GreetingWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:windows="clr-namespace:MyApp.Windows"
    xmlns:res="clr-namespace:MyApp.Resources">

    <Label Content="{x:Static res:GreetingWindowRes.FirstGreetingText}" />

</windows:MyWindowBase>

结果令我感到困惑:

  1. 如果将UICulture设置为de-DE,则标签文本将以德语显示。
  2. 如果将UICulture设置为en-US,则System.Windows.Markup.StaticExtension会抛出XamlParseException。 我在XAML中看到的错误必须是原因:
  3.   

    无法找到适合指定文化的任何资源或   中性文化。确保   “MyApp.Resources.GreetingWindowRes.en-US.resources”是   在编译时正确嵌入或链接到程序集“MyApp”,或   所需的所有卫星组件都是可装载和完全的   签名。

    我做错了什么?

    解:

    经过大量的搜索,我在这里找到了一个很好的解释: http://www.west-wind.com/weblog/posts/2009/Jun/04/Resx-and-BAML-Resources-in-WPF

    显然,当使用UltimateResourceFallbackLocation.Satellite + <UICulture>时,您需要同时拥有主要语言的ResxResource.resx和GreetingWindowRes.en-US.resx文件(讨厌复制)。

    但是,如果您只想使用Resx资源,而没有BAML本地化,那么这不是可行的方法,而且情况要好得多。仅使用Resx资源的正确方法:

    • AssemblyInfo.cs:[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.MainAssembly)]
    • .csproj:请勿添加<UICulture>
    • 资源命名:ResxResource.resx(主要语言)+ ResxResource.de-DE.resx(附加语言)

1 个答案:

答案 0 :(得分:3)

我认为在设置UICulture时,您必须拥有相应的resx文件。因此,要解决您的问题,您必须为en-US文化创建一个文件(与Resources.resx相同)。

我认为(但我可能错了)Resources.resx用于默认文化或PC所具有的文化。