Artikulo

Laravel localization step-by-step na gabay, tutorial na may mga halimbawa

Paano i-localize ang isang proyekto ng Laravel, kung paano bumuo ng isang proyekto sa Laravel at gawin itong magagamit sa maraming wika. Sa artikulong ito, makikita natin kung paano gumawa ng mga translation file, gumawa ng language switcher at higit pa na may mga halimbawa.

Ang Laravel ay isang application na idinisenyo upang maging lokal, upang umangkop sa iba't ibang mga wika at kultura. Ang lokalisasyon ay nag-aangkop ng mga internasyonal na aplikasyon sa isang partikular na wika sa pamamagitan ng pagsasalin.

Mga paunang kinakailangan

  • Sa artikulong ito ay tatalakayin natin Laravel bersyon 8.x;
  • Upang matagumpay na masundan ang tutorial na ito, kailangan mong magkaroon ng kinakailangang kaalaman sa PHP programming language at sa Laravel framework.
  • Ang iyong domain ay localhost. Kung hindi, palitan localhost gamit ang iyong sariling domain name o IP address (depende sa iyong pag-install).

Paggawa gamit ang mga file ng pagsasalin

Sa Laravel, tulad ng sa maraming iba pang mga balangkas, maaari kaming mag-imbak ng mga pagsasalin para sa iba't ibang mga wika sa magkahiwalay na mga file. Mayroong dalawang paraan upang ayusin ang mga file ng pagsasalin ng Laravel:

  • Isang mas lumang diskarte na nag-iimbak ng mga file sa sumusunod na lokasyon: resources/lang/{en,fr,ru}/{myfile.php};
  • Isang bagong diskarte na nag-iimbak ng mga file sa sumusunod na lokasyon: resources/lang/{fr.json, ru.json};

Para sa mga wika na naiiba ayon sa teritoryo, dapat mong pangalanan ang mga ito directory/file ng wika ayon sa ISO 15897. Halimbawa, para sa UK English ang iyong gagamitin en_GB sa halip na en-gb. Sa artikulong ito, tututuon tayo sa pangalawang diskarte, ngunit ganoon din ang para sa una (maliban sa kung paano pinangalanan at kinukuha ang mga translation key). 

Mga simpleng pagsasalin

Ngayon, pumunta tayo sa resources/views/welcome.blade.phpfile at palitan ang mga nilalaman ng bodytag sa amin, tulad nito:

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

Magsisimula kami sa pamamagitan ng paghahanda ng aming localization welcome message, na talagang madali sa Laravel. Ang kailangan mo lang gawin ay palitan ang text na "Welcome to our website" ng sumusunod na code: {{ __('Welcome to our website') }}. Ito ay magtuturo kay Laravel na ipakita ang "Welcome to our website" bilang defaultdefigabi at hanapin ang mga pagsasalin ng string na ito kung may nakatakdang wika maliban sa English (aalamin natin iyon mamaya). Itatakda ang English bilang default na wikadefinish ng aming app, kaya sa pamamagitan ng default na settingdefiSa dulo ay ipapakita lang namin ang tekstong "Welcome to our website". Kung iba ang lokal, susubukan naming hanapin ang katugmang pagsasalin at malilikha ito sa ilang sandali.

Lokalisasyon ng Laravel

Ngunit paano malalaman ni Laravel kung alin ang kasalukuyang wika o kung aling mga wika ang magagamit sa application? Ginagawa ito sa pamamagitan ng pagtingin sa lokal na configuration sa app config/app.php. Buksan ang file na ito at hanapin ang dalawang nauugnay na array key na ito:

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

Ang mga paglalarawang ipinapakita sa itaas ng mga susi ay dapat na maliwanag, ngunit sa madaling salita, ang susi locale naglalaman ng lokal na predefinish ng iyong aplikasyon (hindi bababa sa, kung walang ibang lokal na naitakda sa code). At ang fallback_locale ito ay isinaaktibo kung sakaling magtakda kami ng hindi umiiral na lokal sa aming aplikasyon.

Habang nakabukas ang file na ito, magdagdag tayo ng bagong key para sa aming kaginhawaan na naglilista ng lahat ng lokal na susuportahan ng aming application. Gagamitin namin ito sa ibang pagkakataon kapag nagdaragdag ng lokal na switcher. Gayunpaman, isa itong opsyonal na gawain dahil hindi hinihiling sa amin ni Laravel na gawin ito.

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

Ngayon ang aming application ay sumusuporta sa tatlong wika: Ingles, Italyano at Pranses.

Mga file ng pagsasalin

Ngayong naitatag na namin ang lahat ng lokal na pagtratrabahoan namin, maaari na kaming magpatuloy at magpatuloy sa pagsasalin ng aming pre welcome messagedefigabi.

Magsimula tayo sa pamamagitan ng pagdaragdag ng mga bagong localization file sa folder resources/lang. Una, lumikha ng isang file resources/lang/it.json at idagdag ang kaukulang mga pagsasalin, gaya ng sumusunod:

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

Susunod, lumikha ng isang file resources/lang/fr.json:

{

"Maligayang pagdating sa aming website": "Maligayang pagdating sa aming site"

}

Tulad ng nakikita mo, palagi naming tinutukoy ang pre messagedefinito na idinagdag namin sa file welcome.blade.php (na noon {{ __('Welcome to our website') }}). Ang dahilan kung bakit hindi namin kailangang gumawa ng file en.json alam na kasi ni Laravel kung aling mga mensahe ang dinadaanan natin sa pre settingdefitapos na sa function __() para sa local natin predefinito en.

Lokal na pagbabago sa Laravel

Sa puntong ito, hindi alam ni Laravel kung paano baguhin ang mga lokal, kaya sa ngayon, gawin natin ang mga pagsasalin nang direkta sa loob ng landas. Baguhin ang welcome path predefinatapos tulad ng ipinapakita sa ibaba:

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

Maaari na naming bisitahin ang aming website, na tumutukoy sa alinman sa mga magagamit na wika bilang unang bahagi ng landas: halimbawa, localhost/rulocalhost/fr. Dapat mong makita ang naisalokal na nilalaman. Kung sakaling tumukoy ka ng hindi sinusuportahang lokal o hindi tumukoy ng lokal, gagamit si Laravel enbilang defaultdefinita.

Middleware

Ang pagpapalit ng lokal para sa bawat link ng site ay maaaring hindi ang gusto mo, at maaaring hindi ito magmukhang malinis sa aesthetically. Iyon ang dahilan kung bakit gagawin namin ang setting ng wika sa pamamagitan ng isang espesyal na tagapagpalit ng wika at gagamitin ang session ng user upang ipakita ang isinaling nilalaman. Samakatuwid, lumikha ng bagong middleware sa loob ng app/Http/Middleware/Localization.phpfile o sa pamamagitan ng pagtakbo 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);
    }
}

Ang middleware na ito ay magtuturo kay Laravel na gamitin ang napiling lokal na user kung ang pagpipiliang ito ay naroroon sa session.

Dahil kailangan namin itong gawin sa bawat kahilingan, kailangan din namin itong idagdag sa pre middleware stackdefinatapos sa app/http/Kernel.phppara sa webpangkat ng 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 */
  ],

Baguhin ang kurso

Susunod, kailangan nating magdagdag ng landas upang baguhin ang lokal. Gumagamit kami ng path ng pagsasara, ngunit maaari mong gamitin ang eksaktong parehong code sa loob ng iyong controller kung gusto mo:

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

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

Gayundin, huwag kalimutang tanggalin ang locale toggle na dati nang naidagdag sa aming pre welcome pathdefigabi:

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

Kapag tapos na ito, ang tanging paraan para baguhin ng user ang kasalukuyang nakatakdang wika ay sa pamamagitan ng pagpasok localhost/language/{locale}. Ang localeAng pagpili ay maiimbak sa loob ng session at ire-redirect ang mga user sa kung saan sila nanggaling (tingnan ang Localizationmiddleware). Upang subukan ito, pumunta sa localhost/language/ru(hangga't ang iyong session cookie ay naroroon sa iyong browser) at makikita mo ang isinalin na nilalaman. Maaari kang malayang gumalaw sa website o subukang i-refresh ang pahina at makitang napanatili ang napiling wika.

Ang commutator

Ngayon ay kailangan nating lumikha ng isang bagay na maaaring i-click ng user upang baguhin ang wika sa halip na manu-manong magpasok ng mga lokal na code sa URL. Para magawa ito, magdaragdag kami ng napakasimpleng language checker. Samakatuwid, lumikha ng bago resources/views/partials/language_switcher.blade.phpfile na may sumusunod na code:

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

Isama ang bagong likhang switcher sa view na "welcome":

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

Buksan ang app/Providers/AppServiceProvider.phpfile at idagdag ang code na ibabahagi kung kailan bubuuin ang ating language switcher. Sa partikular, ibabahagi namin ang kasalukuyang lokal na maaaring ma-access bilang isang file {{ $current_locale }}.

newsletter ng pagbabago
Huwag palampasin ang pinakamahalagang balita sa pagbabago. Mag-sign up upang matanggap ang mga ito sa pamamagitan ng email.

Mga advanced na opsyon sa pagsasalin sa PHP Laravel

Pangunahin naming makikipagtulungan resources/views/welcome.blade.php, kaya dapat mangyari ang lahat sa aming welcome view maliban kung tinukoy.

Mga parameter sa mga string ng pagsasalin

Halimbawa, kumusta tayo sa ating imaginary user (Amanda) sa halip na magpakita lang ng generic na mensahe:

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

Tandaan na ginamit namin ang pangalan na may unang titik sa lowercase, ngunit ang placeholder na may unang titik sa uppercase. Sa ganitong paraan, matutulungan ka ng Laravel na awtomatikong i-capitalize ang aktwal na salita. Mangyayari ito kung magsisimula ang placeholder sa malaking titik, halimbawa, :Namegumagawa ng "Caroline" o isang salita na may malaking titik,  :NAME, gumagawa ng "CAROLINE".

Ina-update din namin ang aming mga file ng pagsasalin resources/lang/fr.jsonresources/lang/it.json , dahil sa kasalukuyan ay makikita lang namin ang English na bersyon kahit saan dahil hindi tumutugma ang mga translation key sa mga pagsasalin.

Pranses:

{

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

}

Italyano:

{

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

}

Pluralisasyon

Upang makita ang pagkilos ng pluralisasyon, magdagdag tayo ng bagong talata ng teksto. 

Upang maisagawa ang pluralization, dapat mong gamitin ang function trans_choice sa halip na __(), Halimbawa:

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

Tulad ng makikita mo, ang mga plural na anyo ay pinaghihiwalay ng a |.

Ngayon, paano kung kailangan natin ng maramihang pangmaramihang anyo? 

Posible rin ito:

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

Sa kasong ito, pinapayagan namin ang mga numero 01, at mula sa 219, at sa wakas mula 20 pataas. Siyempre, maaari kang magdagdag ng maraming panuntunan hangga't kailangan mo.

Paano kung gusto natin ang mga placeholder sa ating plural na anyo? 

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

Magagamit din namin ang bilang na ipinasa sa `trans_choice` kung kinakailangan gamit ang isang placeholder :count espesyal:

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

Panghuli, huwag kalimutang i-update ang iyong mga file ng pagsasalin sa anumang mga pagbabagong ginawa mo sa base na pagsasalin.

Italyano:

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

Pranses:

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

Paggawa gamit ang mga naka-localize na petsa sa Laravel

Upang mahanap ang mga petsa, gagamitin namin ang kapangyarihan ng Karbon , na kasama ng Laravel bilang defaultdefinita. Tingnan ang Dokumentasyon ng carbon ; maaari kang gumawa ng maraming kawili-wiling bagay. Halimbawa, maaari naming itakda ang aming lokal na may mga panuntunan sa petsa at oras.

Para sa aming simpleng halimbawa, ipapakita namin ang kasalukuyang petsa na naisalokal para sa napiling wika. Sa aming routes/web.php, ina-update namin ang path ng welcome page at ipinapasa sa amin ang naka-localize na mensahe ng petsa view maligayang pagdating:

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

Update tayo resources/views/welcome.blade.php pagdaragdag ng display ng petsa, tulad nito:

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

Sinusubukang baguhin ang wika sa home page ng localhost, makikita natin na ang mga petsa ay naisalokal na ngayon, halimbawa:

Pag-format ng mga numero at pera gamit ang NumberFormatter

Sa iba't ibang bansa, gumagamit ang mga tao ng iba't ibang format upang kumatawan sa mga numero, halimbawa:

  • Estados Unidos → 123.123,12
  • France → 123 123,12

Samakatuwid, upang ipakita ang mga pagkakaibang ito sa iyong Laravel app, maaari mong gamitin NumberFormatter sa sumusunod na paraan:

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

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

Maaari mo ring isulat ang numero sa isang partikular na wika at magpakita ng isang bagay tulad ng "isang daan dalawampu't tatlong libo isang daan dalawampu't tatlong punto isang dalawa":

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

Bilang karagdagan, binibigyang-daan ka ng NumberFormatter na madaling mahanap ang mga pera, halimbawa:

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

Kaya para sa fr makikita mo ang Euros, habang para sa en_US ang pera ay nasa US dollars.

Ercole Palmeri

newsletter ng pagbabago
Huwag palampasin ang pinakamahalagang balita sa pagbabago. Mag-sign up upang matanggap ang mga ito sa pamamagitan ng email.

Kamakailang Mga Artikulo

Mga Online na Pagbabayad: Narito Kung Paano Ka Binabayaran ng Mga Serbisyo ng Streaming Magpakailanman

Milyun-milyong tao ang nagbabayad para sa mga serbisyo ng streaming, na nagbabayad ng buwanang bayad sa subscription. Karaniwang opinyon na ikaw ay…

Abril 29 2024

Itinatampok ng Veeam ang pinakakomprehensibong suporta para sa ransomware, mula sa proteksyon hanggang sa pagtugon at pagbawi

Ang Coveware ng Veeam ay patuloy na magbibigay ng mga serbisyo sa pagtugon sa insidente ng cyber extortion. Mag-aalok ang Coveware ng mga kakayahan sa forensics at remediation...

Abril 23 2024

Green and Digital Revolution: Kung Paano Binabago ng Predictive Maintenance ang Industriya ng Langis at Gas

Binabago ng predictive maintenance ang sektor ng langis at gas, na may makabago at proactive na diskarte sa pamamahala ng halaman.…

Abril 22 2024

Itinaas ng UK antitrust regulator ang BigTech alarm sa GenAI

Ang UK CMA ay naglabas ng babala tungkol sa gawi ng Big Tech sa merkado ng artificial intelligence. doon…

Abril 18 2024