أولاً تم مناقشة عدة مسائل حول تعددية اللغات في الموقع وكيف تسير الأمور تجدها على الرابط التالي:
تعديل
يُمكن استخدام الطريقة التي تم ذكرها في الرد:
الشرح على الإصدار 5.3
ولتنفيذ تعددية اللغات عبر الإطار بشكل مُبسط ستقوم بالتحقق من اللغة ومن ثم تقوم بحفظها في جهاز المُستخدم من خلال Cookies كالتالي:
if(Cookie::get('lang') != null){
$lang = Crypt::decrypt(Cookie::get('lang'));
if(!in_array($lang, ['en', 'de', 'fr', 'it', 'ru', 'tr', 'es'])){
$lang = 'en';
Cookie::queue(Cookie::forever('lang', $lang));
}
}else{
$lang = 'en';
Cookie::queue(Cookie::forever('lang', $lang));
}
Route::get('/', function () use($lang){
return redirect($lang);
});
ولتغيير اللغة سنقوم بالتالي:
Route::get('/change-lang/{lang}', function ($lang) {
if(!in_array($lang, ['en', 'de', 'fr', 'it', 'ru', 'tr', 'es'])){
$lang = 'en';
}
$cookie = Cookie::forever('lang', $lang);
return redirect("/{$lang}")->withCookie($cookie);
});
بهذا نحن أجبرنا الزائر على تحديد لغة أو استخدام اللغة الإفتراضية بعد اسم الموقع بإعادة توجيه الطلبات والآن لاستلام جميع الطلبات بعد مُعرف اللغة في الرابط سنستخدم prefix ضمن المجموعة group ونُنادي دالة سنكتب داخلها جميع التوجيهات التي نحتاجها كالتالي:
Route::group(['prefix' => 'en'], $allLang);
Route::group(['prefix' => 'de'], $allLang);
Route::group(['prefix' => 'fr'], $allLang);
Route::group(['prefix' => 'it'], $allLang);
Route::group(['prefix' => 'ru'], $allLang);
Route::group(['prefix' => 'tr'], $allLang);
Route::group(['prefix' => 'es'], $allLang);
$allLang = function () {
Route::get('/', function (){
return View('index');
});
};
وأثناء عمل الروابط لا تنسى استخدام ال segment الأول وهو دوماً عبارة عن اللغة المُختارة كالتالي:
<a href="{{ url('/') }}/{{ Request::segment(1) }}/login">Login</a>
التعليقات
لما لا يستخدم :
Route::group(['prefix' => '{lang}'], function () {
Route::get('/', function (){
return View('index');
});
});
ويتم إستخدام Middleware لتحقق لو أن تلك اللغة مدعومة أم لا، وفي حالة عدم دعمها يتم إسنادها للغة الأساسية .
كذلك وكون الشرح يعتمد على النسخة 5.3، يمكن الإعتماد على ملف RouteServiceProvider.php لجعل كل روابط ضمن ملف web.php تعمل بـ prefix على شكل param مباشرة دون كتابتها ضمن ملف web.php .
بحثت حول امكانية استخدام أكثر من prefix داخل الـ group ولكن لم أجد لهذا إلتجأت للطريقة التي ذكرتها في الأعلى
بالنسبة للنقطة الثانية فأحتاج أحياناً للعمل مباشراً بدون سابقة اللغة كما في لوحة التحكم.
شكراً لك على التنويه عن تلك الطريقة، ولكن لي تساؤل كيف ستمرر اللغة في الرابط للـ Middleware كقيمة؟
بحثت حول امكانية استخدام أكثر من prefix داخل الـ group ولكن لم أجد لهذا إلتجأت للطريقة التي ذكرتها في الأعلى
أجل لا يمكن إستخدام أكثر من prefix، لكن يمكن إستخدام param، كمثال، في صفحة RouteServiceProvider.php ضمن حدث mapWebRoutes أضف :
'prefix' => '{lang}',
إذا كنت تستخدم Controller فضمن methods داخله يمكن فقط كتابة :
public function anyMethod($lang)
{
dd($lang);
}
جرب وستظهر لك اللغة المختارة في رابط! والتي وضعنا أنها ستكون كـ param، ويمكن جلبها بسهولة ضمن أي حدث ضمن Group التابع لـ prefix اللغة .
بخصوص هل يمكن جلب الـ param ضمن middleware أجل يمكن ذلك عبر :
$request->lang
بالنسبة للنقطة الثانية فأحتاج أحياناً للعمل مباشراً بدون سابقة اللغة كما في لوحة التحكم.
لا مشكلة! في صفحة RouteServiceProvider.php قم بإضافة حدث جديد بأسم mapAdminRoutes وحدد له ملف جديد باسم admin.php ضمن مجلد routes، وغير perfix إلى :
protected function mapAdminRoutes()
{
Route::group([
'middleware' => 'admin',
'namespace' => $this->namespace . "\Admin",
'prefix' => 'admin-panel', // مثلاً
], function ($router) {
require base_path('routes/admin.php');
});
}
وقم بإضافته لأول حدث في نفس الصفحة map :
$this->mapAdminRoutes();
وبذلك يمكنك العمل بشكل منفصل عن باقي الروابط في الموقع، النسخة 5.3 تتيح تحكم بالروابط بملفات منفصلة وبطرق عدة!