Skip to content
xiangshouding edited this page Jan 14, 2015 · 1 revision

国际化解决方案

国际化解决方案适应于国际化多语言支持的解决方案.

  • 解决当语言增多时出现的文件成倍增长的问题
  • 支持动态加载,运行时分析
  • 解决本地编译效率低下、国际化目录规范复杂开发成本高等问题

背景

国际化是指产品、应用或者内容的设计和开发可以使得不同语言、文化、地区的目标受众容易接受和实现本地化这个单词一般被缩写成 i18n

国际化过程由如下基本的必要属性:

  • 设计和开发方式必须要能够容易的实现本地化和通用部署,包括使用unicode字符,确保对老的字符编码做了处理等等

  • 提供一些只有在某些情况下才会使用的本地化特性。比如在HTML的DTD中支持双向的文本展示特性,或者标示出语言,或者在CSS中提供支持文字垂直方向展示等等

  • 能够支持一些本地区域的语言和文化展现,如加入一些预定义的本地化数据或者从当地图书馆导出的用户属性,比如时间和日期的格式化展现,数字格式化,排序方式,用户名展示方式等等

  • 从源码中区分本地化的元素和内容,比如本地化备选展现方式可以通过用户在界面上选择后再独立展现

产品国际化的基本流程

  • 产品调研和确定目标市场
  • 给出产品需要的功能需求文档
  • 研发人员调研目标市场的本地化特性,评审需求文档
  • 设计、开发
  • 联调、测试,翻译语言
  • 效果确认,语言确认
  • 上线,效果确认,语言确认
  • 前端开发调研点

前端开发调研点

语言特性

  • 是否有单复数
  • 字符的字节数
  • 人称属性,比如他它她
  • 性别属性,某些动词会因为性别属性不一样而表现不一样
  • 语言展示的方向:LTR,RTL,VERTICAL

时间日期

  • 时间的显示格式
  • 日期的显示格式
  • 是否有本土化的日期显示方式(如中文: 2012年12月30日,泰语佛历显示等)
  • 时区标示符,参考这里

其它格式化内容

  • 数字格式化显示
  • 货币符号
  • 字符行高,字体大小

本地优化特性

  • 虚拟键盘支持(阿语)
  • 输入法支持(越南语有输入法的支持)
  • RTL语言的自动识别

FIS国际化方案

  • 自动抽取所有的词条
  • css RTL自动转换
  • 运行时展示不同语言

根据gettext的思路,一份代码在不同语言环境下展示不同语言。

使用

  1. 下载demo
  2. 编译发布项目
    • fisp release -r common
    • fisp release -r i18n
  3. 预览 http://127.0.0.1:8080

如何开发

按照上面说的使用方法,已经在本地模拟一个国际化项目。修改测试数据i18n字段,为en_US、ja_JP或其他分别看看效果。

<?php
$fis_data = array(
    'i18n' => 'en_US'
);
?>

进入模块i18n,详细了解一下目录结构;

└── i18n
    ├── fis-conf.js
    ├── lang #语言目录
    │   ├── en_US.po
    │   └── ja_JP.po
    ├── page
    ├── server.conf
    ├── static
    ├── test
    └── widget

当这个模块release以后得到如下结果;

.
├── config
│   ├── i18n-map.json
│   └── lang
│       ├── i18n.en_US.json
│       └── i18n.ja_JP.json
├── server-conf
│   └── i18n.conf
├── static
│   └── i18n
│       ├── mod.js
│       └── widget
├── template
│   └── i18n
│       ├── page
│       └── widget
└── test
    └── i18n
        └── page

可以看到config/lang目录下是一些JSON翻译文件。翻译文件格式为;

{
    "原文": "译文",
    "原文1": "译文1"
}

这样当运行时调用了翻译函数,翻译函数读取对应的翻译文件展示译文。

翻译函数

  • JS中的语言
  • Smarty模板中的语言

js中的语言:

var str = __('中文');

Smarty模板中的语言:

{%'中文'|gettext%}

综述,开发过程;

  1. 功能开发完成后,通过fisp xgettext抽取所有的词条,产出<namespace>.en_US.po等语言文件
  2. 开发人员完善po文件
  3. 编译项目fisp release -r project
  4. fis在编译过程中,分析po文件,生成<namespace>.en_US.json语言翻译文件key=>value
  5. 运行时执行{%'xxxx'|gettext%}函数时,根据语言类型,读取对应的翻译文字并展示

更多资料

更多国际化资料[http://fe.baidu.com/doc/i18n/]