EiffelStudio Internationalization
Contents
Overview
Since i18n have been mostly implemented in Eiffel, Eiffel Studio is coming into the new era of internationalization. The goal of i18n integration is to provide multiple language support in Eiffel Studio and let users switch languages of the interface easily at runtime.
Steps to integrate i18n
Non-editor part
The first step concentrates on the interface of Eiffel Studio. All buttons, labels, tool tips and grids that are directly used by Eiffel Studio project.
- Collect all static interface strings in the system., including some context dependent strings.
- This is not necessary, but doing this give us better management and code quality. Only INTERFACE_NAMES knows i18n.
- Change all types in INTERFACE_NAMES, EB_METRIC_NAMES, CONF_INTERFACE_NAMES, WARNING_MESSAGES to be STRING_GENERAL. Caller should be adapted correspondingly.For some stings, two versions maybe needed. One for internal use, the other one for the interface,especially for strings saved as preferences and strings constants used in configure XML files.
- Rewrite bodies of those strings using i18n translation routines, STRING_32 instances are actually produced.
- Modify places using EV_CONSTANTS, make new classes if needed. e.g. EV_CONFIRMATION_DIALOG; EV_WARNING_DIALOG are not usable.
- Write scripts to draw strings from default.xml. "Directory", names and descriptions of preferences are also needed to be translated.
- Find a solution to wizards, since some of them are external excutables.
- Build language menus to switch language.
- Make interface classes locale observers so that all tools know when interface names should be reread.
- Solve the problems in vision2.
- In Chinese, menu chars are conventionally parenthesized and under scored following the menu text. This can be done by the translator.
- Handle "&" as both char and wchar for menu items.
- Fix "tab" issue for menu items.
- Integrate i18n .po generation tool. It has been done in i18n branch.
- using .po generation tool integrated ec to compile an ec in which interface names have been adapted.
- Use .po generation tool to generate estudio.pot file. The .po generation tool generally extracts strings that are taken as parameters of `translated' and `translated_plural' and produce .pot file.
- Since strings used in EiffelStudio not only come from the source code. Write scripts to extract them and merge them into estudio.pot. Strings should be extracted from: default.xml → descriptions of preferences
- Duplicate estudio.pot file to .po files with names of locale ids. Each .po file represents a locale. i18n library read .mo files with correct names of id. Though .po files are not necessary to have names of locale id, .mo files are one-to-one produced from .po files. So using locale ids as names of .po files is reasonable.
- Translators using .po editor open .po files and translate interface names to all kinds of languages.
- Generate .mo files using .mo generation script.
Editor part
- This step might be more complicated. And will be done later after the first step. Probably after 6.0 release. This step concentrates on extending the editor library to accept wide characters. Internationalization of any output directed to the editor is done in the step. Many existing tools might be affected, search tool, formatting tools etc.
- Encoding conversion facility is needed.
File structure
Repository
All files are stored in %EIFFEL_SRC%\Delivery\studio\lang
%EIFFEL_SRC%\Delivery\studio\lang\script
Place where scripts for generating .mo files are put. The scripts are invoked when building a delivery.
%EIFFEL_SRC%\Delivery\studio\lang\mo_files
Place to put .mo files. Those files are actually used at runtime. Only .mo files need to be included in a delivery.
%EIFFEL_SRC%\Delivery\studio\lang\po_files
Place to put .pot file and .po files.
Delivery
Windows: %ISE_EIFFEL%\studio\lang\mo_files\*.mo Unix: /usr/share/locale/(product_version_name)/*.mo
Maintenance
General
- .pot file is PO template file which is generated by .po generation tool. .pot file is simply untranslated file with only source entries and blank target entries.
- .po files are the files translators actually work on. Whenever translators get a new version of .pot file, they should update .po file they are working on from the .pot file. Update is normally done by third party tools. Tools like poEdit give lists of new strings and obsolete strings. And in the full list new strings and fuzzy strings are marked in different colors by poEdit.
- Fuzzy strings are applied when updating. msgmerge of Gettext make slightly changed strings fuzzy. When the checking of fuzzy strings is done, translators should remove fuzzy marks.
- Obsolete strings are commented out at the end of .po files when merging. Those comments can be removed at anytime if we wish.
- When the translation or modification is done, translators only need to commit .po file(s) that they are working on.
- Whenever new languages are decided to add in. New .po file can be added directly in %EIFFEL_SRC%\Delivery\studio\lang\po_files. Eiffel Studio should have the ability to detect at runtime what languages are available.
Translator Guide
- Update $EIFFEL_SRC/Delivery.
- Download a po editor. poEdit for Windows and KBabel or gtranslator for KDE and Gnome.
- In $EIFFEL_SRC/Delivery/studio/lang/po_files, find out the .po file(s) one should work on. Take zh_CN.po as example. Open zh_CN.po in po editor. In the po editor, there should be a command to update from pot file. Update from $EIFFEL_SRC/Delivery/studio/lang/po_files/estudio.pot within the po editor. If there is any change took place in estudio.pot, the po editor should inform. The translator fills empty entries, solves FUZZY strings or modifies translated entries.
- When the translation is done, just commit those modified po files.
- Make sure that po files are saved in UTF-8 encoding.
Developer Guide
- The major thing a developer should take care of is code quality. All names need to be translated should in principle be put in framework/interface_names. Whenever a string of sentence is needed in the interface, just leave it as a sentence to be translated. Be careful to SEPERATE a sentence into terms or phrases, because ways to sequence those terms again into sentence vary in different languages. Plural form should be used whenever needed. There are a lot of examples in INTERFACE_NAMES.
- If a developer wants to take changes into effect immediately, see what a maintainer and a translator should do.
Maintainer Guide
- Build po generation tool which is located at internal svn repository /ise_svn/trunk/Src/tools/po_generation_tool.
- Make sure gettext and perl is installed. On windows cygwin cantains perl and gettext modules.
- When there are new or modified strings need to be translated in the code. $EIFFEL_SRC/Delivery/studio/lang/estudio.pot should be regenerated.
To regenerate estudio.pot, one should do: po_generation_tool -D $EIFFEL_SRC/Eiffel $EIFFEL_SRC/framework -o $EIFFEL_SRC/Delivery/studio/lang/estudio.pot On windows: $EIFFEL_SRC/Delivery/studio/script/build_preference_entries.bat On Unix: perl $EIFFEL_SRC/Delivery/studio/script/preference_po_extraction.pl msguniq -o ../po_files/estudio.pot ../po_files/estudio.pot
- Commit the estudio.pot file to let translators to update.
- To add a new language support, simply copy estudio.pot to LOCALE_ID.po where LOCALE_ID should be:
Case 1: LL-RR Case 2: LL-SS-RR Case 3: LL_RR Case 4: LL_RR.Enc Case 5: LL_RR@SS [sometimes the SS is simply variant information] LL is a two-letter language identifier from ISO 639-1 or, if there is none, a three-letter identifier from ISO 639-2/T RR is a two-letter country coding from ISO 3166-1, except when it is not (en-029 ('English (Carribean)') under Windows) SS under windows is mostly either 'Latn' or 'Cyrl'. @SS on linux is sometimes useful and sometimes meaningless
List for reference: aa ab ace ach ada ady ae af afa afh af_ZA ain ak akk ale alg alt am am_ET an ang anp apa ar arc arn arp art arw as ast ast_ES ath aus av awa ay az az_IR ba bad bai bal ban bas bat be bej bem ber bg bh bho bi bik bin bla bm bn bn_IN bnt bo br bra bs btk bua bug byn C ca cad ca_ES ca_ES@valencian cai car cau ce ceb cel ch chb chg chk chm chn cho chp chr chy cmc co cop cpe cpf cpp cr crh crp cs csb cs_CZ cu cus cv cy da dak dar day de de_AT de_CH de_DE del den dgr din doi dra dsb dua dum dv dyu dz ee efi egy eka el el_GR elx en en_AU en@boldquot en_CA en_GB enm en@quot en_US eo es es_AR es_CL es_CO es_CR es_DO es_EC es_ES es_GT es_HN es_MX es_NI es_PA es_PE es_PR es_SV es_UY es_VE et et_EE eu eu_ES ewo fa fa_IR fan fat ff fi fil fiu fj fo fon fr fr_BE fr_CA fr_CH fr_FR frm fro frr frs fur fy ga gaa gay gba gd gem gez gil gl gmh gn goh gon gor got gr grb grc gsw gu gv gwi ha hai haw he he_IL hi hil him hit hmn ho hr hr_HR hsb ht hu hu_HU hup hy hz ia iba id ie ig ii ijo ik ilo inc ine inh io ira iro is it it_CH it_IT iu ja ja_JP jbo jpr jrb jv ka kaa kab kac kam kar kaw kbd kg kha khi kho ki kj kk kl km kmb kn ko kok ko_KR kos kpe kr krc krl kro kru ks ku kum kut kv kw ky la lad lah lam lb lez lg li ln lo lol loz lt lu lua lui lun luo lus lv mad mag mai mak man map mas mdf mdr men mg mga mh mi mic min mis mk mkh ml mn mnc mni mno mo moh mos mr ms mt mul mun mus mwl mwr my my_MM myn myv na nah nai nap nb nb_NO nd nds nds@NFE ne new ng nia nic niu nl nl_BE nl_NL nn no nog non nqo nr nso nub nv nwc ny nym nyn nyo nzi oc oj om or os osa ota oto pa paa pag pal pam pap pau peo phi phn pi pl pl_PL pon pra pro ps pt pt_BR pt_PT qu raj rap rar rm rn ro roa rom ru rup ru_RU rw sa sad sah sai sal sam sas sat sc scn sco sd se sel sem sg sga sgn shn si sid sio sit sk sl sla sl_SI sm sma smi smj smn sms sn snk so sog son sq sq_AL sr sr@ije sr@Latn srn srr ss ssa st su suk sus sux sv sv_SE sw syr ta tai te tem ter tet tg th ti tig tiv tk tkl tl tlh tli tmh tn to tog tpi tr ts tsi tt tum tup tut tvl tw ty tyv udm ug uga uk uk_UA umb und ur uz uz@Latn vai ve vi vo vot wa wak wal war was wen wo xal xh yao yap yi yo ypk za zap zen zh zh_CN zh_HK zh_TW znd zu zun