Перевести фразу с более чем одним значением единственного / множественного числа
У меня есть следующая фраза, и я хочу перевести ее.
$lifeTime = 'Expires in '.$days.($days == 1 ? ' day ':' days ' ).$h.(($h == 1 ? ' hour ':' hours ' ));
У меня вопрос: нужно ли разделять фразу, переводить разделенные и объединять их? Есть ли способ __n()
функция принимает несколько "экземпляров" единственного / множественного числа с соответствующими значениями в одной фразе?
Немного смущает. Пример, чтобы прояснить это:
__('I have %s eggs and %s milk boxes', $eggs, $milk)
Это не будет иметь форму единственного и множественного числа. Могу ли я заставить его перевести всю фразу, не разбивая ее на две части? __n()
вызовы функций?
1 ответ
Если вы заранее знаете, какие слова могут встречаться в ваших строках, вы можете сделать следующее:
// the preperation/setup
$translations = Array();
$translations['hours']['search'] = "%hour";
$translations['hours']['inflections'] = Array("hour", "hours");
$translations['milk']['search'] = "%milk";
$translations['milk']['inflections'] = Array("milk bottle", "bottles of milk");
// add what else you might need
function replaceWithPlurals($heystack, $translations) {
foreach ($translations as $key => $vals) {
$heystack = str_replace($vals['search'], $vals['cnt']." ".$vals['inflections'][usePlural($vals['cnt'])], $heystack);
}
return $heystack;
}
function usePlural($cnt) {
if($cnt==1) return 0;
else return 1;
}
// dynamic vars
$heystack = "I drank %milk in %hour";
$hours = 1;
$milk = 2;
$translations['hours']['cnt'] = $hours;
$translations['milk']['cnt'] = $milk;
// the actual usage
echo replaceWithPlurals($heystack, $translations);
В целом, это довольно много подготовительных работ, если вам это понадобится только для 4 конкретных случаев. Но если вы регулярно используете его, я надеюсь, что это поможет.