0

を使用してURLi18nを準拠させることができましたZend_Controller_Router

つまり 、にen/user/loginなりfr/utilisateur/connexion、両方のURLが同じcontroller/に移動しますaction

私が直面している問題は次のとおりです

次のように表示される言語スイッチャーがあります:

Français
English
Italiano
etc.

現在アクティブな言語にはanchorタグがありませんが、他のすべての言語にはタグがあります。

それらが含まれている言語についてはanchor、URLを作成しており、特定の言語に翻訳してほしいと思っています。

現在、私がすべてのURLにいる場合、URLビューヘルパーでキーをパラメータとしてFrench設定しても、フランス語でビルドされます( 、)@localtried "@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>

代替言語を選択する際に何かを翻訳したい場合。上記の例では、英語が選択されている場合はloginという単語が表示され、スペイン語が選択されている場合はentrarという単語が表示されます。

Zend_Translateには、これよりも多くの負荷があり、それを実装するいくつかの方法があるため、これが決して最良の方法であるとは言えません。

それが役に立った場合、または私があなたにもっと情報を与えることができるならば、私に知らせてください。

乾杯、

デイブ

于 2012-01-26T10:48:23.787 に答える