1 """build_pot command for setup.py"""
2 # pylint: disable=attribute-defined-outside-init,import-error,no-name-in-module
3 from __future__
import absolute_import
, division
, print_function
, unicode_literals
6 from distutils
import log
7 from distutils
.core
import Command
8 from distutils
.errors
import DistutilsOptionError
10 from . import build_util
13 class build_pot(Command
):
14 """Distutils command build_pot"""
16 description
= 'extract strings from python sources for translation'
20 # - short name (None if no short name),
23 ('build-dir=', 'd', 'Directory to put POT file'),
24 ('output=', 'o', 'POT filename'),
25 ('lang=', None, 'Comma-separated list of languages to update po-files'),
26 ('no-lang', 'N', "Don't update po-files"),
27 ('english', 'E', 'Regenerate English PO file'),
29 user_options
= build_util
.stringify_options(user_options
)
30 boolean_options
= build_util
.stringify_list(['no-lang', 'english'])
32 def initialize_options(self
):
39 def finalize_options(self
):
40 if self
.build_dir
is None:
43 self
.output
= (self
.distribution
.get_name() or 'messages') + '.pot'
44 if self
.lang
is not None:
45 self
.lang
= [i
.strip() for i
in self
.lang
.split(',') if i
.strip()]
46 if self
.lang
and self
.no_lang
:
47 raise DistutilsOptionError(
48 "You can't use options " "--lang=XXX and --no-lang in the same time."
52 """Run xgettext for project sources"""
53 # project name based on `name` argument in setup() call
54 prj_name
= self
.distribution
.get_name()
56 if self
.build_dir
!= '.':
57 fullname
= os
.path
.join(self
.build_dir
, self
.output
)
59 fullname
= self
.output
60 log
.info('Generate POT file: ' + fullname
)
61 if not os
.path
.isdir(self
.build_dir
):
62 log
.info('Make directory: ' + self
.build_dir
)
63 os
.makedirs(self
.build_dir
)
78 cmd
.extend(glob
.glob('bin/git-*'))
79 cmd
.extend(glob
.glob('share/git-cola/bin/git-*'))
80 cmd
.extend(glob
.glob('cola/*.py'))
81 cmd
.extend(glob
.glob('cola/*/*.py'))
85 # regenerate english PO
87 log
.info('Regenerating English PO file...')
89 en_po
= prj_name
+ '-' + 'en.po'
99 os
.path
.join(self
.build_dir
, self
.output
),
101 os
.path
.join(self
.build_dir
, en_po
),
104 # search and update all po-files
107 for po
in glob
.glob(os
.path
.join(self
.build_dir
, '*.po')):
108 if self
.lang
is not None:
109 po_lang
= os
.path
.splitext(os
.path
.basename(po
))[0]
110 if prj_name
and po_lang
.startswith(prj_name
+ '-'):
111 po_lang
= po_lang
[5:]
112 if po_lang
not in self
.lang
:
120 '--no-fuzzy-matching',
128 # force LF line-endings
129 log
.info('%s --> %s' % (new_po
, po
))
130 _force_LF(new_po
, po
)
134 def _force_LF(src
, dst
=None):
135 with
open(src
, 'rb') as f
:
136 content
= f
.read().decode('utf-8')
141 f
.write(build_util
.encode(content
))