DP

国际化和本地化

David Peng

2016-01-09

关于软件产品国际化和本地化的学习笔记。需要考虑字符、编码、货币、日期和时间的格式、数字、单位等等。

用户在使用软件时遇到的问题

用户因为文化的不同有一些常见的差异。

字符和编码

美国的编码一般是 ASCII,这个编码只包含常用的英文字符和英文标点,欧洲语言的人使用的是 ISO 8859-1 编码,而亚洲语言字符更多,编码会更复杂。简体中文常用 GB2312, GBK, GB18030,繁体中文常用 BIG-5。现代的操作系统都支持 Unicode 编码,常用的是 UTF-8,这种编码包含了世界上大多数语言的字符。

货币

每个国家的货币单位未必是一样的。比如美国用的是美元,符号是 $,中国是人民币,符号是 ¥,欧洲是欧元,等等。货币是和人们的生活息息相关的,使用本地货币单位会更方便。

日期和时间

每个国家表示日期和时间也未必是一样的。比如日期 1994 年 12 月 25 日,在美国表示为 12/25/94,在澳大利亚表示为 25/12/94,有些国家又是以 ISO 8601 日期规范表示的,为 1994-12-25。

时间有的表示是 hh:mm 或 hh.mm。有的使用 12 小时制,比如 10:10 PM,有的使用 24 小时制,比如 22:10。

数字

各个国家的数字表示也未必一样。表示 12345.67 这个数的方法:

英语表示:12,345.67 德语表示:12.345,67 法语表示:12345,67 亚洲表示:1,2345.67

单位

每个国家的度量衡单位也不一致。比如英语用英里,我国用公里和里。

消息

最主要的部分是语言本身的所有句子或字符。

使用 gettext 来实现本地语言支持

PO(Portable Object)文件包含所有的字符串和对应的翻译。先由 xgettext 生成 POT 文件(PO Template),不包含翻译,只包含代码中的字符串。用 msgmerge 可以转成 PO 文件,每一个 PO 文件对应一个语言包。PO 用于翻译者阅读,每个翻译者翻译对应的 PO 文件。翻译完成后用 msgfmt 可以转成 MO 文件。MO(Machine Object)文件是二进制文件,用于计算机读取。

本地格式的表示法

语言格式表示为“ll_CC”,其中 ll 是 ISO 639 规定的语言编码,CC 是 ISO 3166 规定的国家编码。比如德语是“de_DE”,简体中文是“zh_CN”。‘ll_CC.encoding’在语言后指定编码,比如 de_DE.UTF-8。

使用 locale -a | grep '^ll' 命令可以查看系统支持的语言。

准备翻译

要将被翻译的句子以良好的语法写好,使用正确的英语格式,完整的句子,在段落处分开,使用常规的字符而不是拼接的,避免不常见的标记或控制符。

不要将一个句子分开为几句,然后再拼接起来,否则会造成翻译错误,因为翻译人员在翻译时不会知道这几个句子是关联的,也不会去看源码。

可以设置关键字来代替 gettext,比如使用 ‘_’。_("Translatable string") 等同于 gettext ("Translatable string")

#include <libintl.h>
#define _(String) gettext (String)

©2020 David Peng ♥ 采用 Pandoc 搭建