1 """build_mo 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
8 from setuptools
import Command
10 from . import build_util
11 from .build_util
import newer
12 from .build_util
import which
15 class build_mo(Command
):
16 """Subcommand of build command: build_mo"""
18 description
= 'compile po files to mo files'
22 # - short name (None if no short name),
25 ('build-dir=', 'd', 'Directory to build locale files'),
26 ('output-base=', 'o', 'mo-files base name'),
27 ('source-dir=', None, 'Directory with sources po files'),
28 ('force', 'f', 'Force creation of mo files'),
29 ('lang=', None, 'Comma-separated list of languages to process'),
31 user_options
= build_util
.stringify_options(user_options
)
32 boolean_options
= build_util
.stringify_list(['force'])
34 def initialize_options(self
):
36 self
.output_base
= None
37 self
.source_dir
= None
41 def finalize_options(self
):
42 self
.set_undefined_options('build', ('force', 'force'))
43 self
.prj_name
= self
.distribution
.get_name()
44 if self
.build_dir
is None:
45 self
.build_dir
= os
.path
.join('share', 'locale')
46 if not self
.output_base
:
47 self
.output_base
= self
.prj_name
or 'messages'
48 if self
.source_dir
is None:
49 self
.source_dir
= 'po'
52 re_po
= re
.compile(r
'^(?:%s-)?([a-zA-Z_]+)\.po$' % self
.prj_name
)
54 re_po
= re
.compile(r
'^([a-zA-Z_]+)\.po$')
56 for i
in os
.listdir(self
.source_dir
):
59 self
.lang
.append(mo
.group(1))
61 self
.lang
= [i
.strip() for i
in self
.lang
.split(',') if i
.strip()]
64 """Run msgfmt for each language"""
68 if which('msgfmt') is None:
69 self
.warn('GNU gettext msgfmt utility not found!')
70 self
.warn('Compilation of .po files has been skipped.')
74 if which('msginit') is None:
75 self
.warn('GNU gettext msginit utility not found!')
76 self
.warn('Skip creating English PO file.')
78 self
.debug_print('Creating English PO file...')
79 pot
= (self
.prj_name
or 'messages') + '.pot'
81 en_po
= '%s-en.po' % self
.prj_name
84 output
= os
.path
.join(self
.source_dir
, en_po
)
93 os
.path
.join(self
.source_dir
, pot
),
99 basename
= self
.output_base
100 if not basename
.endswith('.mo'):
105 po_prefix
= self
.prj_name
+ '-'
106 for lang
in self
.lang
:
107 po
= os
.path
.join(self
.source_dir
, lang
+ '.po')
108 if not os
.path
.isfile(po
):
109 po
= os
.path
.join(self
.source_dir
, po_prefix
+ lang
+ '.po')
110 dir_
= os
.path
.join(self
.build_dir
, lang
, 'LC_MESSAGES')
112 mo
= os
.path
.join(dir_
, basename
)
113 if self
.force
or newer(po
, mo
):
114 self
.debug_print('Compile: %s -> %s' % (po
, mo
))
115 self
.spawn(['msgfmt', '--output-file', mo
, po
])
117 def get_outputs(self
):