Артыкулы

Пакрокавае кіраўніцтва па лакалізацыі 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ніта.

прамежкавае

Пераключэнне лакалі для кожнай спасылкі на сайт можа быць не такім, як вы хочаце, і гэта можа выглядаць не так чыста эстэтычна. Вось чаму мы будзем рабіць налады мовы праз спецыяльны пераключальнік моў і выкарыстоўваць карыстальніцкі сеанс для адлюстравання перакладзенага кантэнту. Таму стварыце новае прамежкавае праграмнае забеспячэнне ўнутры 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 па змаўчанні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

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

Апошнія артыкулы

Будучыня тут: як індустрыя суднаходства рэвалюцыянізуе сусветную эканоміку

Ваенна-марскі сектар - гэта сапраўдная глабальная эканамічная сіла, якая перайшла да 150-мільярднага рынку...

1 мая 2024

Выдаўцы і OpenAI падпісваюць пагадненні аб рэгуляванні патоку інфармацыі, апрацаванай штучным інтэлектам

У мінулы панядзелак Financial Times абвясціла аб здзелцы з OpenAI. FT ліцэнзуе сваю журналістыку сусветнага ўзроўню...

Красавік 30 2024

Інтэрнэт-плацяжы: вось як паслугі струменевай перадачы прымушаюць вас плаціць вечна

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

Красавік 29 2024

Veeam прапануе самую поўную падтрымку праграм-вымагальнікаў - ад абароны да адказу і аднаўлення

Coveware ад Veeam працягне прадастаўляць паслугі рэагавання на інцыдэнты кібервымагальніцтва. Coveware будзе прапаноўваць судова-медыцынскую экспертызу і магчымасці выпраўлення…

Красавік 23 2024

Чытайце Innovation на сваёй мове

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

Выконвайце за намі