Zend翻译URL和语言切换器

时间:2012-01-20 20:55:46

标签: php zend-framework zend-translate zend-controller-router

我已设法使用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时使用的语言环境是应用程序范围定义的语言环境。

修改

我在我的问题中深入挖掘了一点,我发现只有当前的语言环境会加载其资源,这意味着我无法用正确的语言获取路由,以便用正确的语言构建路径

我的新问题是:如何加载多种语言翻译资源?

(我打算在遥远的未来(接近发布)实施缓存,所以我可能会有更好的表现)

1 个答案:

答案 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的负载超过了这个以及实现它的几种方法,所以我不是说这是最好的方式。

如果有帮助,或者我可以向您提供更多信息,请告诉我。

干杯,

戴夫