Internaționalizarea aplicațiilor

O privire de ansamblu asupra procesului de traducere a unei aplicații Qt

Qt oferă un suport excelent pentru traducerea aplicațiilor în alte limbi. Majoritatatea textului care trebuie tradus într-o aplicație sunt fie cuvinte singulare sau fraze scurte. Acestea apar de obicei în titlul ferestrei, elemente de meniu, tooltip-uri şi etichete. Frazele care se introduc în codul sursă de către programator în limba nativă folosesc o sintaxă simplă prin care se identifică cuvintele sau frazele ce trebuie traduse. Instrumentele puse la dispoziţie de Qt furnizează informații de context pentru fiecare frază atunci când este necesar, iar programatorul este capabil să introducă informații contextuale frazelor atunci când este necesar.

Managerul de release generează un set de fișiere de traducere care sunt produse din fișiere sursă și le transmit mai departe translatorului.

Translatorul deschide aceste fișiere folosind Qt Linguist de unde se pot introduce traducerile și le salvează, urmând ca mai apoi să fie transmise înapoi managerului de release. După această etapă managerul de release generează o versiune compactă a fișierelor de traducere, fișiere care pot fi folosite de aplicație. Instrumentele sunt construite astfel încât să poată fi folosite în cicluri repetate pe măsură ce aplicația se schimbă și evoluează, prezervând traducerile existente și făcând mai ușoară identificarea a unor noi cuvinte sau fraze ce trebuie traduse. Qt Linguist asigură de asemenea un dicționar cu fraze care ne asigură ca traducerile au o oarece omogenitate a traducerilor în cadrul aplicațiilor și proiectelor.

Traducătorii și programatorii trebuie să ia în considerare o serie de probleme care derivă din complexitatea limbajului uman precum :

  • Pentru o singură frază s-ar putea să fie nevoie să fie tradusă în mai multe limbi în funcție de context.
  • Scurtăturile de tastatură s-ar putea să fie nevoie să fie schimbate fără a introduce conflicte.
  • Frazele pot conține diverse variabile, iar la traducere s-ar putea să fie nevoie ca ordinea în care apar să fie schimbată.

Managerul de release

Două instrumente sunt oferite pentru managerul de release : lupdate și lrelease. Aceste instrumente pot procesa fișiere proiect și pot opera direct pe fișierele sistem. Cea mai ușoară metodă de a folosi lupdate și lrelease este prin specificarea unui fișier de proiect Qt care are extensia .pro . De asemenea trebuie specificat în secțiunea de TRANSLATIONS a fișierului proiect un fișier cu traduceri pentru fiecare limbă, precum în exemplul următor:

  1. TRANSLATIONS = myapplication_ro.ts \
  2.                 myapplication_de.ts

lupdate este un utilitar în linie de comandă care găsește cuvintele ce necesită a fi traduse din codul sursă specificat și din fișierele de interfața obținute cu ajutorul a Qt Designer și produce fișiere de traducere cu extensia .ts. Fișierele ce trebuie procesate sau fișierele ce trebuie actualizate pot fi specificate prin linie de comandă sau precizate într-un fișiere proiect cu extensia .pro . Fișierele de traducere sunt mai apoi date traducătorului care folosește Qt Linguist pentru a citi fișierele și pentru a insera traducerile.Un mod de apelare a acestui utilitar îl aveți mai jos:
  1. lupdate myapplication.pro
Companiile care au angajați traducători pot considera necesar rularea lupdate-ului în mod regulat, uneori poate fi și lunar, pe măsură ce aplicația se dezvoltă. Acest lucru va duce la un volum de muncă de traducere bine distribuit pe parcursul dezvoltării unui proiect și va permite traducătorilor să lucreze la mai multe proiecte simultan. lrelease este un utilitar în linie de comandă care produce fișiere .qm din fișierele .ts. Formatul .qm este un format binar care este folosit de aplicație. Oferă căutări foarte rapide pentru traduceri. Fișierele .ts pot fi specificate în linie de comandă sau specificate direct într-un fișier proiect .pro. Un mod de apelare a acestui utilitar îl aveți mai jos:

  1.  lrelease myapplication.pro

Acest utilitar este rulat ori de câte ori o nouă versiune de aplicație este creată. Dacă fișierele .qm nu sunt create, aplicația va rula perfect folosindu-se de textele prezente în codul sursă. Odată ce fișierele .qm sunt disponibile aplicația le va detecta și le va folosi.
Atât lupdate, cât și lrelease pot fi folosite cu fișiere de traducere .ts incomplete. Traducerile lipsă vor fi înlocuite cu expresiile prezente în codul sursă.

Reguli de scriere a codului pentru internaționalizare

Suportul pentru mai multe limbi este foarte ușor de implementat în aplicațiile Qt. Qt minimizează costul de performanță necesar pentru a traduce, traducând fraze și cuvinte doar odată ce ferestrele sunt create. În cele mai multe aplicații fereastra principală este creată doar o data. Dialogurile sunt create doar o dată, iar mai apoi afișate sau ascunse la cerere. Odată ce se efectuează traducerea inițială, nu se vor mai consuma resurse suplimnetare pentru traducerea aplicației. Crearea unor aplicații care își schimbă limba la runtime este posibil cu Qt, dar va necesita mai multe intervenții din partea programatorului și evident va presupune și o creștere a costurilor de performanță.

Pentru a încărca traducerele pe care le-am obținut cu managerul de release trebuie mai întâi să declarăm un obiect de QTranslator [doc.qt.nokia.com]. Această clasă oferă funcțiile necesare pentru a căuta traducerile. În mod normal folosim un translator pentru a încărca o traducere iar mai apoi să o instalăm unei aplicații. Este important ca translatorul să fie creat înaintea widgeturilor aplicației. Un exemplu de folosire a clasei QTranslator îl aveți mai jos:

  1.  QTranslator myappTranslator;
  2.  myappTranslator.load("myapplication_ro.qm");
  3.  app.installTranslator(&myappTranslator;);

Pentru ca interfața să poată fi tradusă în întregime e nevoie ca toate cuvintele și frazele care sunt vizibile utilizatorului să fie încadrate de funcția tr() [doc.qt.nokia.com] precum în exemplul următor:

  1. generalGroupBox = new QGroupBox("General", this);

va deveni:

  1. generalGroupBox = new QGroupBox(tr("General"), this);

Toate subclasele QObject care folosesc macroul Q_OBJECT imlementează funcția tr() [doc.qt.nokia.com]. Deși apelul funcției tr() [doc.qt.nokia.com] este în mod normal făcut direct, de vreme ce această este o funcție membră a clasei QObject, în alte cazuri este nevoie de specificarea explicită a numelui clasei, ca de exemplu:

  1. generalGroupBox = new QGroupBox(QGroupBox::tr("General"), this);

sau

  1. generalGroupBox = new QGroupBox(QObject::tr("General"), this);

Dacă însă e nevoie să traducem un text care nu se află în cadrul unei funcții putem folosi 2 macrouri: QT_TR_NOOP() [doc.qt.nokia.com] și QT_TRANSLATE_NOOP() [doc.qt.nokia.com]. Aceste macrouri doar marchează textul pentru a fi extras de lupdate.