系统多语言实现

背景:

早期开发未考虑全球化,英文版系统,页面很多,每个页面内容也很多。

目的:

本地化,如果选择特定的语言环境,应该显示特定语言。

系统简介:

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,资源字典是一次性加载到内存中,如果以后业务量增加,一次性加载不了怎么办?资源文件存放在服务器中,文件如果太大,传输速度?

 

 

 也许还有更好的解决方案,欢迎大家指正。

 

posted on 2015-04-30 15:48  古剑苏苏  阅读(841)  评论(0编辑  收藏  举报