c# - 本地化无法正常工作

标签 c# wpf localization translation globalization

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

问题:

尽管程序将客户端识别为德语,但德语字符串不会加载到德语 Windows 上。 然而,将当前区域性(在代码中)明确设置为德语将导致德语用户界面。

我做了什么:

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

  • 我在“属性”部分创建了 Resources.resx 的副本
  • 现在有:Resources.resx、Resources.en-US.resx、Resources.de-DE.resx
  • 我将所有字符串放入三个资源文件中。 Resources.resx 和 *.en-US.resx 包含完全相同的字符串
  • 字符串名称一致,所有文件的访问修饰符设置为公共(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 的其他系统上,不会加载德语字符串。

我做错了什么?

问候

最佳答案

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 卫星资源文件应设置为“包含”。

关于c# - 本地化无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29644019/

相关文章:

c# - 部分 View 、用户控制或其他?

c# - 如何检测 EF 生成的多对多自引用关系中的引用循环?

asp.net - 多个本地化的 aspx 布局

c++ - 字符串本地化缺少一些特殊字符

ios - 如何以编程方式快速更改应用程序的 Localizable 字符串文件?

c# - 两个 BackgroundWorker,一个 List<T>

c# - DataGridView 鼠标滚轮滚动停止工作

c# - xaml d :DataContext giving "Access is denied" error

c# - TouchDown 事件延迟

wpf - 如何在 WPF 中以编程方式绘制贝塞尔曲线?