artikel

Panduan langkah demi langkah penyetempatan Laravel, tutorial dengan contoh

Bagaimana untuk menyetempatkan projek Laravel, cara membangunkan projek dalam Laravel dan menjadikannya boleh digunakan dalam pelbagai bahasa. Dalam artikel ini kita melihat cara untuk bekerja dengan fail terjemahan, membuat penukar bahasa dan banyak lagi dengan contoh.

Laravel adalah aplikasi yang direka untuk menjadi tempatan, untuk menyesuaikan diri dengan pelbagai bahasa dan budaya. Penyetempatan menyesuaikan aplikasi antarabangsa kepada bahasa tertentu melalui terjemahan.

prasyarat

  • Dalam artikel ini kita akan merujuk kepada Laravel versi 8.x;
  • Untuk berjaya mengikuti tutorial ini, anda perlu mempunyai pengetahuan yang diperlukan tentang bahasa pengaturcaraan PHP dan rangka kerja Laravel.
  • Domain anda ialah localhost. Jika tidak, ganti localhost dengan nama domain atau alamat IP anda sendiri (bergantung pada pemasangan anda).

Bekerja dengan fail terjemahan

Dalam Laravel, sama seperti dalam banyak rangka kerja lain, kami boleh menyimpan terjemahan untuk bahasa yang berbeza dalam fail berasingan. Terdapat dua cara untuk mengatur fail terjemahan Laravel:

  • Pendekatan lama yang menyimpan fail di lokasi berikut: resources/lang/{en,fr,ru}/{myfile.php};
  • Pendekatan baharu yang menyimpan fail di lokasi berikut: resources/lang/{fr.json, ru.json};

Untuk bahasa yang berbeza mengikut wilayah, anda harus menamakannya directory/file bahasa mengikut ISO 15897. Sebagai contoh, untuk Bahasa Inggeris UK anda akan gunakan en_GB bukannya en-gb. Dalam artikel ini, kami akan menumpukan pada pendekatan kedua, tetapi perkara yang sama berlaku untuk yang pertama (kecuali cara kekunci terjemahan dinamakan dan diambil semula). 

Terjemahan mudah

Sekarang, mari kita pergi ke resources/views/welcome.blade.phpfail dan gantikan kandungan bodytag dengan kami, seperti:

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

Kami akan mulakan dengan menyediakan mesej alu-aluan penyetempatan kami, yang sangat mudah dalam Laravel. Apa yang anda perlu lakukan ialah menggantikan teks "Selamat datang ke tapak web kami" dengan kod berikut: {{ __('Welcome to our website') }}. Ini akan mengarahkan Laravel untuk memaparkan "Selamat Datang ke tapak web kami" secara lalaidefinite dan cari terjemahan rentetan ini jika bahasa selain bahasa Inggeris ditetapkan (kita akan mendapatkannya kemudian). Bahasa Inggeris akan ditetapkan sebagai bahasa lalaidefitamat apl kami, jadi mengikut tetapan lalaidefiPada akhirnya kami hanya akan memaparkan teks "Selamat datang ke laman web kami". Jika tempat itu berbeza, kami akan cuba mencari terjemahan yang sepadan dan ia akan dibuat dalam seketika.

Penyetempatan Laravel

Tetapi bagaimana Laravel mengetahui bahasa semasa atau bahasa mana yang tersedia dalam aplikasi? Ia melakukan ini dengan melihat konfigurasi setempat dalam apl config/app.php. Buka fail ini dan cari dua kekunci tatasusunan bersekutu ini:

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

Perihalan yang ditunjukkan di atas kunci harus jelas, tetapi secara ringkasnya, kuncinya locale mengandungi pra tempatandefiakhir aplikasi anda (sekurang-kurangnya, jika tiada tempat lain telah ditetapkan dalam kod). Dan juga fallback_locale ia diaktifkan sekiranya kami menetapkan tempat yang tidak wujud dalam aplikasi kami.

Semasa kami membuka fail ini, mari tambah kunci baharu untuk kemudahan kami menyenaraikan semua tempat yang akan disokong oleh aplikasi kami. Kami akan menggunakan ini kemudian apabila menambah penukar setempat. Walau bagaimanapun, ini adalah tugas pilihan kerana Laravel tidak memerlukan kami melakukannya.

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

Kini aplikasi kami menyokong tiga bahasa: Inggeris, Itali dan Perancis.

Fail terjemahan

Memandangkan kami telah menyediakan semua tempat yang akan kami bekerjasama, kami boleh meneruskan dan meneruskan menterjemah mesej pra alu-aluan kamidefimalam.

Mari mulakan dengan menambah fail penyetempatan baharu pada folder resources/lang. Pertama, buat fail resources/lang/it.json dan tambah terjemahan yang sepadan, seperti berikut:

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

Seterusnya, buat fail resources/lang/fr.json:

{

"Selamat datang ke laman web kami": “Selamat datang ke laman web kami”

}

Seperti yang anda lihat, kami sentiasa merujuk kepada mesej pradefinito yang kami tambah dalam fail welcome.blade.php (yang {{ __('Welcome to our website') }}). Sebab mengapa kita tidak perlu membuat fail en.json itu kerana Laravel sudah mengetahui mesej yang kita lalui melalui pra tetapandefiselesai pada majlis tersebut __() mereka adalah untuk pra tempatan kitadefiini en.

Perubahan tempatan dalam Laravel

Pada ketika ini, Laravel tidak tahu cara menukar tempat, jadi buat masa ini, mari lakukan terjemahan terus di dalam laluan. Ubah suai laluan selamat datang pradefiselesai seperti yang ditunjukkan di bawah:

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

Kini kami boleh melawati tapak web kami, menyatakan mana-mana bahasa yang tersedia sebagai segmen laluan pertama: contohnya, localhost/rulocalhost/fr. Anda sepatutnya melihat kandungan setempat. Sekiranya anda menentukan tempattempat yang tidak disokong atau tidak menyatakan tempattempat sama sekali, Laravel akan menggunakan ensecara lalaidefinita.

Middleware

Menukar tempat untuk setiap pautan tapak mungkin bukan perkara yang anda mahukan dan ia mungkin tidak kelihatan bersih dari segi estetika. Itulah sebabnya kami akan melakukan tetapan bahasa melalui penukar bahasa khas dan menggunakan sesi pengguna untuk memaparkan kandungan yang diterjemahkan. Oleh itu, cipta perisian tengah baharu di dalam app/Http/Middleware/Localization.phpfail atau dengan menjalankan 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);
    }
}

Perisian tengah ini akan mengarahkan Laravel untuk menggunakan tempat yang dipilih pengguna jika pilihan ini hadir dalam sesi.

Oleh kerana kita memerlukan ini untuk dilakukan pada setiap permintaan, kita juga perlu menambahkannya pada tindanan pra middlewaredefiselesai dalam app/http/Kernel.phpuntuk webkumpulan 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 */
  ],

Tukar kursus

Seterusnya, kita perlu menambah laluan untuk menukar tempat. Kami menggunakan laluan penutupan, tetapi anda boleh menggunakan kod yang sama di dalam pengawal anda jika anda suka:

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

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

Selain itu, jangan lupa untuk mengalih keluar togol setempat yang telah ditambahkan sebelum ini dalam laluan pra alu-aluan kamidefimalam:

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

Setelah ini dilakukan, satu-satunya cara untuk pengguna menukar bahasa yang ditetapkan pada masa ini adalah dengan memasukkan localhost/language/{locale}. The localepemilihan akan disimpan dalam sesi dan akan mengubah hala pengguna ke tempat asal mereka (semak Localizationperisian tengah). Untuk mencubanya, pergi ke localhost/language/ru(selagi kuki sesi anda ada dalam penyemak imbas anda) dan anda akan melihat kandungan yang diterjemahkan. Anda boleh bergerak di sekitar tapak web dengan bebas atau cuba memuat semula halaman dan melihat bahawa bahasa yang dipilih dipelihara.

Komutator

Sekarang kita perlu mencipta sesuatu yang pengguna boleh klik untuk menukar bahasa dan bukannya memasukkan kod tempatan secara manual ke dalam URL. Untuk melakukan ini, kami akan menambah penyemak bahasa yang sangat mudah. Oleh itu, buat yang baru resources/views/partials/language_switcher.blade.phpfail dengan kod berikut:

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

Sertakan penukar yang baru dibuat dalam paparan "selamat datang":

<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 app/Providers/AppServiceProvider.phpfail dan tambahkan kod untuk dikongsi apabila penukar bahasa kami akan digubah. Khususnya, kami akan berkongsi tempat semasa yang boleh diakses sebagai fail {{ $current_locale }}.

Surat berita inovasi
Jangan terlepas berita paling penting tentang inovasi. Daftar untuk menerimanya melalui e-mel.

Pilihan terjemahan lanjutan dalam PHP Laravel

Kami terutamanya akan bekerjasama dengan resources/views/welcome.blade.php, jadi segala-galanya mesti berlaku dalam pandangan dialu-alukan kami melainkan dinyatakan sebaliknya.

Parameter dalam rentetan terjemahan

Sebagai contoh, mari kita bertanya khabar kepada pengguna khayalan kita (Amanda) dan bukannya hanya memaparkan mesej generik:

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

Ambil perhatian bahawa kami menggunakan nama dengan huruf pertama dalam huruf kecil, tetapi pemegang tempat dengan huruf pertama dalam huruf besar. Dengan cara ini, Laravel boleh membantu anda menggunakan huruf besar perkataan sebenar secara automatik. Ini akan berlaku jika pemegang tempat bermula dengan huruf besar, contohnya, :Namemenghasilkan "Caroline" atau perkataan besar penuh,  :NAME, menghasilkan "CAROLINE".

Kami juga mengemas kini fail terjemahan kami resources/lang/fr.jsonresources/lang/it.json , pada masa ini kami hanya akan melihat versi bahasa Inggeris di mana-mana sahaja kerana kunci terjemahan tidak sepadan dengan terjemahan.

Perancis:

{

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

}

Bahasa Itali:

{

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

}

Pluralisasi

Untuk melihat pemajmukan dalam tindakan, mari tambah perenggan teks baharu. 

Untuk melakukan pemajmukan, anda mesti menggunakan fungsi tersebut trans_choice bukannya __(), sebagai contoh:

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

Seperti yang anda lihat, bentuk jamak dipisahkan oleh a |.

Sekarang, bagaimana jika kita memerlukan pelbagai bentuk jamak? 

Ini juga mungkin:

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

Dalam kes ini, kami membenarkan nombor 01, dan dari 219, dan akhirnya dari 20 dan seterusnya. Sudah tentu, anda boleh menambah seberapa banyak peraturan yang anda perlukan.

Jadi bagaimana jika kita mahu pemegang tempat dalam bentuk jamak kita? 

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

Kami juga boleh menggunakan kiraan yang diluluskan dalam `trans_choice` jika perlu menggunakan ruang letak :count istimewa:

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

Akhir sekali, jangan lupa untuk mengemas kini fail terjemahan anda dengan sebarang perubahan yang anda buat pada terjemahan asas.

Bahasa Itali:

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

Bekerja dengan tarikh setempat di Laravel

Untuk mencari tarikh, kami akan memanfaatkan kuasa Carbon , yang disertakan dengan Laravel secara lalaidefinita. Semak Dokumentasi karbon ; anda boleh melakukan banyak perkara yang menarik. Sebagai contoh, kita boleh menetapkan tempat kita dengan peraturan tarikh dan masa.

Untuk contoh mudah kami, kami akan menunjukkan tarikh semasa yang disetempatkan untuk bahasa yang dipilih. Dalam kami routes/web.php, kami mengemas kini laluan halaman alu-aluan dan menghantar mesej tarikh setempat kepada kami view selamat datang:

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

Jom update resources/views/welcome.blade.php menambah paparan tarikh, seperti:

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

Cuba menukar bahasa di halaman utama localhost, kita akan melihat bahawa tarikh kini disetempatkan, sebagai contoh:

Memformat nombor dan mata wang dengan NumberFormatter

Di negara yang berbeza, orang menggunakan format yang berbeza untuk mewakili nombor, contohnya:

  • Amerika Syarikat → 123.123,12
  • Perancis → 123 123,12

Oleh itu, untuk mencerminkan perbezaan ini dalam apl Laravel anda, anda boleh menggunakan NumberFormatter dengan cara berikut:

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

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

Anda juga boleh menulis nombor dalam bahasa tertentu dan memaparkan sesuatu seperti "seratus dua puluh tiga ribu seratus dua puluh tiga titik satu dua":

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

Selain itu, NumberFormatter membolehkan anda mencari mata wang dengan mudah, contohnya:

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

Jadi untuk fr anda akan melihat Euro, manakala untuk en_US mata wang akan berada dalam dolar AS.

Ercole Palmeri

Surat berita inovasi
Jangan terlepas berita paling penting tentang inovasi. Daftar untuk menerimanya melalui e-mel.

Artikel baru-baru ini

Masa Depan Di Sini: Bagaimana Industri Perkapalan Merevolusikan Ekonomi Global

Sektor tentera laut adalah kuasa ekonomi global yang sebenar, yang telah menavigasi ke arah pasaran 150 bilion...

1 Mei 2024

Penerbit dan OpenAI menandatangani perjanjian untuk mengawal selia aliran maklumat yang diproses oleh Kepintaran Buatan

Isnin lalu, Financial Times mengumumkan perjanjian dengan OpenAI. FT melesenkan kewartawanannya bertaraf dunia…

30 April 2024

Pembayaran Dalam Talian: Begini Cara Perkhidmatan Penstriman Membuat Anda Membayar Selama-lamanya

Berjuta-juta orang membayar untuk perkhidmatan penstriman, membayar yuran langganan bulanan. Adalah menjadi pendapat umum bahawa anda…

29 April 2024

Veeam menampilkan sokongan paling komprehensif untuk perisian tebusan, daripada perlindungan kepada tindak balas dan pemulihan

Coveware oleh Veeam akan terus menyediakan perkhidmatan tindak balas insiden pemerasan siber. Coveware akan menawarkan keupayaan forensik dan pemulihan…

23 April 2024