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 لعرض "مرحبًا بك في موقعنا" افتراضيًاdefinite وابحث عن ترجمات هذه السلسلة إذا تم تعيين لغة أخرى غير الإنجليزية (سنصل إلى ذلك لاحقًا). سيتم تعيين اللغة الإنجليزية كلغة افتراضيةdefinish من تطبيقنا ، لذلك من خلال الإعداد الافتراضي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
يحتوي على الملف المحليdefinish من التطبيق الخاص بك (على الأقل ، إذا لم يتم تعيين لغة أخرى في الكود). و ال 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نيتو أون.
في هذه المرحلة ، لا يعرف Laravel كيفية تغيير المواقع ، لذلك في الوقت الحالي ، لنقم بالترجمات مباشرة داخل المسار. قم بتعديل مسار الترحيب مسبقًاdefinished كما هو موضح أدناه:
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
، لذلك يجب أن يحدث كل شيء في وجهة نظرنا المرحب بها ما لم ينص على خلاف ذلك.
على سبيل المثال ، دعنا نقول مرحباً لمستخدمنا الخيالي (أماندا) بدلاً من مجرد عرض رسالة عامة:
{{ __('Welcome to our website, :Name', ['name' => 'caroline']) }}
لاحظ أننا استخدمنا الاسم مع الحرف الأول بأحرف صغيرة ، ولكن العنصر النائب مع الحرف الأول بأحرف كبيرة. بهذه الطريقة ، يمكن أن يساعدك Laravel في كتابة الكلمة الفعلية بأحرف كبيرة تلقائيًا. سيحدث هذا إذا بدأ العنصر النائب بحرف كبير ، على سبيل المثال ، :Name
ينتج "كارولين" أو كلمة بأحرف كبيرة بالكامل ، :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) }}
كما ترى ، يتم فصل صيغ الجمع بامتداد |
.
الآن ، ماذا لو احتجنا إلى صيغ الجمع المتعددة؟
هذا ممكن أيضًا:
{{ 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"
}
لتحديد التواريخ ، سوف نستغل قوة كربون ، والذي يأتي مع 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
أعلنت صحيفة فاينانشيال تايمز يوم الاثنين الماضي عن صفقة مع OpenAI. "فاينانشيال تايمز" ترخص صحافتها ذات المستوى العالمي...
يدفع الملايين من الأشخاص مقابل خدمات البث، ويدفعون رسوم الاشتراك الشهرية. من الشائع أنك…
سوف تستمر شركة Coveware by Veeam في تقديم خدمات الاستجابة لحوادث الابتزاز السيبراني. ستوفر Coveware إمكانات الطب الشرعي والمعالجة...
تُحدث الصيانة التنبؤية ثورة في قطاع النفط والغاز، من خلال اتباع نهج مبتكر واستباقي لإدارة المحطات.