товары

Пошаговое руководство по локализации Laravel, туториал с примерами

Как локализовать проект Laravel, как разработать проект в Laravel и сделать его пригодным для использования на нескольких языках. В этой статье мы увидим, как работать с файлами перевода, создать переключатель языка и многое другое с примерами.

Laravel — это локальное приложение, адаптированное к различным языкам и культурам. Локализация адаптирует интернационализированные приложения к определенному языку посредством перевода.

Предпосылки

  • В этой статье мы будем ссылаться на Ларавель версии 8.x;
  • Чтобы успешно следовать этому руководству, вам необходимо обладать необходимыми знаниями языка программирования PHP и среды Laravel.
  • Ваш домен localhost. Если нет, замените localhost с вашим собственным доменным именем или IP-адресом (в зависимости от вашей установки).

Работа с файлами перевода

В Laravel, как и во многих других фреймворках, мы можем хранить переводы для разных языков в отдельных файлах. Есть два способа организовать файлы перевода Laravel:

  • Более старый подход, при котором файлы хранятся в следующем месте: resources/lang/{en,fr,ru}/{myfile.php};
  • Новый подход, при котором файлы хранятся в следующем месте: resources/lang/{fr.json, ru.json};

Для языков, различающихся по территории, следует назвать их directory/file языка в соответствии с ISO 15897. Например, для британского английского языка вы должны использовать en_GB вместо en-gb. В этой статье мы сосредоточимся на втором подходе, но то же самое касается и первого (за исключением того, как именуются и извлекаются ключи перевода). 

Простые переводы

Теперь давайте перейдем к resources/views/welcome.blade.phpфайл и заменить содержимое bodyтег с нашим, вот так:

<body class="antialiased">
    <div class="relative flex items-top justify-center min-h-screen bg-gray-100 dark:bg-gray-900 sm:items-center py-4 sm:pt-0">
        <div class="max-w-6xl mx-auto sm:px-6 lg:px-8">
            <div class="flex justify-center pt-8 sm:justify-start sm:pt-0">
                Welcome to our website
            </div>
        </div>
    </div>
</body>

Мы начнем с подготовки нашего приветственного сообщения о локализации, что очень просто в Laravel. Все, что вам нужно сделать, это заменить текст «Добро пожаловать на наш сайт» следующим кодом: {{ __('Welcome to our website') }}. Это даст указание Laravel отображать «Добро пожаловать на наш сайт» по умолчанию.definite и поищите переводы этой строки, если установлен язык, отличный от английского (мы вернемся к этому позже). Английский будет установлен в качестве языка по умолчаниюdefiотделка нашего приложения, поэтому по умолчаниюdefiВ конце мы просто отобразим текст «Добро пожаловать на наш сайт». Если локаль отличается, мы попытаемся найти соответствующий перевод, и он будет создан через мгновение.

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

Но как Laravel узнает, какой язык является текущим или какие языки доступны в приложении? Он делает это, просматривая локальную конфигурацию в приложении. config/app.php. Откройте этот файл и найдите эти два ассоциативных ключа массива:

/*
|--------------------------------------------------------------------------
| Application Locale Configuration
|--------------------------------------------------------------------------
|
| The application locale determines the default locale that will be used
| by the translation service provider. You are free to set this value
| to any of the locales which will be supported by the application.
|
*/
'locale' => 'en',
/*
|--------------------------------------------------------------------------
| Application Fallback Locale
|--------------------------------------------------------------------------
|
| The fallback locale determines the locale to use when the current one
| is not available. You may change the value to correspond to any of
| the language folders that are provided through your application.
|
*/
'fallback_locale' => 'en',

Описания, приведенные над ключами, не требуют пояснений, но вкратце ключ locale содержит местный преdefiзавершение вашего приложения (по крайней мере, если в коде не задана другая локаль). И fallback_locale он активируется в случае, если мы устанавливаем несуществующую локаль в нашем приложении.

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

/*
|--------------------------------------------------------------------------
| Available locales
|--------------------------------------------------------------------------
|
| List all locales that your application works with
|
*/
'available_locales' => [
  'English' => 'en',
  'Italian' => 'it',
  'French' => 'fr',
],

Теперь наше приложение поддерживает три языка: английский, итальянский и французский.

Файлы перевода

Теперь, когда мы установили все локали, с которыми будем работать, мы можем перейти к переводу нашего предварительного приветственного сообщения.defiночь.

Начнем с добавления новых файлов локализации в папку resources/lang. Сначала создайте файл resources/lang/it.json и добавьте соответствующие переводы, как показано ниже:

{
  "Welcome to our website": "Benvenuto nel nostro sito web"
}

Далее создайте файл resources/lang/fr.json:

{

"Добро пожаловать на наш веб-сайт": «Добро пожаловать на наш сайт»

}

Как видите, мы всегда ссылаемся на предварительное сообщениеdefiнито, что мы добавили в файл welcome.blade.php (который был {{ __('Welcome to our website') }}). Причина, по которой нам не нужно создавать файл en.json это потому, что Laravel уже знает, какие сообщения мы передаем с помощью предварительной настройкиdefiзакончил на мероприятии __() они для нашего местного предdefiнито эн.

Локальное изменение в Laravel

На данный момент Laravel не знает, как менять локали, поэтому пока давайте сделаем переводы непосредственно внутри пути. Измените путь приветствия передdefiзакончено, как показано ниже:

Route::get('/{locale?}', function ($locale = null) {
    if (isset($locale) && in_array($locale, config('app.available_locales'))) {
        app()->setLocale($locale);
    }
    
    return view('welcome');
});

Теперь мы можем посетить наш веб-сайт, указав любой из доступных языков в качестве первого сегмента пути: например, localhost/rulocalhost/fr. Вы должны увидеть локализованный контент. Если вы укажете неподдерживаемую локаль или вообще не укажете локаль, Laravel будет использовать enпо умолчаниюdefiнита.

ПО промежуточного слоя

Переключение локали для каждой ссылки на сайт может быть не тем, что вам нужно, и это может выглядеть не так чисто с эстетической точки зрения. Вот почему мы выполним настройку языка с помощью специального переключателя языка и будем использовать сеанс пользователя для отображения переведенного контента. Поэтому создайте новое промежуточное ПО внутри app/Http/Middleware/Localization.phpфайл или запустив artisan make:middleware Localization.

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Session;

class Localization
{
    /**
    * Handle an incoming request.
    *
    * @param  \Illuminate\Http\Request  $request
    * @param  \Closure  $next
    * @return mixed
    */
    public function handle(Request $request, Closure $next)
    {
        if (Session::has('locale')) {
            App::setLocale(Session::get('locale'));
        }
        return $next($request);
    }
}

Это промежуточное программное обеспечение будет указывать Laravel использовать выбранную пользователем локаль, если этот выбор присутствует в сеансе.

Поскольку нам нужно, чтобы это делалось при каждом запросе, нам также нужно добавить его в стек предварительного промежуточного программного обеспечения.defiзакончил в app/http/Kernel.phpдля webгруппа промежуточного программного обеспечения:

* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
  'web' => [
      \App\Http\Middleware\EncryptCookies::class,
      \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
      \Illuminate\Session\Middleware\StartSession::class,
      // \Illuminate\Session\Middleware\AuthenticateSession::class,
      \Illuminate\View\Middleware\ShareErrorsFromSession::class,
      \App\Http\Middleware\VerifyCsrfToken::class,
      \Illuminate\Routing\Middleware\SubstituteBindings::class,
      \App\Http\Middleware\Localization::class, /* <--- add this */
  ],

Изменить курс

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

Route::get('language/{locale}', function ($locale) {
    app()->setLocale($locale);
    session()->put('locale', $locale);

    return redirect()->back();
});

Кроме того, не забудьте удалить переключатель локали, ранее добавленный в наш предварительный путь приветствия.defiночь:

Route::get('/', function () {
    return view('welcome');
});

Как только это будет сделано, единственный способ для пользователя изменить текущий установленный язык — ввести localhost/language/{locale}. Там localeвыбор будет сохранен в сеансе и перенаправит пользователей туда, откуда они пришли (проверьте Localizationпромежуточное ПО). Чтобы попробовать, перейдите на localhost/language/ru(если ваш файл cookie сеанса присутствует в вашем браузере), и вы увидите переведенный контент. Вы можете свободно перемещаться по сайту или попробовать обновить страницу и убедиться, что выбранный язык сохранен.

Коммутатор

Теперь нам нужно создать что-то, что пользователь может щелкнуть, чтобы изменить язык, вместо того, чтобы вручную вводить локальные коды в URL-адрес. Для этого мы добавим очень простую проверку языка. Поэтому создайте новый resources/views/partials/language_switcher.blade.phpфайл со следующим кодом:

<div class="flex justify-center pt-8 sm:justify-start sm:pt-0">
    @foreach($available_locales as $locale_name => $available_locale)
        @if($available_locale === $current_locale)
            <span class="ml-2 mr-2 text-gray-700">{{ $locale_name }}</span>
        @else
            <a class="ml-1 underline ml-2 mr-2" href="language/{{ $available_locale }}">
                <span>{{ $locale_name }}</span>
            </a>
        @endif
    @endforeach
</div>

Включите только что созданный переключатель в поле «Добро пожаловать»:

<body class="antialiased">
    <div class="relative flex items-top justify-center min-h-screen bg-gray-100 dark:bg-gray-900 sm:items-center py-4 sm:pt-0">
        <div class="max-w-6xl mx-auto sm:px-6 lg:px-8">
            @include('partials/language_switcher')
            <div class="flex justify-center pt-8 sm:justify-start sm:pt-0">
                {{ __('Welcome to our website') }}
            </div>
        </div>
    </div>
</body>

Апри иль app/Providers/AppServiceProvider.phpфайл и добавьте код, чтобы поделиться им, когда наш переключатель языка будет составлен. В частности, мы поделимся текущей локалью, к которой можно получить доступ в виде файла. {{ $current_locale }}.

Инновационный бюллетень
Не пропустите самые важные новости об инновациях. Зарегистрируйтесь, чтобы получать их по электронной почте.

Расширенные возможности перевода в PHP Laravel

В основном мы будем работать с resources/views/welcome.blade.php, поэтому все должно происходить в нашем приветственном представлении, если не указано иное.

Параметры в строках перевода

Например, давайте поздороваемся с нашим воображаемым пользователем (Амандой) вместо того, чтобы просто отображать общее сообщение:

{{ __('Welcome to our website, :Name', ['name' => 'caroline']) }}

Обратите внимание, что мы использовали имя с первой буквой в нижнем регистре, а заполнитель с первой буквой в верхнем регистре. Таким образом, Laravel может помочь вам автоматически использовать реальное слово с заглавной буквы. Это произойдет, если заполнитель начинается с заглавной буквы, например, :Nameвыдает «Кэролайн» или слово с заглавной буквы,  :NAME, производит «КАРОЛАЙН».

Мы также обновляем наши файлы перевода resources/lang/fr.jsonresources/lang/it.json , так как на данный момент мы везде увидим только английскую версию, так как ключи перевода не совпадают с переводами.

Французский язык:

{

   "Welcome to our website, :Name": "Bienvenue sur notre site, :Name"

}

итальянский:

{

   "Welcome to our website, :Name": "Benvenuto sul nostro sito web, :Name"

}

Множественность

Чтобы увидеть множественное число в действии, давайте добавим новый абзац текста. 

Для выполнения множественного числа необходимо использовать функцию trans_choice вместо __(), Например:

{{ __('Welcome to our website, :Name', ['name' => 'caroline']) }}
<br>
{{ trans_choice('There is one apple|There are many apples', 2) }}

Как видите, формы множественного числа разделены |.

А что, если нам нужно несколько форм множественного числа? 

Это также возможно:

{{ trans_choice('{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples', 24) }}

В этом случае допустим числа 01И 219, и, наконец, с 20 лет. Конечно, вы можете добавить столько правил, сколько вам нужно.

Так что, если нам нужны заполнители во множественном числе? 

{{ trans_choice('{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples', 24, ['form' => 'is']) }}

Мы также можем использовать счетчик, переданный в `trans_choice`, если это необходимо, используя заполнитель. :count особенный:

{{ trans_choice('{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples', 1, ['form' => 'is']) }}

Наконец, не забудьте обновить файлы перевода с учетом всех изменений, которые вы внесли в базовый перевод.

итальянский:

{
  "Welcome to our website, :Name": "Benvenuto nel nostro sito, :Name",
  "{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples": "{0} Nessuna mela|{1} C'è:count mela|[2,19] Ci sono :count mele"
}

Французский язык:

{    
  "Welcome to our website, :Name": "Bienvenue sur notre site, :Name",
  "{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples": "{0} Il n'y a pas de pommes|{1} Il n'y :form :count pomme|[2,19] Il y :form :count pommes"
}

Работа с локализованными датами в Laravel

Чтобы найти даты, мы будем использовать силу Carbon , который поставляется с Laravel по умолчаниюdefiнита. Проверьте Углеродная документация ; можно сделать много интересного. Например, мы можем установить нашу локаль с правилами даты и времени.

Для нашего простого примера мы покажем текущую дату, локализованную для выбранного языка. В нашем routes/web.php, мы обновляем путь к странице приветствия и передаем локализованное сообщение о дате view добро пожаловать:

<?php
Route::get('/', function () {
    $today = \Carbon\Carbon::now()
        ->settings(
            [
                'locale' => app()->getLocale(),
            ]
        );

    // LL is macro placeholder for MMMM D, YYYY (you could write same as dddd, MMMM D, YYYY)
    $dateMessage = $today->isoFormat('dddd, LL');

    return view('welcome', [
        'date_message' => $dateMessage
    ]);
});

Обновим resources/views/welcome.blade.php добавление отображения даты, например:

{{ __('Welcome to our website, :Name', ['name' => 'amanda']) }}
<br>
{{ trans_choice('{0} There :form :count apples|{1} There :form just :count apple|[2,19] There :form :count apples', 1, ['form' => 'is']) }}
<br>
{{ $date_message }}

Пытаюсь изменить язык на главной странице localhost, мы увидим, что даты теперь локализованы, например:

Форматирование чисел и валют с помощью NumberFormatter

В разных странах люди используют разные форматы для представления чисел, например:

  • США → 123.123,12 XNUMX
  • Франция → 123 123,12

Поэтому, чтобы отразить эти различия в вашем приложении Laravel, вы можете использовать Форматирование числа следующим образом:

<?php
$num = NumberFormatter::create('en_US', NumberFormatter::DECIMAL);

$num2 = NumberFormatter::create('fr', NumberFormatter::DECIMAL);

Вы также можете написать число на определенном языке и отобразить что-то вроде «сто двадцать три тысячи сто двадцать три целых две десятых»:

<?php
$num = NumberFormatter::create('en_US', NumberFormatter::SPELLOUT);
$num2 = NumberFormatter::create('fr', NumberFormatter::SPELLOUT);

Кроме того, NumberFormatter позволяет легко находить валюты, например:

<?php
$currency1 = NumberFormatter::create('fr', NumberFormatter::CURRENCY);
$currency2 = NumberFormatter::create('en_US', NumberFormatter::CURRENCY);

Таким образом, для fr вы увидите евро, а для en_US валюта будет в долларах США.

Ercole Palmeri

Инновационный бюллетень
Не пропустите самые важные новости об инновациях. Зарегистрируйтесь, чтобы получать их по электронной почте.

АРТИКОЛИ recenti

Преимущества раскрасок для детей — мир волшебства для всех возрастов

Развитие мелкой моторики посредством раскрашивания готовит детей к более сложным навыкам, таким как письмо. Раскрасить…

2 мая 2024

Будущее уже здесь: как судоходная отрасль меняет мировую экономику

Военно-морской сектор является настоящей глобальной экономической державой, которая достигла 150-миллиардного рынка...

1 мая 2024

Издатели и OpenAI подписывают соглашения, регулирующие поток информации, обрабатываемой искусственным интеллектом.

В прошлый понедельник Financial Times объявила о сделке с OpenAI. FT лицензирует свою журналистику мирового уровня…

Апрель 30 2024

Онлайн-платежи: вот как потоковые сервисы заставляют вас платить вечно

Миллионы людей платят за стриминговые сервисы, выплачивая ежемесячную абонентскую плату. Распространено мнение, что вы…

Апрель 29 2024

Читайте «Инновации» на вашем языке

Инновационный бюллетень
Не пропустите самые важные новости об инновациях. Зарегистрируйтесь, чтобы получать их по электронной почте.

Следуйте за нами