Php Zend翻译URL和语言切换器

Php Zend翻译URL和语言切换器,php,zend-framework,zend-translate,zend-controller-router,Php,Zend Framework,Zend Translate,Zend Controller Router,我已经设法使用Zend\u Controller\u路由器使我的URLi18n兼容 即: en/user/login变为fr/usilisateur/connexion,两个URL都指向相同的控制器/操作 我面临的问题如下 我有一个语言切换器,显示如下: Français English Italiano etc. 当前活动的语言没有锚定标记,但所有其他语言都有 对于有锚定的语言,我正在构建URL,并希望它们被翻译成特定的语言 当前,如果我使用的是法语所有URL都是用法语构建的,即使我在URL

我已经设法使用Zend\u Controller\u路由器使我的URL
i18n
兼容

即:
en/user/login
变为
fr/usilisateur/connexion
,两个URL都指向相同的
控制器
/
操作

我面临的问题如下

我有一个语言切换器,显示如下:

Français
English
Italiano
etc.
当前活动的语言没有锚定标记,但所有其他语言都有

对于有
锚定的语言,我正在构建URL,并希望它们被翻译成特定的语言

当前,如果我使用的是
法语
所有URL都是用法语构建的,即使我在URL视图帮助程序中将
@local
键设置为参数(
尝试了“@locale”=>“en”
“@locale”=>新Zend_locale('en')

而不是

en/user/login
it/utente/collegamento
因为构建URL时使用的区域设置是在应用程序范围内定义的

编辑

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

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


(我计划在不久的将来(即将发布)实现缓存,因此我可能会获得更好的性能)

希望这有助于重新发布新版本

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

只是一个简短的警告,我没有写下面的代码,它是从一个示例应用程序放在一起的家伙在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
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);
} 
在每个csv文件中,如果您使用Excel或Open Office之类的工具来创建它,A列将是原始语言,B列将是翻译

例如,英语为原文,需要西班牙语翻译:

A       B
login   entrar
logout  salir
你可以对所有你想翻译的单词/短语这样做。 如果找不到翻译,则使用默认的原始单词

您的主应用程序引导程序可能有如下内容:

;; 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
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);
} 
由于translate对象保存在会话中,因此您可以在任何视图中使用它,例如:

$langSess = new Zend_Session_Namespace('language');
$translate = $langSess->translate;
以及:


您希望在选择其他语言时翻译某些内容。在上面的示例中,选择英语时会出现login一词,选择西班牙语时会出现entra一词

Zend_Translate的负载远不止这些,还有几种实现方法,所以我并不是说这是最好的方法

如果有帮助,或者如果我能给你更多的信息,让我知道

干杯


戴夫

这很奇怪。我做同样的事情,它的工作。你指定了路线吗?@Aurelio De Rosa:是的,我指定了要使用的路线。更新了问题以说明我现在遇到的问题嗨,杰夫,希望你一切顺利。你把一切都做好了吗?这对你有帮助吗?祝你一切顺利,戴夫