Членове

Ръководство стъпка по стъпка за локализация на 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по подразбиранеdefiнита.

Middleware

Превключването на локала за всяка връзка към сайта може да не е това, което искате, и може да не изглежда толкова чисто естетически. Ето защо ще направим езиковата настройка чрез специален превключвател на езика и ще използваме потребителската сесия, за да покажем преведеното съдържание. Затова създайте нов междинен софтуер вътре в 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}. The localeизборът ще се съхранява в рамките на сесията и ще пренасочва потребителите към мястото, откъдето са дошли (проверете Localizationмеждинен софтуер). За да опитате, отидете на localhost/language/ru(докато сесийната бисквитка присъства във вашия браузър) и ще видите преведеното съдържание. Можете да се движите из уебсайта свободно или да опитате да опресните страницата и да видите дали избраният език е запазен.

Комутаторът

Сега трябва да създадем нещо, върху което потребителят да може да щракне, за да промени езика, вместо ръчно да въвежда местни кодове в 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, така че всичко трябва да се случи в нашия изглед за добре дошли, освен ако не е посочено друго.

Параметри в низове за превод

Например, нека кажем здравей на нашия въображаем потребител (Amanda), вместо просто да показваме общо съобщение:

{{ __('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) }}

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

Ами ако имаме нужда от множество форми за множествено число? 

Това също е възможно:

{{ 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 по подразбиране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
  • Франция → 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

Иновационен бюлетин
Не пропускайте най-важните новини за иновациите. Регистрирайте се, за да ги получавате по имейл.

Последни статии

Предимствата на страниците за оцветяване за деца - свят на магия за всички възрасти

Развитието на фини двигателни умения чрез оцветяване подготвя децата за по-сложни умения като писане. Оцветявам…

2 май 2024

Бъдещето е тук: Как корабната индустрия революционизира глобалната икономика

Военноморският сектор е истинска световна икономическа сила, която се е насочила към пазар от 150 милиарда...

1 май 2024

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

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

30 април 2024

Онлайн плащания: Ето как услугите за поточно предаване ви карат да плащате завинаги

Милиони хора плащат за стрийминг услуги, като плащат месечни абонаментни такси. Разпространено е мнението, че вие…

29 април 2024

Прочетете Иновация на вашия език

Иновационен бюлетин
Не пропускайте най-важните новини за иновациите. Регистрирайте се, за да ги получавате по имейл.

Следвайте ни