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

Localization في لارافيل لا تعمل

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

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

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...