2009-10-08 7 views
5

Usiamo gettext per le traduzioni nel nostro prodotto, ma hanno avuto un sacco di problemi con esso:ricambi per gettext

  • Non è possibile usare un linguaggio meno che il sistema supporta.

Su Solaris 9 Sparc, se si ripristina l'ambiente su varie impostazioni locali inglesi, il messaggio non verrà ancora tradotto, se la macchina non ha le impostazioni internazionali corrispondenti. Il file di traduzione è presente, ma non possiamo accedervi.

  • Utilizza ambiente per lavorare fuori la lingua

Questo causa problemi a server che vogliono tradurre i messaggi in diverse lingue. In teoria, questa potrebbe essere un'operazione completamente parallela e sicura per i thread, ma gettext significa che dobbiamo avere un blocco globale della traduzione.

  • non possibile impostare la lingua predefinita

Con questo non voglio dire il testo nel codice. Usiamo MsgID nel codice, quindi quello che voglio è essere in grado di specificare una traduzione fall-back per andare a, se l'ambiente corrente definisce la lingua non è disponibile. Ma gettext non lo consente - devo provare, quindi resettare l'ambiente prima che possa ordinare una traduzione diversa. (Usando msgid non era la mia scelta - ho voluto seguire gli standard gettext e utilizzare l'inglese come gli ID, ma ero stata accettata, e sarebbe un sacco di lavoro per cambiare ora)

  • Codifica l'ARE restituiti variano tra UTF-8 e la codifica locale corrente.

Non intendo i file .po: sono tutti in UTF-8 (fastidioso che msgfmt non gestisca BOM ma qualunque). Intendo l'output di gettext ngettext ecc, che sono in UTF-8 (indipendentemente dalla codifica locale/terminale) su AIX e HPUX, ma codifica locale su Solaris/Linux/FreeBSD, anche se ciò potrebbe essere dovuto a problemi iconv?

In ogni caso sarebbe bello non dover avere un codice speciale per piattaforme diverse - dovrò indagare se posso ottenere bind_textdomain_codeset(domain,codepage); per aiutare contro questo problema.


Qualcuno sa di un open-source librerie di traduzione che forniscono un'interfaccia più utile?

risposta

5

Stiamo usando ICU resource bundles e siamo abbastanza soddisfatti. L'interfaccia ICU non è "moderna", ma è potente, i principi di base sono validi e il packaging delle risorse (con lo strumento genrb) è piuttosto flessibile. Le sue capacità message formatting sono anche buone.

Chi tuoi commenti specifici:

Non è possibile usare un linguaggio meno che il sistema supporta.

Non capisco questo. Ciò potrebbe essere dovuto al fatto che l'unica "esperienza" che ho con gettext è di aver letto la sua documentazione.

Utilizza ambiente per lavorare fuori la lingua

L'interfaccia ICU prende una Locale come input, in modo da avere il controllo completo. Ha anche un concetto di "locale predefinito" se è più conveniente per te.

Impossibile impostare una lingua predefinita

ICU ha un elaborato fallback mechanism, coinvolgendo un "default" fascio

Codifica il vengono restituiti variare tra UTF-8 e la codifica locale corrente .

String ResourceBundle s (altri tipi di dati sono inoltre possibili) sono sempre rappresentati come UnicodeString, che è codificato internamente UTF-16. UTF-32 con UnicodeString è piuttosto semplice, poiché la sua interfaccia espone diversi metodi che consentono di manipolarlo a livello di codice. Per altre codifiche, è possibile code conversion.

+0

non avevo vedere cose traduzione ICU prima - ho pensato che fosse una semplice conversione codifiche ... Decisamente interessante, dal momento che credo che l'ICU possa diventare una nostra dipendenza ad un certo punto. –

+0

sulla dipendenza di sistema di gettext - e.g. Non è possibile tradurre un messaggio in giapponese a meno che non siano supportate le impostazioni internazionali di sistema ja_JP.UTF-8, anche se si utilizza un sistema UTF-8 e potrebbe essere in grado di visualizzare il giapponese. –

+0

O anche un server che vuole essere in grado di generare giapponese, ad es.per un messaggio di posta elettronica, è necessario che le impostazioni internazionali siano disponibili solo per ottenere un messaggio di traduzione. –

1

È anche possibile convertire i pacchetti di risorse ICU da e verso il formato XLIFF basato su XML per la traduzione.

+0

Ora, se l'ICU fosse in grado di leggere i file .mo, sarebbe ancora meglio ... –

+2

Un modo sarebbe utilizzare: .mo a .po: http://weblogtoolscollection.com/archives/2007/03/06/wp-translations-mo-and-po-files/ .po a xliff: http://translate.sourceforge.net/wiki/toolkit/xliff2po Forse non quello che si desidera. Potresti presentare un bug in ICU. I file mo –

2

1. Impossibile utilizzare una lingua a meno che il sistema non la supporti.

Errore. È possibile specificare manualmente la lingua. Utilizzando ambiente LINGUA variabile

int main() 
{ 
     setlocale(LC_ALL,""); 
     setenv("LANGUAGE","foo"); 
} 

Questo funziona, anche se il locale non esiste (avete mai visto foo lingua?)

2. Utilizza ambiente per lavorare fuori la lingua

Qual è il problema con questo? Ciò fornisce all'utente un maggiore controllo.

3. Non può impostare una lingua predefinita

sbagliato, vedi sopra.

4. La codifica restituita varia tra UTF-8 e la codifica locale corrente.

corretta, vedere bind_textdomain_codeset(domain,codepage);

mio forte raccomandazione - Resta withing gettext. È uno degli strumenti più supportati e migliori in circolazione. I traduttori saranno grati di usare uno strumento normale e utile.

C'è un altro punto importante: un grande supporto per le forme plurali che ha un pessimo supporto in strumenti non basati su gettext.


C'è solo una limitazione di gettext - non è possibile utilizzare più di una lingua per processo. Non è thread-safe per cambiare lingua. Fortunatamente la maggior parte dei programmi che si incrinano con gli esseri umani parlano in una sola lingua.

Questa potrebbe essere una limitazione solo per servizi multi-threading.

EDIT: Ma anche questo non è un vero problema. Avevo implementato la versione gettext thread safe una volta per il mio progetto. Vedi http://art-blog.no-ip.info/cppcms/blog/post/16, basato sul lettore di file mo.

+0

non sono il problema - le librerie per accedervi sono. Quindi guarderò con interesse alla tua libreria - sembra proprio quello che sto cercando. –

0

La lingua che attiva il browser Google Chrome è molto ben fatta. È possibile passare da una lingua all'altra mentre il programma è in esecuzione. Non so quale sistema usano, ma potrebbe valere la pena di investigare, dato che si tratta di un browser open source.

0

Impossibile utilizzare una lingua se il sistema non lo supporta.

Questo non ha nulla a che fare con GNU gettext, perché gestisce solo la parte di traduzione. Ma è vero, che se il sistema non è in grado di mostrare alcun personaggio cinese, allora avrai problemi con la Cina.

Utilizza ambiente per lavorare fuori la lingua

Questa è una buona scelta, ma si può sempre impostare la lingua da soli, ignorando l'ambiente. In questo modo, puoi utilizzare qualsiasi lingua, in base alla tua scelta.

Non è possibile impostare una lingua predefinita

Questo è errato - lingua di default è sempre il built-in lingua, e se si vuole avere un altro linguaggio, basta passare ad esso. Semplicemente non può essere più semplice di una riga di codice.

La codifica restituita varia tra UTF-8 e la codifica locale corrente.

Se si è in grado di scegliere uno strumento di internazionalizzazione, allora si è anche nella posizione di scegliere, quale codifica di carattere si desidera utilizzare per i propri testi. Alcuni progetti usano utf-8 per tutte le lingue (la mia preferenza), alcuni usano la codifica locale.

Qualcuno sa di una libreria di traduzione open source che fornisce un'interfaccia più utile?

No, mi dispiace - non riesco a vedere alcun problema con GNU gettext :-)

+0

Forse dovresti chiedere come risolvere i tuoi problemi invece di saltare lo strumento ... potresti essere sorpreso di quanto sia bello. –

+0

Quando si dice che il default è la lingua integrata - intendi il testo che è stato inserito nel codice? Usiamo MsgID nel codice, quindi quello che voglio è essere in grado di specificare una traduzione ** di fallback ** per andare a, se l'ambiente corrente definisce la lingua non è disponibile. Ma gettext non lo consente - devo provare, quindi resettare l'ambiente prima che possa ordinare una traduzione diversa. –

+0

L'utilizzo dell'ambiente per elaborare la lingua va bene per i programmi da riga di comando, ma non riesce per i server. E fallisce se il testo integrato non è in una lingua predefinita. –