Příprava
Pusťme se tedy do toho. Začlenění překladu budu demonstrovat na souborech gui.glade s uživatelským rozhraním a main.py, který načte a zobrazí toto rozhraní a v případě neúspěchu vypíše chybovou hlášku:- #!/usr/bin/python
- # -*- coding: utf-8 -*-
- import gtk
- import sys
- class LocalizationExample:
- def __init__(self):
- # use GtkBuilder to build our interface from the XML file
- try:
- builder = gtk.Builder()
- builder.add_from_file('gui.glade')
- except:
- self.error_message("Can't load the glade file with user interface: gui.glade")
- sys.exit(1)
- # get the widgets which will be referenced in callbacks
- self.window = builder.get_object("window")
- # connect signals
- builder.connect_signals(self)
- def main (self):
- # Run main window of the app
- self.window.show()
- gtk.main()
- def on_window_delete (self, *args):
- gtk.main_quit()
- if __name__ == "__main__":
- le = LocalizationExample()
- le.main()
Úprava main.py
Pro začlenění podpory pro lokalizaci je potřeba mírně pozměnit původní soubor main.py. Na začátek souboru přidáme:- import gettext
- import locale
- APP = "locex"
- DIR = 'locale'
- locale.setlocale(locale.LC_ALL, '')
- gettext.bindtextdomain(APP, DIR)
- locale.bindtextdomain(APP, DIR)
- gettext.textdomain(APP)
- locale.textdomain(APP)
- _ = gettext.gettext
Všimněte si konstanty APP = "locex". Nastavuje jakýsi jmenný prostor překladu. Není důležité jakou hodnotu zadáte, každopádně zapamatujte si ji, protože ji za chvíli budeme potřebovat.
Dále také musíme každý řetězec, který chceme přeložit, pozměnit z "řetězec" na _("řetězec"). Náš finální soubor bude tedy po úpravě vypadat takto:
- #!/usr/bin/python
- # -*- coding: utf-8 -*-
- import gtk
- import sys
- import gettext
- import locale
- APP = "locex"
- DIR = 'locale'
- locale.setlocale(locale.LC_ALL, '')
- gettext.bindtextdomain(APP, DIR)
- locale.bindtextdomain(APP, DIR)
- gettext.textdomain(APP)
- locale.textdomain(APP)
- _ = gettext.gettext
- class LocalizationExample:
- def __init__(self):
- # use GtkBuilder to build our interface from the XML file
- try:
- builder = gtk.Builder()
- builder.add_from_file('gui.glade')
- except:
- self.error_message(_("Can't load the glade file with user interface: gui.glade"))
- sys.exit(1)
- # get the widgets which will be referenced in callbacks
- self.window = builder.get_object("window")
- # connect signals
- builder.connect_signals(self)
- def main (self):
- # Run main window of the app
- self.window.show()
- gtk.main()
- def on_window_delete (self, *args):
- gtk.main_quit()
- if __name__ == "__main__":
- le = LocalizationExample()
- le.main()
Nyní můžeme soubor uložit a zavřít.
Příprava .pot šablony
Vzhledem k tomu, že gettext neumí pracovat přímo s .glade soubory, použijeme intltool-extract k vygenerování pomocného .glade.h souboru. Otevřeme si Terminál ve složce s programem a zadáme:intltool-extract --type=gettext/glade gui.glade
Nyní si vytvoříme složku na .po soubory s překlady a necháme do něj vygenerovat .pot šablonu ze souborů main.py a gui.glade.h:
mkdir po
xgettext --language=Python --keyword=_ --keyword=N_ --output=po/template.pot main.py gui.glade.h
xgettext --language=Python --keyword=_ --keyword=N_ --output=po/template.pot main.py gui.glade.h
Volitelně můžeme přidat také parametry --package-name=NÁZEV a --package-version=VERZE, které se zapíšou do výsledného .pot souboru:
xgettext --language=Python --keyword=_ --keyword=N_ --package-name=LocalizationTest --package-version=0.1 --output=po/template.pot main.py gui.glade.h
Vytvoření souboru pro překlad
Překladový soubor pro konkrétní jazyk vytvoříme zadáním příkazu msginit --input=template.pot --locale=/kód jazyku/ ve složce se šablonou. Pokud chceme vytvořit soubor pro češtinu, bude to:cd po
msginit --input=template.pot --locale=cs_CZ
msginit --input=template.pot --locale=cs_CZ
Ve složce po se nám vytvoří soubor cs.po, který můžeme otevřít buďto v obyčejném textovém editoru, nebo třeba v Gtranslatoru. Přeložíme tedy všechny řetězce, soubor uložíme a pokračujeme k poslednímu kroku, kterým bude vytvoření .mo souboru.
Binární .mo soubory
.mo soubory jsou v podstatě binární verze .po souborů využívané gettext modulem k lokalizaci. Nejdříve ale musíme pro tyto soubory vytvořit patřičné složky. Přejdeme v terminálu do umístění se souborem main.py a spol. a zadáme:mkdir -p locale/cs_CZ/LC_MESSAGES
Nakonec vytvoříme .mo soubory příkazem:
msgfmt --output-file=locale/cs_CZ/LC_MESSAGES/locex.mo po/cs.po
Všimněte si, že je .mo soubor pojmenovaný podle konstanty, kterou jsme nastavovali v souboru main.py. Nyní můžeme program vyzkoušet. Měl by být v češtině. Pokud ne, zkuste ho spusit s nastavením proměnné LANG:
LANG=cs_CZ.utf8 ./main.py
Můžete také program spustit v původní anglické verzi:
LANG=en_GB.utf8 ./main.py
Aktualizace překladu
Pokud v budoucnu upravíte zdrojový kód aplikace a přidáte nové řetězce, je potřeba aktualizovat soubory s překlady, abychom nepřišli o již přeložené řetězce.Pokud máte v aplikaci zatím jenom jeden jazyk, asi bude nejjednodušším řešením ve složce s aplikací vždy spustit tento skript:
- #!/bin/bash
- intltool-extract --type=gettext/glade gui.glade
- xgettext --language=Python --keyword=_ --keyword=N_ --output=po/template.pot main.py gui.glade.h
- cd po
- msgmerge -U cs.po template.pot
- cd ..
- mkdir -p locale/cs_CZ/LC_MESSAGES/
- msgfmt po/cs.po -o locale/cs_CZ/LC_MESSAGES/locex.mo
U jiných aplikací by bylo samozřejmě nutné skript upravit na odpovídající názvy souborů.
Finální struktura
(main_without_loc.py není potřeba...)
Odkazy
- Translating your Python/PyGTK application - anglický článek ze kterého jsem nejvíce čerpal
- Oficiální stránky Gettext
- Stránky Pythonu





0 komentářů:
Přidat komentář