![](/img/trans.png)
[英]How to compile gettext translations in setup.py of a Django app
[英]How to compile *.po gettext translations in setup.py python script
考慮一個具有多語言支持的python包(使用gettext
)。 如何在執行setup.py
時動態地將*.po
文件編譯為*.mo
文件? 我真的不想分發預編譯的*.mo
文件。
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
from distutils.core import setup
setup(
name='tractorbeam',
version='0.1.0',
url='http://starfleet.org/tractorbeam/',
description='Pull beer out of the fridge while sitting on the couch.',
author='James T. Kirk',
author_email= 'jkirk@starfleet.org',
packages=['tractorbeam'],
package_data={
'tractorbeam': [
'locale/*.po',
'locale/*.mo', # How to compile on the fly?
]
},
install_requires=[
'requests'
]
)
提前致謝!
我知道這個問題開始有點老了,但是如果有人還在尋找答案:可以在setup.py
中添加一個函數來編譯po文件並返回data_files
列表 。 我沒有選擇將它們包含在package_data
因為data_files
的描述看起來更合適:
配置文件, 消息目錄 ,數據文件,以及不適合以前類別的任何內容。
當然,您只能將此列表附加到您已經使用的列表,但假設您只在data_files中添加這些mo文件,您可以編寫:
setup(
.
.
.
data_files=create_mo_files(),
.
.
.
)
有關您的信息,這是我使用的函數create_mo_files()
。 我並不假裝它是最好的實現方式。 我把它放在這里是因為它看起來很有用並且很容易適應。 請注意,它比您需要的更加復雜,因為它不假設每個目錄只編譯一個po文件,而是處理幾個; 另請注意,它假設所有po文件都位於locale/language/LC_MESSAGES/*.po
,您必須更改它以滿足您的需求:
def create_mo_files():
data_files = []
localedir = 'relative/path/to/locale'
po_dirs = [localedir + '/' + l + '/LC_MESSAGES/'
for l in next(os.walk(localedir))[1]]
for d in po_dirs:
mo_files = []
po_files = [f
for f in next(os.walk(d))[2]
if os.path.splitext(f)[1] == '.po']
for po_file in po_files:
filename, extension = os.path.splitext(po_file)
mo_file = filename + '.mo'
msgfmt_cmd = 'msgfmt {} -o {}'.format(d + po_file, d + mo_file)
subprocess.call(msgfmt_cmd, shell=True)
mo_files.append(d + mo_file)
data_files.append((d, mo_files))
return data_files
(你必須導入os
和subprocess
才能使用它)
我可以分享我的*.mo
文件編譯過程的版本:
import glob
import pathlib
import subprocess
(...)
PO_FILES = 'translations/locale/*/LC_MESSAGES/app_name.po'
def create_mo_files():
mo_files = []
prefix = 'app_name'
for po_path in glob.glob(str(pathlib.Path(prefix) / PO_FILES)):
mo = pathlib.Path(po_path.replace('.po', '.mo'))
subprocess.run(['msgfmt', '-o', str(mo), po_path], check=True)
mo_files.append(str(mo.relative_to(prefix)))
return mo_files
(...)
setup(
(...)
package_data = {
'app_name': [
(...)
] + create_mo_files(),
},
)
@edit評論:
例如pl
翻譯文件:
app_name/translations/locale/pl/LC_MESSAGES/app_name.po
function create_mo_files()
創建已編譯的app_name.mo
文件
app_name/translations/locale/pl/LC_MESSAGES/app_name.mo
然后在包構建這個app_name.mo
文件正在復制到
package/translations/locale/pl/LC_MESSAGES/app_name.po
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.