هل من الممكن ضبط الثقافة في تطبيق .NET أو مجرد موضوع؟

StackOverflow https://stackoverflow.com/questions/2234492

سؤال

لدي تطبيق مكتوب في C # الذي لا يوجد لديه واجهة المستخدم الرسومية أو واجهة المستخدم واجهة المستخدم، ولكن بدلا من ذلك يكتب الملفات التي يتم تحليلها بواسطة تطبيق آخر (في XML وغيرها).

لدي عميل يحتوي ثقتك التي تحتوي على numberdecimalsparator في فاصلة، مما يؤدي إلى تحليل الأخطاء ذات الأرقام العائمة (PI) 3,1415).

أريد طريقة لتعيين CultureInfo على مستوى العالم داخل التطبيق، لجميع المواضيع. لقد حاولت:

  1. (على ما يبدو) النهج المعتاد من الإعداد currentthread.currentculture. كما السطر الأول في رئيسي() ولكن يبدو أنه يحصل على إعادة تعيين.
  2. الاختلاف / التوسع على http://www.codeproject.com/kb/cs/change_appx.
  3. افعل نفس الشيء (# 1) على المواضيع التي تم إنشاؤها صراحة في التطبيق.

والتغيير لاستخدام التنسيق الصريح ليس خيارا (خطوط 150k +، الأكثر كتابا من قبل الموظفين السابقين).

يحرريرتبط التطبيق إلى مقبس ومقابض الطلبات من العملاء المخصصين. اعتمادا على نوع الطلب، تطرد فصول معالج مختلفة.

آسف، عندما أرسلت لأول مرة، كان يجب أن أكون قد أوضحت في # 1أنا رغم ذلك) لقد فعلت ذلك في جميع المعالجين الذين تم طرحهم صراحة أيضا.

اتضح أن فاتني الخيط / المعالج الذي كان يسبب المشكلة. لذلك يعمل التطبيق بشكل صحيح الآن، ولكن لا يزال السؤال حول ما إذا كان يمكن تحديد الثقافة على جميع المواضيع.

إذا كان بإمكانه تكرار جميع المواضيع، فسيحل المشكلة أيضا. وبالتالي:

كيف يمكنني الحصول على كل شيء خيط الكائنات (لا processthread.) في العملية الحالية؟

هل كانت مفيدة؟

المحلول

لسوء الحظ، يبدأ كل مؤشر ترابط جديد بمعلومات لغة النظام، حتى لو بدأت من مؤشر ترابط قد تغير لغةه إلى شيء آخر.

كان هذا غوتتشا ضخمة في إحدى تطبيقاتنا عند استخدام BackgroundWorker لتحميل ملف.

النهج الذي استخدمته بنجاح هو تعيين الإعدادات المحلية في مؤشر ترابط بدء التشغيل، ثم استخدم مصنع مؤشر ترابط لإنشاء مؤشرات الترابط مع "لغة التطبيق". للمحاملات الأساسية يمكنك استخدام إما مصنع أو فئة مشتقة، كما Thread مختومة في حين BackgroundWorker ليس.

نصائح أخرى

في .NET 4.5 يمكنك استخدام cultureinfo.defaultthreadcurrentculture

لا أعتقد أنه يمكنك ضبط الثقافة على التطبيق بأكمله، ولكن يمكنك تعيين ثقافة Explicilty كلما قمت بإنشاء مؤشر ترابط:

using System;
using System.Globalization;
using System.Threading;

class Program {

    static void thread_test() {
        Console.WriteLine("Culture: {0}", CultureInfo.CurrentCulture.DisplayName);
    }

    public static void Main(params string[] args) {
        Thread t = new Thread(thread_test);
        t.CurrentCulture = new CultureInfo("it-it");
        t.Start();
        t.Join();
    }
}

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top