2011-09-19 2 views
2

나는 영어/스페인어의 언어를 변경하기 위해 "? lang = en"또는 "? lang = es"를 추가해야하므로 내 사이트를 설정했습니다.PHP 또는 htaccess가 Accept-Language로 URL을 다시 쓰시겠습니까?

예 : "http://domain.com/something/something_else?lang=es"으로 사이트에 들어가면 해당 언어로 사이트를 계속 탐색 할 수 있도록 쿠키가 설정됩니다.

브라우저의 "Accept-Language"값으로 내 사용자를 리디렉션하고 싶지만 원하는 경우 다른 언어로 계속 사이트를 탐색 할 수 있습니다.

가장 좋은 방법은 무엇입니까? .htaccess는 언어 선택시 설정된 쿠키와 함께 작동합니까?

편집 :

EDIT2 : 아, 난 그냥 "EN"이 있고 "ES"언어 여기에 바울의 대답은 내 업데이트 된 코드입니다./

if (isset($_GET["lang"])) 
     $this->setLanguage($_GET["lang"]); 
    elseif (isset($_COOKIE["language"])) 
     $this->setLanguage($_COOKIE["language"]); 
    elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) 
     { 
     // Parse the Accept-Language according to: 
     // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4 
     preg_match_all(
      '/([a-z]{1,8})' . // First part of language e.g en 
      '(-[a-z]{1,8})*\s*' . // other parts of language e.g -us 
      // Optional quality factor 
      '(;\s*q\s*=\s*((1(\.0{0,3}))|(0(\.[0-9]{0,3}))))?/i', 
      $_SERVER['HTTP_ACCEPT_LANGUAGE'], 
      $langParse); 

     $langs = $langParse[1]; 
     $quals = $langParse[4]; 

     $numLanguages = count($langs); 
     $langArr = array(); 

     for ($num = 0; $num < $numLanguages; $num++) 
     { 
      $newLang = strtoupper($langs[$num]); 
      $newQual = isset($quals[$num]) ? 
       (empty($quals[$num]) ? 1.0 : floatval($quals[$num])) : 0.0; 

      // Choose whether to upgrade or set the quality factor for the 
      // primary language. 
      $langArr[$newLang] = (isset($langArr[$newLang])) ? 
       max($langArr[$newLang], $newQual) : $newQual; 
     } 

     // sort list based on value 
     arsort($langArr, SORT_NUMERIC); 
     $acceptedLanguages = array_keys($langArr); 
     $preferredLanguage = reset($acceptedLanguages); 

     $this->setLanguage($preferredLanguage); 
    } 
    else 
     $this->setLanguage("en"); 

답변

2

내가 PHP에서이 작업을 수행 :이 코드는 사이에이 두 가지를 선택하거나 ... 기본 설정 wpuld 어떻게에 확실하지 않다. 수락 - 언어는 복잡한 것입니다. 브라우저는 수용하고자하는 언어를 두 개 이상 제안 할 수 있습니다. 각 언어는 선호하는 품질 요소를 나타냅니다. 내 사이트의 경우 표시 할 기본 언어가 있습니다 (수락 언어가 번역 목록에없는 경우 표시됨). 그렇지 않으면 언어가 설정되지 않은 경우 (setLang) Accept-Language을 구문 분석하여 브라우저에 가장 적합한 언어를 선택합니다. 내가 사용하는 함수는 아래와 같습니다 (쿠키 설정을위한 세션 관리자가 포함되어 있습니다 만, $ _SESSION [etc] = $ foo;에 대한 직접 호출로 다시 구현할 수 있습니다).

편집가 : 불행히도 내 웹 사이트 만이 아니라 기본 언어 (EN, ES, FR)에 대한 번역을 가지고 (ko 페이지는 EN_GB, es_MX, ES_ES) 그래서 기본 언어에 대한 이들에 규정 된 최고 품질의 요소를 선택 .

public function setLanguage($setLang='') 
    { 
     if (!empty($setLang)) 
     { 
     $this->setup['Session']->set($this->setup['Lang_Key'], $setLang); 
     } 
     else 
     { 
     if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) 
     { 
      // Parse the Accept-Language according to: 
      // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4 
      preg_match_all(
       '/([a-z]{1,8})' . // First part of language e.g en 
       '(-[a-z]{1,8})*\s*' . // other parts of language e.g -us 
       // Optional quality factor 
       '(;\s*q\s*=\s*((1(\.0{0,3}))|(0(\.[0-9]{0,3}))))?/i', 
       $_SERVER['HTTP_ACCEPT_LANGUAGE'], 
       $langParse); 

      $langs = $langParse[1]; 
      $quals = $langParse[4]; 

      $numLanguages = count($langs); 
      $langArr = array(); 

      for ($num = 0; $num < $numLanguages; $num++) 
      { 
       $newLang = strtoupper($langs[$num]); 
       $newQual = isset($quals[$num]) ? 
        (empty($quals[$num]) ? 1.0 : floatval($quals[$num])) : 0.0; 

       // Choose whether to upgrade or set the quality factor for the 
       // primary language. 
       $langArr[$newLang] = (isset($langArr[$newLang])) ? 
        max($langArr[$newLang], $newQual) : $newQual; 
      } 

      // sort list based on value 
      arsort($langArr, SORT_NUMERIC); 
      $acceptedLanguages = array_keys($langArr); 
      $preferredLanguage = reset($acceptedLanguages); 

      $this->setup['Session']->set(
       $this->setup['Lang_Key'], $preferredLanguage); 
     } 
     else 
     { 
      $this->setup['Session']->set(
       $this->setup['Lang_Key'], $this->setup['Default_Language']); 
     } 
     } 

     return $this->setup['Session']->get($this->setup['Lang_Key']); 
    } 
+0

고마워 폴 .. 내 질문을 코드로 업데이트했지만 사용 방법이 확실하지 않습니다. 나는 PHP 코딩에서 꽤 새로운데, 내가 뭘 잘못하고 있는지 확인할 수 있니? 어떤 경우에도 코드를 공유해 주셔서 감사합니다! – Santiago

+0

Language-Accept 헤더를 구문 분석하는 관련 PHP 함수 여기에 더 긴 대답을 넣어 두었습니다. [301 홈 페이지의 서체 및 탐정 브라우저 언어에 대한 더 나은 방법은 무엇입니까?] (http : // stackoverflow.co.kr/questions/8091296/301-home-page/8091897 # 8091897에 대한 현서 및 검색 브라우저 언어에 대한 더 나은 방법 – hakre

0

나는 PHP로 이것을한다. 수락 - 언어는 복잡한 것입니다. 브라우저는 수용하고자하는 언어를 두 개 이상 제안 할 수 있습니다. 각 언어는 선호하는 품질 요소를 나타냅니다.

불행히도 내 웹 사이트는 (en_US, en_GB, es_MX, es_ES)가 아닌 기본 언어 (EN, ES, FR) 만 번역하므로 기본 언어로 지정된 최고 품질 요소를 선택합니다.

다음은 코드에서 대부분 또는 모든 종속성을 제거해야하는 테스트되지 않은 편집입니다. 죄송합니다. 이전 답변에 혼란 스러웠습니다. 몇 가지 언어에 대한 점검이 다른 곳에서 이루어지면서 제 기능에 대한 호출이있었습니다. 아래의 코드는 세션 언어 변수를 설정해야합니다.이 변수는 올바른 번역을 결정하기 위해 다른 곳에서 사용해야합니다.

내 이전 답변보다 훨씬 복잡해 보이지만 오랫동안 내 자신의 코드에서이를 구현해야합니다. 특정 번역 (EN_US, EN_GB)이 필요한 사람들은 preg_match_all의 Match 2를 고려하여 아래 코드를 수정해야합니다.

$websiteLanguages = array('EN', 'ES'); 
session_start(); 

// The user wants a specific language regardless of their accept settings. 
if (isset($_GET["lang"])) 
{ 
    $_SESSION["language"] = $_GET["lang"]; 
    return; 
} 

// A language has already been decided upon. 
if (isset($_SESSION["language"])) 
{ 
    return; 
} 

// No language has been chosen we should choose from the accept language. 
if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) 
{ 
    // Parse the Accept-Language according to: 
    // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4 
    preg_match_all(
     '/([a-z]{1,8})' . // M1 - First part of language e.g en 
     '(-[a-z]{1,8})*\s*' . // M2 -other parts of language e.g -us 
     // Optional quality factor M3 ;q=, M4 - Quality Factor 
     '(;\s*q\s*=\s*((1(\.0{0,3}))|(0(\.[0-9]{0,3}))))?/i', 
     $_SERVER['HTTP_ACCEPT_LANGUAGE'], 
     $langParse); 

    $langs = $langParse[1]; // M1 - First part of language 
    $quals = $langParse[4]; // M4 - Quality Factor 

    $numLanguages = count($langs); 
    $langArr = array(); 

    for ($num = 0; $num < $numLanguages; $num++) 
    { 
     $newLang = strtoupper($langs[$num]); 
     $newQual = isset($quals[$num]) ? 
      (empty($quals[$num]) ? 1.0 : floatval($quals[$num])) : 0.0; 

     // Choose whether to upgrade or set the quality factor for the 
     // primary language. 
     $langArr[$newLang] = (isset($langArr[$newLang])) ? 
      max($langArr[$newLang], $newQual) : $newQual; 
    } 

    // sort list based on value 
    // langArr will now be an array like: array('EN' => 1, 'ES' => 0.5) 
    arsort($langArr, SORT_NUMERIC); 

    // The languages the client accepts in order of preference. 
    $acceptedLanguages = array_keys($langArr); 

    // Set the most preferred language that we have a translation for. 
    foreach ($acceptedLanguages as $preferredLanguage) 
    { 
     if (in_array($preferredLanguage, $websiteLanguages)) 
     { 
      $_SESSION['Language'] = $preferredLanguage; 
      return; 
     } 
    } 
} 

// We will have returned by now if a language could be chosen, otherwise use 
// our default language. 
$_SESSION['Language'] = "EN"; 
관련 문제