本地化没有正常工作

时间:2015-04-15 07:24:53

标签: c# wpf localization translation globalization

我写了一个小应用程序,它将以英语或德语自动启动。英语是默认的,德语将在德语Windows上使用。

问题:

德语字符串未加载到德语Windows上,尽管程序将客户端识别为德语。 然而,将当前文化(在代码中)明确地设置为德语将导致德语UI。

我做了什么:

我遵循了这个指南:http://www.codeproject.com/Articles/299436/WPF-Localization-for-Dummies

  • 我在“属性”部分
  • 中创建了Resources.resx的副本
  • 现在有:Resources.resx,Resources.en-US.resx,Resources.de-DE.resx
  • 我将所有字符串放在三个Resources文件中。 Resources.resx和* .en-US.resx包含完全相同的字符串
  • 字符串的名称一致,所有文件的Access Modifier设置为Public
  • 资源的文件属性:构建操作:嵌入式资源;不要抄袭;自定义工具:PublicResXFileCodeGenerator

代码:

private void InitLocalization() // Executed on startup
    {

    if (CultureInfo.CurrentCulture.Name != "de-DE") //  only use german on german systems. Otherwise use english
    {
        CultureInfo.DefaultThreadCurrentCulture = CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture("en-US");
    }
    else
    {
        CultureInfo.DefaultThreadCurrentCulture = CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture("de-DE");
    }

    rm = new ResourceManager("SaveEye.Properties.Resources", Assembly.GetExecutingAssembly());

     // Manually assign the correct text to XAML-elements
    _SettingsTextBlock.Text = rm.GetString("Settings");
    _StartWithWindowsCheckBox.Content = rm.GetString("Startup");
    _SaveButton.Content = rm.GetString("SaveAndClose");
    }

基本上,我只想确保从ResourceManager加载Resources.en-US.resx或Resources.de-DE.resx。

在其余代码中,我使用rm.GetString(“”)获取我需要的字符串。

这适用于英语。我甚至可以在InitLocalization-Method开始时手动将CurrentCulture设置为de-DE,然后加载所有德语字符串。但正如我所说,在默认情况下de-DE的其他系统上,未加载德语字符串。

我做错了什么?

此致

1 个答案:

答案 0 :(得分:3)

CurrentUICulture将影响加载的资源,以及影响日期和数字格式的CurrentCulture。很多人都把这两个搞糊涂了。

如果您尝试设置或确定要检索的字符串资源,则应该测试CurrentUICulture。使用德语日期和数字格式运行的计算机(CurrentCulture)与运行完整德语语言包的计算机(CurrentUICulture)之间存在很大差异。

您的示例代码正在使用CultureInfo.DefaultThread(UI)CurrentCulture,它将控制所有线程的行为,但这将默认为主线程正在使用的任何内容,因此如果它已经在德语,你不应该明确地设置它。

您可以通过更新InitLocalization()方法并将Thread.CurrentThread.CurrentUICulture明确设置为“de-DE”来测试资源加载行为,以查看德语资源是否开始加载。然后验证CurrentUICulture是否真的设置为“de-DE”而不仅仅是CurrentCulture。德国机器可能具有德语日期/数字格式(CurrentCulture),但未使用德语语言包(CurrentUICulture)。

编辑:在回复您的评论时,如果您已经正确使用CurrentUICulture并且该机器确实具有完整的德语UI但德国资源仍然没有出现,您应该检查德国卫星资源文件是否实际存在展开。

德语资源包含在名为de-DE \ MyApp.resources.dll的单独程序集中,并且必须与可执行文件位于同一文件夹中并保留在de-DE文件夹中(因此您有\ Folder \ MyApp.exe和\ Folder \ de-DE \ MyApp.resources.dll)。默认资源(Resources.resx中的资源保留在主可执行文件中,如果找不到更合适的资源,则是ResourceManager回退的资源)。

您没有指定部署应用程序的方式,但如果您运行,可以使用任务管理器中的“在资源管理器中打开”(或德国机器上的DateipfadÖffnen)功能将您带到已运行的部署文件夹应用程序,所以你可以检查de-DE文件夹是否存在(我只提这样做,因为如果你单击ClickOnce部署应用程序,很难找到安装文件夹。)

如果您使用ClickOnce并使用Visual Studio发布,则可以通过右键单击项目并选择属性然后导航到“发布”选项卡来控制发布期间包含的文件。 “应用程序文件”按钮将显示发布时包含的所有文件的列表。您的de-DE卫星资源文件应设置为“包含”。