亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用Python3中的gettext模塊翻譯Python源碼以支持多語(yǔ)言

 更新時(shí)間:2015年03月31日 15:58:51   作者:Al Sweigart  
這篇文章主要介紹了使用Python3中的gettext模塊翻譯Python源碼以支持多語(yǔ)言,其中翻譯Python源碼只是作為示例以展示gettext的功能和用法,需要的朋友可以參考下

你寫(xiě)了一個(gè)Python 3程序,還想要它適用于其他語(yǔ)言。你能復(fù)制全部代碼庫(kù),然后刻意地檢查每個(gè).py文件,替換掉所有找到的文本字符串。但這意味著你有兩份你代碼的獨(dú)立副本,每當(dāng)你要做出個(gè)改動(dòng)或修復(fù)個(gè)bug,你的工作量會(huì)加倍。而且如果你想要程序還適用于其他語(yǔ)言,就更糟了。

幸運(yùn)的是,Python給了一個(gè)解決辦法,就是用gettext模塊。
一個(gè)Hack解法

你應(yīng)該把你自己的解決辦法統(tǒng)一改變。例如,你可以把你程序中的每個(gè)字符串替換為一個(gè)函數(shù)調(diào)用(函數(shù)名簡(jiǎn)單些,比如像_()一樣),這會(huì)返回被翻譯為該正確語(yǔ)言的字符串。舉個(gè)例子,如果你的程序原本是:
 

print('Hello world!')

……你可以將它改為:
 

print(_('Hello world!'))

……函數(shù)_()會(huì)返回'Hello world!'的翻譯,它基于程序設(shè)置有的語(yǔ)言。比如,如果這個(gè)語(yǔ)言設(shè)置之前被存在一個(gè)叫LANGUAGE的全局變量中,函數(shù)_()看起來(lái)像這樣:
 

def _(s):
  spanishStrings = {'Hello world!': 'Hola Mundo!'}
  frenchStrings = {'Hello world!': 'Bonjour le monde!'}
  germanStrings = {'Hello world!': 'Hallo Welt!'}
 
  if LANGUAGE == 'English':
    return s
  if LANGUAGE == 'Spanish':
    return spanishStrings[s]
  if LANGUAGE == 'French':
    return frenchStrings[s]
  if LANGUAGE == 'German':
    return germanStrings[s]

這可以,但是你這是在重復(fù)造輪子。Python的gettext模塊可以做更多。gettext是一系列工具,文件格式在20世紀(jì)90年代被發(fā)明出來(lái),來(lái)規(guī)范軟件國(guó)際化(也叫I18N)。gettext是個(gè)作為對(duì)于所有編程語(yǔ)言的系統(tǒng)化的設(shè)計(jì),但是我們會(huì)在本篇文章中只專(zhuān)注于Python。
程序例子

設(shè)想你有個(gè)想要翻譯的用Python3寫(xiě)的簡(jiǎn)單“猜數(shù)字”游戲。程序的源代碼在這里。有四步來(lái)使這個(gè)程序國(guó)際化:

    調(diào)整這個(gè).py文件的源代碼,這樣使字符串輸入進(jìn)一個(gè)名為_(kāi)()的函數(shù)。
    用和Python一起安裝的pygettext.py文本,從源代碼創(chuàng)建一個(gè)”pot”文件。
    用這個(gè)免費(fèi)的跨平臺(tái)Poedit軟件,從pot文件創(chuàng)建.po和.mo文件。
    再次調(diào)整你的.py文件源代碼導(dǎo)入gettext模塊的代碼,設(shè)置語(yǔ)言。

第一步:添加 _() 函數(shù)

首先,檢查你程序中的所有需要被翻譯和用_()的調(diào)用來(lái)替代的字符串。針對(duì)Python使用的gettext系統(tǒng)用_()作為得到翻譯了的字符串的通用名,因?yàn)樗莻€(gè)短名。

注意:用格式型字符串而不是連接型字符串會(huì)是你的程序翻譯起來(lái)更簡(jiǎn)單。例如,用連接型字符串你的程序會(huì)像這樣:
 

print('Good job, ' + myName + '! You guessed my number in ' + guessesTaken + ' guesses!')
print(_('Good job, ') + myName + _('! You guessed my number in ') + guessesTaken + _(' guesses!'))

This results in three separate strings that need to be translated, as opposed to the single string needed in the string formatting approach:
這會(huì)導(dǎo)致三個(gè)獨(dú)立的字符串都需要翻譯,然而相反的是在格式型的字符串中,只需翻譯一個(gè)字符串:

print('Good job, %s! You guessed my number in %s guesses!' % (myName, guessesTaken))
print(_('Good job, %s! You guessed my number in %s guesses!') % (myName, guessesTaken))

當(dāng)你改完“猜數(shù)字”源代碼后,它會(huì)像這樣。你并不能運(yùn)行它,因?yàn)開(kāi)()函數(shù)還沒(méi)定義。這個(gè)變化只是讓pygettext.py文本可以找到所有需要翻譯的字符串。
第二步:用pygettext.py提取字符串

在你Python安裝(Windows上的C:Python34Toolsi18n)中的Tools/i18n就是pygettext.py文本。對(duì)于可譯字符串普通 gettext unix 命令解析 C/C++ 源碼并且 xgettext unix 命令可以解析其他語(yǔ)言,而pygettext.py則知道怎樣去解析Python源碼。它會(huì)找到所有字符串并產(chǎn)生個(gè)”pot”文件。

在Windows上我已經(jīng)運(yùn)行了這個(gè)文本像這樣:
 

C:>py -3.4 C:Python34Toolsi18npygettext.py -d guess guess.py

這創(chuàng)建了一個(gè)pot文件,叫g(shù)uess.pot。這只是個(gè)普通純文本文件,它列出來(lái)了全部的在源碼中尋找_()的調(diào)用的要翻譯的字符串。你可以在這兒看guess.pot文件.
第三步:用Poedit翻譯字符串

你可以用文本編輯器填寫(xiě)翻譯但是免費(fèi)的Poedit軟件會(huì)更容易從這兒下載http://poedit.net. 選擇 > New from POT/PO file… 然后選擇你的guess.po文件。

2015331154815199.jpg (690×720)

Poedit會(huì)問(wèn)你想要翻譯成什么語(yǔ)言。我們舉例用西班牙語(yǔ):

2015331154910720.jpg (690×745)

填寫(xiě)翻譯吧。(我用 http://translate.google.com,所以對(duì)于真的使用西班牙語(yǔ)的人會(huì)感覺(jué)有點(diǎn)奇怪。)

2015331154956050.jpg (690×581)

現(xiàn)在儲(chǔ)存文件在它的gettext形式的文件夾里。保存會(huì)創(chuàng)建.po文件(一個(gè)人類(lèi)可讀的文本文件不同于原始.pot文件,除了是有西語(yǔ)翻譯的)和一個(gè).mo文件(一個(gè)gettext會(huì)讀取的機(jī)器可讀版本。這些文件會(huì)存在一個(gè)特定的文件夾內(nèi),為的是讓gettext能夠找到他們。他們看起來(lái)像這樣(比如西語(yǔ)文件中的”es”和德語(yǔ)文件中”de”):
 

./guess.py
./guess.pot
./locale/es/LC_MESSAGES/guess.mo
./locale/es/LC_MESSAGES/guess.po
./locale/de/LC_MESSAGES/guess.mo
./locale/de/LC_MESSAGES/guess.po

這些兩種性質(zhì)的語(yǔ)言像西語(yǔ)中的”es”和德語(yǔ)中的 ”de” 被稱(chēng)作ISO 639-1 codes 是語(yǔ)言的標(biāo)準(zhǔn)縮寫(xiě)。你不一定要用他們,但是遵循標(biāo)準(zhǔn)是有道理的。
第四步:給你程序加上gettext代碼

現(xiàn)在你有包含翻譯的.mo文件,調(diào)整你的Python代碼去用它。在你的程序中加上下面的:
 

import gettext
es = gettext.translation('guess', localedir='locale', languages=['es'])
es.install()

第一個(gè) 'guess' 是”定義域”,這其實(shí)是意味著guess.mo文件名中“猜”的部分。 localedir是你創(chuàng)建的locale文件夾的目錄地址。這會(huì)是相對(duì)或絕對(duì)的路徑。'es'描述在locale文件夾下面的文件。LC_MESSAGES文件夾是個(gè)標(biāo)準(zhǔn)名

install()方法會(huì)導(dǎo)致調(diào)用_()返回翻譯為西語(yǔ)的字符串。如果你想回到原始的英語(yǔ)只需要分配一個(gè)lambda函數(shù)值給_,這會(huì)返回當(dāng)時(shí)輸入的字符串:
 

import gettext
es = gettext.translation('guess', localedir='locale', languages=['es'])
print(_('Hello! What is your name?')) # prints Spanish
 
_ = lambda s: s

你可以檢查準(zhǔn)備翻譯的”Guess the Number”源碼。如果你想要運(yùn)行此程序,下載并解壓這個(gè)壓縮文件和它的locale文件夾和.mo安裝文件。
延伸閱讀

我怎樣都稱(chēng)不上是 I18N or gettext的專(zhuān)家,如果我的教程講解不夠好,請(qǐng)一定要留言。大多數(shù)情況下,你的軟件運(yùn)行時(shí)不會(huì)轉(zhuǎn)換語(yǔ)言,而是會(huì)去讀LANGUAGE,LC_ALL,LC_MESSAGES,和LANG這些環(huán)境變量中的一個(gè)來(lái)確定計(jì)算機(jī)的工作地點(diǎn)。我會(huì)邊學(xué)習(xí)邊更新本教程的。

相關(guān)文章

  • python迷宮問(wèn)題深度優(yōu)先遍歷實(shí)例

    python迷宮問(wèn)題深度優(yōu)先遍歷實(shí)例

    這篇文章主要給大家介紹了關(guān)于python迷宮問(wèn)題深度優(yōu)先遍歷的相關(guān)資料,深度優(yōu)先搜索算法(Depth-First-Search),是搜索算法的一種,需要的朋友可以參考下
    2021-06-06
  • 完美解決安裝完tensorflow后pip無(wú)法使用的問(wèn)題

    完美解決安裝完tensorflow后pip無(wú)法使用的問(wèn)題

    今天小編就為大家分享一篇完美解決安裝完tensorflow后pip無(wú)法使用的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • Python實(shí)現(xiàn)快速將pdf文件剪切成多個(gè)圖片

    Python實(shí)現(xiàn)快速將pdf文件剪切成多個(gè)圖片

    這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)快速將pdf文件剪切成多個(gè)圖片,文中的示例代碼講解詳細(xì),有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • python 如何比較兩集合的大小關(guān)系

    python 如何比較兩集合的大小關(guān)系

    這篇文章主要介紹了python 比較兩集合的大小關(guān)系操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • 淺談Keras中shuffle和validation_split的順序

    淺談Keras中shuffle和validation_split的順序

    這篇文章主要介紹了淺談Keras中shuffle和validation_split的順序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • 一文搞懂Python中函數(shù)的定義與使用

    一文搞懂Python中函數(shù)的定義與使用

    函數(shù)是具有某種特定功能的代碼塊,可以重復(fù)使用。這篇文章將為大家詳細(xì)介紹Python中函數(shù)的定義與使用,感興趣的小伙伴可以學(xué)習(xí)一下
    2022-06-06
  • python中pywifi的具體使用

    python中pywifi的具體使用

    本文主要介紹了python中pywifi的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Python中NumPy的數(shù)組拆分

    Python中NumPy的數(shù)組拆分

    這篇文章主要介紹了Python中NumPy的數(shù)組拆分,我們使用array_split()分割數(shù)組,將要分割的數(shù)組和分割數(shù)傳遞給它,如果將一個(gè)數(shù)組拆分為 3 個(gè)數(shù)組,則可以像使用任何數(shù)組元素一樣從結(jié)果中訪(fǎng)問(wèn)它們,需要的朋友可以參考下
    2023-07-07
  • python中不能連接超時(shí)的問(wèn)題及解決方法

    python中不能連接超時(shí)的問(wèn)題及解決方法

    這篇文章主要介紹了python中不能連接超時(shí)的問(wèn)題及解決方法,需要的朋友可以參考下
    2018-06-06
  • Django 如何從request中獲取前端數(shù)據(jù)

    Django 如何從request中獲取前端數(shù)據(jù)

    這篇文章主要介紹了Django從request中獲取前端數(shù)據(jù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04

最新評(píng)論