翻译助手 通常,网站支持多种语言。使用 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(); ?>]]>