Crossing the border with Qt: the i18n system

603 views
514 views

Published on

Crossing the border with Qt: the i18n system

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
603
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Crossing the border with Qt: the i18n system

  1. 1. Crossing the borders: the i18n systemLorenzo Mancini (lmancini@develer.com)
  2. 2. What is i18n about? Embracing a specific national environment:  Language  Line break behaviour  Writing direction  Conventions ...without hampering development
  3. 3. (True) Horror StoryWere in 2002, and a big Italian company wants to localize their CAD program in Spanish. If only it wasnt for...
  4. 4. (True) Horror Story Strings were initially hardcoded in Italian, English was retrofitted at some point... ...with lots of if/else statements First try: add another else branch for each string in code (...) Second try: tool to produce multiple codebases – one for each language (...) AFAIK still unfinished two years later
  5. 5. All we need is a good workflow Developers produce i18n-ready code  With no codebase pollution Translators translate strings  Iteratively (code and strings can change!)  No technical knowledge needed The framework does the rest
  6. 6. Developers step 1 QObject::tr()  Parse-time: marks strings  Run-time: translates strings Not everything is a QObject...  QCoreApplication::translate()  QT_TR_NOOP 6
  7. 7. Developers step 2 Use QString for all user visible text QString are Unicode strings → transparent processing of strings (reg exp, split etc) Programmer space strings can still be QByteArrays or char * 7
  8. 8. Developers step 3 Use QString::arg() for dynamic text QString::arg() allows easy argument reordering void FileCopier::showProgress(int done, int total, const QString &currentFile) { label.setText(tr("%1 of %2 files copied.nCopying: %3") .arg(done) .arg(total) .arg(currentFile)); } 8
  9. 9. Some glue Add a TRANSLATIONS entry to .pro Run lupdate to extract a .ts file Send .ts file to translators Run lrelease to produce translated binary files Set up a QTranslator QCoreApplication::installTranslator() 9
  10. 10. Translators (only) step Open .ts file with Linguist Fill the missing translations There is no step 3 Developer: “...hey thats not fair!” 10
  11. 11. Some case studies Nearing the 2.0 release:  Parse again with lupdate  Fill only the missing translations Wanting to add a language  Add that language to TRANSLATIONS  Run lupdate, translate the new .ts file, lrelease  This time its a fairy tale! Update language on the fly  installTranslator sends a changeEvent 11
  12. 12. Workflow demo 12
  13. 13. Gotchas ::tr assumes latin-1 What about Designer files? 13
  14. 14. THANKS ! Develer S.r.l. Via Mugellese 1/A 50013 Campi Bisenzio Firenze - ItalyContactsMail: info@develer.comPhone: +39-055-3984627Fax: +39 178 6003614http://www.develer.com

×