0

我已经设法使我的 URLi18n符合使用Zend_Controller_Router.

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

我面临的问题如下

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

Français
English
Italiano
etc.

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

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

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

en/utilisateur/connexion
it/utilisateur/connexion

代替

en/user/login
it/utente/collegamento

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

编辑

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

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

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

4

1 回答 1

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>

您希望在选择替代语言时翻译某些内容。In the example above the word login would appear when English is selected and entrar when Spanish is selected.

Zend_Translate 有比这更多的负载和几种实现它的方法,所以我并不是说无论如何这是最好的方法。

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

干杯,

戴夫

于 2012-01-26T10:48:23.787 回答