Чланци

Корак по корак водич за локализацију Ларавел, водич са примерима

Како локализовати Ларавел пројекат, како развити пројекат у Ларавел-у и учинити га употребљивим на више језика. У овом чланку видимо како да радите са преводилачким датотекама, креирате мењач језика и још много тога са примерима.

Ларавел је апликација дизајнирана да буде локална, да се прилагоди различитим језицима и културама. Локализација прилагођава интернационализоване апликације одређеном језику кроз превод.

preduslovi

  • У овом чланку ћемо се осврнути на Ларавел верзија 8.к;
  • Да бисте успешно пратили овај водич, потребно је да имате неопходно знање о ПХП програмском језику и Ларавел оквиру.
  • Ваш домен је localhost. Ако не, замените localhost са сопственим именом домена или ИП адресом (у зависности од ваше инсталације).

Рад са преводилачким датотекама

У Ларавел-у, баш као иу многим другим оквирима, можемо да складиштимо преводе за различите језике у одвојеним датотекама. Постоје два начина за организовање Ларавел преводних датотека:

  • Старији приступ који складишти датотеке на следећој локацији: resources/lang/{en,fr,ru}/{myfile.php};
  • Нови приступ који складишти датотеке на следећој локацији: resources/lang/{fr.json, ru.json};

За језике који се разликују по територији, требало би да их именујете directory/file језика према ИСО 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>

Почећемо са припремом наше поруке добродошлице за локализацију, која је у Ларавелу заиста лака. Све што треба да урадите је да замените текст „Добро дошли на нашу веб страницу“ следећим кодом: {{ __('Welcome to our website') }}. Ово ће упутити Ларавел да подразумевано прикаже „Добро дошли на нашу веб локацију“.defiните и потражите преводе овог стринга ако је подешен језик који није енглески (до тога ћемо доћи касније). Енглески ће бити постављен као подразумевани језикdefiкрај наше апликације, тако да је подразумевано подешавањеdefiНа крају ћемо једноставно приказати текст „Добро дошли на нашу веб страницу“. Ако је локализација другачија, покушаћемо да пронађемо одговарајући превод и он ће бити креиран за тренутак.

Ларавел локализација

Али како Ларавел зна који је тренутни језик или који су језици доступни у апликацији? То ради гледањем у локалну конфигурацију у апликацији 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 активира се у случају да у нашој апликацији поставимо непостојећи локал.

Док имамо отворену ову датотеку, хајде да додамо нови кључ ради наше погодности наводећи све локације које ће наша апликација подржавати. Ово ћемо касније користити када додајемо локални прекидач. Међутим, ово је опциони задатак јер Ларавел не захтева од нас да то урадимо.

/*
|--------------------------------------------------------------------------
| 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 то је зато што Ларавел већ зна које поруке прослеђујемо унапредdefiзавршио на функцији __() они су за наше локалне преdefiнито ен.

Локална промена у Ларавелу

У овом тренутку, Ларавел не зна како да промени локализацију, па за сада, хајде да урадимо преводе директно унутар путање. Измените путању добродошлице пре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. Требало би да видите локализовани садржај. У случају да наведете неподржани локал или га уопште не наведете, Ларавел ће користити 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);
    }
}

Овај средњи софтвер ће упутити Ларавел-у да користи језик који је изабрао корисник ако је овај избор присутан у сесији.

Пошто то треба да урадимо на сваки захтев, такође морамо да га додамо у пре међуверски стек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(све док је ваш колачић сесије присутан у вашем претраживачу) и видећете преведени садржај. Можете се слободно кретати по веб локацији или покушати да освежите страницу и видите да је изабрани језик сачуван.

Комутатор

Сада морамо да креирамо нешто на шта корисник може да кликне да промени језик уместо да ручно унесе локалне кодове у УРЛ. Да бисмо то урадили, додаћемо врло једноставну проверу језика. Стога, креирајте нову 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 }}.

Иновациони билтен
Не пропустите најважније вести о иновацијама. Пријавите се да их примате путем е-поште.

Напредне опције превођења у ПХП Ларавел

Углавном ћемо радити са resources/views/welcome.blade.php, тако да се све мора десити у нашем приказу добродошлице осим ако није другачије назначено.

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

На пример, хајде да поздравимо нашег имагинарног корисника (Аманду) уместо да само прикажемо генеричку поруку:

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

Имајте на уму да смо користили име са првим словом малим словима, али чувар места са првим словом великим. На овај начин, Ларавел вам може помоћи да аутоматски пишете стварну реч великим словом. Ово ће се десити ако чувар места почиње великим словом, на пример, :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']) }}

Такође можемо да користимо број прослеђен у `транс_цхоице` ако је потребно помоћу чувара места :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"
}

Рад са локализованим датумима у Ларавел

Да бисмо лоцирали датуме, искористићемо моћ Угљеник , који подразумевано долази са Ларавел-ом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, видећемо да су датуми сада локализовани, на пример:

Форматирање бројева и валута помоћу НумберФорматтер-а

У различитим земљама људи користе различите формате за представљање бројева, на пример:

  • Сједињене Америчке Државе → 123.123,12
  • Француска → 123 123,12

Стога, да бисте одразили ове разлике у вашој Ларавел апликацији, можете да користите НумберФорматтер на следећи начин:

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

Поред тога, НумберФорматтер вам омогућава да лако лоцирате валуте, на пример:

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

Дакле за fr видећете евра, док за en_US валута ће бити у америчким доларима.

Ercole Palmeri

Иновациони билтен
Не пропустите најважније вести о иновацијама. Пријавите се да их примате путем е-поште.

Недавни чланци

Предности бојанка за децу - свет магије за све узрасте

Развијање финих моторичких вештина кроз бојење припрема децу за сложеније вештине попут писања. Боји…

КСНУМКС Мај КСНУМКС

Будућност је ту: Како бродарска индустрија револуционише глобалну економију

Поморски сектор је права глобална економска сила, која је кренула ка тржишту од 150 милијарди...

КСНУМКС Мај КСНУМКС

Издавачи и ОпенАИ потписују уговоре за регулисање протока информација које обрађује вештачка интелигенција

Прошлог понедељка, Финанциал Тимес је објавио договор са ОпенАИ. ФТ лиценцира своје новинарство светске класе…

КСНУМКС април КСНУМКС

Онлине плаћања: Ево како вас услуге стримовања чине да плаћате заувек

Милиони људи плаћају услуге стриминга, плаћајући месечне претплате. Увријежено је мишљење да сте…

КСНУМКС април КСНУМКС

Прочитајте Иновације на свом језику

Иновациони билтен
Не пропустите најважније вести о иновацијама. Пријавите се да их примате путем е-поште.

Пратите нас