Как отображать названия дат (день, месяц) на турецком языке - Php5, Apache2, Intl

Я уже установил Intl на мой сервер.

Я изменил мой default_timezone в Европу / Стамбул и intl.default_locale до tr_TR.

Я все еще получаю названия дат на английском языке.

Что мне не хватает?

Должен ли я изменить некоторые другие настройки?

3 ответа

Решение

Я рекомендую использовать IntlDateFormatter, Это доступно в PHP intl Модуль, и, судя по названию этого вопроса, это расширение доступно.

Пример / грубая реализация:

$locale = 'tr_TR'; // a canonicalized locale
$format = 'MMM e'; // ISO format codes, not the typical date ones
$dt = new DateTime(); // a DateTime object
$df = new IntlDateFormatter(
    $locale, // string locale
    IntlDateFormatter::NONE, // int date type
    IntlDateFormatter::NONE, // int time type
    'UTC', // string timezone
    IntlDateFormatter::GREGORIAN, // int cal type
    $format // string pattern
);
var_dump($dt->format('c')); // string '2014-06-25T08:22:48-07:00' (length=25)
var_dump($df->format($dt)); // string 'Haz 3' (length=5)

Прежде всего, использование любого из классов Intl* выгодно, потому что вам не нужно постоянно сбрасывать языковой стандарт времени выполнения PHP (это может привести к грязному IMO) с setlocale или же Locale::setDefault, Это позволяет вам легко выводить / форматировать с различными локалями очень структурированным способом. Это также подталкивает к использованию новой ООПнесс PHP5 - не более того date ерунда, вы должны использовать DateTime сейчас.

Конструктор IntlDateFormatter имеет довольно длинную подпись, как показано ниже:

  1. $locale - Канонизированный язык, вы можете быть уверены, что получаете правильный, отфильтровывая выбранный язык через Locale::canonicalize,
  2. $dateType - Я установил это "нет" (Int -1) и используйте параметр формата ($pattern) для максимальной гибкости. Принимает также "короткий", "средний", "длинный" и "полный". Вы можете прочитать больше о них в документации проекта ICU.
  3. $timeType - Такой же как $dateType но вместо того, чтобы иметь дело со временем.
  4. $timezone - Это не пример DateTimeZone, но вместо строки часовой пояс. РНР Date классы не совместимы с классами intl (исключение составляют некоторые встроенные адаптеры, такие как IntlDateFormatter::format метод).
  5. $calendar - типично григорианский (null), но может принять экземпляр IntlCalendar также.
  6. $pattern - Используемый формат синтаксического анализа / рендеринга, воспринимайте это как эквивалент date Первый параметр Однако они не одинаковы: ICU (базовая библиотека, используемая этим классом) использует формат ISO, который хорошо документирован в документации Zend Framework. Например, вместо использования 'Y' в течение четырехзначного года, вы бы использовали 'yyyy', Формат ISO намного надежнее, чем формат PHP.

Когда у вас есть экземпляр IntlDateFormatter, также как и DateTime объект, вы можете склеить два вместе, чтобы отобразить строку, содержащую дату / время, которое вы хотите в данной локали с заданным форматом (как определено ранее), используя IntlDateFormatter::format, format Метод принимает один аргумент: экземпляр DateTime -- Кусок пирога!

$instanceOfIntlDateFormatter->format($instanceOfDateTime);

В качестве бонуса format Метод может принимать самые разные объекты (типа mixed), цитата:

Значение для форматирования. Это может быть DateTime объект, IntlCalendar объект, числовой тип, представляющий (возможно, дробное) количество секунд с начала эпохи или массив в формате, выводимом localtime(),

Примечание о параметре часового пояса: DateTime изменено в версии PHP 5.5.0. В качестве обходного пути я использовал следующее (не могу вспомнить детали, разберись сам)...

$timezoneForIntl = $instanceOfDateTime->getTimezone();
if ( version_compare(PHP_VERSION,'5.5.0','<') ) {
    $timezoneForIntl = $timezoneForIntl->getName();
}
      <?php
        setlocale(LC_ALL, 'tr_TR.UTF-8');
        echo strftime("%e %B %Y %A", time());
      ?>

Распечатывается: 30 Ekim 2015 Cuma

Код работает нормально.

public function getTurkishDate(){
    $locale = 'tr_TR'; // a canonicalized locale
    $format = 'dd-MMMM-YYYY'; // ISO format codes, not the typical date ones
    $dt = new DateTime(); // a DateTime object
    $df = new IntlDateFormatter(
        $locale, // string locale
        IntlDateFormatter::NONE, // int date type
        IntlDateFormatter::NONE, // int time type
        'UTC', // string timezone
        IntlDateFormatter::GREGORIAN, // int cal type
        $format // string pattern
    );
    return $df->format($dt); //string 07-Ağustos-2018
} 
Другие вопросы по тегам