Symfony2翻译器:覆盖/替换所有消息中的单个单词


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

考虑以下代码片段:

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

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

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

替换翻译器中特定消息的最佳方式是什么?创建一个全新的区域设置('nl,nl_polite')似乎有些过头了,要求我们为每个区域设置翻译两次每条消息,并进行T–V区分。

理想情况下,我想在现有的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-翻译占位符

例如

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