1 Востаннє редагувалося Sensetivity (12.05.2016 23:40:33)

Тема: ICU форматування чисел.

Завдання доволі травіальне.
Треба грамотно показувати кількість коментарів.
Тобто:
1 коментар,
2 коментарі
5 коментарів
тощо.

Використовую CakePHP3
http://book.cakephp.org/3.0/en/core-lib … -selection

Що є.

<div class="post-info-row"><?= $article->created->i18nFormat('EEEE, d MMMM YYYY о HH:mm') ?> | 21
                    перегляд | <?= __d('site-front', '
                    {0,plural,
                        =0{Коментарів немає} 
                        =1{1 коментар} 
                        =2{2 коментарі} 
                        =3{3 коментарі} 
                        =4{4 коментарі} 
                        other{# коментарів}
                    }', count($article->comments)); ?>
                </div>

Можна якось тому msgfmt_create скормити формули, які описані тут?
http://www.unicode.org/cldr/charts/late … es.html#uk
Або якось описати правила, щоб не писати усе ручками?

2

Re: ICU форматування чисел.

Сам розібрався.

<?= __d('site-front', '
                    {0,plural,
                        zero{Коментарів немає} 
                        one{# коментар} 
                        few{# коментарі} 
                        many{# коментарів} 
                        other{# коментаря} 
                    }', count($article->comments)); ?>
Подякували: 221VOLT1

3

Re: ICU форматування чисел.

а 101 це many чи one?

Подякували: 221VOLT1

4 Востаннє редагувалося 221VOLT (13.05.2016 02:57:16)

Re: ICU форматування чисел.

function number($n, $titles) {
  $cases = array(2, 0, 1, 1, 1, 2);
  return $titles[($n % 100 > 4 && $n % 100 < 20) ? 2 : $cases[min($n % 10, 5)]];
}
echo number(7, array('коментар', 'коментарі', 'коментарів'));
Прихований текст

чим більше всі навколо користуються різними-всілякими "каками" --
тим меньше розучуються думати власною головою, навіть аж до того,
що розучуються і пошуковиками користуватись...

сумно це все...

ТС - я не про вас особисто - я про ситуацію загалом

Подякували: Sensetivity1

5

Re: ICU форматування чисел.

Chemist-i написав:

а 101 це many чи one?

101 коментар. Тобто one.

6 Востаннє редагувалося Sensetivity (13.05.2016 14:57:46)

Re: ICU форматування чисел.

221VOLT написав:
function number($n, $titles) {
  $cases = array(2, 0, 1, 1, 1, 2);
  return $titles[($n % 100 > 4 && $n % 100 < 20) ? 2 : $cases[min($n % 10, 5)]];
}
echo number(7, array('коментар', 'коментарі', 'коментарів'));
Прихований текст

чим більше всі навколо користуються різними-всілякими "каками" --
тим меньше розучуються думати власною головою, навіть аж до того,
що розучуються і пошуковиками користуватись...

сумно це все...

ТС - я не про вас особисто - я про ситуацію загалом

При додаванні нової мови потрібно буде писати свій масив з унікальними правилами.
А оця кака дає універсальність і зберігає єдину точку входу для всіх перекладів. А саме *.po файли. А ще це зручно, коли переклад віддається якісь фірмі, де є тільки перекладачі.

Подякували: funivan1

7

Re: ICU форматування чисел.

При додаванні нової мови потрібно буде писати свій масив з унікальними правилами.
А оця кака дає універсальність і зберігає єдину точку входу для всіх перекладів. А саме *.po файли. А ще це зручно, коли переклад віддається якісь фірмі, де є тільки перекладачі.

Як у вашому випадку обробляти 0 ?

8

Re: ICU форматування чисел.

Sensetivity написав:

При додаванні нової мови потрібно буде писати свій масив з унікальними правилами.
А оця кака дає універсальність і зберігає єдину точку входу для всіх перекладів. А саме *.po файли. А ще це зручно, коли переклад віддається якісь фірмі, де є тільки перекладачі.

:D спочатку люди не хочуть думати самі, свою головою - і віддають цю свою честь - іншим людям
а потім дивуються - а чому все так всюди погано))


не бачу проблеми у тому, щоб витратити декілька хвилин і навчитись новому -
скоріше, це не проблема а нагорода  :)


ой, а ще дуже часто буває, що оця псевдо-зручність має під капотом такий говнокод,
що починає жахливо лагати уже при 2,5-3к+ відвідувачів,
і у темпі вальсу проект все-одно переписують ))

чому ж відразу не написати все так, як воно повинно бути?

9

Re: ICU форматування чисел.

funivan написав:

При додаванні нової мови потрібно буде писати свій масив з унікальними правилами.
А оця кака дає універсальність і зберігає єдину точку входу для всіх перекладів. А саме *.po файли. А ще це зручно, коли переклад віддається якісь фірмі, де є тільки перекладачі.

Як у вашому випадку обробляти 0 ?

{0,plural,
                        zero{Коментарів немає}
                        one{# коментар}
                        few{# коментарі}
                        many{# коментарів}
                        other{# коментаря}
                    }

10

Re: ICU форматування чисел.

221VOLT написав:
Sensetivity написав:

При додаванні нової мови потрібно буде писати свій масив з унікальними правилами.
А оця кака дає універсальність і зберігає єдину точку входу для всіх перекладів. А саме *.po файли. А ще це зручно, коли переклад віддається якісь фірмі, де є тільки перекладачі.

:D спочатку люди не хочуть думати самі, свою головою - і віддають цю свою честь - іншим людям
а потім дивуються - а чому все так всюди погано))


не бачу проблеми у тому, щоб витратити декілька хвилин і навчитись новому -
скоріше, це не проблема а нагорода  :)


ой, а ще дуже часто буває, що оця псевдо-зручність має під капотом такий говнокод,
що починає жахливо лагати уже при 2,5-3к+ відвідувачів,
і у темпі вальсу проект все-одно переписують ))

чому ж відразу не написати все так, як воно повинно бути?

Малоймовірно, бо то функція самого php
http://php.net/manual/en/book.gettext.php

Подякували: 221VOLT1

11

Re: ICU форматування чисел.

Є трюк в один рядок. Може комусь знадобиться.

$n = 25;
$com = ($c = ($c = $n % 100) > 19 ? ($c % 10) : $c) == 1 ? 'коментар' : (($c > 1 && $c <=4) ? 'коментарі' : 'коментарів');
echo $n.' '.$com;
Подякували: 221VOLT, Sensetivity2