Wyszukiwanie w witrynie

Tłumaczenie aplikacji PyGObject na różne języki – część 5


Kontynuujemy z Tobą serię programowania PyGObject i tutaj, w tej 5. części, dowiemy się, jak tłumaczyć nasze aplikacje PyGObject na różne języki. Tłumaczenie aplikacji jest ważne, jeśli zamierzasz opublikować je na całym świecie, będzie bardziej przyjazne dla użytkowników końcowych, ponieważ nie wszyscy rozumieją angielski.

Jak działa proces tłumaczenia

Możemy podsumować etapy tłumaczenia dowolnego programu na pulpicie systemu Linux, wykonując następujące kroki:

  1. Wyodrębnij ciągi znaków do przetłumaczenia z pliku Pythona.
  2. Zapisz ciągi znaków w pliku .pot, którego format umożliwia późniejsze przetłumaczenie ich na inne języki.
  3. Rozpocznij tłumaczenie ciągów.
  4. Wyeksportuj nowe przetłumaczone ciągi znaków do pliku .po, który będzie automatycznie używany po zmianie języka systemu.
  5. Dodaj kilka drobnych zmian programowych do głównego pliku Pythona i pliku .desktop.

I to wszystko! Po wykonaniu tych kroków Twoja aplikacja będzie gotowa do użytku dla użytkowników końcowych z całego świata (choć… będziesz musiał przetłumaczyć swój program na wszystkie języki na całym świecie!). Brzmi łatwo, prawda? :-)

Najpierw, aby zaoszczędzić trochę czasu, pobierz pliki projektu z poniższego linku i rozpakuj plik w swoim katalogu domowym.

  1. https://copy.com/TjyZAaNgeQ6BB7yn

Otwórz plik „setup.py” i zwróć uwagę na zmiany, które wprowadziliśmy:

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.

Otwórz także plik „mójprogram” i zobacz zmiany programowe, które wprowadziliśmy. Wszystkie zmiany wyjaśniono w komentarzach:

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

Teraz.. Zacznijmy tłumaczyć nasz program. Najpierw utwórz plik .pot (plik zawierający wszystkie ciągi znaków w programie, które można przetłumaczyć), aby
możesz rozpocząć tłumaczenie za pomocą następującego polecenia:

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

Spowoduje to utworzenie pliku „myprogram.pot” w folderze „po” w głównym folderze projektu, który zawiera następujący kod:

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

Teraz, aby rozpocząć tłumaczenie ciągów znaków. Utwórz oddzielny plik dla każdego języka, na który chcesz przetłumaczyć swój program, używając kodów języków „ISO-639-1” wewnątrz pola „po ”, na przykład, jeśli chcesz przetłumaczyć swój program na arabski, utwórz plik o nazwie „ar.po” i skopiuj zawartość z folderu „ myprogram.pot ” do niego.

Jeśli chcesz przetłumaczyć swój program na niemiecki, utwórz plik „de.po” i skopiuj zawartość z „myprogram.pot” plik do niego... i tak dalej, musisz utworzyć plik dla każdego języka, na który chcesz przetłumaczyć swój program.

Teraz będziemy pracować nad plikiem „ar.po”, skopiujemy zawartość z pliku „myprogram.pot”, umieścimy go w tym pliku i zmodyfikujemy następujące :

  1. KILKA OPISOWYCH TYTUŁÓW: jeśli chcesz, możesz tutaj wpisać tytuł swojego projektu.
  2. ROK WŁAŚCICIELA PRAW AUTORSKICH PAKIETU: zastąp go rokiem utworzenia projektu.
  3. PAKIET: zastąp go nazwą pakietu.
  4. PIERWSZY AUTOR , ROK: zastąp to swoim prawdziwym imieniem i nazwiskiem, adresem e-mail oraz rokiem przetłumaczenia pliku.
  5. WERSJA PAKIETU: zastąp ją wersją pakietu z pliku debian/control.
  6. YEAR-MO-DA HO:MI+ZONE: nie trzeba wyjaśniać, możesz zmienić na dowolną datę.
  7. IMIĘ I NAZWISKO : zastąp je także swoim imieniem i adresem e-mail.
  8. Zespół językowy: zastąp go nazwą języka, na który tłumaczysz, na przykład „arabski” lub „francuski”.
  9. Język: tutaj musisz wpisać kod ISO-639-1 dla języka, na który tłumaczysz, na przykład „ar”, „fr”, „de”..etc, możesz pełną listę znajdziesz tutaj.
  10. CHARSET: ten krok jest ważny, zamień ten ciąg na „UTF-8” (bez cudzysłowów), który obsługuje większość języków.

Teraz zacznij tłumaczyć! Dodaj tłumaczenie każdego ciągu znaków po cudzysłowie w „msgstr”. Zapisz plik i wyjdź. Dobry plik z tłumaczeniem dla
Przykładowy język arabski powinien wyglądać następująco:

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

Nie ma nic więcej do zrobienia, po prostu spakuj program za pomocą następującego polecenia:

debuild -us -uc

Teraz spróbuj zainstalować nowo utworzony pakiet za pomocą następującego polecenia.

sudo dpkg -i myprogram_1.0_all.deb

I zmień język systemu za pomocą programu „Obsługa języków” lub dowolnego innego programu na arabski (lub język, na który przetłumaczyłeś swój plik):

Po wybraniu Twój program zostanie przetłumaczony na język arabski.

Tutaj kończy się nasza seria o programowaniu PyGObject na komputery stacjonarne z systemem Linux, oczywiście jest wiele innych rzeczy, których możesz się nauczyć z oficjalnej dokumentacji i dokumentacji Python GI API.

Co sądzisz o serialu? Czy uważasz to za przydatne? Czy udało Ci się stworzyć swoją pierwszą aplikację korzystając z tej serii? Podziel się z nami swoimi przemyśleniami!