簡體   English   中英

PHP:檢測用戶語言並能夠更改語言

[英]PHP: Detect user language and able to change language

我有一個可以選擇語言的網站。 我想讓當用戶第一次進入網站時,php 獲取他的系統語言並寫入 cookie(因此用戶默認每次進入時間時都會使用相同的語言)。 但是當用戶想要改變網站語言時,他會在選擇的語言(例如俄語)中按下一個按鈕,然后網站語言將設置為俄語,當他再次進入網站時,他將是俄語。

到目前為止,我有這段代碼,但它真的很混亂,而且不能正常工作。

HTML:

<a href="index.php?language=en">
<a href="index.php?language=ru">

PHP:

<?php
ini_set('display_errors',1);
error_reporting(E_ALL);

$language = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);

if (empty($_COOKIE['language'])){
setcookie('language', $language);
}

if ( !empty($_GET['language']) ) {
    $_COOKIE['language'] = $_GET['language'] === 'en' ? 'en' : 'ru';
} else {
  switch ($language){
  case "ru":
      $language = 'ru';
      break;
  case "en":
      $language = 'en';
      break;
  default:
      $language = 'en';
      break;
}
}

if ( $_COOKIE['language'] == "en") {
   $language = 'en';
} else {
   $language = 'ru';
}

$xml = simplexml_load_file("language.xml") or die("Equestria forgot languages");

$s_nav_main = $xml->s_nav_main->$language;
$s_nav_more = $xml->s_nav_more->$language;
$s_nav_bot = $xml->s_nav_bot->$language;
$s_nav_partners = $xml->s_nav_partners->$language;
$s_nav_developer = $xml->s_nav_developer->$language;
$s_aboutus = $xml->s_aboutus->$language;
$s_title = $xml->s_title->$language;
$s_head_title = $xml->s_head_title->$language;
$s_head_info = $xml->s_head_info->$language;
$s_statistics_people = $xml->s_statistics_people->$language;
$s_statistics_online = $xml->s_statistics_online->$language;
$s_statistics_messages = $xml->s_statistics_messages->$language;
$s_why_we_best = $xml->s_why_we_best->$language;
$s_why_we_best_content_title = $xml->s_why_we_best_content_title->$language;
$s_why_we_best_content_info = $xml->s_why_we_best_content_info->$language;
$s_why_we_best_adm_title = $xml->s_why_we_best_adm_title->$language;
$s_why_we_best_adm_info = $xml->s_why_we_best_adm_info->$language;
$s_why_we_best_comfort_title = $xml->s_why_we_best_comfort_title->$language;
$s_why_we_best_comfort_info = $xml->s_why_we_best_comfort_info->$language;
$s_why_we_best_wtf_title = $xml->s_why_we_best_wtf_title->$language;
$s_why_we_best_wtf_info = $xml->s_why_we_best_wtf_info->$language;
$s_trusted_title = $xml->s_trusted_title->$language;
$s_trusted_info = $xml->s_trusted_info->$language;
$s_people_celestia = $xml->s_people_celestia->$language;
$s_people_celestia_comment = $xml->s_people_celestia_comment->$language;
$s_people_luna = $xml->s_people_luna->$language;
$s_people_luna_comment = $xml->s_people_luna_comment->$language;
$s_people_twilight = $xml->s_people_twilight->$language;
$s_people_twilight_comment = $xml->s_people_twilight_comment->$language;
$s_botinfo_info = $xml->s_botinfo_info->$language;
$s_botinfo_more = $xml->s_botinfo_more->$language;
?>

您應該查找用戶首選語言的第一個位置是 Accept-Language 標頭。 Geo-IP 查找是一種危險且昂貴的時間浪費(至少對於確定語言而言)。 除此之外,您可以設置一個 cookie 來覆蓋瀏覽器提供的選擇,但是這對歐洲的網站有法律影響。

 $avail_lang=array(
            'en'=>1,
            'fr'=>1,
            'de'=>1,
            'ru'=>1
            );
 define("DEFAULT_LANG", 'en');
 ...
 if ($_COOKIE['language'] && isset($avail_lang[$_COOKIE['language']]) {
    $use_lang=$_COOKIE['language'];
 }
 // override with GET if provided
 if ($_GET['language'] && isset($avail_lang[$_GET['language']]) {
    $use_lang=$_GET['language'];
 }
 // no language? check browser
 if (!$use_lang) {
    $request_lang=explode(",", $_SERVER['HTTP_ACCEPT_LANGUAGE']);
    foreach($request_lang as $i) {
            list($lang, $pref)=explode("=", trim($i));
            $pref=$pref ? 0.0+$pref : 1.0;
            list($lang, $country)=explode("-", $lang);
            $pref_lang[$lang]=$pref;
    }
    rsort($pref_lang);
    $use_lang=array_shift(array_intersect_key($pref_lang, $avail_lang));
    if (!$use_lang) $use_lang=DEFAULT_LANGUAGE;
}
if (user_accepts_cookies() && $use_lang!=$_COOKIE['language']) {
    set_lang_cookie($use_lang);
}

這里可以采用一個簡單的邏輯——

當用戶登陸您的網站時,您應該跟蹤他/她的 IP 地址,我們可以使用該 IP 輕松獲取他們的國家/地區。 然后,您可以輕松地為他們提供語言服務。

找到了如何做到這一點的方法:

$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);

if ( !empty($_GET['language']) ) {
    $_COOKIE['language'] = $_GET['language'] === 'en' ? 'en' : 'ru';
} elseif (empty($_COOKIE['language'])) {
    $_COOKIE['language'] = $lang;
}
setcookie('language', $_COOKIE['language']);

if ( $_COOKIE['language'] == "en") {
   $language = 'en';
} else {
   $language = 'ru';
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM