多国语言功能设计与实现
2013-07-10 11:28
369 查看
多国语言功能设计与实现
ERP软件应该实现多国语言功能。一般是英文,简体中文和繁体中文。理论上,实现两种或两种以上的语言就已经实现任意语言,但是从Window的语言和区域选项中可以看到,要完整的实现多国语言,还需要对这些特性进行定制。从实现方法来上说,有两种方式:
1只读。语言资源呈现现到界面中,以只读的方式,用户不可修改。或是只能由开发部门修改。
2可修改。语言资源可以由用户定制修改。
我倾向于使用向者。这个过程也是逐步认识的。当熟悉SR之类的资源文件(Resx)工具之后,非常迷恋这种方式。对每一个字符串资源,生成为类型的公共静态属性,调用方式相当方便。用.NETReflector载入.NETSDK中的工具LC.EXE,可以看到这种实现。
还可以看到.NET类库System.dll也是这种方法。这是.NET框架的多语言方案。
经过ERP开发实践之后,经常遇到的一种情况是用户要修改开发人员设计的语言资源,以更符合实际的行业情况。
1设计数据库表
USE[Framework] GO /******Object:Table[dbo].[LanguageTranslation]ScriptDate:08/09/201307:44:28******/ SETANSI_NULLSON GO SETQUOTED_IDENTIFIERON GO CREATETABLE[dbo].[LanguageTranslation]( [LanguageCode][nvarchar](1)COLLATESQL_Latin1_General_CP1_CI_ASNOTNULLDEFAULT(''), [KeyText][nvarchar](200)COLLATESQL_Latin1_General_CP1_CI_ASNOTNULLDEFAULT(''), [DisplayText][nvarchar](200)COLLATESQL_Latin1_General_CP1_CI_ASNULL, [CreatedDate][datetime]NULL, [CreatedBy][nvarchar](10)COLLATESQL_Latin1_General_CP1_CI_ASNULL, [RevisedDate][datetime]NULL, [RevisedBy][nvarchar](10)COLLATESQL_Latin1_General_CP1_CI_ASNULL, [OwnerBranch][nvarchar](4)COLLATESQL_Latin1_General_CP1_CI_ASNULL, [SourceBranch][nvarchar](4)COLLATESQL_Latin1_General_CP1_CI_ASNULL, CONSTRAINT[PK_LanguageTranslation]PRIMARYKEYCLUSTERED ( [LanguageCode]ASC, [KeyText]ASC )WITH(PAD_INDEX=OFF,IGNORE_DUP_KEY=OFF)ON[PRIMARY] )ON[PRIMARY] GO EXECsys.sp_addextendedproperty@name=N'MS_Description',@value=N'语言编码 0英语 1繁体中文 2简体中文 ',@level0type=N'SCHEMA',@level0name=N'dbo',@level1type=N'TABLE',@level1name=N'LanguageTranslation',@level2type=N'COLUMN',@level2name=N'LanguageCode' GO
以字符串和语言资源表示Id为主键,在生成资源时,会同时插入三笔记录,表示三种不同的语言资源。
2添加接口与实现类,对它进行读写
namespaceFoundation.InterfaceClasses
{
publicinterfaceILanguageTranslationManager
{
LanguageTranslationEntityGetLanguageTranslation(stringlanguageCode,stringkeyText);
LanguageTranslationEntityGetLanguageTranslation(stringlanguageCode,stringkeyText,IPrefetchPath2prefetchPath);
LanguageTranslationEntityGetLanguageTranslation(stringlanguageCode,stringkeyText,IPrefetchPath2prefetchPath,ExcludeIncludeFieldsListfieldList);
EntityCollectionGetLanguageTranslationCollection(IRelationPredicateBucketfilterBucket);
EntityCollectionGetLanguageTranslationCollection(IRelationPredicateBucketfilterBucket,ISortExpressionsortExpression);
EntityCollectionGetLanguageTranslationCollection(IRelationPredicateBucketfilterBucket,ISortExpressionsortExpression,IPrefetchPath2prefetchPath);
EntityCollectionGetLanguageTranslationCollection(IRelationPredicateBucketfilterBucket,ISortExpressionsortExpression,IPrefetchPath2prefetchPath,ExcludeIncludeFieldsListfieldList);
LanguageTranslationEntitySaveLanguageTranslation(LanguageTranslationEntitylanguageTranslation);
LanguageTranslationEntitySaveLanguageTranslation(LanguageTranslationEntitylanguageTranslation,EntityCollectionNonGenericentitiesToDelete);
voidSaveLanguageTranslationCollection(EntityCollectioncolls);
voidDeleteLanguageTranslation(LanguageTranslationEntitylanguageTranslation);
boolIsLanguageTranslationExist(stringlanguageCode,stringkeyText);
stringGetDisplayText(stringkeyText,intlanguageCode);
}
}
因为系统中涉及大量的语言资源,当系统启动时,应该把它读取到系统缓存中,而不必每次都去访问数据库。
再设计一个Common静态类型,可以实现对语言资源翻译简单的调用封装,简化调用代码:
publicstaticstringTranslateText(stringtextToTranslate)
{
returnLanguageTranslator.TranslateText(textToTranslate);
}
publicstaticstringTranslateText(stringtextToTranslate,booluseChineseSymbols)
{
returnLanguageTranslator.TranslateText(textToTranslate,useChineseSymbols);
}
3添加翻译到系统基础类型中
我觉得这一部分是整个多语言结构中比较重要的一部分。请看代码:publicvoidTranslateForm()
{
OnBeforeTranslateForm();
TranslateControl(this);
OnAfterTranslateForm();
}
系统一般都会有一个基础窗体类型,以实现代码重用。比如WindowsForms中的BaseForm,Web中的PageBase,我加基础窗体或页面类型中,添加TranslateForm方法,实现对界面对的Label翻译。
接下来的工作,就是循环遍历界面中的控件,设置它的Label/Caption/Title属性,这个属性是显示到界面中的。
if(ctrl!=null)
{
if(ctrlisUltraTextEditor||ctrlisUltraNumericEditor||ctrlisUltraFormattedTextEditor||
ctrlisSystem.Windows.Forms.RichTextBox)
{
//donottranslatetextfortexteditorandnumericeditor
}
else
{
if(!string.IsNullOrEmpty(ctrl.Text))
{
stringtextToTranslate=GetTranlatedText(ctrl,"Text",ctrl.Text);
ctrl.Text=LanguageTranslator.TranslateText(textToTranslate);
}
}
if(ctrl.ContextMenuStrip!=null)
TranslateControl(ctrl.ContextMenuStrip);
}
我觉得这一部分,这个实现方法对编写ERP界面的多国语言很好的借鉴意义。
4设计界面,添加控件
给项目添加窗体,拖拉控件到界面中,设置它的Label/Caption/Text文字内容。默认的,我们将控件的文本部分设为标准的英语,再到运行时,如果用户对标签为更改,则调用用户的更改,否则用默认的标签文本。
5设计文本翻译和修改功能给用户
这一部分的功能,是方便用户对语言资源进行修改。修改部分并不复杂,简单的对数据表进行修改或写入。Display的内容,是显示到界面中的标签文本。
比如WorkCenter这个词,也可以是WorkCentre,两种语系的叫法不同。可以在Display中修改,让它显示为您符合您要求的语言习惯。
这一步,以开发人员的角度来看,是实现字符串替换,将用户修改的字符串,替换自己添加上的默认字符串。
实用工具的截图如下所示:
调用Microsoft.VisualBasic程序集的的简体繁体转化功能:
publicstringConvertGB2312(stringsimplifiedChinese)
{
return(Microsoft.VisualBasic.Strings.StrConv(simplifiedChinese,Microsoft.VisualBasic.VbStrConv.TraditionalChinese,0));
}
6与语言区域有关的内容的定制化
看控制面板中的内容,很完整的展示与多国语言相关的所需要做的工作内容:简单的概括为货币符号,数字格式,日期时间三大类型。这里面要做到很细化实属不容易,没有第三方国家语言的经验,很难对它有深刻的理解。
至此,从数据表到界面,再到实用工具,向您展示了ERP系统中多国语言功能的设计与实现。
相关文章推荐
- 企业管理软件开发之八 多国语言功能设计与实现
- 引擎设计跟踪(九.8) Gizmo helper实现与多国语言
- 社区网站功能实现系列(一):多国语言的实现
- 借助Google Translate API实现网站多国语言翻译功能
- 如何用算法实现多国语言的自动识别功能?
- 借助Bing Translate API翻译API实现网站多国语言翻译功能
- 由动态类型语言想到IDE应该考虑实现的一个功能
- 设计模式:装饰器模式实现 固定类功能
- 输入自动提示与补全功能的设计与实现
- kingshard架构设计和功能实现
- Winform中多国语言窗体的设计以及.NET中资源文件的使用
- VB.net Winform多国语言的实现
- iOS中代码支持多国语言切换的实现(Xcode5+iOS7)
- QT实现多国语言的动态切换
- Java语言实现的单例设计模式复习
- 基于JSON缓存的多国语言的实现
- 模块管理常规功能自定义系统的设计与实现(23--二个模块之间的关联[1])
- Winform中多国语言窗体的设计以及.NET中资源文件的使用
- Angular简易分页设计(一):基本功能实现
- 基于角色-功能-资源的权限控制模型的设计与实现-引子