Подтвердить что ты не робот

Какой лучший способ локализовать дату на 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') }}

Какой лучший способ достичь этого?

4b9b3361

Ответ 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 есть какая-нибудь обертка.