لماذا يحتاج تطبيق C# الخاص بك إلى التدويل؟
\nتخيل: لقد كتبت خدمة رائعة لإدارة الملاحظات. كل شيء يعمل، الواجهة بسيطة، المستخدمون سعداء. لكن فقط الناطقون بالروسية. بمجرد دخولك سوق الولايات المتحدة أو ألمانيا - سيتوقف المشروع. ليس لأن الكود سيء، ولكن لأن زر «حفظ» لا يتحول إلى «Save»، ورسالة «خطأ في الإدخال» تخيف الأجنبي.
\nهذه هي مشكلة الترجمة. في عالم .NET يسمى حلها تدويل C# (أو i18n - من كلمة «internationalization»، حيث 18 هو عدد الحروف بين i و n). إذا كنت تستخدم C# ومنصة .NET (Core, 5/6/7/8/9)، فلديك بالفعل أدوات قوية جداً تحت الغطاء لجعل التطبيق متعدد اللغات. في هذه المقالة سنشرحها عملياً: من الموارد البسيطة إلى تغيير اللغة «أثناء التشغيل».
\n\nالأساسيات: ما هي الثقافة واللغة المحايدة
\nقبل كتابة الكود، دعنا نفهم المصطلحات. في .NET، هناك فئتان رئيسيتان من مساحة الأسماء System.Globalization مسؤولتان عن الترجمة:
- \n
- CultureInfo — كائن يصف اللغة والمعايير الإقليمية (مثل
ru-RU،en-US،de-DE). \n - CurrentUICulture — ثقافة واجهة المستخدم الحالية. يعتمد عليها النظام عند البحث عن الترجمات. \n
- CurrentCulture — تنسيق التواريخ والأرقام والعملة. يمكن تغييره أيضاً، لكن للترجمات الأول هو المهم. \n
في تطبيقات C# نستخدم عادةً ملفات الموارد (.resx). هذه ملفات XML تخزن النصوص والصور والبيانات الأخرى المرتبطة بثقافة معينة. على سبيل المثال:
\n- \n
Messages.resx— النصوص الافتراضية (عادةً الإنجليزية). \n Messages.ru.resx— الترجمة الروسية. \n Messages.de.resx— الترجمة الألمانية. \n
عند تشغيل التطبيق، يختار .NET تلقائياً الملف المطابق لـ UICulture الحالية. إذا لم يكن هناك تطابق دقيق - يستخدم الملف المحايد (الأساسي).
إنشاء أول ملف موارد في Visual Studio
\nلنفترض أن لدينا تطبيق وحدة تحكم أو مشروع ASP.NET Core. دعنا نضيف مجلد Resources وداخله ملف Strings.resx. لنملأه:
الاسم | القيمة\n-------------|-------------------\nWelcomeMsg | Welcome to our app!\nGoodbyeMsg | Goodbye!\n\nالآن لننشئ Strings.ru.resx:
الاسم | القيمة\n-------------|-------------------\nWelcomeMsg | Добро пожаловать в наше приложение!\nGoodbyeMsg | До свидания!\n\nلاحظ: يجب أن تتطابق أسماء المفاتيح. بعد الحفظ، سيقوم Visual Studio تلقائياً بإنشاء الفئة Strings مع الوصول إلى النصوص عبر خصائص ثابتة.
التبديل البرمجي للغة
\nلكي يعمل تدويل C#، يجب في بداية تنفيذ التطبيق (مثلاً في Main أو Startup) تعيين الثقافة المطلوبة. إليك كيف يبدو ذلك:
using System.Globalization;\nusing System.Threading;\n\n// تعيين اللغة الروسية للواجهة\nCultureInfo culture = new CultureInfo("ru-RU");\nThread.CurrentThread.CurrentUICulture = culture;\nThread.CurrentThread.CurrentCulture = culture; // لتنسيقات التواريخ/الأرقام\n\n// الآن نصل إلى الموارد\nConsole.WriteLine(Strings.WelcomeMsg); // سيظهر: Добро пожаловать в наше приложение!\n\nإذا كنت تريد إعطاء المستخدم إمكانية تبديل اللغة «أثناء التشغيل» (بدون إعادة تشغيل)، فقط قم باستدعاء هذه الأسطر مرة أخرى بعد تغيير الثقافة. في ASP.NET Core يستخدمون middleware لهذا:
\napp.UseRequestLocalization(new RequestLocalizationOptions\n{\n DefaultRequestCulture = new RequestCulture("en-US")