InChatter现在支持本地化了,其实这个只是很细节的东西,但是咱也是可以走走国际范。哈哈
其实最重要的原因只是想进行一次本地化的开发。这个概念相信大部分人都有,但是在实际项目中真的很少会涉及到,我也就InChatter这个项目来实践下本地化开发。
一、InChatter的本地化实施
1.新建一个新的类库,命名为:InChatter.Localization
2.在项目右键->属性,打开项目工程的属性窗口
3.选择资源页签,修改资源的访问修饰符为Public(这样我们才可以访问资源)
4.按图中的方式添加你定义你的系统资源。保存以后,可以在Properties文件夹中看到我们的资源文件Resources.resx
5.在项目工程属性窗口,你是无法添加两个资源文件的,我们可以直接将上述的Resources.resx复制一份,修改为Resources.en.resx
6.将语言内容修改为对应的英文即可
通过上述部分,我们变可以成功的完成资源的创建,编译项目以后的文件目录:
InChatter.Localization.dll
en\
而在en目录中,存在InChatter.Localization.resources.dll
我们默认的资源存储在InChatter.Localization.dll中,而我们英文的资源存在InChatter.Localization.resources.dll中
如果我们删除en文件夹,在英文的环境下,因为无法找到en资源,系统将直接使用默认的中文资源。
二、本地化系统窗体
1.使用生成的dll添加系统引用(需要将默认资源dll以及各个语言资源文件夹copy到系统的bin\Debug目录下),解决方案下的项目可直接引用项目
2.在WPF中使用项目资源
(1)Xaml中绑定资源
由于Resource中存在的都是静态属性的资源,在Xaml中绑定静态属性即可
<Window x:Class="InChatter.Client.WPFClient.View.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:InChatter.Client.WPFClient.Utility" Title="{x:Static rex:Resources.MessageWindow}" Height="600" Width="800" WindowStartupLocation="CenterScreen" xmlns:rex="clr-namespace:InChatter.Localization.Properties;assembly=InChatter.Localization" Visibility="{Binding WindowStatus,Mode= TwoWay}" > </Window>
这里我们引用前缀,并绑定了Title属性
(2)代码中的绑定
ResourceManager rm = new ResourceManager("InChatter.Localization.Properties.Resources", typeof(InChatter.Localization.Properties.Resources).Assembly)
我们本地测试时,在窗体的InitializeComponent()之前设置:
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en");
强制程序设置为英文的语言环境。
需要注意的是,在WPF由于MVVM绑定,处理时会引入新的线程,所以在WPF测试中,在ViewModel中也需要加入该设置才能保证ViewModel中设置的资源也为英文,这里的都是针对当前运行线程的,如果程序中加入了新的线程,都需要做这样的处理,当然这是在中文环境下。这里仅限于测试,真实使用时,会根据本地环境自动加载中文或英文,其他语言也可自行开发。
三、CurrentCulture和CurrentUICulture
资源信息的加载主要是有CurrentUICulture来决定的,而一些格式化选项则是有CurrentCulture来决定。
CurrentCulture是操作系统的用户区域环境的设置,而CurrentUICulture则是操作系统的语言设置。
附:
Winform添加资源方式
1.使用我们上述的第二种Code的方式
2.对窗体进行自定义,设置窗体属性的Localizable为true,在默认语言下设置窗体语言,完成以后,将窗体的Language修改为需要本地化的语言(默认为Default),然后再设置窗体界面语言即可。这种方式,资源是跟窗体关联的。