黑龙江省网站建设_网站建设公司_Logo设计_seo优化
2025/12/20 17:09:38 网站建设 项目流程

概念
应用程序具备多语言支持,是实现全球化(Globalization)和本地化(Localization)最重要的功能。
关于全球化和本地化的概念、设计原则、基本流程可参考微软文档 https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/advanced/wpf-globalization-and-localization-overview
目前有多种方案可供选择:
• 使用resx资源文件
• 使用xaml资源文件
• 使用markup扩展
本文介绍学习使用resx文件的一些经验和心得。

管理模型
resx资源文件通常是嵌入应用的数据,随应用程序一起发布,如果修改资源文件中的数据,需要重新编译。
.NET对多种语言使用“中心–卫星”模式管理多个区域的资源,处于“中心”位置的称为默认资源,处于“卫星”位置的称为特定区域资源。
例如,项目中有个资源文件Resources.resx,这个就是默认资源文件,Resources.en-US.resx、Resources.fr-FR.resx、Resources.zh-CN.resx等就是特定区域的资源文件。(可使用ResXManager扩展工具进行生成资源文件)
在VS中编译生成应用程序时,编译器会在可执行程序的目录中生成对应特定区域的子目录,子目录中存放区域对应资源的dll文件。
.NET使用ResourcesManager对象管理这些资源文件, ResourceManager从Thread.CurrentUICulture属性中获得当前的区域,然后根据该属性从特定区域中进行查找,如果找到了对应的区域,则使用该区域的资源内容,如果未在特定区域中找到内容,则使用默认的资源。
下面举个简单的例子说明。
代码与数据
新建一个WPF(.NET Framework)桌面应用TestApp,

image

image

创建的项目中,VS已经预先建好了一些文件,打开Properties目录下的Resources.resx文件,在其中添加一些字符串资源,并且将访问修饰符改为Public。

image

然后在Properties目录下新建一个文件名为Resources.en-US.resx的资源文件,在其中添加字符串资源。

image

修改Properties目录下的Settings.settings文件,增加当前App语言的设置。

image编辑MainWindow.xaml前端文件。首先添加名称空间,并在Grid中添加两个按钮控件。

xmlns:prop="clr-namespace:TestApp.Properties"
...
<Button Content="{x:Static prop:Resources.btnChnText}" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="75" Click="Button_chn_Click"/>
<Button Content="{x:Static prop:Resources.btnEngText}" HorizontalAlignment="Left" Margin="100,10,0,0" VerticalAlignment="Top" Width="75" Click="Button_eng_Click"/>
编辑MainWindow.xaml.cs后台文件
1、首先添加引用
using System.Globalization;
 
2、然后在MainWindow中添加两个内部成员变量
string _currentCulture = Properties.Settings.Default.Culture;
ResourceManager _rm = new ResourceManager("TestApp.Properties.Resources",
typeof(MainWindow).Assembly);

3、修改MainWindow的构造函数,在InitializeComponent之前修改当前的Culture。
Thread.CurrentThread.CurrentUICulture
= CultureInfo.CreateSpecificCulture(_currentCulture); 

4、增加两个按钮的响应函数
private void Button_chn_Click(object sender, RoutedEventArgs e)
{
if (MessageBox.Show(_rm.GetString("strChnQuestion"), "",
MessageBoxButton.YesNo,
MessageBoxImage.Question)
== MessageBoxResult.Yes)
{
Properties.Settings.Default.Culture = "zh-CN";
Properties.Settings.Default.Save();
}
}

private void Button_eng_Click(object sender, RoutedEventArgs e)
if (MessageBox.Show(_rm.GetString("strEngQuestion"), "",
MessageBoxButton.YesNo,
MessageBoxImage.Question)
== MessageBoxResult.Yes)
{
Properties.Settings.Default.Culture = "en-US";
Properties.Settings.Default.Save();
}
}

 运行效果
程序运行后缺省显示中文,点击按钮显示的也是中文的提示。
选择某个语言后,重新启动程序,所有的界面和提示都切换成了目标语言。


后续改进
这种方法的缺陷在于界面的文字采用静态渲染,运行过程中不会因为语言的切换而改变现实。
如果不考虑程序的执行效率,可以利用Markup的扩展,将界面语言的切换改为动态方式,这样可以在运行中进行语言的切换,而不必重新启动程序。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询