Локализация
Введение
Функции локализации Laravel предоставляют удобный способ извлечения строк на разных языках, позволяя легко поддерживать несколько языков в вашем приложении.
Laravel предоставляет два способа управления строками перевода. Во-первых, языковые строки могут храниться в файлах в каталоге resources/lang
. В этом каталоге могут быть подкаталоги для каждого языка, поддерживаемого приложением. Это подход, который Laravel использует для управления строками перевода для встроенных функций Laravel, таких как сообщения об ошибках проверки:
/resources /lang /en messages.php /es messages.php
Или строки перевода могут быть определены в файлах JSON, которые помещаются в каталог resources/lang
. При таком подходе каждый язык, поддерживаемый вашим приложением, будет иметь соответствующий файл JSON в этом каталоге. Этот подход рекомендуется для приложений с большим количеством переводимых строк:
/resources /lang en.json es.json
Мы обсудим каждый подход к управлению строками перевода в этой документации.
Настройка локали
Язык по умолчанию для вашего приложения хранится в параметре конфигурации locale
конфигурационного файла config/app.php
. Вы можете изменить это значение в соответствии с потребностями вашего приложения.
Вы можете изменить язык по умолчанию для одного HTTP-запроса во время выполнения, используя метод setLocale
, предоставляемый фасадом App
:
use Illuminate\Support\Facades\App; Route::get('/greeting/{locale}', function ($locale) { if (! in_array($locale, ['en', 'es', 'fr'])) { abort(400); } App::setLocale($locale); //});
Вы можете настроить «запасной язык», который будет использоваться, когда активный язык не содержит заданной строки перевода. Как и язык по умолчанию, резервный язык также настраивается в файле конфигурации config/app.php
:
'fallback_locale' => 'en',
Определение текущего языкового стандарта
Вы можете использовать методы currentLocale
и isLocale
на фасаде App
, чтобы определить текущую локаль или проверить, является ли локаль заданным значением:
use Illuminate\Support\Facades\App; $locale = App::currentLocale(); if (App::isLocale('en')) { //}
Определение строк перевода
Использование быстрых клавиш
Обычно строки перевода хранятся в файлах в каталоге resources/lang
. В этом каталоге должен быть подкаталог для каждого языка, поддерживаемого вашим приложением. Это подход, который Laravel использует для управления строками перевода для встроенных функций Laravel, таких как сообщения об ошибках проверки:
/resources /lang /en messages.php /es messages.php
Все языковые файлы возвращают массив строк с ключами. Например:
<?php // resources/lang/en/messages.php return [ 'welcome' => 'Welcome to our application!',];
{note} Для языков, которые различаются по территории, вы должны назвать языковые каталоги в соответствии с ISO 15897. Например, для британского английского следует использовать "en_GB", а не "en-gb".
Использование строк перевода в качестве ключей
Для приложений с большим количеством переводимых строк определение каждой строки с помощью «короткого ключа» может сбивать с толку при обращении к ключам в ваших представлениях, и постоянно придумывать ключи для каждой строки перевода, поддерживаемой вашим приложением, затруднительно.
По этой причине Laravel также предоставляет поддержку для определения строк перевода с использованием перевода строки «по умолчанию» в качестве ключа. Файлы перевода, которые используют строки перевода в качестве ключей, хранятся в виде файлов JSON в каталоге resources/lang
. Например, если ваше приложение имеет испанский перевод, вы должны создать файл resources/lang/es.json
:
{ "I love programming.": "Me encanta programar."}
Конфликты ключей / файлов
Вы не должны определять ключи строки перевода, которые конфликтуют с другими именами файлов перевода. Например, перевод __('Action')
для локали "NL", когда файл nl/action.php
существует, но файл nl.json
не существует, приведет к тому, что переводчик вернет содержимое nl/action.php
.
Получение строк перевода
Вы можете получить строки перевода из ваших языковых файлов, используя вспомогательную функцию __
. Если вы используете «короткие ключи» для определения ваших строк перевода, вы должны передать файл, содержащий ключ, и сам ключ в функцию __
, используя синтаксис «точка». Например, возьмем строку перевода welcome
из языкового файла resources/lang/en/messages.php
:
echo __('messages.welcome');
Если указанная строка перевода не существует, функция __
вернет ключ строки перевода. Итак, используя приведенный выше пример, функция __
вернет messages.welcome
, если строка перевода не существует.
Если вы используете свои строки перевода по умолчанию в качестве ключей перевода, вы должны передать перевод вашей строки по умолчанию в функцию __
;
echo __('I love programming.');
Опять же, если строка перевода не существует, функция __
вернет ключ строки перевода, который ей был дан.
Если вы используете механизм шаблонов Blade, вы можете использовать синтаксис эха {{ }}
для отображения строки перевода:
{{ __('messages.welcome') }}
Замена параметров в строках перевода
При желании вы можете определить заполнители в строках перевода. Все заполнители имеют префикс :
. Например, вы можете определить приветственное сообщение с именем-заполнителем:
'welcome' => 'Welcome, :name',
Чтобы заменить заполнители при получении строки перевода, вы можете передать массив замен в качестве второго аргумента функции __
:
echo __('messages.welcome', ['name' => 'dayle']);
Если ваш заполнитель содержит все заглавные буквы или имеет заглавную только первую букву, переведенное значение будет соответственно заглавным:
'welcome' => 'Welcome, :NAME', // Welcome, DAYLE'goodbye' => 'Goodbye, :Name', // Goodbye, Dayle
Плюрализация
Плюрализация - сложная проблема, поскольку разные языки имеют множество сложных правил плюрализации; однако Laravel может помочь вам переводить строки по-разному в зависимости от правил множественного числа, которые вы определяете. Используя символ |
, вы можете различать формы единственного и множественного числа строки:
'apples' => 'There is one apple|There are many apples',
Конечно, множественное число также поддерживается при использовании строки перевода в качестве ключей:
{ "There is one apple|There are many apples": "Hay una manzana|Hay muchas manzanas"}
Вы даже можете создать более сложные правила множественного числа, которые определяют строки перевода для нескольких диапазонов значений:
'apples' => '{0} There are none|[1,19] There are some|[20,*] There are many',
После определения строки перевода, которая имеет параметры множественного числа, вы можете использовать функцию trans_choice
для извлечения строки для заданного «счетчика». В этом примере, поскольку счетчик больше единицы, возвращается форма множественного числа строки перевода:
echo trans_choice('messages.apples', 10);
Вы также можете определить атрибуты заполнителя в строках множественного числа. Эти заполнители можно заменить, передав массив в качестве третьего аргумента функции trans_choice
:
'minutes_ago' => '{1} :value minute ago|[2,*] :value minutes ago', echo trans_choice('time.minutes_ago', 5, ['value' => 5]);
Если вы хотите отобразить целочисленное значение, которое было передано функции trans_choice
, вы можете использовать встроенный заполнитель :count
:
'apples' => '{0} There are none|{1} There is one|[2,*] There are :count',
Переопределение языковых файлов пакета
Некоторые пакеты могут поставляться с собственными языковыми файлами. Вместо того, чтобы изменять основные файлы пакета для настройки этих строк, вы можете переопределить их, поместив файлы в каталог resources/lang/vendor/{package}/{locale}
.
Так, например, если вам нужно переопределить строки перевода на английский в messages.php
для пакета с именем skyrim/hearthfire
, вы должны поместить языковой файл по адресу: resources/lang/vendor/hearthfire/en/messages.php
. В этом файле вы должны определить только те строки перевода, которые хотите переопределить. Любые строки перевода, которые вы не отменяете, по-прежнему будут загружаться из исходных языковых файлов пакета.