PDA

View Full Version : گفتگو: افزودن Calendar Type فارسي به Standards and Formats در ويندوز



BOB
شنبه 04 مهر 1388, 11:59 صبح
سلام

در ابتدا محتواي اين تاپيك را مطالعه كنيد:اضافه كردن تاريخ شمسي به ويندوز با Shamsi_XP (http://barnamenevis.org/forum/showthread.php?t=181403)

هدف: "اضافه كردن تاريخ شمسي و نوع تقويم فارسي به ويندوز"
پس جهت ادامه توضيحاتي در رابطه با سيستم تقويم در ويندوز مي‌دهم.

يكي از قابليتهاي موجود در ويندوز، "National Language Support" است (زير مجموعه International Text Display) كه امكانات استفاده از اعداد و الفبا، فونتها و keyborad layout زبانهاي ديگر را فراهم مي‌كند. بخشي از اين تكنولوژي به تعريف مناطق (Locale) اختصاص داده شده كه در آن، حدود 8 منطقه اصلي شامل:
Gregorian, Japanese, Taiwan, Korean, Arabic, Thai, Hebrew

وجود داشته و مابقي Locale ها از آنها مشتق مي‌شوند. مثلا فارسي از Arabic مشتق شده است.

مناطق اصلي، علاوه بر الفبا، قلم و صفحه كليد، داراي نوع تقويم اختصاصي نيز هستند. تقويمهاي موجود فعلي 11 تا: (8 تا اصلي و 3 تا ترجمه شده)
Gregorian, Japanese Emperor Era,Taiwan Calendar, Korean Tangun Era, Hijri (Arabic Lunar), Thai, Hebrew (Lunar), Gregorian Middle East French, Gregorian Arabic, Gregorian transliterated English, Gregorian transliterated French
هستند.

به عنوان مثال براي استفاده از تاريخ هجري قمري به شكل سراسري در ويندوز، مي‌توانيد با اجراي Regional and Language options از Control Panel به اولين Tab با نام Regional Options مراجعه كرده و در ليست Standards and Formats يكي از زبانهايي كه تاريخ هجري دارد (مانند زبان اردو Urdu) را انتخاب و سپس با زدن دكمه Customize در بخش Date از ليست Calendar Type، تقويم "هجري" را انتخاب كنيد.

براي تغيير Locale ها و تنظيمات مربوطه از توابع "National Language Support Functions" موجود در كتابخانه‌هاي Winnls.dll و nlsdl.dll استفاده مي‌شود.

فايلهاي حاوي اطلاعات مناطق، با نام مشخص كننده Codepage منطقه مربوطه و پسوند *.nls در فهرست System32 موجودند. و ديگر فايلهاي مورد استفاده در تنظيمات مناطق NLSDL.CAT، intl.pnf/inf، layout.pnf/inf هستند.

مهمترين فيلدهاي تنظيمات مورد استفاده نيز در مسيرهاي زير در رجيستري ذخيره مي‌شوند:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Nls
HKLM\SYSTEM\CurrentControlSet\Control\Nls
HKLM\SYSTEM\ControlSetXXX\Control\Nls
HKCU\Control Panel\International
...

مهمترين اطلاعات تكميلي مورد نياز در سرتيترهاي زير در MSDN موجودند:
National Language Support Reference
Using National Language Support
Locales and Languages
Locale Information
Code Page Identifiers
Calendar Identifiers

هچنين ابزاري با نام Windows Locale Builder از Micro$oft براي ويندوز ويستا منتشر شده كه بوسيله آن ميتوان ثوابت Constants موجود در Locale هاي فعلي را ترجمه/تغيير داده و Locale سفارشي درست كرد. (البته امكانات آن بسيار محدود است)

حال به منظور افزودن نوع تقويم فارسي به استاندارد‌هاي قابل پشتيباني توسط ويندوز در كتابخانه مربوط به Standards and Formats در Regional and Language options، مي‌بايست روند اجراي توابع GetCalendarInfo, SetCalendarInfo, EnumCalendarInfo, EnumCalendarInfoProc با دقت و مرحله به مرحله Trace شده و منابع مورد استفاده (كتابخانه‌ها، فايلها، رجيستري، حافظه و ...) و offset هاي خوانده/نوشته شده، نحوه بارگذاري اطلاعات مربوطه و غيره بررسي شده و ساختار فايلهاي NLS شناسايي شوند.

با توجه به شباهتهاي بسيار زياد Localeهاي Arabic و Farsi بنده فكر ميكنم تغيير Locale عربي حاوي Hijri Calendar Type و ساخت تقويم شمسي كار زياد پيچيده‌اي نباشد.

منتهي امر، به دقت، حوصله و زمان زيادي نياز دارد كه از عهده بنده به تنهايي بر نخواهد آمد. از اين رو از تمامي كاربران داراي دانش فني كافي (تجربه در مهندسي معكوس و شناسايي File Format هاي جديد، افزودن توابع جديد به كتابخانه‌هاي استاندارد، تغيير EP هاي استاندارد به روالهاي جديد بدون بروز ناهمخواني در خروجي‌ها و ... ) خصوصا اعضاي فعال بخش امنيت نرم‌افزار دعوت مي‌كنم كه در پيشرفت اين پروژه Open source همكاري نمايند.

ضمنا توجه داشته باشيد كه هدف توليد يك Calendar Type جديد است نه صرفا شمسي كردن تاريخ، چرا كه با استفاده از يك GlobalHook ساده روي بعضي از توابع مربوطه به سادگي ميتوان خروجي توابع تاريخ ميلادي را به شكل شمسي تغيير داد، اما اين روش نه صحيح است و نه استاندارد.
علاوه بر آن باعث بوجود آمدن سرباره (حافظه/پروسس) زيادي بر روي سيستم مي‌شود.

با تشكر

khalil_guitar
چهارشنبه 17 آبان 1391, 09:38 صبح
سلام
می تونید روی همکاری بنده حساب ویژه باز کنید
چت یاهو
khalil.delavaran@yahoo.com