我已设法使用i18n
符合我的网址Zend_Controller_Router
。
即:
en/user/login
变为fr/utilisateur/connexion
,两个网址都转到同一controller
/ action
。
我面临的问题是以下
我有一个语言切换器,显示如下:
Français
English
Italiano
etc.
当前有效的语言没有anchor
标记,但其他所有标记都有。
对于有anchor
的语言,我正在构建URL,我希望它们以特定语言翻译。
目前,如果我在French
,所有网址都会以法语构建,即使我在网址视图助手@local
中设置tried "@locale" => 'en'
密钥作为参数,{{1 }})
"@locale" => new Zend_Locale('en')
而不是
en/utilisateur/connexion
it/utilisateur/connexion
因为构建URL时使用的语言环境是应用程序范围定义的语言环境。
修改
我在我的问题中深入挖掘了一点,我发现只有当前的语言环境会加载其资源,这意味着我无法用正确的语言获取路由,以便用正确的语言构建路径
我的新问题是:如何加载多种语言翻译资源?
(我打算在遥远的未来(接近发布)实施缓存,所以我可能会有更好的表现)
答案 0 :(得分:1)
希望这有助于解决新问题。
“我的新问题是:如何加载多种语言翻译资源?”
只是一个快速的警告,我说我没有编写下面的代码,它是从Zend的工作人员放在一起的示例应用程序中获取的,但它可能有助于将其分解为这样。
他们对示例应用程序的方法是使用包含翻译的csv文件并使用您的配置文件(新项目中的默认文件是application.ini)来指定所有语言翻译资源的路径。
像这样:;; Languages
language.file.en = APPLICATION_PATH "/../language/en/translate.csv"
language.file.fr = APPLICATION_PATH "/../language/fr/translate.csv"
language.file.de = APPLICATION_PATH "/../language/de/translate.csv"
language.file.es = APPLICATION_PATH "/../language/es/translate.csv"
language.name.zz = Language
language.name.en = English
language.name.fr = Français
language.name.de = Deutsche
language.name.es = Español
在每个csv文件中,如果您使用Excel或Open Office等内容创建它,则A列将是原始语言,B列将是翻译。
例如,英语是原始语言,需要西班牙语翻译:
A B
login entrar
logout salir
您可以为要翻译的所有单词/短语执行此操作。 如果未找到翻译,则使用默认原始单词。
您的主应用程序引导程序可能包含以下内容:
protected function _initLanguage()
{
$options = $this->getOptions();
Zend_Registry::set('language',$options['language']);
$langSess = new Zend_Session_Namespace('language');
if (!isset($langSess->translate)) {
$translate = new Zend_Translate('csv', $options['language']['file']['en']);
$langSess->translate = $translate;
}
if (!isset($langSess->locale)) {
$langSess->locale = 'en';
}
Zend_Locale::setDefault($langSess->locale);
}
由于翻译对象保存在会话中,您可以使用以下内容在任何视图等中使用它:
$langSess = new Zend_Session_Namespace('language');
$translate = $langSess->translate;
和
<a href="/user/login"> <?php echo $translate->_('login') ?> </a>
您希望在选择其他语言时翻译某些内容。在上面的示例中,选择英语时会出现单词login,选择西班牙语时会出现entrar。
Zend_Translate的负载超过了这个以及实现它的几种方法,所以我不是说这是最好的方式。
如果有帮助,或者我可以向您提供更多信息,请告诉我。
干杯,
戴夫