【问题标题】:Silverlight localization bug?Silverlight 本地化错误?
【发布时间】:2010-12-08 13:22:47
【问题描述】:

我有一个非常奇怪的问题,看起来可能是 Silverlight 错误。我在一个从 VS2010 创建的简单应用程序中复制了这一点,Silverlight 应用程序项目默认模板。

在应用程序中,我有两个 .resx 文件,“Strings.resx”和“Strings.de.resx”。它们每个都有一个键“SomeString”,如下所示:

Strings.resx - SomeString - “一些测试字符串”

Strings.de.resx - SomeString - “一些 DE 测试字符串”

在单个应用程序 MainPage.xaml 上,我只是在 MainPage 的类构造函数中打了一个 TextBlock,我在这样的代码中使用它:

   Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-DE");
   txt.Text = Strings.SomeString;

   Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
   txt.Text = Strings.SomeString;

使用调试器逐步显示 txt.Text 首先是“一些 DE 测试字符串”,然后是“一些测试字符串”。所以一切正常。

但是,我在我的机器上安装了德语语言包。现在,如果我在机器的区域设置中将系统语言更改为“Deutsch”并注销/登录以使更改生效,则相同的代码的工作方式不同:从资源中检索 SAME 字符串“some DE test string”两次。基本上,将当前文化/uiculture 设置为“en-US”的第二个设置什么都不做,仍然会检索德语字符串。

实际上,如果我想要一个用户可以独立于系统语言更改显示语言的应用程序,我做不到,因为检索到的资源不正确。

同样,在 Windows 操作系统语言设置为英语的情况下,一切正常,我可以更改文化并且它可以正常工作,加载正确的字符串资源。当 Windows 操作系统语言设置为 Deutsch(尚未检查其他语言)时,我无法加载英文字符串资源。

此问题在 Vista 和 Windows 7 机器上都存在,尚未在其他机器上测试过。

ps:csproj文件改成<SupportedCultures>en,en-US,de,de-DE</SupportedCultures>

知道我做错了什么吗?

【问题讨论】:

    标签: .net silverlight localization


    【解决方案1】:

    我认为您的问题来自您的 silverlight 程序集的默认文化:您是否在将 Windows 文化从 en 更改为 de 后重新编译了应用程序?

    尝试检查程序集中性文化,并手动设置:

    [assembly: NeutralResourcesLanguage("en")]
    

    在 assemblyInfo.cs 文件中

    【讨论】:

    • 您是对的,添加此属性可以部分解决问题。我的意思是它适用于除(更大)应用程序的第一页之外的每个页面。对于第一页,行为不变,属性与否。知道为什么会这样吗?作为说明,我实际上在另一个 xap 中有文化特定的 .resx 文件,我正在按需动态加载。会不会跟这有关系?
    • 另外澄清一下:第一页是指首先显示的页面,并不总是相同的。
    • 您是否在所有程序集中设置了中性资源语言?
    • 是的,我有。与此同时,我做了一个“解决方法”:我将所有 resx 字符串移到了主程序集中。虽然我支付 xap 大小(约 20k)的罚款,但它可以工作。
    • 但是,我还有另一个问题:我只有 .de.resx 文件中有一些键/值。如果 CurrentUICulture 设置为 en-US 获取这些键的值,它的行为也会因操作系统语言而有所不同。如果操作系统语言是英语,我会得到一个空字符串(正确,因为资源仅在 DE 资源中)。但是,如果操作系统语言是 Deutsch,即使 CurrentUICulture 是 en-US,我也会从 .de.resx 获取字符串。我认为这不应该发生,它应该总是得到一个空字符串,只要 CurrentUICulture 是 en-US 并且 NeutralResourcesLanguage 是 en-US。想法?
    【解决方案2】:

    我也遇到了同样的问题。为我解决的问题是,我不依赖 Silverlight 猜测正确的中性语言。我的应用程序翻译为 en、de、fr 和它。所以我做了(在每个项目中我都有可本地化的字符串):

    GuiStrings.resx
    GuiStrings.en.resx
    GuiStrings.de.resx
    GuiStrings.fr.resx
    GuiStrings.it.resx
    

    这解决了 Silverlight 忽略德语机器上的中性语言 ('en') 的奇怪问题。

    【讨论】:

    • 你的默认资源是空的,你的所有语言都用 GuiStrings.X.resx 定义了吗?这真的是解决这个问题的唯一方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2013-09-13
    相关资源
    最近更新 更多