Plugin übersetzen

Aus DreamboxWIKI
Wechseln zu: Navigation, Suche


Grundsätzliches

Die Übersetzung bei enigma2-Plugins erfolgt per gettext.

Alle zu übersetzenden Strings im Python-Code werden einfach mit _("string") umschlossen:

self.setup_title = _("Settings")
self["key_blue"] = StaticText(_("Delete"))
list.append(getConfigListEntry(_("Menu title"), config.plugins.CurlyTx.menuTitle))

Übersetzungsdateien

Vorlage

Aus dem Python-Code kann man automatisch eine .pot-Datei ("po template") erstellen lassen:

$ cd po
$ xgettext -kT_ -L Python ../src/*.py
$ mv messages.po po/messages.pot

Übersetzung anlegen

Einfach die messages.pot auf $sprachcode.po (z.B. de.po) kopieren und mit einem Texteditor bearbeiten:

#: ../src/CurlyTx.py:38 ../src/CurlyTxSettings.py:30
msgid "Settings"
msgstr "Einstellungen"

#: ../src/CurlyTx.py:39
msgid "Reload"
msgstr "Neu laden"

Existierende Übersetzung updaten

Wenn man eine existierende Übersetzung mit neuen Strings updaten möchte, generiert man zuerst wieder eine aktuelle Vorlagendatei und führt dann folgendes aus:

$ cd po
$ msgmerge --update --backup=off de.po messages.pot

Damit werden alle neuen Strings aus messages.pot in de.po eingefügt; alle existierenden Strings bleiben erhalten.

Übersetzung kompilieren

Gettext kann mit .po-Dateien noch nichts anfangen; diese müssen erst in binäre .mo-Dateien umgewandelt werden:

$ msgfmt --statistics de.po -o de.mo

Dies erstellt aus der de.po eine kompilierte de.mo-Datei.


Übersetzungsdateien in Python benutzen

Die Übersetzungsdateien werden leider nicht automatisch geladen, sondern müssen manuell registriert werden.

Übersetzungen laden

In der normalerweise unbenutzten __init__.py fügt ihr am besten folgenden Code ein:

# -*- coding: utf-8 -*-
from Components.Language import language
from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_LANGUAGE
from os import environ as os_environ
import gettext

def localeInit():
    lang = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country"
    os_environ["LANGUAGE"] = lang # Enigma doesn't set this (or LC_ALL, LC_MESSAGES, LANG). gettext needs it!
    gettext.bindtextdomain("CurlyTx", resolveFilename(SCOPE_PLUGINS, "Extensions/CurlyTx/locale"))

def _(txt):
    t = gettext.dgettext("CurlyTx", txt)
    if t == txt:
        #print "[CurlyTx] fallback to default translation for", txt
        t = gettext.gettext(txt)
    return t

localeInit()
language.addCallback(localeInit)

CurlyTx ersetzt ihr am besten mit dem Namen eurer Extension.

Übersetzungen benutzen

Die Methode "_", die ihr im Plugin für die Strings benutzt habt, ist aktuell noch die Standard-Gettext-Methode. Da in der __init__.py jetzt aber eine eigene, für das Plugin spezifische Methode definiert wurde, importieren wir diese in jeder unserer Python-Dateien:

from . import _

Damit wird unsere eigene "_"-Funktion zur Übersetzung benutzt.


Ordnerstruktur

Auf der Dreambox werden die Übersetzungsdateien in folgender Weise abgelegt:

/usr/lib/enigma2/python/Plugins/Extensions/CurlyTx/locale/de/LC_MESSAGES/CurlyTx.mo
/usr/lib/enigma2/python/Plugins/Extensions/CurlyTx/locale/fr/LC_MESSAGES/CurlyTx.mo

Diese Struktur ist genau die, die in der __init__py mit der Zeile

resolveFilename(SCOPE_PLUGINS, "Extensions/CurlyTx/locale"))

konfiguriert wird.