您的位置:首页 > 其它

系统多语言实践(一)

2014-03-14 14:38 447 查看
应用系统支持多语言,在有跨国业务的公司中,是个很常见的需求。一般涉及到的语言有中简、中繁、英文、日语等。本文就.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页面的可读性。
<label class="control-label">@("物料名称".Localize(60000009))</label>


如果是Java Script包,需要在包初始化时候传递进去,或者发请求获取所需多语言资料:
<script type="text/javascript">
$(function () {
myPackage.init({
locale:
{
confirm: '@("确定".Localize(1000))',
cancle: '@("取消".Localize(1001))'
}
});
});
</script>


对于枚举,处理特殊一些,我们使用Attribute来标记它所使用的多语言Key。然后通过反射得到一个多语言列表,为前台提供绑定选项
[DataContract]
public enum MessagePriority
{
/// <summary>
/// 普通
/// </summary>
[EnumLocalize(1005, "普通")]
[EnumMember]
Normal = 1,

/// <summary>
/// 重要
/// </summary>
[EnumLocalize(1006, "重要")]
[EnumMember]
Important = 2
}


3. 其它
多语言隶属于国际化范畴,有一些通用规范,比如区域代码的定义,i18N等。不要自己再搞一套了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: