Поиск по сайту:

Перевод приложений PyGObject на разные языки – часть 5


Мы продолжаем с вами серию программ по PyGObject, и в этой 5-й части мы научимся переводить наши приложения PyGObject на разные языки. Перевод ваших приложений важен, если вы собираетесь опубликовать их для всего мира, это будет более удобно для конечных пользователей, потому что не все понимают английский язык.

Как работает процесс перевода

Мы можем обобщить этапы перевода любой программы под рабочий стол Linux, используя следующие шаги:

  1. Извлеките переводимые строки из файла Python.
  2. Сохраните строки в файл .pot, формат которого позволяет позже перевести его на другие языки.
  3. Начните переводить строки.
  4. Экспортируйте новые переведенные строки в файл .po, который будет автоматически использоваться при изменении языка системы.
  5. Добавьте небольшие программные изменения в основной файл Python и файл .desktop.

Вот и все! После выполнения этих шагов ваше приложение будет готово к использованию конечными пользователями со всего мира (хотя… вам придется перевести свою программу на все языки мира!), Звучит просто, не правда ли? :-)

Во-первых, чтобы сэкономить время, загрузите файлы проекта по ссылке ниже и извлеките файл в свой домашний каталог.

  1. https://copy.com/TjyZAaNgeQ6BB7yn

Откройте файл «setup.py» и обратите внимание на внесенные нами изменения:

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.

Также откройте файл «myprogram» и посмотрите, какие программные изменения мы внесли. Все изменения описаны в комментариях:

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

Теперь... Приступим к переводу нашей программы. Сначала создайте файл .pot (файл, содержащий все переводимые строки в программе), чтобы вы
можно начать перевод с помощью следующей команды:

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

В результате будет создан файл «myprogram.pot» внутри папки «po» в основной папке проекта, который будет содержать следующий код:

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

Теперь, чтобы начать перевод строк. Создайте отдельный файл для каждого языка, на который вы хотите перевести свою программу, используя коды языков «ISO-639-1» внутри «po». », например, если вы хотите перевести свою программу на арабский язык, создайте файл с именем «ar.po» и скопируйте содержимое из папки « myprogram.pot ».

Если вы хотите перевести свою программу на немецкий язык, создайте файл «de.po» и скопируйте содержимое из «myprogram.pot». файл к нему... и, во-первых, вы должны создать файл для каждого языка, на который вы хотите перевести свою программу.

Теперь мы поработаем с файлом «ar.po», скопируем содержимое из файла «myprogram.pot», поместим его в этот файл и отредактируем следующее. :

  1. ОПИСАТЕЛЬНОЕ НАЗВАНИЕ: если хотите, вы можете ввести здесь название своего проекта.
  2. ГОД ОБЛАДАТЕЛЯ АВТОРСКИХ ПРАВ НА ПАКЕТ: замените его годом создания проекта.
  3. ПАКЕТ: замените его именем пакета.
  4. ПЕРВЫЙ АВТОР , ГОД: замените это на свое настоящее имя, адрес электронной почты и год перевода файла.
  5. ВЕРСИЯ ПАКЕТА: замените ее версией пакета из файла debian/control.
  6. ГОД-МО-ДА HO:MI+ZONE: не требует пояснений, вы можете изменить его на любую дату по вашему желанию.
  7. ПОЛНОЕ ИМЯ : также замените свое имя и адрес электронной почты.
  8. Language-Team: замените его названием языка, на который вы переводите, например «Арабский» или «Французский».
  9. Язык: здесь вы должны вставить код ISO-639-1 для языка, на который вы переводите, например «ar», «fr», «de»..и т. д., вы можете полный список можно найти здесь.
  10. CHARSET: этот шаг важен. Замените эту строку на «UTF-8» (без кавычек), которая поддерживает большинство языков.

Теперь приступайте к переводу! Добавьте перевод для каждой строки после кавычек в «msgstr». Сохраните файл и выйдите. Хороший файл перевода для
Арабский язык в качестве примера должен выглядеть так:

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

Больше делать нечего, просто упакуйте программу с помощью следующей команды:

debuild -us -uc

Теперь попробуйте установить новый созданный пакет, используя следующую команду.

sudo dpkg -i myprogram_1.0_all.deb

И измените язык системы с помощью программы «Языковая поддержка» или любой другой программы на арабский (или язык, на который вы перевели файл):

После выбора ваша программа будет переведена на арабский язык.

На этом заканчивается наша серия о программировании PyGObject для рабочего стола Linux. Конечно, есть много других вещей, которые вы можете узнать из официальной документации и справочника Python GI API.

Что вы думаете о сериале? Считаете ли вы это полезным? Смогли ли вы создать свое первое приложение, следуя этой серии статей? Поделитесь с нами своими мыслями!