Artikel

Lokalisasi Laravel pituduh léngkah-léngkah, tutorial sareng conto

Kumaha cara ngalokalkeun proyék Laravel, kumaha carana ngamekarkeun proyék di Laravel sareng tiasa dianggo dina sababaraha basa. Dina artikel ieu kami ningali kumaha cara damel sareng file tarjamahan, ngadamel pamilih basa sareng seueur deui sareng conto.

Laravel mangrupikeun aplikasi anu dirarancang janten lokal, pikeun adaptasi kana sababaraha basa sareng budaya. Lokalisasi nyaluyukeun aplikasi internasionalisasi kana basa khusus ngaliwatan tarjamahan.

Prerequisites

  • Dina artikel ieu kami bakal ngarujuk kana Vérsi Laravel 8.x;
  • Pikeun suksés nuturkeun tutorial ieu, anjeun kedah gaduh pangaweruh anu diperyogikeun ngeunaan basa pamrograman PHP sareng kerangka Laravel.
  • domain anjeun localhost. Lamun henteu, ngaganti localhost nganggo nami domain atanapi alamat IP anjeun nyalira (gumantung kana pamasangan anjeun).

Gawe sareng file tarjamahan

Dina Laravel, sapertos dina seueur kerangka sanés, urang tiasa nyimpen tarjamahan pikeun basa anu béda dina file anu kapisah. Aya dua cara pikeun ngatur file tarjamahan Laravel:

  • Pendekatan anu langkung lami anu nyimpen file di lokasi ieu: resources/lang/{en,fr,ru}/{myfile.php};
  • Pendekatan anyar anu nyimpen file di lokasi ieu: resources/lang/{fr.json, ru.json};

Pikeun basa anu béda-béda dumasar daérah, anjeun kedah namina directory/file tina basa numutkeun ISO 15897. Contona, pikeun Inggris Inggris Anjeun bakal make en_GB sabalikna en-gb. Dina artikel ieu, urang bakal difokuskeun pendekatan kadua, tapi sarua lumaku pikeun kahiji (iwal kumaha konci tarjamahan ngaranna tur dipulut). 

tarjamahan basajan

Ayeuna, hayu urang angkat ka resources/views/welcome.blade.phpfile jeung ngaganti eusi nu bodytag sareng urang, sapertos kieu:

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

Urang mimitian ku nyiapkeun pesen wilujeng sumping lokalisasi kami, anu gampang pisan dina Laravel. Sadaya anu anjeun kedah laksanakeun nyaéta ngagentos téks "Wilujeng sumping di halaman wéb kami" kalayan kode ieu: {{ __('Welcome to our website') }}. Ieu bakal ngalatih Laravel pikeun nampilkeun "Wilujeng sumping di halaman wéb kami" sacara standardefiwengi sareng milarian tarjamahan tina string ieu upami aya basa sanés ti Inggris disetél (urang bakal terang éta engké). Inggris bakal disetel salaku basa standardefinish tina aplikasi urang, jadi ku setelan standardefiDina tungtungna urang ngan saukur bakal nembongkeun téks "Wilujeng sumping di ramatloka kami". Upami lokalna béda, urang bakal nyobian milarian tarjamahan anu cocog sareng éta bakal didamel sakedap.

Lokalisasi Laravel

Tapi kumaha Laravel terang mana basa ayeuna atanapi basa mana anu sayogi dina aplikasi? Éta ngalakukeun ieu ku ningali konfigurasi lokal dina aplikasi config/app.php. Buka file ieu sareng milarian dua konci array asosiatif ieu:

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

The déskripsi ditémbongkeun di luhur konci kudu timer explanatory, tapi pondokna, konci locale ngandung pre lokaldefinish tina aplikasi Anjeun (sahenteuna, lamun euweuh Lokalisasi sejenna geus diatur dina kode). Jeung fallback_locale eta diaktipkeun bisi urang nyetel lokal non-existent dina aplikasi urang.

Sanaos file ieu dibuka, hayu urang tambahkeun konci énggal pikeun genah urang daptar sadaya tempat anu bakal dirojong ku aplikasi urang. Urang bakal ngagunakeun ieu engké nalika nambahkeun switcher lokal. Nanging, ieu mangrupikeun tugas opsional sabab Laravel henteu ngabutuhkeun urang pikeun ngalakukeunana.

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

Ayeuna aplikasi kami ngadukung tilu basa: Inggris, Italia sareng Perancis.

File tarjamahan

Ayeuna urang parantos netepkeun sadaya daérah anu bakal urang garap, urang tiasa teraskeun sareng teraskeun narjamahkeun pesen sateuacana wilujeng sumping.defipeuting.

Hayu urang mimitian ku nambahkeun file lokalisasi anyar kana polder resources/lang. Mimiti, jieun file resources/lang/it.json sareng tambahkeun tarjamahan anu saluyu, sapertos kieu:

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

Salajengna, jieun file resources/lang/fr.json:

{

"Wilujeng sumping di situs wéb kami": "Wilujeng sumping di situs kami"

}

Sakumaha anjeun tiasa tingali, urang sok ngarujuk kana pesen sateuacannadefiieu anu kami tambahkeun dina file welcome.blade.php (anu éta {{ __('Welcome to our website') }}). Alesan naha urang teu kudu nyieun file en.json Éta sabab Laravel parantos terang pesen mana anu kami lebet ku pra-setelandefiréngsé dina fungsi __() aranjeunna keur pre lokal urangdefiieu en.

Parobahan lokal di Laravel

Dina titik ieu, Laravel teu terang kumaha carana ngarobah lokal, jadi pikeun ayeuna, hayu urang ngalakukeun tarjamahan langsung di jero jalur. Ngaropea jalur wilujeng sumping predefiditingalikeun saperti ieu di handap:

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

Urang ayeuna tiasa nganjang ka halaman wéb urang, netepkeun salah sahiji basa anu sayogi salaku bagéan jalur munggaran: contona, localhost/rulocalhost/fr. Anjeun kudu ningali eusi localized. Upami anjeun netepkeun lokal anu henteu didukung atanapi henteu netepkeun lokalitas pisan, Laravel bakal ngagunakeun ensacara standardefinita.

middleware

Ngalihkeun lokal pikeun tiap link situs bisa jadi teu naon rék, sarta eta bisa jadi teu kasampak sakumaha bersih aesthetically. Éta pisan sababna naha urang bakal ngalakukeun setelan basa ngaliwatan switcher basa husus tur make sesi pamaké pikeun mintonkeun eusi tarjamah. Ku alatan éta, nyieun middleware anyar di jero app/Http/Middleware/Localization.phpfile atawa ku ngajalankeun 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);
    }
}

middleware ieu bakal maréntahkeun Laravel ngagunakeun lokal dipilih pamaké lamun pilihan ieu hadir dina rintakan.

Kusabab urang peryogi ieu dilakukeun dina unggal pamundut, urang ogé kedah nambihan kana tumpukan pre middlewaredefiréngsé di app/http/Kernel.phpper il webgrup middleware:

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

Ganti kursus

Salajengna, urang kedah nambihan jalur pikeun ngarobih lokal. Kami nganggo jalur panutupanana, tapi anjeun tiasa nganggo kode anu sami di jero controller anjeun upami anjeun resep:

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

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

Oge, tong hilap miceun togél lokal anu saacanna ditambahkeun dina jalur pre welcome kamidefipeuting:

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

Sakali ieu rengse, hiji-hijina jalan pikeun pamaké pikeun ngarobah basa ayeuna diatur ku cara nuliskeun localhost/language/{locale}. The localePilihan bakal disimpen dina sési sareng bakal alihan pangguna ka tempat asalna (parios file Localizationmiddleware). Pikeun nyobaan, buka localhost/language/ru(salami cookie sési anjeun aya dina panyungsi anjeun) sareng anjeun bakal ningali eusi anu ditarjamahkeun. Anjeun tiasa ngalih ka halaman wéb sacara bébas atanapi nyobian nga-refresh halaman sareng ningali yén basa anu dipilih dilestarikan.

Komutator

Ayeuna urang kedah nyiptakeun hal anu tiasa diklik ku pangguna pikeun ngarobih basa sanés sacara manual ngalebetkeun kode lokal kana URL. Jang ngalampahkeun ieu, kami bakal nambihan pamariksaan basa anu saderhana pisan. Ku alatan éta, nyieun anyar resources/views/partials/language_switcher.blade.phpfile kalawan kode handap:

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

Asupkeun switcher nu anyar dijieun dina pintonan "wilujeng sumping":

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

Buka na app/Providers/AppServiceProvider.phpfile sareng tambahkeun kodeu pikeun dibagikeun nalika pamilih basa urang bakal diwangun. Husus, urang bakal ngabagikeun lokal ayeuna anu tiasa diaksés salaku file {{ $current_locale }}.

newsletter inovasi
Entong luput warta anu paling penting ngeunaan inovasi. Ngadaptar pikeun nampa aranjeunna ku email.

Pilihan tarjamahan canggih dina PHP Laravel

Urang utamana bakal dianggo kalayan resources/views/welcome.blade.php, ku kituna sagalana kudu lumangsung dina pintonan wilujeng sumping kami iwal disebutkeun béda.

Parameter dina string tarjamah

Contona, hayu urang ngucapkeun salam ka pamaké imajinér urang (Amanda) tinimbang ngan mintonkeun pesen generik:

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

Catet yén kami nganggo nami nganggo hurup kahiji dina hurup leutik, tapi pananda tempat nganggo hurup kahiji dina hurup ageung. Ku cara ieu, Laravel tiasa ngabantosan anjeun sacara otomatis ngamodalan kecap anu saleresna. Ieu bakal kajadian upami pananda tempat dimimitian ku hurup ageung, contona, :Namengahasilkeun "Caroline" atanapi kecap kapital pinuh,  :NAME, ngahasilkeun "CAROLINE".

Urang ogé ngapdet file tarjamahan urang resources/lang/fr.jsonresources/lang/it.json , sabab ayeuna urang ngan ukur ningali versi Inggris dimana waé sabab konci tarjamahan henteu cocog sareng tarjamahan.

Perancis:

{

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

}

Italio:

{

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

}

Pluralisasi

Pikeun ningali aksi pluralisasi, hayu urang tambahkeun paragraf téks énggal. 

Pikeun ngalakukeun pluralisasi, anjeun kedah nganggo fungsi trans_choice sabalikna __(), salaku conto:

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

Sakumaha anjeun tiasa tingali, bentuk jamak dipisahkeun ku a |.

Ayeuna, kumaha upami urang peryogi sababaraha bentuk jamak? 

Ieu ogé mungkin:

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

Dina hal ieu, urang ngidinan angka 01, sareng ti 219, sarta tungtungna ti 20 saterusna. Tangtosna, anjeun tiasa nambihan saloba aturan anu anjeun peryogikeun.

Janten kumaha upami urang hoyong pananda tempat dina bentuk jamak urang? 

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

Urang ogé bisa ngagunakeun count diliwatan dina `trans_choice` lamun diperlukeun maké placeholder a :count husus:

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

Tungtungna, tong hilap pikeun ngapdet file tarjamahan anjeun kalayan sagala parobihan anu anjeun lakukeun kana tarjamahan dasar.

Italio:

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

Perancis:

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

Gawe sareng kaping localized di Laravel

Pikeun maluruh tanggal, urang bakal abah kakuatan tina karbon , nu hadir kalawan Laravel sacara standardefinita. Pariksa Dokuméntasi karbon ; Anjeun tiasa ngalakukeun loba hal metot. Salaku conto, urang tiasa nyetél lokal sareng aturan tanggal sareng waktos.

Pikeun conto saderhana, urang bakal nunjukkeun tanggal ayeuna anu dilokalkeun pikeun basa anu dipilih. Di urang routes/web.php, urang ngamutahirkeun jalur kaca wilujeng sumping tur lulus pesen tanggal localized ka ours view wilujeng sumping:

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

Hayu urang ngamutahirkeun resources/views/welcome.blade.php nambahkeun tampilan tanggal, kawas kieu:

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

Nyobian ngarobah basa dina kaca imah tina localhost, urang bakal ningali yén tanggal ayeuna dilokalkeun, contona:

Ngaformat angka sareng mata uang nganggo NumberFormatter

Di nagara béda, jalma ngagunakeun format béda pikeun ngagambarkeun angka, contona:

  • Amérika Sarikat → 123.123,12
  • Perancis → 123 123,12

Janten, pikeun ngagambarkeun bédana ieu dina aplikasi Laravel anjeun, anjeun tiasa nganggo NumberFormatter ku cara kieu:

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

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

Anjeun ogé tiasa nyerat nomer dina basa anu khusus sareng nunjukkeun sapertos "saratus dua puluh tilu rébu saratus dua puluh tilu koma hiji dua":

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

Salaku tambahan, NumberFormatter ngamungkinkeun anjeun gampang mendakan mata uang, contona:

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

Ku kituna pikeun fr anjeun bakal nempo Euro, bari keur en_US mata uang bakal dina dollar AS.

Ercole Palmeri

newsletter inovasi
Entong luput warta anu paling penting ngeunaan inovasi. Ngadaptar pikeun nampa aranjeunna ku email.

Artikel panganyarna

Mangpaat Kaca Mewarna pikeun Barudak - dunya sihir pikeun sagala umur

Ngembangkeun kaahlian motorik halus ngaliwatan ngawarnaan nyiapkeun barudak pikeun kaahlian leuwih kompleks kawas nulis. Pikeun ngawarnaan…

2 Méi 2024

Masa Depan Ieu Ieu: Kumaha Industri Pengiriman Revolutionizing Ékonomi Global

Sektor angkatan laut mangrupikeun kakuatan ékonomi global anu leres, anu nuju ka arah pasar 150 milyar ...

1 Méi 2024

Penerbit sareng OpenAI nandatanganan perjanjian pikeun ngatur aliran inpormasi anu diolah ku Artificial Intelligence

Senén kamari, Financial Times ngumumkeun deal sareng OpenAI. FT ngalisensikeun jurnalisme kelas dunya na…

April 30 2024

Pamayaran Online: Ieu Kumaha Ladenan Streaming Ngadamel Anjeun Mayar Salamina

Jutaan jalma mayar jasa streaming, mayar biaya langganan bulanan. Pendapat umum yén anjeun…

April 29 2024