ইংরাজীতে ব্যতিক্রম বার্তা?


298

আমরা আমাদের সিস্টেমে ঘটে যাওয়া যে কোনও ব্যতিক্রম লগইন করছি ception একটি ফাইলের ব্যতিক্রম লিখে ess তবে এগুলি ক্লায়েন্টের সংস্কৃতিতে রচিত। এবং তুর্কি ত্রুটিগুলি আমার কাছে খুব একটা বোঝায় না।

তাহলে আমরা কীভাবে ব্যবহারকারীর সংস্কৃতি পরিবর্তন না করে ইংরেজিতে কোনও ত্রুটি বার্তা লগ করতে পারি?


8
আপনি কেন এই জাতীয় পদক্ষেপ করতে পারবেন না: সংস্কৃতিআইফোন ওল্ড কালচার = থ্রেড.কন্ট্রেন্টথ্রেড.কর্ন্টকালচার; থ্রেড.কন্ট্রেন্টথ্রেড.কন্টেনচারালচার = সংস্কৃতিআইএনফো.ক্রিয়েটস্পিফিকসালচার ("এনএন"); // নিক্ষেপ এখানে নতুন ব্যতিক্রম => সংস্কৃতি ইংরাজীতে রয়েছে থ্রেড.কেনটর থ্রেড.কেন্দ্রিকালচার = ওল্ড কালচার;
চেগুয়েরে

93
আমি কোনও বিকাশকারীকে জানি না, এটি অ-
ইংরাজী

3
@ জাইক্স্জ ইংলিশভাষী দেশগুলির বাইরে দেখুন এবং আপনি তাদের মধ্যে অনেকগুলি পাবেন: ডি। সমস্যাটি অ-ইংরেজী পাঠ্য নয়, সমস্যা এমন একটি ভাষা যা আপনি বুঝতে পারবেন না। আপনার স্থানীয় ভাষার বার্তাগুলি (সঠিক অনুবাদ অনুমান করে) পুরোপুরি ঠিক আছে।
আলেজান্দ্রো

31
@ আলেজান্দ্রো গুগল করতে একটি স্থানীয় ভাষা থেকে ইংরেজিতে একটি ব্যতিক্রম বার্তা অনুবাদ করার জন্য এটি গাধাটির আরও বড় ব্যথা। এই প্রোগ্রামটিতে।
এন্টোইন মেল্টেজহেম

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

উত্তর:


66

এই সমস্যাটি প্রায় আংশিকভাবে কাজ করা যেতে পারে। ফ্রেমওয়ার্ক ব্যতিক্রম কোডটি বর্তমান থ্রেড লোকেলের উপর ভিত্তি করে এর সংস্থানগুলি থেকে ত্রুটি বার্তাগুলি লোড করে। কিছু ব্যতিক্রমের ক্ষেত্রে, বার্তা সম্পত্তিটি অ্যাক্সেস করার সময় এটি ঘটে।

এই ব্যতিক্রমগুলির জন্য, আপনি বার্তাটির সম্পূর্ণ ইউএস ইংলিশ সংস্করণটি সংক্ষেপে থ্রেড লোকালটি এন-ইউএস-এ লগ-ইন করার সময় (মূল ব্যবহারকারী লোকেলটি আগেই সংরক্ষণ করে এবং ততক্ষনে এটি পুনরুদ্ধার করে) পেতে পারেন।

পৃথক থ্রেডে এটি করা আরও ভাল: এটি নিশ্চিত করে যে কোনও পার্শ্ব প্রতিক্রিয়া হবে না। উদাহরণ স্বরূপ:

try
{
  System.IO.StreamReader sr=new System.IO.StreamReader(@"c:\does-not-exist");
}
catch(Exception ex)
{
  Console.WriteLine(ex.ToString()); //Will display localized message
  ExceptionLogger el = new ExceptionLogger(ex);
  System.Threading.Thread t = new System.Threading.Thread(el.DoLog);
  t.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
  t.Start();
}

যেখানে এক্সেপশনলগার শ্রেণি দেখতে এমন কিছু দেখাচ্ছে:

class ExceptionLogger
{
  Exception _ex;

  public ExceptionLogger(Exception ex)
  {
    _ex = ex;
  }

  public void DoLog()
  {
    Console.WriteLine(_ex.ToString()); //Will display en-US message
  }
}

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

উদাহরণস্বরূপ, যখন একটি আর্গুমেন্টনালএক্সসেপশন ("foo") ব্যতিক্রম ছড়িয়ে দেওয়া হয় তখন উত্পন্ন বার্তার অংশটি 'প্যারামিটারটি নাল হতে পারে না' ক্ষেত্রে প্রযোজ্য। এই ক্ষেত্রে, বার্তাটি এখনও স্থানীয়ভাবে প্রদর্শিত হবে (আংশিক), উপরের কোডটি ব্যবহার করার পরেও।

অবৈধ হ্যাক ব্যবহার না করে যেমন আপনার সমস্ত নন-ইউআই কোডটি এন-ইউএস লোকেলের সাহায্যে কোনও থ্রেডে চালানো শুরু করা যায়, আপনি এটি সম্পর্কে অনেক কিছু করতে পারেন বলে মনে হয় না: নেট ফ্রেমওয়ার্ক ব্যতিক্রম কোডটির কোনও নেই ত্রুটি বার্তা লোকালে ওভাররাইড করার জন্য সুবিধা।


10
আপনার উদাহরণটি একটি ফাইলনটফাউন্ডএক্সেপশনটির জন্য কাজ করে, কারণ বার্তা সংস্থানটি অ্যাক্সেস করার পরে বার্তা সংস্থানটি পুনরুদ্ধার করা হয়, ব্যতিক্রম ছোঁড়ার সময় নয়। তবে এটি সমস্ত ব্যতিক্রমগুলির ক্ষেত্রে সত্য নয় (উদাহরণস্বরূপ নতুন আর্গুমেন্টনুলএক্সেপশন ("প্যারামনেম") নিক্ষেপ করার চেষ্টা করুন)
জো

3
আমি দ্বিধান্বিত. আমি আপনার উত্তর অনুসরণ করার চেষ্টা করেছি এবং এটি পরীক্ষা করার জন্য আমি ফরাসী ভাষায় আমার ব্যতিক্রম চেয়েছিলাম, তাই আমি করেছি t.CurrentUICulture = new System.Globalization.CultureInfo("fr-FR");এবং t.CurrentCulture = new System.Globalization.CultureInfo("fr-FR");এখনও, ফলস্বরূপ ব্যতিক্রমটি ইংরেজিতে ছিল ...
VitalyB

7
@ ভিটালিবি স্থানীয় ব্যতিক্রম পাঠ্যগুলি .NET কাঠামোর ভাষা প্যাকগুলির অংশ। সুতরাং আপনার যদি ফরাসী ভাষার প্যাক ইনস্টল না করা থাকে তবে আপনি অনুবাদিত পাঠ্য পাবেন না।
ড্যানিয়েল রোজ

7
কমপক্ষে .NET 4.5 এর সাথে সমস্ত ব্যতিক্রম তাত্ক্ষণিকভাবে চালিত হয় Environment.GetResourceString("...")যাতে আপনার সমাধান আর কাজ করে না। সেরা জিনিসটি হ'ল আপনার নিজের (ইংরাজী) বার্তার পাঠ্যের সাথে কাস্টম ব্যতিক্রম ছুঁড়ে ফেলা এবং পুরানোটি ধরে রাখার জন্য অভ্যন্তরীণ এক্সেকসেপশন সম্পত্তিটি ব্যবহার করুন।
ওয়েববার

1
ব্যতিক্রম ধরণের নামগুলি পাওয়ার প্রতিচ্ছবিটি সহজেই কার্যকর হতে পারে।
গিলারমো প্রান্ডি

67

আপনি আনলকালাইজ ডটকম এ মূল ব্যতিক্রম বার্তাটি অনুসন্ধান করতে পারেন


5
কিছু চীনা ব্যতিক্রম বার্তাগুলি অনুসন্ধান করার চেষ্টা করেছিল, আমাকে সবসময় বলেছিল No records found
টাইলার দীর্ঘ

1
খারাপ পছন্দ. আমি যখন আমার ব্যতিক্রমগুলি Google অ্যানালিটিকাগুলিতে (বা অন্যান্য ক্লাউড পরিষেবা) প্রেরণ করি তখন আমার একই ব্যতিক্রমের জন্য ব্যতিক্রমের বিভিন্ন গোষ্ঠী থাকবে তবে বিভিন্ন ভাষা। এবং আমি প্রতিটি ব্যতিক্রম গণনা অনুসারে বাছাই করতে সক্ষম হব না, কারণ এটি আসল গণনাটি প্রতিফলিত করে না (ইংরেজিতে 100, চীনা ভাষায় 77, কোরিয়ান ভাষায় 80 ... ইত্যাদি)
আর্টিমিয়াস

আমার মনে আছে এই সুন্দর ওয়েবসাইটটি অনেক সময় সন্ধান করার জন্য যখন আমি গুগলে কেবল স্থানীয়করণ ব্যতিক্রম বার্তাগুলি সরিয়ে ফেলেছিলাম, এখন এটি আর পাওয়া যায় না।
মার্টিন ব্রাউন

40

একটি বিতর্কিত পয়েন্ট সম্ভবত, কিন্তু সংস্কৃতি সেট করার পরিবর্তে en-US, আপনি এটি সেট করতে পারেন Invariant। ইন Invariantসংস্কৃতি, ত্রুটি বার্তা ইংরেজিতে লেখা।

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;

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


1
আমাদের এএসপি.এনইটি প্রকল্পে এই লাইনগুলি কোথায় লেখা উচিত? ধন্যবাদ।
জেসন

2
আমি অ্যাপ্লিকেশন_স্টার্টে শীর্ষে পরামর্শ দিতে যাচ্ছি। এটি পুরো প্রকল্পটি ইংরেজীতে চালিত করবে। যদি এটি কেবল ত্রুটি বার্তাগুলির জন্য থাকে যা আপনি এটি চান তবে আপনি একটি কভার ফাংশন তৈরি করতে এবং একে একে কল করতে পারেন catch
এমপিলেটিয়ার

5
যদিও এটি স্ট্যান্ডার্ড বার্তা বাক্স বোতামগুলি ইংরেজিতে থাকবে না? এটি পছন্দসই আচরণ নাও হতে পারে।
নাইয়ারগডস

12

এখানে এমন কোড রয়েছে যা কোনও কোডিংয়ের প্রয়োজন হয় না এবং এমন কি ব্যতিক্রমগুলির পাঠ্যগুলির জন্যও কাজ করে যা কোডের মাধ্যমে পরিবর্তন করতে আমাদের সক্ষম হতে (উদাহরণস্বরূপ, mscorlib) l

এটি প্রতিটি ক্ষেত্রে সর্বদা প্রযোজ্য নাও হতে পারে (এটি আপনার সেটআপের উপর নির্ভর করে যেহেতু মূল .exe ফাইলের পাশে আপনি একটি .config ফাইল তৈরি করতে সক্ষম হওয়া প্রয়োজন) তবে এটি আমার পক্ষে কাজ করে। সুতরাং, কেবলমাত্র একটি app.configইন দেব, (বা একটি [myapp].exe.configবা web.configউত্পাদনে) তৈরি করুন যাতে উদাহরণস্বরূপ নিম্নলিখিত লাইনগুলি রয়েছে:

<configuration>
  ...
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="mscorlib.resources" publicKeyToken="b77a5c561934e089"
                          culture="fr" /> <!-- change this to your language -->

        <bindingRedirect oldVersion="1.0.0.0-999.0.0.0" newVersion="999.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Xml.resources" publicKeyToken="b77a5c561934e089"
                          culture="fr" /> <!-- change this to your language -->

        <bindingRedirect oldVersion="1.0.0.0-999.0.0.0" newVersion="999.0.0.0"/>
      </dependentAssembly>

      <!-- add other assemblies and other languages here -->

    </assemblyBinding>
  </runtime>
  ...
</configuration>

এই কি আছে সমাবেশ জন্য বাইন্ডিং পুনর্নির্দেশ করতে ফ্রেমওয়ার্ক বলতে হয় mscorlibএর সম্পদ ও System.Xml'(সংস্কৃতি "সেট করা হয় গুলি সম্পদ, ফরাসি মধ্যে 1 এবং 999 মধ্যে সংস্করণের জন্য fr(একটি অবাধ") একটি সমাবেশ করে ... বিদ্যমান নয় থেকে সংস্করণ 999)।

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

অবশ্যই আমি এটি মাইক্রোসফ্ট দ্বারা সমর্থিত বলে মনে করি না, সুতরাং আপনার নিজের ঝুঁকিতে ব্যবহার করুন। ঠিক আছে, আপনি যদি কোনও সমস্যা সনাক্ত করেন তবে আপনি কেবল এই কনফিগারেশনটি সরাতে পারেন এবং এটি সম্পর্কিত নয় তা পরীক্ষা করতে পারেন।


1
টেস্ট-রানার সরঞ্জামগুলির কাছ থেকে ইংরেজি আউটপুট প্রয়োজন হলে কাজ করে।
স্মাগ

এটি চেষ্টা করেছিলাম, কিন্তু এটি আমার পক্ষে কার্যকর হয়নি। .Net এ অন্য সংস্থান ফাইল আছে? আমি তাদের কোথায় খুঁজে পাব?
bluE

1
সি দেখুন: \ উইন্ডোজ \ মাইক্রোসফ্ট.নেট \ ফ্রেমওয়ার্ক \ v4.0.30319। প্রতিটি ভাষার একটি 2 অক্ষরের ফোল্ডার রয়েছে। উপরের উত্তরে "ফরাসী ভাষায়" ব্যবহার করা হচ্ছে এমন প্রকৃত ভাষার সাথে মনে রাখবেন।
নরওয়েজিয়ানদের

সম্পূর্ণ তালিকা তৈরি করতে, সেই ফোল্ডারটি একবার দেখুন। এটি প্রায় 120 রিসোর্স ফাইল। তাদের প্রত্যেকটি কনফিগারেশনে যুক্ত করুন। এটি উইন্ডোজ 10 এবং আপাতত নতুনতর সমাধানের একমাত্র সমাধান বলে মনে হচ্ছে, যেহেতু নতুন উইন্ডোগুলিতে। নেট ভাষা প্যাকগুলি আর আনইনস্টল করার কোনও উপায় নেই (OS এর অংশ)। এটি এখন পর্যন্ত জিএসি-তে স্থাপন করা হয়েছে, সুতরাং সেই ভাষা ফোল্ডারগুলি সরিয়ে ফেলা কার্যকর হবে বলে মনে হয় না।
ওল্ফ 5

10

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

নীচের কোডটি পিটি-পিটি ইনস্টল করে একটি এন-ইউএস উইন্ডোজ 7 চূড়ান্ততে:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("pt-PT");
string msg1 = new DirectoryNotFoundException().Message;

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
string msg2 = new FileNotFoundException().Message;

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
string msg3 = new FileNotFoundException().Message;

Pt-PT, en-US এবং en-US এ বার্তা তৈরি করে। যেহেতু কোনও ফরাসী সংস্কৃতি ফাইল ইনস্টল করা নেই, তাই এটি উইন্ডোজ ডিফল্ট (ইনস্টল?) ভাষাতে ডিফল্ট হয়।


এটাই সমস্যার সমাধান। আমার পরিস্থিতিতে পোলিশ ইউআই, ভিস্টালাইজার প্রোগ্রামটি ব্যবহার করে এনএমইউআই ভাষা প্যাকেজ ~ 260MB ইনস্টল করেছে।
ক্রিজিস্তফফ জাইনেটার

5

আমি জানি এটি একটি পুরানো বিষয়, তবে আমি মনে করি যে আমার সমাধানটি যে কোনও একটি ওয়েব অনুসন্ধানে এটির পিছনে হোঁচট খাওয়ার জন্য যথেষ্ট প্রাসঙ্গিক হতে পারে:

ব্যতিক্রম লগারে আপনি প্রাক্তন গেটটাইপ.টোস্ট্রিং লগ করতে পারেন যা ব্যতিক্রম শ্রেণীর নামটি সংরক্ষণ করবে। আমি প্রত্যাশা করব যে কোনও শ্রেণীর নামটি ভাষা থেকে পৃথক হওয়া উচিত এবং তাই ইংরেজিতে সর্বদা প্রতিনিধিত্ব করা হবে (উদাহরণস্বরূপ "System.FileNotFoundException"), যদিও বর্তমানে আমার কাছে পরীক্ষা করার জন্য কোনও বিদেশী ভাষা পদ্ধতিতে অ্যাক্সেস নেই ধারণা.

আপনি যদি সত্যিই ত্রুটি বার্তার পাঠ্যটি চান তবে আপনি যে কোনও ভাষা পছন্দ করে এমন কোনও সম্ভাব্য ব্যতিক্রম শ্রেণীর নাম এবং তাদের সমতুল্য বার্তাগুলির একটি অভিধান তৈরি করতে পারেন, তবে ইংরেজির জন্য আমি মনে করি শ্রেণীর নামটি পুরোপুরি পর্যাপ্ত।


5
কাজ করে না। আমি একটি পেয়েছিলাম InvalidOperationException, দ্বারা নিক্ষিপ্ত System.Xml.XmlWellFormedWriter। আপনি বার্তাটি না পড়ে কী নির্দিষ্ট ত্রুটি ঘটেছে তা অনুমান করার চেষ্টা করুন। হাজার হাজার জিনিস হতে পারে।
নাইয়ারগডস

4
CultureInfo oldCI = Thread.CurrentThread.CurrentCulture;

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture ("en-US");
Thread.CurrentThread.CurrentUICulture=new CultureInfo("en-US");
try
{
  System.IO.StreamReader sr=new System.IO.StreamReader(@"c:\does-not-exist");
}
catch(Exception ex)
{
  Console.WriteLine(ex.ToString())
}
Thread.CurrentThread.CurrentCulture = oldCI;
Thread.CurrentThread.CurrentUICulture = oldCI;

ওয়ার্কারাউন্ডস ছাড়া।

ধন্যবাদ :)


তুমি ভুলে গেছ;
কানসাইরবোট

4

সেটিং Thread.CurrentThread.CurrentUICultureব্যতিক্রম স্থানীয়করণ করতে ব্যবহৃত হবে। আপনার যদি দুই ধরণের ব্যতিক্রমের প্রয়োজন হয় (ব্যবহারকারীর জন্য একটি, আপনার জন্য একটি) আপনি ব্যতিক্রম-বার্তাটি অনুবাদ করতে নিম্নলিখিত ফাংশনটি ব্যবহার করতে পারেন। রিসোর্স-কীটি পেতে এবং তারপরে অনুবাদকৃত মানটি ফেরত দেওয়ার জন্য এটি মূল পাঠ্যের জন্য। নেট-লাইব্রেরি সংস্থাগুলিতে অনুসন্ধান করছে। তবে একটি দুর্বলতা আমি এখনও একটি ভাল সমাধান খুঁজে পাইনি: বার্তাগুলিতে, যেগুলিতে {0} সংস্থান আছে সেগুলি পাওয়া যাবে না। কারও যদি ভাল সমাধান হয় তবে আমি কৃতজ্ঞ হব।

public static string TranslateExceptionMessage(Exception ex, CultureInfo targetCulture)
{
    try
    {
        Assembly assembly = ex.GetType().Assembly;
        ResourceManager resourceManager = new ResourceManager(assembly.GetName().Name, assembly);
        ResourceSet originalResources = resourceManager.GetResourceSet(Thread.CurrentThread.CurrentUICulture, createIfNotExists: true, tryParents: true);
        ResourceSet targetResources = resourceManager.GetResourceSet(targetCulture, createIfNotExists: true, tryParents: true);
        foreach (DictionaryEntry originalResource in originalResources)
            if (originalResource.Value.ToString().Equals(ex.Message.ToString(), StringComparison.Ordinal))
                return targetResources.GetString(originalResource.Key.ToString(), ignoreCase: false); // success

    }
    catch { }
    return ex.Message; // failed (error or cause it's not smart enough to find texts with '{0}'-patterns)
}

ব্যতিক্রমটিতে একটি ফর্ম্যাট প্যারামিটার থাকলে এটি কাজ করবে না।
নিক বেরার্ডি

হ্যাঁ, যেমনটি আমি বলেছিলাম: "তবে একটি দুর্বলতা আমি এখনও একটি ভাল সমাধান খুঁজে পাইনি: বার্তাগুলিতে resources 0 resources সংস্থান রয়েছে যা পাওয়া যাবে না be যদি কারও ভাল সমাধান থাকে তবে আমি কৃতজ্ঞ হব।"
ঘূর্ণি 852456

3

.NET কাঠামো দুটি অংশে আসে:

  1. .NET ফ্রেমওয়ার্ক নিজেই
  2. .NET ফ্রেমওয়ার্ক ভাষার প্যাকগুলি

সমস্ত পাঠ্য (উদাঃ ব্যতিক্রম বার্তা, একটি মেসেজবক্সে বোতাম লেবেল ইত্যাদি) .NET ফ্রেমওয়ার্কেই ইংরেজিতে। ভাষা প্যাকগুলিতে স্থানীয় পাঠ্য লেখা রয়েছে।

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


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

@ চোকোস্মিথ উইন্ডোজ আপডেটের মাধ্যমে .NET ফ্রেমওয়ার্কের প্রতিটি আপডেটের সাথে, ভাষা প্যাকটি আবার ইনস্টল করা হয়েছে।
ড্যানিয়েল রোজ

5
গ্রাহকদের তাদের নিজস্ব ভাষার জন্য ভাষা প্যাকগুলি আনইনস্টল করার জন্য বলা একটি व्यवहार्य সমাধান নয়।
নাইয়ারগডস

2

আমি এই পদ্ধতির একটি কল্পনা করব:

  1. ব্যতিক্রমগুলি কেবল আপনার দ্বারা পঠিত, অর্থাত্ সেগুলি ক্লায়েন্টের বৈশিষ্ট্য নয়, তাই আপনি তুর্কি মোডে চালানোর সময় হার্ডওয়ারযুক্ত অ-স্থানীয়করণযুক্ত স্ট্রিংগুলি পরিবর্তন করতে পারবেন না।

  2. 0x00000001প্রতিটি ত্রুটির সাথে একটি ত্রুটি কোড অন্তর্ভুক্ত করুন যাতে আপনি এটি সহজেই কোনও ইংরেজী টেবিলটিতে দেখতে পারেন।


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

1

আন্ডারকভার ১৯৯৯ উত্তরের উপর ভিত্তি করে, তবে অ্যাকাউন্টগুলির পরামিতিগুলি গ্রহণ করে এবং যখন বার্তাগুলি বেশ কয়েকটি রিসোর্স স্ট্রিং নিয়ে গঠিত হয় (যেমন যুক্তি ব্যতিক্রমগুলি)।

public static string TranslateExceptionMessage(Exception exception, CultureInfo targetCulture)
{
    Assembly a = exception.GetType().Assembly;
    ResourceManager rm = new ResourceManager(a.GetName().Name, a);
    ResourceSet rsOriginal = rm.GetResourceSet(Thread.CurrentThread.CurrentUICulture, true, true);
    ResourceSet rsTranslated = rm.GetResourceSet(targetCulture, true, true);

    var result = exception.Message;

    foreach (DictionaryEntry item in rsOriginal)
    {
        if (!(item.Value is string message))
            continue;

        string translated = rsTranslated.GetString(item.Key.ToString(), false);

        if (!message.Contains("{"))
        {
            result = result.Replace(message, translated);
        }
        else
        {
            var pattern = $"{Regex.Escape(message)}";
            pattern = Regex.Replace(pattern, @"\\{([0-9]+)\}", "(?<group$1>.*)");

            var regex = new Regex(pattern);

            var replacePattern = translated;
            replacePattern = Regex.Replace(replacePattern, @"{([0-9]+)}", @"${group$1}");
            replacePattern = replacePattern.Replace("\\$", "$");

            result = regex.Replace(result, replacePattern);
        }
    }

    return result;
}

1

আমার একই পরিস্থিতি ছিল এবং আমি এখানে এবং অন্য কোথাও যে উত্তরগুলি পেয়েছি সেগুলি সহায়তা করে না বা সন্তোষজনক নয়:

Thread.CurrentUICulture.Net ব্যতিক্রম ভাষা পরিবর্তন ঘটায়, কিন্তু তার জন্য না Win32Exception, যা উইন্ডোজ UI 'তে নিজেই ভাষায় উইন্ডোজ সম্পদ ব্যবহার করে। সুতরাং আমি কখনও Win32Exceptionজার্মান এর পরিবর্তে ইংরেজিতে বার্তা মুদ্রণ করতে পরিচালিত হইনি , এমনকি ইংরেজিতে উইন 32 এক্সেক্সেশন কীভাবে পাবেন তাFormatMessage() বর্ণিত হিসাবে ব্যবহার
করেও না?

তাই আমি আমার নিজস্ব সমাধান তৈরি করেছি, যা বহিরাগত ফাইলগুলিতে বিভিন্ন ভাষার জন্য বিদ্যমান ব্যতিক্রম বার্তাগুলির বেশিরভাগ সঞ্চয় করে। আপনি আপনার পছন্দসই ভাষায় খুব সঠিক বার্তা পাবেন না, তবে আপনি সেই ভাষায় একটি বার্তা পাবেন যা বর্তমানে আপনি যা পেয়েছেন তার চেয়ে অনেক বেশি (যা সম্ভবত আপনি বুঝতে পারেন না এমন ভাষায় একটি বার্তা)।

এই শ্রেণীর স্ট্যাটিক ফাংশনগুলি বিভিন্ন ভাষার সাথে উইন্ডোজ ইনস্টলেশনগুলিতে সম্পাদন করা যেতে পারে: CreateMessages()সংস্কৃতি-নির্দিষ্ট পাঠ্যগুলি ভাষা-নির্দিষ্ট বার্তাগুলির সাহায্যে সমস্ত এক্সএমএল ফাইল লোড করা
SaveMessagesToXML()বা লোড
LoadMessagesFromXML()করে দেওয়ার সাথে সাথে তাদের অনেকগুলি এক্সএমএল ফাইলগুলিতে সংরক্ষণ করে creates

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

VS2008 এর সাথে পরীক্ষিত, ব্যবহারের জন্য প্রস্তুত। আপনার মতামত ও পরামর্শ স্বাগত জানাই!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Reflection;
using System.Threading;
using System.Xml;

public struct CException
{
  //----------------------------------------------------------------------------
  public CException(Exception i_oException)
  {
    m_oException = i_oException;
    m_oCultureInfo = null;
    m_sMessage = null;
  }

  //----------------------------------------------------------------------------
  public CException(Exception i_oException, string i_sCulture)
  {
    m_oException = i_oException;
    try
    { m_oCultureInfo = new CultureInfo(i_sCulture); }
    catch
    { m_oCultureInfo = CultureInfo.InvariantCulture; }
    m_sMessage = null;
  }

  //----------------------------------------------------------------------------
  public CException(Exception i_oException, CultureInfo i_oCultureInfo)
  {
    m_oException = i_oException;
    m_oCultureInfo = i_oCultureInfo == null ? CultureInfo.InvariantCulture : i_oCultureInfo;
    m_sMessage = null;
  }

  //----------------------------------------------------------------------------
  // GetMessage
  //----------------------------------------------------------------------------
  public string GetMessage() { return GetMessage(m_oException, m_oCultureInfo); }

  public string GetMessage(String i_sCulture) { return GetMessage(m_oException, i_sCulture); }

  public string GetMessage(CultureInfo i_oCultureInfo) { return GetMessage(m_oException, i_oCultureInfo); }

  public static string GetMessage(Exception i_oException) { return GetMessage(i_oException, CultureInfo.InvariantCulture); }

  public static string GetMessage(Exception i_oException, string i_sCulture)
  {
    CultureInfo oCultureInfo = null;
    try
    { oCultureInfo = new CultureInfo(i_sCulture); }
    catch
    { oCultureInfo = CultureInfo.InvariantCulture; }
    return GetMessage(i_oException, oCultureInfo);
  }

  public static string GetMessage(Exception i_oException, CultureInfo i_oCultureInfo)
  {
    if (i_oException == null) return null;
    if (i_oCultureInfo == null) i_oCultureInfo = CultureInfo.InvariantCulture;

    if (ms_dictCultureExceptionMessages == null) return null;
    if (!ms_dictCultureExceptionMessages.ContainsKey(i_oCultureInfo))
      return CreateMessage(i_oException, i_oCultureInfo);

    Dictionary<string, string> dictExceptionMessage = ms_dictCultureExceptionMessages[i_oCultureInfo];
    string sExceptionName = i_oException.GetType().FullName;
    sExceptionName = MakeXMLCompliant(sExceptionName);
    Win32Exception oWin32Exception = (Win32Exception)i_oException;
    if (oWin32Exception != null)
      sExceptionName += "_" + oWin32Exception.NativeErrorCode;
    if (dictExceptionMessage.ContainsKey(sExceptionName))
      return dictExceptionMessage[sExceptionName];
    else
      return CreateMessage(i_oException, i_oCultureInfo);
  }

  //----------------------------------------------------------------------------
  // CreateMessages
  //----------------------------------------------------------------------------
  public static void CreateMessages(CultureInfo i_oCultureInfo)
  {
    Thread oTH = new Thread(new ThreadStart(CreateMessagesInThread));
    if (i_oCultureInfo != null)
    {
      oTH.CurrentCulture = i_oCultureInfo;
      oTH.CurrentUICulture = i_oCultureInfo;
    }
    oTH.Start();
    while (oTH.IsAlive)
    { Thread.Sleep(10); }
  }

  //----------------------------------------------------------------------------
  // LoadMessagesFromXML
  //----------------------------------------------------------------------------
  public static void LoadMessagesFromXML(string i_sPath, string i_sBaseFilename)
  {
    if (i_sBaseFilename == null) i_sBaseFilename = msc_sBaseFilename;

    string[] asFiles = null;
    try
    {
      asFiles = System.IO.Directory.GetFiles(i_sPath, i_sBaseFilename + "_*.xml");
    }
    catch { return; }

    ms_dictCultureExceptionMessages.Clear();
    for (int ixFile = 0; ixFile < asFiles.Length; ixFile++)
    {
      string sXmlPathFilename = asFiles[ixFile];

      XmlDocument xmldoc = new XmlDocument();
      try
      {
        xmldoc.Load(sXmlPathFilename);
        XmlNode xmlnodeRoot = xmldoc.SelectSingleNode("/" + msc_sXmlGroup_Root);

        string sCulture = xmlnodeRoot.SelectSingleNode(msc_sXmlGroup_Info + "/" + msc_sXmlData_Culture).Value;
        CultureInfo oCultureInfo = new CultureInfo(sCulture);

        XmlNode xmlnodeMessages = xmlnodeRoot.SelectSingleNode(msc_sXmlGroup_Messages);
        XmlNodeList xmlnodelistMessage = xmlnodeMessages.ChildNodes;
        Dictionary<string, string> dictExceptionMessage = new Dictionary<string, string>(xmlnodelistMessage.Count + 10);
        for (int ixNode = 0; ixNode < xmlnodelistMessage.Count; ixNode++)
          dictExceptionMessage.Add(xmlnodelistMessage[ixNode].Name, xmlnodelistMessage[ixNode].InnerText);
        ms_dictCultureExceptionMessages.Add(oCultureInfo, dictExceptionMessage);
      }
      catch
      { return; }
    }
  }

  //----------------------------------------------------------------------------
  // SaveMessagesToXML
  //----------------------------------------------------------------------------
  public static void SaveMessagesToXML(string i_sPath, string i_sBaseFilename)
  {
    if (i_sBaseFilename == null) i_sBaseFilename = msc_sBaseFilename;

    foreach (KeyValuePair<CultureInfo, Dictionary<string, string>> kvpCultureExceptionMessages in ms_dictCultureExceptionMessages)
    {
      string sXmlPathFilename = i_sPath + i_sBaseFilename + "_" + kvpCultureExceptionMessages.Key.TwoLetterISOLanguageName + ".xml";
      Dictionary<string, string> dictExceptionMessage = kvpCultureExceptionMessages.Value;

      XmlDocument xmldoc = new XmlDocument();
      XmlWriter xmlwriter = null;
      XmlWriterSettings writerSettings = new XmlWriterSettings();
      writerSettings.Indent = true;

      try
      {
        XmlNode xmlnodeRoot = xmldoc.CreateElement(msc_sXmlGroup_Root);
        xmldoc.AppendChild(xmlnodeRoot);
        XmlNode xmlnodeInfo = xmldoc.CreateElement(msc_sXmlGroup_Info);
        XmlNode xmlnodeMessages = xmldoc.CreateElement(msc_sXmlGroup_Messages);
        xmlnodeRoot.AppendChild(xmlnodeInfo);
        xmlnodeRoot.AppendChild(xmlnodeMessages);

        XmlNode xmlnodeCulture = xmldoc.CreateElement(msc_sXmlData_Culture);
        xmlnodeCulture.InnerText = kvpCultureExceptionMessages.Key.Name;
        xmlnodeInfo.AppendChild(xmlnodeCulture);

        foreach (KeyValuePair<string, string> kvpExceptionMessage in dictExceptionMessage)
        {
          XmlNode xmlnodeMsg = xmldoc.CreateElement(kvpExceptionMessage.Key);
          xmlnodeMsg.InnerText = kvpExceptionMessage.Value;
          xmlnodeMessages.AppendChild(xmlnodeMsg);
        }

        xmlwriter = XmlWriter.Create(sXmlPathFilename, writerSettings);
        xmldoc.WriteTo(xmlwriter);
      }
      catch (Exception e)
      { return; }
      finally
      { if (xmlwriter != null) xmlwriter.Close(); }
    }
  }

  //----------------------------------------------------------------------------
  // CreateMessagesInThread
  //----------------------------------------------------------------------------
  private static void CreateMessagesInThread()
  {
    Thread.CurrentThread.Name = "CException.CreateMessagesInThread";

    Dictionary<string, string> dictExceptionMessage = new Dictionary<string, string>(0x1000);

    GetExceptionMessages(dictExceptionMessage);
    GetExceptionMessagesWin32(dictExceptionMessage);

    ms_dictCultureExceptionMessages.Add(Thread.CurrentThread.CurrentUICulture, dictExceptionMessage);
  }

  //----------------------------------------------------------------------------
  // GetExceptionTypes
  //----------------------------------------------------------------------------
  private static List<Type> GetExceptionTypes()
  {
    Assembly[] aoAssembly = AppDomain.CurrentDomain.GetAssemblies();

    List<Type> listoExceptionType = new List<Type>();

    Type oExceptionType = typeof(Exception);
    for (int ixAssm = 0; ixAssm < aoAssembly.Length; ixAssm++)
    {
      if (!aoAssembly[ixAssm].GlobalAssemblyCache) continue;
      Type[] aoType = aoAssembly[ixAssm].GetTypes();
      for (int ixType = 0; ixType < aoType.Length; ixType++)
      {
        if (aoType[ixType].IsSubclassOf(oExceptionType))
          listoExceptionType.Add(aoType[ixType]);
      }
    }

    return listoExceptionType;
  }

  //----------------------------------------------------------------------------
  // GetExceptionMessages
  //----------------------------------------------------------------------------
  private static void GetExceptionMessages(Dictionary<string, string> i_dictExceptionMessage)
  {
    List<Type> listoExceptionType = GetExceptionTypes();
    for (int ixException = 0; ixException < listoExceptionType.Count; ixException++)
    {
      Type oExceptionType = listoExceptionType[ixException];
      string sExceptionName = MakeXMLCompliant(oExceptionType.FullName);
      try
      {
        if (i_dictExceptionMessage.ContainsKey(sExceptionName))
          continue;
        Exception e = (Exception)(Activator.CreateInstance(oExceptionType));
        i_dictExceptionMessage.Add(sExceptionName, e.Message);
      }
      catch (Exception)
      { i_dictExceptionMessage.Add(sExceptionName, null); }
    }
  }

  //----------------------------------------------------------------------------
  // GetExceptionMessagesWin32
  //----------------------------------------------------------------------------
  private static void GetExceptionMessagesWin32(Dictionary<string, string> i_dictExceptionMessage)
  {
    string sTypeName = MakeXMLCompliant(typeof(Win32Exception).FullName) + "_";
    for (int iError = 0; iError < 0x4000; iError++)  // Win32 errors may range from 0 to 0xFFFF
    {
      Exception e = new Win32Exception(iError);
      if (!e.Message.StartsWith("Unknown error (", StringComparison.OrdinalIgnoreCase))
        i_dictExceptionMessage.Add(sTypeName + iError, e.Message);
    }
  }

  //----------------------------------------------------------------------------
  // CreateMessage
  //----------------------------------------------------------------------------
  private static string CreateMessage(Exception i_oException, CultureInfo i_oCultureInfo)
  {
    CException oEx = new CException(i_oException, i_oCultureInfo);
    Thread oTH = new Thread(new ParameterizedThreadStart(CreateMessageInThread));
    oTH.Start(oEx);
    while (oTH.IsAlive)
    { Thread.Sleep(10); }
    return oEx.m_sMessage;
  }

  //----------------------------------------------------------------------------
  // CreateMessageInThread
  //----------------------------------------------------------------------------
  private static void CreateMessageInThread(Object i_oData)
  {
    if (i_oData == null) return;
    CException oEx = (CException)i_oData;
    if (oEx.m_oException == null) return;

    Thread.CurrentThread.CurrentUICulture = oEx.m_oCultureInfo == null ? CultureInfo.InvariantCulture : oEx.m_oCultureInfo;
    // create new exception in desired culture
    Exception e = null;
    Win32Exception oWin32Exception = (Win32Exception)(oEx.m_oException);
    if (oWin32Exception != null)
      e = new Win32Exception(oWin32Exception.NativeErrorCode);
    else
    {
      try
      {
        e = (Exception)(Activator.CreateInstance(oEx.m_oException.GetType()));
      }
      catch { }
    }
    if (e != null)
      oEx.m_sMessage = e.Message;
  }

  //----------------------------------------------------------------------------
  // MakeXMLCompliant
  // from https://www.w3.org/TR/xml/
  //----------------------------------------------------------------------------
  private static string MakeXMLCompliant(string i_sName)
  {
    if (string.IsNullOrEmpty(i_sName))
      return "_";

    System.Text.StringBuilder oSB = new System.Text.StringBuilder();
    for (int ixChar = 0; ixChar < (i_sName == null ? 0 : i_sName.Length); ixChar++)
    {
      char character = i_sName[ixChar];
      if (IsXmlNodeNameCharacterValid(ixChar, character))
        oSB.Append(character);
    }
    if (oSB.Length <= 0)
      oSB.Append("_");
    return oSB.ToString();
  }

  //----------------------------------------------------------------------------
  private static bool IsXmlNodeNameCharacterValid(int i_ixPos, char i_character)
  {
    if (i_character == ':') return true;
    if (i_character == '_') return true;
    if (i_character >= 'A' && i_character <= 'Z') return true;
    if (i_character >= 'a' && i_character <= 'z') return true;
    if (i_character >= 0x00C0 && i_character <= 0x00D6) return true;
    if (i_character >= 0x00D8 && i_character <= 0x00F6) return true;
    if (i_character >= 0x00F8 && i_character <= 0x02FF) return true;
    if (i_character >= 0x0370 && i_character <= 0x037D) return true;
    if (i_character >= 0x037F && i_character <= 0x1FFF) return true;
    if (i_character >= 0x200C && i_character <= 0x200D) return true;
    if (i_character >= 0x2070 && i_character <= 0x218F) return true;
    if (i_character >= 0x2C00 && i_character <= 0x2FEF) return true;
    if (i_character >= 0x3001 && i_character <= 0xD7FF) return true;
    if (i_character >= 0xF900 && i_character <= 0xFDCF) return true;
    if (i_character >= 0xFDF0 && i_character <= 0xFFFD) return true;
    // if (i_character >= 0x10000 && i_character <= 0xEFFFF) return true;

    if (i_ixPos > 0)
    {
      if (i_character == '-') return true;
      if (i_character == '.') return true;
      if (i_character >= '0' && i_character <= '9') return true;
      if (i_character == 0xB7) return true;
      if (i_character >= 0x0300 && i_character <= 0x036F) return true;
      if (i_character >= 0x203F && i_character <= 0x2040) return true;
    }
    return false;
  }

  private static string msc_sBaseFilename = "exception_messages";
  private static string msc_sXmlGroup_Root = "exception_messages";
  private static string msc_sXmlGroup_Info = "info";
  private static string msc_sXmlGroup_Messages = "messages";
  private static string msc_sXmlData_Culture = "culture";

  private Exception m_oException;
  private CultureInfo m_oCultureInfo;
  private string m_sMessage;

  static Dictionary<CultureInfo, Dictionary<string, string>> ms_dictCultureExceptionMessages = new Dictionary<CultureInfo, Dictionary<string, string>>();
}

internal class Program
{
  public static void Main()
  {
    CException.CreateMessages(null);
    CException.SaveMessagesToXML(@"d:\temp\", "emsg");
    CException.LoadMessagesFromXML(@"d:\temp\", "emsg");
  }
}

1
Thread.CurrentUICulture এছাড়াও UI এর ভাষা পরিবর্তন, এটি একটি ভয়ানক বিকল্প করে। একটি ক্লাসিক উদাহরণ বার্তা বাক্সে হ্যাঁ / না / ঠিক আছে / বাতিল বোতামগুলি।
নাইয়ারগডস

0

ইংরাজীতে ব্যতিক্রম বার্তা

try
{
    ......
}
catch (Exception ex)
{
      throw new UserFriendlyException(L("ExceptionmessagesinEnglish"));
}

তারপরে স্থানীয়করণ ফোল্ডারে যান এবং এটিকে প্রকল্পের নাম.এক্সএমএল এ রাখুন এবং যুক্ত করুন

<text name="ExceptionmessagesinEnglish">Exception Message in English</text>

-1

কেবল ত্রুটি বার্তার পরিবর্তে আপনার কল স্ট্যাকটি লগ করা উচিত (আইআইআরসি, সাধারণ ব্যতিক্রম o টুস্ট্রিং () আপনার জন্য এটি করা উচিত)। সেখান থেকে আপনি নির্ধারণ করতে পারেন যে ব্যতিক্রমটি কোথা থেকে এসেছে এবং সাধারণত কোন ব্যতিক্রমটি তা অনুমিত করতে পারেন।


3
আমরা বার্তা এবং স্ট্যাকট্রেস লগ করছি। তবে বার্তাটি পরিষ্কার থাকলে এটি অনেক সহজ।
কেরা

-1

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

    public static string GetEnglishMessageAndStackTrace(this Exception ex)
    {
        CultureInfo currentCulture = Thread.CurrentThread.CurrentUICulture;
        try
        {

            dynamic exceptionInstanceLocal = System.Activator.CreateInstance(ex.GetType());
            string str;
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");

            if (ex.Message == exceptionInstanceLocal.Message)
            {
                dynamic exceptionInstanceENG = System.Activator.CreateInstance(ex.GetType());

                str = exceptionInstanceENG.ToString() + ex.StackTrace;

            }
            else
            {
                str = ex.ToString();
            }
            Thread.CurrentThread.CurrentUICulture = currentCulture;

            return str;

        }
        catch (Exception)
        {
            Thread.CurrentThread.CurrentUICulture = currentCulture;

            return ex.ToString();
        }

1
আমি আগে বলেন ... InvalidOperationException। মেসেজটি ছাড়া এটির অর্থ কী তা খুঁজে বেড়াতে মজা করুন। একটি নতুন উদাহরণ যাদুকরভাবে এটি হবে না।
নাইয়ারগডস

-1

লগিংয়ের উদ্দেশ্যে, নির্দিষ্ট অ্যাপ্লিকেশনগুলিকে ইংলিশ ব্যতিক্রম বার্তা আনার প্রয়োজন হতে পারে (এটি সাধারণ ক্লায়েন্টের ইউআইকালচারে প্রদর্শন করার পাশাপাশি)।

যে উদ্দেশ্যে, নিম্নলিখিত কোড

  1. বর্তমান ইউআইকালচার পরিবর্তন করে
  2. "গেটটাইপ ()" এবং "অ্যাক্টিভেটর.ক্রিয়েট ইনস্ট্যান্স (টি)" ব্যবহার করে নিক্ষিপ্ত ব্যতিক্রমী বস্তুটিকে পুনরায় তৈরি করে
  3. নতুন ইউআইকিউর-এ নতুন এক্সসেপশন অবজেক্টের বার্তা প্রদর্শন করে
  4. এবং তারপরে অবশেষে বর্তমান ইউআইসকালচারকে আগের ইউআইকাল্টারে ফিরিয়ে আনুন।

        try
        {
            int[] a = { 3, 6 };
            Console.WriteLine(a[3]); //Throws index out of bounds exception
    
            System.IO.StreamReader sr = new System.IO.StreamReader(@"c:\does-not-exist"); // throws file not found exception
            throw new System.IO.IOException();
    
        }
        catch (Exception ex)
        {
    
            Console.WriteLine(ex.Message);
            Type t = ex.GetType();
    
            CultureInfo CurrentUICulture = System.Threading.Thread.CurrentThread.CurrentUICulture;
    
            System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
    
            object o = Activator.CreateInstance(t);
    
            System.Threading.Thread.CurrentThread.CurrentUICulture = CurrentUICulture; // Changing the UICulture back to earlier culture
    
    
            Console.WriteLine(((Exception)o).Message.ToString());
            Console.ReadLine();
    
         }

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