PyGObject アプリケーションの異なる言語への翻訳 – パート 5
PyGObject プログラミング シリーズを引き続きご紹介します。この第 5 部 では、PyGObject アプリケーションをさまざまな言語に翻訳する方法を学びます。アプリケーションを世界向けに公開する場合、アプリケーションを翻訳することが重要です。誰もが英語を理解できるわけではないため、エンドユーザーにとってより使いやすくなります。
翻訳プロセスの仕組み
Linux デスクトップでプログラムを翻訳する手順は、次の手順で要約できます。
- Python ファイルから翻訳可能な文字列を抽出します。
- 文字列を .pot ファイルに保存します。この形式により、後で他の言語に翻訳できるようになります。
- 文字列の翻訳を開始します。
- 新しい翻訳された文字列を .po ファイルにエクスポートします。このファイルは、システム言語が変更されたときに自動的に使用されます。
- メインの Python ファイルと .desktop ファイルにプログラムによる小さな変更を追加します。
以上です!これらの手順を実行すると、アプリケーションは世界中のエンドユーザーが使用できるようになります (ただし、プログラムを世界中のすべての言語に翻訳する必要があります!)。簡単だと思いませんか? :-)
まず、時間を節約するために、以下のリンクからプロジェクト ファイルをダウンロードし、ホーム ディレクトリにファイルを抽出します。
- 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
これにより、メイン プロジェクト フォルダーの「po 」フォルダー内に「myprogram.pot 」ファイルが作成され、次のコードが含まれます。
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 ""
次に、文字列の翻訳を開始します。「po」内の「ISO-639-1」言語コードを使用して、プログラムを翻訳する言語ごとに別個のファイルを作成します。 」フォルダー。たとえば、プログラムをアラビア語 に翻訳したい場合は、「ar.po 」というファイルを作成し、その内容を「 myprogram.pot 」ファイルをそれに追加します。
プログラムをドイツ語に翻訳したい場合は、「de.po 」ファイルを作成し、「myprogram.pot 」から内容をコピーします。ファイルをそれに追加するなど、プログラムを翻訳したい言語ごとにファイルを作成する必要があります。
ここで、「ar.po 」ファイルに取り組み、「myprogram.pot 」ファイルの内容をコピーしてそのファイル内に配置し、次の内容を編集します。 :
- 説明的なタイトル: 必要に応じて、ここにプロジェクトのタイトルを入力できます。
- パッケージの著作権所有者の年: プロジェクトを作成した年に置き換えます。
- パッケージ: パッケージの名前に置き換えます。
- 最初の作成者
、年 : これを実際の名前、電子メール、ファイルを翻訳した年に置き換えます。 - パッケージ バージョン: debian/control ファイルのパッケージ バージョンに置き換えます。
- YEAR-MO-DA HO:MI+ZONE: 説明は不要です。任意の日付に変更できます。
- フルネーム
: これもあなたの名前とメールアドレスに置き換えてください。 - 言語チーム: 「アラビア語」や「フランス語」など、翻訳先の言語の名前に置き換えます。
- 言語: ここでは、翻訳先の言語の ISO-639-1 コード (例: 「ar 」、「fr 」、「de 」など) を挿入する必要があります。完全なリストはここでご覧ください。
- 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
そして、「言語サポート 」プログラムまたは他のプログラムを使用してシステム言語をアラビア語 (またはファイルを翻訳した言語) に変更します。
選択すると、プログラムがアラビア語に翻訳されます。
Linux デスクトップ用の PyGObject プログラミングに関するシリーズはこれで終了します。もちろん、公式ドキュメントや Python GI API リファレンスから学べることは他にもたくさんあります。
このシリーズについてどう思いますか?役に立つと思いますか?このシリーズに従って、最初のアプリケーションを作成できましたか?ご意見をお聞かせください。