0

人々、

私は HTTP_ACCEPT_LANGUAGE に基づく機能に取り組んでおり、テストしたところ、ブラウザーにリダイレクト ループが表示されます。他の投稿で提供されているすべてのソリューションを調査しましたが、機能しません

更新: 最初に httaccess を使用して言語を検出し、適切なページと lang 変数を使用して正しいページにリダイレクトしようとしましたが、同じ問題が見つかりました。問題は、page (ユーザーがどのページにいるかを判断するため) と lang (ユーザーの話し言葉に応じた適切な言語) の 2 つの変数を使用したことです。しかし、ユーザーが初めてサイトに到着したとき: 両方の変数が null であるため、これの目的は、ユーザーのブラウザー言語を検出し、それを適切な URL にリダイレクトすることです。私の場合は..... index.php?たとえば、page=index&lang=en...

これは私がしました:

**init.php**

$supportedLangs = array (
    'en-GB',
    'en-US',
    'es-ES',
    'es-AR'
 );

 $languages = explode ( ',', $_SERVER ['HTTP_ACCEPT_LANGUAGE'] );

 detectBrowserLanguage($languages,$supportedLangs);



 **functions.php**


 function detectBrowserLanguage($languages,$supportedLangs) {

foreach ( $languages as $lang ) {
    if (in_array ( $lang, $supportedLangs )) {

            // Set the page locale to the first supported language found
         switch ($lang) {
        case 'es-ES' :
        header ( "Location: index.php?pagina=inicio&lang=es", TRUE, 301 );
        exit ();
        break;

        case 'en-US' :
        header ( "Location: index.php?pagina=inicio&lang=en", TRUE, 301 );
        exit ();
        break;

        case 'en-GB' :
        header ( "Location: index.php?pagina=inicio&lang=en", TRUE, 301 );
        exit ();
        break;

        default :
        header ( "Location: index.php?pagina=inicio&lang=es", TRUE, 301 );
        exit ();
        break;
        }
    }
    }
   }
4

2 に答える 2

0

ページが既に検出された言語の場合、ループから抜け出すメソッドを追加しました。注:あなたの質問に対する私のコメントを参照してください。

$supportedLangs = array (
    'en-GB',
    'en-US',
    'es-ES',
    'es-AR'
 );

 $languages = explode ( ',', $_SERVER ['HTTP_ACCEPT_LANGUAGE'] );
 $currentLanguage='';
 if(isset($_GET['lang'])){
      $currentLanguage=$_GET['lang'];
 }
 detectBrowserLanguage($languages,$supportedLangs, currentLanguage);

関数

function detectBrowserLanguage($languages,$supportedLangs, $currentLanguage) {

    foreach ( $languages as $lang ) {
        if ($lang == $currentLanguage){
            return; //If the page is already redirected just return.
        }elseif (in_array ( $lang, $supportedLangs )) {

                // Set the page locale to the first supported language found
             switch ($lang) {
            case 'es-ES' :
            header ( "Location: index.php?pagina=inicio&lang=es", TRUE, 301 );
            exit ();
            break;

            case 'en-US' :
            header ( "Location: index.php?pagina=inicio&lang=en", TRUE, 301 );
            exit ();
            break;

            case 'en-GB' :
            header ( "Location: index.php?pagina=inicio&lang=en", TRUE, 301 );
            exit ();
            break;

            default :
            header ( "Location: index.php?pagina=inicio&lang=es", TRUE, 301 );
            exit ();
            break;
            }
        }
    }
}

編集:

これは、 http_negotiate_languageを使用すると非常に簡単に実行できます。これは、その方法に関する単なるガイドです。私はこれをテストしていません(ここに入力しただけです)

function detectBrowserLanguage($supportedLangs, $currentLanguage) {
    $negotiated_language = http_negotiate_language($supportedLangs);
    if ($currentLanguage != $negotiated_language){
        switch ($negotiated_language) {
            case 'es-ES' :
            header ( "Location: index.php?pagina=inicio&lang=es", TRUE, 301 );
            exit ();
            break;

            case 'en-US' :
            header ( "Location: index.php?pagina=inicio&lang=en", TRUE, 301 );
            exit ();
            break;

            case 'en-GB' :
            header ( "Location: index.php?pagina=inicio&lang=en", TRUE, 301 );
            exit ();
            break;

            default :
            header ( "Location: index.php?pagina=inicio&lang=es", TRUE, 301 );
            exit ();
            break;
        }
    }

}

参照:

  1. W3 Accept-Language RFC
  2. 言語タグ
于 2013-11-11T03:22:56.267 に答える
0

index.php ページから detectBrowserLanguage を呼び出している可能性があります。Lang パラメーターが URL で渡されたときに、関数が呼び出されていないことを確認してください。

あなたはそれを確認することができます

isset($_GET['lang'])
于 2013-11-11T03:20:36.177 に答える