পিএইচপি-তে ব্রাউজারের ভাষা সনাক্ত করুন


144

আমি আমার ওয়েবসাইটের জন্য সূচক হিসাবে নিম্নলিখিত পিএইচপি স্ক্রিপ্ট ব্যবহার করি।

এই স্ক্রিপ্টটিতে ব্রাউজারের ভাষার উপর নির্ভর করে একটি নির্দিষ্ট পৃষ্ঠা অন্তর্ভুক্ত করা উচিত (স্বয়ংক্রিয়ভাবে সনাক্ত করা হয়েছে)।

এই স্ক্রিপ্টটি সমস্ত ব্রাউজারের সাথে ভাল কাজ করে না, তাই এটি সর্বদা অন্তর্ভুক্ত 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
পিএইচপি 5.3.0+ আসে locale_accept_from_http()যা Accept-Languageহেডার থেকে পছন্দসই ভাষা পায় । স্ব-লিখিত পদ্ধতির চেয়ে আপনার এই পদ্ধতিটি সর্বদা পছন্দ করা উচিত। আপনি চেষ্টা করেছেন এমন নিয়মিত প্রকাশের তালিকার বিপরীতে ফলাফলটি পরীক্ষা করে দেখুন এবং সেইভাবে পৃষ্ঠা ভাষাটি নির্ধারণ করুন। উদাহরণের জন্য PHP-I18N দেখুন ।
কাও

2
সঙ্গে সমস্যা locale_accept_from_http()আপনি শ্রেষ্ঠ ফলাফলের এটা ফেরৎ যাতে আপনি এখনও আছে সমর্থন নাও করতে পারে হয় পার্স হেডার নিজেকে খুঁজে পেতে পরবর্তী শ্রেষ্ঠ
শিওনক্রস

এর স্বীকৃত উত্তরটি একাধিক ভাষাকে বিবেচনায় নেওয়া তাদের মধ্যে একটিতে পরিবর্তন করা উচিত।
পেক্কা

পিএইচপি সংকলনের সময় অন্তর্ভুক্ত এবং প্রয়োজনীয়তাগুলি ঘটে থাকে তাই মূলত আপনি সমস্ত সূচক * .এফপি অন্তর্ভুক্ত করেন এবং কেবল একটিই দেখান - রিসোর্সগুলির অপচয়
মাইকেল

উত্তর:


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/reided.variables.server.php#90293
trante

10
@ ট্রান্ট: আপনি কেন বলেন যে তারা একটি চিঠি? ডাচ ( nl), গ্রীক ( el), এবং স্লোভেনীয় ( sl) সমস্ত দুটি অক্ষর হিসাবে দেখা যাচ্ছে: এমএসডিএন.মিকাইসফটওয়্যার /en-us/library/ms533052(v=vs.85).aspx
পিটার কে।

16
এই কোডটি পুরো তালিকাটির দিকে তাকাবে না। যদি আমার ভাষার তালিকায় plপ্রথম অগ্রাধিকার হয় এবং frদ্বিতীয় হয়? আমি ফ্রেঞ্চের পরিবর্তে ইংরাজী পাই।
কোস

24
এটিতে অগ্রাধিকার সনাক্তকরণের অভাব রয়েছে এবং দুটি অক্ষরের থেকে আলাদা
Costxel Costas Pena

3
দুটি চিঠি ছাড়া আর কোনও দৈর্ঘ্য নেই! আপনার প্রিয় ব্রাউজারে যান এবং ভাষার অগ্রাধিকার পরিবর্তন করুন এবং আপনি এটি দেখতে পাবেন।
গিগালা

76

স্বীকার করুন ভাষার ভরযুক্ত মান (দেখুন একটি তালিকা রয়েছে কুই প্যারামিটার)। এর অর্থ কেবল প্রথম ভাষার দিকে তাকানোর অর্থ এই নয় যে এটিও সবচেয়ে বেশি পছন্দ; আসলে,0 এরএকটি Q মানটি মোটেও গ্রহণযোগ্য নয় not

সুতরাং কেবল প্রথম ভাষার দিকে তাকানোর পরিবর্তে, গৃহীত ভাষা এবং উপলভ্য ভাষার তালিকাকে পার্স করুন এবং সেরা মিলটি খুঁজে নিন:

// 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খালি অ্যারেটি ফেরত দেয় তবে কোনও মিল খুঁজে পাওয়া যায় নি এবং আপনি ডিফল্ট ভাষায় ফিরে যেতে পারেন।


হাই, স্ক্রিপ্ট ঠিকঠাক কাজ করছিল এবং এখন থামুন। এটি সম্ভব হতে পারে যে সার্ভারে SESSION যদি এই স্ক্রিপ্টটি বন্ধ করে দেয় তবে কাজ করবে না?
গিব্বোক

@ জিব্বোক: না, এটি অধিবেশনগুলির থেকে পৃথক।
গম্বো

ঠিক আছে তবে আমি @ ডিজগারস ওয়ার্ল্ড সলিউশনটি পছন্দ করি ... আরও কম কোড লিখুন
lrkwz

কেউ দয়া করে আমাকে বলতে পারেন যে qসিদ্ধান্তের মূল্য কী? ধন্যবাদ
ফ্যান্টম007

@ ফ্যান্টম007 পছন্দ নির্ভর করে: 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 (আমি সরলতার জন্য এটি একটি ফাইলে সংযুক্তও করেছি)
স্কট

2
খুব সুন্দর পদ্ধতি! You ল্যাংগুলিতে ইতিমধ্যে ভাষার জন্য কোনও প্রবেশ রয়েছে কিনা তা আপনার পরীক্ষা করা উচিত। আমার সাথে ঘটেছিল যে অনুমিত ভাষাটি এন-ইউএস, দ্বিতীয় ডি এবং তৃতীয় এন, আপনার পদ্ধতি আমাকে সর্বদা দেবে, কারণ এন এর প্রথম মান 3 য় প্রবেশের মাধ্যমে ওভাররাইট করা হয়েছিল
পিটার পিন্ট

কোনও মিল না পাওয়া গেলে এটি পিএইচপি সতর্কতাও উত্পন্ন করে। এটিকে সুন্দরভাবে পরিচালনা করতে ভাল লাগবে।
সাইমন পূর্ব

26

এটি পরিচালনা করার আনুষ্ঠানিক উপায় হ'ল পিসিএল এইচটিটিপি লাইব্রেরি । এখানে কিছু উত্তরের বিপরীতে, এটি ভাষার অগ্রাধিকারগুলি (কিউ-মান) সঠিকভাবে পরিচালনা করে, আংশিক ভাষার সাথে মিলবে এবং নিকটতম ম্যাচটি ফিরিয়ে দেবে বা যখন কোনও মিল নেই তখন এটি আপনার অ্যারেতে প্রথম ভাষার হয়ে যায়।

পিইসিএল এইচটিটিপি:
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
আমি একটি কার্যকারী লিঙ্ক পেয়েছি, সুতরাং এটি অন্তর্ভুক্ত করার জন্য আপনার উত্তর আপডেট করেছে।
সাইমন পূর্ব

এই লিঙ্কগুলির তিনটিই মারা গেছে বলে মনে হচ্ছে এবং তাদের কাছে সহজেই গুগলযোগ্য ইনস্টল সংক্রান্ত কোনও নির্দেশনা রয়েছে বলে মনে হয় না (এছাড়াও এই পৃষ্ঠার জন্য তাদের পৃষ্ঠা অনুযায়ী এই ফাংশনটি হ্রাস করা হয়েছে)
ব্রায়ান লেশম্যান

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);
}

আরে আপনি কি রেগেক্সটি ব্যাখ্যা করতে পারেন যা দিয়ে Q মানটি ধরা উচিত [0-1]{0,1}.\d{0,4}? প্রথমে আমি অনুমান করছি আপনি ডান \.পরিবর্তে মানে .? আর নয় কুই ফর্মের সবসময় 0.1324নাকি অন্য কিছু? এটা কি তখন লেখার পক্ষে যথেষ্ট হবে না 0\.?\d{0,4}? আপনার যদি থাকে q=1.0তবে আপনি অন্য অংশে যেতে পারেন।
অ্যাডাম

এখানে একটি ব্যবহারের উদাহরণটি দেখতে দুর্দান্ত লাগবে।
সাইমন পূর্ব

2
@ সিমোনইস্ট var_dump( getDefaultLanguage());
জিরারিয়াম

4

নিম্নলিখিত স্ক্রিপ্টটি জিয়নক্রসের কোডের একটি পরিবর্তিত সংস্করণ (সেই জিয়নক্রসের জন্য আপনাকে ধন্যবাদ) যা কোনও ভাষা সমর্থিতদের সাথে মেলে না, বা কোনও মিল খুঁজে পাওয়া গেলে এটি একটি নতুন সাথে ডিফল্ট ভাষা সেটিংয়ের পরিবর্তে ডিফল্ট ভাষা সেটিংয়ে ফিরে আসে one ভাষা অগ্রাধিকার অনুযায়ী।

এই দৃশ্যে ব্যবহারকারীর ব্রাউজারটি স্প্যানিশ, ডাচ, ইউএস ইংলিশ এবং ইংলিশকে অগ্রাধিকারের ভিত্তিতে সেট করা হয় এবং অ্যাপ্লিকেশনটি কেবল ইংরেজী এবং ডাচকে কোনও আঞ্চলিক পরিবর্তনের সাথে সমর্থন করে না এবং ইংরেজি হ'ল ডিফল্ট ভাষা। "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));

দ্রষ্টব্য: প্রথম ভাষার কোডটি যা ব্রাউজার দ্বারা ব্যবহৃত হচ্ছে, বাকিগুলি অন্যান্য ব্রাউজারটিতে ব্যবহারকারীরা সেটআপ করেছেন।

কিছু ভাষার একটি অঞ্চলের কোড থাকে, যেমন। এন জিবি, অন্যের কাছে কেবলমাত্র ভাষা কোড রয়েছে, যেমন। SK।

আপনি যদি কেবল ভাষাটি চান এবং অঞ্চলটি (উদাহরণস্বরূপ, এন, ফ্র, এস, ইত্যাদি) না চান তবে আপনি ব্যবহার করতে পারেন:

$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
আমি মনে করি এই পোস্টের পিছনে অন্তর্ভুক্তিটি অর্থবোধ করে, যা ব্যবহারকারীকে ভাষা পরিবর্তন করার উপায় সরবরাহ করে এবং এই সিদ্ধান্তটিকে স্মরণ করে। প্রথম নির্বাচনটি অনুমান করার জন্য ভাষা সনাক্তকরণ কেবল একবার করা উচিত।
দানিজার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.