Topic: Gestione multilingua con gettext e StringVar  (Letto 93 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline slystone

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Gestione multilingua con gettext e StringVar
« il: Marzo 06, 2020, 12:04 »

Ciao a tutti, ho dei bottoni con la bandiera della nazione che uso come selettori lingua. Vorrei poter premere il bottone e trovare tutta la applicazione tradotta. Ci riesco usando gettext nel modo che vi mostro qui sotto. Vi chiedo: c'è un modo più pulito per farlo? Qui dovrò aggiungere nella funzione set_language(lang) tutte le StringVar presenti nella mia interfaccia. C'è modo di fare lo stesso senza esplicitarle? grazie a tutti



def set_language(lang="it"):
    current_lang = gettext.translation("translation", localedir="locale", languages=[lang])
    current_lang.install()
    my_string_var1.set(msg1)
    my_string_var2.set(msg2)
    my_string_var3.set(msg3)
    ...



msg1 = _("lorem")
msg2 = _(".ipsum")
msg3 = _("etc")
...

my_string_var1 = tk.StringVar()
my_string_var2 = tk.StringVar()
my_string_var3 = tk.StringVar()

my_string_var1.set(msg1)
my_string_var2.set(msg2)
my_string_var3.set(msg3)
...

Button(left, image=ita_img, borderwidth=0, command=lambda : set_language("it")).grid(row=0, column=1, padx=10, pady=5)
Button(left, image=eng_img, borderwidth=0, command=lambda : set_language("en")).grid(row=1, column=1, padx=10, pady=5)
Button(left, image=fra_img, borderwidth=0, command=lambda : set_language("fr")).grid(row=2, column=1, padx=10, pady=5)

msg1_label = Label(right, textvariable=my_string_var1).grid(row=0, column=1)
msg2_label = Label(right, textvariable=my_string_var2).grid(row=1, column=1)
msg3_label = Label(right, textvariable=my_string_var3).grid(row=2, column=1)
...




Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.969
  • Punti reputazione: 9
    • Mostra profilo
Re:Gestione multilingua con gettext e StringVar
« Risposta #1 il: Marzo 06, 2020, 14:56 »
Questo è molto distante dal modo in cui si dovrebbe fare. D'altra parte, io non so proprio se Tkinter abbia un supporto i18n, e non mi stupirei se non ce l'avesse e/o fosse molto scarso. Onestamente, voler fare i18n è una di quelle soglie oltre le quali sarebbe consigliabile adottare un gui framework serio.

Detto questo, consiglio di leggere la mia raccolta di articoli sul problema: l'indice è qui https://pythoninwindows.blogspot.com/p/blog-page.html Sono scritti con lo scenario di windows in mente, ma quasi tutto è valido anche in generale.
Dopo che hai imparato le cose che sono scritte lì (occhio: ti ci vorranno due/tre settimane di sperimentazione molto approfondita per aver chiaro il quadro), proverei a vedere come si comporta Tkinter all'interno di questo quadro. In teoria dovrebbe essere possibile integrare gettext in Tkinter, per esempio vedi questo https://stackoverflow.com/a/21045178 ma in pratica mi sa che di esempi in giro ne trovi ben pochi, se non nessuno.
Io non uso Tkinter (e non lo consiglio) ma forse googlando un po' hai fortuna...
Ma se vedi che alla fine è troppo cervellotico ficcare gettext dentro Tkinter, butta via Tkinter che è meglio.

Offline slystone

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:Gestione multilingua con gettext e StringVar
« Risposta #2 il: Marzo 06, 2020, 15:51 »
Io non uso Tkinter (e non lo consiglio) ma forse googlando un po' hai fortuna...

Pensa che mi sono iscritto al forum proprio perché googlando non ho trovato risposta...

Tkinter non ha il support all'i18n, questo è pacifico. ma con gettext sono riuscito a farlo convivere, cerco consiglio da programmatori più esperti di me per proseguire in questa direzione, non per cambiare strada, ma grazie lo stesso.

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.969
  • Punti reputazione: 9
    • Mostra profilo
Re:Gestione multilingua con gettext e StringVar
« Risposta #3 il: Marzo 06, 2020, 17:56 »
te l'ho spiegato... non so se hai letto... quello non è il modo di usare gettext. Comincia a leggere i link che ti ho dato (lo so... occorre tempo e concentrazione), e per prima cosa impara bene l'architettura di gettext. Poi se vuoi provare a integrare un uso corretto di gettext dentro tkinter, puoi provare fin dove è ragionevole... A occhio non dovrebbe essere impossibile, anche a giudicare dal link che ti ho dato (non so se hai avuto tempo di leggerlo).

comunque non è affatto "pacifico" che tkinter non abbia un supporto i18n integrato.... è anzi molto strano che non sia supportato in un gui framework moderno nel 2020... ma tu lo sapevi già? e perché non lo hai detto subito? Mi avresti risparmiato cinque minuti di controllo...
Dopo di che, guarda... se per qualche motivo hai necessità di continuare a usare tkinter nonostante tutto... capisco... ma di solito si usa un framework perché risolve problemi al posto tuo. Se un gui framework non ha supporto per una parte fondamentale delle gui... boh... cambiare gui framework non è mica uno scandalo. Però poi ciascuno fa come vuole.

Offline slystone

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:Gestione multilingua con gettext e StringVar
« Risposta #4 il: Marzo 06, 2020, 22:54 »
te l'ho spiegato... non so se hai letto... quello non è il modo di usare gettext. Comincia a leggere i link che ti ho dato (lo so... occorre tempo e concentrazione), e per prima cosa impara bene l'architettura di gettext. Poi se vuoi provare a integrare un uso corretto di gettext dentro tkinter, puoi provare fin dove è ragionevole... A occhio non dovrebbe essere impossibile, anche a giudicare dal link che ti ho dato (non so se hai avuto tempo di leggerlo).

comunque non è affatto "pacifico" che tkinter non abbia un supporto i18n integrato.... è anzi molto strano che non sia supportato in un gui framework moderno nel 2020... ma tu lo sapevi già? e perché non lo hai detto subito? Mi avresti risparmiato cinque minuti di controllo...
Dopo di che, guarda... se per qualche motivo hai necessità di continuare a usare tkinter nonostante tutto... capisco... ma di solito si usa un framework perché risolve problemi al posto tuo. Se un gui framework non ha supporto per una parte fondamentale delle gui... boh... cambiare gui framework non è mica uno scandalo. Però poi ciascuno fa come vuole.

Allora mi sa che ci siamo capiti male: a me gettext funziona. File pot, po, mo, e struttura cartelle: sono tutti al loro posto. Il cambio lingua coi bottoni in Tkinter funziona. Avevo chiesto se c'è modo di fare lo stesso senza chiamare la .set() per ciascun oggetto StringVar.

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.969
  • Punti reputazione: 9
    • Mostra profilo
Re:Gestione multilingua con gettext e StringVar
« Risposta #5 il: Marzo 07, 2020, 21:32 »
...e io ti ho detto: leggi i link che ti ho mandato. Anche se ci metti del tempo. Non è questione di "applicare una ricetta", è questione di "capire una architettura".

A questo, aggiungo... quello che stai cercando di fare (cambiare lingua a runtime) non è consueto, e raramente ha senso. Il problema è che devi ridisegnare tutta la gui... nessuno fa questo, in una gui desktop. E' invece frequente, ovviamente, nelle web gui, dove semplicemente tu fai una request e il browser ti ricarica comunque la pagina... è quello che farebbe comunque. Ma una gui desktop non è fatta in linea di principio per questo scenario. Nelle cose che ti ho linkato spiego anche questo, ma un po' di sfuggita. Se ben ricordo ne parlo più diffusamente nel capitolo dedicato nel mio libro, ma quello è per wxPython.