कोर एमवीसी बिल्ट-इन सुविधाओं के साथ ASP.NET बहुभाषी स्विचिंग

पेज अद्यतन :
पेज निर्माण की तारीख :

वातावरण

विजुअल स्टूडियो
  • विजुअल स्टूडियो 2019
ASP.NET कोर
  • 3.0
  • 3.1

पहले

ASP.NET प्रदर्शित करने के लिए कई भाषाओं के बीच स्विच करने के लिए कोर एमवीसी स्थानीयकरण सुविधाओं का उपयोग करें।

अनुवादित पाठ के लिए एक संसाधन फ़ाइल बनाएं

टेक्स्ट को मैनेज करने वाली रिसोर्स फाइल्स (रेसेक्स) स्टोर करने के लिए फोल्डर बनाएं। स्थान कहीं भी है, लेकिन इसे सीधे मार्ग से नीचे छोड़ दें। यह रास्ता बाद में सेटिंग को भी प्रभावित करता है।

प्रोजेक्ट पर राइट-क्लिक करें और ऐड या न्यू फोल्डर का चयन करें।

image

फ़ोल्डर नाम संसाधनों को छोड़ दें। आप इस फ़ोल्डर नाम को मनमाने ढंग से सेट भी कर सकते हैं, लेकिन आप बाद की सेटिंग्स में इस फ़ोल्डर नाम को निर्दिष्ट कर सकते हैं।

image

फिर प्रत्येक भाषा के लिए पाठ दर्ज करने के लिए एक संसाधन फ़ाइल बनाएं।

सही क्लिक करें संसाधनफ़ोल्ड और ऐड या नए आइटम का चयन करें।

image

संसाधन फ़ाइल (.रेसेक्स) का चयन करें। फाइल नाम मनमाना हो सकता है, लेकिन यह आपके द्वारा निर्दिष्ट नाम से मेल खाता है। अभी के लिए, हम साझाResource.resx कहते हैं ।

image

.resx फ़ाइल बनाने के बाद, इसे खोलने के लिए डबल-क्लिक करें, और फिर उस नाम को टाइप करें जो पाठ और पाठ की पहचान करता है जिसे आप वास्तव में प्रदर्शित करना चाहते हैं। साझाResource.resx फ़ाइल फ़ाइल का उपयोग किया जाना है यदि भाषा मौजूद नहीं है। मैं इसे जापानी में यहां में प्रवेश किया । यदि आप अंग्रेजी जैसी अन्य भाषाओं को डिफ़ॉल्ट चाहते हैं, तो उन्हें उस भाषा में दर्ज करें।

यहां हम नमूने के रूप में नमस्ते और अलविदा दर्ज करते हैं । ध्यान दें कि यह मामला संवेदनशील है।

image

अन्य भाषाओं के लिए संसाधन फ़ाइलें बनाना जारी रखें। भाषा की पहचान करने के लिए, फ़ाइल का नाम निर्दिष्ट करें, जैसे कि शेयर्डरिसोर्स.<culture Code>.resx। आप संस्कृति कोड के लिए आईएसओ 639 और आईएसओ 3166 के दोनों संयोजननिर्दिष्ट कर सकते हैं। समर्थन कोड समय-समय पर परिवर्तन के अधीन है, इसलिए माइक्रोसॉफ्ट साइट पर CultureInfo वर्ग कृपया पृष्ठ का उल्लेख करें।

इस बार एन (इंग्लिश) और ईएस (स्पैनिश) तैयार किए जाते हैं। जापानी उपलब्ध नहीं है क्योंकि यह डिफ़ॉल्ट है।

image

प्रत्येक फ़ाइल के लिए एक ही राज्य में चाबियों के साथ अनुवादित पाठ दर्ज करें।

image

image

इसके बाद, आपके पास एक फ़ाइल होगी जो केवल कक्षाओं को परिभाषित करती है। आप इसे उसी नाम के साथ बनाते हैं जो आपके द्वारा अभी बनाई गई संसाधन फ़ाइल के रूप में है।

दरअसल, मुझे इस बात की परवाह नहीं है कि कोड फाइल का नाम खुद क्या है क्योंकि आपको सिर्फ अंदर क्लास के नाम से मैच करना होता है, बल्कि इसे वैसे ही छोड़ देना होता है ताकि समझना आसान हो। इससे कोई फर्क नहीं पड़ता कि आप कोड कहां लिखना चाहते हैं।

image

नामस्थान परियोजना की जड़ बनाएं और एक खाली वर्ग बनाएं।

namespace LocalizationText
{
  // クラス名は作成した .resx のファイル名と同じにする必要がある
  public class SharedResource { }
}

प्रत्येक कार्यक्रम को ठीक करें

Startup.cs

Startup.cs ठीक करें। कॉन्फ़िगर सर्विसेज विधि का वर्णन इस प्रकार है:

सेवाओं. ऐडएमवीसी () । यदि एक AddViewLocalization विधि है, तो दृश्य पक्ष और नियंत्रक पक्ष दोनों द्वारा अनुवादित पाठ है मुझे यकीन है कि मैं इसे प्राप्त कर सकता हूं, लेकिन जैसा कि आधिकारिक वेबसाइट सेवाओं पर भी है। ऐडलोकलाइजेशन विधि को एक साथ बुलाने में कोई समस्या नहीं है।

विकल्प. रिसोर्सपाथ फ़ोल्डर का रास्ता निर्दिष्ट करता है जहां रेसएक्स फ़ाइल स्थित है। यदि दोनों निर्दिष्ट हैं, तो सेवाएं। ऐडएमवीसी () । ऐडव्यूलोकलाइजेशन विधि वरीयता लेती है।

public void ConfigureServices(IServiceCollection services)
{
  services.AddControllersWithViews();

  // Resx ファイルのあるフォルダを指定する。
  // コントローラー側でしか使用しないならこちらでもよい。AddViewLocalization を使用するならこちらはなくても動作する。
  //services.AddLocalization(options => options.ResourcesPath = "Resources");

  services.AddMvc()
    // ローカライズに必要。Resx ファイルのフォルダパスを指定
    .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix, opts => { opts.ResourcesPath = "Resources"; });
}

फिर Startup.cs के लिए कॉन्फ़िगर विधि को संशोधित करते हैं। यदि आप सिर्फ संसाधन फ़ाइल पढ़ना चाहते हैं, तो आपको इसकी आवश्यकता नहीं है। कोड जो उपयोगकर्ता को मनमाने ढंग से भाषा निर्दिष्ट करने की अनुमति देने के लिए आवश्यक है।

हम ASP.NET कोर एमवीसी में निर्मित सुविधाओं का मानक के रूप में उपयोग कर रहे हैं। निम्नलिखित कोड उपयोगकर्ता के पर्यावरण के आधार पर "क्वेरी स्ट्रिंग", "कुकी", और "स्वीकार-भाषा HTTP हेडर" का वर्णन करता है। आप उनमें से एक में प्रदर्शन भाषाओं के बीच स्विच कर सकते हैं। हम आपको बाद में देखेंगे कि वास्तविक ऑपरेशन की जांच कैसे करें।

स्विच करने योग्य भाषा यहां सरणी (समर्थित संस्कृतियों) में निर्दिष्ट की गई है। मैंने जा को डिफ़ॉल्ट भाषा के रूप में निर्दिष्ट किया है, लेकिन मैंने इस बार जा फ़ाइल नहीं बनाई है। यदि एन, ईएस के अलावा अन्य भाषा निर्दिष्ट है तो साझाResource.resx का उपयोग किया जाता है।

आप यूआई को उन भाषाओं से अलग कर सकते हैं जिनका आप समर्थन करते हैं, लेकिन इसे अलग करने में ज्यादा लाभ नहीं है। आपकी एक ही भाषा है।

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
  if (env.IsDevelopment())
  {
    // 省略
  }

  // 標準の機能で切り替えたい言語を定義します。
  var supportedCultures = new[]
  {
    new CultureInfo("ja"),
    new CultureInfo("en"),
    new CultureInfo("es"),
  };

  // 標準の言語切り替え機能を有効にします。対応しているのは「クエリ文字列」「Cookie」「Accept-Language HTTP ヘッダー」です。
  app.UseRequestLocalization(new RequestLocalizationOptions
  {
    DefaultRequestCulture = new RequestCulture("ja"),
    SupportedCultures = supportedCultures,
    SupportedUICultures = supportedCultures
  });

  app.UseHttpsRedirection();
  app.UseStaticFiles();

  // 省略
}

नियंत्रक\होमकंट्रोलर.सीएस

नियंत्रक\Homeनियंत्रक.cs फ़ाइल। नियंत्रक पक्ष पर एक स्थानीय भाषा प्राप्त करने के लिए, निर्माता में iStringLocalizer प्राप्त होता है। साझा संसाधन में वही नाम होना चाहिए जो आपने पहले बनाया था। पाठ संसाधन फ़ाइल में प्रवेश कुंजी स्ट्रिंग गुजर द्वारा प्राप्त स्थानीय लोगों के आयातक को पारित किया जाता है। वापस लाया जा सकता है। पाठ की भाषा संस्कृति का अनुरोध किया जा रहा है के आधार पर निर्धारित किया जाता है।

वैसे, IStringLocalizer के अलावा, एक IHtmlLocalizer भी है जो एचटीएमएल प्राप्त कर सकता है।

public class HomeController : Controller
{
  private readonly ILogger<HomeController> _logger;
  private readonly IStringLocalizer<SharedResource> _localizer;

  // DI でローカライザーを取得します。
  public HomeController(ILogger<HomeController> logger, IStringLocalizer<SharedResource> localizer)
  {
    _logger = logger;
    _localizer = localizer;
  }

  public IActionResult Index()
  {
    // ローカライザーを使用して設定されている言語のリソースファイルからテキストを取得します。
    ViewData["Message"] = _localizer["Goodbye"];

    return View();
  }

  // 省略
}

विचार \_ViewImports.cshtml

विचार \_ViewImports.cshtml फ़ाइल। व्यू साइड पर लोकलाइजर का उपयोग करने के लिए, आपको IHtmlLocalizer इंजेक्ट करना होगा। यदि आप इसे अभी के लिए इस प्रकार के रूप में वर्णन करते हैं, यह ठीक है । इसके अलावा, साझा संसाधन में संसाधन फ़ाइल और आपके द्वारा पहले बनाई गई कक्षा के समान नाम होना चाहिए।

IhtmlLocalizer Microsoft.AspNetCore.Mvc.Localization namespace में है, इसलिए मैं इसे उपयोग के रूप में परिभाषित करूंगा।

यदि आप केवल एक निश्चित बिंदु पर स्थानीय लोगों का उपयोग करना चाहते हैं, तो आप निम्नलिखित कोड को एक अलग दृश्य फ़ाइल में शामिल कर सकते हैं। यदि आप इसे _ViewImports.cshtml फ़ाइल में लिखते हैं, तो आप स्वचालित रूप से सभी दृश्य फ़ाइलों में इसका उपयोग कर सकेंगे।

@using LocalizationText
@using LocalizationText.Models
@using Microsoft.AspNetCore.Mvc.Localization
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@* ビュー側でローカライザーを使用できるように定義します *@
@inject IHtmlLocalizer<SharedResource> Localizer

विचार\ होम\इंडेक्स.cshtml

विचार\ होम\ Index.cshtml फ़ाइल। नियंत्रक पक्ष पर प्राप्त पाठ और सीधे दृश्य पक्ष पर प्राप्त पाठ क्रमशः प्रदर्शित किए जाते हैं। व्यू-साइड लोकलाइजर को इंडेक्सर के लिए एक महत्वपूर्ण स्ट्रिंग निर्दिष्ट करके पाठ भी मिलता है।

@{
    ViewData["Title"] = "Home Page";
}

<div class="text-center">
  <h1 class="display-4">Welcome</h1>
  <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

@* ローカライザーから取得したテキストを表示します。 *@
<p>@Localizer["Hello"]</p>
<p>@ViewData["Message"]</p>

ऑपरेशन की जांच करें

क्वेरी स्ट्रिंग

यूआरएल की क्वेरी स्ट्रिंग में कल्चर कोड निर्दिष्ट करके आप डिस्प्ले लैंग्वेज को स्विच कर सकते हैं। इसका प्रारूप है? संस्कृति = & संस्कृति संहिता>। यदि आप इसे यूआई से अलग करना चाहते हैं, तो यह संस्कृति = और एलटी; संस्कृति संहिता और जीटी और यूआई-कल्चर= एंड लेफ्टिनेंट एंड कल्चर कोड एंड जीटी; होगा।

यदि आप कुछ भी निर्दिष्ट नहीं करते हैं: यदि निर्दिष्ट नहीं किया जाता है, तो साझासंसाधन.resx का उपयोग किया जाता है। (वास्तव में, एक और निर्णय लागू किया गया है...)

image

के लिए निर्दिष्ट पैटर्न?संस्कृति = एन । डिस्प्ले लैंग्वेज इंग्लिश है।

image

के लिए निर्दिष्ट पैटर्न?संस्कृति = es । प्रदर्शन भाषा स्पेनिश है।

image

संस्कृति = जा के लिए निर्दिष्ट पैटर्न। मूल रूप से, साझाResource.ja.resx फ़ाइल का उपयोग किया जाता है। साझाResource.resx का उपयोग किया जाता है क्योंकि यह मौजूद नहीं है।

image

ऐसी भाषा निर्दिष्ट करने का प्रयास करें जो मौजूद नहीं है। साझाResource.resx का उपयोग किया जाता है क्योंकि यहां कोई संबंधित फ़ाइल नहीं है।

image

कुकीज़

कुकीज़ डिस्प्ले भाषा को स्विच कर सकती हैं। आम तौर पर सर्वर की ओर से प्रकाशित, लेकिन इस बार मैं सीधे ब्राउज़र समारोह में कुकीज़ रजिस्टर करने की कोशिश करेंगे।

क्योंकि प्रत्येक वेब ब्राउज़र में एक डेवलपर टूल होता है, इसलिए आप इसका उपयोग कुकीज़ रजिस्टर करने के लिए करते हैं। नीचे दिए गए आंकड़े में, आप डेवलपर टूल प्रदर्शित करने के लिए एज पर F12 दबा सकते हैं।

इसी कुकी का नाम है । AspNetCore.culture, और भाषा को निर्दिष्ट करने वाला मूल्य है सी =एंड एलटी; कल्चर कोड एंड जीटी के रूप में दर्ज करें। कुकीज के लिए यूआई कोड भी डालना होगा। एक बार जब आप अपनी कुकी पंजीकृत कर लेते हैं, तो इसे ताज़ा करने के लिए अपने वेब ब्राउज़र पेज को ताज़ा करें। एक कुकी सर्वर पर भेजा जाता है ताकि सर्वर निर्दिष्ट भाषा को पुनः प्राप्त कर सके।

नीचे दिए गए आंकड़े में, आप अंग्रेजी प्रदर्शित करने के लिए सी =एन.यूआईसी = एन दर्ज कर सकते हैं।

image

स्पेनिश प्रदर्शित करने के लिए टाइप सी =es.uic = es।

image

स्वीकार-भाषा HTTP हेडर

स्वीकार-भाषा एचटीटीपी हेडर वेब ब्राउज़र से सर्वर में अनुरोध की गई हेडर जानकारी की जांच करता है। यह तदनुसार भाषाओं को स्विच करने की क्षमता है।

आप अपनी वेब ब्राउज़र सेटिंग में कोई भी स्वीकार-भाषा भेज सकते हैं, लेकिन डिफ़ॉल्ट रूप से आप ओएस भाषा सेटिंग्स से मेल कर सकते हैं। स्वीकार भाषा अब भेजा जाता है । (चाहे या नहीं यह वास्तव में भेजा जाता है ओएस और वेब ब्राउज़र पर निर्भर करता है.) ओएस की भाषा के लिए वेब ब्राउज़र में भाषा शुरू की जाती है, लेकिन यह सही हो सकती है।

इसलिए, उदाहरण के लिए, जैसा कि नीचे दिए गए आंकड़े में दिखाया गया है, आप अंग्रेजी भाषा के ओएस के वेब ब्राउज़र में पेज खोल सकते हैं और जानकारी भेज सकते हैं, ताकि आप स्वचालित रूप से कर सकें अंग्रेजी प्रदर्शित करने के लिए साझाResource.en.resx का चयन किया गया है।

image

यदि आप क्वेरी स्ट्रिंग में मौजूद नहीं होने वाली भाषा निर्दिष्ट करने की कोशिश करते हैं, तो आपको मूल रूप से साझाResource.resx का उपयोग करना चाहिए। स्वीकार-भाषा अंग्रेजी प्रदर्शित करता है क्योंकि एन मौजूद है ।

image

यदि क्वेरी स्ट्रिंग में जा निर्दिष्ट किया जाता है, तो क्वेरी स्ट्रिंग वरीयता लेती है और जापानी प्रदर्शित होती है।

image

सारांश

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