Kategorie: Uncategorized

  • 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!

  • Batch Konvertierung von ODT Fies ins DOCX Files

    Mit Pandoc lässt sich ganz einfach ein ganzer Ordner mit ODT (LibreOffice) Files in DOCX Files konvertieren, damit man sie für Leute, die nur MS Word haben, weiter geben kann und sie nicht selber konvertieren müssen.

    Wenn noch nicht, muss zuerst Pandoc installiert werden.

    Bash
    sudo apt install pandoc

    Danach kann man im Ordner, in dem die Files sich befinden, folgendes Kommando aus frühen.

    Bash
    for file in *; do pandoc -r odt -w docx -o "$file".docx "$file" ; done