C# WPF中的本地化
我正在阅读WPF中的一本书,该书提供了一种为本地化目的创建应用程序的方法。他的建议与我的建议相同: 1) 编辑项目文件.csproj并添加元素en US以创建包含en US本地化嵌入baml的本地化程序集。当我编译项目时,它创建了包含en US本地化嵌入baml的子文件夹en US。我将其备份 2) 我对fr做了同样的操作,并为其创建了一个备份 3) 接下来,我将创建的两个子文件夹放在名为en-US和fr-fr的应用程序文件夹中 这本书建议,如果我将区域性设置更改为fr fr(通过控制面板区域设置),将使用fr-fr本地化组件。C# WPF中的本地化,c#,wpf,C#,Wpf,我正在阅读WPF中的一本书,该书提供了一种为本地化目的创建应用程序的方法。他的建议与我的建议相同: 1) 编辑项目文件.csproj并添加元素en US以创建包含en US本地化嵌入baml的本地化程序集。当我编译项目时,它创建了包含en US本地化嵌入baml的子文件夹en US。我将其备份 2) 我对fr做了同样的操作,并为其创建了一个备份 3) 接下来,我将创建的两个子文件夹放在名为en-US和fr-fr的应用程序文件夹中 这本书建议,如果我将区域性设置更改为fr fr(通过控制面板区域设
但是,我发现,无论是什么文化,它都在使用en-US文化。我知道这一点,因为我将区域性更改为fr,并删除了fr文件夹,但仍然是应用程序。正在运行,当en-US one被删除时,它会抛出一个异常 有人能澄清我哪里做错了/理解错了吗 以下是这本书的文字:
准备本地化应用程序
下一步是为您的项目启用本地化支持。这只需要一个 更改您需要将以下元素添加到项目的.csproj文件中 在第一个元素中:
en US
这会告诉编译器应用程序的默认区域性是美国英语(obvi) 当然,如果合适的话,你可以选择其他东西)。进行此更改后,构建过程将更改。下次编译应用程序时,您将得到一个名为en US的子文件夹。该文件夹中有一个附属程序集,其名称与应用程序和扩展名.resources.dll相同(例如,LocalizableApplication.resources.dll)。
此程序集包含应用程序的所有已编译BAML资源,这些资源以前存储在主应用程序集中。
现在,当您运行此应用程序时,公共语言运行库(CLR)将自动 根据计算机的区域设置在正确的目录中查找附属程序集,并加载正确的本地化资源。例如,如果您在fr区域性中运行,CLR将查找fr子目录并使用在那里找到的附属程序集。
这意味着,如果要向本地化应用程序添加对更多区域性的支持,只需添加更多子文件夹和附属程序集,而不会干扰原始应用程序可执行文件。
当CLR开始探测附属程序集时,它遵循一些简单的规则 优先级:
1.首先,它检查可用的最具体的目录。这意味着它将查找针对当前语言和区域的附属程序集(如fr)。
2.如果找不到此目录,它将查找针对当前语言(如fr)的附属程序集。
3.如果找不到此目录,将引发IOException异常 NET中的资源管理器使用CurrentUICulture标志来决定加载哪个本地化程序集,而不是CurrentCulture标志。CurrentUICulture表示正在运行的Windows版本的本机语言,而CurrentCulture表示通过控制面板设置的当前区域设置 考虑这一点的另一种方式是,应用程序可以询问用户两个独立的问题: 1) 他说什么语言?(当前文化) 2) 他在哪里?(当前文化) #1的答案应该说明用于显示UI元素的语言,即加载哪个本地化资源文件 #2的答案应该说明如何显示数字字符串和货币值等内容。这是通过将数字/货币转换为ToString方法中的字符串值来自动处理的 要再次检查这两个属性的值,可以执行以下操作:
Console.WriteLine("CurrentCulture={0}, CurrentUICulture={1}", CultureInfo.CurrentCulture, CultureInfo.CurrentUICulture);
要更改CurrentCulture,您只需更改控制面板“区域和语言”格式中的位置
要更改CurrentUICulture,可以执行以下操作之一:
- 在非英语版本的Windows上进行测试。(例如,在虚拟机中)
- 使用
- 为测试目的在代码中添加重写,通常基于.config文件设置,在该文件中显式设置CultureInfo.CurrentUICulture的值
// using System.Threading;
// using System.Globalization;
// using System.Configuration;
Thread.CurrentThread.CurrentUICulture = new CultureInfo(ConfigurationManager.AppSettings.Get("UICultureOverride"));