Internationalisierung (i18n) einer Tkinter-GUI mit Python und pygettextTest Artikel

Die Globalisierung von Anwendungen ist ein Muss in einer vernetzten Welt. In diesem Tutorial lernst du, wie du ein einfaches Tkinter-Programm mit Hilfe von pygettext internationalisieren kannst. Wir unterstützen die Sprachen Englisch, Deutsch, Französisch und Italienisch, und du wirst lernen, wie man .pot, .po und .mo Dateien korrekt nutzt.

Voraussetzungen

Bevor wir loslegen, stelle sicher, dass du folgende Tools und Kenntnisse hast:

  • Python 3 installiert
  • Zugriff auf pygettext und msgfmt.py (beide befinden sich meist in der Standardinstallation von Python)
  • Grundkenntnisse in Python und Tkinter

1. Beispielprogramm – Vor der Internationalisierung

Hier ein einfaches Tkinter-Programm ohne i18n-Funktionalität. Speichere es als app.py:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.title("Simple i18n App")

def on_submit():
    print(entry.get())

# Menü
menubar = tk.Menu(root)
language_menu = tk.Menu(menubar, tearoff=0)
languages = ['English', 'Deutsch', 'Français', 'Italiano']
for lang in languages:
    language_menu.add_command(label=lang)
menubar.add_cascade(label="Language", menu=language_menu)
root.config(menu=menubar)

# Widgets
label = ttk.Label(root, text="Enter your name:")
label.pack(pady=10)

entry = ttk.Entry(root)
entry.pack(pady=5)

button = ttk.Button(root, text="Submit", command=on_submit)
button.pack(pady=10)

root.mainloop()

Das Programm hat ein Menü zur Sprachauswahl, ein Textfeld zur Eingabe und einen Button – perfekt für unser Beispiel.

2. Code vorbereiten für Internationalisierung

Um dein Programm übersetzbar zu machen, verwenden wir das Modul gettext.

2.1 Import von gettext

Füge am Anfang deines Skripts den Import hinzu:

import gettext
import os

2.2 Funktion zur Sprachumschaltung

Diese Funktion lädt die richtige Sprachdatei und stellt sie bereit:

current_language = 'en'

def set_language(lang_code):
    global _
    try:
        lang = gettext.translation('app', localedir='locales', languages=[lang_code])
        lang.install()
        _ = lang.gettext
    except FileNotFoundError:
        gettext.install('app')
        _ = gettext.gettext

2.3 Texte mit _() markieren

Nun umschliesst du alle übersetzbaren Texte mit _():

root.title(_("Simple i18n App"))
language_menu.add_command(label=_("English"), command=lambda: change_language('en'))
...
label = ttk.Label(root, text=_("Enter your name:"))
button = ttk.Button(root, text=_("Submit"), command=on_submit)

2.4 Sprache setzen und GUI neu starten

Damit Änderungen sofort sichtbar werden, starten wir das Programm nach dem Sprachwechsel neu:

def change_language(lang_code):
    set_language(lang_code)
    root.destroy()
    os.execl(sys.executable, sys.executable, *sys.argv)

3. Lokalisierungsdateien mit pygettext erzeugen

3.1 .pot Datei erstellen

Diese Datei enthält alle zu übersetzenden Texte:

pygettext -d app -o locales/app.pot app.py

3.2 .po Dateien für jede Sprache erstellen

Erzeuge für jede Sprache eigene Übersetzungsdateien:

mkdir -p locales/de/LC_MESSAGES
mkdir -p locales/fr/LC_MESSAGES
mkdir -p locales/it/LC_MESSAGES

cp locales/app.pot locales/de/LC_MESSAGES/app.po
cp locales/app.pot locales/fr/LC_MESSAGES/app.po
cp locales/app.pot locales/it/LC_MESSAGES/app.po

3.3 .po Dateien übersetzen

Öffne z. B. die Datei locales/de/LC_MESSAGES/app.po in einem Texteditor und füge die Übersetzungen hinzu:

msgid "Enter your name:"
msgstr "Geben Sie Ihren Namen ein:"

msgid "Submit"
msgstr "Absenden"

msgid "Language"
msgstr "Sprache"

msgid "Simple i18n App"
msgstr "Einfache i18n App"

msgid "English"
msgstr "Englisch"
...

4. Kompilieren der .po Dateien zu .mo

Die .po Dateien müssen in .mo Dateien kompiliert werden, damit gettext sie nutzen kann:

python msgfmt.py -o locales/de/LC_MESSAGES/app.mo locales/de/LC_MESSAGES/app.po
python msgfmt.py -o locales/fr/LC_MESSAGES/app.mo locales/fr/LC_MESSAGES/app.po
python msgfmt.py -o locales/it/LC_MESSAGES/app.mo locales/it/LC_MESSAGES/app.po

5. Programm starten

Starte das Programm mit python app.py. Du kannst jetzt über das Menü zwischen den Sprachen wechseln und siehst die Texte übersetzt.


6. Neue Texte hinzufügen & Übersetzungen aktualisieren

Wenn du dein Programm weiterentwickelst und neue Texte hinzufügst:

  1. Markiere neue Texte im Code wieder mit _()
  2. Aktualisiere die .pot Datei:
pygettext -d app -o locales/app.pot app.py
  1. Aktualisiere jede .po Datei:
msgmerge -U locales/de/LC_MESSAGES/app.po locales/app.pot
msgmerge -U locales/fr/LC_MESSAGES/app.po locales/app.pot
msgmerge -U locales/it/LC_MESSAGES/app.po locales/app.pot
  1. Übersetze neue Einträge in den .po Dateien
  2. Kompiliere die .mo Dateien erneut (siehe Schritt 4)

Weiterführende Informationen


Viel Erfolg bei der Lokalisierung deiner Tkinter-Anwendung!