Oversette PyGObject-applikasjoner til forskjellige språk – del 5


Vi fortsetter PyGObject-programmeringsserien med deg, og her i denne 5. delen lærer vi hvordan du oversetter PyGObject-applikasjonene våre til forskjellige språk. Å oversette applikasjonene dine er viktig hvis du skal publisere det for verden, det vil være mer brukervennlig for sluttbrukere fordi ikke alle forstår engelsk.

Hvordan oversettelsesprosessen fungerer

Vi kan oppsummere trinnene for å oversette et hvilket som helst program under Linux-skrivebordet ved å bruke disse trinnene:

  1. Pakk ut de oversettbare strengene fra Python-filen.
  2. Lagre strengene i en .pot-fil som er et format som lar deg oversette den senere til andre språk.
  3. Begynn å oversette strengene.
  4. Eksporter de nye oversatte strengene til en .po-fil som automatisk brukes når systemspråket endres.
  5. Legg til noen små programmatiske endringer i Python-hovedfilen og .desktop-filen.

Og det er det! Etter å ha utført disse trinnene vil applikasjonen din være klar til bruk for sluttbrukere fra hele verden (vil.. Du må imidlertid oversette programmet til alle språk rundt om i verden!), Høres det enkelt ut, ikke sant? :-)

Først, for å spare litt tid, last ned prosjektfilene fra lenken nedenfor og pakk ut filen i hjemmekatalogen din.

  1. https://copy.com/TjyZAaNgeQ6BB7yn

Åpne filen \setup.py og legg merke til endringene vi gjorde:

# 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.

Åpne også \mittprogram-filen og se de programmatiske endringene vi gjorde, alle endringene er forklart i kommentarfeltet:

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

Nå... La oss begynne å oversette programmet vårt. Opprett først .pot-filen (en fil som inneholder alle de oversettbare strengene i programmet) slik at du
kan begynne å oversette ved å bruke følgende kommando:

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

Dette kommer til å lage \myprogram.pot-filen i \po-mappen i hovedprosjektmappen som inneholder følgende kode:

# 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 ""

Nå for å begynne å oversette strengene.. Lag en separat fil for hvert språk du vil oversette programmet til ved å bruke \ISO-639-1 språkkodene inne i \po”-mappen, for eksempel, hvis du ønsker å oversette programmet til arabisk, oppretter du en fil kalt \ar.po” og kopierer innholdet fra filen \myprogram.pot til den.

Hvis du vil oversette programmet til tysk, oppretter du en \de.po-fil og kopierer innholdet fra \myprogram.pot >” fil til den.. og så en, må du lage en fil for hvert språk du vil oversette programmet til.

Nå skal vi jobbe med \ar.po-filen, kopiere innholdet fra \myprogram.pot-filen og legge den i den filen og redigere følgende:

  1. NOEN BESKRIVENDE TITTEL: du kan angi tittelen på prosjektet ditt her hvis du vil.
  2. ÅR PAKKENS OPPHAVSRETTHOLDER: Erstatt den med året da du opprettet prosjektet.
  3. PAKKE: Erstatt den med navnet på pakken.
  4. Førsteforfatter <[email >, ÅR: Erstatt dette med ditt virkelige navn, e-postadresse og året du oversatte filen.
  5. PAKKEVERSJON: Erstatt den med pakkeversjonen fra debian/control-filen.
  6. ÅR-MO-DA HO:MI+ZONE: trenger ikke forklaring, du kan endre den til hvilken som helst dato du vil.
  7. FULLSTENDIG NAVN <[email >: Erstatt det også med ditt navn og e-postadresse.
  8. Språkteam: Erstatt det med navnet på språket du oversetter til, for eksempel «arabisk» eller «fransk».
  9. Språk: Her må du sette inn ISO-639-1-koden for språket du oversetter til, for eksempel \ar, \fr, \de ..osv, du finner en fullstendig liste her.
  10. CHARSET: Dette trinnet er viktig, erstatt denne strengen med \UTF-8 (uten anførselstegn) som støtter de fleste språk.

Begynn å oversette nå! Legg til oversettelsen din for hver streng etter anførselstegnene i \msgstr. Lagre filen og avslutt. En god oversettelsesfil for
Arabisk språk som et eksempel bør se slik ut:

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

Det er ikke noe mer å gjøre, bare pakke programmet ved å bruke følgende kommando:

$ debuild -us -uc

Prøv nå å installere den nyopprettede pakken ved å bruke følgende kommando.

$ sudo dpkg -i myprogram_1.0_all.deb

Og endre systemspråket ved å bruke \Språkstøtte-programmet eller ved å bruke et annet program til arabisk (eller språket du har oversatt filen til):

Etter å ha valgt, vil programmet ditt bli oversatt til arabisk språk.

Her slutter serien vår om PyGObject-programmering for Linux-skrivebordet, selvfølgelig er det mange andre ting du kan lære fra Python GI API-referansen.

Hva synes du om serien? Synes du det er nyttig? Klarte du å lage din første applikasjon ved å følge denne serien? Del oss dine tanker!