簡體   English   中英

如何在setup.py python腳本中編譯* .po gettext轉換

[英]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

(你必須導入ossubprocess才能使用它)

我可以分享我的*.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM