Были ли у вас проблемы при работе с:
- форматы даты: 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 t
Twig можно указать параметры с именами?
{{ '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!