Какой лучший способ локализовать дату на Laravel?
Возьмем этот пример:
{{ $article->created_at->format('M') }}
Возвращает Nov
. Мне нужно локализовать это на моем языке, поэтому вывод должен быть Kas
Мы подумали о следующем:
{{ trans("language.{$article->created_at->format('M')}") }}
app/lang/tr/language.php -> 'nov' => 'kas'
Это похоже на переосмысление колеса и программно довольно ужасное. Я уверен, что есть некоторые стандарты локализации. Что-то вроде:
{{ $article->created_at->format('M')->localiseTo('tr_TR') }}
Какой лучший способ достичь этого?
Ответы
Ответ 1
Используя библиотеку как Laravel-Date, вам просто нужно установить язык приложения в конфигурационном файле приложения Laravel и использовать его функции для форматирования даты, как вы хотите.
Установите язык в /app/config/app.php
'locale' => 'es',
Я нашел эту библиотеку довольно полезной и чистой. Чтобы использовать его, вы можете написать что-то вроде примера в файле readme библиотеки. Я оставляю результаты на испанском языке.
echo Date::now()->format('l j F Y H:i:s'); // domingo 28 abril 2013 21:58:16
echo Date::parse('-1 day')->diffForHumans(); // 1 día atrás
Это ссылка на репозиторий:
https://github.com/jenssegers/laravel-date
Чтобы установить эту библиотеку, вы можете выполнить инструкции, указанные в следующей ссылке:
https://github.com/jenssegers/laravel-date#installation
Ответ 2
Когда вы извлекаете дату с модели в Laravel, вы возвращаете объект Carbon:
https://github.com/briannesbitt/Carbon
Если вы ссылаетесь на документацию Carbon, она сообщает вам, как вы можете получить отформатированную локали Date:
К сожалению, базовый класс DateTime не имеет никакой локализации поддержка. Для начала поддержки локализации форматLocalized ($ format) метод был добавлен. Реализация вызывает вызов strftime используя текущую временную метку экземпляра. Если вы сначала установите текущий locale с setlocale(), то возвращаемая строка будет отформатирована в правильный язык.
setlocale(LC_TIME, 'German');
echo $dt->formatLocalized('%A %d %B %Y'); // Donnerstag 25 Dezember 1975
setlocale(LC_TIME, '');
echo $dt->formatLocalized('%A %d %B %Y'); // Thursday 25 December 1975
В принципе, просто используйте formatLocalized('M')
вместо format('M')
Ответ 3
Также рекомендуется установить локаль глобально для каждого запроса (например, в filters.php) при использовании экземпляров даты Carbon.
App::before(function($request) {
setlocale(LC_TIME, 'sk_SK.utf8');
});
а затем продолжайте, как обычно,
$dt->formatLocalized('%b'); // $dt is carbon instance
Смотрите параметры формата здесь и список локалей здесь.
Ответ 4
В дополнение к принятому ответу, я искал способ использовать это в Blade, используя экземпляр Carbon created_at, например. Класс в принятом ответе, похоже, не принимал экземпляр Carbon в качестве даты, а скорее разбирал дату из строки.
Я написал небольшую вспомогательную функцию, чтобы сократить код в шаблонах клинков:
function localeDate($date, $format)
{
return Jenssegers\Date\Date::createFromFormat('d-m-Y H:i:s', $date->format('d-m-Y H:i:s'))->format($format);
}
Внутри Blade теперь вы можете использовать:
{{ localeDate($model->created_at, 'F') }}
Что бы вернуть полностью записанное имя месяца в локали, установленной в config/app.php
Если есть лучший способ (или я что-то пропустил в коде), пожалуйста, дайте мне знать. В противном случае это может быть полезно для других.
Ответ 5
Думаю, вам следует обратиться к setlocale manpage. Хотя я не уверен, что у Laravel есть какая-нибудь обертка.