安装完Python软件之后,在Python安装目录下面会自带国际化的程序。比如:我的Python安装目录为D:\ProgramData\Anaconda3,因此国际化程序所在目录就是D:\ProgramData\Anaconda3\Tools\i18n。其国际化目录下面包含几个文件:
Python国际化可以根据以下四个步骤来做:
1>首先将需要国际化的目标字符串使用_()包起来,注意:如果目标字符串中含有格式化字符串,只需要把字符串部分包起来即可。
2>使用上面的Python国际化程序pygettext来生成pot文件
3>使用poedit软件编辑pot文件,选择要翻译的目标语言,翻译pot文件
4>将翻译完毕的目标文件保存到”locale/目标语言编码/LS_MESSAGES”目录,如果要保存的目录不存在,需要手动创建。
以网上的一段程序guess.py为例:
# This is a guess the number game.
import random
guessesTaken = 0
print('Hello! What is your name?')
myName = input()
number = random.randint(1, 20)
print('Well, %s, I am thinking of a number between 1 and 20.' % (myName))
while guessesTaken < 6:
print('Take a guess.')
guess = input()
guess = int(guess)
guessesTaken = guessesTaken + 1
if guess < number:
print('Your guess is too low.')
if guess > number:
print('Your guess is too high.')
if guess == number:
break
if guess == number:
guessesTaken = str(guessesTaken)
print('Good job, %s! You guessed my number in %s guesses!' % (myName, guessesTaken))
if guess != number:
number = str(number)
print('Nope. The number I was thinking of was %s.' % (number))
执行国际化第一步的结果如下:
# This is a guess the number game.
import random
guessesTaken = 0
print(_('Hello! What is your name?'))
myName = input()
number = random.randint(1, 20)
print(_('Well, %s, I am thinking of a number between 1 and 20.') % (myName))
while guessesTaken < 6:
print(_('Take a guess.'))
guess = input()
guess = int(guess)
guessesTaken = guessesTaken + 1
if guess < number:
print(_('Your guess is too low.'))
if guess > number:
print(_('Your guess is too high.'))
if guess == number:
break
if guess == number:
guessesTaken = str(guessesTaken)
print(_('Good job, %s! You guessed my number in %s guesses!') % (myName, guessesTaken))
if guess != number:
number = str(number)
print(_('Nope. The number I was thinking of was %s.') % (number))
执行国际化第二步的结果,生成的pot文件内容如下:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2018-02-07 13:10+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=cp936\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: pygettext.py 1.5\n"
#: guess.py:10
msgid "Hello! What is your name?"
msgstr ""
#: guess.py:14
msgid "Well, %s, I am thinking of a number between 1 and 20."
msgstr ""
#: guess.py:17
msgid "Take a guess."
msgstr ""
#: guess.py:24
msgid "Your guess is too low."
msgstr ""
#: guess.py:27
msgid "Your guess is too high."
msgstr ""
#: guess.py:34
msgid "Good job, %s! You guessed my number in %s guesses!"
msgstr ""
#: guess.py:38
msgid "Nope. The number I was thinking of was %s."
msgstr ""
执行国际化第三步的结果,最终翻译结果如下:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: 2018-02-07 13:10+0800\n"
"PO-Revision-Date: 2018-02-07 13:38+0800\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: pygettext.py 1.5\n"
"X-Generator: Poedit 2.0.6\n"
"Last-Translator: \n"
"Plural-Forms: nplurals=1; plural=0;\n"
"Language: zh_CN\n"
#: guess.py:10
msgid "Hello! What is your name?"
msgstr "你好,你的名字叫什么?"
#: guess.py:14
msgid "Well, %s, I am thinking of a number between 1 and 20."
msgstr "好吧,%s,我正在考虑的数字在1到20之间。"
#: guess.py:17
msgid "Take a guess."
msgstr "猜一猜。"
#: guess.py:24
msgid "Your guess is too low."
msgstr "你的猜测太小。"
#: guess.py:27
msgid "Your guess is too high."
msgstr "你的猜测结果太大。"
#: guess.py:34
msgid "Good job, %s! You guessed my number in %s guesses!"
msgstr "干得漂亮,%s!你猜了%s次就猜对了我的数字!"
#: guess.py:38
msgid "Nope. The number I was thinking of was %s."
msgstr "不对,我正在考虑的数字是%s。"
执行国际化的第四步,pot文件内容翻译后,保存到项目根目录下locale/zh_Hans/LC_MESSAGES文件夹下,我的项目目录结构如下:
最终保存后的翻译文件为guess.po和guess.mo(guess.po编译后生成的文件。)
至此,Python国际化已经完成。
下面进入测试,需要完善guess.py程序文件,完善后内容如下:
# This is a guess the number game.
import random
import gettext
zh_Hans = gettext.translation('guess', localedir='locale', languages=['zh_Hans'])
zh_Hans.install()
guessesTaken = 0
print(_('Hello! What is your name?'))
myName = input()
number = random.randint(1, 20)
print(_('Well, %s, I am thinking of a number between 1 and 20.') % (myName))
while guessesTaken < 6:
print(_('Take a guess.'))
guess = input()
guess = int(guess)
guessesTaken = guessesTaken + 1
if guess < number:
print(_('Your guess is too low.'))
if guess > number:
print(_('Your guess is too high.'))
if guess == number:
break
if guess == number:
guessesTaken = str(guessesTaken)
print(_('Good job, %s! You guessed my number in %s guesses!') % (myName, guessesTaken))
if guess != number:
number = str(number)
print(_('Nope. The number I was thinking of was %s.') % (number))
测试结果如下: