zoukankan      html  css  js  c++  java
  • 系统多语言实践(一)

    原文地址: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等。不要自己再搞一套了。

  • 相关阅读:
    Mybatis学习二(字段名与实体类属性名不相同/关联查询)
    SpringMVC学习二(日期参数/数据保存/重定向)
    Mybatis学习四(分页助手pagehelper)
    Mybatis学习三(动态sql语句)
    https详解
    http协议详解(超详细)
    Hdu 1072 【广搜】.cpp
    Hdu 1534 【差分约束系统】.cpp
    Hdu 1305 【字典树】.cpp
    并发
  • 原文地址:https://www.cnblogs.com/lhyqzx/p/5959665.html
Copyright © 2011-2022 走看看