Symfony2 翻译器:override/replace 所有消息中的一个词

Symfony2 Translator: override/replace a single word in all messages

考虑以下代码片段:

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

许多语言都有所谓的 T–V distinction 来使文本更礼貌或更熟悉:"you" 在荷兰语中变成大写的 "U" 或非大写的 "je", "Vous" 或 "tu" 法语等

我们要使用哪一个取决于目标受众(在我们的例子中主要基于域),我们的一个向老年人销售奢侈品的网站应该使用礼貌的信息,而针对学生的网站需要使用更多熟悉的表格。

替换翻译器中特定消息的最佳方法是什么?创建一个全新的语言环境 ('nl, nl_polite') 似乎有点矫枉过正,要求我们为每个语言环境将每条消息翻译两次,并带有 T-V 区别。

理想情况下,我想在已经处理 subdomain/domain/customer 设置的现有 onKernelRequest 侦听器中做这样的事情:

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

我想在翻译时替换消息中出现的所有单词(可能使用 preg_replace?),而不是替换消息。单词的语法位置终究没有改变。

我可以通过覆盖 symfony 翻译器来做到这一点吗?

对会发生变化的部分使用占位符。

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);