Files
git-cola/extras/build_pot.py
T
2018-10-20 23:03:17 -07:00

133 lines
4.4 KiB
Python

"""build_pot command for setup.py"""
# pylint: disable=attribute-defined-outside-init
# pylint: disable=no-name-in-module,import-error
from __future__ import absolute_import, division, unicode_literals
import os
import glob
from distutils import log
from distutils.core import Command
from distutils.errors import DistutilsOptionError
from . import build_util
class build_pot(Command):
"""Distutils command build_pot"""
description = 'extract strings from python sources for translation'
# List of options:
# - long name,
# - short name (None if no short name),
# - help string.
user_options = [('build-dir=', 'd', 'Directory to put POT file'),
('output=', 'o', 'POT filename'),
('lang=', None,
'Comma-separated list of languages to update po-files'),
('no-lang', 'N', "Don't update po-files"),
('english', 'E', 'Regenerate English PO file')]
user_options = build_util.stringify_options(user_options)
boolean_options = build_util.stringify_list(['no-lang', 'english'])
def initialize_options(self):
self.build_dir = None
self.output = None
self.lang = None
self.no_lang = False
self.english = False
def finalize_options(self):
if self.build_dir is None:
self.build_dir = 'po'
if not self.output:
self.output = (self.distribution.get_name() or 'messages') + '.pot'
if self.lang is not None:
self.lang = [i.strip() for i in self.lang.split(',') if i.strip()]
if self.lang and self.no_lang:
raise DistutilsOptionError(
"You can't use options "
"--lang=XXX and --no-lang in the same time.")
def run(self):
"""Run xgettext for project sources"""
# project name based on `name` argument in setup() call
prj_name = self.distribution.get_name()
# output file
if self.build_dir != '.':
fullname = os.path.join(self.build_dir, self.output)
else:
fullname = self.output
log.info('Generate POT file: ' + fullname)
if not os.path.isdir(self.build_dir):
log.info('Make directory: ' + self.build_dir)
os.makedirs(self.build_dir)
cmd = [
'xgettext',
'--language=Python',
'--keyword=N_',
'--no-wrap',
'--no-location',
'--omit-header',
'--sort-output',
'--output-dir', self.build_dir,
'--output', self.output,
]
cmd.extend(glob.glob('bin/git-*'))
cmd.extend(glob.glob('share/git-cola/bin/git-*'))
cmd.extend(glob.glob('cola/*.py'))
cmd.extend(glob.glob('cola/*/*.py'))
self.spawn(cmd)
_force_LF(fullname)
# regenerate english PO
if self.english:
log.info('Regenerating English PO file...')
if prj_name:
en_po = prj_name + '-' + 'en.po'
else:
en_po = 'en.po'
self.spawn([
'msginit',
'--no-translator',
'--locale', 'en',
'--input', os.path.join(self.build_dir, self.output),
'--output-file', os.path.join(self.build_dir, en_po)])
# search and update all po-files
if self.no_lang:
return
for po in glob.glob(os.path.join(self.build_dir, '*.po')):
if self.lang is not None:
po_lang = os.path.splitext(os.path.basename(po))[0]
if prj_name and po_lang.startswith(prj_name+'-'):
po_lang = po_lang[5:]
if po_lang not in self.lang:
continue
new_po = po + '.new'
self.spawn([
'msgmerge',
'--no-location',
'--no-wrap',
'--sort-output',
'--output-file', new_po,
po, fullname])
# force LF line-endings
log.info('%s --> %s' % (new_po, po))
_force_LF(new_po, po)
os.unlink(new_po)
def _force_LF(src, dst=None):
f = open(src, 'rU')
try:
content = f.read()
finally:
f.close()
if dst is None:
dst = src
f = open(dst, 'wb')
try:
f.write(build_util.encode(content))
finally:
f.close()