2009-03-06 61 views
9

Làm cách nào để kiểm tra ngôn ngữ của trình duyệt của người dùng bằng PHP?Kiểm tra ngôn ngữ của trình duyệt bằng PHP?

Tôi cần hiển thị một trang khác cho những người ở Hoa Kỳ và Vương quốc Anh.

Tôi đã thử các mã sau đây không thành công

<?php 
if(ereg("us", $_SERVER["HTTP_ACCEPT_LANGUAGE"])) 
    include('http://page.com/us.txt'); 
else 
    include('http://page.com/uk.txt'); 
?> 

tôi chạy một mã cụ thể cho người dân ở Mỹ và cho họ ở Vương quốc Anh.

+0

Bạn có nghĩa là "người ở Mỹ" hay "những người có ngôn ngữ: en-us"? Điều gì sẽ xảy ra khi tôi mang sổ ghi chép en-uk của mình đến Hoa Kỳ của A.? – Piskvor

+0

Tôi chỉ có nghĩa là những người có cài đặt ngôn ngữ là en-us. –

Trả lời

8

có khả năng chỉ là một vấn đề trường hợp nhạy cảm; eregi ('en-us') hoặc preg_match ('/ en-us/i') nên đã chọn nó.

Tuy nhiên, chỉ tìm kiếm ‘en-us’ trong tiêu đề đôi khi có thể đôi khi sai, đặc biệt khi cả hai ngôn ngữ của Hoa Kỳ và Vương quốc Anh đều được liệt kê. "Accept-Language" thực sự là một tiêu đề khá phức tạp, mà thực sự bạn muốn có một trình phân tích cú pháp thích hợp.

Nếu bạn có PECL toàn bộ công việc đã được thực hiện cho bạn: http://www.php.net/manual/en/function.http-negotiate-language.php

Tôi không biết lý do tại sao câu trả lời khác sẽ cho User-Agent tiêu đề; điều này hoàn toàn không có thật. Tác nhân người dùng không bắt buộc phải giữ giá trị ngôn ngữ ở bất kỳ vị trí cụ thể nào và đối với một số trình duyệt (ví dụ: Opera và một số trình duyệt nhỏ mà tôi chưa bao giờ nghe đến có tên là 'Internet Explorer'). Trong đó hiện chứa ngôn ngữ, đó sẽ là ngôn ngữ mà trình xây dựng trình duyệt đã được cài đặt, chứ không phải ngôn ngữ ưa thích của người dùng là những gì bạn nên xem. (Cài đặt này sẽ mặc định ngôn ngữ xây dựng, nhưng có thể được tùy chỉnh bởi người dùng từ giao diện người dùng tùy chọn.)

+0

Bạn muốn thay thế HTTP_USER_AGENT bằng HTTP_ACCEPT_LANGUAGE trong mã trên? –

+0

Nó hoạt động với đề xuất của bạn tốt hơn. Cảm ơn bạn! –

2

A có lẽ cách đáng tin cậy hơn để thực hiện việc này là thực hiện một regex trên chuỗi $_SERVER['HTTP_USER_AGENT'].

<?php 
    if(preg_match('/en-US/', $_SERVER['HTTP_USER_AGENT'])) 
    include('http://page.com/us.txt'); 
    else 
    include('http://page.com/uk.txt'); 
?> 

Bạn không được đảm bảo nhận chuỗi tác nhân người dùng hợp lệ và hữu ích, vì vậy hãy đảm bảo rằng tuyên bố khác có phương án hợp lý.

+0

Tôi nhận được lỗi sau http://dpaste.com/8204/ –

+0

ah, quay. Tôi thấy rằng bạn đã chấp nhận rồi từ chối chấp nhận câu trả lời. Có vẻ như tôi đã quên các dấu gạch chéo về phía trước (như sự hỗn loạn được tìm thấy). – jonstjohn

3

Hãy thử điều này:

<? 
if(preg_match('/en-us/i', $_SERVER['HTTP_USER_AGENT'])) 
    include('http://page.com/us.txt'); 
else 
    include('http://page.com/uk.txt'); 
?> 
+0

Nó hoạt động ngay bây giờ! Làm lệnh của bạn làm cho chúng tôi trở nên khó hiểu? –

+0

HTTP_USER_AGENT sẽ khớp với hầu hết những người có phiên bản * của trình duyệt *. Bạn nên kiểm tra HTTP_ACCEPT_LANGUAGE – Piskvor

+0

Piskvor: Tôi không biết, bản tải xuống chung của Firefox hiển thị dưới dạng en-GB cho tôi. – Ross

1

Đây là giải pháp dựa trên zend. Nó cũng sẽ hoạt động khi bạn thêm các ngôn ngữ khác.

<?php 

include_once "Zend/Locale.php"; 

$zend_locale = new Zend_Locale(Zend_Locale::BROWSER); 

// returns en for English, de for German etc. 
echo $browser_language = $zend_locale->getLanguage(); 
echo "<br />\n"; 
// returns en_US for American English, en_GB for British English etc. 
echo $browser_locale = $zend_locale->toString(); 
echo "<br />\n"; 

Solution nhìn thấy trên:

http://www.mpopp.net/2010/07/how-to-detect-the-users-preferred-language-smarter-than-google/

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