Перевести фразу с более чем одним значением единственного / множественного числа

У меня есть следующая фраза, и я хочу перевести ее.

$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 конкретных случаев. Но если вы регулярно используете его, я надеюсь, что это поможет.

Другие вопросы по тегам