توطين i18n سهل لـ Laravel، أداة مفيدة للدمج مع فئات التعريب Laravel.
توفر الحزمة ما يلي:
لارافيل | تعريب لارافيل |
---|---|
4.0.x | 0.13.x |
4.1.x | 0.13.x |
4.2.x | 0.15.x |
5.0.x/5.1.x | 1.0.x |
5.2.x-5.4.x (PHP 7 غير مطلوب) | 1.2. |
5.2.0-6.x (إصدار PHP >= 7 مطلوب) | 1.4.x |
6.x-10.x (إصدار PHP >= 7 مطلوب) | 1.8.x |
10.x-11.x (إصدار PHP >= 8.2 مطلوب) | 2.0.x |
قم بتثبيت الحزمة عبر الملحن: composer require mcamara/laravel-localization
بالنسبة إلى Laravel 5.4 وما دونه، من الضروري تسجيل مزود الخدمة.
من أجل تعديل التكوين الافتراضي، يمكنك تنفيذ ما يلي:
php artisan vendor:publish --provider="McamaraLaravelLocalizationLaravelLocalizationServiceProvider"
بعد ذلك، سيتم إنشاء config/laravellocalization.php
.
خيارات التكوين هي:
يمكنك تسجيل الحزمة الوسيطة في ملف app/Http/Kernel.php
:
<?php namespace App Http ;
use Illuminate Foundation Http Kernel as HttpKernel ;
class Kernel extends HttpKernel {
/**
* The application's route middleware.
*
* @var array
*/
protected $ middlewareAliases = [
/**** OTHER MIDDLEWARE ****/
' localize ' => Mcamara LaravelLocalization Middleware LaravelLocalizationRoutes::class,
' localizationRedirect ' => Mcamara LaravelLocalization Middleware LaravelLocalizationRedirectFilter::class,
' localeSessionRedirect ' => Mcamara LaravelLocalization Middleware LocaleSessionRedirect::class,
' localeCookieRedirect ' => Mcamara LaravelLocalization Middleware LocaleCookieRedirect::class,
' localeViewPath ' => Mcamara LaravelLocalization Middleware LaravelLocalizationViewPath::class
];
}
إذا كنت تستخدم Laravel 11، فيمكنك التسجيل في ملف bootstrap/app.php
مع إغلاق withMiddleware
:
return Application:: configure (basePath: dirname ( __DIR__ ))
// Other application configurations
-> withMiddleware ( function ( Middleware $ middleware ) {
$ middleware -> alias ([
/**** OTHER MIDDLEWARE ALIASES ****/
' localize ' => Mcamara LaravelLocalization Middleware LaravelLocalizationRoutes::class,
' localizationRedirect ' => Mcamara LaravelLocalization Middleware LaravelLocalizationRedirectFilter::class,
' localeSessionRedirect ' => Mcamara LaravelLocalization Middleware LocaleSessionRedirect::class,
' localeCookieRedirect ' => Mcamara LaravelLocalization Middleware LocaleCookieRedirect::class,
' localeViewPath ' => Mcamara LaravelLocalization Middleware LaravelLocalizationViewPath::class,
]);
})
أضف ما يلي إلى ملف المسارات الخاص بك:
// routes/web.php
Route:: group ([ ' prefix ' => LaravelLocalization:: setLocale ()], function ()
{
/** ADD ALL LOCALIZED ROUTES INSIDE THIS GROUP **/
Route:: get ( ' / ' , function ()
{
return View:: make ( ' hello ' );
});
Route:: get ( ' test ' , function (){
return View:: make ( ' test ' );
});
});
/** OTHER PAGES THAT SHOULD NOT BE LOCALIZED **/
بمجرد إضافة مجموعة المسارات هذه إلى ملف المسارات، يمكن للمستخدم الوصول إلى جميع اللغات المضافة إلى supportedLocales
( en
و es
بشكل افتراضي). على سبيل المثال، يقوم ملف المسار أعلاه بإنشاء العناوين التالية:
// Set application language to English
http://url-to-laravel/en
http://url-to-laravel/en/test
// Set application language to Spanish
http://url-to-laravel/es
http://url-to-laravel/es/test
// Set application language to English or Spanish (depending on browsers default locales)
// if nothing found set to default locale
http://url-to-laravel
http://url-to-laravel/test
تقوم الحزمة بتعيين لغة التطبيق الخاصة بك App::getLocale()
وفقًا لعنوان url الخاص بك. يمكن بعد ذلك استخدام اللغة لميزات الترجمة الخاصة بـ Laravel.
يمكنك إضافة برامج وسيطة إلى مجموعتك مثل هذا:
Route:: group (
[
' prefix ' => LaravelLocalization:: setLocale (),
' middleware ' => [ ' localeSessionRedirect ' , ' localizationRedirect ' , ' localeViewPath ' ]
], function (){ //...
});
1. : يوصى بشدة باستخدام برنامج وسيط لإعادة التوجيه. يجب استخدام عناوين URL التي لا تحتوي على لغة محلية إلا لتحديد المتصفح/اللغة الافتراضية ولإعادة التوجيه إلى عنوان URL المترجم. بخلاف ذلك، عندما تقوم روبوتات محركات البحث بالزحف على سبيل المثال إلى http://url-to-laravel/test
فإنها قد تحصل على محتوى لغة مختلف لكل زيارة. يؤدي أيضًا وجود عناوين URL متعددة لنفس المحتوى إلى إنشاء مشكلة محتوى مكرر في تحسين محركات البحث.
2. : يوصى بشدة بترجمة الروابط الخاصة بك، حتى لو كنت تستخدم برنامجًا وسيطًا لإعادة التوجيه. وإلا، فسوف تتسبب في عملية إعادة توجيه واحدة على الأقل في كل مرة ينقر فيها المستخدم على الرابط. وأيضًا، يجب ترجمة أي عنوان URL للإجراء من نموذج النشر، لمنع إعادة توجيهه إلى طلب الحصول.
تعتمد البرامج الوسيطة لإعادة التوجيه التالية على إعدادات hideDefaultLocaleInURL
و useAcceptLanguageHeader
في config/laravellocalization.php
:
عندما تكون اللغة موجودة في عنوان url، سيتم تخزينها في الجلسة بواسطة هذه البرامج الوسيطة.
إذا لم تكن هناك لغة موجودة في عنوان URL، فستقوم هذه البرامج الوسيطة بالتحقق مما يلي
useAcceptLanguageHeader
على القيمة true، فاحسب اللغة من المتصفح وأعد التوجيه إلى عنوان url باستخدام اللغة.hideDefaultLocaleInURL
على true. على سبيل المثال، إذا انتقل المستخدم إلى http://url-to-laravel/test وكانت en
هي اللغة الحالية، فسيعيد توجيهه تلقائيًا إلى http://url-to-laravel/en/test.
يشبه LocaleSessionRedirect، ولكنه يخزن القيمة في ملف تعريف الارتباط بدلاً من الجلسة.
كلما كانت اللغة موجودة في عنوان url، فسيتم تخزينها في ملف تعريف الارتباط بواسطة هذه البرامج الوسيطة.
في حالة عدم وجود لغة محلية في عنوان url، ستقوم هذه البرامج الوسيطة بالتحقق مما يلي
useAcceptLanguageHeader
على القيمة true، فاحسب اللغة من المتصفح وأعد التوجيه إلى عنوان url باستخدام اللغة.hideDefaultLocaleInURL
على true. على سبيل المثال، إذا انتقل المستخدم إلى http://url-to-laravel/test وكانت de
هي اللغة الحالية، فسيتم إعادة توجيهه تلقائيًا إلى http://url-to-laravel/de/test.
عندما تكون اللغة الافتراضية موجودة في عنوان url ويتم تعيين hideDefaultLocaleInURL
على القيمة true، فإن البرنامج الوسيط يعيد التوجيه إلى عنوان url بدون لغة.
على سبيل المثال، إذا كانت es
هي اللغة الافتراضية، فسيتم إعادة توجيه http://url-to-laravel/es/test إلى http://url-to-laravel/test وسيتم تعيين App::getLocale()
es
.
تأتي هذه الحزمة مع مجموعة من المساعدين.
يتم أخذ عناوين URL المترجمة في الاعتبار ربط نموذج المسار عند إنشاء المسار المترجم، بالإضافة إلى إعدادات hideDefaultLocaleInURL
والمسارات المترجمة.
// If current locale is Spanish, it returns `/es/test`
<a href="{{ LaravelLocalization:: localizeUrl ( ' /test ' ) }}">@ lang ( ' Follow this link ' )</a>
احصل على عنوان URL الحالي بلغة محددة:
// Returns current url with English locale.
{{ LaravelLocalization:: getLocalizedURL ( ' en ' ) }}
يُرجع عنوان URL خاليًا من أي ترجمة.
// Returns /about
{{ LaravelLocalization:: getNonLocalizedURL ( ' /es/about ' ) }}
إرجاع مسار، مترجم إلى اللغة المطلوبة. إذا لم يكن مفتاح الترجمة موجودًا في اللغة المحددة، فسترجع هذه الوظيفة خطأ.
// Returns /es/acerca
{{ LaravelLocalization:: getURLFromRouteNameTranslated ( ' es ' , ' routes.about ' ) }}
مثال على رابط مترجم يستخدم المسارات ذات السمات
// An array of attributes can be provided.
// Returns /en/archive/ghosts, /fr/archive/fantômes, /pt/arquivo/fantasmas, etc.
<a href="{{ LaravelLocalization:: getURLFromRouteNameTranslated ( App:: currentLocale (), ' routes.archive ' , array ( ' category ' => ' ghosts ' )) }}">Ghost Stories</a>
قم بإرجاع كافة اللغات المدعومة وخصائصها كمصفوفة.
{{ LaravelLocalization:: getSupportedLocales () }}
قم بإرجاع جميع اللغات المدعومة ولكن بالترتيب المحدد في ملف التكوين. يمكنك استخدام هذه الوظيفة لطباعة اللغات في محدد اللغة.
{{ LaravelLocalization:: getLocalesOrder () }}
قم بإرجاع مصفوفة تحتوي على كافة المفاتيح الخاصة باللغات المدعومة.
{{ LaravelLocalization:: getSupportedLanguagesKeys () }}
قم بإرجاع مفتاح اللغة الحالية.
{{ LaravelLocalization:: getCurrentLocale () }}
قم بإرجاع اسم اللغة الحالية كسلسلة (الإنجليزية/الإسبانية/العربية/..إلخ).
{{ LaravelLocalization:: getCurrentLocaleName () }}
قم بإرجاع الاسم الأصلي للغة المحلية الحالية كسلسلة (الإنجليزية/الإسبانية/عربى/ ..إلخ).
{{ LaravelLocalization:: getCurrentLocaleNative () }}
قم بإرجاع الاسم الإقليمي للغة الحالية كسلسلة (en_GB/en_US/fr_FR/ ..etc).
{{ LaravelLocalization:: getCurrentLocaleRegional () }}
قم بإرجاع اتجاه اللغة الحالية كسلسلة (ltr/rtl).
{{ LaravelLocalization:: getCurrentLocaleDirection () }}
قم بإرجاع رمز ISO 15924 للبرنامج النصي المحلي الحالي كسلسلة؛ "لاتن"، "سيرل"، "عربي"، إلخ.
{{ LaravelLocalization:: getCurrentLocaleScript () }}
قم بتسجيل البرنامج الوسيط LaravelLocalizationViewPath
لتعيين اللغة الحالية كمسار قاعدة العرض.
يمكنك الآن تغليف طرق العرض الخاصة بك في مجلدات تعتمد على اللغة مثل ملفات الترجمة.
resources/views/en/
resources/views/fr
, ...
نظرًا لأنه يمكنك تعديل اللغات المدعومة حتى عن طريق إعادة تسمية مفاتيحها، فمن الممكن استخدام السلسلة uk
بدلاً من en-GB
لتوفير مقاطع عنوان url مخصصة للغة. بالطبع، تحتاج إلى منع أي تصادمات مع المفاتيح الموجودة بالفعل ويجب عليك الالتزام بالاتفاقية لأطول فترة ممكنة. ولكن إذا كنت تستخدم مثل هذا المفتاح المخصص، فيجب عليك تخزين تعيينك في مصفوفة localesMapping
. يعد localesMapping
ضروريًا لتمكين مفاوض اللغة من تعيين اللغات المطلوبة بشكل صحيح بناءً على رأس لغة قبول HTTP. فيما يلي مثال سريع عن كيفية تعيين رأس لغة قبول HTTP "en-GB" إلى مقطع عنوان url "uk":
// config/laravellocalization.php
' localesMapping ' => [
' en-GB ' => ' uk '
],
بعد ذلك يصبح http://url-to-laravel/uk/a/b/c
http://url-to-laravel/en-GB/a/b/c
laravel/uk/a/b/c .
LaravelLocalization:: getLocalizedURL ( ' en-GB ' , ' a/b/c ' ); // http://url-to-laravel/uk/a/b/c
LaravelLocalization:: getLocalizedURL ( ' uk ' , ' a/b/c ' ); // http://url-to-laravel/uk/a/b/c
إذا كنت تدعم لغات متعددة في مشروعك، فمن المحتمل أن ترغب في تزويد المستخدمين بطريقة لتغيير اللغة. فيما يلي مثال بسيط لرمز القالب النصلي الذي يمكنك استخدامه لإنشاء محدد اللغة الخاص بك.
< ul >
@foreach ( LaravelLocalization :: getSupportedLocales () as $localeCode => $properties )
< li >
< a rel = " alternate " hreflang = " {{ $localeCode } } " href = " {{ LaravelLocalization :: getLocalizedURL ( $localeCode , null , [], true ) } } " >
{{ $properties [ ' native ' ] } }
</ a >
</ li >
@endforeach
</ ul >
هنا سيتم إجبار اللغة الافتراضية في getLocalizedURL() على أن تكون موجودة في عنوان URL حتى hideDefaultLocaleInURL = true
.
لاحظ أن ربط نموذج الطريق مدعوم.
يمكنك ترجمة المسارات الخاصة بك. على سبيل المثال، http://url/en/about وhttp://url/es/acerca (تتحدث كلمة acerca باللغة الإسبانية) أو http://url/en/article/important-article وhttp://url/ ستتم إعادة توجيه es/articulo/important-article (المقالة articulo باللغة الإسبانية) إلى نفس وحدة التحكم/العرض كما يلي:
من الضروري أن يتم تحميل البرامج الوسيطة localize
على الأقل في البرنامج الوسيط Route::group
الخاص بك (راجع تعليمات التثبيت).
لكل لغة، قم بإضافة routes.php
إلى مجلد resources/lang/**/routes.php
. يحتوي الملف على مصفوفة تحتوي على كافة المسارات القابلة للترجمة. على سبيل المثال، مثل هذا:
تذكر: بدءًا من Laravel 9، أصبح مجلد
resources/lang
موجودًا الآن في مجلد المشروع الجذري (lang
). إذا كان مشروعك يحتوي على مجلدlang
في الجذر، فيجب عليك إضافةroutes.php
إلى المجلدlang/**/routes.php
.
<?php
// resources/lang/en/routes.php
return [
" about " => " about " ,
" article " => " article/{article} " ,
];
<?php
// resources/lang/es/routes.php
return [
" about " => " acerca " ,
" article " => " articulo/{article} " ,
];
يمكنك إضافة المسارات في routes/web.php
مثل هذا:
Route:: group ([ ' prefix ' => LaravelLocalization:: setLocale (),
' middleware ' => [ ' localize ' ]], function () {
Route:: get (LaravelLocalization:: transRoute ( ' routes.about ' ), function () {
return view ( ' about ' );
});
Route:: get (LaravelLocalization:: transRoute ( ' routes.article ' ), function ( App Article $ article ) {
return $ article ;
});
//,...
});
بمجرد حفظ الملفات، يمكنك الوصول إلى http://url/en/about و http://url/es/acerca و http://url/en/article/important-article و http://url/es/ المادة / المادة الهامة دون أي مشكلة.
ربما لاحظت في المثال السابق وجود سبيكة إنجليزية في عنوان url الإسباني:
http://url/es/articulo/important-article
من الممكن أن تكون هناك حلقات ثابتة مترجمة، على سبيل المثال مثل هذا:
http://url/en/article/important-change
http://url/es/articulo/cambio-importante
ومع ذلك، للقيام بذلك، يجب أن تحتوي كل مقالة على العديد من الارتباطات الثابتة (واحدة لكل لغة). الأمر متروك لك كيف تريد تنفيذ هذه العلاقة. الشرط الوحيد لمعلمات المسار القابلة للترجمة هو أن النموذج ذي الصلة يطبق الواجهة LocalizedUrlRoutable
.
لتنفيذ McamaraLaravelLocalizationInterfacesLocalizedUrlRoutable
، يجب على المرء إنشاء الدالة getLocalizedRouteKey($locale)
، والتي يجب أن تُرجع إلى لغة معينة سبيكة مترجمة. في المثال أعلاه، داخل المقالة النموذجية، يجب أن يُرجع getLocalizedRouteKey('en')
important-change
ويجب أن يُرجع getLocalizedRouteKey('es')
cambio-importante
.
لاستخدام ربط نموذج المسار، يجب استبدال الدالة resolveRouteBinding($slug)
في النموذج. يجب أن تقوم الدالة بإرجاع النموذج الذي ينتمي إلى slug المترجم $slug
. على سبيل المثال:
public function resolveRouteBinding ( $ slug )
{
return static :: findByLocalizedSlug ( $ slug )-> first () ?? abort ( 404 );
}
قد ترغب في الاطلاع على هذا الفيديو الذي يوضح كيفية إعداد معلمات المسار القابلة للترجمة.
يمكنك التقاط معلمات URL أثناء الترجمة إذا كنت ترغب في ترجمتها أيضًا. للقيام بذلك، ما عليك سوى إنشاء مستمع للحدث لحدث routes.translation
كما يلي:
Event:: listen ( ' routes.translation ' , function ( $ locale , $ attributes )
{
// Do your magic
return $ attributes ;
});
تأكد من تمرير الإعدادات المحلية والسمات كمعلمات للإغلاق. يمكنك أيضًا استخدام مشتركي الأحداث، راجع: http://laravel.com/docs/events#event-subscribers
لتخزين مساراتك مؤقتًا، استخدم:
php artisan route:trans:cache
... بدلاً من route:cache
. استخدام artisan route:cache
لن تعمل ذاكرة التخزين المؤقت بشكل صحيح!
لكي يعمل حل التخزين المؤقت للمسار، يلزم إجراء تعديل بسيط على توفير مسار التطبيق الخاص بك.
قبل لارافيل 11
في RouteServiceProvider
لتطبيقك، استخدم خاصية LoadsTranslatedCachedRoutes
:
<?php
class RouteServiceProvider extends ServiceProvider
{
use Mcamara LaravelLocalization Traits LoadsTranslatedCachedRoutes;
بعد لارافيل 11
في AppServiceProvider
لتطبيقك، استخدم فئة CachedTranslatedRouteLoader
في طريقة التسجيل:
<?php
class AppServiceProvider extends ServiceProvider
{
use Mcamara LaravelLocalization Traits LoadsTranslatedCachedRoutes;
/**
* Bootstrap any application services.
*/
public function boot(): void
{
RouteServiceProvider:: loadCachedRoutesUsing ( fn () => $ this -> loadCachedRoutes ());
. . .
}
لمزيد من التفاصيل انظر هنا.
قد يحدث هذا إذا لم تقم بترجمة مسار العمل الخاص بك الموجود داخل Routes::group
الخاص بك. قد يتسبب هذا في إعادة التوجيه، مما يؤدي بعد ذلك إلى تغيير طلب النشر إلى طلب الحصول. لمنع ذلك، ما عليك سوى استخدام مساعد الترجمة.
على سبيل المثال، إذا كنت تستخدم Auth::routes()
ووضعتها في Route::group
الخاص بك، ثم
<form action="/logout" method="POST">
<button>Logout</button>
</form>
لن ينجح. بدلا من ذلك، يجب على المرء أن يستخدم
<form action ="{{ LaravelLocalization:: localizeURL ( ' /logout ' ) }} " method= " POST ">
<button>Logout</button>
</form>
هناك طريقة أخرى لحل هذه المشكلة وهي وضع طريقة http للتكوين في "laravellocalization.httpMethodsIgnored" لمنع معالجة هذا النوع من الطلبات
إذا لم تقم بترجمة عنوان URL للمنشور الخاص بك واستخدمت برنامجًا وسيطًا لإعادة التوجيه، فسيتم إعادة توجيه طلب النشر كطلب الحصول. إذا لم تقم بتعريف مسار الحصول هذا، فسوف تتسبب في هذا الاستثناء.
لتوطين عنوان URL الخاص بمنشورك، راجع المثال الموجود في POST لا يعمل.
يحدث هذا أيضًا إذا لم تقم بترجمة عنوان URL الخاص بمنشورك. إذا لم تقم بترجمة عنوان URL للنشر الخاص بك، فسيتم تعيين اللغة الافتراضية أثناء التحقق من الصحة، وعند العودة إلى back()
تظهر رسالة التحقق باللغة الافتراضية.
لتوطين عنوان URL الخاص بمنشورك، راجع المثال الموجود في POST لا يعمل.
أثناء إعداد الاختبار، لم يكن المسار المطلوب معروفًا بعد. وهذا يعني أنه لا يمكن تعيين أي لغة. عند تقديم طلب أثناء الاختبار، يؤدي ذلك إلى 404 - بدون تعيين البادئة، لا يبدو أن المسار المترجم موجود.
لإصلاح ذلك، يمكنك استخدام هذه الوظيفة لتعيين بادئة اللغة يدويًا:
// TestCase.php
protected function refreshApplicationWithLocale ( $ locale )
{
self :: tearDown ();
putenv (LaravelLocalization:: ENV_ROUTE_KEY . ' = ' . $ locale );
self :: setUp ();
}
protected function tearDown (): void
{
putenv (LaravelLocalization:: ENV_ROUTE_KEY );
parent :: tearDown ();
}
// YourTest.php
public function testBasicTest ()
{
$ this -> refreshApplicationWithLocale ( ' en ' );
// Testing code
}
اسأل ماكامارا إذا كنت تريد أن تكون واحدًا منهم!
عرض سجل التغيير هنا -> سجل التغيير
Laravel Localization عبارة عن حزمة Laravel مفتوحة المصدر مرخصة بموجب ترخيص MIT