Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form

In questo articolo vedremo come implementare un sistema di traduzione dell'applicazione tramite resourcestring.

la traduzione di una applicazione
La traduzione di una applicazione può avvenire in vari modi ma, in fondo, tutte le strade conducono ad un bivio fondamentale:


In questo articolo verrà trattata la traduzione dei messaggi a runtime e, allo scopo, verrà usato il meccanismo delle resourcestring di Lazarus/fpc
Si tratta di un argomento che non si esaurisce con una unica soluzione universale ma è possibile scegliere diversi modi di fare la stessa cosa. Per chi ha voglia di approfondire l'argomento, consiglio la lettura della documentazione su wiki: http://wiki.freepascal.org/Translations_/_i18n_/_localizations_for_programs.

Nel nostro caso utilizzaremo la seguente tecnica:


Per testare il funzionamento, metteremo i messaggi originali in lingua inglese e predisporremo la traduzione in italiano.
Mettiamoci al lavoro.

impostazioni preliminari
Lazarus ha integrato nelle opzioni del progetto una utilissima voce che permette il salvataggio automatico delle resourcestring quando si salva una form.
Per attivarlo:


Fatto questo dobbiamo creare una sezione resourcestring.
Consiglio di crearla immediatamente sopra la keyword implementation.
Questo passaggio è fondamentale per salvare le stringhe in questa stessa unit.


creiamo una resourcestring
Basta andare a posizionarsi su una qualsiasi costante stringa nei sorgenti.
Dopo averla selezionata per intero:

Ripetete la cosa su tutte le stringhe che intendete tradurre, poi salvate il tutto e compilate.

[la traduzione]
Nella sottocartella destinata ai file .po, il file sarà ora aggiornato. Nel mio caso il file si chiama TestBaseForm.po e, dopo un po' di prove, ha l'aspetto che segue:

Codice: [Seleziona]

msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"

#: tfmbaseform.acuser_cancel.caption
msgid "acUser_Cancel"
msgstr ""

#: tfmbaseform.acuser_confirm.caption
msgid "acUser_Confirm"
msgstr ""

#: tfmbaseform.acuser_delete.caption
msgid "acUser_Delete"
msgstr ""

#: tfmbaseform.acuser_edit.caption
msgid "acUser_Edit"
msgstr ""

#: tfmbaseform.acuser_first.caption
msgid "acUser_First"
msgstr ""

#: tfmbaseform.acuser_help.caption
msgid "acUser_Help"
msgstr ""

#: tfmbaseform.acuser_insert.caption
msgid "acUser_Insert"
msgstr ""

#: tfmbaseform.acuser_last.caption
msgid "acUser_Last"
msgstr ""

#: tfmbaseform.acuser_next.caption
msgid "acUser_Next"
msgstr ""

#: tfmbaseform.acuser_prior.caption
msgid "acUser_Prior"
msgstr ""

#: tfmbaseform.acuser_refresh.caption
msgid "acUser_Refresh"
msgstr ""

#: tfmbaseform.acuser_report.caption
msgid "acUser_Report"
msgstr ""

#: tfmbaseform.caption
msgid "fmBaseForm"
msgstr ""

#: ubaseform.rsformdestroye
msgid "Form Destroy / End"
msgstr ""

#: ubaseform.rsformdestroyinit
msgid "Form Destroy / Init"
msgstr ""

#: ubaseform.rsstatusbar_browse
msgid "Browse"
msgstr ""


Volendo preparare una traduzione per la lingua italiana si può procedere come segue:


Preparato il file della traduzione, andiamo a modificare l'evento OnCreate in modo che proceda automaticamente alla traduzione a runtime, il codice che ci interessa è il seguente:

Codice: [Seleziona]


implementation

uses gettext, translations;


procedure TfmBaseForm.FormCreate(Sender: TObject);
var
   Lang, FallbackLang: String;
begin
   ...

  GetLanguageIDs(Lang, FallbackLang);
  Translations.TranslateUnitResourceStrings(
               'uBaseForm',
               '/media/dati/dev/llab/BaseForm/po/TestBaseForm.%s.po',
               Lang,
               FallbackLang);
   ...
end;


Il processo di traduzione è reso semplicissimo da Lazarus:




SMF 2.0.8 | SMF © 2011, Simple Machines
Privacy Policy
SMFAds for Free Forums
TinyPortal © 2005-2012

Go back to article