Domanda

Ho un'applicazione scritta in wxPython che voglio rendere multilingue. Le nostre opzioni sono

  1. utilizzo di gettext http://docs.python.org/library/gettext.html
  2. separando tutto il testo dell'interfaccia utente in un file message.py e utilizzarlo per tradurre il testo

Sono molto incline verso il 2 ° e non vedo alcun vantaggio nel procedere in modo diretto, usando il 2o modo posso avere tutti i miei messaggi in un posto non nel codice, quindi se ho bisogno di cambiare un messaggio, il codice non deve essere cambiato, in caso di gettext potrei avere confuse msg-costanti dato che sto solo avvolgendo l'originale msg invece di convertirlo in una costante in message.py

sostanzialmente invece di

wx.MessageBox(_("Hi stackoverflow!"))

Penso

wx.MessageBox(messages.GREET_SO)

è meglio, quindi c'è qualche vantaggio in modo gettext e svantaggio in 2 ° modo? e c'è un terzo modo?

modifica: anche i file delle lingue gettext sembrano essere troppo legati al codice, e cosa succede se voglio due messaggi uguali in inglese ma diversi in francese, ad es. supponiamo che il francese abbia una traduzione più sottile per diversi scnerarios per l'inglese uno va bene

esperienza: Sono già andato in 2a direzione, e devo dire che ogni applicazione dovrebbe cercare di estrarre il testo dell'interfaccia utente dal codice, dà la possibilità di refactoring, vedere dove l'interfaccia utente si insinua nel modello e dove il testo dell'interfaccia utente può essere migliorato, gettext a confronto è meccanico, non fornisce alcun input per il programmatore e penso che sarebbe più difficile da mantenere.

e durante la creazione di un nome per il testo, ad es. PRINT_PROGRESS_MSG, dà la possibilità di vedere che in molti posti, lo stesso messaggio viene utilizzato in modo leggermente diverso e può essere unito in un singolo nome, che in seguito aiuterà quando devo cambiare messaggio solo una volta.

Conclusione: non sono ancora sicuro di alcun vantaggio nell'utilizzare gettext e sto usando il mio file di messaggi. ma ho selezionato la risposta che almeno ha spiegato alcuni punti per cui gettext può essere utile. La soluzione finale IMO è quella che prende il meglio da entrambi i modi, ovvero il mio identificativo del messaggio racchiuso da gettext, ad esempio

wx.MessageBox(_("GREET_SO"))
È stato utile?

Soluzione

Gettext è la strada da percorrere, nel tuo esempio puoi anche usare gettext per " evitare di memorizzare le traduzioni nel codice " ;:

wx.MessageBox(messages.GREET_SO)

potrebbe essere lo stesso con gettext di:

wx.MessageBox(_("GREET_SO")) or wx.MessageBox(_("messages.GREET_SO"))

Gettext è praticamente lo standard per le applicazioni multilingue e sono abbastanza sicuro che trarrai vantaggio dall'utilizzarlo in futuro. Ad esempio, puoi utilizzare Poedit (o altre app simili) per assegnare traduzioni ai tuoi collaboratori o collaboratori e in seguito contrassegnare uno o più messaggi come non tradotti correttamente. Inoltre, se ci sono voci mancanti / extra, poedit ti avviserà. Non illuderti, gettext è l'unico modo affidabile provato per mantenere le traduzioni.

Altri suggerimenti

Ci sono alcuni vantaggi di gettext:

  1. Uno dei maggiori vantaggi è: quando si utilizza poedit per eseguire le traduzioni, è possibile beneficiare del database delle traduzioni. Fondamentalmente esegui la scansione del tuo disco rigido e trova i file già tradotti e fornirà suggerimenti quando traduci il tuo file.
  2. Quando dai il codice ad altre persone da tradurre, potrebbero già conoscere il modo gettext di tradurre, mentre devi spiegare loro il tuo modo di tradurre.
  3. Hai il testo nel contesto del codice, quindi dovrebbe essere più facile da tradurre, quando vedi il codice attorno alla traduzione
  4. Prendi in considerazione testo come: stampa _ ('% d file di% d file selezionati')% (num, numTotal) e situazioni ancora più complicate. Qui aiuta davvero avere il codice in giro ...

Per il web (questo è PHP ma l'idea è la stessa), creo sempre file in più lingue in una directory specifica. en.php, fr.php, eccetera. Tali file contengono definizioni di tutto il testo di output, nella lingua data. La preferenza dell'utente per la lingua determina quale di questi file viene incluso, quindi in quale lingua appare l'output. Ad esempio ...

in en.php:     TEXT_I_AM = " I am "

in fr.php:     TEXT_I_AM = " Je suis "

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top