Cand merge
Pentru a scrie corect un text în funcție de o variabilă numerică se procedează în felul următor.
echo \Yii::t('app', '{n, plural, =0{are no invoices} =1{one invoice} few{# invoices} other{# invoices}} selected.', ['n' => $n]);
După cum se vede sunt introduse cu ajutorul {} secțiuni de preprocesare, care la randul lor au subsecțiuni {} coresunzătoare fiecărei condiții pentru preprocesare ce se aplică variabilei.
Ce vedeți în exemplu se afișează și se traduce (in PoEdit) după cum urmează:
| n | EN | RO (traducere in PoEdit) |
| 0 | no invoces selected. | nicio factură selectată. |
| 1 | one invoice selected. | o factură selectată. |
| 2 .. 19 (few) | 19 invoices selected. | 19 facturi selectate. |
| >=20 (other) | 20 invoices selected. | 20 de facturi selectate. |
Pentru mai multe informatii despre utilizarea pluralelor citeste https://www.yiiframework.com/doc/guide/2.0/en/tutorial-i18n#plural iar pentru mai multe informații în general despre internaționalizare în Yii2 citește de aici https://www.yiiframework.com/doc/guide/2.0/en/tutorial-i18n#internationalization.
Cand nu merge (by Catalin)
In cazul in care nu se poate folosi functionalitatea aceasta din Yii::t() – de exemplu cand se face din .js, unde nu am acces la php – atunci trimitem toate cele patru mesaje in JS, cu Yii::t(), de unde facem distinctia cu IF-uri, manual .
PHP
$this->xxxItemsSelectedMessage = [
'0' => \Yii::t("app", "no documents selected"),
'1' => \Yii::t("app", "one document selected"),
'n' => \Yii::t("app", "{x19} documents selected"),
'm' => \Yii::t("app", "{x20} documents selected"),
];
......
$ret .= "<script>
var xxxItemsSelectedMessage = new Array();
";
foreach ($this->xxxItemsSelectedMessage as $key => $value){
$ret .= "xxxItemsSelectedMessage[\"$key\"] = \"$value\";\n";
}
$ret .="</script>";
JS
var compiledTitle = "";
if(countToUse<=0){
compiledTitle = xxxItemsSelectedMessage['0'];
}else if(countToUse==1){
compiledTitle = xxxItemsSelectedMessage['1'];
}else if(countToUse<20){
compiledTitle = xxxItemsSelectedMessage['n'].replace('{x19}', countToUse);
}else{
compiledTitle = xxxItemsSelectedMessage['m'].replace('{x20}', countToUse);
}
$('#bulkActionsMenuTitle').html(compiledTitle);
Cine are urechi, sa auda!
Culmea programării: ~30 linii de cod pt. a afișa o linie de text.
Soluție alternativă de studiat: https://github.com/lajax/yii2-translate-manager