2010-02-23 41 views
13
<?php 
$language = $_SERVER['HTTP_ACCEPT_LANGUAGE']; 
echo $language; 
?> 

Khi tôi sử dụng Firefox để kiểm tra khối mã này, tôi nhận được en-us,en;q=0.7,ja;q=0.3,

khi tôi sử dụng IE để kiểm tra khối mã, tôi nhận được zh-cn.

Giá trị của $_SERVER['HTTP_ACCEPT_LANGUAGE'] là một chuỗi? Làm thế nào để xác định xem ngôn ngữ ưa thích là tiếng Trung hay tiếng Nhật? Làm cách nào tôi có thể viết cụm từ thông dụng để nhận ngôn ngữ từ giá trị của $_SERVER['HTTP_ACCEPT_LANGUAGE']?

+1

Tôi chỉ muốn nhận được ngôn ngữ có hi ưu tiên ghest. – Steven

+0

HOẶC: chức năng người dùng từ plugin wordpres: http: // wordpress.org/support/topic/wp_multilingual-and-http_accept_language – user956584

Trả lời

25

Có, giá trị của $_SERVER['HTTP_ACCEPT_LANGUAGE'] là một chuỗi - xem $_SERVER.

nội dung của nó được gửi bởi trình duyệt - điều này giải thích lý do tại sao bạn sẽ có được kết quả khác nhau tùy thuộc vào trình duyệt bạn đang sử dụng: rất có thể, Firefox của bạn được cấu hình để yêu cầu các trang bằng tiếng Anh (ưu tiên cao) hoặc japanese (mức độ ưu tiên thấp), trong khi IE của bạn được định cấu hình để yêu cầu các trang bằng tiếng Trung Quốc.

Đây là bởi vì đó HTTP header có thể chứa:

  • danh sách ngôn ngữ
  • optionnaly, với mã vùng
  • với các ưu tiên liên quan.

Ý tưởng là máy chủ phải trả lời, sử dụng ngôn ngữ phù hợp với "tốt nhất" theo yêu cầu của người dùng.


Về phân tích tiêu đề đó, điều này blog-bài có thể là một đọc thú vị: Parse Accept-Language to detect a user's language

Có một phần của mã đề xuất để phân tích rằng HTTP header - và nó tạo ra một mảng trông như thế này (trích dẫn):

Array 
(
    [en-ca] => 1 
    [en] => 0.8 
    [en-us] => 0.6 
    [de-de] => 0.4 
    [de] => 0.2 
) 

đó là một loạt các ngôn ngữ, được sắp xếp theo ưu tiên, thứ tự giảm dần - mà có lẽ là những gì bạn muốn.

+0

Phương pháp này phức tạp. Tôi muốn một giải pháp đơn giản. Tôi chỉ muốn phát hiện tiếng Nhật, tiếng Trung và tiếng Anh. Tôi đối xử với en-ca và en-us giống nhau, chỉ là tiếng Anh. – Steven

+0

Có lẽ tôi có thể sử dụng strpos, tôi sẽ thử nó. – Steven

3

Tôi chỉ sử dụng explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']) để nhận được ngôn ngữ có thể đầu tiên mà khách hàng của tôi có thể sử dụng. Nó hoạt động tốt trên chrome và IE 10. Không chắc chắn nếu nó sẽ là sai trên các trình duyệt khác.

2

thử điều này:

function getUserBaseLanguage() { 
    global $_SERVER; 
    $accept_languages   = $_SERVER['HTTP_ACCEPT_LANGUAGE']; 
    $accept_languages_arr  = explode(",",$accept_languages); 
    foreach($accept_languages_arr as $accept_language) { 
     preg_match ("/^(([a-zA-Z]+)(-([a-zA-Z]+)){0,1})(;q=([0-9.]+)){0,1}/" , $accept_language, $matches); 
     if (!$matches[6]) $matches[6]=1; 
     $result[$matches[1]] = array(
      'lng_base' => $matches[2], 
      'lng_ext' => $matches[4], 
      'lng'  => $matches[1], 
      'priority' => $matches[6], 
      '_str'  => $accept_language, 
     ); 
    } 
    return $result; 
} 

print_r(getUserBaseLanguage()); 

đầu ra:

Array 
(
[pl] => Array 
    (
     [lng_base] => pl 
     [lng_ext] => 
     [lng] => pl 
     [priority] => 1 
     [_str] => pl 
    ) 

[en-US] => Array 
    (
     [lng_base] => en 
     [lng_ext] => US 
     [lng] => en-US 
     [priority] => 0.7 
     [_str] => en-US;q=0.7 
    ) 

[en] => Array 
    (
     [lng_base] => en 
     [lng_ext] => 
     [lng] => en 
     [priority] => 0.3 
     [_str] => en;q=0.3 
    ) 

) 
+0

hoạt động tốt! cảm ơn! – MortisQc

Các vấn đề liên quan