একটি সম্পূর্ণ অ্যাপ্লিকেশন জন্য সংস্কৃতি সেট করার একটি উপায় আছে? সমস্ত বর্তমান থ্রেড এবং নতুন থ্রেড?


177

একটি সম্পূর্ণ অ্যাপ্লিকেশন জন্য সংস্কৃতি সেট করার একটি উপায় আছে? সমস্ত বর্তমান থ্রেড এবং নতুন থ্রেড?

আমাদের কাছে একটি সংস্করণটির নাম একটি ডাটাবেসে সঞ্চিত রয়েছে এবং যখন আমাদের প্রয়োগ শুরু হয়, তখন আমরা তা করি

CultureInfo ci = new CultureInfo(theCultureString);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;

তবে অবশ্যই আমরা যখন নতুন থ্রেডে কিছু করতে চাই তখন এটি "হারিয়ে" যায়। এটি সেট করার কোনও উপায় কী CurrentCultureএবং CurrentUICultureপুরো অ্যাপ্লিকেশনটির জন্য? সুতরাং যে নতুন থ্রেড এছাড়াও যে সংস্কৃতি পায়? বা যখনই কোনও নতুন থ্রেড তৈরি হয়ে যায় তখন আমি এমন কিছু ইভেন্ট নিক্ষেপ করতে পারি যা আমি আপ করতে পারি?


4
আপনি যদি সংস্থানগুলি ব্যবহার করে থাকেন তবে আপনি নিজে নিজে এটিকে জোর করতে পারেন: রিসোর্স 1. সংস্কৃতি = নতুন সিস্টেম। গ্লোবালাইজেশন.ক্ল্যাচারআইএনফো ("ফরাসী"); আপনি যতক্ষণ না কোনও স্ট্রিং পুনরুদ্ধার করতে চান ততবারই এটি স্থানীয়করণ এবং ফিরে আসবে
রেজা এস

উত্তর:


196

.NET 4.5 এ, আপনি CultureInfo.DefaultThreadCurrentCultureঅ্যাপডোমাইন সংস্কৃতি পরিবর্তন করতে সম্পত্তিটি ব্যবহার করতে পারেন ।

৪.৫ এর পূর্ববর্তী সংস্করণগুলির জন্য আপনাকে একটি অ্যাপডোমাইন সংস্কৃতি পরিচালনা করতে প্রতিবিম্ব ব্যবহার করতে হবে। CultureInfo( m_userDefaultCultureনেট নেট ২.০ এমস্কোরলিব s_userDefaultCultureইন। নেট m.০ এমএসএসআরলিবিতে) একটি বেসরকারী স্ট্যাটিক ফিল্ড রয়েছে যা CurrentCultureকোনও থ্রেড নিজেই সেই সম্পত্তি সেট না করে থাকলে কী ফিরে আসে তা নিয়ন্ত্রণ করে।

এটি নেটিভ থ্রেড লোকালে পরিবর্তন করে না এবং সম্ভবত সংস্কৃতিকে এভাবে পরিবর্তন করে এমন কোড শিপ করা ভাল ধারণা নয়। যদিও এটি পরীক্ষার জন্য কার্যকর হতে পারে।


9
এএসপি.এনইটি অ্যাপ্লিকেশনগুলিতে এই সেটিংটি সম্পর্কে সতর্ক থাকুন। অ্যাপডোমাইনে সংস্কৃতি সেট করা সমস্ত ব্যবহারকারীর জন্য সংস্কৃতি সেট করবে। সুতরাং ইংরেজী ব্যবহারকারীর পক্ষে জার্মান ভাষায় উদাহরণস্বরূপ ওয়েব সাইটটি দেখা ভাল হবে না।
দিমিতর সোনেভ

2
আমি একটি এএসপি.এনইটি অ্যাপ্লিকেশন উত্তরাধিকার সূত্রে পেয়েছি যা কেবলমাত্র সমস্ত সংস্কৃতি যদি মার্কিন যুক্তরাষ্ট্রে থাকে তবে কাজ করে। এটি এমন একটি দৃশ্য যেখানে এই ত্রুটিটি স্থির না হওয়া পর্যন্ত এই সেটিংসটি সময়ের জন্য উপযুক্ত
ড্যানিয়েল হিলগারথ

37

এটি অনেক জিজ্ঞাসা করা হয়। মূলত, .NET 4.0 এর জন্য নেই, নেই। প্রতিটি নতুন থ্রেড (বা ThreadPoolফাংশন) এর শুরুতে আপনাকে এটি ম্যানুয়ালি করতে হবে । আপনি সম্ভবত ডিবিতে আঘাত হারাতে সংরক্ষণের জন্য একটি স্থিতিশীল ক্ষেত্রে সংস্কৃতি নাম (বা কেবল সংস্কৃতি অবজেক্ট) সঞ্চয় করতে পারেন, তবে এটি প্রায়।


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

8
এই সত্যিই বিরক্তিকর :( এটা চমৎকার যদি আপনার অ্যাপ্লিকেশনের জন্য স্বয়ংক্রিয়ভাবে বর্তমান (UI 'তে) সংস্কৃতি সেট এবং আছে সব নতুন থ্রেড যে মান কুড়ান একটি উপায় ছিল হবে।
Jedidja

1
আমি এখন এটি নিয়ে কাজ করার পরে এত দীর্ঘ যেহেতু আমরা কী করেছি তা ঠিক মনে নেই। তবে আমি মনে করি এটি হতে পারে যে আমরা রিপোর্ট দর্শকের কাছে প্রেরিত ডেটাসেটে তারিখগুলি ব্যবহার না করে আমরা অ্যাপ্লিকেশনটিতে যে সংস্কৃতিটি সেট করেছিলাম তা ব্যবহার করে আমরা প্রথমে একটি স্ট্রিংয়ে তারিখটি ফর্ম্যাট করেছিলাম। তারপরে প্রতিবেদনটি রেন্ডারিং থ্রেডগুলি ভুল সংস্কৃতি ব্যবহার করেছে তা আসলে আর কিছু যায় আসে না। সুতরাং আমরা ভুল সংস্কৃতি ব্যবহার করে থ্রেড নিয়ে সমস্যাটি ঘটিয়েছি। আমরা শুধু পেয়ে তারিখ সমস্যা কাছাকাছি কাজ ভুলভাবে ফরম্যাট :)
Svish

2
আমাদের অ্যাপ্লিকেশনটিতে, আমি থ্রেডগুলি "ক্যাপচার" করার চেষ্টা করেছি (নির্দিষ্ট জায়গা থেকে একটি বিশেষ পদ্ধতি কল করে) এবং পরে ব্যবহারের জন্য (সংস্কৃতি স্থাপনের ক্ষেত্রে এই ক্ষেত্রে) একটি সংগ্রহে সেগুলি সংরক্ষণ করেছি, যা দেখে মনে হচ্ছে এটি এখন পর্যন্ত কাজ করে।
মিঃ টিএ

1
আপনি সেশনে সংস্কৃতিফোন অবজেক্টটি সংরক্ষণ করতে পারবেন না এবং (যদি আপনি মাস্টারপেজ ব্যবহার করছেন) আপনার মাস্টারপেজ কোডবিহীন জন্য এটি পরীক্ষা করে বর্তমান থ্রেড সেট করতে পারেন না?
ব্যবহারকারী 609926

20

আপনি যদি সংস্থানগুলি ব্যবহার করে থাকেন তবে আপনি ম্যানুয়ালি এটি দ্বারা জোর করতে পারেন:

Resource1.Culture = new System.Globalization.CultureInfo("fr"); 

রিসোর্স ম্যানেজারে, একটি স্বয়ংক্রিয় উত্পন্ন কোড রয়েছে যা নীচে রয়েছে:

/// <summary>
///   Overrides the current thread's CurrentUICulture property for all
///   resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
    get {
        return resourceCulture;
    }
    set {
        resourceCulture = value;
    }
}

এখন যতবার আপনি এই সংস্থানটির মধ্যে আপনার স্বতন্ত্র স্ট্রিংয়ের কথা উল্লেখ করেন, এটি নির্দিষ্ট সংস্থান সংস্কৃতি সহ সংস্কৃতি (থ্রেড বা প্রক্রিয়া) ওভাররাইড করে।

আপনি ভাষা "ফ্রি", "ডি" ইত্যাদির মতো নির্দিষ্ট করতে পারেন বা ভাষা-কোড 0x0409 তে এন-ইউএসের জন্য বা এটি-আইটির জন্য 0x0410 রাখতে পারেন। ভাষা কোডগুলির একটি সম্পূর্ণ তালিকার জন্য দয়া করে উল্লেখ করুন: ভাষা শনাক্তকারী এবং লোকাল


এটিকে Resource1.Culture = Null;
নূলে

8

.NET 4.5 এবং এর চেয়ে বেশি এর জন্য আপনার ব্যবহার করা উচিত

var culture = new CultureInfo("en-US");
        CultureInfo.DefaultThreadCurrentCulture = culture;
        CultureInfo.DefaultThreadCurrentUICulture = culture;

6

প্রকৃতপক্ষে আপনি ডিফল্ট থ্রেড সংস্কৃতি এবং ইউআই সংস্কৃতি সেট করতে পারেন তবে কেবল ফ্রেমওয়ার্ক ৪.৫+ সহ

আমি এই স্ট্যাটিক কনস্ট্রাক্টর লাগিয়েছি

static MainWindow()
{
  CultureInfo culture = CultureInfo
    .CreateSpecificCulture(CultureInfo.CurrentCulture.Name);
  var dtf = culture.DateTimeFormat;
  dtf.ShortTimePattern = (string)Microsoft.Win32.Registry.GetValue(
    "HKEY_CURRENT_USER\\Control Panel\\International", "sShortTime", "hh:mm tt");
  CultureInfo.DefaultThreadCurrentUICulture = culture;
}

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

হুররে, পৃথিবীতে সব ঠিক আছে! অথবা না. রূপান্তর পদ্ধতিতে পাস করা সংস্কৃতি প্যারামিটারটি এখনও মার্কিন যুক্তরাষ্ট্রের। আর্ম, ডাব্লুটিএফ ?! তবে এটি একটি শুরু। কমপক্ষে এইভাবে

  • আপনার অ্যাপটি লোড হয়ে গেলে আপনি একবার ইউআই সংস্কৃতি ঠিক করতে পারেন
  • এটি সর্বদা থেকে অ্যাক্সেসযোগ্য CultureInfo.CurrentUICulture
  • string.Format("{0}", DateTime.Now) আপনার কাস্টমাইজড আঞ্চলিক সেটিংস ব্যবহার করবে

যদি আপনি ফ্রেমওয়ার্কের 4.5.৪ সংস্করণ ব্যবহার করতে না পারেন তবে কালচারইনফোর একটি স্থিতিশীল সম্পত্তি হিসাবে কারেন্টইউআইকিউশন সেট করা ছেড়ে দিন এবং এটি আপনার নিজের শ্রেণীর একটির স্থির সম্পত্তি হিসাবে সেট করুন। এটি স্ট্রিংয়ের ডিফল্ট আচরণটি স্থির করবে না For ফর্ম্যাট বা স্ট্রিংফর্ম্যাটটি বাইন্ডিংগুলিতে যথাযথভাবে কাজ করতে পারে তারপরে আপনার অ্যাপ্লিকেশনের সমস্ত বাইন্ডিং পুনরায় তৈরি করতে এবং তাদের রূপান্তরকারী সংস্কৃতি সেট করতে আপনার অ্যাপ্লিকেশনটির লজিক্যাল ট্রিটি হাঁটুন।


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

1
আমাকে যাচাই করতে হবে তবে মনে হচ্ছে এটি সফলভাবে ছাড়াই চেষ্টা করে মনে হয়েছে যা রেজিস্ট্রি থেকে পেয়েছে। আপনি কি সত্যিই ভাবেন যে আমি বিনা কারণে এই সমস্ত সমস্যায় যাব? ইউএসি-এর এই সাহসী নতুন জগতে রেজিস্ট্রি অ্যাক্সেস একটি দৈত্য পিআইটিএ।
পিটার জে

4

এএসপি.এনইটি 5 এর জন্য, যেমন এসপনেটকোয়ারের জন্য আপনি নিম্নলিখিতটি করতে পারেন configure:

app.UseRequestLocalization(new RequestLocalizationOptions
{
    DefaultRequestCulture = new RequestCulture(new CultureInfo("en-gb")),
    SupportedCultures = new List<CultureInfo>
    {
        new CultureInfo("en-gb")
    },
            SupportedUICultures = new List<CultureInfo>
    {
        new CultureInfo("en-gb")
    }
});

এখানে ব্লগ পোস্টগুলির একটি সিরিজ যা আরও তথ্য দেয়।


1
আমি কোনও উত্তরাধিকার এএসপি.এনইটি ২.০ সাইটে এটি করার উপায় অনুসন্ধান করতে এসেছি এবং এটি হতাশার সাথে তুলনা করার চেয়ে আলাদা কোর সাইটের সাথে কতটা সহজেই পরিচালনা করেছিলাম! আমি একটি বহুজাতিক সংস্থায় আছি, এবং অভ্যন্তরীণ সাইটগুলির জন্য, আমাদের সমস্ত ফর্ম্যাটিং তারিখের বিভ্রান্তি রোধ করার জন্য এন-মার্কিন। তবে এই লিগ্যাসি সাইটটি এন-ইউএস, এন-সিএ এবং ফ্রি-সিএ জন্য সেট আপ করা হয়েছে। এবং "হ্যাক-ওয়াই" উপায়ে, তাই আমি যখন এটি ঠিক করতে যাই, তখন তাদের সমস্ত ধরণের রূপান্তরগুলি ডেটা স্তরে ফুলে যায়! (ফরাসি অর্থের মান "1 234,56 $" হচ্ছে
অ্যান্ড্রু এস

1
@ শান আপনার লিঙ্কটি নষ্ট হয়ে গেছে। হয়তো এটা স্থানটিকে এই , এই এবং এই
Fer আর

4

@ রাস্টেটের দুর্দান্ত উত্তরের জন্য এই উত্তরটি কিছুটা প্রসারিত। আপনি কোনও উদ্বেগ ছাড়াই .NET এর সমস্ত সংস্করণের জন্য নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

    public static void SetDefaultCulture(CultureInfo culture)
    {
        Type type = typeof (CultureInfo);
        try
        {
            // Class "ReflectionContext" exists from .NET 4.5 onwards.
            if (Type.GetType("System.Reflection.ReflectionContext", false) != null)
            {
                type.GetProperty("DefaultThreadCurrentCulture")
                    .SetValue(System.Threading.Thread.CurrentThread.CurrentCulture,
                        culture, null);

                type.GetProperty("DefaultThreadCurrentUICulture")
                    .SetValue(System.Threading.Thread.CurrentThread.CurrentCulture,
                        culture, null);
            }
            else //.NET 4 and lower
            {
                type.InvokeMember("s_userDefaultCulture",
                    BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
                    null,
                    culture,
                    new object[] {culture});

                type.InvokeMember("s_userDefaultUICulture",
                    BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
                    null,
                    culture,
                    new object[] {culture});

                type.InvokeMember("m_userDefaultCulture",
                    BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
                    null,
                    culture,
                    new object[] {culture});

                type.InvokeMember("m_userDefaultUICulture",
                    BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
                    null,
                    culture,
                    new object[] {culture});
            }
        }
        catch
        {
            // ignored
        }
    }
}

4

DefaultThreadCurrentCultureএবং DefaultThreadCurrentUICultureফ্রেমওয়ার্ক 4.0 এ উপস্থিত রয়েছে, তবে সেগুলি ব্যক্তিগত। প্রতিচ্ছবি ব্যবহার করে আপনি সেগুলি সহজেই সেট করতে পারেন। এটি সমস্ত থ্রেডগুলিকে প্রভাবিত করবে যেখানে CurrentCultureস্পষ্টভাবে সেট করা হয়নি (থ্রেডগুলিও চলছে)।

Public Sub SetDefaultThreadCurrentCulture(paCulture As CultureInfo)
    Thread.CurrentThread.CurrentCulture.GetType().GetProperty("DefaultThreadCurrentCulture").SetValue(Thread.CurrentThread.CurrentCulture, paCulture, Nothing)
    Thread.CurrentThread.CurrentCulture.GetType().GetProperty("DefaultThreadCurrentUICulture").SetValue(Thread.CurrentThread.CurrentCulture, paCulture, Nothing)
End Sub

1
এই আমার জন্য কাজ করে। যদিও থ্রেড.কন্টেন্টটিহ্রড.কেন্দ্রিকালচার = সংস্কৃতি ব্যবহার করছে; থ্রেড.কর্ন্টটিহ্রেড.কন্ট্রেনউইচলচার = সংস্কৃতি; যা একই রকম দেখায় না। স্পষ্টতার জন্য এটি একটি ডাব্লুপিএফ অ্যাপ্লিকেশনটিতে ব্যবহার করা হচ্ছে যেখানে অ্যাপ্লিকেশন নিজেই তার সংস্কৃতি পরিবর্তন করছে তবে অন্যান্য প্রকল্পের ব্যবহারকারীরা ব্রাউজার সংস্কৃতি ব্যবহার করছেন ব্যবহারকারী দ্বারা নির্বাচিত সংস্কৃতিটি নয়
চিলেফায়ার

3

সি # এমভিসি এর সমাধান এখানে দেওয়া হয়েছে:

  1. প্রথম: একটি কাস্টম বৈশিষ্ট্য তৈরি করুন এবং এ জাতীয় ওভাররাইড পদ্ধতি:

    public class CultureAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            // Retreive culture from GET
            string currentCulture = filterContext.HttpContext.Request.QueryString["culture"];
    
            // Also, you can retreive culture from Cookie like this :
            //string currentCulture = filterContext.HttpContext.Request.Cookies["cookie"].Value;
    
            // Set culture
            Thread.CurrentThread.CurrentCulture = new CultureInfo(currentCulture);
            Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(currentCulture);
        }
    }
  2. দ্বিতীয়: অ্যাপ্লিকেশনটিতে, ফিল্টারকনফিগ.সি.স. অনুসন্ধান করুন, এই বৈশিষ্ট্যটি যুক্ত করুন। (এটি পুরো আবেদনের জন্য কাজ করে)

    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            // Add custom attribute here
            filters.Add(new CultureAttribute());
        }
    }    

এটাই !

আপনি যদি পুরো প্রয়োগের স্থলে প্রতিটি নিয়ামক / ক্রিয়াকলাপের জন্য সংস্কৃতি সংজ্ঞায়িত করতে চান তবে আপনি এই বৈশিষ্ট্যটি এটির মতো ব্যবহার করতে পারেন:

[Culture]
public class StudentsController : Controller
{
}

বা:

[Culture]
public ActionResult Index()
{
    return View();
}

1

সমস্ত থ্রেড এবং উইন্ডোগুলির জন্য সংস্কৃতিআইফোন সেট করার জন্য কাজ করার সমাধান।

  1. App.xaml ফাইলটি খুলুন এবং অ্যাপ্লিকেশনটির জন্য স্টার্টআপ ইভেন্ট হ্যান্ডলারটি বরাদ্দ করতে একটি নতুন "স্টার্টআপ" বৈশিষ্ট্য যুক্ত করুন:
<Application ........
             Startup="Application_Startup"
>
  1. App.xaml.cs ফাইলটি খুলুন এবং তৈরি করা স্টার্টআপ হ্যান্ডলারটিতে এই কোড যুক্ত করুন ( এক্ষেত্রে অ্যাপ্লিকেশন_স্টার্টআপ)। ক্লাস অ্যাপটি এর মতো দেখতে পাবেন:
    public partial class App : Application
    {
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            CultureInfo cultureInfo = CultureInfo.GetCultureInfo("en-US");
            System.Globalization.CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
            System.Globalization.CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;
            Thread.CurrentThread.CurrentCulture = cultureInfo;
        }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.