Se sei un programmatore e sei in cerca di un modo facile per tradurre i tuoi progetti in altre lingue, questo è il post che fa per te.
Incominciamo col dire che se usi sia windows che linux, il primo problema sono i caratteri accentati, personalmente ho provato a non mettere i caratteri veri e propri, ma i relativi codici unicode ed è stato un completo fallimento.
L'unica spiegazione che ho trovato è che i programmi non vengono compilati coi compilatori unicode, ma ascii, e quindi sorgono problemi.
Occorre, quindi, un modo per dire al compilatore "ehi guarda che questa roba è unicode, lasciala così e non la tradurre in ascii" e personalmente ci sono riuscito.
Il metodo consiste nel non usare le stringe standard del c++, ma siccome mi poggio sulla libreria wxwidgets, di usare le wxString per mostrare a video i testi dei programmi.
Esistono due macro di traduzione da std::string a wxString e sono _() e wxT().
La prima indica che il testo può essere tradotto in altre lingue, la seconda invece indica che il testo è unicode, ma deve restare così anche in caso di traduzione.
Una volta terminato il programma e fatto una cernita di quale stringe unicode possono essere tradotte e quali no, ho usato il programma poedit per estrarre le stringhe, non gettext, ma una versione grafica dello stesso.

Una volta ottenuto il catalogo delle stringhe, è possibile procedere alla traduzione, salvarlo e compilarlo.
Adesso la domanda sorge spontanea: cosa ci devo fare col file mo ottenuto?
Per prima cosa dobbiamo istruire l'ambiente wxWidgets di non usare il locale predefinito di sistema, ma di usare quello impostato, poi bisogna dire a wxwidgets dove trovare il catalogo per la traduzione.
Ecco un codice funzionante
wxConfig *config=new wxConfig(GetAppName()); //lettura delle opzioniif (!config->Read("locale", &loc))loc=wxLANGUAGE_ITALIAN;wxLocale *m_locale;m_locale=new wxLocale( loc, wxLOCALE_DONT_LOAD_DEFAULT );m_locale->AddCatalog("fileutils"); wxLocale::AddCatalogLookupPathPrefix(pathTraduzioni);if (!m_locale->AddCatalog("wxBriscola"))wxMessageBox(_("Impossibile trovare il catalogo del programma. Il programma si avviera' in italiano."), _("Attenzione"), wxICON_EXCLAMATION); m_locale->AddCatalog("wxstd");m_locale->AddCatalog("wxmsw");
In pratica leggiamo il locale salvato con config e se non è possibile leggerlo lo settiamo in italiano.
Poi andiamo a dire a wxWidgets di non caricare i cataloghi predefiniti, ma di usare quelli che diciamo noi.
In seguito diciamo di usare il catalogo di nome "fileutils" che esiste solo sui sistemi linux, poi gli diciamo che i catalogi si trovano all'indirizzo pathtraduzioni, ed in seguito diciamo "se non trovi il catalogo wxBriscola.mo" dai il messaggio d'errore, poi carica il catalogo wxstd e wxmsw sempre dalla stessa path.
wxstd è il nome che wxwidgets si aspetta per i cataloghi non predefiniti, in pratica il catalogo dovrebbe chiamaris wxstd.mo.
wxmsw è una mia aggiunta ed ora ve la spiego.
Ecco il programma tradotto senza il catalogo wxmsw.


Apparentemente funziona tutto e gli accenti sono al loro posto.
Tuttavia andando a cercare un po' più nel profondo si nota che alcune parti non sono tradotte, e queste parti sono proprio quelle specifiche del toolkit wxwidgets. License, Developers e Translators sono in inglese, non in spagnolo.

Per ovviare al problema bisogna prendere il catalogo di wxwidgets relativo alla sua lingua da c:\wxwidgets\locale, io l'ho chiamato wxmsw per l'appunto e messo nella path di ricerca.
Il risultato è il seguente:

Ora anche la schermata delle opzioni risulta correttamente tradotta.
Però non è finita qui, perché le parti del sistema operativo restano non tradotte, quindi per avere una traduzione completa è necessario anche cambiare la lingua al sistema operativo.
Su linux, invece, la ricerca di fileutils risolve tutti i problemi, e tutto il programma risulterà correttamente localizzato, sempre se si installa la localizzazione di wxwidgets.
In seconda analisi, ecco dove la wxBriscola così programmata va a cercare i cataloghi:

La path del mio eseguibile è "D:\Giulio\Visual Studio\wxBriscola\x64\Release\x64" e il locale è spagnolo.
Come si può vedere wxWidgets di default cerca i cataloghi in alcune cartelle, tra cui quella subito precedente (D:\Giulio\Visual Studio\wxBriscola\x64\Release), comunque cerca fileutils.mo wxstd.mo, wxBriscola.mo e wxmsw.mo, che sono le 4 chiamate a addcatalog.
Se non si setta wxLOCALE_DONT_LOAD_DEFAULT ma si usa wxLOCALE_USE_DEFAULT, il sistema cercherà solo wxstd e solo in alcune path predefinite tra cui, per l'appunto, il genitore della directory di esecuzione.
I cataloghi mo così ottenuti sono unversali, vanno bene sia su windows che su linux, sia con mingw che con gcc che con visual studio; se avete problemi dovete cercare dove il programma va a cercare il catalogo.
Spero di aver fatto cosa gradita nello scrivere questo vade mecum di sperimentazione, ed attendete con trepidante attesa la nuova versione di wxBriscola, che è pronta, con la localizzazione spagnola.