Php Zend翻译URL和语言切换器
我已经设法使用Zend\u Controller\u路由器使我的URLPhp 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
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:是的,我指定了要使用的路线。更新了问题以说明我现在遇到的问题嗨,杰夫,希望你一切顺利。你把一切都做好了吗?这对你有帮助吗?祝你一切顺利,戴夫