سؤال

لقد كنت أعمل في مشروع للحيوانات الأليفة في عطلات نهاية الأسبوع لمعرفة المزيد حول C# وواجهت مشكلة غريبة عند العمل مع التوطين. لكي أكون أكثر تحديداً ، فإن المشكلة لدي هي مع System.Threading.Thread.CurrentThread.CurrentUiculture.

لقد قمت بإعداد تطبيقي حتى يتمكن المستخدم من تغيير لغة التطبيق بسرعة بالنقر فوق عنصر قائمة. يقوم عنصر القائمة بدوره ، بحفظ الكود المكون من حرفين للغة (على سبيل المثال "EN" ، "FR" ، وما إلى ذلك) في إعداد المستخدم يسمى "لغة" ثم إعادة تشغيل التطبيق.

Properties.Settings.Default.Language = "en";
Properties.Settings.Default.Save();
Application.Restart();

عند بدء تشغيل التطبيق ، يجلب السطر الأول من التعليمات البرمجية في مُنشئ النموذج (حتى قبل initializeComponent ()) سلسلة اللغة من الإعدادات وتعيين الزراعة الحالية مثل:

public Form1()
{
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(Properties.Settings.Default.Language);
    InitializeComponent();
}

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

في البداية اعتقدت أنني لم أحفظ اللغة قبل إعادة تشغيل التطبيق ولكن هذا ليس هو الحال بالتأكيد. عندما تفشل اللغة الصحيحة في التحميل ، إذا أردت إغلاق التطبيق وتشغيله مرة أخرى ، فإن اللغة الصحيحة ستظهر بشكل صحيح. لذلك هذا يعني أن سلسلة اللغة قد تم حفظها ولكن مهمة الزراعة الحالية في مُنشئ النماذج الخاص بي ليس لها أي تأثير في بعض الأحيان.

أي مساعدة؟ هل هناك شيء أفتقده كيف يعمل الخيوط في C#؟ قد يكون هذا خاصًا بالآلة ، لذلك إذا كان ذلك يحدث أي فرق ، فأنا أستخدم وحدة المعالجة المركزية ذات النواة المزدوجة.

تحديث

طلب مني فلاد أن أتحقق من ماهية حالية CurrentThread. لذلك أضفت مراسلة الرسائل على مُنشئتي لأخبرني ما هو الكود الحالي المكون من حرفين بالإضافة إلى قيمة سلسلة مستخدم اللغة الخاصة بي.

MessageBox.Show(string.Format("Current Language: {0}\nCurrent UI Culture: {1}", Properties.Settings.Default.Language, Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName));

عندما يتم تحميل اللغة الخاطئة ، فإن كل من سلسلة اللغة والزراعة الحالية لها لغة خاطئة. لذلك أعتقد أن الزراعة الحالية قد تم مسحها وأن مشكلتي هي في الواقع مع إعداد اللغة.

لذلك أعتقد أن المشكلة هي أن طلبي بعض الأحيان يقوم بتحميل سلسلة اللغة المحفوظة مسبقًا بدلاً من سلسلة اللغة المحفوظة الأخيرة. إذا تم إعادة تشغيل التطبيق ، فسيقوم بعد ذلك بتحميل سلسلة اللغة المحفوظة الفعلية.

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

المحلول

حصلت على نفس المشكلة. لقد اكتشفت هذا التطبيق. restart () لا تقوم بإعادة التشغيل تمامًا ، انظر MSDN.

لذلك application.restart () لا تسمي الأشياء التهيئة داخل مُنشئ النماذج مثل initializeComponent () ، أكثر "يتم إعادة تشغيل التطبيقات في السياق الذي تم تشغيله في البداية."

لذا فإن الكود الخاص بك صحيح

Properties.Settings.Default.Language = "en";
Properties.Settings.Default.Save();

public Form1()
{
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(Properties.Settings.Default.Language);
    //...
    InitializeComponent();
}

لكنه لا يعمل بهذه الطريقة Application.Restart(). إذا قمت بإغلاق التطبيق وفتحه مرة أخرى ، فسيتم أخذ إعداداتك (الجديدة).

لذلك علينا أن نجد طريقة لتهيئة النموذج مرة أخرى لجعل إعدادات اللغة الجديدة تحدث.

نصائح أخرى

هل يمكنك التحقق من ما هو موضوعك CurrentUICulture?

أتذكر أنني أواجه مشكلة مثل لك ؛ تم حله عن طريق إعادة تحميل قاموس الموارد الذي يحتوي على الأوتار المراد ترجمة:

Thread.CurrentThread.CurrentUICulture = <new culture>;
ResourceDictionary newDict = new ResourceDictionary();
newDict.Source = localizedStrings.Source;
localizedStrings = newDict;

(وهذا النهج يعمل ديناميكيا كذلك ؛ هنا هو مزيد من المعلومات).

يمكنك تغيير لغة النموذج الحالي يدويًا مماثلة لهذا:

CultureInfo cInfo = new CultureInfo("en-US");
ResourceManager rm = new ResourceManager(GetType());

// For each control on the form, perform the translation manually (probably better in a loop)
control1.Text = rm.GetString(control1.Name + ".Text", cInfo);

// Now set the culture for all other dialogs
Thread.CurrentThread.CurrentUICulture = cInfo;

امل ان يساعد!

يمكنك ببساطة "إعادة تعيين" تطبيقك عن طريق إغلاق النماذج المفتوحة وإعادة إنشاءها. ثم يمكنك ضبط الثقافة مباشرة عندما يغير المستخدم الإعداد.

أيضًا ، حاول إعطاء بعض ناتج الأخطاء حتى ترى القيم التي يتم تعيينها وما إذا كانت الثقافة هي في الواقع ما تتوقعه.

تحرير: تخميني: بما أنه يجب كتابة البيانات إلى ملف ، ثم يتم تحميلها من هذا الملف ، فقد يتم إعادة تشغيلك بسرعة كبيرة حتى يتم الانتهاء من الكتابة.

باستخدام CurrentThread.CurrentUiculture ، ثم تغيير النموذج ، لا تحتاج إلى إعادة تشغيل التطبيق. المرجع مشاركتي القديمة هنا

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