Məqalələr

Laravel lokalizasiyası üçün addım-addım təlimat, nümunələrlə təlimat

Laravel layihəsini necə lokallaşdırmaq, Laraveldə layihəni necə inkişaf etdirmək və onu bir çox dildə istifadə etmək olar. Bu yazıda tərcümə faylları ilə necə işləmək, dil dəyişdiricisi yaratmaq və daha çox nümunələrlə baxırıq.

Laravel yerli olmaq, müxtəlif dillərə və mədəniyyətlərə uyğunlaşmaq üçün hazırlanmış bir proqramdır. Lokallaşdırma beynəlxalq tətbiqləri tərcümə vasitəsilə konkret dilə uyğunlaşdırır.

ilkin

  • Bu yazıda istinad edəcəyik Laravel versiyası 8.x;
  • Bu təlimatı uğurla izləmək üçün PHP proqramlaşdırma dili və Laravel çərçivəsi haqqında lazımi biliyə sahib olmalısınız.
  • Sizin domeninizdir localhost. Əgər yoxsa, dəyişdirin localhost öz domen adınız və ya IP ünvanınızla (quraşdırmağınızdan asılı olaraq).

Tərcümə faylları ilə işləmək

Laravel-də, bir çox digər çərçivələrdə olduğu kimi, biz müxtəlif dillər üçün tərcümələri ayrı-ayrı fayllarda saxlaya bilərik. Laravel tərcümə fayllarını təşkil etməyin iki yolu var:

  • Faylları aşağıdakı yerdə saxlayan köhnə yanaşma: resources/lang/{en,fr,ru}/{myfile.php};
  • Faylları aşağıdakı yerdə saxlayan yeni yanaşma: resources/lang/{fr.json, ru.json};

Ərazisinə görə fərqlənən dillər üçün onları adlandırmalısınız directory/file ISO 15897-yə uyğun dilin. Məsələn, Böyük Britaniya İngilis dili üçün istifadə edərdiniz en_GB əvəzinə en-gb. Bu məqalədə diqqətimizi ikinci yanaşmaya yönəldəcəyik, lakin eyni şey birinciyə də aiddir (tərcümə açarlarının necə adlandırıldığı və götürülməsi istisna olmaqla). 

Sadə tərcümələr

İndi isə gedək resources/views/welcome.blade.phpfaylı və məzmununu dəyişdirin bodybizimkilərlə belə etiketləyin:

<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-də həqiqətən asan olan lokalizasiya salamlama mesajımızı hazırlamaqla başlayacağıq. Bunun üçün sadəcə “Veb saytımıza xoş gəlmisiniz” mətnini aşağıdakı kodla əvəz etmək kifayətdir: {{ __('Welcome to our website') }}. Bu, Laravel-ə defolt olaraq "Veb-saytımıza xoş gəlmisiniz" yazısını göstərməyi tapşıracaqdefinite və ingilis dilindən başqa bir dil təyin olunarsa, bu sətirin tərcümələrini axtarın (bunu sonra öyrənəcəyik). İngilis dili standart dil olaraq təyin olunacaqdefiTətbiqimizə uyğundur, buna görə də standart parametrdirdefiSonda sadəcə olaraq “Veb saytımıza xoş gəlmisiniz” mətnini göstərəcəyik. Lokal fərqlidirsə, uyğun tərcüməni tapmağa çalışacağıq və o, bir anda yaradılacaq.

Laravel lokalizasiyası

Bəs Laravel hansı dilin cari olduğunu və ya tətbiqdə hansı dillərin mövcud olduğunu necə bilir? Bunu tətbiqdə yerli konfiqurasiyaya baxaraq edir config/app.php. Bu faylı açın və bu iki assosiativ massiv açarını axtarın:

/*
|--------------------------------------------------------------------------
| 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',

Açarların yuxarısında göstərilən təsvirlər öz-özünə izahlı olmalıdır, lakin bir sözlə, açardır locale yerli pre ehtiva edirdefiTətbiqinizin nish (ən azı, əgər kodda başqa dil təyin olunmayıbsa). Və fallback_locale tətbiqimizdə mövcud olmayan bir yerli təyin etdiyimiz halda aktivləşdirilir.

Bu fayl açıq olduğu halda, rahatlığımız üçün tətbiqimizin dəstəkləyəcəyi bütün dilləri sadalayan yeni açar əlavə edək. Bundan sonra yerli dəyişdirici əlavə edərkən istifadə edəcəyik. Bununla belə, bu, isteğe bağlı bir işdir, çünki Laravel bunu etməyimizi tələb etmir.

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

İndi proqramımız üç dili dəstəkləyir: İngilis, İtalyan və Fransız.

Tərcümə faylları

İndi işləyəcəyimiz bütün dilləri təyin etdik, biz davam edə və ilk salamlama mesajımızı tərcümə etməyə davam edə bilərik.defigecə.

Qovluğa yeni lokalizasiya faylları əlavə etməklə başlayaq resources/lang. Əvvəlcə bir fayl yaradın resources/lang/it.json və müvafiq tərcümələri aşağıdakı kimi əlavə edin:

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

Sonra, bir fayl yaradın resources/lang/fr.json:

{

"Veb saytımıza xoş gəlmisiniz": “Saytımıza xoş gəlmisiniz”

}

Gördüyünüz kimi, biz həmişə ön mesaja müraciət edirikdefifayla əlavə etdiyimiz nito welcome.blade.php (bu idi {{ __('Welcome to our website') }}). Fayl yaratmamağımızın səbəbi en.json çünki Laravel əvvəlcədən təyin etməklə hansı mesajları ötürəcəyimizi artıq bilirdefifunksiyasını tamamladı __() onlar yerli önümüz üçündirdefinito en.

Laraveldə yerli dəyişiklik

Bu nöqtədə, Laravel yerliləri necə dəyişdirəcəyini bilmir, ona görə də hələlik tərcümələri birbaşa yolun daxilində edək. Qarşılama yolunu əvvəlcədən dəyişdirindefiaşağıda göstərildiyi kimi kəsildi:

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

İndi mövcud dillərdən hər hansı birini birinci yol seqmenti kimi göstərərək veb saytımıza daxil ola bilərik: məsələn, localhost/rulocalhost/fr. Lokallaşdırılmış məzmunu görməlisiniz. Dəstəklənməyən lokali qeyd etsəniz və ya ümumiyyətlə yerli təyin etməsəniz, Laravel istifadə edəcək endefault olaraqdefinita.

Orta proqram

Hər bir sayt bağlantısı üçün yerli dilin dəyişdirilməsi istədiyiniz kimi olmaya bilər və estetik cəhətdən təmiz görünməyə bilər. Buna görə də biz dil parametrlərini xüsusi dil dəyişdiricisi vasitəsilə edəcəyik və tərcümə edilmiş məzmunu göstərmək üçün istifadəçi seansından istifadə edəcəyik. Buna görə də, daxilində yeni bir ara proqram yaradın app/Http/Middleware/Localization.phpfaylı və ya işlətməklə 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);
    }
}

Bu ara proqram Laravel-ə seansda bu seçim mövcud olarsa, istifadəçinin seçilmiş dilini istifadə etməyi tapşıracaq.

Hər sorğuda bunu etməli olduğumuz üçün, biz də onu əvvəlcədən orta proqram yığınına əlavə etməliyikdefi-də bitirdi app/http/Kernel.phpuğrunda weborta proqram qrupu:

* 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 */
  ],

Kursu dəyişdirin

Sonra, yerli dili dəyişdirmək üçün bir yol əlavə etməliyik. Biz bağlanma yolundan istifadə edirik, lakin istəsəniz, nəzarət cihazınızda eyni kodu istifadə edə bilərsiniz:

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

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

Həmçinin, öncədən qarşılama yolumuza əlavə edilmiş yerli seçim keçidini silməyi unutmayındefigecə:

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

Bu edildikdən sonra istifadəçinin hazırda təyin edilmiş dili dəyişməsinin yeganə yolu daxil olmaqdır localhost/language/{locale}. The localeseçim sessiya ərzində saxlanacaq və istifadəçiləri gəldikləri yerə yönləndirəcək ( Localizationara proqram). Bunu sınamaq üçün keçin localhost/language/ru(sessiya kukisi brauzerinizdə mövcud olduğu müddətcə) və tərcümə edilmiş məzmunu görəcəksiniz. Siz vebsaytda sərbəst hərəkət edə və ya səhifəni yeniləməyə cəhd edə və seçilmiş dilin qorunub saxlandığını görə bilərsiniz.

Kommutator

İndi biz istifadəçinin URL-yə yerli kodları əl ilə daxil etmək əvəzinə dili dəyişdirmək üçün klikləyə biləcəyi bir şey yaratmalıyıq. Bunun üçün çox sadə dil yoxlayıcısı əlavə edəcəyik. Buna görə də yenisini yaradın resources/views/partials/language_switcher.blade.phpaşağıdakı kodla fayl:

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

Yeni yaradılmış dəyişdiricini "xoş gəldin" görünüşünə daxil edin:

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

açın app/Providers/AppServiceProvider.phpfaylı açın və dil dəyişdiricimiz nə vaxt yaradılacaq paylaşmaq üçün kodu əlavə edin. Konkret olaraq, fayl kimi əldə edilə bilən cari dili paylaşacağıq {{ $current_locale }}.

İnnovasiya bülleteni
Yeniliklərlə bağlı ən vacib xəbərləri qaçırmayın. Onları e-poçtla almaq üçün qeydiyyatdan keçin.

PHP Laravel-də təkmil tərcümə variantları

Biz əsasən işləyəcəyik resources/views/welcome.blade.php, buna görə də başqa cür göstərilmədiyi təqdirdə hər şey xoş baxışımızda baş verməlidir.

Tərcümə sətirlərindəki parametrlər

Məsələn, ümumi bir mesaj göstərmək əvəzinə xəyali istifadəçimizə (Amanda) salam deyək:

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

Qeyd edək ki, biz adı kiçik hərflə, lakin ilk hərfi böyük hərflə olan yer tutucudan istifadə etdik. Bu yolla, Laravel sizə avtomatik olaraq həqiqi sözü böyük hərflə yazmağa kömək edə bilər. Bu, yertutan böyük hərflə başladıqda baş verəcək, məsələn, :Name"Caroline" və ya tam böyük hərflə yazılmış söz yaradır,  :NAME, “CAROLINE” istehsal edir.

Biz həmçinin tərcümə fayllarımızı yeniləyirik resources/lang/fr.jsonresources/lang/it.json , tərcümə düymələri tərcümələrə uyğun gəlmədiyi üçün hazırda biz yalnız ingiliscə versiyasını hər yerdə görəcəyik.

Fransız dili:

{

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

}

İtalyan:

{

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

}

Çoxalma

Plürallaşdırmanın fəaliyyətdə olduğunu görmək üçün mətnə ​​yeni abzas əlavə edək. 

Plüralizasiyanı həyata keçirmək üçün funksiyadan istifadə etməlisiniz trans_choice əvəzinə __(), misal üçün:

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

Göründüyü kimi, cəm formaları a ilə ayrılır |.

İndi bir neçə cəm formasına ehtiyacımız olsa nə olar? 

Bu da mümkündür:

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

Bu halda biz nömrələrə icazə veririk 01və 219, və nəhayət, 20-dən sonra. Əlbəttə ki, istədiyiniz qədər qayda əlavə edə bilərsiniz.

Bəs biz cəm formalarımızda yer tutucuları istəsək nə olar? 

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

Lazım gələrsə, yertutandan istifadə edərək "trans_seçim"də keçən saydan da istifadə edə bilərik :count xüsusi:

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

Nəhayət, əsas tərcümədə etdiyiniz dəyişikliklərlə tərcümə fayllarınızı yeniləməyi unutmayın.

İtalyan:

{
  "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"
}

Fransız dili:

{    
  "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"
}

Laraveldə lokallaşdırılmış tarixlərlə işləmək

Tarixləri tapmaq üçün gücündən istifadə edəcəyik Karbon , standart olaraq Laravel ilə gəlirdefinita. yoxlayın Karbon sənədləri ; çox maraqlı şeylər edə bilərsiniz. Məsələn, biz yerlimizi tarix və vaxt qaydaları ilə təyin edə bilərik.

Sadə nümunəmiz üçün seçilmiş dil üçün lokallaşdırılmış cari tarixi göstərəcəyik. Bizim routes/web.php, biz salamlama səhifəsinin yolunu yeniləyirik və lokallaşdırılmış tarix mesajını özümüzə ötürürük view xoş gəlmisiniz:

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

Gəlin yeniləyək resources/views/welcome.blade.php tarix ekranının əlavə edilməsi, məsələn:

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

Əsas səhifəsində dili dəyişməyə çalışırıq localhost, tarixlərin indi lokallaşdırıldığını görəcəyik, məsələn:

NumberFormatter ilə nömrələrin və valyutaların formatlanması

Müxtəlif ölkələrdə insanlar rəqəmləri təmsil etmək üçün müxtəlif formatlardan istifadə edirlər, məsələn:

  • Amerika Birləşmiş Ştatları → 123.123,12
  • Fransa → 123 123,12

Buna görə də, bu fərqləri Laravel tətbiqinizdə əks etdirmək üçün istifadə edə bilərsiniz NumberFormatter aşağıdakı şəkildə:

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

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

Siz həmçinin nömrəni müəyyən bir dildə yaza və “yüz iyirmi üç min yüz iyirmi üç nöqtə bir iki” kimi bir şey göstərə bilərsiniz:

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

Bundan əlavə, NumberFormatter sizə valyutaların yerini asanlıqla tapmağa imkan verir, məsələn:

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

Belə ki, üçün fr üçün isə Avro görəcəksiniz en_US valyuta ABŞ dollarında olacaq.

Ercole Palmeri

İnnovasiya bülleteni
Yeniliklərlə bağlı ən vacib xəbərləri qaçırmayın. Onları e-poçtla almaq üçün qeydiyyatdan keçin.

Articoli recenti

Catania Poliklinikasında Apple tamaşaçısı ilə Artırılmış Reallığa innovativ müdaxilə

Kataniya poliklinikasında Apple Vision Pro kommersiya görüntüləyicisi ilə oftalmoplastika əməliyyatı həyata keçirilib...

3 May 2024

Uşaqlar üçün Boyama Səhifələrinin Faydaları - bütün yaşlar üçün sehrli bir dünya

Rəngləmə yolu ilə incə motor bacarıqlarının inkişafı uşaqları yazı kimi daha mürəkkəb bacarıqlara hazırlayır. Rəngləmək üçün…

2 May 2024

Gələcək buradadır: Gəmiçilik Sənayesi Qlobal İqtisadiyyatda Necə inqilab edir

Dəniz sektoru 150 milyardlıq bazara doğru irəliləyən əsl qlobal iqtisadi gücdür...

1 May 2024

Nəşriyyatçılar və OpenAI süni intellekt tərəfindən işlənmiş məlumat axınını tənzimləmək üçün müqavilələr imzalayırlar.

Keçən bazar ertəsi Financial Times OpenAI ilə müqavilə elan etdi. FT dünya səviyyəli jurnalistikasına lisenziya verir...

30 Aprel 2024