系统多语言实现
背景:
早期开发未考虑全球化,英文版系统,页面很多,每个页面内容也很多。
目的:
本地化,如果选择特定的语言环境,应该显示特定语言。
系统简介:
1)没有采用windows控件,而是根据系统的特性自定义控件,比如Button,自定义的控件为RCButon、RCTextBox RCLabel等。
2)Win form开发。
3)。Net .2.0 和3.5,VS2010开发。
4)页面文本有些是在程序中设置,或者是从数据库中读取。
5)业务范围很广。
解决方案:
一:Winform本地化
步骤:(以Form1页面为例)
1)设置Form1窗体的属性:Localizable设置为true,Language设置为法文(暂定翻译成法语)。
2)逐个翻译页面中需要翻译的字段。自动生成对应的资源文件,比如Form1.fr.resx。
3)在控制面板中设置区域和语言,当设置成方法时,就能启动法语版本,一般我们是显示英语。
4)也可以通过编程设置,改变thread.currentthread.currentculture 和thread.currentthread.currentuiculture的值。
优点:
1)操作简单,编译项目时,为每种语言创建一个附属程序集,这个附属程序集只包含本地化资源。
2)根据不同语言的特性重新调整界面。
3)可以外包翻译,通过 windows资源本地化编辑器进行翻译,该工具无须访问C#源文件(产品部可以自己翻译啦)。
缺点:对于本系统改造,工作量太大。
二:textkey策略
设计原理
将界面控件上显示的内容text(以下简称text)以其对应的键值TextKey代替,并将TextKey和text的对应关系保存在配置文件中。在控件初始化或显示时,通过多语言模块得到对应的TextKey对应的text。对于没有定义TextKey的内容,将采用原来的内容,不进行多语言替换。
步骤
1)生成资源文件
采用工具抽取页面上的文本内容至csv文件中。格式如下:
模块名 文件名 控件名 文本内容 词频 textkey
前五项是从页面中获取,textkey需要手工操作,根据text内容定义唯一的textkey,再根据textkey生成资源文件。以ABCD.xml为例:
<?xml version="1.0" encoding="gb2312"?>
<Dictionary>
<word TextKey="BC.tkFeeCeiling" Text="文FEE CEILING" />
</Dictionary>
2)自定义控件改造
在控件属性栏中显示textkey属性。
[Browsable(true), DefaultValue(""), Category("Appearance"), Description("Text键值,用于控件多语言化")]
public string TextKey
{
get{.......}
set
{
//这路操作显示的内容。关键步骤TextCache
}
}
3)通过配置文件设置多语言属性。(目前没有解决根据机器culture来自动获取语言特性,只能通过配置文件设置)。
4)加载多语言包。
解析资源字典文件,将textkey和对应的text添加到dictionary中,再将dictionary中的内容存放到TextCache(用来存放资源字典)中。
优缺点:
1)工作量比上面的方法要少很多。翻译人员可根据字典直接翻译。
2)需要手动设置语言,不能获取机器的culture,资源字典是一次性加载到内存中,如果以后业务量增加,一次性加载不了怎么办?资源文件存放在服务器中,文件如果太大,传输速度?
也许还有更好的解决方案,欢迎大家指正。