Как использовать дату Twig для показа недельного дня в китайском тексте?

Я хочу показать формат даты, например: 10月09日, 周三 (что означает 10/9, ср.)
и мои данные – это время UNIX, например [message.time]: 1380813820000

так это то, что я делаю в ветке:
{{ (message.time/1000)|date("m月d日, 周w") }}
Но это показывает мне: 10月09日,周3 , потому что дата «w» – это цифры, а не китайский текст.

так что я могу что-то сделать Twig, чтобы обсудить текстовый формат?

благодаря

Основная проблема заключается в том, что Twig использует метод DateTime::format , который не поддерживает локали или (насколько мне известно) любые другие типы функций для перевода имен в будние дни.

Существует три решения:

  • Используйте strftime , который поддерживает локали (и, следовательно, локализованные имена в будние дни).
  • Если вы можете использовать внутреннее расширение PHP, то вы можете использовать Twig-расширения, которые поставляются с внутренним расширением для Twig.
  • Вы переводите будни самостоятельно.

Кроме того, чтобы использовать ваше предпочтительное решение в Twig-шаблоне, вам необходимо расширить функциональность Twig.

Использование strftime и setlocale

Следующий (довольно большой) код реализует решение strftime :

 <?php // inspired by phpdude: // https://github.com/fabpot/twig/issues/378#issuecomment-4698225 class DateTimeHelper_Twig extends Twig_Extension { public function getFilters() { return array( 'datetime' => new Twig_Filter_Method($this, 'datetime', array('needs_environment' => true)), ); } // This uses `strftime` which makes use of the locale. The format is not // compatible with the one of date() or DateTime::format(). public function datetime(Twig_Environment $env, $date, $format = "%B %e, %Y %H:%M", $timezone = null) { $date = twig_date_converter($env, $date, $timezone); return strftime($format, $date->getTimestamp()); } public function getName() { return 'DateTimeHelper'; } } $loader = new Twig_Loader_String(); $twig = new Twig_Environment($loader); // Call the setlocale before you use the `datetime` in your templates. // This only needs to be done once per request. // If you already have a locale configured in your environment, // you can replace this with setlocale(LC_TIME, ""); - that way the // locale of your environment is used. setlocale(LC_TIME, "zh_CN.UTF-8"); // Add the extension to Twig like that: $twig->addExtension(new DateTimeHelper_Twig()); $message = array('time' => time() * 1000); // use the `datetime` filter with %a which gets replaced by the short weekday name of // the current locale. echo $twig->render('{{ (message.time/1000)|datetime("%m月%d日, 周%a") }}', array('message' => $message)), PHP_EOL; 

Этот код показывает 10月09日, 周三 в моей системе (после установки локального пакета debian locales-all ;-)).

Конечно, в локалях есть список ограничений, о которых вы, вероятно, должны знать:

  • Вы должны использовать правильную локаль (возможно, с UTF-8), и требуемая локаль должна быть установлена ​​на всех системах, которые используют ваш код.
  • Также это решение не полностью независимо от платформы (на windows setlocale работают разные / дают разные результаты). Ознакомьтесь с руководством по PHP для setlocale
  • Легко все испортить.

Использование intl и Twig-extensions

Если вы можете использовать внутренние расширения и «Twig-extensions» -пакет, вы должны использовать localizeddate вместо date :

 // add the extension like that $twig->addExtension(new Twig_Extensions_Extension_Intl()); $message = array('time' => time() * 1000); echo $twig->render('{{ (message.time/1000)|localizeddate("none", "none", "zh", null, "MM月dd日, eee") }}', array('message' => $message)), PHP_EOL; 

Этот код также показывает 10月09日, 周三 – он даже автоматически добавляет 周 -thing.

Конечно, формат даты здесь также отличается – ознакомьтесь с руководством пользователя ICU .

Вы можете попробовать этот код, если функция setlocale не может работать в вашей системе.

 <?php require_once dirname(__FILE__).'/vendor/autoload.php'; $loader = new Twig_Loader_String(); $twig = new Twig_Environment($loader); $twig->addFilter(new Twig_SimpleFilter('format_date', function($value) { $weekdays = array('日','一','二','三','四','五','六'); return sprintf("%s, 周%s", date("m月d日"), $weekdays[date("w")]); })); echo $twig->render('{{ time_at | format_date }}', array( 'time_at' => 1380813820000/1000 )); 

Я нашел replace быстрого фильтра, вот фрагмент кода:

 <div class="date"><span>{{ (create_time/1000)|date("m月d日,周D")|replace({'Mon':'一','Tue':'二','Wed':'三','Thu':'四','Fri':'五','Sat':'六','Sun':'日'}) }}</span></div>