Возьмем следующий пример:
{{ $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') }}
Каков наилучший способ достичь этого?
Используя библиотеку Laravel-Date, вам просто нужно установить язык приложения в файле конфигурации приложения Laravel и использовать его функции для форматирования даты по своему желанию.
Задайте язык в /app/config/app.php
'locale' => 'es',
Я нашел эту библиотеку довольно полезной и чистой. Чтобы использовать его, вы можете написать что-то вроде примера в файле readme библиотеки. Я оставляю результаты на испанском языке.
echo Date::now()->format('lj FYH:i:s'); // domingo 28 abril 2013 21:58:16 echo Date::parse('-1 day')->diffForHumans(); // 1 día atrás
Это ссылка на репозиторий:
Чтобы установить эту библиотеку, вы можете следовать инструкциям, указанным в следующей ссылке:
Когда вы получаете дату с модели в Laravel, вы возвращаете объект Carbon: https://github.com/briannesbitt/Carbon
Если вы ссылаетесь на документацию Carbon, она сообщает вам, как вы можете получить отформатированную локали Date:
К сожалению, базовый класс DateTime не поддерживает локализацию. Чтобы начать поддержку локализации, был добавлен метод formatLocalized ($ format). Реализация делает вызов strftime, используя текущую временную метку экземпляра. Если вы сначала установите текущую локаль с помощью 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')
Также рекомендуется устанавливать локаль в глобальном масштабе для каждого запроса (например, в filters.php) при использовании экземпляров даты Carbon.
App::before(function($request) { setlocale(LC_TIME, 'sk_SK.utf8'); });
и затем, как обычно,
$dt->formatLocalized('%b'); // $dt is carbon instance
См. Здесь параметры формата и список локалей.
В дополнение к принятому ответу, я искал способ использовать это в Blade, используя экземпляр Carbon created_at, например. Класс в принятом ответе, похоже, не принимал экземпляр Carbon в качестве даты, а скорее разбирал дату из строки.
Я написал небольшую вспомогательную функцию, чтобы сократить код в шаблонах клинков:
function localeDate($date, $format) { return Jenssegers\Date\Date::createFromFormat('dmY H:i:s', $date->format('dmY H:i:s'))->format($format); }
Внутри Blade теперь вы можете использовать:
{{ localeDate($model->created_at, 'F') }}
Которая вернет полностью записанное имя месяца в локали, установленной в config / app.php
Если есть лучший способ (или я что-то пропустил в коде), пожалуйста, дайте мне знать. В противном случае это может быть полезно для других.
Думаю, вам следует проконсультироваться с man- страницей setlocale . Хотя я не уверен, что у Laravel есть обертка.