2016-08-04 3 views
1

は、次のコードを考えてみましょう:Symfony2の翻訳:オーバーライド/すべてのメッセージに単一の単語を置き換え

$translator->setLocale('nl'); 
$translator->trans('You have ordered one cup of coffee'); 

多くの言語がT–V distinctionはテキストがより丁寧や身近な作るためにと呼ばれるものを持っている:「あなたは」 "大文字になり、フランス語などで "U"または非大文字の "je"、オランダ語で "Vous"または "tu"など。

ターゲットオーディエンス(この場合は主にドメインに基づいています)に依存します。高齢者に高級品を販売している私たちのサイトの1つは、丁寧なメッセージを使用する必要があります。ウェブサイトをターゲットとする学生は、より身近なフォームを使用する必要があります。

翻訳者の特定のメッセージを置き換えるにはどうすればよいでしょうか?完全な新しいロケール( 'nl、nl_polite')を作成することは、残虐行為のように思えます.T-Vの区別を持つすべてのロケールに対して、すべてのメッセージを2回翻訳する必要があります。

理想的には私はすでにサブドメイン/ドメイン/顧客の設定を扱う既存のonKernelRequestリスナーの内側に、このような何かをしたいと思います:

if ($translator->getLocale() == 'nl' && $customer->getLanguagePolite() == true) 
    $translator->replaceWord('you','U'); 
    $translator->replaceWord('your','Uw'); 
} 

私は内部の単語のすべての発生を置き換えるしたいと思います(おそらくpreg_replace?を使用して)メッセージを置き換えるのではなく、メッセージを置き換えます。単語の文法上の位置は結局変わらない。

私はsymfonyトランスレータをオーバーライドすることでこれを行うことができますか?

答えて

1

さまざまな部分にプレースホルダを使用します。

http://symfony.com/doc/current/components/translation/usage.html#component-translation-placeholders

例えばを参照してください。

if ($customer->getLanguagePolite()) { 
    $placeholders = [ 
     '%YOU%' => 'U', 
     '%YOUR%' => 'Uw', 
     etc 
    ] 
} else { 
    $placeholders = [ 
     ... 
    ] 
} 

$yourMessage = '%YOU% blah blah %YOUR% etc'; 

$translator->trans($yourMessage, $placeholders); 
+0

プレースホルダはありませんでした。それにもかかわらず、多くのコードの書き換えが必要になりますが、非常に合理的な解決策に見えます。 – Fx32

関連する問題