Traduzindo aplicativos PyGObject para diferentes idiomas – Parte 5
Continuamos a série de programação PyGObject com você e aqui nesta 5ª parte, aprenderemos como traduzir nossas aplicações PyGObject para diferentes linguagens. Traduzir seus aplicativos é importante se você pretende publicá-los para o mundo, será mais fácil de usar para os usuários finais porque nem todo mundo entende inglês.
Como funciona o processo de tradução
Podemos resumir as etapas de tradução de qualquer programa no desktop Linux usando estas etapas:
- Extraia as strings traduzíveis do arquivo Python.
- Salve as strings em um arquivo .pot cujo formato permite traduzi-lo posteriormente para outros idiomas.
- Comece a traduzir as strings.
- Exporte as novas strings traduzidas para um arquivo .po que será usado automaticamente quando o idioma do sistema for alterado.
- Adicione algumas pequenas alterações programáticas ao arquivo Python principal e ao arquivo .desktop.
E é isso! Depois de seguir essas etapas, seu aplicativo estará pronto para uso por usuários finais de todo o mundo (no entanto, você terá que traduzir seu programa para todos os idiomas do mundo!). Parece fácil, não é? :-)
Primeiro, para economizar tempo, baixe os arquivos do projeto no link abaixo e extraia o arquivo em seu diretório inicial.
- https://copy.com/TjyZAaNgeQ6BB7yn
Abra o arquivo “setup.py” e observe as alterações que fizemos:
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.
Abra também o arquivo “meuprograma” e veja as alterações programáticas que fizemos, todas as alterações estão explicadas nos comentários:
#!/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()
Agora.. Vamos começar a traduzir nosso programa. Primeiro crie o arquivo .pot (um arquivo que contém todas as strings traduzíveis do programa) para que você
pode começar a traduzir usando o seguinte comando:
cd myprogram
xgettext --language=Python --keyword=_ -o po/myprogram.pot myprogram
Isso criará o arquivo “myprogram.pot” dentro da pasta “po” na pasta principal do projeto que contém o seguinte 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 ""
Agora, para começar a traduzir as strings. Crie um arquivo separado para cada idioma para o qual deseja traduzir seu programa usando os códigos de idiomas “ISO-639-1” dentro do “po ”, por exemplo, se você deseja traduzir seu programa para Árabe, crie um arquivo chamado “ar.po” e copie o conteúdo da pasta “ myprogram.pot ” para ele.
Se você deseja traduzir seu programa para alemão, crie um arquivo “de.po” e copie o conteúdo do “myprogram.pot” arquivo para ele.. e assim por diante, você deve criar um arquivo para cada idioma para o qual deseja traduzir seu programa.
Agora, vamos trabalhar no arquivo “ar.po”, copiar o conteúdo do arquivo “myprogram.pot” e colocá-lo dentro desse arquivo e editar o seguinte :
- ALGUM TÍTULO DESCRITIVO: você pode inserir aqui o título do seu projeto se desejar.
- ANO DO TITULAR DOS DIREITOS AUTORAIS DO PACOTE: substitua pelo ano em que você criou o projeto.
- PACKAGE: substitua pelo nome do pacote.
- PRIMEIRO AUTOR
, ANO : substitua pelo seu nome real, e-mail e o ano em que você traduziu o arquivo. - VERSÃO DO PACOTE: substitua pela versão do pacote do arquivo debian/control.
- YEAR-MO-DA HO:MI+ZONE: não precisa de explicação, você pode alterar para a data que desejar.
- NOME COMPLETO
: substitua também pelo seu nome e e-mail. - Language-Team: substitua pelo nome do idioma para o qual você está traduzindo, por exemplo “árabe” ou “francês”.
- Idioma: aqui você deve inserir o código ISO-639-1 do idioma para o qual você está traduzindo, por exemplo “ar ”, “fr ”, “de ..etc, você pode encontre uma lista completa aqui.
- CHARSET: este passo é importante, substitua esta string por “UTF-8 ” (sem as aspas) que suporta a maioria dos idiomas.
Agora comece a traduzir! Adicione sua tradução para cada string após as aspas em “msgstr ”. Salve o arquivo e saia. Um bom arquivo de tradução para
A língua árabe como exemplo deve ser assim:
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 "اضغط عليّ لفتح الطرفية"
Não há mais nada a fazer, basta empacotar o programa usando o seguinte comando:
debuild -us -uc
Agora tente instalar o novo pacote criado usando o seguinte comando.
sudo dpkg -i myprogram_1.0_all.deb
E altere o idioma do sistema usando o programa “Language Support” ou usando qualquer outro programa para Árabe (ou o idioma para o qual você traduziu seu arquivo):
Após a seleção, seu programa será traduzido para o idioma árabe.
Aqui termina nossa série sobre programação PyGObject para desktop Linux, é claro que há muitas outras coisas que você pode aprender na documentação oficial e na referência da API Python GI.
O que você acha da série? Você acha isso útil? Você conseguiu criar seu primeiro aplicativo seguindo esta série? Compartilhe-nos seus pensamentos!