如何在laravel 4中检测客户国家/地区

时间:2014-02-09 02:18:40

标签: php localization laravel laravel-4 locale

我想检测他们打开网站的客户所在国家/地区或获取浏览器推荐的语言。

例如,如果您在日本打开浏览器,它将为我提供当前用户打开的国家代码或国家/地区名称,如“en-jp”或“japan”。

搜索之后我发现“Zend Framework”具有在Zend_locale中检测用户/环境的功能。

所以我想知道我是否可以在laravel 4中做同样的事情,或者如果没有你在任何方法(php,javascript,check ip等)中建议的解决方案?

先谢谢你。

4 个答案:

答案 0 :(得分:13)

好的,我知道我的问题的答案如下:

  1. 如何检测客户所在国?

    据我所知,我们需要使用geoIP服务来检测客户端IP,它可以告诉客户端使用的位置(例如maxmind

    但这不是检测和改变我的网站语言的解决方案,如果你在laravel 4中寻找这个解决方案,我会在下一个问题中向你展示

  2. 如何检查客户端想要使用的语言? (laravel4中的语言环境)

    总结一下,我找到了一些方法可以通过以下方式获得客户想要使用的语言:

    1. $_SERVER['HTTP_ACCEPT_LANGUAGE']中的HTTP标头(HTTP_ACCEPT_LANGUAGE)等于laravel4中的Request::server('HTTP_ACCEPT_LANGUAGE')。这些标题告诉我们当前客户端浏览器想要使用的语言。

    2. 直接请求 - 在这种情况下,我们将从客户端直接请求他们想要使用哪种语言。举个简单的例子就像我们给他们一样

      <select> <option val="en">English</option> <option val="th">Thailand</option> </select>

      他们从中选择通过网址发送到服务器Ex:www.Test.com/en

    3. Cookies(可选) - 我们可以从浏览器获取cookie,我们提供当前用户最后使用的语言。我们必须在他们第一次访问网站后发送cookie。

  3. 在使用它之前,我将支持语言数组存储在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调用。

https://github.com/smalldogs/ip2country

答案 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 /