Были ли у вас проблемы при работе с:

  • форматы даты: 06.05.2018 против 06.05.2018 против 2018. 06.05.
  • числовые форматы: 2100,99 против 2100,99
  • валюты: 100 долларов против 100 евро
  • часовые пояса: GMT UTC DST CET PST
  • формы множественного числа: 1 час, 2 часа vs صاحِب أَصْحاب صُحْبان (в арабском есть три формы множественного числа: примерно одна, несколько и много)

Это раздражает, тривиально, но утомительно решать с помощью имеющихся основных инструментов PHP: number_format, поиск странного синтаксиса sprintf, преобразование времени из временных меток в DateTime объекты, молитва strtotime будет работать правильно, вспоминая волшебные буквы форматирования даты ...

Если у вас установлено intl ​​extension PHP (основанное на ICU librar y), есть более простой способ. Вероятно, оно у вас уже есть, это рекомендуемое расширение для Craft 3. Оно особенно полезно, если вы работаете с многоязычными сайтами, но оно также удобно только благодаря своим возможностям форматирования строк.

Знаете ли вы, что в фильтре Craft tTwig можно указать параметры с именами?

{{ 'Hello {name}!' | t({ name: 'Zoltan' }) }}
=> Hello Zoltan!

Вы также можете использовать простые массивы вместо хешей с ключами, например:

{{ 'Hello {0}!' | t(['Zoltan']) }}
=> Hello Zoltan!

{0} обозначает первый параметр. Теперь давайте добавим модификаторы форматирования:

{{ 'Total: {amt,number}' | t({amt: 2510.99}) }}
en-US => Total: 2,510.99
hu-HU => Összesen: 2 510,99

Средство форматирования number отформатирует номер в соответствии с локалью текущего сайта. По возможности обязательно используйте конкретный языковой стандарт, используйте en_US для США или en_GB для Великобритании вместо просто en - это предоставит правильные форматы чисел, даты и валюты.

{{ 'We are {n,spellout} in line' | t({n: 138}) }} 
en-US => We are one hundred thirty-eight
hu-HU => Százharmincnyolc vagyunk
{{ 'You are the {n,spellout,%spellout-ordinal} in line' | t({n: 47}) }} 
en-US => You are the forty-seventh in line
hu-HU => Negyvenhetedik vagy a sorban.

В некоторых языках есть женские / мужские формы, и ICU знает о них:

{{ 'Eres {n,ordinal,%digits-ordinal-feminine}' | t({n: 1}) }} 
es-ES => Eres 1.ª

На сегодняшний день ICU построил короткие, средние и длинные формы:

{{ '{d,date,short}' | t({d: date().timestamp}) }} 
en-US => 9/22/18
hu-HU => 2018. 09. 22.
{{ '{d,date,medium}' | t({d: date().timestamp}) }} 
en-US => Sep 22, 2018
hu-HU => 2018. szept. 22.
{{ '{d,date,long}' | t({d: date().timestamp}) }} 
en-US => September 22, 2018
hu-HU => 2018. szeptember 22.

строка перевода должна существовать, чтобы она вступила в силу; даже если это просто '{d,date,short'} => '{d,date,short}' - в противном случае будет использоваться языковой стандарт по умолчанию.

Если вам не нравятся предустановки, вы можете указать свой собственный формат, и вы можете изменить формат для каждого языка, просто переведя строку:

в ваших переводах / hu-HU / site.php

return [
'{d,date,MM/dd/yy hh:mm z}' => '{d,date,yyyy. MM. dd. HH:mm z}',
];

в вашем файле ветки

{{ '{d,date,MM/dd/yy hh:mm z}' | t({d: date().timestamp}) }}
en-US => 09/22/18 06:19 PDT
hu-HU => 2018. 09. 22. 06:19 GMT-7

Вы даже можете получить продолжительность, удобочитаемую человеком, если она поддерживается на вашем языке:

{{ 'Last updated: {0, duration,%with-words} ago' | t([15024]) }} 
en-US => Last updated: 4 hours, 10 minutes, 24 seconds ago
hu-HU => Utoljára frissítve: 15024 (not supported in hungarian)

Эти модификаторы в основном являются предметно-ориентированным языком, вы можете делать сложные вещи, такие как этот надуманный пример:

{{ 'You {likeCount,plural,
    offset: 1
    =0{did not like this}
    =1{liked this}
    one{and one other person liked this}
    other{and # others liked this}
} ' | t ({likeCount: 2}) }} 
=> You and one other person liked this

Конечно, вы также можете использовать функцию Craft::t в своих плагинах:

Craft::t('app', 'Total: {amt,number}', [ 'amt' => 99.99 ])

Чтобы узнать больше о статическом переводе сообщений Yii, обратитесь к документации Yii i18n.

Чтобы узнать, какие модификаторы форматирования доступны для ваших языков, посетите сайт intl.rmcreative.ru.

Если вам понравился этот тизер, приходите посмотреть мой Multilingual Craft talk на конференции DotAll 2018!