> For the complete documentation index, see [llms.txt](https://delphinpro.gitbook.io/laravel-ru/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://delphinpro.gitbook.io/laravel-ru/frontend/localization.md).

# Локализация

## Вступление

Функции локализации Laravel обеспечивают удобный способ получения строк на различных языках, позволяя легко поддерживать несколько языков в приложении. Языковые строки хранятся в файлах в каталоге `resources/lang`. Внутри этого каталога должен быть подкаталог для каждого языка, поддерживаемого приложением:

```
/resources
    /lang
        /en
            messages.php
        /es
            messages.php
```

Все языковые файлы возвращают массив ключевых строк. Например:

```php
<?php

return [
    'welcome' => 'Welcome to our application',
];
```

{% hint style="warning" %}
Для языков, различающихся по территории, следует называть языковые каталоги в соответствии с ISO 15897. Например, для британского английского языка следует использовать "en\_GB", а не "en-gb".
{% endhint %}

### Настройка локали

Язык по умолчанию для приложения хранится в конфигурационном файле `config/app.php`. Вы можете изменить это значение в соответствии со своими потребностями. Вы также можете изменить активный язык во время выполнения, используя метод `setLocale` фасада `App`:

```php
Route::get('welcome/{locale}', function ($locale) {
    if (! in_array($locale, ['en', 'es', 'fr'])) {
        abort(400);
    }

    App::setLocale($locale);

    //
});
```

Вы можете настроить "запасной язык (fallback language)", который будет использоваться, когда активный язык не содержит заданной строки перевода. Как и язык по умолчанию, запасной язык также настроен в конфигурационном файле `config/app.php`:

```php
'fallback_locale' => 'en',
```

**Определение текущей локали**

Вы можете использовать методы `getLocale` и `isLocale` фасада `App`, чтобы определить текущую локаль или проверить, является ли локаль заданным значением:

```php
$locale = App::getLocale();

if (App::isLocale('en')) {
    //
}
```

## Определение строк перевода

### Использование коротких ключей

Обычно строки перевода хранятся в файлах в каталоге `resources/lang`. Внутри этого каталога должен быть подкаталог для каждого языка, поддерживаемого приложением:

```
/resources
    /lang
        /en
            messages.php
        /es
            messages.php
```

Все языковые файлы возвращают массив ключевых строк. Например:

```php
<?php

// resources/lang/en/messages.php

return [
    'welcome' => 'Welcome to our application',
];
```

### Использование перевода строк в качестве ключей

В приложениях с большим количеством переводимых строк можно быстро запутаться при обращении к ним по коротким ключам. По этой причине Laravel также предоставляет поддержку для определения строк перевода, используя "по умолчанию" перевод строки в качестве ключа.

Файлы перевода, в которых в качестве ключей используются строки перевода, хранятся в виде JSON-файлов в каталоге `resources/lang`. Например, если ваше приложение имеет испанский перевод, вы должны создать файл `resources/lang/es.json`:

```javascript
{
    "I love programming.": "Me encanta programar."
}
```

## Получение перевода строк

Вы можете получить строки из языковых файлов с помощью функции-помощника `__`. Метод `__` принимает в качестве первого аргумента файл и ключ строки перевода. Например, давайте получим перевод строки `welcome` из языкового файла `resources/lang/messages.php`:

```php
echo __('messages.welcome');

echo __('I love programming.');
```

Если вы используете [шаблонизатор Blade](/laravel-ru/frontend/blade.md), то можете использовать синтаксис `{{ }}` для вывода перевода строки или использовать директиву `@lang`:

```markup
{{ __('messages.welcome') }}

@lang('messages.welcome')
```

Если указанной строки перевода не существует, функция `__` вернет ключ строки перевода. Таким образом, используя приведенный выше пример, функция `__` вернет `messages.welcome`, если строка перевода не существует.

{% hint style="warning" %}
Директива @lang не экранирует вывод. При использовании этой директивы вы несете **полную ответственность** за экранирование собственных выходных данных.
{% endhint %}

### Замена параметров в строках перевода

При желании, вы можете определить плейсхолдеры в строках перевода. Все плейсхолдеры имеют префикс `:`. Например, Вы можете определить приветственное сообщение с плейсхолдером `name`:

```php
'welcome' => 'Welcome, :name',
```

Для замены плейсхолдеров при получении строки перевода передайте массив замен в качестве второго аргумента в функцию `__`:

```php
echo __('messages.welcome', ['name' => 'dayle']);
```

Если плейсхолдер содержит все заглавные буквы или только первую букву, переведенное значение будет выведено заглавными буквами соответственно:

```php
'welcome' => 'Welcome, :NAME', // Welcome, DAYLE
'goodbye' => 'Goodbye, :Name', // Goodbye, Dayle
```

### Плюрализация

Плюрализация — это сложная проблема, так как разные языки имеют множество сложных правил для множественного числа. Используя символ "|", можно различать единственную и множественную формы строк:

```php
'apples' => 'There is one apple|There are many apples',
```

Можно создавать более сложные правила множественного числа, которые задают строки перевода для множества числовых диапазонов:

```php
'apples' => '{0} There are none|[1,19] There are some|[20,*] There are many',
```

После определения строки перевода, которая имеет опции множественного числа, вы можете использовать функцию `trans_choice` для получения строки для заданного "числового значения". В этом примере, так как счетчик больше единицы, возвращается строка перевода во множественном числе:

```php
echo trans_choice('messages.apples', 10);
```

Вы также можете определить плейсхолдеры в строках множественного числа. Эти плейсхолдеры могут быть заменены передачей массива в качестве третьего аргумента в функцию `trans_choice`:

```php
'minutes_ago' => '{1} :value minute ago|[2,*] :value minutes ago',

echo trans_choice('time.minutes_ago', 5, ['value' => 5]);
```

Если Вы хотите отобразить целое значение, которое было передано в функцию `trans_choice`, то Вы можете использовать плейсхолдер `:count`:

```php
'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`. В этом файле вы должны определить только те строки перевода, которые вы хотите переопределить. Любые строки перевода, которые вы не переопределите, будут загружены из оригинальных языковых файлов пакета.
