اذهب إلى المحتوى

السؤال

نشر

ثمت بإنشاء 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');

ولكن عند توجيه المسارات إلى لغة معيّنة لا يتم تغيير الغة. وأيضاً ماهي الطريقة لتغيير إلى أكثر من لغة من جهة المستخدم؟

Recommended Posts

  • 1
نشر

يجب أولاً أن تقوم بتغيير الكود الموجود في المتحكم لاستخدام لغة افتراضية في حال الفشل، كالتالي:

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');

 

  • 0
نشر

تأكد من إضافة 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
نشر

يُمكن أيضاً إستخدام حزمة 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>

لمعلومات أكثر يُمكنك تصفح توثيق الحزمة.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...