web-dev-qa-db-ja.com

言語の自動検出とユーザーのリダイレクト

私は自分のウェブサイトをやっていて、ブラウザの言語に応じた言語バージョンにユーザーを誘導するコードを書くことができました。スクリプトは次のとおりです。

<?php
  if ($_SERVER["HTTP_ACCEPT_LANGUAGE"] == "sv")
    header("location: index.php");
  if ($_SERVER["HTTP_ACCEPT_LANGUAGE"] == "pt")
    header("location: pt/index.php");
  else 
    header("location: en/index.html");
?>

これをindex.phpの前に置きました。私は英語圏の国にいませんが、ブラウザは英語であり、英語版にリダイレクトされているため、機能しているようです。

これは正しいです?これを行うためのより良い/きれいな方法はありますか?

16
viriato

まあ、私はPHPエキスパートではないので、驚くことではありません。コードでいくつかの問題に出会いました。 :

<?php
    // Initialize the language code variable
$lc = ""; 
    // Check to see that the global language server variable isset()
    // If it is set, we cut the first two characters from that string
if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
    $lc = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);

    // Now we simply evaluate that variable to detect specific languages
if($lc == "fr"){
    header("location: index_french.php");
    exit();
} else if($lc == "de"){
    header("location: index_german.php");
    exit();
}
else{ // don't forget the default case if $lc is empty
    header("location: index_english.php");
    exit();
}
?>

これは完璧に仕事をしました!問題が残っただけです。別の言語への直接リンクがあっても、ページをロードするとすぐにphpブロックがブラウザの言語にリダイレクトするため、言語を変更する方法はありませんでした。これは、他の国に住んでいて、たとえばスウェーデン語を母国語としているが、英国でコンピューターを購入したためにブラウザーが英語である場合、問題になる可能性があります。

したがって、この問題の私の解決策は、index.html(したがってindex.phpではない)にこのphpコードを使用せずに、すべての言語(メイン言語の言語でも)で重複したバージョンのフォルダーを作成することでした。だから今、私のウェブサイトは言語を自動検出しており、ユーザーは必要に応じて手動で言語を変更するオプションもあります!

同じ問題を抱えている他の人の助けになることを願っています!

15
viriato

PHP 5.3.0+には、locale_accept_from_http()が付属しており、_Accept-Language_ヘッダーから優先言語を取得します。

ヘッダーフィールドは人が考えるよりも複雑なので、常にこのメソッドを自己記述メソッドよりも優先する必要があります。 (これは重み付けされた設定のリストです。)

次のような言語を取得する必要があります。

$lang = locale_accept_from_http($_SERVER['HTTP_ACCEPT_LANGUAGE']);

しかし、それでも、すべての英語ユーザーにenを、スペイン語ユーザーにesを用意するだけではありません。それは はるかに難しい になる可能性があり、_es-ES_や_es-US_のようなものが標準です。

これは、ページ言語をそのように決定しようとする正規表現のリストを反復処理する必要があることを意味します。例については、 PHP-I18N を参照してください。

15
caw

あなたのアイデアは素晴らしいと思います。あなたの最短コードを助けるかもしれません:

$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
header("location: ".$lang."/index.php");
5
Bora

それはうまくいくはずです。 http_negotiate_language を使用して、 here について説明することもできます。

2
samb90