2011-07-22 12 views
5

翻訳ルックアップをネストする方法はありますか?このような何か:Rails I18nネストされたトランスレーションキー

en: 
    uh_oh: 'Uh Oh!' 
    error1: :'uh_oh' + ' There was a big error!' 
    error2: :'uh_oh' + ' There was another big error!' 
I18n.t('error1') #=> 'Uh Oh! There was a big error!' 
I18n.t('error2') #=> 'Uh Oh! There was another big error!' 

私はこののバリエーションの束を試みたが、代わりYAMLのRubyの翻訳ファイルを使用して、それを試してみました。

en: 
    uh_oh: 'Uh Oh!' 
    error1: :'uh_oh' 
I18n.t('error1') #=> 'Uh Oh!' 

しかし、私はerror1に追加のテキストを追加した場合、uh_ohは翻訳されません。この作業を行うことに注意してください。

は基本的に私はいつもこのように、一般的な用語で合格することを避けるためにしたい:

en: 
    uh_oh: 'Uh Oh!' 
    error1: '%{uh_oh} There was a big error!' 
uh_ohのような一般的な用語については
I18n.t('error1', {uh_oh: I18n.t('uh_oh')}) 

は、補間がerror1を呼び出すたびに同じ(およびその他のですキーはuh_ohを使用します)、補間する文字列を渡す必要はありません。 (私はそれが国際化で可能だとは思わない

I18n.t('error1') 

答えて

4

私はあなたの質問に答えるつもりはない:代わりに次の操作を行うとerror1翻訳は共通鍵翻訳の世話を持っていることが容易になるだろう宝石しかし、間違っている可能性があります)。私はあなたがこのアプローチを取って、リンク[1]をバックグラウンドとして与えるべきではないと言うつもりです。開発者はパターンを見て、DRYを維持するための共通コードを抽出するのが自然です。適切な翻訳ができないため、複数の言語を扱う場合、これはあまりにも遠すぎます。すべての言語が英語と同じ文章構造に従っているわけではなく、置き換えている文章が残りの文章に同意するために変更する必要があるかもしれません。

私が作業しているサイトでは、フランス語でこの問題が発生しています。ロケーション名を含む文章があり、これは英語では簡単です。 "%{location_name} property"は、ロケーション名が何であれ動作します。しかし、フランス語では、場所が町、地方、地域であるかどうか、そして名前が母音で始まるかどうかによって異なる構造が必要です。

[1] http://www.multilingual.com/articleDetail.php?id=594

+0

私はあなたが異なる文章の構造と文法の規則について何を意味しているのか分かります。しかし、変数の値を翻訳キー/値のペア(私が尋ねるようなもの)から取得するか、明示的に渡しても、各言語のファイルで文を構造化する方法は変わりません。 –

+0

本当に、ジェンダーには注意が必要です。私はあなたのためにあなた自身のヘルパーを書く必要があるだろうと思う。つまり、あなたの鍵のようなもの作り: 'キー:「!の!some.key FOOバー」あなたI18n.tラッパーがsome.keyを検索し、それを代わりに行く、その後、キーになるだろう' を – chrismcg

+0

あなたは可能性がありカスタムi18nバックエンドとしてもこれを行います。 – chrismcg

0

それは国際化は「シンボリックリンク」と呼ぶ特殊なケースだから、あなたが「I18n.t( 『ERROR1』)」自体による置換を行うことができた理由。

残念なことに、それは単一の完全置換よりも何も行いません。

この問題を解決する方法は2つあります。 1つ目は、I18nの出力を後処理することでした。これは、I18nが呼び出され、翻訳されたメッセージの消費量が(Railsなどで)広がってしまう可能性がある場合には、難しいかもしれません。最善の策はおそらくI18n.t関数をオーバーライドすることでしょう。

また、I18nバックエンドにラムダを格納する機能を利用することもできます。残念ながら、これは基本的な文字列しかサポートしていないので、結合された翻訳をYAMLファイルに格納することはできません。一例として、

、翻訳YAMLに、我々は、エラーメッセージのいずれかの可能性があり:

en: 
    error: "There was a big error [%{arg}]!" 

をそして今、我々はそれの前にuh_ohの翻訳とそれを呼びたいです。 私たちは、国際化のバックエンドにuh_ohとの組み合わせの翻訳を保存する必要があります。

translam = lambda { |key,opts| "Uh Oh! #{I18n.t(opts[:for],opts)}" } 
I18n.backend.store_translations(:en,:uh_oh => translam) 

今、私たちは「uh_oh」翻訳し、それを我々が翻訳したいエラーに加え、それが必要になる場合があり任意の引数を与えることができます。

I18n.t(:uh_oh, for: :error, arg: 42)) #=> 'Uh Oh! There was a big error [42]!' 
関連する問題