Как отображать названия дат (день, месяц) на турецком языке - 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 имеет довольно длинную подпись, как показано ниже:
$locale
- Канонизированный язык, вы можете быть уверены, что получаете правильный, отфильтровывая выбранный язык черезLocale::canonicalize
,$dateType
- Я установил это "нет" (Int-1
) и используйте параметр формата ($pattern
) для максимальной гибкости. Принимает также "короткий", "средний", "длинный" и "полный". Вы можете прочитать больше о них в документации проекта ICU.$timeType
- Такой же как$dateType
но вместо того, чтобы иметь дело со временем.$timezone
- Это не примерDateTimeZone
, но вместо строки часовой пояс. РНРDate
классы не совместимы с классами intl (исключение составляют некоторые встроенные адаптеры, такие какIntlDateFormatter::format
метод).$calendar
- типично григорианский (null
), но может принять экземплярIntlCalendar
также.$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
}