PHP में Browser Language का पता लगाएं


144

मैं अपनी वेबसाइट के लिए अनुक्रमणिका के रूप में निम्न PHP स्क्रिप्ट का उपयोग करता हूं।

इस स्क्रिप्ट में ब्राउज़र की भाषा (स्वचालित रूप से पाया गया) के आधार पर एक विशिष्ट पृष्ठ शामिल होना चाहिए।

यह स्क्रिप्ट सभी ब्राउज़रों के साथ अच्छी तरह से काम नहीं करती है, इसलिए इसमें हमेशा index_en.phpकिसी भी ज्ञात भाषा को शामिल किया जाता है (समस्या का कारण संभवतः सबसे अधिक समस्या है जिसमें कुछ एक्सेप्ट-लैंग्वेज हेडर पर विचार नहीं किया जाता है)।

क्या आप कृपया मुझे अधिक मजबूत समाधान सुझा सकते हैं?

<?php
// Open session var
session_start();
// views: 1 = first visit; >1 = second visit

// Detect language from user agent browser
function lixlpixel_get_env_var($Var)
{
     if(empty($GLOBALS[$Var]))
     {
         $GLOBALS[$Var]=(!empty($GLOBALS['_SERVER'][$Var]))?
         $GLOBALS['_SERVER'][$Var] : (!empty($GLOBALS['HTTP_SERVER_VARS'][$Var])) ? $GLOBALS['HTTP_SERVER_VARS'][$Var]:'';
     }
}

function lixlpixel_detect_lang()
{
     // Detect HTTP_ACCEPT_LANGUAGE & HTTP_USER_AGENT.
     lixlpixel_get_env_var('HTTP_ACCEPT_LANGUAGE');
     lixlpixel_get_env_var('HTTP_USER_AGENT');

     $_AL=strtolower($GLOBALS['HTTP_ACCEPT_LANGUAGE']);
     $_UA=strtolower($GLOBALS['HTTP_USER_AGENT']);

     // Try to detect Primary language if several languages are accepted.
     foreach($GLOBALS['_LANG'] as $K)
     {
         if(strpos($_AL, $K)===0)
         return $K;
     }

     // Try to detect any language if not yet detected.
     foreach($GLOBALS['_LANG'] as $K)
     {
         if(strpos($_AL, $K)!==false)
         return $K;
     }
     foreach($GLOBALS['_LANG'] as $K)
     {
         //if(preg_match("/[[( ]{$K}[;,_-)]/",$_UA)) // matching other letters (create an error for seo spyder)
         return $K;
     }

     // Return default language if language is not yet detected.
     return $GLOBALS['_DLANG'];
}

// Define default language.
$GLOBALS['_DLANG']='en';

// Define all available languages.
// WARNING: uncomment all available languages

$GLOBALS['_LANG'] = array(
'af', // afrikaans.
'ar', // arabic.
'bg', // bulgarian.
'ca', // catalan.
'cs', // czech.
'da', // danish.
'de', // german.
'el', // greek.
'en', // english.
'es', // spanish.
'et', // estonian.
'fi', // finnish.
'fr', // french.
'gl', // galician.
'he', // hebrew.
'hi', // hindi.
'hr', // croatian.
'hu', // hungarian.
'id', // indonesian.
'it', // italian.
'ja', // japanese.
'ko', // korean.
'ka', // georgian.
'lt', // lithuanian.
'lv', // latvian.
'ms', // malay.
'nl', // dutch.
'no', // norwegian.
'pl', // polish.
'pt', // portuguese.
'ro', // romanian.
'ru', // russian.
'sk', // slovak.
'sl', // slovenian.
'sq', // albanian.
'sr', // serbian.
'sv', // swedish.
'th', // thai.
'tr', // turkish.
'uk', // ukrainian.
'zh' // chinese.
);

// Redirect to the correct location.
// Example Implementation aff var lang to name file
/*
echo 'The Language detected is: '.lixlpixel_detect_lang(); // For Demonstration
echo "<br />";    
*/
$lang_var = lixlpixel_detect_lang(); //insert lang var system in a new var for conditional statement
/*
echo "<br />";    

echo $lang_var; // print var for trace

echo "<br />";    
*/
// Insert the right page iacoording with the language in the browser
switch ($lang_var){
    case "fr":
        //echo "PAGE DE";
        include("index_fr.php");//include check session DE
        break;
    case "it":
        //echo "PAGE IT";
        include("index_it.php");
        break;
    case "en":
        //echo "PAGE EN";
        include("index_en.php");
        break;        
    default:
        //echo "PAGE EN - Setting Default";
        include("index_en.php");//include EN in all other cases of different lang detection
        break;
}
?>

3
PHP 5.3.0+ आता है locale_accept_from_http()जिसमें Accept-Languageहेडर से पसंदीदा भाषा मिलती है । आपको हमेशा इस विधि को स्व-लिखित विधि के लिए पसंद करना चाहिए। नियमित अभिव्यक्तियों की एक सूची के खिलाफ परिणाम की जांच करें जो आप कोशिश करते हैं और उस तरह से पृष्ठ भाषा निर्धारित करते हैं। उदाहरण के लिए PHP-I18N देखें ।
4'14

2
इसके साथ समस्या locale_accept_from_http()यह है कि आप सबसे अच्छे परिणाम का समर्थन नहीं कर सकते हैं ताकि आप अभी भी अगले-सर्वोत्तम को खोजने के लिए हेडर को अपने पास रख सकें ।
Xeoncross

इसका स्वीकृत उत्तर उन लोगों में से एक को बदलना चाहिए जो कई भाषाओं को ध्यान में रखते हैं।
पेक्का

शामिल हैं और आवश्यकता होती है php के संकलन के समय पर होता है इसलिए मूल रूप से आप सभी सूचकांक * .php को शामिल करते हैं और केवल एक ही दिखाते हैं - सूत्रों की बर्बादी
माइकल

जवाबों:


361

क्यों न आप इसे सरल और साफ रखें

<?php
    $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
    $acceptLang = ['fr', 'it', 'en']; 
    $lang = in_array($lang, $acceptLang) ? $lang : 'en';
    require_once "index_{$lang}.php"; 

?>

9
डच, ग्रीक और स्लोवेनियाई भाषा के कोड एक अक्षर हैं। इस तरह से विस्फोट करना बेहतर लगता है: php.net/manual/tr/reserved.variables.server.php#90293
trante

10
@trante: आप क्यों कहते हैं कि वे एक अक्षर हैं? डच ( nl), ग्रीक ( el) और स्लोवेनियाई ( sl) सभी दो अक्षर प्रतीत होते हैं: msdn.microsoft.com/en-us/library/ms533052(v=vs.85).aspx
पीटर के।

16
यह कोड पूरी सूची को नहीं देखता है। क्या होगा यदि plपहली प्राथमिकता और frमेरी भाषा सूची में दूसरा है? मुझे फ्रेंच की जगह अंग्रेजी आती।
कोस

24
इसमें प्राथमिकताओं का पता लगाने की कमी है, और यह दो अक्षरों से अलग
asxel Costas पेना

3
दो अक्षरों के अलावा और कोई लंबाई नहीं है! अपने पसंदीदा ब्राउज़र में जाएं और भाषा की प्राथमिकता बदलें और आप इसे देखेंगे।
गिगाला

76

स्वीकार-भाषा भारित मूल्यों की एक सूची है ( क्ष पैरामीटरदेखें)। इसका मतलब है कि सिर्फ पहली भाषा को देखने का मतलब यह नहीं है कि यह सबसे पसंदीदा भी है; वास्तव में,0 काएक q मान बिल्कुल भी स्वीकार्य नहीं है।

इसलिए केवल पहली भाषा को देखने के बजाय, स्वीकृत भाषाओं और उपलब्ध भाषाओं की सूची को पार्स करें और सबसे अच्छा मैच खोजें:

// parse list of comma separated language tags and sort it by the quality value
function parseLanguageList($languageList) {
    if (is_null($languageList)) {
        if (!isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
            return array();
        }
        $languageList = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
    }
    $languages = array();
    $languageRanges = explode(',', trim($languageList));
    foreach ($languageRanges as $languageRange) {
        if (preg_match('/(\*|[a-zA-Z0-9]{1,8}(?:-[a-zA-Z0-9]{1,8})*)(?:\s*;\s*q\s*=\s*(0(?:\.\d{0,3})|1(?:\.0{0,3})))?/', trim($languageRange), $match)) {
            if (!isset($match[2])) {
                $match[2] = '1.0';
            } else {
                $match[2] = (string) floatval($match[2]);
            }
            if (!isset($languages[$match[2]])) {
                $languages[$match[2]] = array();
            }
            $languages[$match[2]][] = strtolower($match[1]);
        }
    }
    krsort($languages);
    return $languages;
}

// compare two parsed arrays of language tags and find the matches
function findMatches($accepted, $available) {
    $matches = array();
    $any = false;
    foreach ($accepted as $acceptedQuality => $acceptedValues) {
        $acceptedQuality = floatval($acceptedQuality);
        if ($acceptedQuality === 0.0) continue;
        foreach ($available as $availableQuality => $availableValues) {
            $availableQuality = floatval($availableQuality);
            if ($availableQuality === 0.0) continue;
            foreach ($acceptedValues as $acceptedValue) {
                if ($acceptedValue === '*') {
                    $any = true;
                }
                foreach ($availableValues as $availableValue) {
                    $matchingGrade = matchLanguage($acceptedValue, $availableValue);
                    if ($matchingGrade > 0) {
                        $q = (string) ($acceptedQuality * $availableQuality * $matchingGrade);
                        if (!isset($matches[$q])) {
                            $matches[$q] = array();
                        }
                        if (!in_array($availableValue, $matches[$q])) {
                            $matches[$q][] = $availableValue;
                        }
                    }
                }
            }
        }
    }
    if (count($matches) === 0 && $any) {
        $matches = $available;
    }
    krsort($matches);
    return $matches;
}

// compare two language tags and distinguish the degree of matching
function matchLanguage($a, $b) {
    $a = explode('-', $a);
    $b = explode('-', $b);
    for ($i=0, $n=min(count($a), count($b)); $i<$n; $i++) {
        if ($a[$i] !== $b[$i]) break;
    }
    return $i === 0 ? 0 : (float) $i / count($a);
}

$accepted = parseLanguageList($_SERVER['HTTP_ACCEPT_LANGUAGE']);
var_dump($accepted);
$available = parseLanguageList('en, fr, it');
var_dump($available);
$matches = findMatches($accepted, $available);
var_dump($matches);

यदि findMatchesकोई खाली सरणी देता है, तो कोई मिलान नहीं मिला और आप डिफ़ॉल्ट भाषा पर वापस आ सकते हैं।


नमस्ते, स्क्रिप्ट ठीक काम कर रही थी और अब बंद हो गई। यह संभव हो सकता है कि यदि सर्वर पर सत्र इस स्क्रिप्ट को बंद कर देंगे तो काम नहीं होगा?
गिब्बो

@GIbboK: नहीं, यह सत्रों से स्वतंत्र है।
गम्बू

सही है लेकिन मैं @diggersworld समाधान पसंद करता हूं ... बेहतर कोड कम लिखें
lrkwz

क्या कोई मुझे बता सकता है कि qनिर्णय का मूल्य कैसे है ? धन्यवाद
Phantom007

@ Phantom007 पसंद की निर्भरता: 0 = मुझे यह भाषा नहीं चाहिए, 1 = मुझे हमेशा यह भाषा चाहिए।
स्काईस्ट ऑक्ट

43

मौजूदा उत्तर थोड़े बहुत क्रियात्मक हैं इसलिए मैंने यह छोटा, स्वतः मिलान वाला संस्करण बनाया।

function prefered_language(array $available_languages, $http_accept_language) {

    $available_languages = array_flip($available_languages);

    $langs;
    preg_match_all('~([\w-]+)(?:[^,\d]+([\d.]+))?~', strtolower($http_accept_language), $matches, PREG_SET_ORDER);
    foreach($matches as $match) {

        list($a, $b) = explode('-', $match[1]) + array('', '');
        $value = isset($match[2]) ? (float) $match[2] : 1.0;

        if(isset($available_languages[$match[1]])) {
            $langs[$match[1]] = $value;
            continue;
        }

        if(isset($available_languages[$a])) {
            $langs[$a] = $value - 0.1;
        }

    }
    arsort($langs);

    return $langs;
}

और नमूना उपयोग:

//$_SERVER["HTTP_ACCEPT_LANGUAGE"] = 'en-us,en;q=0.8,es-cl;q=0.5,zh-cn;q=0.3';

// Languages we support
$available_languages = array("en", "zh-cn", "es");

$langs = prefered_language($available_languages, $_SERVER["HTTP_ACCEPT_LANGUAGE"]);

/* Result
Array
(
    [en] => 0.8
    [es] => 0.4
    [zh-cn] => 0.3
)*/

पूर्ण जिस्ट स्रोत यहाँ


6
यह शानदार है और आज मुझे एक विशेष परियोजना के लिए आवश्यक है। इसके अलावा मैंने केवल इतना ही किया कि फ़ंक्शन को डिफ़ॉल्ट भाषा को स्वीकार करने की अनुमति है और यदि उपलब्ध भाषाओं और HTTP_ACCEPT_LANGUAGE के बीच कोई मेल नहीं है, तो वापस आ सकते हैं।
स्कॉट

7
ओह, मेरे बदलाव के साथ एक जिस्म यहाँ है: gist.github.com/humantorch/d255e39a8ab4ea2e7005 (मैंने इसे सादगी के लिए एक फाइल में भी जोड़ दिया)
Scott

2
बहुत अच्छी विधि! शायद आपको यह जांचना चाहिए कि $ लैंग्स में पहले से ही भाषा के लिए एक प्रविष्टि है। मेरे साथ ऐसा हुआ कि perferred भाषा en-US, 2nd de और 3rd en थी, आपकी विधि ने हमेशा मुझे de दिया, क्योंकि en का पहला मान 3rd प्रविष्टि द्वारा अधिलेखित कर दिया गया था
पीटर पिंट

अगर मैच नहीं मिले तो यह एक PHP चेतावनी भी पैदा करता है। इस इनायत को संभालना अच्छा रहेगा।
सिमोन पूर्व

26

इसे संभालने का आधिकारिक तरीका PECL HTTP लाइब्रेरी का उपयोग कर रहा है । यहां कुछ उत्तरों के विपरीत, यह भाषा की प्राथमिकताओं (q-मानों), आंशिक भाषा के मेल को सही ढंग से संभालता है और निकटतम मैच को लौटा देगा, या जब कोई मैच नहीं होता है तो यह आपके सरणी में पहली भाषा में वापस आ जाता है।

PECL HTTP:
http://pecl.php.net/package/pecl_http

कैसे उपयोग करें:
http://php.net/manual/fa/function.http-negotiate-language.php

$supportedLanguages = [
    'en-US', // first one is the default/fallback
    'fr',
    'fr-FR',
    'de',
    'de-DE',
    'de-AT',
    'de-CH',
];

// Returns the negotiated language 
// or the default language (i.e. first array entry) if none match.
$language = http_negotiate_language($supportedLanguages, $result);

1
मुझे एक काम करने वाला लिंक मिला, इसलिए इसे शामिल करने के लिए आपके उत्तर को अपडेट किया।
साइमन ईस्ट

ये तीनों लिंक मृत प्रतीत होते हैं, और वे आसानी से किसी भी Googleable स्थापित निर्देशों के लिए प्रतीत नहीं होते हैं (यह फ़ंक्शन इसके लिए उनके पृष्ठ के अनुसार हटा दिया गया है)
ब्रायन लीशमैन

11

उपरोक्त चयनित उत्तर के साथ समस्या यह है कि उपयोगकर्ता के पास अपनी पहली पसंद ऐसी भाषा के रूप में सेट हो सकती है जो केस संरचना में नहीं है, लेकिन उनकी अन्य भाषा विकल्पों में से एक सेट है। आपको तब तक लूप करना चाहिए जब तक आप एक मैच नहीं पाते।

यह एक सुपर सरल उपाय है जो बेहतर काम करता है। ब्राउज़र वरीयता के क्रम में भाषाओं को लौटाते हैं, ताकि समस्या को सरल बनाया जा सके। जबकि भाषा का डिज़ाइनर दो वर्णों से अधिक हो सकता है (जैसे - "EN-US"), आमतौर पर पहले दो पर्याप्त होते हैं। निम्नलिखित कोड उदाहरण में मैं उन भाषाओं की सूची से मैच देख रहा हूं जिनके बारे में मेरा कार्यक्रम जानता है।

$known_langs = array('en','fr','de','es');
$user_pref_langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);

foreach($user_pref_langs as $idx => $lang) {
    $lang = substr($lang, 0, 2);
    if (in_array($lang, $known_langs)) {
        echo "Preferred language is $lang";
        break;
    }
}

मुझे आशा है कि आपको यह एक त्वरित और सरल समाधान मिलेगा जिसे आप आसानी से अपने कोड में उपयोग कर सकते हैं। मैं काफी समय से इसे प्रोडक्शन में इस्तेमाल कर रहा हूं।


3
"ब्राउज़र वरीयता के क्रम में भाषाओं को वापस करते हैं" - वे कर सकते हैं, लेकिन आपको उस पर निर्भर नहीं होना चाहिए। qवरीयताओं को निर्धारित करने के लिए मूल्यों का उपयोग करें , यही वह युक्ति है जो आपको कहना चाहिए।
क्वेंटिन

7

इसको आजमाओ:

#########################################################
# Copyright © 2008 Darrin Yeager                        #
# https://www.dyeager.org/                               #
# Licensed under BSD license.                           #
#   https://www.dyeager.org/downloads/license-bsd.txt    #
#########################################################

function getDefaultLanguage() {
   if (isset($_SERVER["HTTP_ACCEPT_LANGUAGE"]))
      return parseDefaultLanguage($_SERVER["HTTP_ACCEPT_LANGUAGE"]);
   else
      return parseDefaultLanguage(NULL);
   }

function parseDefaultLanguage($http_accept, $deflang = "en") {
   if(isset($http_accept) && strlen($http_accept) > 1)  {
      # Split possible languages into array
      $x = explode(",",$http_accept);
      foreach ($x as $val) {
         #check for q-value and create associative array. No q-value means 1 by rule
         if(preg_match("/(.*);q=([0-1]{0,1}.\d{0,4})/i",$val,$matches))
            $lang[$matches[1]] = (float)$matches[2];
         else
            $lang[$val] = 1.0;
      }

      #return default language (highest q-value)
      $qval = 0.0;
      foreach ($lang as $key => $value) {
         if ($value > $qval) {
            $qval = (float)$value;
            $deflang = $key;
         }
      }
   }
   return strtolower($deflang);
}

अरे आप regex को समझा सकते हैं कि q मान को किसके साथ पकड़ना चाहिए [0-1]{0,1}.\d{0,4}? पहले मुझे लगता है कि आप सही के \.बजाय मतलब है .? और क्या q हमेशा फॉर्म 0.1324या कुछ और नहीं है? क्या यह लिखना पर्याप्त नहीं होगा 0\.?\d{0,4}? अगर आपके पास है q=1.0तो आप दूसरे हिस्से में जा सकते हैं।
एडम

यहाँ एक उपयोग उदाहरण देखना बहुत अच्छा होगा।
साइमन ईस्ट

2
@ साइमनएस्ट var_dump( getDefaultLanguage());
जिरैरी

4

निम्न स्क्रिप्ट Xeoncross के कोड का एक संशोधित संस्करण है (उस Xeoncross के लिए धन्यवाद) जो किसी डिफ़ॉल्ट भाषा सेटिंग पर वापस आती है यदि कोई भाषा समर्थित लोगों से मेल नहीं खाती है, या यदि कोई मैच मिलता है तो वह डिफ़ॉल्ट भाषा सेटिंग को नए के साथ बदल देता है भाषा की प्राथमिकता के अनुसार।

इस परिदृश्य में उपयोगकर्ता का ब्राउज़र स्पेनिश, डच, यूएस अंग्रेजी और अंग्रेजी के लिए प्राथमिकता के क्रम में सेट किया गया है और एप्लिकेशन केवल अंग्रेजी और डच का समर्थन करता है जिसमें कोई क्षेत्रीय विविधता नहीं है और अंग्रेजी डिफ़ॉल्ट भाषा है। "HTTP_ACCEPT_LANGUAGE" स्ट्रिंग में मानों का क्रम महत्वपूर्ण नहीं है यदि किसी कारण से ब्राउज़र मानों को सही ढंग से क्रमबद्ध नहीं करता है।

$supported_languages = array("en","nl");
$supported_languages = array_flip($supported_languages);
var_dump($supported_languages); // array(2) { ["en"]=> int(0) ["nl"]=> int(1) }

$http_accept_language = $_SERVER["HTTP_ACCEPT_LANGUAGE"]; // es,nl;q=0.8,en-us;q=0.5,en;q=0.3

preg_match_all('~([\w-]+)(?:[^,\d]+([\d.]+))?~', strtolower($http_accept_language), $matches, PREG_SET_ORDER);

$available_languages = array();

foreach ($matches as $match)
{
    list($language_code,$language_region) = explode('-', $match[1]) + array('', '');

    $priority = isset($match[2]) ? (float) $match[2] : 1.0;

    $available_languages[][$language_code] = $priority;
}

var_dump($available_languages);

/*
array(4) {
    [0]=>
    array(1) {
        ["es"]=>
        float(1)
    }
    [1]=>
    array(1) {
        ["nl"]=>
        float(0.8)
    }
    [2]=>
    array(1) {
        ["en"]=>
        float(0.5)
    }
    [3]=>
    array(1) {
        ["en"]=>
        float(0.3)
    }
}
*/

$default_priority = (float) 0;
$default_language_code = 'en';

foreach ($available_languages as $key => $value)
{
    $language_code = key($value);
    $priority = $value[$language_code];

    if ($priority > $default_priority && array_key_exists($language_code,$supported_languages))
    {
        $default_priority = $priority;
        $default_language_code = $language_code;

        var_dump($default_priority); // float(0.8)
        var_dump($default_language_code); // string(2) "nl"
    }
}

var_dump($default_language_code); // string(2) "nl" 

1

मुझे लगता है कि यह सबसे साफ तरीका है!

 <?php
  $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
  $supportedLanguages=['en','fr','gr'];
  if(!in_array($lang,$supportedLanguages)){
     $lang='en';
  }
    require("index_".$lang.".php");

यह शीर्ष लेख के भीतर भाषा की प्राथमिकताओं के लिए जिम्मेदार नहीं है।
साइमन ईस्ट

0

उपरोक्त सभी में 'एन' के साथ वापसी:

$lang = substr(explode(',',$_SERVER['HTTP_ACCEPT_LANGUAGE'])[0],0,2)?:'en';

... या डिफ़ॉल्ट भाषा कमबैक और ज्ञात भाषा सरणी के साथ:

function lang( $l = ['en'], $u ){
    return $l[
        array_keys(
            $l,
            substr(
                explode(
                    ',',
                    $u ?: $_SERVER['HTTP_ACCEPT_LANGUAGE']
                )[0],
                0,
                2
            )
        )[0]
    ] ?: $l[0];
}

एक पंक्ति:

function lang($l=['en'],$u){return $l[array_keys($l,substr(explode(',',$u?:$_SERVER['HTTP_ACCEPT_LANGUAGE'])[0],0,2))[0]]?:$l[0];}

उदाहरण:

// first known lang is always default
$_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'en-us';
lang(['de']); // 'de'
lang(['de','en']); // 'en'

// manual set accept-language
lang(['de'],'en-us'); // 'de'
lang(['de'],'de-de, en-us'); // 'de'
lang(['en','fr'],'de-de, en-us'); // 'en'
lang(['en','fr'],'fr-fr, en-us'); // 'fr'
lang(['de','en'],'fr-fr, en-us'); // 'de'

0

प्रयत्न,

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

if ($lang == 'tr') {
include_once('include/language/tr.php');
}elseif ($lang == 'en') {
include_once('include/language/en.php');
}elseif ($lang == 'de') {
include_once('include/language/de.php');
}elseif ($lang == 'fr') {
include_once('include/language/fr.php');
}else{
include_once('include/language/tr.php');
}

करने के लिए धन्यवाद


0

त्वरित और सरल:

$language = trim(substr( strtok(strtok($_SERVER['HTTP_ACCEPT_LANGUAGE'], ','), ';'), 0, 5));

नोट: पहला भाषा कोड वह है जो ब्राउज़र द्वारा उपयोग किया जा रहा है, बाकी वे अन्य भाषाएँ हैं जो उपयोगकर्ता ने ब्राउज़र में सेटअप की हैं।

कुछ भाषाओं में एक क्षेत्र कोड होता है, जैसे। en-GB, अन्य लोगों के पास बस भाषा कोड है, उदाहरण के लिए। sk।

यदि आप केवल भाषा चाहते हैं और क्षेत्र नहीं (जैसे। en, fr, es, आदि), तो आप उपयोग कर सकते हैं:

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

-1

मुझे यह मिल गया है, जो एक कुकी सेट करता है। और जैसा कि आप देख सकते हैं, यह पहले जांचता है कि भाषा उपयोगकर्ता द्वारा पोस्ट की गई है या नहीं। क्योंकि ब्राउज़र की भाषा हमेशा उपयोगकर्ता के बारे में नहीं बताती है।

<?php   
    $lang = getenv("HTTP_ACCEPT_LANGUAGE");
    $set_lang = explode(',', $lang);
    if (isset($_POST['lang'])) 
        {
            $taal = $_POST['lang'];
            setcookie("lang", $taal);
            header('Location: /p/');
        }
    else 
        {
            setcookie("lang", $set_lang[0]);
            echo $set_lang[0];
            echo '<br>';
            echo $set_lang[1];
            header('Location: /p/');
        } 
?>

11
मुझे लगता है कि आप हेडर नहीं भेज सकते हैं जब आप पहले से ही गूंज रहे हैं?

2
मुझे लगता है कि इस पोस्ट के पीछे का संकेत समझ में आता है, जो उपयोगकर्ता को भाषा को स्विच करने का एक तरीका प्रदान करना है, और इस निर्णय को याद रखना है। भाषा का पता लगाने के लिए केवल एक बार किया जाना चाहिए ताकि पहले चयन का सबसे अच्छा अनुमान लगाया जा सके।
दानिश्वर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.