Amir Alsaeed نشر 26 فبراير 2021 أرسل تقرير نشر 26 فبراير 2021 ثمت بإنشاء middleware التالي للتحكم بلغات الموقع: public function handle($request, Closure $next) { if(Session::has('locale')) { $locale = Session::get('locale',Config::set('app.locale')); } else { $locale = "ar"; } App::setLocale($locale); return $next($request); } والمتحكم الذي يقوم بتغيير اللغة: public function changeLang(Request $request,$lang) { if (!empty($request)) { Session::put('locale',$lang); } else { Session::set('locale',$lang); } return back(); } والمسار لذلك: Route::get('/{lang}','LanguageController@changeLang'); ولكن عند توجيه المسارات إلى لغة معيّنة لا يتم تغيير الغة. وأيضاً ماهي الطريقة لتغيير إلى أكثر من لغة من جهة المستخدم؟ اقتباس
1 Sam Ahw نشر 26 فبراير 2021 أرسل تقرير نشر 26 فبراير 2021 يجب أولاً أن تقوم بتغيير الكود الموجود في المتحكم لاستخدام لغة افتراضية في حال الفشل، كالتالي: public function handle($request, Closure $next) { if (Session::has('locale')) { App::setLocale(Session::get('locale')); } else { //تقوم لارافيل تلقائياً باستعادة اللغة الافتراضية الموجودة App::setLocale(Config::get('app.fallback_locale')); } return $next($request); } ثم تأكد من إضافة middleware في Kernal.php: \App\Http\Middleware\Language::class, وأخيراً ضمن المتحكم الخاص باللغة: public function index($locale) { session(['locale' => $locale]); App::setLocale($locale); return Redirect::back(); } وأيضاً يتم تعريف اللغة الافتراضية للتطبيق ضمن ملف .env : APP_LOCALE=en ويتم الدلالة عليها في ملف config/app.php كالتالي: 'locale' => env('APP_LOCALE', 'en'), أما للتغيير إلى أكثر من لغة فيمكن إنشاء قائمة باللغات بحيث عندما يتم الضغط على خيار لغة معيّنة يتم التوجيه إلى مسارات هذه اللغة: <ul class="dropdown-menu" role="menu"> <li>{!! link_to('lang/en', trans('menus.language-picker.langs.en')) !!}</li> <li>{!! link_to('lang/es', trans('menus.language-picker.langs.es')) !!}</li> <li>{!! link_to('lang/fr-FR', trans('menus.language-picker.langs.fr-FR')) !!}</li> <li>{!! link_to('lang/it', trans('menus.language-picker.langs.it')) !!}</li> <li>{!! link_to('lang/pt-BR', trans('menus.language-picker.langs.pt-BR')) !!}</li> <li>{!! link_to('lang/ru', trans('menus.language-picker.langs.ru')) !!}</li> <li>{!! link_to('lang/sv', trans('menus.language-picker.langs.sv')) !!}</li> </ul> ويكون المسار لذلك كالتالي: get('lang/{lang}', 'LanguageController@changeLang'); 1 اقتباس
0 بلال زيادة نشر 27 فبراير 2021 أرسل تقرير نشر 27 فبراير 2021 تأكد من إضافة middleware إلى ملف Kernel.php في المسار التالي app\Http في مصفوفة middlewareGroups كالتالي: 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\Language::class, ], 'api' => [ 'throttle:60,1', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ]; لقد قمنا بإضافة التالي إلى المصفوفة \App\Http\Middleware\Language::class, ويمكنك استدعاء كل لغة مثل <a href="{{ route('changeLang') }}?lang=en" style="cursor: pointer; cursor: hand;">En</a> <a href="{{ route('changeLang') }}?lang=ar" style="cursor: pointer; cursor: hand;">AR</a> اقتباس
0 سمير عبود نشر 27 فبراير 2021 أرسل تقرير نشر 27 فبراير 2021 يُمكن أيضاً إستخدام حزمة Laravel Localization التي تُوفر العديد من الميزات فيما يخص موضوع localization تثبيت الحزمة: composer require mcamara/laravel-localization إستدعاء ملف إعدادات الحزمة ضمن ملفات المشروع: php artisan vendor:publish --provider="Mcamara\LaravelLocalization\LaravelLocalizationServiceProvider" سيتم إنشاء ملف config/laravellocalization.php الذي من خلاله يُمكنك تحديد اللغات التي سيدعمها المشروع بالإضافة إلى بعض الإعدادات الأخرى. إضافة ال middlewares الخاصة بالحزمة ضمن ملف 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 $routeMiddleware = [ /**** 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 ]; } بعد ذلك يُمكنك إستخدام الحزمة: في المسارات: // routes/web.php Route::group(['prefix' => LaravelLocalization::setLocale()], function() { /** المسارات التي تعتمد على عدة لغات **/ }); /** المسارات الأخرى **/ أما في العرض: <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> لمعلومات أكثر يُمكنك تصفح توثيق الحزمة. اقتباس
السؤال
Amir Alsaeed
ثمت بإنشاء middleware التالي للتحكم بلغات الموقع:
public function handle($request, Closure $next) { if(Session::has('locale')) { $locale = Session::get('locale',Config::set('app.locale')); } else { $locale = "ar"; } App::setLocale($locale); return $next($request); }
والمتحكم الذي يقوم بتغيير اللغة:
public function changeLang(Request $request,$lang) { if (!empty($request)) { Session::put('locale',$lang); } else { Session::set('locale',$lang); } return back(); }
والمسار لذلك:
Route::get('/{lang}','LanguageController@changeLang');
ولكن عند توجيه المسارات إلى لغة معيّنة لا يتم تغيير الغة. وأيضاً ماهي الطريقة لتغيير إلى أكثر من لغة من جهة المستخدم؟
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.