Übersetzung von PyGObject-Anwendungen in verschiedene Sprachen – Teil 5
Wir setzen die PyGObject-Programmierreihe mit Ihnen fort und lernen hier in diesem 5. Teil, wie wir unsere PyGObject-Anwendungen in verschiedene Sprachen übersetzen können. Die Übersetzung Ihrer Anwendungen ist wichtig, wenn Sie sie für die Welt veröffentlichen wollen, da sie für Endbenutzer benutzerfreundlicher ist, da nicht jeder Englisch versteht.
Wie der Übersetzungsprozess funktioniert
Wir können die Schritte zum Übersetzen eines beliebigen Programms unter dem Linux-Desktop mit diesen Schritten zusammenfassen:
- Extrahieren Sie die übersetzbaren Zeichenfolgen aus der Python-Datei.
- Speichern Sie die Zeichenfolgen in einer .pot-Datei, deren Format es Ihnen ermöglicht, sie später in andere Sprachen zu übersetzen.
- Beginnen Sie mit der Übersetzung der Zeichenfolgen.
- Exportieren Sie die neuen übersetzten Zeichenfolgen in eine .po-Datei, die automatisch verwendet wird, wenn die Systemsprache geändert wird.
- Fügen Sie der Python-Hauptdatei und der .desktop-Datei einige kleine programmgesteuerte Änderungen hinzu.
Und das ist es! Nachdem Sie diese Schritte ausgeführt haben, ist Ihre Anwendung für Endbenutzer aus der ganzen Welt einsatzbereit (wird.. Sie müssen Ihr Programm jedoch in alle Sprachen rund um den Globus übersetzen !), Klingt einfach, nicht wahr? :-)
Um etwas Zeit zu sparen, laden Sie zunächst die Projektdateien über den untenstehenden Link herunter und extrahieren Sie die Datei in Ihr Home-Verzeichnis.
- https://copy.com/TjyZAaNgeQ6BB7yn
Öffnen Sie die Datei "setup.py" und beachten Sie die Änderungen, die wir vorgenommen haben:
# Here we imported the 'setup' module which allows us to install Python scripts to the local system beside performing some other tasks, you can find the documentation here: https://docs.python.org/2/distutils/apiref.html
from distutils.core import setup
Those modules will help us in creating the translation files for the program automatically.
from subprocess import call
from glob import glob
from os.path import splitext, split
DON'T FOTGET TO REPLACE 'myprogram' WITH THE NAME OF YOUR PROGRAM IN EVERY FILE IN THIS PROJECT.
data_files = [ ("lib/myprogram", ["ui.glade"]), # This is going to install the "ui.glade" file under the /usr/lib/myprogram path.
("share/applications", ["myprogram.desktop"]) ]
This code does everything needed for creating the translation files, first it will look for all the .po files inside the po folder, then it will define the default path for where to install the translation files (.mo) on the local system, then it's going to create the directory on the local system for the translation files of our program and finally it's going to convert all the .po files into .mo files using the "msgfmt" command.
po_files = glob("po/*.po")
for po_file in po_files:
lang = splitext(split(po_file)[1])[0]
mo_path = "locale/{}/LC_MESSAGES/myprogram.mo".format(lang)
Make locale directories
call("mkdir -p locale/{}/LC_MESSAGES/".format(lang), shell=True)
Generate mo files
call("msgfmt {} -o {}".format(po_file, mo_path), shell=True)
locales = map(lambda i: ('share/'+i, [i+'/myprogram.mo', ]), glob('locale/*/LC_MESSAGES'))
Here, the installer will automatically add the .mo files to the data files to install them later.
data_files.extend(locales)
setup(name = "myprogram", # Name of the program.
version = "1.0", # Version of the program.
description = "An easy-to-use web interface to create & share pastes easily", # You don't need any help here.
author = "TecMint", # Nor here.
author_email = "[email ",# Nor here :D
url = "http://example.com", # If you have a website for you program.. put it here.
license='GPLv3', # The license of the program.
scripts=['myprogram'], # This is the name of the main Python script file, in our case it's "myprogram", it's the file that we added under the "myprogram" folder.
Here you can choose where do you want to install your files on the local system, the "myprogram" file will be automatically installed in its correct place later, so you have only to choose where do you want to install the optional files that you shape with the Python script
data_files=data_files) # And this is going to install the .desktop file under the /usr/share/applications folder, all the folder are automatically installed under the /usr folder in your root partition, you don't need to add "/usr/ to the path.
Öffnen Sie auch die Datei "myprogram" und sehen Sie sich die programmatischen Änderungen an, die wir vorgenommen haben, alle Änderungen werden in den Kommentaren erklärt:
#!/usr/bin/python
-*- coding: utf-8 -*-
## Replace your name and email.
My Name <[email >
## Here you must add the license of the file, replace "MyProgram" with your program name.
License:
MyProgram is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
#
MyProgram is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
#
You should have received a copy of the GNU General Public License
along with MyProgram. If not, see <http://www.gnu.org/licenses/>.
from gi.repository import Gtk
import os, gettext, locale
## This is the programmatic change that you need to add to the Python file, just replace "myprogram" with the name of your program. The "locale" and "gettext" modules will take care about the rest of the operation.
locale.setlocale(locale.LC_ALL, '')
gettext.bindtextdomain('myprogram', '/usr/share/locale')
gettext.textdomain('myprogram')
_ = gettext.gettext
gettext.install("myprogram", "/usr/share/locale")
class Handler:
def openterminal(self, button):
## When the user clicks on the first button, the terminal will be opened.
os.system("x-terminal-emulator ")
def closeprogram(self, button):
Gtk.main_quit()
Nothing new here.. We just imported the 'ui.glade' file.
builder = Gtk.Builder()
builder.add_from_file("/usr/lib/myprogram/ui.glade")
builder.connect_signals(Handler())
label = builder.get_object("label1")
Here's another small change, instead of setting the text to ("Welcome to my Test program!") we must add a "_" char before it in order to allow the responsible scripts about the translation process to recognize that it's a translatable string.
label.set_text(_("Welcome to my Test program !"))
button = builder.get_object("button2")
And here's the same thing.. You must do this for all the texts in your program, elsewhere, they won't be translated.
button.set_label(_("Click on me to open the Terminal"))
window = builder.get_object("window1")
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()
Jetzt.. Beginnen wir mit der Übersetzung unseres Programms. Erstellen Sie zunächst die .pot-Datei (eine Datei, die alle übersetzbaren Zeichenfolgen des Programms enthält), damit Sie mit dem folgenden Befehl mit der Übersetzung beginnen können
:
$ cd myprogram
xgettext --language=Python --keyword=_ -o po/myprogram.pot myprogram
Dadurch wird die Datei "myprogram.pot" im Ordner "po" im Hauptprojektordner erstellt, die den folgenden Code enthält:
# SOME DESCRIPTIVE TITLE.
Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
This file is distributed under the same license as the PACKAGE package.
FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-12-29 21:28+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <[email >\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: myprogram:48
msgid "Welcome to my Test program !"
msgstr ""
#: myprogram:52
msgid "Click on me to open the Terminal"
msgstr ""
Nun, um mit der Übersetzung der Streicher zu beginnen.. Erstellen Sie eine separate Datei für jede Sprache, in die Sie Ihr Programm übersetzen möchten, indem Sie die Sprachcodes "ISO-639-1" im Ordner "po" verwenden, z.B. wenn Sie Ihr Programm ins Arabische übersetzen möchten, erstellen Sie eine Datei mit dem Namen "ar.po" und kopieren Sie den Inhalt aus der Datei "myprogram.pot" in diese Datei.
Wenn Sie Ihr Programm ins Deutsche übersetzen möchten, erstellen Sie eine "de.po " Datei und kopieren Sie den Inhalt aus der Datei "myprogram.pot" in diese Datei. Und so müssen Sie für jede Sprache, in die Sie Ihr Programm übersetzen möchten, eine Datei erstellen.
Jetzt arbeiten wir an der Datei "ar.po", kopieren den Inhalt aus der Datei "myprogram.pot" und legen ihn in diese Datei ein und bearbeiten Folgendes:
- EIN BESCHREIBENDER TITEL: Sie können hier den Titel Ihres Projekts eingeben, wenn Sie möchten.
- JAHR DER COPYRIGHT-INHABER DES PAKETS: ERSETZEN SIE ES DURCH DAS JAHR, IN DEM SIE DAS PROJEKT ERSTELLT HABEN.
- PACKAGE: Ersetzen Sie es durch den Namen des Pakets.
- ERSTER AUTOR <EMAIL@ADDRESS>, JAHR: Ersetzen Sie dies durch Ihren echten Namen, Ihre E-Mail-Adresse und das Jahr, in dem Sie die Datei übersetzt haben.
- PAKETVERSION: Ersetzen Sie es durch die Paketversion aus der Datei debian/control.
- YEAR-MO-DA HO:MI+ZONE: braucht keine Erklärung, du kannst es auf ein beliebiges Datum ändern.
- VOLLSTÄNDIGER NAME <EMAIL@ADDRESS>: Ersetzen Sie ihn auch durch Ihren Namen und Ihre E-Mail-Adresse.
- Sprach-Team: Ersetzen Sie es durch den Namen der Sprache, in die Sie übersetzen, z. B. "Arabisch" oder "Französisch".
- Sprache: Hier müssen Sie den ISO-639-1-Code für die Sprache einfügen, in die Sie übersetzen möchten, z. B. "ar", "fr", "de", ".. usw. finden Sie hier eine vollständige Liste.
- CHARSET: Dieser Schritt ist wichtig, ersetzen Sie diesen String durch "UTF-8 " (ohne Anführungszeichen), der die meisten Sprachen unterstützt.
Beginnen Sie jetzt mit dem Übersetzen! Fügen Sie Ihre Übersetzung für jede Zeichenfolge nach den Anführungszeichen in "msgstr " hinzu. Speichern Sie die Datei und beenden Sie den Vorgang. Eine gute Übersetzungsdatei für die arabische Sprache
als Beispiel sollte so aussehen:
# My Program
Copyright (C) 2014
This file is distributed under the same license as the myprogram package.
Hanny Helal <[email <, 2014.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: 1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-12-29 21:28+0200\n"
"PO-Revision-Date: 2014-12-29 22:28+0200\n"
"Last-Translator: M.Hanny Sabbagh <hannysabbagh<@hotmail.com<\n"
"Language-Team: Arabic <[email <\n"
"Language: ar\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: myprogram:48
msgid "Welcome to my Test program !"
msgstr "أهلًا بك إلى برنامجي الاختباري!"
#: myprogram:52
msgid "Click on me to open the Terminal"
msgstr "اضغط عليّ لفتح الطرفية"
Es gibt nichts weiter zu tun, packen Sie das Programm einfach mit dem folgenden Befehl:
$ debuild -us -uc
Versuchen Sie nun, das neu erstellte Paket mit dem folgenden Befehl zu installieren.
$ sudo dpkg -i myprogram_1.0_all.deb
Und ändern Sie die Systemsprache mit dem Programm "Language Support" oder mit einem anderen Programm auf Arabisch (oder die Sprache, in die Sie Ihre Datei übersetzt haben):
Nach der Auswahl wird Ihr Programm in die arabische Sprache übersetzt.
Hier endet unsere Serie über die PyGObject-Programmierung für den Linux-Desktop, natürlich gibt es noch viele andere Dinge, die Sie aus der offiziellen Dokumentation und der Python GI API-Referenz lernen können.
Was denkst du über die Serie? Finden Sie es nützlich? Konnten Sie Ihre erste Anwendung erstellen, indem Sie dieser Serie gefolgt sind? Teilen Sie uns Ihre Gedanken mit!



