ستبدأ هذه المقالة بالمفاهيم الأساسية لعولمة الموارد وتوطينها في Asp.net، وتشرح خطوات وأساليب تحقيق العولمة والتوطين في Asp.net1.1 وAsp.net2.0.
واحد. المفاهيم الأساسية
1. لماذا توطين الموارد؟
يمكن أن يشاهد موقعنا أشخاص من مختلف البلدان والمناطق حول العالم، وللأشخاص في كل بلد ومنطقة لغتهم وخصائصهم الثقافية الخاصة. لنأخذ وطننا الأم العظيم كمثال على ذلك. يستخدم البر الرئيسي للصين اللغة الصينية المبسطة، بينما تستخدم هونغ كونغ وماكاو وتايوان اللغة الصينية التقليدية. بالإضافة إلى ذلك، لدى كل دولة تنسيقات تعبير مختلفة للعملة والأرقام والتقويم والمعلومات الأخرى. تستخدم بلادنا في الغالب تنسيق السنة والشهر واليوم، بينما تستخدم الولايات المتحدة تنسيق الشهر واليوم والسنة. هناك العديد من الاختلافات مثل هذا، لذلك لن أعطي الكثير من الأمثلة. من أجل منح زوار موقعنا تجربة مستخدم أفضل، يجب أن نقدم حلاً عالميًا، وطالما أن المستخدم يختار لغته ومنطقته، فسيعرض الموقع معلومات الصفحة وفقًا للغته وعاداته الثقافية التعريب.
2. الثقافة، والثقافة الثابتة، والثقافة غير المحددة،
وأسماء الثقافة الخاصة بالثقافة تتبع معيار RFC 1766 وهي بالتنسيق "<languagecode2>-<country/regioncode2>"، حيث يتم اشتقاق <languagecode2> من ISO 639-1 رمز صغير مكون من حرفين، <country/regioncode2> هو رمز مكون من حرفين كبيرين مشتق من ISO 3166. على سبيل المثال، اللغة الإنجليزية الأمريكية هي "en-US". عندما لا تتوفر رموز اللغة المكونة من حرفين، يتم استخدام رموز مكونة من ثلاثة أحرف مشتقة من ISO 639-2، على سبيل المثال، يتم استخدام الرمز المكون من ثلاثة أحرف "div" للمناطق التي يتم التحدث فيها بلغة الديفيهي. تحتوي بعض أسماء الثقافات على لاحقات تحدد رمز الكتابة؛ على سبيل المثال، يحدد "-Cyrl" رمز الكتابة السيريلية، ويحدد "-Latn" رمز الكتابة اللاتينية. مثال:
اسم الثقافة | معرف الثقافة | اللغة - الدولة |
zh-CN | 0x0804 | الصينية - الصين |
zh-TW | 0x0404 | الصينية - تايوان |
zh-CHS | 0x0004 | الصينية المبسطة |
zh-CHT | 0x |
7ج |
04 | الصينية التقليدية | |
en | 0x0009 | الإنجليزية |
- | الولايات | المتحدة |
0x0409 | الإنجليزية - الولايات المتحدة en - | GB | 0x0809
uz | - | UZ - Cyrl |
0x0843 | الأوزبكية (السيريلية) - أوزبكستان uz-UZ-Latn 0x0443 | الأوزبكية ( اللاتينية) - أوزبكستان |
الثقافات الثابتة ليست كذلك حساسة للثقافة. يمكنك استخدام السلسلة الفارغة ("") لتحديد ثقافة ثابتة بالاسم أو بواسطة معرف الثقافة 0x007F. يتم تمثيل مثيلات الثقافة الثابتة بواسطة خاصية InvariantCulture لفئة CultureInfo. الثقافات الثابتة ترتبط فقط باللغة الإنجليزية، وليس بأي دولة. يمكن استخدامه بأي طريقة تقريبًا في مساحة الاسم "المعولمة" التي تتطلب الثقافة. إذا كان برنامجك يقوم بإجراء مقارنات سلسلة أو عمليات تغيير حالة الأحرف، فيجب عليه استخدام InvariantCulture للتأكد من أنه بغض النظر عن الثقافة التي يحددها النظام، سيتم تنفيذ السلوك وفقًا للثقافة الثابتة للغة الإنجليزية التي تمثلها InvariantCulture. ومع ذلك، يجب استخدام الثقافة الثابتة فقط من خلال العمليات التي تتطلب نتائج مستقلة عن الثقافة (مثل خدمات النظام)؛ وإلا فإن النتائج التي تحصل عليها قد تكون غير صحيحة لغويًا أو غير مناسبة ثقافيًا. مثال: CultureInfo Invc = New CultureInfo("");
CultureInfo Invc = CultureInfo.InvariantCulture؛ هذين السطرين من التعليمات البرمجية لهما نفس التأثير، والغرض هو الحصول على مثيل ثقافة ثابت.
على سبيل المثال، أنت الآن تريد تنفيذ الأسلوب dateTime.ToString() على مثيل DateTime dateTime. تستخدم هذه الطريقة في الواقع الثقافة الحالية لمؤشر الترابط الحالي الخاص بك كثقافة افتراضية، وتقوم بتحويل مثيل التاريخ إلى نموذج السلسلة المقابل بناءً على هذه الثقافة. لذا، إذا لم نكن بحاجة إليها لتنفيذ عملية ToString وفقًا لمؤشر الترابط أو ثقافة النظام في هذا الوقت، فيجب علينا استخدام هذه الطريقة dateTime.ToString("G"، CultureInfo.InvariantCulture) أو dateTime.ToString("G" ، DateTimeFormatInfo.InvariantInfo).
الثقافة المحايدة هي ثقافة مرتبطة باللغة وليس بالدولة. الثقافة المحددة هي تلك المرتبطة بلغة معينة وبلد معين. على سبيل المثال، "en" هي ثقافة محايدة، في حين أن "en-US" هي ثقافة محددة. لاحظ أن "zh-CHS" (الصينية المبسطة) و"zh-CHT" (الصينية التقليدية) محايدتان ثقافيًا.
الثقافات لها هيكل هرمي، أي أن الأصل لثقافة معينة هو ثقافة غير محددة، والأصل للثقافة غير المحددة هو الثقافة الثابتة. ستعيد الخاصية الأصل لفئة CultureInfo الثقافة غير المحددة المرتبطة بالثقافة المحددة. إذا كان المورد الخاص بالثقافة غير موجود على النظام أو غير متوفر، فسيتم استخدام المورد غير الخاص بالثقافة، وإذا كان المورد غير الخاص بالثقافة غير متاح أيضًا، فسيتم استخدام المورد المضمن في التجميع الرئيسي.
3. تنفيذ الأنواع والخصائص والأساليب الشائعة للترجمة
تمثل فئة CultureInfo معلومات حول ثقافة معينة، بما في ذلك اسم الثقافة ونظام الكتابة والتقويم المستخدم، بالإضافة إلى معلومات حول العمليات الشائعة (مثل تنسيق التواريخ والتواريخ). سلاسل الفرز). يوفر الوصول إلى كائنات المعلومات الخاصة بالثقافة. هناك عمومًا طريقتان لإنشاء فئة CultureInfo، كما يلي:
CultureInfo Culture = CultureInfo.CreateSpecificCulture (name)؛
CultureInfo Culture = new CultureInfo(name);
الفرق بين الاثنين هو أنه باستخدام الطريقة الأولى، يمكنك فقط إنشاء مثيل CultureInfo لثقافة ثابتة أو لثقافة معينة. إذا كان الاسم عبارة عن سلسلة فارغة، فسيتم إنشاء مثيل ثقافة ثابتة. إذا كان الاسم ثقافة غير محددة، فسيتم إنشاء مثيل CultureInfo الافتراضي الخاص بالثقافة والمقترن بالاسم. الطريقة الثانية هي إنشاء مثيل CultureInfo للثقافة المحددة بالاسم، والتي يمكن أن تكون ثابتة أو غير محددة أو خاصة بالثقافة.
يتم استخدام خاصية CurrentCulture لفئة Thread للحصول على ثقافة مؤشر الترابط الحالي أو تعيينها. يجب أن يتم ضبطه على ثقافة معينة. Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); إذا تم الإبلاغ عن خطأ Thread.CurrentThread.CurrentCulture = new CultureInfo("en");
يتم استخدام الخاصية CurrentUICulture لفئة Thread للحصول على الثقافة الحالية التي يستخدمها مدير الموارد أو تعيينها للعثور على الموارد الخاصة بالثقافة في وقت التشغيل. يمكن ربط مدير الموارد هنا بفئة ResourceManger.
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
يمكن لفئة ResourceManger العثور على موارد خاصة بالثقافة، وتوفير موارد بديلة في حالة عدم وجود موارد محلية، ودعم تسلسل الموارد. مُنشئ ResourceManager الشائع الاستخدام هو ResourceManager العام (سلسلة، تجميع). معناه هو تهيئة مثيل جديد لفئة ResourceManager، التي تبحث عن ملفات الموارد من التجميع المحدد باستخدام اسم الجذر المحدد. ما يسمى اسم الجذر، على سبيل المثال، اسم الجذر لملف المورد المسمى "MyResource.en-US.resources" هو "MyResource". يمكن إضافة مساحة اسم إلى تعبير الاسم الجذر، مثل "MyWebSite.Resource.UserFolder.MyResource". يمكن أن يكون التجميع هو التجميع حيث توجد الصفحة التي تحتاج إلى استدعاء ملف المورد، مثل typeof(MyPage).Assembly. يتم استخدام أسلوب GetString لفئة ResourceManager للحصول على قيمة المفتاح المحدد في ملف المورد. مثال: عند تعيين خاصية CurrentUICulture لمؤشر الترابط، اتبع الطريقة التالية.
ResourceManager rm = new ResourceManager("items", Assembly.GetExecutingAssembly());
String str = rm.GetString("welcome");
إذا كنت ترغب في الحصول على الموارد وفقًا للثقافة المحددة، فاكتب كما يلي:
ResourceManager rm = new ResourceManager("items", Assembly.GetExecutingAssembly());
CultureInfo ci = Thread.CurrentThread.CurrentCulture;
String str = rm.GetString("welcome",ci);
اثنين. لتنفيذ توطين الموارد في Asp.net1.1،
يجب عليك أولاً إنشاء مجلد موارد في مشروع موقع الويب WebTest، وتخزين ملفات الموارد المشتركة للمشروع بأكمله في هذا المجلد. على سبيل المثال، قمنا بإنشاء ملفات الموارد الثلاثة التالية: MyResource.en.resx، MyResource.en-US.resx، MyResource.zh-CN.res. يوجد زوجان من أزواج القيمة الرئيسية في كل ملف مورد، القيم الرئيسية هي الحالة والعنوان. قم باستدعاء ملف المورد الموجود في الصفحة MyPage.aspx الذي يحتاج إلى استخدام ملف المورد، كما هو موضح أدناه:
Thread.CurrentThread.CurrentCulture= CultureInfo.CreateSpecificCulture("zh-CN");
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
ResourceManager rm = new ResourceManager("WebTest.Resource.MyResource"، typeof (MyPage).Assembly);
Label1.Text = rm.GetString("State");
Label2.Text = rm.GetString("Address");
حسنًا، في هذا الوقت، سيعرض Label1 وLabel2 "الحالة" و"العنوان" وفقًا للوائح ملف MyResource.zh-CN.resx. ما ورد أعلاه هو أسلوب التوطين الأساسي والأبسط. هناك بعض المشكلات المخفية هنا، فلنحل هذه الطريقة ونحسنها واحدة تلو الأخرى.
1. كيفية الحصول على الثقافة الافتراضية للمستخدم
هي من خلال الإعدادات الموجودة في خيار "خصائص" متصفح المستخدم -> خيار "اللغة".
CultureInfo CultureInfo = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);
Thread.CurrentThread.CurrentCulture = CultureInfo;
Thread.CurrentThread.CurrentUICulture = CultureInfo;
بشكل عام، تم تعيين CurrentCulture وCurrentUICulture ليكونا نفس الثقافة. بالطبع، يمكن أن يكونا مختلفين أيضًا. على سبيل المثال، يمكنك تحديد أن CurrentCulture هو en-US وCurrentUICulture هو zh-CN. تأثير ذلك هو أن العملة والتاريخ والمعلومات الأخرى الموجودة على الصفحة يتم عرضها بتنسيق اللغة الإنجليزية الأمريكية، وسيحصل مدير الموارد على المحتوى الذي يجب الحصول عليه من ملف المورد من MyResource.zh-CN.resx ملف.
إذا كانت صفحة موقعك لا توفر للمستخدمين وظيفة تحديد لغة، فسيتم عرضها وفقًا للثقافة التي حددها متصفح المستخدم افتراضيًا، حتى تتمكن من وضع الكود أعلاه في طريقة Application_BeginRequest الخاصة بـ Global.asax. ملف . بهذه الطريقة، في كل مرة يقوم فيها المستخدم بطلب صفحة ما، سيقوم برنامجنا أولاً بتعيين الثقافة.
2. تذكر الإعدادات المحلية للمستخدم
يمكن تذكر الإعدادات المحلية أو التحديدات الخاصة بالمتصفح خلال الجلسة. ولكن لا يمكن تنفيذ هذه العملية في أسلوب Application_BeginRequest في الملف Global.asax.cs، لأن الجلسة لا تزال غير متوفرة في ذلك الوقت. إذا كان موقعك لا يوفر للمستخدمين وظيفة تحديد لغة، فلا داعي لتذكر الإعدادات الإقليمية للمستخدم، فقط قم بتعيينها في طريقة Application_BeginRequest في ملف Global.asax.cs كما هو موضح أعلاه، ولا يؤثر ذلك أداء. يؤدي هذا بشكل أساسي إلى تجنب التعارضات التي يقوم فيها المستخدم فجأة بتغيير إعدادات اللغة في المتصفح في منتصف الطريق، لكن موقع الويب لا يزال يعرض محتوى الصفحة للمستخدم وفقًا للثقافة المخزنة في الجلسة.
إذا ذكرت وظيفة السماح للمستخدم باختيار لغة، فمن الواضح أنك تحتاج إلى استخدام جلسة في برنامج الصفحة لتسجيل اختيار ثقافة المستخدم. لأن كل طلب من العميل إلى مقطع الخادم، سيفتح مقطع الخادم موضوعًا جديدًا للمعالجة والاستجابة. إذا لم يتذكر برنامجك اختيار العميل، فسوف يستجيب فقط بالثقافة الافتراضية.
3. كيف يمكن لمدير الموارد العثور على ملفات الموارد المقابلة لثقافة محددة؟
عند إجراء عملية قيمة، أي عند تنفيذ طريقة GetString لفئة ResourceManager، سيبحث مدير الموارد عن ملف المورد المقابل وفقًا لخاصية CurrentUICulture لمؤشر الترابط الحالي. هناك عدة حالات:
(1) على سبيل المثال، إذا كانت الثقافة المقابلة لـ CurrentUICulture هي en-US، فتحقق أولاً من وجود MyResource.en-US.resx، وإذا كانت موجودة، فاستخرج القيمة منها، وتحقق منها ما إذا كان MyResource.en.resx موجودًا.
(2) على سبيل المثال، الثقافة المقابلة لـ CurrentUICulture الحالية هي en، لأن en هي ثقافة غير محددة، ثم ابحث أولاً عما إذا كان ملف المورد MyResource.en-US.resx مرتبطًا بالثقافة المحددة en-US. بشكل افتراضي، إذا كان الأمر كذلك، فاحصل على القيمة منه؛ وإذا لم تكن موجودة، فتحقق من وجود MyResource.en.resx.
(3) على سبيل المثال، إذا كانت الثقافة المقابلة لـ CurrentUICulture هي en-GB، فابحث أولاً عن ملف المورد MyResource.en-GB.resx. إذا لم يكن موجودًا، فتحقق من وجود MyResource.en.resx كان موجودًا، احصل على القيمة منه؛ إذا لم يكن موجودًا، تحقق مما إذا كان ملف المورد MyResource.en-US.resx الخاص بالثقافة الافتراضية المحددة en-US المرتبطة بـ en موجودًا إذا لم يكن MyResource.en-US.resx موجودًا موجودًا في الوقت الحالي، ولكن MyResource.en-CA resx موجود، فسيظل البرنامج يطرح استثناءً لعدم العثور على ملف المورد المناسب.
لذلك، يمكننا تلخيص أنه عندما يتوافق مؤشر الترابط الحالي مع ثقافة معينة، يبحث مدير الموارد أولاً عن ملف المورد المطابق لهذه الثقافة المحددة، وإذا لم يتم العثور عليه، فسيبحث عن ملف الموارد غير الثقافية الخاص به لم يتم العثور عليه بعد، ثم ابحث عن ملف الموارد الخاص بالثقافة الافتراضية المرتبطة بالارتباط غير الخاص بالثقافة. عندما يتوافق CurrentUICulture الخاص بمؤشر الترابط الحالي مع ثقافة غير محددة، يتحقق مدير الموارد أولاً مما إذا كان ملف المورد الافتراضي الخاص بالثقافة المطابق للثقافة غير المحددة موجودًا، وإذا لم يكن موجودًا، فتحقق مما إذا كان ملف المورد المطابق للثقافة غير المحددة موجودًا الثقافة المحددة موجودة، وتطرح استثناءً في حالة عدم وجودها أيضًا.
4. كيف نتعامل مع الثقافات التي لا تقدم الدعم للتوطين؟
إذا لم يوفر الموقع ملفات الموارد المقابلة لدعم الثقافة الافتراضية للمستخدم، فيجب تحويل CurrentUICulture لمؤشر الترابط الحالي الخاص به إلى الثقافة الافتراضية لموقعك، مثل en-US أو zh-CN. هناك فرصتان للتحويل:
أحدهما هو أنه عند حصولك على Request.UserLanguages[0]، قم بمقارنتها بالثقافة المدعومة مسبقًا في ملف التكوين. إذا تم التأكد من أنها غير مدعومة، فقم على الفور بتعيين CurrentUICulture كثقافة افتراضية.
والثاني هو استخدام بنية محاولة الالتقاط لالتقاط استثناء MissingManifestResourceException عند استخدام أسلوب GetString الخاص بـ ResourceManager للحصول على القيمة في معالجة الاستثناء، قم أولاً بتعيين CurrentUICulture على الثقافة الافتراضية، ثم استخدم GetString للحصول على القيمة مرة أخرى.
5. قم بتعيين الثقافة الافتراضية للموقع وuiCulture من خلال Web.config
<globalization requestEncoding="utf-8" ResponseEncoding="utf-8" uiCulture="zh-CN" Culture="en-US"/>
كما هو موضح أعلاه: تم تحديد أن الثقافة الافتراضية للموقع هي en-US (يجب أن تكون ثقافة محددة هنا)، وuiCulture هي zh-CN.
بالطبع، يمكنك أيضًا تعيينها صفحة تلو الأخرى في علامة الصفحة لكل صفحة: <@Page Culture="zh-CN" UICulture="en">. بغض النظر عن كيفية تعيين web.config هنا، سيتم عرض الصفحة وفقًا لإعدادات علامة الصفحة.
ثلاثة. تنفيذ توطين الموارد في Asp.net2.0
يوفر Asp.net2.0 أساليب تنفيذ أكثر تنوعًا لتوطين الموارد. سأركز هنا على الاختلافات عن Asp.net1.1.
1.
لقد تمت بالفعل مناقشةإعداد الثقافة الافتراضية للموقع وuiCulture من خلال Web.config
في Asp.net1.1 باستخدام ملف web.config لتعيين ثقافة الموقع، ولكنه أكثر مرونة في Asp.net2.0. عادةً ما تريد أن تتوافق جميع الصفحات في موقعك مع نفس الثقافة. ما عليك سوى تعيين قيمة "تلقائية" على مستوى الموقع لسمات UICulture والثقافة (الثقافة) لعنصر العولمة في web.config كما هو موضح أدناه. لاحظ أن هذه القيمة "تلقائية" غير مستخدمة في Asp.net1.1 المقبولة. <globalization uiCulture="auto" Culture="auto" /> معنى تلقائي هو أن ASP.NET يحصل على إعداد الثقافة المفضل للمستخدم عن طريق التحقق من رأس HTTP الذي يرسله المتصفح، ويستخدم هذه الثقافة لتعيين الثقافة الافتراضية لـ site، أي خصائص CurrentUICulture وCurrentCulture للخيط الحالي.
بالإضافة إلى الإعدادات التلقائية، يمكنك أيضًا تحديد الثقافة الافتراضية لموقع Asp.net: <globalization uiCulture="auto:zh-CN" Culture="auto:zh-CN" /> ملاحظة: يكون هذا ممكنًا فقط إذا كان ASP. NET العثور على رأس HTTP لتحديد الثقافة المفضلة للمستخدم، على سبيل المثال، عندما لا يكون هناك إعداد ثقافة في "خصائص" -> "اللغة" بالمتصفح ويكون فارغًا تمامًا، سيتم تفعيل الثقافة الافتراضية التي تم تعيينها بعد تلقائي.
بعد تكوين العولمة في web.config، لا يحتاج تطبيقك إلى كتابة أي تعليمات برمجية، وسيحصل CurrentUICulture وCurrentCulture للخيط على إعدادات الثقافة وفقًا لقيم سمات uiCulture والثقافة المعينة في عنصر العولمة. إذا لم يتم تكوين العولمة، فسيتم تعيين CurrentUICulture وCurrentCulture الخاصين بمؤشر الترابط إلى en-US بشكل افتراضي.
2. استخدم ملف Web.config لتتبع التحديد الإقليمي للمستخدم
في Asp.net1.1، تستخدم تلك المواقع التي توفر التحديد الإقليمي بشكل عام جلسات لتسجيل اختيار المستخدم بحيث في كل مرة يقوم فيها المستخدم بتقديم طلب إلى الموقع، يتم حذف كافة الملفات. يتم ترجمة محتوى العرض وفقًا للثقافة التي اختارها المستخدم. هناك طريقة أخرى متوفرة في Asp.net2.0 وهي استخدام ملف web.config لتتبع اختيار ثقافة المستخدم.
يمكنك دعم التعريف المجهول لثقافة المستخدم عن طريق إضافة خاصية ملف تعريف قائمة على سلسلة تسمى LanguagePreference إلى ملف web.config الخاص بك. يرجى ملاحظة أن السمة الممكّنة لعنصر الهوية المجهولة يجب أن تكون "صحيحة"، وإلا فلن تكون وظيفة التعريف المجهول متاحة.
<anonymousIdentificationenable="true"/>
<الملف الشخصي>
<خصائص>
<add name = "LanguagePreference" type = "string" defaultValue = "auto"allowAnonymous = "true" />
</خصائص>
</profile>
أدناه سأشرح كيفية برمجة خاصية LanguagePreference في Asp.net2.0. أولاً، يمكنك كتابة فئة PageBase، التي ترث من System.Web.UI.Page وتكون بمثابة الفئة الأساسية لجميع فئات الصفحات في الموقع. الغرض من ذلك بسيط جدًا في الواقع، وهو استخراج بعض عمليات المعالجة الشائعة في كل صفحة ووضعها في الفئة الأساسية لتقليل تكرار التعليمات البرمجية وتحسين إمكانية الصيانة. ثم اكتب الكود التالي في فئة PageBase: protected override void InitializeCulture()
{
base.InitializeCulture();
سلسلة LanguagePreference = ((ProfileCommon)this.Context.Profile).LanguagePreference;
// عندما يزور المستخدم هذا الموقع لأول مرة ويكون الملف الشخصي.LanguagePreference فارغًا، حدد إعداد اللغة لمتصفح المستخدم
إذا (string.IsNullOrEmpty(LanguagePreference))
{
إذا (this.Context.Request.UserLanguages != null)
{
LanguagePreference = this.Context.Request.UserLanguages[0];
((ProfileCommon)Context.Profile).LanguagePreference = LanguagePreference;
}
}
آخر
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanguagePreference);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguagePreference);
}
}
تمت إضافة أسلوبInitializeCulture لفئة System.Web.UI.Page حديثًا إلى Asp.net2.0 وهو يقوم بتعيين الثقافة وUICulture لمؤشر الترابط الحالي. تم تصميم دورة حياة الصفحة بحيث يتم تشغيل أسلوب التهيئة الثقافية قبل بدء الصفحة وتحميلها. في الكود أعلاه، استخدم أولاً ((ProfileCommon)this.Context.Profile).LanguagePreference للحصول على قيمة سمة ملف تعريف LanguagePreference الحالية وتحديد ما إذا كانت فارغة، أي ما إذا كان قد تم حفظ الإعدادات الثقافية للمستخدم. . إذا كانت فارغة، فسيتم الحصول على الثقافة المفضلة للمستخدم من رأس Http وحفظها عبر ((ProfileCommon)Context.Profile).LanguagePreference = LanguagePreference;. إذا لم تكن فارغة، فهذا يعني أنه تم حفظ إعدادات ثقافة المستخدم، ثم استخدم هذه الثقافة لتعيين خصائص CurrentUICulture وCurrentCulture لمؤشر الترابط الحالي.
إذا تم تعريف <globalization uiCulture="auto"culture="auto" /> في Web.config، فيمكن تبسيط الكود أعلاه إلى: protected override void InitializeCulture()
{
base.InitializeCulture();
string LanguagePreference = ((ProfileCommon)this.Context.Profile).LanguagePreference
if(!string.IsNullOrEmpty(LanguagePreference));
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanguagePreference);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguagePreference);
}
آخر
{
((ProfileCommon)Context.Profile).LanguagePreference = Thread.CurrentThread.CurrentCulture.Name;
}
}
إذا كان الموقع يوفر وظيفة تتيح للمستخدمين تحديد ثقافة ما، مثل وضع قائمة اختيارات اللغة في الصفحة الرئيسية للموقع، فيمكن تذكر اختيار المستخدم للثقافة من خلال العبارة التالية:
lstLanguage_SelectedIndexChanged باطلة محمية (مرسل الكائن، EventArgs e)
{
if (lstLanguage.SelectedValue != "Auto") // الخيار الافتراضي هو Auto
{
Profile.LanguagePreference = lstLanguage.SelectedValue;
}
آخر
{
Profile.LanguagePreference = null;
}
Response.Redirect(Request.Url.AbsolutePath);
}
انتبه إلى سطر الكود Response.Redirect(Request.Url.AbsolutePath); لأنه يتم تنفيذ كود معالجة الحدث بعد Page_Load، إذا كنت تريد تغيير الصفحة بسرعة، فيجب عليك إجراء عملية إعادة التوجيه.
عند استخدام ملفات الموارد لإنشاء ملفات موارد عامة في الموقع
في Asp.net2.0
، سيقوم VS.Net2005 تلقائيًا بإنشاء مجلد App_GlobalResources خصيصًا لتخزين ملفات الموارد العامة.ما يسمى بملف المورد العالمي هو ملف مورد تستخدمه ملفات صفحات متعددة أو صفحات رئيسية في الموقع. لنفترض أننا أنشأنا ملفات باسم MyResource.resx وMyResource.zh-cn.resx. في البرنامج، يمكننا استخدام التعليمات البرمجية التالية للحصول على القيمة في ملف المورد: this.lblCountry.Text = Resources.MyResource.Country;
حيث البلد هو المفتاح في ملف الموارد. من الواضح أن هذا أسهل بكثير من الحصول على القيم من ملفات الموارد في Asp.net 1.1.
هناك مشكلتان يجب ملاحظتهما هنا: أولاً، عند إنشاء مجموعة من ملفات الموارد بنفس اسم الجذر، يجب إنشاء ملفات بدون تعريف الثقافة، مثل MyResource.resx، وملفات أخرى مثل MyResource.en-gb وMyResource. يتم إنشاء zh-cn.resx حسب الحاجة. إذا لم يتم إنشاء MyResource.resx وتم إنشاء MyResource.zh-cn.resx فقط، فلن يظهر MyResource ضمن مساحة اسم الموارد في الكود أعلاه، لذلك لا يمكن تمرير تجميع الكود أعلاه. يجب على MyResource.resx تخزين محتوى اللغة الافتراضية للموقع في حالة عدم العثور على ملف مورد مترجم يطابق CurrentUICulture الخاص بمؤشر الترابط الحالي أو تعذر العثور على قيمة المفتاح المقابلة في ملف المورد المترجم. يعتمد Asp.net على المفتاح الموجود في ملف MyResource.resx. إذا كان مفتاح البلد غير موجود في MyResource.resx، ولكن مفتاح البلد موجود في MyResource.zh-cn.resx، فسيقوم الرمز أعلاه أيضًا بالإبلاغ عن خطأ. عند التجميع. ثانيًا، لن يقوم Asp.net بالإبلاغ عن أي استثناء عندما لا يتمكن من العثور على المورد المترجم في المنطقة المقابلة، وسيحصل تلقائيًا على القيمة من ملف MyResource.resx، لكنه لن يغير CurrentUICulture لمؤشر الترابط الحالي.
عند إنشاء ملفات الموارد المحلية في الموقع، سيقوم VS.Net2005 تلقائيًا بإنشاء مجلد App_LocalResources خصيصًا لتخزين ملفات الموارد المحلية. ما يسمى بملفات الموارد المحلية هي ملفات موارد تستخدم لملف صفحة واحدة في الموقع. طريقة التسمية الخاصة به هي بشكل عام Default.aspx.resx وDefault.aspx.zh-cn.resx. الآن أقوم بإضافة ثلاثة مفاتيح اللغة، lblNavigation.Text وlblNavigation.ForeColor في ملف المورد الافتراضي. من بينها، قمت بتعيين اللون الأزرق لـ lblNavigation.ForeColor لـ Default.aspx.resx والأحمر لـ lblNavigation.ForeColor لـ Default.aspx.zh-cn.resx. هناك طريقتان للحصول على المحتوى من ملفات الموارد المحلية في Default.aspx في ملف الصفحة:
(1) <asp:Label ID="lblLanguage" runat="server" Text="<%$ Resources:Language %>"></asp:Label>.
(2) <asp:Label ID="lblNavigaion" runat="server" meta:resourcekey="lblNavigation"></asp:Label>.
احرص على استخدام الرمز $ عند استخدام الطريقة الأولى. يعد استخدام الطريقة الثانية أكثر مرونة ويسمح لك بتعيين قيم للعديد من خصائص عنصر التحكم مرة واحدة.
لا تزال هناك مشكلات يجب ملاحظتها هنا: يجب إنشاء ملف المورد المحلي الافتراضي للصفحة، مثل Default.aspx.resx مطلوب، وDefault.aspx.zh-cn.resx مطلوب. إذا لم تقم بإنشاء ملف مورد محلي افتراضي، ولكنك تستخدم ملفات الموارد المحلية في الصفحة، فعند استخدام الطريقة الأولى للربط، سيحدث خطأ في الترجمة؛ عند استخدام الطريقة الثانية للربط، لن يحدث أي خطأ في الترجمة يحدث خطأ، ولكن إعدادات هذه الخصائص ليس لها أي تأثير، كما لو أنها لم تكن مكتوبة.
4. عرض الصور المترجمة
يعد عرض الصور المترجمة أيضًا ميزة جديدة في Asp.net2.0. في Asp.net2.0، لا تقتصر ملفات الموارد على مجموعات أزواج المفاتيح والقيم من نوع السلسلة، بل يمكنها حفظ أنواع متعددة من الملفات. استخدم هذه الميزة لتوطين الصور. في الواقع، ما يسمى بالصور المترجمة ليست أكثر من مجرد وضع صور معدة لمناطق مختلفة في ملفات موارد محلية مختلفة. على سبيل المثال، ضع LitwareSlogan.jpg في MyResource.resx، ثم ضع LitwareSlogan.cn.jpg في MyResource.zh-cn.resx.
عندما تحتوي ملفات الموارد العامة ذات الإصدارات المترجمة المختلفة على إصدارات مترجمة من ملفات الصور، يمكنك تخصيص ملف معالج يسمى MyLocalImage.ashx لتحميله بشكل مشروط بناءً على تفضيلات اللغة الخاصة بالمستخدم، ويكون الرمز كما يلي.
طريقة الاتصال في الصفحة:
<asp:Image ID="Image1" runat="server" ImageUrl="~/ MyLocalImage.ashx" />
كيفية كتابة معالج MyLocalImage.ashx:
الطبقة العامة MyLocalImage: IHttpHandler
{
طلب معالجة الفراغ العام (سياق HttpContext)
{
context.Response.ContentType = "image/png";
سلسلة LanaguageReference = ((ProfileCommon)context.Profile).LanguagePreference;
إذا (!string.IsNullOrEmpty(LanaguageReference))
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanaguageReference);
}
Bitmap bm = Resources.Litware.LitwareSlogan;
صورة MemoryStream = MemoryStream () جديدة؛
bm.Save(image,ImageFormat.Png);
context.Response.BinaryWrite(image.GetBuffer());
}
}
تستخدم فئة المعالج المخصصة المحددة في MyLocalImage.ashx منطقًا مشابهًا رأيته مسبقًا في أسلوب التهيئة المخصصة لتهيئة إعدادات CurrentUICulture لمؤشر الترابط الحالي قبل استرداد ملف الصورة من ملف المورد العمومي. قد تتساءل عن سبب تعيين CurrentUICulture للخيط الحالي في الفئة الأساسية للصفحة وتحتاج إلى إعادة تعيينه هنا، وذلك لأن الخيط هنا ليس هو نفس الخيط الذي تمت معالجته في الفئة الأساسية. بعد أن يقوم المعالج المخصص بتهيئة إعدادات CurrentUICulture بشكل صحيح، يمكنه الوصول إلى ملف الصورة من خلال فئة الموارد المكتوبة بقوة MyResource.resx. ثم يتعلق الأمر فقط بكتابة بتات ملف الصورة إلى دفق استجابة HTTP.