【问题标题】:Zend translate URL and language switcherZend 翻译 URL 和语言切换器
【发布时间】:2012-02-15 09:26:03
【问题描述】:

我已经设法使用Zend_Controller_Router 使我的网址i18n 兼容。

即: en/user/login 变为 fr/utilisateur/connexion 并且两个 URL 都指向相同的 controller/action

我面临的问题如下

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

Français
English
Italiano
etc.

当前活动的语言没有anchor 标签,但所有其他语言都有。

对于带有anchor 的语言,我正在构建 URL,我希望将它们翻译成特定语言。

目前,如果我在 French 中,所有的 url 都会用法语构建,即使我在 URL 视图帮助程序中将 @local 键设置为参数(tried "@locale" => 'en'"@locale" => new Zend_Locale('en')

en/utilisateur/connexion
it/utilisateur/connexion

而不是

en/user/login
it/utente/collegamento

因为在构建 URL 时使用的语言环境是在应用程序范围内定义的语言环境。

编辑

我对我的问题进行了更深入的研究,发现只有当前语言环境添加了加载的资源,这意味着我无法以正确的语言获取路线,以便以正确的语言构建路线

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

(我计划在遥远的将来(即将发布)实现缓存,所以我可能会获得更好的性能)

【问题讨论】:

  • 这很奇怪。我做同样的事情并且它有效。你指定路线吗?
  • @Aurelio De Rosa :是的,我指定了要使用的路线。更新了问题以指定我现在遇到的问题

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


【解决方案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>

您希望在选择替代语言时翻译某些内容。在上面的示例中,在选择英语时,将出现“登录”并选择“选中西班牙语时”。

Zend_Translate 的负载不止于此,还有多种实现方式,所以我并不是说这是最好的方式。

如果有帮助或者我可以给你更多信息,请告诉我。

干杯,

戴夫

【讨论】:

  • 嗨,杰夫,希望你一切都好。你让一切正常吗?这对你有帮助吗?一切顺利,戴夫:-D
猜你喜欢
  • 1970-01-01
  • 2011-06-09
  • 2012-03-11
  • 1970-01-01
  • 2011-01-05
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多