كيف يمكنني العثور على اللغة الحالية في عرض لارافيل?

StackOverflow https://stackoverflow.com//questions/12706463

  •  13-12-2019
  •  | 
  •  

سؤال

أنا باستخدام فئة لارافيل لانغ لتوطين بلدي التطبيق على شبكة الإنترنت.لقد أضفت لغتين إلى مجموعة اللغات في application/config/application.php.يؤدي هذا إلى تغيير اللغة الافتراضية التي يستخدمها للتوطين إلى أي جزء يشير إليه الجزء الأول من أوري (على سبيل المثال.bla.com/en/bla و bla.com/co/bla).الآن أنا بحاجة إلى أن تكون قادرة على التحقق من ما هي اللغة الافتراضية الحالية في رأيي.ومع ذلك ، فإن فئة لانغ لا توفر أي وسيلة للتحقق من هذا بقدر ما كنت قادرا على معرفة ، كما Lang::$language المتغير محمي.هل هناك أي طريقة للتحقق من هذا بصرف النظر عن تحليل أوري يدويا?

هل كانت مفيدة؟

المحلول

إجابة بنجامينره جيدة جدا ، ونهجه المقترح يعمل بشكل مثالي.لقد قمت بتحسين المقتطف قليلا.الآن يكتشف لغة المتصفح ويتحقق مما إذا كانت هذه اللغة مدعومة وفقا لملف تكوين التطبيق.

إنه اختراق سريع ، لكنه يعمل على تطبيقي.لاحظ أنه تم تعيين لغة التطبيق الآن أيضا.لا تتردد في استخدام خام تحسينه.

Route::filter('before', function()
{
    // current uri language ($lang_uri)
    $lang_uri = URI::segment(1);

    // Set default session language if none is set
    if(!Session::has('language'))
    {
        // use lang in uri, if provided
        if(in_array($lang_uri, Config::get('application.languages')))
        {
            $lang = $lang_uri;  
        }
        // detect browser language
        elseif(isset(Request::server('http_accept_language')))
        {
            $headerlang = substr(Request::server('http_accept_language'), 0, 2);

            if(in_array($headerlang, Config::get('application.languages')))
            {
                // browser lang is supported, use it
                $lang = $headerlang;
            }
            // use default application lang
            else
            {
                $lang = Config::get('application.language');
            }
        }
        // no lang in uri nor in browser. use default
        else 
        {
                // use default application lang
                $lang = Config::get('application.language');            
        }

        // set application language for that user
        Session::put('language', $lang);
        Config::set('application.language',  $lang);
    }
    // session is available
    else
    {
        // set application to session lang
        Config::set('application.language', Session::get('language'));
    }

    // prefix is missing? add it
    if(!in_array($lang_uri, Config::get('application.languages'))) 
    {
        return Redirect::to(URI::current());
    }
    // a valid prefix is there, but not the correct lang? change app lang
    elseif(in_array($lang_uri, Config::get('application.languages')) AND $lang_uri != Config::get('application.language'))
    {
        Session::put('language', $lang_uri);
        Config::set('application.language',  $lang_uri);    
    }
});

نصائح أخرى

أنظف طريقة لمعرفة اللغة الحالية لموقع الويب الخاص بك في لارافيل يبدو أن :

Lang::locale();

https://laravel.com/api/5.8/Illuminate/Translation/Translator.html#method_locale

يختلف الأمر عن هذا الأمر الذي سيعيد اللغة الافتراضية لموقع الويب الخاص بك :

Config::get('app.locale');

في الإصدارات لارافيل أحدث ، يمكنك الحصول على اللغة الحالية مع:

Config::get('app.locale');

لقد اكتشفت حلا لمشكلة اللغة (بفضل نيكستر على إيرك والإجابة المقبولة على هذا السؤال).يتضمن تخزين اللغة الحالية كمتغير جلسة ، والذي يتم تحديثه عند تغيير مقطع أوري اللغة.

Route::filter('before', function()
{
    // Do stuff before every request to your application...

    // Default language ($lang) & current uri language ($lang_uri)
    $lang = 'he';
    $lang_uri = URI::segment(1);

    // Set default session language if none is set
    if(!Session::has('language'))
    {
        Session::put('language', $lang);
    }

    // Route language path if needed
    if($lang_uri !== 'en' && $lang_uri !== 'he')
    {
        Return Redirect::to($lang.'/'.URI::current());
    }
    // Set session language to uri
    elseif($lang_uri !== Session::get('language'))
    {
        Session::put('language', $lang_uri);
    }
});

بديل ، طريقة أقصر قليلا يمكن أن تستخدم شيئا من هذا القبيل:

app()->getLocale()

وميزة هذا هو أن إيدس مثل فبستورم التعرف على هذه الوظيفة ويمكن أن تساعدك على تطوير أسرع بكثير.

هذا من شأنه أن يعمل بشكل جيد

lang="{{ app()->getLocale() }}"

هذا قد يساعد.التكوين:: الحصول على ('التطبيق.اللغة')

يمكنك استخدام

https://github.com/mcamara/laravel-localization

يستخدم توطين لارافيل عنوان ورل المعطى للطلب.من أجل تحقيق هذا الغرض ، يجب إضافة مجموعة إلى المسارات.ملف بي إتش بي.سيقوم بتصفية جميع الصفحات التي يجب ترجمتها.

    // app/routes.php

    Route::group(array('prefix' => LaravelLocalization::setLanguage()), function()
    {
        /** ADD ALL LOCALIZED ROUTES INSIDE THIS GROUP **/
        Route::get('/', function()
        {
            return View::make('hello');
        });

        Route::get('test',function(){
            return View::make('test');
        });
    });

    /** OTHER PAGES THAT SHOULD NOT BE LOCALIZED **/

بمجرد إضافة هذه المجموعة إلى ملف المسارات ، يمكن للمستخدم الوصول إلى جميع اللغات المضافة إلى 'اللغات المسموح بها' ('إن' و 'إس' للافتراضي ، انظر إلى قسم التكوين لتغيير هذا الخيار).على سبيل المثال ، يمكن للمستخدم الآن الوصول إلى لغتين مختلفتين ، باستخدام العناوين التالية:

http://laravel.com/en

http://laravel.com/es

http://laravel.com

أنا استخدم App::getLocale() والتي ربما تكون الطريقة الأكثر دعما مثل App::setLocale('EN') يتم استخدام الطريقة في الوثائق.

يمكنك استخدام هذه الطريقة في كل مكان.إذا حدث خطأ في مكان ما ، يمكنك استخدام \App::... لجعلها تعمل.

أنا باستخدام لارافيل 5.0.

ال Lang الطبقة هي على وجه التحديد لإخراج اللغة الصحيحة وكما تقول تدير اللغة داخليا.

تبحث من خلال أبي لا توجد طريقة لمساعدتك مباشرة مع هذا وتحليل أوري للحصول على اللغة يبدو المسار المناسب للعمل.

يمكنك دائما القيام بذلك فقط لاسترداد سلسلة اللغة في أوري:

$language = URI::segment(1);

دراسة طلبات لارافيل

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top