Difference between revisions of "Internationalization"
Line 1: | Line 1: | ||
[[Category:Developer Documentation]] | [[Category:Developer Documentation]] | ||
− | This article is about how to realize and use localized C:B. | + | This article is about how to realize and use localized C:B. Original article written by heromyth. Reviewed by gd_on. |
== Get the English POT file == | == Get the English POT file == | ||
Line 7: | Line 7: | ||
The url of the english POT file is at: | The url of the english POT file is at: | ||
− | for the '''original site''' (but obsolete) : https://translations.launchpad.net/codeblocks/trunk/+pots/codeblocks | + | for the '''original site''' (''but obsolete'') : https://translations.launchpad.net/codeblocks/trunk/+pots/codeblocks |
or | or | ||
Line 21: | Line 21: | ||
or : /index.php/topic,1022.msg159075.html#msg159075 | or : /index.php/topic,1022.msg159075.html#msg159075 | ||
− | Of course, you can run | + | Of course, you can run extract.cmd to generate the POT file. |
− | + | This tool use several unix-like tools as find, rm, grep, xargs, xgettext, msgcat. Some of them are available with many MinGW distributions or Msys2. | |
− | + | '''Note''' : you '''must''' use the unix-like find.exe, ''not'' the Windows one : they have not the same syntax. So, the unix-like find.exe must be found in your PATH, before the Windows one! | |
− | rem ======= Begin of | + | The tool wxrc.exe's url is http://www.dlang.net/dl/wxrc.exe (not sure it's sill available there). Or you can find the source in wxWidgets/utils and build it. |
+ | |||
+ | The content of '''extract.cmd''' is below: | ||
+ | |||
+ | rem ======= Begin of extract.cmd ======= | ||
@echo off | @echo off | ||
− | + | echo **************************** | |
− | + | echo * creating core .pot files * | |
− | + | echo **************************** | |
− | + | echo * | |
− | + | find ../sdk ../src | grep -F .cpp | grep -v svn-base | grep -v .svn | grep -v .cpp.org | xargs xgettext --keyword=_ -o codeblocks.pot 2> log.txt | |
− | + | find ../sdk ../src ../include | grep -F .h | grep -v svn-base | grep -v .svn | grep -v .h.org | grep -v html | xargs xgettext --keyword=_ -o codeblocks2.pot 2>> log.txt | |
− | + | find ../scripts | grep -F .script | grep -v svn-base | grep -v .svn | xargs xgettext --keyword=_ -o codeblocks3.pot 2>> log.txt | |
− | + | find codeblocks.pot > files.txt | |
− | + | find codeblocks2.pot >> files.txt | |
− | + | find codeblocks3.pot >> files.txt | |
− | + | ||
− | + | find ../plugins | grep -v contrib | grep -F .cpp | grep -v .svn | grep -v svn-base | xargs xgettext --keyword=_ -o coreplugins.pot 2>> log.txt | |
− | + | find ../plugins | grep -v contrib | grep -F .h | grep -v .svn | grep -v svn-base | grep -v html | xargs xgettext --keyword=_ -o coreplugins2.pot 2>> log.txt | |
− | + | find coreplugins.pot >> files.txt | |
− | + | find coreplugins2.pot >> files.txt | |
− | + | ||
− | + | echo * | |
− | + | echo ******************************* | |
− | + | echo * creating contrib .pot files * | |
− | + | echo ******************************* | |
− | + | echo * | |
− | xgettext - | + | |
− | + | find ../plugins/contrib | grep -F .cpp | grep -v .svn | grep -v svn-base > file_c.txt | |
− | + | find ../plugins/contrib | grep -F .h | grep -v .svn | grep -v svn-base | grep -v html | grep -v .gch >> file_c.txt | |
− | + | xgettext -f file_c.txt --keyword=_ -o Contribplugins.pot 2>> log.txt | |
− | + | find Contribplugins.pot >> files.txt | |
− | + | ||
− | xgettext - | + | echo * |
− | + | echo *************************************** | |
− | + | echo * creating .cpp files from .xrc files * | |
− | + | echo *************************************** | |
− | + | echo * | |
− | + | find ../src/resources | grep -F .xrc | grep -v .svn | grep -v svn-base | xargs wxrc -g -o src_xrc.cpp 2>> log.txt | |
− | + | find ../sdk/resources | grep -F .xrc | grep -v .svn | grep -v svn-base | xargs wxrc -g -o sdk_xrc.cpp 2>> log.txt | |
− | xgettext - | + | find ../plugins | grep -F .xrc | grep -v .svn | grep -v svn-base | xargs wxrc -g -o plugins_xrc2.cpp 2>> log.txt |
− | + | grep -v msp430x plugins_xrc2.cpp | grep -v msp430x | grep -v cc430x | grep -v jtag1 | grep -v jtag2 | grep -v jtagm | grep -v atxmega | grep -v atmega | grep -v attiny | grep -v at86 | grep -v at90 | grep -v AT90 > plugins_xrc.cpp | |
− | + | ||
− | + | del plugins_xrc2.cpp | |
− | + | ||
− | + | echo * | |
− | rem ======= End of | + | echo ************************************************* |
+ | echo * creating .pot files from those local new .cpp * | ||
+ | echo ************************************************* | ||
+ | echo * | ||
+ | find . | grep -F .cpp | xargs xgettext --keyword=_ -o xrc.pot 2>> log.txt | ||
+ | sed "s/\$\$*/\$/g" xrc.pot > xrc.pox | ||
+ | sed 's/\\\\\\\\/\\\\/g' xrc.pox > xrc.pot | ||
+ | find xrc.pot >> files.txt | ||
+ | |||
+ | echo * | ||
+ | echo ************************************************ | ||
+ | echo * extracting strings from .xml compilers files * | ||
+ | echo ************************************************ | ||
+ | echo * | ||
+ | find ../plugins/compilergcc/resources/compilers | grep -F .xml | xargs grep -F "CodeBlocks_compiler name" > src_xml.cpp 2>> log.txt | ||
+ | find ../plugins/compilergcc/resources/compilers | grep -F .xml | xargs grep -F "Option name" >> src_xml.cpp 2>> log.txt | ||
+ | find ../plugins/compilergcc/resources/compilers | grep -F .xml | xargs grep -F "Category name" >> src_xml.cpp 2>> log.txt | ||
+ | find ../plugins/compilergcc/resources/compilers | grep -F .xml | xargs grep -F "checkMessage" >> src_xml.cpp 2>> log.txt | ||
+ | grep -v mabi src_xml.cpp | grep -v mno | grep -v apcs | grep -v mtpcs | grep -v mshed | grep -v msoft | grep -v mhard | grep -v mfpe | grep -v msched | grep -v mlong | grep -v mpic | grep -v mcirrus | grep -v mcalle | grep -v mpoke | grep -v mwords | grep -v "MSP430 1" | grep -v "MSP430 2" | grep -v "MSP430 3" | grep -v "MSP430 4" | grep -v "MSP430 5" | grep -v "MSP430 6" | grep -v "MSP430 E" | grep -v "MSP430 W" | grep -v "MSP430 MS" | grep -v "MSP430 G4" | grep -v "CC430 5" | grep -v "CC430 6" | grep -v ATmega | grep -v AT90 | grep -v ATtiny > src_xml2.cpp | ||
+ | xgettext -a -o xml.pox src_xml2.cpp | ||
+ | sed "s/"/\\\\""/g" xml.pox > xml.pot | ||
+ | find xml.pot >> files.txt | ||
+ | |||
+ | echo * | ||
+ | echo ********************** | ||
+ | echo * Merging .pot files * | ||
+ | echo ********************** | ||
+ | echo * | ||
+ | msgcat -s -f files.txt -o All_codeblocks.pox 2>> log.txt | ||
+ | rm -f *.pot *.cpp files.txt file_c.txt | ||
+ | sed "s/#, c-format//g" All_codeblocks.pox > All_codeblocks.pot | ||
+ | |||
+ | rm -f *.pox | ||
+ | |||
+ | echo * | ||
+ | echo ************** | ||
+ | echo The END !!! * | ||
+ | echo ************** | ||
+ | echo on | ||
+ | rem ======= End of extract.cmd ======= | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
== The tools for translation == | == The tools for translation == | ||
Line 143: | Line 131: | ||
If Code::Blocks is compiled with Unicode, the charset should be set to utf-8; If Code::Blocks is compiled with ANSI, the charset should be set to your own language charset like gb2312, koi8-r etc. | If Code::Blocks is compiled with Unicode, the charset should be set to utf-8; If Code::Blocks is compiled with ANSI, the charset should be set to your own language charset like gb2312, koi8-r etc. | ||
− | After these settings are done, you can start translating. Don't be fooled, it's a | + | After these settings are done, you can start translating. Don't be fooled, it's a long work! During the process, of course, you can use your translation at any time. |
== Create and use the .mo file == | == Create and use the .mo file == | ||
− | Pressing Ctrl+S in poEdit, you can get a *.mo file like codeblocks.mo which is what we need. To use codeblocks.mo, we just place it into C:\Program Files\CodeBlocks\share\CodeBlocks\locale\<lang>\ | + | Pressing Ctrl+S in poEdit, you can get a *.mo file like codeblocks.mo which is what we need. To use codeblocks.mo, we just place it into C:\Program Files\CodeBlocks\share\CodeBlocks\locale\<lang>\. My language is French and I have installed C::B into C:\, so I place codeblocks.mo into C:\Program Files\CodeBlocks\share\CodeBlocks\locale\fr_FR. |
− | If you want to use codeblocks.mo under Linux or Unix, you just place it into /usr/X11R6/share/locale/<lang>/LC_MESSAGES/ | + | If you want to use codeblocks.mo under Linux or Unix, you just place it into /usr/X11R6/share/locale/<lang>/LC_MESSAGES/ or in the locale\<lang< sub-directory of codeblocks, as in Windows. |
Details about internationalization using wxWidgets can be found in the wxWidgets docs. | Details about internationalization using wxWidgets can be found in the wxWidgets docs. | ||
Line 155: | Line 143: | ||
== Let Code::Blocks support your language == | == Let Code::Blocks support your language == | ||
− | + | In Code::Blocks menu, Settings, Environment, View, you'll find a check-box for Internationalization. If you check it, you'll normally find your language in the dropdown list. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |
Revision as of 15:44, 23 December 2019
This article is about how to realize and use localized C:B. Original article written by heromyth. Reviewed by gd_on.
Get the English POT file
The url of the english POT file is at:
for the original site (but obsolete) : https://translations.launchpad.net/codeblocks/trunk/+pots/codeblocks
or
for a new site : https://translations.launchpad.net/codeblocks-gd
Old sites too : http://www.dlang.net/dl/codeblocks.pot
http://www.dlang.net/dl/plugins.pot
More information can be seen at: /index.php/topic,10204.msg70638.html. or : /index.php/topic,1022.msg159075.html#msg159075
Of course, you can run extract.cmd to generate the POT file. This tool use several unix-like tools as find, rm, grep, xargs, xgettext, msgcat. Some of them are available with many MinGW distributions or Msys2.
Note : you must use the unix-like find.exe, not the Windows one : they have not the same syntax. So, the unix-like find.exe must be found in your PATH, before the Windows one!
The tool wxrc.exe's url is http://www.dlang.net/dl/wxrc.exe (not sure it's sill available there). Or you can find the source in wxWidgets/utils and build it.
The content of extract.cmd is below:
rem ======= Begin of extract.cmd ======= @echo off echo **************************** echo * creating core .pot files * echo **************************** echo * find ../sdk ../src | grep -F .cpp | grep -v svn-base | grep -v .svn | grep -v .cpp.org | xargs xgettext --keyword=_ -o codeblocks.pot 2> log.txt find ../sdk ../src ../include | grep -F .h | grep -v svn-base | grep -v .svn | grep -v .h.org | grep -v html | xargs xgettext --keyword=_ -o codeblocks2.pot 2>> log.txt find ../scripts | grep -F .script | grep -v svn-base | grep -v .svn | xargs xgettext --keyword=_ -o codeblocks3.pot 2>> log.txt find codeblocks.pot > files.txt find codeblocks2.pot >> files.txt find codeblocks3.pot >> files.txt find ../plugins | grep -v contrib | grep -F .cpp | grep -v .svn | grep -v svn-base | xargs xgettext --keyword=_ -o coreplugins.pot 2>> log.txt find ../plugins | grep -v contrib | grep -F .h | grep -v .svn | grep -v svn-base | grep -v html | xargs xgettext --keyword=_ -o coreplugins2.pot 2>> log.txt find coreplugins.pot >> files.txt find coreplugins2.pot >> files.txt echo * echo ******************************* echo * creating contrib .pot files * echo ******************************* echo * find ../plugins/contrib | grep -F .cpp | grep -v .svn | grep -v svn-base > file_c.txt find ../plugins/contrib | grep -F .h | grep -v .svn | grep -v svn-base | grep -v html | grep -v .gch >> file_c.txt xgettext -f file_c.txt --keyword=_ -o Contribplugins.pot 2>> log.txt find Contribplugins.pot >> files.txt echo * echo *************************************** echo * creating .cpp files from .xrc files * echo *************************************** echo * find ../src/resources | grep -F .xrc | grep -v .svn | grep -v svn-base | xargs wxrc -g -o src_xrc.cpp 2>> log.txt find ../sdk/resources | grep -F .xrc | grep -v .svn | grep -v svn-base | xargs wxrc -g -o sdk_xrc.cpp 2>> log.txt find ../plugins | grep -F .xrc | grep -v .svn | grep -v svn-base | xargs wxrc -g -o plugins_xrc2.cpp 2>> log.txt grep -v msp430x plugins_xrc2.cpp | grep -v msp430x | grep -v cc430x | grep -v jtag1 | grep -v jtag2 | grep -v jtagm | grep -v atxmega | grep -v atmega | grep -v attiny | grep -v at86 | grep -v at90 | grep -v AT90 > plugins_xrc.cpp del plugins_xrc2.cpp echo * echo ************************************************* echo * creating .pot files from those local new .cpp * echo ************************************************* echo * find . | grep -F .cpp | xargs xgettext --keyword=_ -o xrc.pot 2>> log.txt sed "s/\$\$*/\$/g" xrc.pot > xrc.pox sed 's/\\\\\\\\/\\\\/g' xrc.pox > xrc.pot find xrc.pot >> files.txt echo * echo ************************************************ echo * extracting strings from .xml compilers files * echo ************************************************ echo * find ../plugins/compilergcc/resources/compilers | grep -F .xml | xargs grep -F "CodeBlocks_compiler name" > src_xml.cpp 2>> log.txt find ../plugins/compilergcc/resources/compilers | grep -F .xml | xargs grep -F "Option name" >> src_xml.cpp 2>> log.txt find ../plugins/compilergcc/resources/compilers | grep -F .xml | xargs grep -F "Category name" >> src_xml.cpp 2>> log.txt find ../plugins/compilergcc/resources/compilers | grep -F .xml | xargs grep -F "checkMessage" >> src_xml.cpp 2>> log.txt grep -v mabi src_xml.cpp | grep -v mno | grep -v apcs | grep -v mtpcs | grep -v mshed | grep -v msoft | grep -v mhard | grep -v mfpe | grep -v msched | grep -v mlong | grep -v mpic | grep -v mcirrus | grep -v mcalle | grep -v mpoke | grep -v mwords | grep -v "MSP430 1" | grep -v "MSP430 2" | grep -v "MSP430 3" | grep -v "MSP430 4" | grep -v "MSP430 5" | grep -v "MSP430 6" | grep -v "MSP430 E" | grep -v "MSP430 W" | grep -v "MSP430 MS" | grep -v "MSP430 G4" | grep -v "CC430 5" | grep -v "CC430 6" | grep -v ATmega | grep -v AT90 | grep -v ATtiny > src_xml2.cpp xgettext -a -o xml.pox src_xml2.cpp sed "s/"/\\\\""/g" xml.pox > xml.pot find xml.pot >> files.txt echo * echo ********************** echo * Merging .pot files * echo ********************** echo * msgcat -s -f files.txt -o All_codeblocks.pox 2>> log.txt rm -f *.pot *.cpp files.txt file_c.txt sed "s/#, c-format//g" All_codeblocks.pox > All_codeblocks.pot rm -f *.pox echo * echo ************** echo The END !!! * echo ************** echo on rem ======= End of extract.cmd =======
The tools for translation
Usually, we use the poEdit tool which can be downloaded here. Of course, you can do the translation at https://translations.launchpad.net.
Translating with poEdit
Rename codeblocks.pot into codeblocks.po. Use poEdit to open the file codeblocks.po. Change a few settings like:
[File]->[Preferences]->[Personalize]
[Catalog]->[Settings]->[Project info]->[Team/email/Language/Charset]
If Code::Blocks is compiled with Unicode, the charset should be set to utf-8; If Code::Blocks is compiled with ANSI, the charset should be set to your own language charset like gb2312, koi8-r etc.
After these settings are done, you can start translating. Don't be fooled, it's a long work! During the process, of course, you can use your translation at any time.
Create and use the .mo file
Pressing Ctrl+S in poEdit, you can get a *.mo file like codeblocks.mo which is what we need. To use codeblocks.mo, we just place it into C:\Program Files\CodeBlocks\share\CodeBlocks\locale\<lang>\. My language is French and I have installed C::B into C:\, so I place codeblocks.mo into C:\Program Files\CodeBlocks\share\CodeBlocks\locale\fr_FR.
If you want to use codeblocks.mo under Linux or Unix, you just place it into /usr/X11R6/share/locale/<lang>/LC_MESSAGES/ or in the locale\<lang< sub-directory of codeblocks, as in Windows.
Details about internationalization using wxWidgets can be found in the wxWidgets docs.
Let Code::Blocks support your language
In Code::Blocks menu, Settings, Environment, View, you'll find a check-box for Internationalization. If you check it, you'll normally find your language in the dropdown list.