ব্রাউজারের মধ্যে ব্যবহারকারীর লোকাল নির্ধারণ করার সর্বোত্তম উপায়


202

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

এফওয়াইআই, প্রক্সি বিধিনিষেধের কারণে আমি সার্ভার-স্ক্রিপ্টগুলি ব্যবহার করতে পারি না, তাই আমার ধারণা জাভাস্ক্রিপ্ট বা অ্যাকশনস্ক্রিপ্ট সমস্যা সমাধানের জন্য উপযুক্ত হবে।

প্রশ্নাবলী:

  1. ব্যবহারকারীর লোকেল 'অনুমান' করার সর্বোত্তম পদ্ধতি কী হবে?

  2. এমন কোনও সহজ সরল শ্রেণি / ফাংশন রয়েছে যা আমাকে সাহায্য করতে পারে (কোনও জটিল স্থানীয়করণের বান্ডিল নেই)? বিশেষভাবে সমস্ত সম্ভাব্য ভাষাগুলি একটি স্মার্ট পথে কম সংখ্যায় (আমার কাছে অনুবাদগুলি) বিভক্ত করা।

  3. আমি কোন বিন্দুতে এই জাতীয় সমাধানটি বিশ্বাস করতে পারি?

  4. অন্য কোন কাজের সমাধান বা পরামর্শ?


ব্রাউজার কেবলমাত্র তার ব্যবহারকারী সম্পর্কে মেটা ডেটা ভাগ করতে পারে এবং অনুরোধটি ইউআরএল এবং শিরোলেখের মাধ্যমে। ফায়ারফক্স ধরুন এবং যখন অনুরোধ করা হবে তখন পাঠানো হচ্ছে শিরোনামগুলিতে উঁকি দিন। সাধারণ অনুরোধ এবং প্রতিক্রিয়া শিরোনাম পরীক্ষা করা এটি বেশ আকর্ষণীয়।
এমপি।

উত্তর:


188

সঠিক উপায়টি হ'ল সার্ভারে প্রেরিত HTTP স্বীকৃতি-ভাষা শিরোনাম। এটিতে ব্যবহারকারীরা তাদের ব্রাউজারটি পছন্দ করতে কনফিগার করেছেন এমন ভাষাগুলির অর্ডারযুক্ত, ভারিত তালিকা রয়েছে।

দুর্ভাগ্যক্রমে এই শিরোনামটি জাভাস্ক্রিপ্টের ভিতরে পড়ার জন্য উপলভ্য নয়; আপনি navigator.languageযা পেয়েছেন তা হ'ল যা আপনাকে জানায় যে ওয়েব ব্রাউজারের স্থানীয় রূপটি কী ইনস্টল করা হয়েছিল। এটি অগত্যা ব্যবহারকারীর পছন্দসই ভাষা (গুলি) হিসাবে একই জিনিস নয়। আই-এর পরিবর্তে আপনি systemLanguage(ওএস ইনস্টল করা ভাষা), browserLanguage(একই হিসাবে language) এবং userLanguage(ব্যবহারকারী কনফিগার করা ওএস অঞ্চল) পান যা এগুলি একইভাবে অপ্রয়োজনীয়।

যদি আমাকে এই বৈশিষ্ট্যগুলির মধ্যে চয়ন করতে হয় তবে আমি userLanguageপ্রথমে শুকিয়ে যাব languageএবং তার পরেই ফিরে যাব (যদি সেগুলি কোনও উপলভ্য ভাষার সাথে মেলে না) সেক্ষেত্রে browserLanguageএবং অবশেষে systemLanguage

আপনি যদি নেটটিতে অন্য কোথাও একটি সার্ভার-সাইড স্ক্রিপ্ট রাখতে পারেন যা কেবল স্বীকার করুন-ভাষা শিরোনাম পড়ে এবং স্ট্রিংয়ের শিরোনামের মান সহ জাভাস্ক্রিপ্ট ফাইল হিসাবে এটি ফিরিয়ে আনে:

var acceptLanguage= 'en-gb,en;q=0.7,de;q=0.3';

তারপরে আপনি কোনও <স্ক্রিপ্ট src> অন্তর্ভুক্ত করতে পারেন যে এইচটিএমএলটিতে বাহ্যিক পরিষেবাটির দিকে নির্দেশ করে এবং ভাষা শিরোনামকে বিশ্লেষণ করতে জাভাস্ক্রিপ্ট ব্যবহার করতে পারেন। এটি করার জন্য আমি কোনও বিদ্যমান লাইব্রেরি কোড জানি না, যদিও স্বীকার করুন-ভাষা পার্সিং প্রায় সর্বদা সার্ভারের দিকে করা হয়।

আপনি যে কাজটি শেষ করেন না কেন অবশ্যই আপনার অবশ্যই একটি ব্যবহারকারী ওভাররাইডের প্রয়োজন কারণ এটি কিছু লোকের পক্ষে সর্বদা ভুল অনুমান করবে। ইউআরএলটিতে ভাষা সেটিংটি প্রায়শই সহজ (যেমন: http: //www.example.com/en/site বনাম http: //www.example.com/de/site), এবং ব্যবহারকারীকে ক্লিক করতে দিন দুজনের মধ্যে লিঙ্ক। কখনও কখনও আপনি উভয় ভাষার সংস্করণের জন্য একটি একক ইউআরএল চান, সেই ক্ষেত্রে আপনাকে কুকিগুলিতে সেটিংটি সংরক্ষণ করতে হবে তবে এটি ব্যবহারকারী এজেন্টদের কুকিজ এবং অনুসন্ধান ইঞ্জিনগুলির জন্য কোনও সমর্থন না দিয়ে বিভ্রান্ত করতে পারে।


11
MDN বিকাশকারী থেকে। মোজিলা.অর্গ / en- US/docs/Web/API/ নাভিগেটর ল্যাঙ্গুয়েজ/… "ব্যবহারকারীর ব্রাউজার থেকে প্রতিটি HTTP অনুরোধে স্বীকৃত-ভাষা HTTP শিরোনাম নেভিগেটরের জন্য একই মান ব্যবহার করে lang ভাষা ব্যতীত অতিরিক্ত সম্পত্তি ব্যতীত ভাষা বৈশিষ্ট্য কোভালিউস (মানের মান) ক্ষেত্র (যেমন এন-ইউএস; কিউ = 0.8) ""
এস মায়ডেন

3
আপডেট: এখন (2020) সমস্ত আধুনিক ব্রাউজার দ্বারা সমর্থিত একটি পরীক্ষামূলক বৈশিষ্ট্য রয়েছে যা ভাষা পছন্দের একটি অ্যারে ফিরিয়ে দেয়: navigator.languages //["en-US", "zh-CN", "ja-JP"]2020 এ এটি কমপক্ষে 95% ব্রাউজারে কাজ করা উচিত
কর্নেলিয়াস রোমার

1
navigator.languagesMDN এবং caniuse.com উভয়ের মতে , এখন সমস্ত বড় ব্রাউজারে উপলব্ধ - সর্বাধিক আধুনিক এবং পিছনের দিকে সামঞ্জস্যপূর্ণ পদ্ধতির জন্য ন্যাভিগেটর-ভাষা প্যাকেজটি চেষ্টা করুন (200 ডলার বাইট) ।
mindplay.dk

84

ক্রোম এবং ফায়ারফক্স ৩২++ এ, নেভিগেটর.এলগ্র্যাজেজে ব্যবহারকারী পছন্দ অনুসারে লোকেলের একটি অ্যারে রয়েছে এবং নেভিগেটর.এলংগ্রেজের তুলনায় আরও নির্ভুল, তবে এটি পিছনের দিকে সামঞ্জস্যপূর্ণ করতে (পরীক্ষিত ক্রোম / আইই / ফায়ারফক্স / সাফারি) ব্যবহার করুন, তারপরে ব্যবহার করুন এই:

function getLang()
{
 if (navigator.languages != undefined) 
 return navigator.languages[0]; 
 else 
 return navigator.language;
}

2
এটি IE9 এবং IE10 এর জন্য কাজ করে না। তাদের জন্য, আপনাকে পরিবর্তে নেভিগেটর.ব্রোজারল্যাঙ্গোয়েজ পরীক্ষা করতে হবে।
user393274

2
ওয়ানলাইনার:function getLang(){ return ( navigator.language || navigator.languages[0] ); }
জোর্জেগার্জা

4
@ChStark করা উচিত নয় এটা হতে return navigator.languages[0] || navigator.language;?
জেমস_

23
এছাড়াও, সঠিক "ওয়ান মাছ ধরার নৌকা" ভালো দেখাবে: return (navigator.languages && navigator.languages.length) ? navigator.languages[0] : navigator.language;। অন্যথায় আপনি যদি navigator.languagesঅপরিজ্ঞাত বা খালি থাকে তবে একটি ব্যতিক্রম পাবেন ।
ম্যাক্স ট্রুক্সা

আরও কমপ্যাক্ট সংস্করণের জন্যconst getLang = () => navigator.language || navigator.browserLanguage || ( navigator.languages || [ "en" ] ) [ 0 ]
জোও মিগুয়েল ব্র্যান্ডো

41

এই নিবন্ধটি ব্রাউজারের ন্যাভিগেটর অবজেক্টের নিম্নলিখিত বৈশিষ্ট্যগুলির পরামর্শ দেয় :

  • navigator.language (নেটস্কেপ - ব্রাউজার স্থানীয়করণ)
  • navigator.browserLanguagই (আইই-নির্দিষ্ট - ব্রাউজার স্থানীয়করণের ভাষা)
  • navigator.systemLanguage (আইই-নির্দিষ্ট - উইন্ডোজ ওএস - স্থানীয়ীকৃত ভাষা)
  • navigator.userLanguage

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

ক্লায়েন্টের পক্ষে এটি করার একমাত্র সমস্যাটি হ'ল হয় আপনি সমস্ত ভাষা ক্লায়েন্টের কাছে পরিবেশন করেছেন, অথবা সঠিক সংস্করণটির অনুরোধ করার আগে স্ক্রিপ্টটি চালিত না হয়ে এবং ভাষাটি সনাক্ত না হওয়া পর্যন্ত আপনাকে অপেক্ষা করতে হবে। সম্ভবত ডিফল্ট হিসাবে সর্বাধিক জনপ্রিয় ভাষা সংস্করণ পরিবেশন করা খুব কম লোককে বিরক্ত করবে।

সম্পাদনা: আমি ইভানের কুকি পরামর্শটি দ্বিতীয় করতাম, তবে নিশ্চিত হয়ে নিন যে ব্যবহারকারী সর্বদা ভাষাটি পরে পরিবর্তন করতে পারে; প্রত্যেকে ভাষা তাদের ব্রাউজারের ডিফল্ট পছন্দ করে না।


আপনার পরামর্শের জন্য ফিল ধন্যবাদ। নিবন্ধটি সম্পর্কে, এটি 6 বছরের পুরানো ... আমরা কি এটির উপর নির্ভর করতে পারি না নিশ্চিত?
থিও.টি

1
আমি সন্দেহ করি যে আধুনিক ব্রাউজারগুলি সব নেভিগেটর.এলংগ্রেজে সমর্থন করে। আমার ব্রাউজারটি (উবুন্টু 8.10-এ এফএফ 3) 'এন-জিবি' প্রতিবেদন করেছে। যদি কেউ এখনও আই 6 ব্যবহার করে - প্রায় 20% লোক - তবে এটির জন্য এটি মূল্যবান। আই 6 হাজির 8 বছর আগে।
ফিল এইচ

আইই 8 ন্যাভিগেটর.লংগলজি সমর্থন করে না। সম্ভবত আইই 9 করবে?
স্পিগ করুন

36

ব্রাউজারগুলি ব্যবহারকারীর ভাষা সংরক্ষণ করার জন্য একাধিক উপায়গুলি ব্যবহার করে আপনি এই ফাংশনটি পাবেন:

const getNavigatorLanguage = () => {
  if (navigator.languages && navigator.languages.length) {
    return navigator.languages[0];
  } else {
    return navigator.userLanguage || navigator.language || navigator.browserLanguage || 'en';
  }
}

আমরা প্রথমে navigator.languagesঅ্যারেটিকে তার প্রথম উপাদানটির জন্য পরীক্ষা করি ।
তারপর আমরা পেতে পারেন navigator.userLanguageবা navigator.language
যদি এটি ব্যর্থ হয় তবে আমরা পাই navigator.browserLanguage
সবশেষে 'en'ব্যর্থ হলে শেষ পর্যন্ত আমরা সেট করেছিলাম ।


এবং এখানে সেক্সি ওয়ান-লাইনার:

const getNavigatorLanguage = () => (navigator.languages && navigator.languages.length) ? navigator.languages[0] : navigator.userLanguage || navigator.language || navigator.browserLanguage || 'en';

স্পষ্টতই কিছু আছে navigator.userLanguage(আই আই এর জন্য)। এটি সম্পূর্ণ করতে আপনি এটি যোগ করতে পারেন :)
পোরাস

কেন সহজভাবে নয় navigator.languages[0] || navigator.userLanguage || navigator.language || navigator.browserLanguage || 'en'?
আমেরিকা

@ অভিশপ্ত কারণ navigator.languagesহতে পারেundefined
জেনু

@ জেনু কোন ব্রাউজারে আপনি জানেন?
আমেরিকা

(navigator.languages || [])[0] || navigator.userLanguage || navigator.language || navigator.browserLanguage || 'en'
স্টিভ বেনেট

10

ব্যবহারকারীর পছন্দসই ভাষা এবং সিস্টেম / ব্রাউজার লোকেলের মধ্যে পার্থক্য রয়েছে।

কোনও ব্যবহারকারী ব্রাউজারে পছন্দসই ভাষা কনফিগার করতে পারেন এবং এগুলি navigator.language(s)ভাষার অগ্রাধিকারের তালিকা অনুসারে সামগ্রীর জন্য অনুরোধ করার জন্য কোনও সার্ভার থেকে সংস্থান করার অনুরোধ করার জন্য ব্যবহৃত হবে এবং ব্যবহৃত হবে ।

তবে ব্রাউজারের লোকেল কীভাবে নম্বর, তারিখ, সময় এবং মুদ্রা রেন্ডার করবেন তা সিদ্ধান্ত নেবে। এই সেটিংটি সম্ভবত সর্বোচ্চ র‌্যাঙ্কিংয়ের ভাষা, তবে এর কোনও গ্যারান্টি নেই। ম্যাক এবং লিনাক্সে, স্থানীয় ভাষা ব্যবহারকারীর ভাষা পছন্দ নির্বিশেষে সিস্টেম দ্বারা সিদ্ধান্ত নেওয়া হয়। উইন্ডোজে ক্রোমে পছন্দের তালিকার বিভিন্ন ভাষার মধ্যে নির্বাচিত হতে পারে।

ইন্টেল ( https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / ইনটেল) ব্যবহার করে , বিকাশকারীরা এই জিনিসগুলি রেন্ডার করতে লোকেলকে ওভাররাইড / সেট করতে পারে তবে এমন উপাদান রয়েছে যা <input type="date">বিন্যাসের মতো ওভাররাইড করা যায় না ।

এই ভাষাটি সঠিকভাবে নিষ্কাশন করতে, আমি খুঁজে পেয়েছি একমাত্র উপায়:

(new Intl.NumberFormat()).resolvedOptions().locale

( Intl.NumberFormat().resolvedOptions().localeএছাড়াও কাজ মনে হয়)

এটি ডিফল্ট লোকেলের জন্য একটি নতুন নম্বর ফর্ম্যাট উদাহরণ তৈরি করবে এবং তারপরে সমাধান হওয়া বিকল্পগুলির লোকেলটি পুনরায় পাঠ করবে।


5

আমি এ সম্পর্কে কিছুটা গবেষণা করেছি এবং আমি আমার অনুসন্ধানগুলি এখন পর্যন্ত নীচের টেবিলে সংক্ষিপ্ত করে তুলেছি

এখানে চিত্র বর্ণনা লিখুন

সুতরাং প্রস্তাবিত সমাধানটি হ্যাডারকে পার্স করার জন্য এএ সার্ভার সাইড স্ক্রিপ্ট লিখতে Accept-Languageহবে এবং ওয়েবসাইটটির ভাষা নির্ধারণের জন্য ক্লায়েন্টকে দেওয়া হবে। এটি অদ্ভুত যে কেন ক্লায়েন্টের ভাষা পছন্দ সনাক্তকরণের জন্য সার্ভারের প্রয়োজন হবে তবে এখনকার মতো এটি ভাষা সনাক্ত করার জন্য অন্যান্য বিভিন্ন হ্যাক উপলব্ধ রয়েছে তবে শিরোনামটি পড়া Accept-Languageআমার বোঝার অনুসারে প্রস্তাবিত সমাধান।


2

আপনি ডকুমেন্ট থেকে ভাষাটি পাওয়ার চেষ্টা করতে পারেন আপনার কলটির প্রথম পোর্ট হওয়া উচিত, তারপরে অন্য উপায়ে ফিরে আসার কারণ প্রায়ই লোকেরা চাইবে যে তাদের জেএস ভাষা নথির ভাষার সাথে মেলে।

HTML5 এর:

document.querySelector('html').getAttribute('lang')

উত্তরাধিকার:

document.querySelector('meta[http-equiv=content-language]').getAttribute('content')

কোনও আসল উত্স অগত্যা 100% নির্ভরযোগ্য নয় কারণ লোকেরা সহজেই ভুল ভাষায় লিখতে পারে।

ভাষা সনাক্তকরণ লাইব্রেরি রয়েছে যা আপনাকে সামগ্রীতে ভাষা নির্ধারণ করতে পারে।


1

আমি সমস্ত উত্তর ব্যবহার করেছি এবং একটি একক লাইন সমাধান তৈরি করেছি:

const getLanguage = () => navigator.userLanguage || (navigator.languages && navigator.languages.length && navigator.languages[0]) || navigator.language || navigator.browserLanguage || navigator.systemLanguage || 'en';

console.log(getLanguage());

-1

আপনি বলেছিলেন আপনার ওয়েবসাইট ফ্ল্যাশ, তারপর, অন্য কোনো বিকল্প হিসাবে, আপনি অপারেশন সিস্টেম এর ভাষাটি সঙ্গে পেতে পারে flash.system.Capabilities.language- দেখুন কিভাবে ব্রাউজারের মধ্যে ওএস ভাষা নির্ধারণ করতে করতে অনুমান একটি অপারেশন সিস্টেম লোকেল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.