طراحي برنامههاي چندزبانه
ايجاد يك برنامه چند زبانه در سيمبين نسبتاً راحت است و اين مقاله به شما نشان ميدهد كه چگونه اين كار را انجام دهيد. شما با مقداري تلاش مي توانيد برنامهاي داشته باشيد كه هم به انگليسي باشد و هم اين كه زبان شما را هم پشتيباني كند. براي افزودن زبانهاي ديگر ميتوانيد از دوستان اينترنتيتان كه با زبانهاي مختلف آشنايي دارند، استفاده كنيد.
مقدمه:
در اين مثال فرض كنيد كه ميخواهيم برنامهاي بنويسيم كه سه زبان انگليسي (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 ميتوان نام برنامه در زبانهاي مختلف را مشخص كنيد. ابتدا فايل تعريف را ايجاد و يا آپديت كنيد به صورت زير:
- كد:
-
http://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با عرض معذرت از تمامی خوانندگان، متأسفانه هر کاری کردم نتونستم این کدها رو از چپ به راست بکنم!