لاراول برنامه ای است که به صورت محلی طراحی شده است تا با زبان ها و فرهنگ های مختلف سازگار شود. محلیسازی برنامههای بینالمللی شده را از طریق ترجمه برای یک زبان خاص تنظیم میکند.
localhost
. اگر نه، تعویض کنید localhost
با نام دامنه یا آدرس IP خود (بسته به نصب شما).در لاراول، درست مانند بسیاری از فریمورک های دیگر، می توانیم ترجمه های زبان های مختلف را در فایل های جداگانه ذخیره کنیم. دو راه برای سازماندهی فایل های ترجمه لاراول وجود دارد:
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>
ما با آماده کردن پیام خوشامدگویی خود به بومی سازی شروع می کنیم، که در لاراول واقعا آسان است. تنها کاری که باید انجام دهید این است که متن "به وب سایت ما خوش آمدید" را با کد زیر جایگزین کنید: {{ __('Welcome to our website') }}
. این به لاراول دستور می دهد که به طور پیش فرض "Welcome to our website" را نمایش دهدdefinite و اگر زبانی غیر از انگلیسی تنظیم شده است به دنبال ترجمه های این رشته باشید (بعداً به آن خواهیم پرداخت). انگلیسی به عنوان زبان پیش فرض تنظیم خواهد شدdefinish از برنامه ما، بنابراین به طور پیش فرض تنظیم شده استdefiدر پایان به سادگی متن "به وب سایت ما خوش آمدید" را نمایش می دهیم. اگر محلی متفاوت باشد، سعی می کنیم ترجمه منطبق را پیدا کنیم و در یک لحظه ایجاد می شود.
اما لاراول چگونه میداند که زبان فعلی کدام است یا کدام زبانها در اپلیکیشن موجود است؟ این کار را با مشاهده تنظیمات محلی در برنامه انجام می دهد 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
حاوی پیش محلی استdefinish از برنامه شما (حداقل، اگر محلی دیگری در کد تنظیم نشده باشد). و fallback_locale
در صورتی فعال می شود که محلی غیر موجود را در برنامه خود تنظیم کنیم.
در حالی که ما این فایل را باز داریم، بیایید یک کلید جدید برای راحتی خود اضافه کنیم که تمام مناطقی را که برنامه ما پشتیبانی می کند فهرست می کند. ما بعداً هنگام اضافه کردن یک سوئیچر محلی از آن استفاده خواهیم کرد. با این حال، این یک کار اختیاری است زیرا لاراول از ما نیازی به انجام آن ندارد.
/*
|--------------------------------------------------------------------------
| 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
این به این دلیل است که لاراول از قبل میداند کدام پیامها را با تنظیمات قبلی ارسال میکنیمdefiدر عملکرد به پایان رسید __()
آنها برای پیش محلی ما هستندdefinito en.
در این مرحله، لاراول نمیداند چگونه محلیها را تغییر دهد، بنابراین در حال حاضر، اجازه دهید ترجمهها را مستقیماً در داخل مسیر انجام دهیم. مسیر خوش آمدگویی را از قبل تغییر دهید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
. شما باید محتوای بومی شده را ببینید. در صورتی که محلی پشتیبانی نشده را مشخص کنید یا اصلاً محلی را مشخص نکنید، لاراول از آن استفاده خواهد کرد. 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);
}
}
این میانافزار به لاراول دستور میدهد تا در صورت وجود این انتخاب در جلسه، از محلی انتخابشده توسط کاربر استفاده کند.
از آنجایی که ما باید این کار را در هر درخواست انجام دهیم، همچنین باید آن را به پشته پیش میان افزار اضافه کنیم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
، بنابراین همه چیز باید در دید خوشامد ما اتفاق بیفتد مگر اینکه طور دیگری مشخص شده باشد.
به عنوان مثال، به جای نمایش یک پیام عمومی، به کاربر خیالی خود (آماندا) سلام کنیم:
{{ __('Welcome to our website, :Name', ['name' => 'caroline']) }}
توجه داشته باشید که ما نام را با حرف اول با حروف کوچک استفاده می کنیم، اما از مکان نگهدارنده با حرف اول با حروف بزرگ استفاده می کنیم. به این ترتیب، لاراول می تواند به شما کمک کند تا کلمه واقعی را به طور خودکار با حروف بزرگ بنویسید. این اتفاق می افتد اگر مکان نگهدار با یک حرف بزرگ شروع شود، برای مثال، :Name
"Caroline" یا یک کلمه کاملا بزرگ را تولید می کند، :NAME
، "کارولین" را تولید می کند.
ما همچنین فایل های ترجمه خود را به روز می کنیم resources/lang/fr.json
e resources/lang/it.json
، زیرا در حال حاضر ما فقط نسخه انگلیسی را در هر جایی خواهیم دید زیرا کلیدهای ترجمه با ترجمه ها مطابقت ندارند.
فرانسوی:
{
"Welcome to our website, :Name": "Bienvenue sur notre site, :Name"
}
ایتالیاییو:
{
"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']) }}
در نهایت، فراموش نکنید که فایل های ترجمه خود را با هر تغییری که در ترجمه پایه ایجاد کرده اید، به روز کنید.
ایتالیاییو:
{
"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"
}
برای تعیین محل تاریخ، از قدرت استفاده خواهیم کرد کربن که به صورت پیش فرض با لاراول عرضه می شود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
، خواهیم دید که تاریخ ها اکنون محلی شده اند، به عنوان مثال:
در کشورهای مختلف، مردم از فرمت های مختلفی برای نمایش اعداد استفاده می کنند، به عنوان مثال:
بنابراین، برای انعکاس این تفاوت ها در برنامه لاراول خود، می توانید استفاده کنید NumberFormatter به روش زیر:
<?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
دوشنبه گذشته، فایننشال تایمز از قراردادی با OpenAI خبر داد. FT مجوز روزنامه نگاری در سطح جهانی خود را صادر می کند…
میلیونها نفر برای خدمات استریم پرداخت میکنند و هزینه اشتراک ماهانه میپردازند. این عقیده رایج است که شما…
Coveware توسط Veeam به ارائه خدمات پاسخگویی به حوادث اخاذی سایبری ادامه خواهد داد. Coveware قابلیتهای پزشکی قانونی و اصلاحی را ارائه میدهد…
تعمیر و نگهداری پیش بینی شده با رویکردی نوآورانه و پیشگیرانه برای مدیریت کارخانه، بخش نفت و گاز را متحول می کند.…