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

时间:2016-08-04 09:40:42

标签: php symfony translation

考虑以下代码片段:

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

许多语言都使用所谓的T–V distinction来使文字更有礼貌或更熟悉:“你”成为荷兰语中的大写“U”或非大写“je”,“Vous”或“tu”in法语等。

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

替换翻译器中特定邮件的最佳方法是什么?创建一个完整的新语言环境('nl,nl_polite')似乎有些过分,需要我们为每个语言环境翻译每个消息两次,并且具有T-V区别。

理想情况下,我想在已经处理子域/域/客户设置的现有onKernelRequest监听器中执行类似的操作:

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

我想在翻译时(可能使用preg_replace?)替换消息内部的每个字词,而不是替换消息。毕竟,这个词的语法位置并没有改变。

我可以通过覆盖symfony翻译器吗?

1 个答案:

答案 0 :(得分:1)

对于不同的部分使用占位符。

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

e.g。

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

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

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