首页 > 代码库 > 系统多语言实践(一)

系统多语言实践(一)

原文地址:http://blog.csdn.net/cassaba/article/details/21236679

应用系统支持多语言,在有跨国业务的公司中,是个很常见的需求。一般涉及到的语言有中简、中繁、英文、日语等。本文就.Net Web平台下实现该需求做一些初步探讨。
Asp.Net Web Form时代,微软就给出了一个解决方案。简单来讲,就是将多语言资料维护到*.{Culture Code}.resx文件中,绑定的工具根据该文件自动生成静态的多语言访问类。
这个方案,简单实用。对于一般的小项目也够用了。但是对于一个需要长期维护的产品来说,还需要考虑更多的问题。多语言从技术角度来讲,应该解决下面两个问题:?
1.
多语言存储

方便维护管理,通用词汇能够公用

2. 多语言访问
方便的API, 最好透明化

如果从需求角度来讲,我认为需要分为下面两类
1.
静态多语言
即固定写在页面上的文字和提示的Message
2.
运行时多语言
系统运行时,由用户输入的多语言数据。如产品的名字,描述等

本节先从静态多语言讲起。
一. 静态多语言

1.
多语言存储

在设计上一般把数据保存到表里面,Resource Key采用int型,通过分段,分配给各个模块使用。同时保留一块作为公共段,存储通用多语言数据,如"确定""取消"之类的词汇。 表结构如下:

RESOURCE_STATIC

 ?

 ?

 ?

 ?

PK

栏位

类型

允许NULL

描述

PK

ID

INT

N

多语言Key

PK

CULTURE_CODE

VARCHAR(10)

N

区域代码

 ?

RESOURCE_VALUE

NVARCHAR(1024)

N

多语言值

 ?

MODULE_NAME

VARCHAR2(50 CHAR)

N

模块名称

 ?

REFER_BY

VARCHAR2(50 CHAR)

Y

使用者标记

 ?

CREATED_ON

DATETIME

N

创建时间

 ?

CREATED_BY

NVARCHAR(50)

N

创建人

 ?

CHANGED_ON

DATETIME

Y

变更时间

 ?

CHANGED_BY

NVARCHAR(50)

Y

变更人

?

定义ID分段

1 ~ 1,000,000

公用词汇段

1,000,001 ~ 2,000,000

Module1 使用段

2,000,001 ~ 3,000,000

Module2 使用段

… …

??

??

定义好区段后,应该开发小工具来管理多语言。提供增删改查,检测重复,自动翻译,汇出期间数据脚本的功能。

??

2.? 多语言访问

设计一个API Res类,启动的时候装入所有多语言数据。提供多语言数据访问。主要代码如下:

?技术分享

??

为了在使用多语言的时候,得到一定的可读性。我们采用扩展方法,为String对象增加Localize方法。

技术分享

比如 Id 1000 对应多语言值是 "确定"。那么后台C#的代码可以这样写:

string confirm = "确定".Localize(1000);

View中的文字的按照下面的写法,这种做法保证了View页面的可读性。

[html]?view plain?copy

?技术分享技术分享

  1. <label?class="control-label">@("物料名称".Localize(60000009))</label>??

如果是Java Script包,需要在包初始化时候传递进去,或者发请求获取所需多语言资料:

[javascript]?view plain?copy

?技术分享技术分享

  1. <script?type="text/javascript">??
  2. ????$(function?()?{??
  3. ????????myPackage.init({??????????????????
  4. ????????????locale:??
  5. ????????????{??
  6. ????????????????confirm:?‘@("确定".Localize(1000))‘,??
  7. ????????????????cancle:?‘@("取消".Localize(1001))‘??????????????????????
  8. ????????????}??
  9. ????????});??
  10. ????});??
  11. </script>??

?

对于枚举,处理特殊一些,我们使用Attribute来标记它所使用的多语言Key。然后通过反射得到一个多语言列表,为前台提供绑定选项

[csharp]?view plain?copy

?技术分享技术分享

  1. [DataContract]??
  2. public?enum?MessagePriority??
  3. {??
  4. ????///?<summary>??
  5. ????///?普通??
  6. ????///?</summary>??
  7. ????[EnumLocalize(1005,?"普通")]??
  8. ????[EnumMember]??
  9. ????Normal?=?1,??
  10. ???
  11. ????///?<summary>??
  12. ????///?重要??
  13. ????///?</summary>??
  14. ????[EnumLocalize(1006,?"重要")]??
  15. ????[EnumMember]??
  16. ????Important?=?2??
  17. }??

??

3.? 其它

多语言隶属于国际化范畴,有一些通用规范,比如区域代码的定义,i18N等。不要自己再搞一套了。

系统多语言实践(一)