考虑以下代码片段:
$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翻译器吗?
答案 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);