sohil مراقب
أحمر الدولة : فلسطين عدد المساهمات : 167
| موضوع: تطبيق متعدد اللغات باستخدام Resources 2016-01-19, 11:53 am | | في هذا الدرس مثال بسيط حول استخدام مصادر التطبيق (Resources) لتغيير لغة الواجهة حسب الإعدادات الإقليمية للنظام بشكل تلقائي.
String Table: يمكن باستخدام أي محرر Resource تخزين عدة جداول من النصوص تسمى StringTable حيث يحمل كل جدول رقم تعريفي للغة ورقم تعريفي لإقليم اللغة. مثال: في هذا المثال نقوم بإنشاء جدولين من النصوص بشكل يدوي (دون استخدام برامج) حيث في الجدول الأول نخزن النصوص باللغة العربية (إقليم سورية) وفي الجدول الثاني نخزن النصوص بلغة أجنبية (الفرنسية إقليم قياسي) افتح ملف نصي واكتب فيه:
كود :
- الكود:
-
// --------- resources of type String -----------
STRINGTABLE LANGUAGE LANG_ARABIC, SUBLANG_ARABIC_SYRIA { 1001, "موافق" 1002, "إلغاء الأمر" 1003, "لغات:" 1004, "تطبيق متعدد اللغات" 1005, "حول التطبيق" }
STRINGTABLE LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT { 1001, "&oK" 1002, "&Annuler" 1003, "Langues:" 1004, "Multi-langue avec Resources" 1005, "&A Propos..." }
// --------- resources of type Icon -----------
MAINICON Icon "MAINICON.ico"
أعددنا جدولين الأول للغة العربية إقليم سورية وتوجد قيم أخرى: SUBLANG_ARABIC_LIBYA، SUBLANG_ARABIC_EGYPT والجدول الثاني للغة الفرنسية-افتراضي، وكان من الممكن استخدام أي من القيم: SUBLANG_FRENCH أو SUBLANG_FRENCH_CANADIAN... أوغيرها
كل هذه القيم وغيرها متوفرة كثوابت في المكتبة Windows.pas.
الآن احفظ الملف باسم Lang.rc مثلا. قم بإنتاج ملف Resource من خلال سطر الأوامر:
كود :
- الكود:
-
BRCC32 Lang.rc
الملف الناتج -> Lang.RES
نغير اسم ملف الـ Resource في التطبيق:
كود :
- الكود:
-
uses Forms, uMain in 'uMain.pas' {Form1};
[color=Red]{$R Lang.res}[/color]
begin Application.Initialize; Application.CreateForm(TForm1, Form1);
الآن تطبيقنا يحتوي على مصادر نصية للغتين لاستدعاء نص الزر OK نكتب:
كود :
- الكود:
-
btOk.Caption:= LoadStr(1001);
حيث 1001 هو الرقم التعريفي لنص الزر OK
ملاحظة: LoadStr من SysUtils وهي تستدعي LoadString من API بما يشبه الآتي:
كود :
- الكود:
-
function GetResString(uID: Cardinal): string; begin SetLength(Result , MAX_PATH); LoadString(HInstance, uID, PChar(Result), MAX_PATH); end;
لكن... كيف يحدد البرنامج أي لغة؟ بعبارة أخرى كيف نعرف أن البرنامج سيستدعي كلمة "موافق" أو "OK"؟؟؟ ... هنا مربط الفرس!
البرنامج لا يعرف ذلك وليس بحاجة لمعرفة ذلك... عند تشغيل البرنامج في Thread يحصل هذا الأخير على قيمة Cardinal تدعى Locale تمثل هذه القيمة الإعدادات الإقليمية المطبقة في هذا الـ Thread
للحصول على هذه القيمة نستخدم GetThreadLocale تابع API لنشاهد هذه القيمة:
كود :
- الكود:
-
ShowMessage(IntToHex(GetThreadLocale, 8));
بماذا تذكرك هذه القيمة ؟ مرر هذه القيمة لهذا التابع لنشاهد الصورة بوضوح:
كود :
- الكود:
-
function GetLanguage(wLang: Cardinal): string; var szLang: array[0..MAX_PATH] of Char; begin VerLanguageName(wLang, szLang, 50); Result := szLang; end;
ولتغيير هذه القيمة نمرر للتابع SetThreadLocale قيمة (مثل التي حصلنا عليها بـ GetThreadLocale).
يقوم التطبيق عند إقلاعه بقراءة مصادره (الـ Resources) وفق هذه القيمة (Locale) التي تمثل اللغة الإقليمية المحددة.
الآن إقرأ عائد التابع GetSystemDefaultLCID باستخدام GetLanguage التي رأيناها آنفا. هذا التابع يعيد اللغة الإقليمية للنظام. وهو اللغة التي تستخدم لفك ترميز Unicode (موجودة في الإعدادات الإقليمية التبويب الثالث في XP).
الخلاصة: نكتب تابع يقوم بتطبيق لغة ممررة عبرة معلمة إلى الـ Thread الحالي للتطبيق، ثم يغير نصوص المكونات:
PHP كود :
- الكود:
-
procedure TForm1.SetLanguage(LangID: Cardinal); begin SetThreadLocale(LangID); btOk.Caption:= LoadStr(1001); btCancel.Caption:= LoadStr(1002); end;
يمكن المرور على المكونات بحلقة...
لتطبيق أية لغة:
PHP كود :
- الكود:
-
SetLanguage(LangID);
حيث LangID هو الرقم التعريفي للغة الإقليمية ويمكن الحصول عليه باستخدام Macro يدعى MAKELANGID يترجم بدلفي كما يلي:
PHP كود :
- الكود:
-
function MAKELANGID(usPrimaryLanguage, usSubLanguage: LANGID): WORD; begin Result := ((usSubLanguage shl 10) + usPrimaryLanguage); end;
مثال:
PHP كود :
- الكود:
-
SetThreadLocale(MAKELANGID(LANG_ARABIC, SUBLANG_ARABIC_SYRIA));
عند إقلاع النظام نجعله يأخذ اللغة الإقليمية للنظام:
PHP كود :
- الكود:
-
procedure TForm1.FormCreate(Sender: TObject); begin SetThreadLocale(GetSystemDefaultLCID); end;
وبالتالي نتفادى جانب من مشكلة عدم تغيير الإعدادات الإقليمية والرموز الغريبة!
تحميل سورس المثال إستفسارات،ملاحظات، إنتقادات، إضافات أو تعديلات، اقتراحات، مظاهرات، مفاوضات، إنقلابات... مرحبا
|
|