Búsqueda de sitios web

Traducir aplicaciones PyGObject a diferentes idiomas – Parte 5


Continuamos la serie de programación de PyGObject contigo y aquí, en esta quinta parte, aprenderemos cómo traducir nuestras aplicaciones PyGObject a diferentes idiomas. Traducir sus aplicaciones es importante si va a publicarlas para el mundo; será más fácil de usar para los usuarios finales porque no todos entienden inglés.

Cómo funciona el proceso de traducción

Podemos resumir los pasos para traducir cualquier programa en el escritorio de Linux siguiendo estos pasos:

  1. Extraiga las cadenas traducibles del archivo Python.
  2. Guarde las cadenas en un archivo .pot, cuyo formato le permitirá traducirlo más tarde a otros idiomas.
  3. Empieza a traducir las cuerdas.
  4. Exporte las nuevas cadenas traducidas a un archivo .po que se utilizará automáticamente cuando se cambie el idioma del sistema.
  5. Agregue algunos pequeños cambios programáticos al archivo principal de Python y al archivo .desktop.

¡Y eso es! Después de realizar estos pasos, su aplicación estará lista para ser utilizada por usuarios finales de todo el mundo (¡aunque... tendrá que traducir su programa a todos los idiomas del mundo!), Suena fácil, ¿no? :-)

Primero, para ahorrar algo de tiempo, descargue los archivos del proyecto desde el siguiente enlace y extraiga el archivo en su directorio de inicio.

  1. https://copy.com/TjyZAaNgeQ6BB7yn

Abra el archivo “setup.py” y observe los cambios que hicimos:

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.

También abra el archivo “miprograma” y vea los cambios programáticos que hicimos, todos los cambios se explican en los comentarios:

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

Ahora... comencemos a traducir nuestro programa. Primero cree el archivo .pot (un archivo que contiene todas las cadenas traducibles en el programa) para que
Puedes comenzar a traducir usando el siguiente comando:

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

Esto creará el archivo “myprogram.pot” dentro de la carpeta “po” en la carpeta principal del proyecto que contiene el siguiente código:

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

Ahora, para comenzar a traducir las cadenas... Cree un archivo separado para cada idioma al que desee traducir su programa utilizando los códigos de idiomas “ISO-639-1” dentro del archivo “po”. ”, por ejemplo, si desea traducir su programa al árabe, cree un archivo llamado “ar.po” y copie el contenido de la carpeta “ myprogram.pot ”archivo.

Si desea traducir su programa al alemán, cree un archivo “de.po” y copie el contenido de “myprogram.pot”. archivo a él... y así uno, debe crear un archivo para cada idioma al que desea traducir su programa.

Ahora, trabajaremos en el archivo “ar.po”, copiaremos el contenido del archivo “myprogram.pot”, lo colocaremos dentro de ese archivo y editaremos lo siguiente. :

  1. ALGÚN TÍTULO DESCRIPTIVO: puedes introducir aquí el título de tu proyecto si lo deseas.
  2. AÑO DEL TITULAR DE LOS DERECHOS DE AUTOR DEL PAQUETE: sustitúyelo por el año en que creaste el proyecto.
  3. PAQUETE: reemplácelo con el nombre del paquete.
  4. PRIMER AUTOR , AÑO: reemplace esto con su nombre real, correo electrónico y el año en que tradujo el archivo.
  5. VERSIÓN DEL PAQUETE: reemplácelo con la versión del paquete del archivo debian/control.
  6. AÑO-MO-DA HO:MI+ZONA: no necesita explicación, puedes cambiarlo a la fecha que quieras.
  7. NOMBRE COMPLETO : también reemplázalo por tu nombre y correo electrónico.
  8. Language-Team: reemplázalo con el nombre del idioma al que estás traduciendo, por ejemplo “árabe” o “francés”.
  9. Idioma: aquí debes insertar el código ISO-639-1 del idioma al que estás traduciendo, por ejemplo “ar”, “fr”, “de”..etc, puedes Encuentre una lista completa aquí.
  10. CHARSET: este paso es importante, reemplace esta cadena con “UTF-8” (sin las comillas) que admite la mayoría de los idiomas.

¡Ahora empieza a traducir! Agregue su traducción para cada cadena después de las comillas en "msgstr". Guarda el archivo y cierra. Un buen archivo de traducción para
El idioma árabe como ejemplo debería verse así:

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

No hay nada más que hacer, simplemente empaquete el programa usando el siguiente comando:

debuild -us -uc

Ahora intente instalar el nuevo paquete creado usando el siguiente comando.

sudo dpkg -i myprogram_1.0_all.deb

Y cambie el idioma del sistema usando el programa “Language Support” o usando cualquier otro programa al árabe (o el idioma al que haya traducido su archivo):

Después de seleccionar, su programa será traducido al idioma árabe.

Aquí termina nuestra serie sobre la programación de PyGObject para el escritorio Linux, por supuesto hay muchas otras cosas que puedes aprender de la documentación oficial y la referencia de Python GI API.

¿Qué opinas de la serie? Lo encontraste util? ¿Pudiste crear tu primera aplicación siguiendo esta serie? ¡Compártenos tus pensamientos!