翻译助手
通常,网站支持多种语言。使用 Zend 翻译 来翻译网站的内容并且 使用 翻译 视图助手来在视图里集成 Zend 翻译 。
在下面所有的例子里我们使用简单的数组翻译适配器(Array Translation Adapter)。当然你也可以使用任何 Zend_Translate 的实例和 Zend_Translate_Adapter 的任何子类。有若干方法来实例化 翻译 视图助手:
已注册的,通过先前注册的实例
后来地,通过 fluent interface (流利的接口?我还没有找到合适的词汇,by Jason Qi)
直接地,通过实例化类
Zend_Translate 的已注册的实例是这个助手的首选用法。你也可以简单地在添加适配器到注册表之前选择被使用的地点(locale)
我们用地点(locales)而不用语言是因为一种语音也可以包含一个地区。例如英语有不同的方言,有英国英语和美国英语,因此我们用“地点”而不说“语言”。
已注册的实例
为使用已注册的实例就是创建一个 Zend_Translate 或者 Zend_Translate_Adapter 的实例并在 Zend_Registry 里用 Zend_Translate 作为它的键。
'einfach'), 'de');
Zend_Registry::set('Zend_Translate', $adapter);
// 在视图中
echo $this->translate('simple');
// 返回 'einfach'
?>]]>
如果你熟悉 fluent interface ,那么也可以在视图里创建一个实例然后实例化这个助手。
在视图里
为了使用 fluent interface ,创建一个 Zend_Translate 或者 Zend_Translate_Adapter 的实例,调用不带参数的助手并调用 setTranslator 方法。
'einfach'), 'de');
$this->translate()->setTranslator($adapter)->translate('simple');
// 返回 'einfach'
?>]]>
如果你使用没有Zend_View的助手,那么你也可以直接使用它。
直接用法
'einfach'), 'de');
// 实例化适配器
$translate = new Zend_View_Helper_Translate($adapter);
print $translate->translate('simple'); // this returns 'einfach'
?>]]>
如果你不用 Zend_View 你将需要这样做并需要创建一个已翻译的输出。
就象已经知道,translate() 方法用来返回翻译。用需要的翻译适配器的信息 id 来调用它。但它也可以在翻译字符串里替换参数。因此,它有两个方法接受变量参数。或者是参数类表,或者是参数数组。如下例:
单个参数
使用单个参数就把它添加到这个方法。
translate("Today is %1\$s", $date);
// 应当返回 'Heute ist Monday'
?>]]>
记住如果使用的参数也是文本,你可能也要翻译这些参数。
参数列表
使用参数列表并添加给方法。
translate("Today is %1\$s in %2\$s. Actual time: %3\$s", $date, $month, $time);
// 应当返回 'Heute ist Monday in April. Aktuelle Zeit: 11:20:55'
?>]]>
参数数组
使用参数数组并添加到方法。
translate("Today is %1\$s in %2\$s. Actual time: %3\$s", $date);
// 应当返回 'Heute ist Monday in April. Aktuelle Zeit: 11:20:55'
?>]]>
有时候必需要修改翻译的地点。可以通过动态翻译或者把所有的静态翻译来完成。并且你可以使用参数类表和参数数组。在这两种情况下,地点被当作最后一个单个参数给出。
动态修改地点 (locale)
translate("Today is %1\$s in %2\$s. Actual time: %3\$s", $date, 'it');
?>]]>
这个例子为 messageid 返回意大利语的翻译。但它将只能用一次。下个翻译将从适配器里设置地点。通常地在添加它到注册表之前你将在翻译适配器里设置期望的地点。但你也可以从助手里设置地点:
静态修改地点 (locale)
translate()->setLocale('it');
$this->translate("Today is %1\$s in %2\$s. Actual time: %3\$s", $date);
?>]]>
在上面的例子里设置 'it' 为新的缺省地点,它将被用来给所有将来的翻译。
当然,还有 getLocale() 方法来获得当前设置的地点。
获得当前设置的地点
translate()->getLocale();
$this->translate()->setLocale('it');
$this->translate("Today is %1\$s in %2\$s. Actual time: %3\$s", $date);
// 返回 'it' 为新的缺省地点
$this->translate()->getLocale();
?>]]>