2016-08-04 19 views
1

考慮下面的代碼片段:Symfony2的翻譯:在所有的消息重寫/替換一個字

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

許多語言有什麼所謂的T–V distinction,使文字更客氣或熟悉的:「你」成爲一個大寫「 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翻譯器來做到這一點嗎?

回答

1

使用佔位符來改變零件。

參見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); 
+0

沒想到佔位符!這將需要大量的代碼重寫,但它似乎仍然是一個非常合理的解決方案。 – Fx32