2013-05-07 3 views
3

저는 알고 싶습니다. PHP/javascript에서 현재 클라이언트 OS 언어를 얻는 방법이 있습니까? 나는 $_SERVER["HTTP_ACCEPT_LANGUAGE"]을 사용하려고했지만 때로는 잘못된 언어를 얻습니다.PHP가 현재 클라이언트 OS 언어를 얻습니다

  1. 내 OS : 윈도우 7
  2. 언어 : 구글 크롬에서 예를 들어
    HTTP_ACCEPT_LANGUAGE: zh,en-US;q=0.8,en;q=0.6 
    

    그것은 "에서 zh"고 말했다 : 영어

$_SERVER["HTTP_ACCEPT_LANGUAGE"]를 사용하여 나는이 결과를 얻었다 내 기본 언어.

다른 방법으로 클라이언트 OS 언어를 구할 수 있습니까? 브라우저 언어 설정이 아니라 내가 원했던 것이기 때문입니다. 감사합니다

+2

'zh' 브라우저가 그 나라에 살고 있음을 감지했습니다 때문입니다 따라서 당신이받을한다 그 언어를 기본 언어로 사용하십시오. Chrome은 가능한 한 사용자를 돕기 위해이 작업을 수행합니다 (Google 검색 결과 포함, 주변의 주요 도시를 기반으로 할 것입니다.) 내 사이트는 스톡홀름이며 주변에도 살지 않습니다. 그렇습니다. 나는 잘 알고 있습니다. IP/호스트 네임 기반의 많은 지리 정보 검색이지만 기능의 기준이됩니다.) – Torxed

+3

* "zh"는 제 1 언어입니다. * - 아닙니다. 'zh'는 명백한 품질 값을 가지지 않기 때문에 '1.0'품질을가집니다. 이것은'en-US'와 같은 품질이며, 따라서'zh'와'en-US'는 같은 가중치를가집니다. – Quentin

+0

@Quentin이 옳습니다. 아마도 사용자 에이전트 문자열에서 뭔가를 얻을 수 있습니다. –

답변

1

IE에서 javascript를 통해 보냅니까?

  • navigator.browserLanguage : 브라우저 언어
  • navigator.systemLanguage : Windows 시스템 언어
  • navigator.userLanguage : 윈도우 사용자 고유의 언어

덕분에 : 하나의 당신 외에 유일한 방법이다 Is there anyway to detect OS language using javascript?

고객의 언어를 얻으려는 경우 OS, PHP는 서버에 의해 실행되며 그 밖의 것은 없습니다.

PHP 정렬 기능을 작성하십시오.

HTTP_ACCEPT_LANGUAGE: zh,en-US;q=0.8,en;q=0.6 

zhen-US은 품질이 두 언어에서 동일 경우 EN-US에 가장 높은 언어 값 및 기본 정렬 할 수 있다는 것을 의미, 같은 q= 값을 공유 할 수 있습니다.

@Quentin이 편집 바로 전에 댓글 섹션에서 언급 한 것을 알게되었습니다. 잘하셨습니다. 선생님! 목업

:

$languages = $_SERVER['HTTP_ACCEPT_LANGUAGE']; 
$default = 'en-US'; 
/* 
* magic split and structure the language into a array sorted by quality 
* 
* $languages_sorted_by_quality = array(0.8 => ('zh', 'en-US')); 
*/ 
$top_languages = max($languages_sorted_by_quality); 
if (isset($top_languages[$default])) { 
    $language = $default; 
else 
    $language = $top_languages[0]; 
+0

IE에서만 사용 가능합니다. 아는 한, 모든 주요 브라우저에서 작동하는 OS 언어를 식별 할 방법이 없습니다. –

+0

정확하고, 아마 언급 했어야합니다. 당신은'HTTP_ACCEPT_LANGUAGE'에 정렬 함수를 만들어야 할 것입니다. – Torxed

0

은이 기능을 시도

+0

경고 : 내가 아는 한, PHP 함수는 제대로 구현되지 않았고 결과가 좋지 않습니다. – Terence

+0

구현이 잘 안되지만 기능이있는 주석 만 잘 작성되었습니다. – unasAquila

4

http_negotiate_language 시도가

function getUserLanguage() { 
$langs = array(); 
if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { 
// break up string into pieces (languages and q factors) 
preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', 
$_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse); 
if (count($lang_parse[1])) { 
// create a list like â??enâ?? => 0.8 
$langs = array_combine($lang_parse[1], $lang_parse[4]); 
// set default to 1 for any without q factor 
foreach ($langs as $lang => $val) { 
if ($val === '') $langs[$lang] = 1; 
} 
// sort list based on value 
arsort($langs, SORT_NUMERIC); 
} 
} 
//extract most important (first) 
foreach ($langs as $lang => $val) { break; } 
//if complex language simplify it 
if (stristr($lang,"-")) {$tmp = explode("-",$lang); $lang = $tmp[0]; } 
return $lang; 
} 
관련 문제