本地化工作不正常
Localization not properly working
我写了一个小应用程序,它会以英语或德语自动启动。英语是默认的,德语将用于德语 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
- 我把所有的String都放在了三个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 的其他系统上,不会加载德语字符串。
我做错了什么?
此致
CurrentUICulture 会影响加载的资源,CurrentCulture 会影响日期和数字格式。很多人把这两个搞混了。
如果您尝试设置或确定要检索的字符串资源,您可能应该测试 CurrentUICulture。机器 运行 德语日期和数字格式 (CurrentCulture) 与机器 运行 安装并激活了完整的德语语言包 (CurrentUICulture) 之间存在很大差异。
您的示例代码使用 CultureInfo.DefaultThread(UI)CurrentCulture,它将控制创建的所有 new 线程的行为,但这将默认为主线程无论如何都在使用,所以如果它已经是德语,你不需要明确地设置它。
您可以通过更新 InitLocalization() 方法并将 Thread.CurrentThread.CurrentUICulture 显式设置为 "de-DE" 来测试资源加载行为,以查看德语资源是否开始加载。然后验证 CurrentUICulture 是否真的设置为 "de-DE" 而不仅仅是 CurrentCulture。德国机器可能有德语 date/number 格式 (CurrentCulture) 但没有使用德语语言包 (CurrentUICulture)。
编辑:针对您的评论,如果您已经正确使用 CurrentUICulture 并且机器确实具有完整的德语 UI 但德语资源仍未出现,您应该检查是否确实部署了德国卫星资源文件。
德语资源包含在一个名为 de-DE\MyApp.resources.dll 的单独程序集中,并且必须与可执行文件位于同一文件夹中并保留在 de-DE 文件夹中(因此您有 \Folder\MyApp.exe 和 \Folder\de-DE\MyApp.resources.dll)。默认资源(Resources.resx 中的资源保留在主可执行文件中,如果找不到更合适的资源,ResourceManager 会回退到这些资源)。
您没有指定您是如何部署应用程序的,但是如果您 运行 您可以使用任务管理器的 'Open in Explorer'(或德国机器上的 Dateipfad Öffnen)功能来带您到 运行ning 应用程序的部署文件夹,这样你就可以检查 de-DE 文件夹是否在那里(我只提到这样做是因为如果你 ClickOnce 部署应用程序,很难找到安装文件夹)。
如果您使用 ClickOnce 并使用 Visual Studio 发布,您可以通过右键单击项目并选择属性然后导航到 'Publishing' 选项卡来控制发布过程中包含的文件。 'Application Files' 按钮将显示发布时包含的所有文件的列表。您的 de-DE 卫星资源文件应设置为 'Include'.
我写了一个小应用程序,它会以英语或德语自动启动。英语是默认的,德语将用于德语 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
- 我把所有的String都放在了三个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 的其他系统上,不会加载德语字符串。
我做错了什么?
此致
CurrentUICulture 会影响加载的资源,CurrentCulture 会影响日期和数字格式。很多人把这两个搞混了。
如果您尝试设置或确定要检索的字符串资源,您可能应该测试 CurrentUICulture。机器 运行 德语日期和数字格式 (CurrentCulture) 与机器 运行 安装并激活了完整的德语语言包 (CurrentUICulture) 之间存在很大差异。
您的示例代码使用 CultureInfo.DefaultThread(UI)CurrentCulture,它将控制创建的所有 new 线程的行为,但这将默认为主线程无论如何都在使用,所以如果它已经是德语,你不需要明确地设置它。
您可以通过更新 InitLocalization() 方法并将 Thread.CurrentThread.CurrentUICulture 显式设置为 "de-DE" 来测试资源加载行为,以查看德语资源是否开始加载。然后验证 CurrentUICulture 是否真的设置为 "de-DE" 而不仅仅是 CurrentCulture。德国机器可能有德语 date/number 格式 (CurrentCulture) 但没有使用德语语言包 (CurrentUICulture)。
编辑:针对您的评论,如果您已经正确使用 CurrentUICulture 并且机器确实具有完整的德语 UI 但德语资源仍未出现,您应该检查是否确实部署了德国卫星资源文件。
德语资源包含在一个名为 de-DE\MyApp.resources.dll 的单独程序集中,并且必须与可执行文件位于同一文件夹中并保留在 de-DE 文件夹中(因此您有 \Folder\MyApp.exe 和 \Folder\de-DE\MyApp.resources.dll)。默认资源(Resources.resx 中的资源保留在主可执行文件中,如果找不到更合适的资源,ResourceManager 会回退到这些资源)。
您没有指定您是如何部署应用程序的,但是如果您 运行 您可以使用任务管理器的 'Open in Explorer'(或德国机器上的 Dateipfad Öffnen)功能来带您到 运行ning 应用程序的部署文件夹,这样你就可以检查 de-DE 文件夹是否在那里(我只提到这样做是因为如果你 ClickOnce 部署应用程序,很难找到安装文件夹)。
如果您使用 ClickOnce 并使用 Visual Studio 发布,您可以通过右键单击项目并选择属性然后导航到 'Publishing' 选项卡来控制发布过程中包含的文件。 'Application Files' 按钮将显示发布时包含的所有文件的列表。您的 de-DE 卫星资源文件应设置为 'Include'.