معظم التطبيقات والمواقع تحتوي هذه الأيام على أكثر من لغة للتطبيق أو الموقع، على سبيل المثال في تطبيقات الهواتف التي تحتوي على أكثر من لغة يحتاج المستخدم للحصول على بيانات حسب اللغة التي قام باختيارها.
هنا لن أتكلم عن كيفية إعدادات لارافيل كي يكون بأكثر من لغة، بل سيتم الحديث فقط عن كيفية إعداد لارافيل كي تتعامل مع اللغة المرسلة من التطبيق أو الموقع.
خطوات إعداد لارافيل للتعامل مع أكثر من لغة؟
إنشاء middleware
إنشاء middlware باسم CheckLang مثلا
php artisan make:middleware CheckLangMiddleware class CheckLangMiddleware
{
public function handle($request, Closure $next){
return $next($request);
}
}إعداد منطق العمل
class CheckLangMiddleware
{
public function handle($request, Closure $next){
app()->setLocale('ar');
if(isset($request->lang) && $request->lang == 'en'){
app()->setLocale('en');
}
return $next($request);
}
}بمعنا أنه يجب إرسال باراميتر جديد مع الروابط باسم lang ويجب تحديد قيمته حسب اللغة، ولو لم يتم إرسال اللغة في الرابط أو كانت قيمته ar فإن اللغة بالوضع الإفتراضي ستكون اللغة العربية حيث قمنا بتعريف ذلك من خلال app()->setLocale(‘ar’) أما إذا تم إرسالها وكانت $request->lang==’en’ فإن يجب جلب البيانات باللغة الإنجليزية.
تسجيل middlware
في ملف app/http/kernel.php بداخل المصفوفة routeMiddleware
'checkLang' => \App\Http\Middleware\CheckLangMiddleware::class,
تطبيق middleware على route
Route::group(['middleware'=>['checkLang']],function() {
Route::apiResource('brands', BrandController::class);
});
أعدادات Controller
جلب البيانات حسب اللغة
بداخل الكونترولر في الدوال يمكن إستخدام app()->getLocale لجلب البيانات حسب اللغة التي تم تعيينها في middleware أعلاه، وذلك حسب البارميتر lang في الرابط المرسل.
public function index(){
return ShowBrandResource::collection(Brand::select(
'id',
'name_' . app()->getLocale() . ' as name',
)->get());
}روابط frond end أو التطبيقات
لو كان الرابط المرسل
http://www.test.test/api/v1/brands http://www.test.test/api/v1/brands?lang=ar
فإنه سوف يتم عرض البيانات باللغة العربيه
أما إذا كان
http://www.test.test/api/v1/brands?lang=enفإنه سيتم عرض اللغة الإنجليزية.
حيث إنه يجب إخبار مبرمج front-end أو تطبيق الهواتف بإرسال المتغير lang مع كل رابط، وأن يحدد قيمته باللغة التي يحتاجها.
what do you think if use a header? instead of request? i mean send \"x-localization\" :\"en\" for each request to to send as query, i think it is better than this . and from middleware we check it. then set Local, and please if i am wrong send me email