Iwwersetzen PyGObject Uwendungen a verschidde Sproochen - Deel 5


Mir féieren d'PyGObject Programméierungsserie mat Iech weider an hei an dësem 5. Deel léiere mir wéi een eis PyGObject Uwendungen a verschidde Sproochen iwwersetzt. Är Uwendungen z'iwwersetzen ass wichteg wann Dir se fir d'Welt verëffentlechen, et wäert méi Benotzerfrëndlech sinn fir Endbenotzer well net jidderee versteet Englesch.

Wéi den Iwwersetzungsprozess funktionnéiert

Mir kënnen d'Schrëtt vun der Iwwersetzung vun all Programm ënner dem Linux Desktop zesummefaassen mat dëse Schrëtt:

  1. Extraitéiert déi iwwersatable Strings aus der Python Datei.
  2. Späichert d'Strings an e .pot-Datei deen e Format ass, deen Iech erlaabt et spéider an aner Sproochen ze iwwersetzen.
  3. Start d'Saiten iwwersetzen.
  4. Exportéiert déi nei iwwersat Saiten an eng .po Datei déi automatesch benotzt gëtt wann d'Systemsprooch geännert gëtt.
  5. Füügt e puer kleng programmatesch Ännerungen un d'Haapt Python Datei an d'.desktop Datei.

An dat ass et! Nodeems Dir dës Schrëtt gemaach hutt, ass Är Applikatioun prett fir d'Endbenotzer aus der ganzer Welt ze benotzen (wäert .. Dir musst awer Äre Programm an all Sprooche ronderëm de Globus iwwersetzen!), Kléngt einfach net? :-)

Als éischt, fir e bëssen Zäit ze spueren, luet d'Projetdateien vum Link hei ënnen erof an extrahéiert d'Datei an Ärem Heemverzeichnis.

  1. https://copy.com/TjyZAaNgeQ6BB7yn

Öffnen d'setup.py Datei a bemierkt d'Ännerungen déi mir gemaach hunn:

# 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 och d'Datei \myprogram op a kuckt déi programmatesch Ännerungen déi mir gemaach hunn, all Ännerungen ginn an de Kommentarer erkläert:

#!/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()

Elo .. Loosst eis eise Programm iwwersetzen. Erstellt als éischt d'Datei .pot (e Fichier deen all iwwersatbare Strings am Programm enthält) fir datt Dir
kann ufänken mat dem folgenden Kommando ze iwwersetzen:

$ cd myprogram
$ xgettext --language=Python --keyword=_ -o po/myprogram.pot myprogram

Dëst wäert d'myprogram.pot Datei am Ordner po am Haaptprojet-Dossier erstellen, deen de folgende 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 >, 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 >\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 ""

Elo fir unzefänken d'Strings ze iwwersetzen.. Erstellt eng getrennte Datei fir all Sprooch, op déi Dir Äre Programm iwwersetze wëllt, mat de \ISO-639-1 Sproochecoden am \ >po Dossier, zum Beispill, wann Dir Äre Programm op Arabesch iwwersetze wëllt, erstellt e Fichier mam Numm \ar.po a kopéiert den Inhalt aus der \myprogram.pot Datei op et.

Wann Dir Äre Programm op Däitsch iwwersetze wëllt, erstellt eng \de.po Datei a kopéiert den Inhalt vum \myprogram.pot >” Datei derbäi .. an esou een, Dir musst e Fichier fir all Sprooch erstellen, op déi Dir Äre Programm iwwersetzen wëllt.

Elo wäerte mir un der \ar.po Datei schaffen, den Inhalt vun der \myprogram.pot Datei kopéieren a se an dës Datei setzen an änneren déi folgend:

  1. E puer DESKRIPTIV TITEL: Dir kënnt den Titel vun Ärem Projet hei aginn wann Dir wëllt.
  2. JOER DE COPYRIGHT HOLDER vum PACKAGE: ersetzt et mam Joer wou Dir de Projet erstallt hutt.
  3. PACKAGE: ersetzen se mam Numm vum Package.
  4. ÉISCHT AUTEUR <[email >, JOER: ersetzt dëst mat Ärem richtegen Numm, E-Mail an d'Joer wou Dir de Fichier iwwersat hutt.
  5. PACKAGEVERSIOUN: ersetzen se duerch d'Packageversioun vun der Debian/Kontrolldatei.
  6. JOER-MO-DA HO:MI+ZONE: brauch keng Erklärung, Dir kënnt et op all Datum änneren, deen Dir wëllt.
  7. VOLLZÄIT NUMM <[email >: ersetzt et och Ären Numm an Ären E-Mail.
  8. Sprooch-Team: ersetzt et mam Numm vun der Sprooch op déi Dir iwwersetzt, zum Beispill Arabesch oder Franséisch.
  9. Sprooch: hei musst Dir den ISO-639-1 Code fir d'Sprooch aginn, op déi Dir iwwersetzt, zum Beispill \ar, \fr, \de ..etc, Dir fannt hei eng komplett Lëscht.
  10. CHARSET: Dëse Schrëtt ass wichteg, ersetzt dës String duerch UTF-8 (ouni Zitaten) déi déi meescht Sproochen ënnerstëtzt.

Fänkt elo un ze iwwersetzen! Füügt Är Iwwersetzung fir all String no den Zitater an \msgstr derbäi. Späichert de Fichier a gitt eraus. Eng gutt Iwwersetzungsdatei fir de
Arabesch Sprooch als Beispill soll esou ausgesinn:

# 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 "اضغط عليّ لفتح الطرفية"

Et gëtt näischt méi ze maachen, packt just de Programm mam folgenden Kommando:

$ debuild -us -uc

Probéiert elo den neien erstallten Package mat dem folgenden Kommando z'installéieren.

$ sudo dpkg -i myprogram_1.0_all.deb

A ännert d'Systemsprooch mat dem \Sprooch Ënnerstëtzung Programm oder mat engem anere Programm op Arabesch (oder d'Sprooch op déi Dir Är Datei iwwersat hutt):

Nodeems Dir gewielt hutt, gëtt Äre Programm an d'arabesch Sprooch iwwersat.

Hei endet eis Serie iwwer PyGObject Programméiere fir de Linux Desktop, natierlech ginn et vill aner Saachen déi Dir léiere kënnt aus der Python GI API Referenz.

Wat haalt Dir vun der Serie? Fannt Dir et nëtzlech? Kënnt Dir Är éischt Applikatioun erstellen andeems Dir dës Serie verfollegt? Deelt eis Är Gedanken!