考虑以下代码片段:
$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);