<rmcreative>

RSS

Yii::t и перевод множественных форм слова по CLDR 2

16 января 2011

После мощного брейншторма первоначальной реализации и сбора идей воедино, было решено дополнить перевод множественных форм некоторыми полезными штуками.

Подстановка параметров, число передаётся как {n}

Yii::t('test', '{username} has a cucumber|{username} has {n} cucumbers',
array(5, '{username}' => 'samdark'));

Получим:

samdark has 5 cucumbers

Замена параметра {n}

function convertNumber($number)
{
    // число прописью
    return $number;
}
 
Yii::t('test', '{n} cucumber|{n} cucumbers',
array(5, '{n}' => convertNumber(5)));

Получим:

five cucumbers

Дробные числа

Yii::t('app', 'cucumber|cucumbers', 1.5);

В файле перевода за дроби в Русском отвечает четвёртый параметр:

'cucumber|cucumbers' => 'огурец|огурца|огурцов|огурца',

На выходе:

огурца

Полное описание можно найти на странице «Интернационализация» полного руководства.

Комментарии RSS

  1. №3740
    psih
    psih 16.01.2011, 8:42:10

    Ура, мой репорт даром не прошел :)

    I Love Yii!

  2. №3741
    Ekstazi
    Ekstazi 16.01.2011, 14:57:33

    А как можно сделать тоже самое, но когда сайт не многоязычный ?

  3. №3742
    Tokolist
    Tokolist 16.01.2011, 18:23:53

    Ekstazi Ну решение в лоб это использование того же Yii::t(), но не создавая файлов перевода и установив правильный язык приложения через соотв. свойство. Но наверняка есть какой-то способ элегантней.

    У меня есть тоже фичареквест: Хочется что-бы для числа "0" также можно было задать значение, например, "Нет огурцов". Чтобы не использовать дополнительную проверку. Или уже можно как-то?

  4. №3743
    Sam
    Sam 16.01.2011, 18:24:31

    Ekstazi, так же использовать Yii::t, но выставить sourceLanguage и language одинаковыми. Вот только, если потребуется перевод надо будет по-быстрому перевести все параметры на английский, иначе переводчикам будет худо.

  5. №3744
    Sam
    Sam 16.01.2011, 18:26:34

    Tokolist, для нуля в Русском используется то же значение, что и для many. Изменить это вряд-ли получится т.к. правила не наши, а взяты из CLDR.

  6. №3745
    Tokolist
    Tokolist 16.01.2011, 18:36:19

    Sam Жаль :( Придется вот так вот делать.

    echo $cucumbersCount<1 ? Yii::t('test','No cucumbers') : Yii::t('test', '{n} cucumber|{n} cucumbers', array($cucumbersCount));

  7. №3746
    Tokolist
    Tokolist 16.01.2011, 19:07:17

    выставить sourceLanguage и language одинаковыми

    Достаточно sourceLanguage т.к. language по умолчанию равен sourceLanguage. http://code.google.com/p/yii/source/browse/tags/1.1.5/framework/base/CApplication.php#275

    PS мне почему-то на емейл не приходят оповещения о новых комментариях.

  8. №3747
    Ekstazi
    Ekstazi 16.01.2011, 19:32:09

    Sam, вовсе нет, как вариант язык приложения по умолчанию указать русский, и с него уже переводить на остальные языки.

  9. №3749
    Sam
    Sam 16.01.2011, 20:40:38

    Tokolist, скорее всего в спаме.

    Ekstazi, Русский менее распространён, чем Английский, поэтому переводить с него сможет меньшее количество переводчиков.

  10. №3751
    Tokolist
    Tokolist 16.01.2011, 20:50:22

    Письма не приходят вообще, в т.ч. нету в спаме, ну да ладно это не смертельно :)

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.