معظم التطبيقات والمواقع تحتوي هذه الأيام على أكثر من لغة للتطبيق أو الموقع، على سبيل المثال في تطبيقات الهواتف التي تحتوي على أكثر من لغة يحتاج المستخدم للحصول على بيانات حسب اللغة التي قام باختيارها.
هنا لن أتكلم عن كيفية إعدادات لارافيل كي يكون بأكثر من لغة، بل سيتم الحديث فقط عن كيفية إعداد لارافيل كي تتعامل مع اللغة المرسلة من التطبيق أو الموقع.
إنشاء 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’ فإن يجب جلب البيانات باللغة الإنجليزية.
في ملف app/http/kernel.php بداخل المصفوفة routeMiddleware
'checkLang' => \App\Http\Middleware\CheckLangMiddleware::class,
Route::group(['middleware'=>['checkLang']],function() { Route::apiResource('brands', BrandController::class); });
جلب البيانات حسب اللغة
بداخل الكونترولر في الدوال يمكن إستخدام app()->getLocale لجلب البيانات حسب اللغة التي تم تعيينها في middleware أعلاه، وذلك حسب البارميتر lang في الرابط المرسل.
public function index(){ return ShowBrandResource::collection(Brand::select( 'id', 'name_' . app()->getLocale() . ' as name', )->get()); }
لو كان الرابط المرسل
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 مع كل رابط، وأن يحدد قيمته باللغة التي يحتاجها.
the coder
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