mousa Admin

عضو شده در : 16 May 2007 پست : 103
| عنوان: طراحي برنامه هاي چندزبانه Sat May 19, 2007 3:05 pm | |
| طراحي برنامههاي چندزبانه
ايجاد يك برنامه چند زبانه در سيمبين نسبتاً راحت است و اين مقاله به شما نشان ميدهد كه چگونه اين كار را انجام دهيد. شما با مقداري تلاش مي توانيد برنامهاي داشته باشيد كه هم به انگليسي باشد و هم اين كه زبان شما را هم پشتيباني كند. براي افزودن زبانهاي ديگر ميتوانيد از دوستان اينترنتيتان كه با زبانهاي مختلف آشنايي دارند، استفاده كنيد.
مقدمه:
در اين مثال فرض كنيد كه ميخواهيم برنامهاي بنويسيم كه سه زبان انگليسي (English)، فرانسه (French) و آلماني (German) را پشتيباني ميكند. و نيز فرض كنيد كه اسم برنامهمان MyApp است.
اين برنامه بدون هيچ مشكلي بايد در تمام محيطهاي گرافيكي كار كند. در اينجا ما برنامه را براي رابط UIQ مينويسيم ولي اين موضوع مستقيماً به بحث ما مربوط نميشود. شما ميتوانيد فايل pkg را تغيير دهيد و آن را براي رابطهاي ديگري از جمله سري 60 هم كامپايل كنيد.
در این مقاله شما را با کارهایی که باید برای تبدیل یک برنامه معمولی به یک برنامه چند زبانه انجام دهید آشنا می کنیم. برای انجام این کار شش مرحله در پیش داریم:
*) جمع آوری تمام رشته ها و قرار دادن آنها در فایل های خاص *) اِعمال تغییرات لازم در منابع *) اِعمال تغییرات لازم در کد برنامه (تا بتواند با متغیرهای رشته ها کار کند) *) اعمال تغییرات لازم در فایل MMP (تا به کامپایلر بگوییم که کدام زبان ها پشتیبانی شده اند) *) مشخص کردن نام برنامه در هر زبان *) کامپایل کردن و ساخت برنامه
مرحله 1) جمع آوری تمام رشته ها و قرار دادن آنها در فایل های خاص
در مرحله اول باید سه فایل با نام های MyApp.l01 و MyApp.l02 و MyApp.l03 ایجاد کنیم که به ترتیب حاوی زبان های انگلیسی، فرانسه و آلمانی هستند. کدهای 01 و 02 و 03 جزو قراردادهای سیمبین هستند که هر کدام یک زبان خاص را مشخص می کنند. کدهای زبان های مختلف را می توانید در پایان مقاله ببینید. همه آنها در فایل e32std.h تعریف شده اند.
در داخل سه فایلی که ایجاد کرده اید باید کدهای زیر را بنویسید:
فایل اول:
| كد: | // MyApp.l01 // English localisation #define ELanguage ELangEnglish
// Localised strings #define STRING_HOWAREYOU "How are you ?" #define STRING_APPLES "You have %d apples." #define STRING_EXIT "Exit"
|
فایل دوم:
| كد: | // MyApp.l02 // French localisation #define ELanguage ElangFrench
// Localised strings #define STRING_HOWAREYOU "Comment allez vous ?" #define STRING_APPLES "Vous avez %d pommes." #define STRING_EXIT "Sortir"
|
فایل سوم:
| كد: | // MyApp.l3 // German localisation #define ELanguage ElangGerman
// Localised strings #define STRING_HOWAREYOU "Wie gehen Sie ?" #define STRING_APPLES "Sie haben %d Apfels." #define STRING_EXIT "Schliessen"
|
سپس یک فایل با نام MyApp.loc ایجاد کنید تا اطلاعات مربوط به سه فایل بالا را در آن قرار دهیم:
| كد: | // MyApp.loc // Localisation for MyApp
#ifdef LANGUAGE_01 #include "MyApp.l01" #endif
#ifdef LANGUAGE_02 #include "MyApp.l02" #endif
#ifdef LANGUAGE_03 #include "MyApp.l03" #endif
|
اهمیت این فایل loc آن است که بتوانیم فایل زبانی مناسب را در فایل rss داخل کنیم؛ بنابراین استفاده کردن و تعریف این فایل فقط یک قرارداد است.
من معمولاً این فایل ها را همراه با فایل rss در یک پوشه به نام rsc قرار می دهم. البته این کار الزامی نیست. علت این کار هم این است که بعداً آنها را به راحتی به فایل mmp ضمیمه کنیم.
مرحله 2) استفاده از رشته ها در منوها و پنجره های محاوره
اكنون ما رشتهها را در اختيار داريم. حالا بايد آنها را به برنامه وارد كنيم. ابتدا بايد فايل loc را به فايل تعاريف منابع (rss) ضميمه كنيم.
| كد: | // MyApp.rss NAME HELL
#include #include "MyApp.hrh" #include "MyApp.loc" // <<<< Here it is
RESOURCE RSS_SIGNATURE { }
RESOURCE TBUF { buf=""; } ...
|
حالا بايد رشتهها موجود در كد را به نام در نظر گرفته شده براي رشتهها تغيير دهيم. مثلاً كد
| كد: | //************************************* RESOURCE MENU_PANE r_myapp_menu //************************************* { items= { MENU_ITEM { command=EMyAppHowAreYou; txt="How are you?"; }, MENU_ITEM { command=EEikCmdExit; txt="Exit"; } }; }
|
بايد به صورت
| كد: | //************************************* RESOURCE MENU_PANE r_myapp_menu //************************************* { items= { MENU_ITEM { command=EMyAppHowAreYou; txt=STRING_HOWAREYOU; }, MENU_ITEM { command=EEikCmdExit; txt=STRING_EXIT; } }; }
|
تغيير كند.
اگر فقط ميخواهيد منوها را چندزبانه كنيد، انجام كارهاي بالا كافي است ولي اگر ميخواهيد رشتههاي موجود در كدها را هم چندزبانه كنيد، بايد براي هر كدام، يك بافر هم تعريف كنيد. براي انجام اين كار فقط كافي است كه از براي هر رشته از دستور TBUF در انتهاي فايل rss استفاده كنيد. مثلاً به صورت زير:
| كد: | /************************************** // STRINGS //************************************* RESOURCE TBUF r_string_apple { buf=STRING_APPLE; } RESOURCE TBUF r_string_thanks { buf=STRING_THANKS; }
|
مرحله 3) استفاده از متنها در كد
شما هماكنون ميتوانيد خيلي از تعاريف _LIT را از كدهايتان حذف كنيد. مثلاً به سطر زير، نيازي نداريم:
| كد: | myDes.Format(_L("You have %d apples"),num);
|
به جاي عبارت بالا، ميتوانيد از يك format string كه از فايل resource ميخوانيد، استفاده كنيد. البته اين كار مقداري پيچيده است ولي تابع CCoeEnv::AllocReadResourceLC() مقدار زيادي از كار را براي ما انجام ميدهد:
| كد: | HBufC* formatBuf=CCoeEnv::Static()->AllocReadResourceLC(R_STRING_APPLE); myDes.Format(formatBuf,num); CleanupStack::PopAndDestroy(formatBuf);
|
اين كد يك واصف HBufC اختصاص ميدهد و R_STRING_APPLE را در آن كپي ميكند. اين واصف به عنوان يك format template به كار ميرود كه ميتواند يك عدد صحيح را داشته باشد. بسته به تنظيمات زباني گوشي شما (و همچنين مقدار num!) واصف myDes ميتواند مقادير "You have 3 apples."، "Vous avez 3 pommes." يا "Sie haben 3 Apfels" را داشته باشد.
مرحله 4) آپديت كردن فايل mmp تا الان تغييرات لازم را در كدهايتان انجام دادهايد. فقط يك آپديت كوچك در فايل mmp لازم است تا به كامپايلر resource بفهمانيم كه از كدام زبان استفاده كند. يك دستور LANG به فايل اضافه كنيد و جلوي آن شماره زبانهايي كه برنامهتان پشتيباني ميكند را وارد كنيد.
| كد: | TARGET MyApp.app TARGETTYPE app UID 0x100039CE 0x0EB00551
TARGETPATH systemappsMyapp
// Language in which the application is translated // (each supported language shall provide a MyApp.lxx file where // xx is the code number of the language: // 01 = english, 02 = french, 03 = german, etc... ) LANG 01 02 03
SOURCEPATH ..src SOURCE MyAppMain.cpp SOURCE MyAppDocument.cpp SOURCE MyAppUi.cpp SOURCE MyAppView.cpp SOURCE MyAppModel.cpp
SOURCEPATH ..rsc RESOURCE MyApp.rss
USERINCLUDE ..inc USERINCLUDE ..rsc ...
|
البته فراموش نكنيد كه فايل resourceتان را هم include كنيد. (توسط دستور RESOURCE) همچنين مسير فايلهاي متنهاي برنامه در زبانهاي پشتيباني شده را هم مشخص كنيد. (توسط دومين دستور USERINCLUDE)
مرحله 5) تنظيم نام برنامه در زبانهاي مختلف نام برنامه به طور پيشفرض همان نام فايل .app است كه نميتوان آن را به زبانهاي مختلف نوشت. البته با ايجاد كردن يك فايل .aif ميتوان نام برنامه در زبانهاي مختلف را مشخص كنيد. ابتدا فايل تعريف را ايجاد و يا آپديت كنيد به صورت زير:
| كد: | //MyAppAif.rss #include
RESOURCE AIF_DATA { app_uid=0x0EB00551; num_icons=2; embeddability=KAppNotEmbeddable; newfile=KAppDoesNotSupportNewFile;
caption_list= { CAPTION { code=ELangEnglish; caption="MyApp"; }, CAPTION { code=ELangFrench; caption="MonApp"; }, CAPTION { code=ELangGerman; caption="MeinApp";} }; }
|
عبارت caption_list به هر زبان، يك نام را اختصاص ميدهد. حالا دستور مربوطه را به آخر فايل mmpتان اضافه كنيد (در صورت موجود نبودن):
| كد: | AIF MyApp.aif . ..aifMyAppaif.rss c12 ..aifnewlc42x35.bmp ..aifnewlc42x35m.bmp ..aifnewlc42x29.bmp ..aifnewlc42x29m.bmp
|
اين دستور، همچنين لوگوي برنامه را (كه در Menu نمايش داده ميشود) هم مشخص ميكند.
مرحله 6) فايل pkg را آپديت كنيد هنوز هم داريد ميخونيد؟ خوبه! الان شما به پايان كار نزديك هستيد. الان وقت آن است كه از شما يك سؤال در مورد نحوه نصب فايلهاي زبانهاي پشتيباني شده در موبايل بپرسم. آيا شما ميخواهيد:
*) همه فايلها را بيسروصدا روي موبايل كپي كنيد. اين كار در برنامههاي با حجم زياد، جاي بسيار زيادي را اشغال ميكند ولي ديگر لازم نيست از كاربر سؤالي بپرسيد. *) از كاربر بپرسيد كه كدام زبان را ميخواهد نصب كند؟ اين روش فضاي كمتري روي موبايل اشغال ميكند، ولي يه مرحله به مراحل نصب برنامه، اضافه ميكند.
ابتدا مورد اول را توضيح ميدهيم. به خاطر اين كه نميخواهيم كاربر را با نشان دادن يك پنجره popup اذيت كنيم، بنابراين براي هر زباني كه پشتيباني ميكنيم، يك فايل resource نصب ميكنيم و انتخاب زبان رو به عهده سيستم عامل ميگذاريم. به صورت پيشفرض اين فايلهاي resource داراي پسوند .rXX هستند كه XX كد زبان مورد نظر است و اين فايلها در مسير زير قرار ميگيرند:
epoc32datazsystemappsMyApp
البته بايد همه آنها را در فايل .pkg ليست كنيم و در مسير برنامه نصب كنيم.
| كد: | ; ; Installation file for MyApp example application ; "Silent" version: no language popup ; ; UID is the app's UID ; #{"MyApp"},(0x0EB00551),1,0,0
; Target is UIQ 2.0 devices. (0x101F617B), 2, 0, 0, {"UIQ20ProductID"}
; ; Main App ; "epoc32releasearmiurelMyApp.app" - "!:systemappsMyAppMyApp.app" "epoc32datazsystemappsMyAppMyApp.r01" - "!:systemappsMyAppMyApp.r01" "epoc32datazsystemappsMyAppMyApp.r02" - "!:systemappsMyAppMyApp.r02" "epoc32datazsystemappsMyAppMyApp.r03" - "!:systemappsMyAppMyApp.r03" "epoc32datazsystemappsMyAppMyApp.aif" -"!:systemappsMyAppMyApp.aif"
|
شما بايد توجه داشته باشيد كه با وجود اين كه ما يك برنامه چندزبانه مينويسيم، ولي هيچ زباني را در فايل .pkg مشخص نميكنيم. به همين خاطر است كه از كاربر چيزي موقع نصب برنامه پرسيده نميشود. و موضوع جالب اين است كه برنامه شما براي يك كاربر انگليسيزبان، به صورت انگليسي، براي يك فرانسوي به زبان فرانسه و براي يك آلماني، به زبان آلماني، طبق تنظيمات محلي گوشي مورد نظر، ظاهر خواهد شد. (كه به صورت پيشفرض انگليسي است.) و اگر شما زبان گوشيتان را عوض كنيد، زبان برنامه شما هم به صورت اتوماتيك عوض خواهد شد. يكي از مشكلات اين روش اين است كه شما نميتوانيد كاري كنيد كه نام برنامهتان در Installer در زبانهاي مختلف نشان داده شود!
روش ديگر اين است كه يك پنجره popup براي انتخاب زبان توسط كاربر، موقع نصب برنامه، نشان دهيم و فقط زبان انتخاب شده توسط كاربر را نصب كنيم. در اين روش نسبت به روش قبل لازم نيست تغيير در كد برنامه انجام دهيد. فقط بايد چند خط را در فايل .pkg تغيير دهيد:
| كد: | ; ; Installation file for MyApp example application ; Standard version: language popup ; ;Languages &EN,FR,GE
; UID is the app's UID ; #{"MyApp","MonApp","MeinApp"},(0x0EB00551),1,0,0
; Target is UIQ 2.0 devices. (0x101F617B), 2, 0, 0, {"UIQ20ProductID", "UIQ20ProductID", "UIQ20ProductID"}
; ; Main App ; "epoc32releasearmiurelMyApp.app" - "!:systemappsMyAppMyApp.app" { "epoc32datazsystemappsMyAppMyApp.r01", "epoc32datazsystemappsMyAppMyApp.r02", "epoc32datazsystemappsMyAppMyApp.r03" } - "!:systemappsMyAppMyApp.rsc" "epoc32datazsystemappsMyAppMyApp.aif" -"!:systemappsMyAppMyApp.aif"
|
اين فايل .pkg فايل sisي توليد ميكند كه كه موقع نصب شدن، كمي متفاوتتر از قبل عمل ميكند. *) اين برنامه در Installer همان نامي را خواهد داشت كه براي زبانهاي مورد نظر نوشتهايد. (در اينجا MyApp، MonApp يا MeinApp) *) يك پنجره popup ظاهر خواهد شد كه از كاربر زبان مورد نظر را خواهد پرسيد. *) فقط يكي از فايلهاي .rXX در گوشي نصب خواهد شد و نامش هم به .rsc تغيير خواهد يافت. *) بعد از نصب، برنامه فقط در اين زبان نمايش داده خواهد شد. بدون توجه به تنظيمات زباني گوشي.
لينكهاي مرتبط اگر شما مايل به مطالب بيشتري در اين مورد هستيد، لينكهاي زير براي شما مفيد خواهند بود: *) برنامه نمونه Nokia language در پوشه series60ExLanguage در مسيري كه SDK سري 60 را نصب كردهايد. *) مقاله Localization. *) How to make a multilingual application installer از SavaaZ *) برنامه نمونه localisation در سايت برنامهنويسي Sendo. (ثبتنام لازم است.)
جدول زبانها
| كد: | Language TLanguageEnum Code Language TlanguageEnum Code UK English ELangEnglish 01 Catalan ELangatalan 44 French ELangFrench 02 Croation ELangCroation 45 German ELangGerman 03 Canadian English ELangCanadianEnglish 46 Spanish ELangSpanish 04 International English ELangInternationalEnglish 47 Italian ELangItalian 05 South African English ELangSouthAfricanEnglish 48 Swedesh ELangSwedesh 06 Estonian ELangStonian 49 Danish ELangDanish 07 Farsi ELangFarsi 50 Norwegian ELangNorwegian 08 Canadian French ELangCanadianFrench 51 Finnish ELangFinish 09 Gaelic ELangScotsGaelic 52 American ELangAmerican 10 Georgian ELangGeorgian 53 Swiss French ELangSwissFrench 11 Greek ELangGreek 54 Swiss German ELangSwissGerman 12 Cyprus Greek ELangCyprusGreek 55 Portuguese ELangPortuguese 13 Gujarati ELangGujarati 56 Turkish ELangTurkish 14 Hebrew ELangHebrew 57 Icelandic ELangIcelandic 15 Hindi ELangHindi 58 Russian ELangRussian 16 Indonesian ELangIndonesian 59 Hungarian ELangHungarian 17 Irish ELangIrish 60 Dutch ELangDutch 18 Swiss Italian ELangSwissItalian 61 Belgian Flemish ELangBelgianFlemish 19 Kannada ELangKannada 62 Australian English ELangAustralian 20 Kazakh ELangKazakh 63 Belgian French ELangBelgianFrench 21 Kmer ELangKhmer 64 Austrian German ELangAustrian 22 Korean ELangKorean 65 New Zealand English ELangNewZealand 23 Lao ELangLao 66 International French ELangInternationalFrench 24 Latvian ELangLatvian 67 Czech ELangCzech 25 Lithuanian ELangLithuanian 68 Slovak ELangSlovak 26 Macedonian ELangMacedonian 69 Polish ELangPolish 27 Malay ELangMalay 70 Slovenian ELangSlovenian 28 Malayalam ELangMalayalam 71 Taiwanese Chinese ELangTaiwanChinese 29 Marathi ELangMarathi 72 Hong Kong Chinese ELangHongKongChinese 30 Moldovian ELangMoldavian 73 PRC Chinese ELangPrcChinese 31 Mongolian ELangMongolian 74 Japanese ELangJapanese 32 Norwegian Nynorsk ELangNorwegianNynorsk 75 Thai ELangThai 33 Brazilian Portuguese ELangBrazilianPortuguese 76 Afrikaans ELangAfrikaans 34 Punjabi ELangPunjabi 77 Albanian ELangAlbanian 35 Romanian ELangRomanian 78 Amharic ELangAmharic 36 Serbian ELangSerbian 79 Arabic ELangArabic 37 Sinhalese ELangSinhalese 80 Armenian ELangArmenian 38 Somali ELangSomali 81 Tagalog ELangTagalog 39 International Spanish ELangInternationalSpanish 82 Belarussian ELangBelarussian 40 American Spanish ELangLatinAmericanSpanish 83 Bengali ELangBengali 41 Swahili ELangSwahili 84 Bulgarian ELangBulgarian 42 Finland Swedish ELangFinlandSwedish 85 Burmese ELangBurmese 43 Tamil ELangTamil 87 Telugu ELangTelugu 88 Tibetan ELangTibetan 89 Tigrinya ELangTigrinya 90 Cyprus Turkish ELangCyprusTurkish 91 Turkmen ELangTurkmen 92 Ukrainian ELangUkrainian 93 Urdu ELangUrdu 94 Vietnamese ELangVietnamese 96 Welsh ELangWelsh 97
|
لینک مقاله اصلی: http://www.newlc.com/Multilingual-Application.html
با عرض معذرت از تمامی خوانندگان، متأسفانه هر کاری کردم نتونستم این کدها رو از چپ به راست بکنم! |
|
mousa Admin

عضو شده در : 16 May 2007 پست : 103
| عنوان: Re: طراحي برنامه هاي چندزبانه Sun May 27, 2007 3:17 pm | |
| سلام
فایل pdf هم آماده شد. می توایند از اینجا دریافت کنید. امیدوارم خوشتان آمده باشد. |
|