كيف يمكنني العثور على اللغة الحالية في عرض لارافيل?
-
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 **/
بمجرد إضافة هذه المجموعة إلى ملف المسارات ، يمكن للمستخدم الوصول إلى جميع اللغات المضافة إلى 'اللغات المسموح بها' ('إن' و 'إس' للافتراضي ، انظر إلى قسم التكوين لتغيير هذا الخيار).على سبيل المثال ، يمكن للمستخدم الآن الوصول إلى لغتين مختلفتين ، باستخدام العناوين التالية:
أنا استخدم App::getLocale()
والتي ربما تكون الطريقة الأكثر دعما مثل App::setLocale('EN')
يتم استخدام الطريقة في الوثائق.
يمكنك استخدام هذه الطريقة في كل مكان.إذا حدث خطأ في مكان ما ، يمكنك استخدام \App::...
لجعلها تعمل.
أنا باستخدام لارافيل 5.0.
ال Lang
الطبقة هي على وجه التحديد لإخراج اللغة الصحيحة وكما تقول تدير اللغة داخليا.
تبحث من خلال أبي لا توجد طريقة لمساعدتك مباشرة مع هذا وتحليل أوري للحصول على اللغة يبدو المسار المناسب للعمل.
يمكنك دائما القيام بذلك فقط لاسترداد سلسلة اللغة في أوري:
$language = URI::segment(1);