Статті

Покрокове керівництво з локалізації Laravel, посібник із прикладами

Як локалізувати проект 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:

{

«Ласкаво просимо на наш сайт»: «Ласкаво просимо на наш сайт»

}

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

Локальні зміни в 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за замовчуваннямdefinita.

проміжне

Перемикання мови для кожного посилання на сайт може бути не таким, як ви хочете, і це може виглядати не так естетично. Тому ми будемо виконувати налаштування мови за допомогою спеціального перемикача мов і використовувати сеанс користувача для відображення перекладеного вмісту. Тому створіть нове проміжне програмне забезпечення всередині 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, випускає “CAROLINE”.

Ми також оновлюємо наші файли перекладу 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

Щоб знайти дати, ми використаємо силу Вуглець , який поставляється з Laravel за замовчуваннямdefinita. Перевірте Карбонова документація ; можна робити багато цікавого. Наприклад, ми можемо встановити нашу локаль за допомогою правил дати та часу.

Для нашого простого прикладу ми покажемо поточну дату, локалізовану для вибраної мови. В нашому 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
  • Франція → 123 123,12

Тому, щоб відобразити ці відмінності у вашій програмі Laravel, ви можете використовувати NumberFormatter у такий спосіб:

<?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

Інноваційний бюлетень
Не пропустіть найважливіші новини про інновації. Підпишіться, щоб отримувати їх електронною поштою.

Останні статті

Інноваційне втручання в доповнену реальність із програмою перегляду Apple у поліклініці Катанії

У поліклініці Катанії проведено операцію офтальмопластики за допомогою комерційного переглядача Apple Vision Pro…

3 травня 2024

Переваги розмальовок для дітей - чарівний світ для будь-якого віку

Розвиток дрібної моторики за допомогою розфарбовування готує дітей до більш складних навичок, таких як письмо. Розфарбувати…

2 травня 2024

Майбутнє тут: як індустрія судноплавства революціонізує світову економіку

Військово-морський сектор є справжньою глобальною економічною силою, яка просунулася до 150-мільярдного ринку...

1 травня 2024

Видавці та OpenAI підписують угоди щодо регулювання потоку інформації, яка обробляється штучним інтелектом

Минулого понеділка Financial Times оголосила про угоду з OpenAI. FT ліцензує свою журналістику світового рівня…

Квітень 30 2024

Читайте Innovation своєю мовою

Інноваційний бюлетень
Не пропустіть найважливіші новини про інновації. Підпишіться, щоб отримувати їх електронною поштою.

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