31.2. Zend_Translate适配器

Zend_Translate能够处理不同的翻译适配器.每种适配器有它自己的优点和缺点. 下面是一个完整的适配器支持列表.

表 31.1. Zend_Translate适配器

适配器 描述 Usage
Array 使用PHP数组 小页面;使用最简单;仅对程序员;
Csv 使用逗号分隔值(*.csv/*.txt)文件 简单的文本文件格式;非常快; 可能有unicode字符的问题
Gettext 使用二进制gettext (*.mo)文件 Linux GNU标准;非常快;线程安全;需要工具进行转换;
TMX 使用 tmx (*.tmx/*.xml) 文件 国际化应用程序工业标准;XML格式;人可读;
QT Use qt linguist (*.ts) files Cross platform application framework; XML format; human readable
XLIFF 使用 xliff (*.xliff/*.xml) 文件 一个比TMX更加简单的格式;XML格式;人可读;
其他 *.sql, *.tbx, *.qt 与其他适配器不同,可能在将来实现

31.2.1. 如何判断使用哪种翻译适配器

你应该决定对Zend_Translate使用哪种适配器.常常,外部条件,例如一个项目需求或者客户需求为你决定了使用哪种适配器, 但是入你站在决策的位置,下面的提示可能有对你的决定帮助:

31.2.1.1. Zend_Translate_Adapter_Array

数组适配器对程序员来说是使用最简单的一种适配器.但是如果你有大量的字符串和许多语言要翻译,你应该考虑其他的适配器. 例如,如果你有5000个字符串要翻译,数组适配器对你来说并非最好的选择.

你应该仅在小规模站点,不多的语言需要翻译时使用本适配器,要是你或则你的开发者团队创建你们自己的翻译.

31.2.1.2. Zend_Translate_Adapter_Csv

Csv对于用户是使用上最简单的一种适配器.CSV文件可以通过标准的文本编辑器读取,但是有些文本编辑器通常不支持utf8字符集

你应该仅在你的客户需要自己翻译时使用本适配器.

31.2.1.3. Zend_Translate_Adapter_Gettext

Gettext适配器是最常用的一种适配器.Gettext是一种由GNU引入的翻译源格式,现在在世界上广泛使用,它不是人可读的, 但有几个免费的工具(例如,POEdit),用于读取Gettext数据. Zend_Translate Gettext 适配器并不是使用PHP的gettext扩展实现的. 你可以在没有安装PHP的gettext扩展的情况下也能够使用Gettext适配器. 还有Zend_Translate的Gettext适配器是线程安全的,而PHP的gettext扩展当前是非线程安全的.

大多数人使用本适配器,可用的工具,专业的翻译非常简单.但是gettext数据存储为机器可读的格式, 没有工具,它是不可读的.

31.2.1.4. Zend_Translate_Adapter_Tmx

Tmx适配器用于有多个系统,并且那些系统使用同样的源格式的大多数客户,或则翻译源格式必须是不依赖与系统的. TMX是一种基于XML的文件格式,它宣称将成为下一个工业标准. XML文件是人可读的,但是解析的速度却不如gettext文件快.

大多数中到大型的公司使用本适配器.因为文件是人可读的,不依赖于系统的.

31.2.1.5. Zend_Translate_Adapter_Qt

Qt 适配器适用于使用 QtLinguist 生成的 TS 文件作为其翻译源的用户。 QT 使用 XML 作为基本文件格式。XML 是用户可读的,但是分析速度比不上 gettext 文件。

许多应用是构建在 QT 框架之上的。 这个格式的文件是人类可读,并且不依赖操作系统的。

31.2.1.6. Zend_Translate_Adapter_Xliff

Xliff适配器被那些想使用XML文件但是没有TMX工具的多数客户使用. XLIFF也是一种基于XML的文件格式,它是于TMX相关的但是比TMX更简单,他仅支持TMX的部分功能. XML文件是人可读的,但是解析的速度却不如gettext文件快

多数中型公司使用此适配器,这个格式的文件是人可读,并且不依赖操作系统的。

31.2.2. 编写自己的适配器

Zend_Translate 允许编写并使用自己的适配器类。并且可以像 Zend_Translate 内置的标准类一样使用。

任何要在 Zend_Translate 使用的适配器都必须继承于 Zend_Translate_Adapter. 抽象类 Zend_Translate_Adapter 定义了所有翻译需要的内容。 用户需要做的,就是定义如何读取翻译数据(Translation Data)。

前缀“Zend”仅限由 Zend_Framework 使用。如果使用自己的适配器扩展了 Zend_Framework,应当命名为 “Company_Translate_Adapter_MyFormat”。下面的代码演示了如何编写一个自定义适配器:


<?php
require_once 'Zend/Translate.php';

try {
    
$translate = new Zend_Translate('Company_Translate_Adapter_MyFormat''/path/to/translate.xx''en', array('myoption' => 'myvalue'));
} catch (
Exception $e) {
    
// 文件没找到,没有适配器类
    // 通常的错误
}