我想检测他们打开网站的客户所在国家/地区或获取浏览器推荐的语言。
例如,如果您在日本打开浏览器,它将为我提供当前用户打开的国家代码或国家/地区名称,如“en-jp”或“japan”。
搜索之后我发现“Zend Framework”具有在Zend_locale中检测用户/环境的功能。
所以我想知道我是否可以在laravel 4中做同样的事情,或者如果没有你在任何方法(php,javascript,check ip等)中建议的解决方案?
先谢谢你。
答案 0 :(得分:13)
好的,我知道我的问题的答案如下:
如何检测客户所在国?
据我所知,我们需要使用geoIP服务来检测客户端IP,它可以告诉客户端使用的位置(例如maxmind)
但这不是检测和改变我的网站语言的解决方案,如果你在laravel 4中寻找这个解决方案,我会在下一个问题中向你展示
如何检查客户端想要使用的语言? (laravel4中的语言环境)
总结一下,我找到了一些方法可以通过以下方式获得客户想要使用的语言:
$_SERVER['HTTP_ACCEPT_LANGUAGE']
中的HTTP标头(HTTP_ACCEPT_LANGUAGE)等于laravel4中的Request::server('HTTP_ACCEPT_LANGUAGE')
。这些标题告诉我们当前客户端浏览器想要使用的语言。
直接请求 - 在这种情况下,我们将从客户端直接请求他们想要使用哪种语言。举个简单的例子就像我们给他们一样
<select>
<option val="en">English</option>
<option val="th">Thailand</option>
</select>
他们从中选择通过网址发送到服务器Ex:www.Test.com/en
Cookies(可选) - 我们可以从浏览器获取cookie,我们提供当前用户最后使用的语言。我们必须在他们第一次访问网站后发送cookie。
在使用它之前,我将支持语言数组存储在app / config / app.php中,方法如下:
'languages' => array('en','th','jp'),
所有这些我修改了app / filter.php中的代码,以便通过以下方式获取所有上述数据并使用我的应用进行处理:
App::before(function($request){
// 1. get the request langugage
$url_lang = Request::segment(1);
// 2. get Cookie langugage
$cookie_lang = Cookie::get('language');
// 3. Get the Browser Request language
$browser_lang = substr(Request::server('HTTP_ACCEPT_LANGUAGE'), 0, 2);
// 4. Start Checking the request language
// Check that Language tha request is support or not?
if(!empty($url_lang) AND in_array($url_lang, Config::get('app.languages')))
{
// Check whether the request url lang not same as remember in cookies
if($url_lang != $cookie_lang)
{
// Cookie::forever('language',$url_lang);
Session::put('language', $url_lang);
}
// Set the App Locale
App::setLocale($url_lang);
}
// Check that has Language in Forever Cookie and is it support or not?
else if(!empty($cookie_lang) AND in_array($cookie_lang, Config::get('app.languages')))
{
// Set App Locale
App::setLocale($cookie_lang);
}
// Check the browser request langugae is support in app?
else if(!empty($browser_lang) AND in_array($browser_lang, Config::get('app.languages')))
{
// Check whether the request url lang not same as remember in cookies
if($browser_lang != $cookie_lang)
{
// Cookie::forever('language',$browser_lang);
Session::put('language', $browser_lang);
}
// Set Browser Lang
App::setLocale($browser_lang);
}
else
{
// Default Application Setting Language
App::setLocale(Config::get('app.locale'));
}});
在应用程序发生之后:
App::after(function($request, $response){
$lang = Session::get('language');
if(!empty($lang))
{
// Send The language Cookies
$response->withCookie(Cookie::forever('language',$lang));
}
});
希望这会帮助你。
答案 1 :(得分:3)
我将此Ip2Country
用于Laravel 4.2,它可以根据给定的IP地址检索用户所在国家/地区。创建一个利用MaxMind GeoIP数据的本地数据库,因此不需要运行时外部API调用。
答案 2 :(得分:0)
我没有试过这个包,但你可以使用这个:
https://github.com/webpatser/laravel-countries
如果这不能满足您的所有需求,您可以将其与内置的App :: setLocale('en')结合使用;
参考:
http://cheats.jesse-obrien.ca
答案 3 :(得分:0)
说欧姆89! 我使用以下技术捕获优先级用户语言并以您的语言显示我的网站:
1º - 我在app.php中创建了两个新数组,alt_langs(由我的网站支持)和locale_prefix(语言前缀为url):
'locale' => 'pt', // Default is en.
'alt_langs' => array ('pt', 'en', 'es'), // Supported by my site
'locale_prefix' => '', // Dinamic array.
2º - 在routes.php文件中:
// Get the first segment url, ex.: mysite.com/pt and put this in locale_prefix array item:
if (in_array(Request::segment(1), Config::get('app.alt_langs'))) {
App::setLocale(Request::segment(1));
Config::set('app.locale_prefix', Request::segment(1));
}
// Here i usin the prexix to show right language site:
Route::group(array('prefix'=>Config::get('app.locale_prefix')), function()
{
Route::get('', array('uses' => 'HomeController@index'));
});
// And here i usin the http_accept_language to redirect him to default browser language:
Route::get('/', function(){
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
return Redirect::to($lang);
});
我希望我有所帮助.o /