我正在使用 Laravel Lang 类来本地化我的网络应用程序。我已将两种语言添加到application/config/application.php
. 这会将其用于本地化的默认语言更改为 URI 的第一部分所指示的任何语言(例如 bla.com/en/bla 和 bla.com/co/bla)。现在我需要能够检查我认为当前的默认语言是什么。但是,就我所知,Lang 类无法检查这一点,因为Lang::$language
变量是受保护的。除了手动解析URI之外,还有什么方法可以检查吗?
11 回答
在 Laravel 中了解您网站当前语言的最简洁方法似乎是:
Lang::locale();
https://laravel.com/api/5.8/Illuminate/Translation/Translator.html#method_locale
它与返回您网站的默认语言的命令不同:
Config::get('app.locale');
另一种更短的方法可能是使用这样的东西:
app()->getLocale()
这样做的好处是 PHPStorm 等 IDE 可以识别此功能,可以帮助您更快地开发。
BenjaminRH 的回答非常好,他建议的方法非常有效。我对片段进行了一些改进。现在它检测浏览器语言并根据应用程序的配置文件检查是否支持该语言。
这是一个快速破解,但它适用于我的应用程序。请注意,现在也设置了应用程序语言。随意使用矿石改进它。
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);
}
});
在较新的 Laravel 版本中,您可以通过以下方式获取当前语言:
Config::get('app.locale');
这会很好用
lang="{{ app()->getLocale() }}"
我已经找到了语言问题的解决方案(感谢 IRC 上的 nickstr 和对这个问题的公认答案)。它涉及将当前语言存储为会话变量,该变量会在语言 uri 段更改时更新。
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);
}
});
这可能会有所帮助。配置::get('application.language')
您可以使用
https://github.com/mcamara/laravel-localization
Laravel 本地化使用为请求提供的 URL。为了达到这个目的,应该在 routes.php 文件中添加一个组。它将过滤所有必须本地化的页面。
// 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 **/
将此组添加到路由文件后,用户可以访问添加到“languagesAllowed”中的所有语言(默认为“en”和“es”,查看配置部分以更改该选项)。例如,用户现在可以使用以下地址访问两种不同的语言:
我使用App::getLocale()
这可能是最受支持的方式,因为该App::setLocale('EN')
方法在文档中使用。
您可以在任何地方使用此方法。如果它在某处发生错误,您可以使用\App::...
它来使其工作。
我正在使用 Laravel 5.0。
您可以通过以下方式在 laravel Blade 中获取当前语言:
{{Lang::locale()}}
该Lang
课程专门用于输出正确的语言,正如您所说,它在内部管理语言。
纵观 API,没有任何方法可以直接帮助您解决此问题,并且解析 URI 以获取语言似乎是适当的做法。
您总是可以这样做来检索 URI 中的语言字符串:
$language = URI::segment(1);