Laravel เป็นแอปพลิเคชั่นที่ออกแบบมาให้เข้ากับท้องถิ่นเพื่อปรับให้เข้ากับภาษาและวัฒนธรรมต่างๆ การแปลเป็นภาษาท้องถิ่นจะปรับแต่งแอปพลิเคชันที่เป็นสากลให้เป็นภาษาเฉพาะผ่านการแปล
localhost
. ถ้าไม่เปลี่ยน localhost
ด้วยชื่อโดเมนหรือที่อยู่ IP ของคุณเอง (ขึ้นอยู่กับการติดตั้งของคุณ)ใน Laravel ก็เหมือนกับเฟรมเวิร์กอื่น ๆ เราสามารถเก็บคำแปลสำหรับภาษาต่าง ๆ ไว้ในไฟล์แยกกันได้ มีสองวิธีในการจัดระเบียบไฟล์การแปล Laravel:
resources/lang/{en,fr,ru}/{myfile.php}
;resources/lang/{fr.json, ru.json}
;สำหรับภาษาที่แตกต่างกันตามดินแดนคุณควรตั้งชื่อ directory/file
ของภาษาตามมาตรฐาน ISO 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>
เราจะเริ่มด้วยการเตรียมข้อความต้อนรับการแปลเป็นภาษาท้องถิ่น ซึ่งง่ายมากใน Laravel สิ่งที่คุณต้องทำคือแทนที่ข้อความ “ยินดีต้อนรับสู่เว็บไซต์ของเรา” ด้วยรหัสต่อไปนี้: {{ __('Welcome to our website') }}
. สิ่งนี้จะสั่งให้ Laravel แสดง "ยินดีต้อนรับสู่เว็บไซต์ของเรา" เป็นค่าเริ่มต้นdefiไนท์และค้นหาคำแปลของสตริงนี้หากมีการตั้งค่าภาษาอื่นที่ไม่ใช่ภาษาอังกฤษ (เราจะพูดถึงในภายหลัง) ภาษาอังกฤษจะถูกตั้งค่าเป็นภาษาเริ่มต้นdefiถัดจากแอปของเรา ดังนั้นตามการตั้งค่าเริ่มต้นdefiในตอนท้ายเราจะแสดงข้อความ “ยินดีต้อนรับสู่เว็บไซต์ของเรา” หากสถานที่นั้นแตกต่าง เราจะพยายามค้นหาคำแปลที่ตรงกัน และจะถูกสร้างขึ้นในอีกสักครู่
แต่ Laravel รู้ได้อย่างไรว่าภาษาใดเป็นภาษาปัจจุบันหรือภาษาใดที่มีอยู่ในแอปพลิเคชัน ทำได้โดยดูที่การกำหนดค่าในเครื่องในแอป 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
มันถูกเปิดใช้งานในกรณีที่เราตั้งค่าโลแคลที่ไม่มีอยู่ในแอปพลิเคชันของเรา
ขณะที่เราเปิดไฟล์นี้ เรามาเพิ่มคีย์ใหม่เพื่อความสะดวกของเรา โดยแสดงรายการภาษาทั้งหมดที่แอปพลิเคชันของเราจะรองรับ เราจะใช้สิ่งนี้ในภายหลังเมื่อเพิ่มตัวสลับภายใน อย่างไรก็ตาม นี่เป็นงานทางเลือกเนื่องจาก Laravel ไม่ต้องการให้เราทำ
/*
|--------------------------------------------------------------------------
| 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
:
{
"ยินดีต้อนรับสู่เว็บไซต์ของเรา": “ยินดีต้อนรับสู่เว็บไซต์ของเรา”
}
อย่างที่คุณเห็น เรามักจะอ้างถึงข้อความล่วงหน้าเสมอdefinito ที่เราเพิ่มเข้าไปในไฟล์ welcome.blade.php
(ซึ่งเป็น {{ __('Welcome to our website') }}
). เหตุผลที่เราไม่ต้องสร้างไฟล์ en.json
เป็นเพราะ Laravel รู้อยู่แล้วว่าข้อความไหนที่เราส่งผ่านการตั้งค่าล่วงหน้าdefiเสร็จสิ้นในหน้าที่แล้ว __()
พวกเขามีไว้สำหรับก่อนท้องถิ่นของเราdefiนิโต้ en.
ณ จุดนี้ Laravel ไม่ทราบวิธีเปลี่ยนสถานที่ ดังนั้นสำหรับตอนนี้ มาทำการแปลโดยตรงภายในเส้นทางกันดีกว่า ปรับเปลี่ยนเส้นทางต้อนรับก่อนdefiเสร็จสิ้นตามที่แสดงด้านล่าง:
Route::get('/{locale?}', function ($locale = null) {
if (isset($locale) && in_array($locale, config('app.available_locales'))) {
app()->setLocale($locale);
}
return view('welcome');
});
ขณะนี้เราสามารถเยี่ยมชมเว็บไซต์ของเราโดยระบุภาษาใด ๆ ที่มีอยู่เป็นส่วนเส้นทางแรก: ตัวอย่างเช่น localhost/ru
o localhost/fr
. คุณควรเห็นเนื้อหาที่แปลแล้ว ในกรณีที่คุณระบุโลแคลที่ไม่รองรับหรือไม่ระบุโลแคลเลย Laravel จะใช้ 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);
}
}
มิดเดิลแวร์นี้จะสั่งให้ Laravel ใช้โลแคลที่ผู้ใช้เลือก หากตัวเลือกนี้มีอยู่ในเซสชัน
เนื่องจากเราต้องการให้ดำเนินการนี้ให้เสร็จสิ้นในทุกคำขอ เราจึงต้องเพิ่มลงในสแต็กมิดเดิลแวร์ก่อนด้วย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
(ตราบเท่าที่คุกกี้เซสชันของคุณมีอยู่ในเบราว์เซอร์ของคุณ) และคุณจะเห็นเนื้อหาที่แปลแล้ว คุณสามารถย้ายไปรอบๆ เว็บไซต์ได้อย่างอิสระหรือลองรีเฟรชหน้าและดูว่าภาษาที่เลือกนั้นยังคงอยู่
ตอนนี้เราต้องสร้างสิ่งที่ผู้ใช้สามารถคลิกเพื่อเปลี่ยนภาษาแทนการป้อนรหัสท้องถิ่นลงใน URL ด้วยตนเอง ในการทำเช่นนี้ เราจะเพิ่มตัวตรวจสอบภาษาที่ง่ายมาก ดังนั้นให้สร้างใหม่ 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
ดังนั้นทุกอย่างจะต้องเกิดขึ้นในมุมมองต้อนรับของเรา เว้นแต่จะระบุไว้เป็นอย่างอื่น
ตัวอย่างเช่น สมมติว่าสวัสดีกับผู้ใช้ในจินตนาการของเรา (Amanda) แทนที่จะแสดงข้อความทั่วไป:
{{ __('Welcome to our website, :Name', ['name' => 'caroline']) }}
โปรดทราบว่าเราใช้ชื่อที่มีตัวอักษรตัวแรกเป็นตัวพิมพ์เล็ก แต่ตัวยึดตำแหน่งที่มีตัวอักษรตัวแรกเป็นตัวพิมพ์ใหญ่ ด้วยวิธีนี้ Laravel สามารถช่วยให้คุณใช้อักษรตัวพิมพ์ใหญ่ของคำจริงได้โดยอัตโนมัติ กรณีนี้จะเกิดขึ้นหากตัวยึดเริ่มต้นด้วยตัวพิมพ์ใหญ่ เช่น :Name
สร้าง "Caroline" หรือคำที่เป็นตัวพิมพ์ใหญ่เต็มตัว :NAME
, ผลิต “แคโรไลน์”.
เรายังอัปเดตไฟล์การแปลของเราด้วย resources/lang/fr.json
e resources/lang/it.json
เนื่องจากในขณะนี้เราจะเห็นเฉพาะเวอร์ชันภาษาอังกฤษทุกที่เนื่องจากคีย์การแปลไม่ตรงกับการแปล
ภาษาฝรั่งเศส:
{
"Welcome to our website, :Name": "Bienvenue sur notre site, :Name"
}
Italiano:
{
"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) }}
อย่างที่คุณเห็น รูปพหูพจน์จะถูกคั่นด้วย a |
.
ทีนี้ ถ้าเราต้องการรูปพหูพจน์หลายๆ รูปล่ะ?
นอกจากนี้ยังเป็นไปได้:
{{ trans_choice('{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples', 24) }}
ในกรณีนี้ เราอนุญาตให้ใช้ตัวเลข 0
, 1
และจาก 2
a 19
และในที่สุดตั้งแต่วันที่ 20 เป็นต้นไป แน่นอน คุณสามารถเพิ่มกฎได้มากเท่าที่คุณต้องการ
แล้วถ้าเราต้องการตัวยึดตำแหน่งในรูปแบบพหูพจน์ล่ะ?
{{ trans_choice('{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples', 24, ['form' => 'is']) }}
เรายังสามารถใช้จำนวนที่ส่งผ่านใน `trans_choice` หากจำเป็นโดยใช้ตัวยึดตำแหน่ง :count
พิเศษ:
{{ trans_choice('{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples', 1, ['form' => 'is']) }}
สุดท้าย อย่าลืมอัปเดตไฟล์การแปลของคุณด้วยการเปลี่ยนแปลงใด ๆ ที่คุณทำกับการแปลพื้นฐาน
Italiano:
{
"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"
}
ในการค้นหาวันที่ เราจะใช้พลังของ คาร์บอน ซึ่งมาพร้อมกับ Laravel เป็นค่าเริ่มต้น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
เราจะเห็นว่าตอนนี้วันที่ถูกแปลแล้ว ตัวอย่างเช่น:
ในประเทศต่างๆ ผู้คนใช้รูปแบบต่างๆ กันเพื่อแสดงตัวเลข เช่น
ดังนั้น เพื่อแสดงถึงความแตกต่างเหล่านี้ในแอป Laravel ของคุณ คุณสามารถใช้ ฟอร์แมตตัวเลข ด้วยวิธีการดังต่อไปนี้:
<?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);
นอกจากนี้ NumberFormatter ยังช่วยให้คุณค้นหาสกุลเงินได้อย่างง่ายดาย ตัวอย่างเช่น:
<?php
$currency1 = NumberFormatter::create('fr', NumberFormatter::CURRENCY);
$currency2 = NumberFormatter::create('en_US', NumberFormatter::CURRENCY);
ดังนั้นสำหรับ fr
คุณจะเห็นยูโรในขณะที่ en_US
สกุลเงินจะเป็นดอลลาร์สหรัฐ
Ercole Palmeri
การพัฒนาทักษะยนต์ปรับผ่านการระบายสีจะช่วยเตรียมเด็กๆ ให้พร้อมสำหรับทักษะที่ซับซ้อนมากขึ้น เช่น การเขียน หากต้องการสี...
ภาคกองทัพเรือเป็นมหาอำนาจทางเศรษฐกิจระดับโลกอย่างแท้จริง ซึ่งได้มุ่งหน้าสู่ตลาดมูลค่า 150 พันล้าน...
เมื่อวันจันทร์ที่แล้ว Financial Times ได้ประกาศข้อตกลงกับ OpenAI FT อนุญาติให้ทำข่าวระดับโลก...
ผู้คนนับล้านชำระค่าบริการสตรีมมิ่ง โดยจ่ายค่าธรรมเนียมการสมัครสมาชิกรายเดือน เป็นความเห็นทั่วไปที่คุณ...