This text is a work in progress—highly subject to change—and may not accurately describe any released version of the Apache™ Subversion® software. Bookmarking or otherwise referring others to this page is probably not such a smart idea. Please visit http://www.svnbook.com/ for stable versions of this book.

本地化

本地化 (localization) 指 的是让程序按照某个地区特有的方式进行运转的行为. 如果程序按照你所习惯的 方式来格式化数字或日期, 或者使用你的母语来输入 (或输出) 消息, 那我们就 说该程序是 本地化的 (localized). 本节介绍 Subversion 在本地化上所 做的工作.

理解地区

大多数现代操作系统都有一个 当前地区 的概念— 即遵守本地化惯例的地区或国家. 这些惯例—在典型情况下由系统的运行 时配置机制来选取—会影响程序向用户呈现数据以及向用户接收数据的方 式.

在大多数类 Unix 系统上, 你可以用命令 locale 查看和地区有关的运行时配置选项的值:

$ locale
LANG=
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL="C"
$

命令的输出是与地区有关的环境变量, 以及它们的当前值. 在上面的示例中, 变量的值都是默认的 C, 但用户可以把它们再设置成其他 国家/语言的编码组合. 例如, 如果把 LC_TIME 设置成 fr_CA, 程序就会知道要按照说法语的加拿大人的文化习惯 来呈现时间和日期; 如果把 LC_MESSAGES 设置成 zh_TW, 程序就会知道要使用繁体中文来显示消息. 设置 LC_ALL 相当于把每一个变量都设置成同一个值. 如果某个 变量没有设置, 它就会使用 LANG 的值作为默认值. 为了 得到 Unix 系统上所有可用的地区, 执行 locale -a.

Windows 配置地区的地方在控制面板的 地区和语言选项, 在这里你可以查看和选择各种地区设置, 甚至可以非常细致地修改显示方式的 既有格式.

Subversion 对本地化的支持

Subversion 客户端命令行工具 svn 使用两种方式 支持本地化配置. 第一种方式是根据环境变量 LC_MESSAGES 的值来决定按照哪一种语言打印所有的消息, 例如:

$ export LC_MESSAGES=de_DE
$ svn help cat
cat: Gibt den Inhalt der angegebenen Dateien oder URLs aus.
Aufruf: cat ZIEL[@REV]...
…

无论是 Unix, 还是 Windows, 这种行为的表现都是一样的. 但是, 你的 操作系统可能只支持特定的地区, 导致 Subversion 无法使用某些语言打印 消息. 为了输出本地化的消息, 需要有志愿者将每一条消息都翻译成本地语言. 译文使用 GNU 的 gettext 软件包进行编写, 得到的译文文件以 .mo 作为扩展名, 例如德文的译文文件是 de.mo. 这些译文文件安装在系统中的某个位置, 在 Unix 系统上, 它们的典型位置是 /usr/share/locale/, 而 Windows 的典型位置是 Subversion 安装目录的 share\locale\ 子目录内. 译文文件一旦安装完成, 它将按照它所服务的程序来命名, 例如 de.mo 安装后, 最终的名字可能是 /usr/share/locale/de/LC_MESSAGES/subversion.mo. 通过浏览已安装的 .mo 文件, 你就可以知道你的 Subversion 客户端可以说哪些语言.

Subversion 支持本地化的第二种方式涉及到 svn 如何 解释用户的输入. 仓库使用 UTF-8 编码记录所有的路径, 文件名和日志消息. 在这种情况下, 我们可以说仓库是 国际化的 (internationalized)—也就是说仓库已经准备 好接受任意一种人类语言. Subversion 客户端必须负责只向仓库发送 UTF-8 编码的文件名和日志消息, 所以它必须将本地字符编码的数据转化成 UTF-8 编码.

例如, 你创建了一个文件 caffè.txt, 然后在提交 时把日志消息写成了 Adesso il caffè è più forte. 文件名和 日志消息都包含了非 ASCII 字符, 由于你把本地语言设置成了 it_IT, 所以 Subversion 客户端知道它们是意大利文, 然后它使用意大利字符集把文件名和日志消息转换成 UTF-8 编码, 再发送给 仓库.

注意, 虽然仓库要求文件名和日志消息必须是 UTF-8 编码, 但它并不在乎 文件的内容是什么编码, Subversion 把文件的内容看成是不透明的字节串, 服务器端和客户端都不会试图去理解文件内容的字符集或编码方案.