2014-02-09 3 views
4

Я хочу определить страну или локализацию моего клиента, на которой они открывают веб-сайт или получают рекомендованный браузером язык.Как определить страну клиента, локаль в laravel 4

Например, если вы открываете браузер в Японии, это даст мне код страны или название страны, которую открыл текущий пользователь, например, "en-jp" или "japan".

После поиска Я выяснил, что «Zend Framework» имеет функцию обнаружения пользователя/окружающей среды в Zend_locale.

Так что я задаюсь вопросом, могу ли я сделать то же самое в laravel 4, или если не какое решение вы предлагаете в любом методе (php, javascript, проверка ip и т. Д.)?

Благодарим вас за продвижение.

ответ

13

Хорошо я знаю ответы на мои вопросы следующим образом:

  1. Как определить страну клиента?

    Насколько я знаю, что мы должны использовать GeoIP сервис для обнаружения IP клиента, который может сказать, где клиент, используя из (например maxmind)

    Но это не решение, чтобы обнаружить и изменить свой язык веб-сайта, если вы ищете это решение в laravel 4 В следующем вопросе я покажу вам

  2. Как проверить язык, который хочет использовать клиент? (Локали в laravel4)

    В Подведите итог я нашел несколько способов, которые могут получить какой язык, который клиент хочет использовать следующий:

    1. HTTP Header (HTTP_ACCEPT_LANGUAGE) в $_SERVER['HTTP_ACCEPT_LANGUAGE'] равной Request::server('HTTP_ACCEPT_LANGUAGE') в laravel4. Какой из этих заголовков указывает нам язык, который хочет использовать текущий клиентский браузер.

    2. Прямой запрос - в этом состоянии мы получим прямой запрос от клиента, какой язык они хотят использовать. Для простого примера, как мы даем им

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

      И они выбирают из него отправить на сервер с помощью URL-адреса Ex: www.Test.com/en

    3. Печенье (по желанию) - Мы можем получить куки-файлы из браузера, которые мы предоставляем для текущего пользователя. Который мы должны отправить куки-файлы после того, как они впервые посетили сайт.

Перед тем, как использовать его хранить массив Поддержка языков в приложение/Config/приложения.PHP следующими:

'languages' => array('en','th','jp'), 

все это я изменить код в приложение/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)); 
} 
}); 

Надеюсь, это поможет вам.

+0

Возможно, заголовок HTTP_ACCEPT_LANGUAGE отсутствует. В этом случае вы можете попытаться получить язык пользователя из заголовка HTTP_USER_AGENT с регулярным выражением. – vinsa

0

Я не пробовал этот пакет, но вы, вероятно, может использовать это:
https://github.com/webpatser/laravel-countries

Если это не получить вам все, что вам нужно, вы можете, вероятно, объединить его с помощью встроенного в App :: Setlocale ('ан');
Реферировано в:
http://cheats.jesse-obrien.ca

+0

Спасибо за ваш ответ. Но я уже тестирую этот пакет, и я думаю, что он дает только базу данных стран, но не обнаруживает локализацию клиента. Но если я ошибся, скажите мне. Большое спасибо. – ohm89

3

Я использую этот Ip2Country для Laravel 4.2, который может извлекать страну-пользователя на основе заданного IP-адреса. Создает локальную базу данных, в которой используются данные MaxMind GeoIP, поэтому внешние вызовы API не запускаются.

https://github.com/smalldogs/ip2country

+0

Это блестяще Спасибо большое. Я буду смотреть в него. – ohm89

+0

Он работает только с адресами IPv4. – vinsa

+0

Это несовместимо для Laravel 5.4 – Fabiotk

0

Говорит ohm89! я использовал следующую технику, чтобы захватить приоритет пользователя linguam и показать мой сайт на вашем языке:

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' => '[email protected]'));  
}); 

// 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); 
}); 

Я надеюсь, что у меня есть helped.o/

Смежные вопросы