Mercurial > babel > mirror
annotate babel/messages/frontend.py @ 602:7a8ee579f31e trunk
"update" command now supports "--width" option (#284)
author | fschwarz |
---|---|
date | Mon, 20 Aug 2012 20:27:35 +0000 |
parents | 3eeaadb290be |
children | bf5d10a56bbe |
rev | line source |
---|---|
62
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
1 #!/usr/bin/env python |
1 | 2 # -*- coding: utf-8 -*- |
3 # | |
530 | 4 # Copyright (C) 2007-2011 Edgewall Software |
1 | 5 # All rights reserved. |
6 # | |
7 # This software is licensed as described in the file COPYING, which | |
8 # you should have received as part of this distribution. The terms | |
9 # are also available at http://babel.edgewall.org/wiki/License. | |
10 # | |
11 # This software consists of voluntary contributions made by many | |
12 # individuals. For the exact contribution history, see the revision | |
13 # history and logs, available at http://babel.edgewall.org/log/. | |
14 | |
15 """Frontends for the message extraction functionality.""" | |
16 | |
48
22b90b3b161a
Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents:
47
diff
changeset
|
17 from ConfigParser import RawConfigParser |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
18 from datetime import datetime |
1 | 19 from distutils import log |
20 from distutils.cmd import Command | |
49
37bd476dafe4
Support a `message_extractors` keyword argument directly in `setup()`. Closes #4.
cmlenz
parents:
48
diff
changeset
|
21 from distutils.errors import DistutilsOptionError, DistutilsSetupError |
298
03b4ed33d413
When using sys.stdout with a pipe or redirection the sys.stdout.encoding value
jruigrok
parents:
290
diff
changeset
|
22 from locale import getpreferredencoding |
232 | 23 import logging |
1 | 24 from optparse import OptionParser |
25 import os | |
197
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
26 import shutil |
49
37bd476dafe4
Support a `message_extractors` keyword argument directly in `setup()`. Closes #4.
cmlenz
parents:
48
diff
changeset
|
27 from StringIO import StringIO |
1 | 28 import sys |
197
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
29 import tempfile |
1 | 30 |
31 from babel import __version__ as VERSION | |
185
6503a227ba93
Add a command-line option that prints out all available locales. Closes #24.
cmlenz
parents:
181
diff
changeset
|
32 from babel import Locale, localedata |
51
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
33 from babel.core import UnknownLocaleError |
56
f40fc143439c
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
55
diff
changeset
|
34 from babel.messages.catalog import Catalog |
54
7dbcbc3f07e0
Rename the `babel.catalog` package to `babel.messages` for consistency with the other package names.
cmlenz
parents:
52
diff
changeset
|
35 from babel.messages.extract import extract_from_dir, DEFAULT_KEYWORDS, \ |
7dbcbc3f07e0
Rename the `babel.catalog` package to `babel.messages` for consistency with the other package names.
cmlenz
parents:
52
diff
changeset
|
36 DEFAULT_MAPPING |
160 | 37 from babel.messages.mofile import write_mo |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
38 from babel.messages.pofile import read_po, write_po |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
39 from babel.util import odict, LOCALTZ |
1 | 40 |
178
749c0f6863bc
Minor change to what symbols are ?exported?, primarily for the generated docs.
cmlenz
parents:
177
diff
changeset
|
41 __all__ = ['CommandLineInterface', 'compile_catalog', 'extract_messages', |
234 | 42 'init_catalog', 'check_message_extractors', 'update_catalog'] |
1 | 43 __docformat__ = 'restructuredtext en' |
44 | |
45 | |
160 | 46 class compile_catalog(Command): |
47 """Catalog compilation command for use in ``setup.py`` scripts. | |
48 | |
49 If correctly installed, this command is available to Setuptools-using | |
50 setup scripts automatically. For projects using plain old ``distutils``, | |
51 the command needs to be registered explicitly in ``setup.py``:: | |
52 | |
53 from babel.messages.frontend import compile_catalog | |
54 | |
55 setup( | |
56 ... | |
169 | 57 cmdclass = {'compile_catalog': compile_catalog} |
160 | 58 ) |
59 | |
234 | 60 :since: version 0.9 |
160 | 61 :see: `Integrating new distutils commands <http://docs.python.org/dist/node32.html>`_ |
62 :see: `setuptools <http://peak.telecommunity.com/DevCenter/setuptools>`_ | |
63 """ | |
64 | |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
65 description = 'compile message catalogs to binary MO files' |
160 | 66 user_options = [ |
67 ('domain=', 'D', | |
68 "domain of PO file (default 'messages')"), | |
69 ('directory=', 'd', | |
70 'path to base directory containing the catalogs'), | |
71 ('input-file=', 'i', | |
72 'name of the input file'), | |
73 ('output-file=', 'o', | |
74 "name of the output file (default " | |
75 "'<output_dir>/<locale>/LC_MESSAGES/<domain>.po')"), | |
76 ('locale=', 'l', | |
77 'locale of the catalog to compile'), | |
78 ('use-fuzzy', 'f', | |
79 'also include fuzzy translations'), | |
207 | 80 ('statistics', None, |
81 'print statistics about translations') | |
160 | 82 ] |
207 | 83 boolean_options = ['use-fuzzy', 'statistics'] |
160 | 84 |
85 def initialize_options(self): | |
86 self.domain = 'messages' | |
87 self.directory = None | |
88 self.input_file = None | |
89 self.output_file = None | |
90 self.locale = None | |
91 self.use_fuzzy = False | |
207 | 92 self.statistics = False |
160 | 93 |
94 def finalize_options(self): | |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
95 if not self.input_file and not self.directory: |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
96 raise DistutilsOptionError('you must specify either the input file ' |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
97 'or the base directory') |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
98 if not self.output_file and not self.directory: |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
99 raise DistutilsOptionError('you must specify either the input file ' |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
100 'or the base directory') |
160 | 101 |
102 def run(self): | |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
103 po_files = [] |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
104 mo_files = [] |
175
5d32098d8352
Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents:
170
diff
changeset
|
105 |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
106 if not self.input_file: |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
107 if self.locale: |
331
afc5070a623c
Fix message catalog compilation for locales with more than two plural forms. Closes #95. Many thanks to Victor Safronovich for the patch.
cmlenz
parents:
317
diff
changeset
|
108 po_files.append((self.locale, |
afc5070a623c
Fix message catalog compilation for locales with more than two plural forms. Closes #95. Many thanks to Victor Safronovich for the patch.
cmlenz
parents:
317
diff
changeset
|
109 os.path.join(self.directory, self.locale, |
afc5070a623c
Fix message catalog compilation for locales with more than two plural forms. Closes #95. Many thanks to Victor Safronovich for the patch.
cmlenz
parents:
317
diff
changeset
|
110 'LC_MESSAGES', |
afc5070a623c
Fix message catalog compilation for locales with more than two plural forms. Closes #95. Many thanks to Victor Safronovich for the patch.
cmlenz
parents:
317
diff
changeset
|
111 self.domain + '.po'))) |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
112 mo_files.append(os.path.join(self.directory, self.locale, |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
113 'LC_MESSAGES', |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
114 self.domain + '.mo')) |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
115 else: |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
116 for locale in os.listdir(self.directory): |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
117 po_file = os.path.join(self.directory, locale, |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
118 'LC_MESSAGES', self.domain + '.po') |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
119 if os.path.exists(po_file): |
331
afc5070a623c
Fix message catalog compilation for locales with more than two plural forms. Closes #95. Many thanks to Victor Safronovich for the patch.
cmlenz
parents:
317
diff
changeset
|
120 po_files.append((locale, po_file)) |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
121 mo_files.append(os.path.join(self.directory, locale, |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
122 'LC_MESSAGES', |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
123 self.domain + '.mo')) |
170
3f9d9268537d
Allow the compile catalog frontends to compile all available locales.
palgarvio
parents:
169
diff
changeset
|
124 else: |
331
afc5070a623c
Fix message catalog compilation for locales with more than two plural forms. Closes #95. Many thanks to Victor Safronovich for the patch.
cmlenz
parents:
317
diff
changeset
|
125 po_files.append((self.locale, self.input_file)) |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
126 if self.output_file: |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
127 mo_files.append(self.output_file) |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
128 else: |
288
b6efe6a8e2ec
Fix error in `compile_catalog` distutils command. Closes #65.
cmlenz
parents:
279
diff
changeset
|
129 mo_files.append(os.path.join(self.directory, self.locale, |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
130 'LC_MESSAGES', |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
131 self.domain + '.mo')) |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
132 |
208
d17f4b876f95
Make frontends that make use of a ''loop all'' fail if no message catalogs are found.
palgarvio
parents:
207
diff
changeset
|
133 if not po_files: |
d17f4b876f95
Make frontends that make use of a ''loop all'' fail if no message catalogs are found.
palgarvio
parents:
207
diff
changeset
|
134 raise DistutilsOptionError('no message catalogs found') |
d17f4b876f95
Make frontends that make use of a ''loop all'' fail if no message catalogs are found.
palgarvio
parents:
207
diff
changeset
|
135 |
331
afc5070a623c
Fix message catalog compilation for locales with more than two plural forms. Closes #95. Many thanks to Victor Safronovich for the patch.
cmlenz
parents:
317
diff
changeset
|
136 for idx, (locale, po_file) in enumerate(po_files): |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
137 mo_file = mo_files[idx] |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
138 infile = open(po_file, 'r') |
170
3f9d9268537d
Allow the compile catalog frontends to compile all available locales.
palgarvio
parents:
169
diff
changeset
|
139 try: |
331
afc5070a623c
Fix message catalog compilation for locales with more than two plural forms. Closes #95. Many thanks to Victor Safronovich for the patch.
cmlenz
parents:
317
diff
changeset
|
140 catalog = read_po(infile, locale) |
170
3f9d9268537d
Allow the compile catalog frontends to compile all available locales.
palgarvio
parents:
169
diff
changeset
|
141 finally: |
3f9d9268537d
Allow the compile catalog frontends to compile all available locales.
palgarvio
parents:
169
diff
changeset
|
142 infile.close() |
175
5d32098d8352
Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents:
170
diff
changeset
|
143 |
207 | 144 if self.statistics: |
145 translated = 0 | |
146 for message in list(catalog)[1:]: | |
147 if message.string: | |
148 translated +=1 | |
317 | 149 percentage = 0 |
150 if len(catalog): | |
151 percentage = translated * 100 // len(catalog) | |
231
052d29963c1c
Use proper logging in distutils `compile_catalog` command.
cmlenz
parents:
220
diff
changeset
|
152 log.info('%d of %d messages (%d%%) translated in %r', |
317 | 153 translated, len(catalog), percentage, po_file) |
207 | 154 |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
155 if catalog.fuzzy and not self.use_fuzzy: |
231
052d29963c1c
Use proper logging in distutils `compile_catalog` command.
cmlenz
parents:
220
diff
changeset
|
156 log.warn('catalog %r is marked as fuzzy, skipping', po_file) |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
157 continue |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
158 |
220
97b4b289e792
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
159 for message, errors in catalog.check(): |
97b4b289e792
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
160 for error in errors: |
231
052d29963c1c
Use proper logging in distutils `compile_catalog` command.
cmlenz
parents:
220
diff
changeset
|
161 log.error('error: %s:%d: %s', po_file, message.lineno, |
052d29963c1c
Use proper logging in distutils `compile_catalog` command.
cmlenz
parents:
220
diff
changeset
|
162 error) |
220
97b4b289e792
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
163 |
231
052d29963c1c
Use proper logging in distutils `compile_catalog` command.
cmlenz
parents:
220
diff
changeset
|
164 log.info('compiling catalog %r to %r', po_file, mo_file) |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
165 |
279 | 166 outfile = open(mo_file, 'wb') |
170
3f9d9268537d
Allow the compile catalog frontends to compile all available locales.
palgarvio
parents:
169
diff
changeset
|
167 try: |
3f9d9268537d
Allow the compile catalog frontends to compile all available locales.
palgarvio
parents:
169
diff
changeset
|
168 write_mo(outfile, catalog, use_fuzzy=self.use_fuzzy) |
3f9d9268537d
Allow the compile catalog frontends to compile all available locales.
palgarvio
parents:
169
diff
changeset
|
169 finally: |
3f9d9268537d
Allow the compile catalog frontends to compile all available locales.
palgarvio
parents:
169
diff
changeset
|
170 outfile.close() |
160 | 171 |
172 | |
1 | 173 class extract_messages(Command): |
174 """Message extraction command for use in ``setup.py`` scripts. | |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
175 |
1 | 176 If correctly installed, this command is available to Setuptools-using |
177 setup scripts automatically. For projects using plain old ``distutils``, | |
178 the command needs to be registered explicitly in ``setup.py``:: | |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
179 |
54
7dbcbc3f07e0
Rename the `babel.catalog` package to `babel.messages` for consistency with the other package names.
cmlenz
parents:
52
diff
changeset
|
180 from babel.messages.frontend import extract_messages |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
181 |
1 | 182 setup( |
183 ... | |
184 cmdclass = {'extract_messages': extract_messages} | |
185 ) | |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
186 |
1 | 187 :see: `Integrating new distutils commands <http://docs.python.org/dist/node32.html>`_ |
188 :see: `setuptools <http://peak.telecommunity.com/DevCenter/setuptools>`_ | |
189 """ | |
190 | |
191 description = 'extract localizable strings from the project code' | |
192 user_options = [ | |
193 ('charset=', None, | |
194 'charset to use in the output file'), | |
195 ('keywords=', 'k', | |
10
4130d9c6cb34
Both Babel's [source:trunk/babel/catalog/frontend.py frontend] and [source:trunk/babel/catalog/extract.py extract] now handle keyword indices. Also added an extra boolean flag so that the default keywords defined by Babel are not included in the keywords to search for when extracting strings.
palgarvio
parents:
7
diff
changeset
|
196 'space-separated list of keywords to look for in addition to the ' |
1 | 197 'defaults'), |
10
4130d9c6cb34
Both Babel's [source:trunk/babel/catalog/frontend.py frontend] and [source:trunk/babel/catalog/extract.py extract] now handle keyword indices. Also added an extra boolean flag so that the default keywords defined by Babel are not included in the keywords to search for when extracting strings.
palgarvio
parents:
7
diff
changeset
|
198 ('no-default-keywords', None, |
12
e6ba3e878b10
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
199 'do not include the default keywords'), |
47
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
200 ('mapping-file=', 'F', |
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
201 'path to the mapping configuration file'), |
1 | 202 ('no-location', None, |
203 'do not include location comments with filename and line number'), | |
204 ('omit-header', None, | |
205 'do not include msgid "" entry in header'), | |
5
132526dcd074
* The creation-date header in generated PO files now includes the timezone offset.
cmlenz
parents:
1
diff
changeset
|
206 ('output-file=', 'o', |
1 | 207 'name of the output file'), |
23 | 208 ('width=', 'w', |
24
b09e90803d1b
Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents:
23
diff
changeset
|
209 'set output line width (default 76)'), |
23 | 210 ('no-wrap', None, |
24
b09e90803d1b
Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents:
23
diff
changeset
|
211 'do not break long message lines, longer than the output line width, ' |
58 | 212 'into several lines'), |
71 | 213 ('sort-output', None, |
214 'generate sorted output (default False)'), | |
215 ('sort-by-file', None, | |
216 'sort output by file location (default False)'), | |
78
d0d8d6cd8601
Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents:
71
diff
changeset
|
217 ('msgid-bugs-address=', None, |
d0d8d6cd8601
Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents:
71
diff
changeset
|
218 'set report address for msgid'), |
79
450ac2291ca5
Implemented item 4 from #12. Set the copyright holder in the output.
palgarvio
parents:
78
diff
changeset
|
219 ('copyright-holder=', None, |
450ac2291ca5
Implemented item 4 from #12. Set the copyright holder in the output.
palgarvio
parents:
78
diff
changeset
|
220 'set copyright holder in output'), |
80
116e34b8cefa
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
79
diff
changeset
|
221 ('add-comments=', 'c', |
116e34b8cefa
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
79
diff
changeset
|
222 'place comment block with TAG (or those preceding keyword lines) in ' |
116e34b8cefa
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
79
diff
changeset
|
223 'output file. Seperate multiple TAGs with commas(,)'), |
338
b39145076d8a
Stripping of comment tags is optional now. If enabled it will strip the tags from all lines of a comment now.
aronacher
parents:
335
diff
changeset
|
224 ('strip-comments', None, |
b39145076d8a
Stripping of comment tags is optional now. If enabled it will strip the tags from all lines of a comment now.
aronacher
parents:
335
diff
changeset
|
225 'strip the comment TAGs from the comments.'), |
59 | 226 ('input-dirs=', None, |
57
d930a3dfbf3d
* The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents:
56
diff
changeset
|
227 'directories that should be scanned for messages'), |
1 | 228 ] |
23 | 229 boolean_options = [ |
71 | 230 'no-default-keywords', 'no-location', 'omit-header', 'no-wrap', |
338
b39145076d8a
Stripping of comment tags is optional now. If enabled it will strip the tags from all lines of a comment now.
aronacher
parents:
335
diff
changeset
|
231 'sort-output', 'sort-by-file', 'strip-comments' |
23 | 232 ] |
1 | 233 |
234 def initialize_options(self): | |
235 self.charset = 'utf-8' | |
117
e1dffa3423a0
Made new frontend tests more ''unit-y'', i.e. calling the APIs directly instead of launching the scripts.
cmlenz
parents:
112
diff
changeset
|
236 self.keywords = '' |
e1dffa3423a0
Made new frontend tests more ''unit-y'', i.e. calling the APIs directly instead of launching the scripts.
cmlenz
parents:
112
diff
changeset
|
237 self._keywords = DEFAULT_KEYWORDS.copy() |
12
e6ba3e878b10
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
238 self.no_default_keywords = False |
47
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
239 self.mapping_file = None |
1 | 240 self.no_location = False |
241 self.omit_header = False | |
242 self.output_file = None | |
57
d930a3dfbf3d
* The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents:
56
diff
changeset
|
243 self.input_dirs = None |
423
fb926f48efba
Now, the `--width` option, although with a default value of 76, it's not set to any value initially so that the `--no-wrap` option can be passed without throwing an error. Fixes #145.
palgarvio
parents:
417
diff
changeset
|
244 self.width = None |
47
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
245 self.no_wrap = False |
71 | 246 self.sort_output = False |
247 self.sort_by_file = False | |
78
d0d8d6cd8601
Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents:
71
diff
changeset
|
248 self.msgid_bugs_address = None |
79
450ac2291ca5
Implemented item 4 from #12. Set the copyright holder in the output.
palgarvio
parents:
78
diff
changeset
|
249 self.copyright_holder = None |
80
116e34b8cefa
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
79
diff
changeset
|
250 self.add_comments = None |
95
f9007588a860
Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents:
90
diff
changeset
|
251 self._add_comments = [] |
338
b39145076d8a
Stripping of comment tags is optional now. If enabled it will strip the tags from all lines of a comment now.
aronacher
parents:
335
diff
changeset
|
252 self.strip_comments = False |
1 | 253 |
254 def finalize_options(self): | |
23 | 255 if self.no_default_keywords and not self.keywords: |
24
b09e90803d1b
Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents:
23
diff
changeset
|
256 raise DistutilsOptionError('you must specify new keywords if you ' |
b09e90803d1b
Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents:
23
diff
changeset
|
257 'disable the default ones') |
12
e6ba3e878b10
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
258 if self.no_default_keywords: |
23 | 259 self._keywords = {} |
117
e1dffa3423a0
Made new frontend tests more ''unit-y'', i.e. calling the APIs directly instead of launching the scripts.
cmlenz
parents:
112
diff
changeset
|
260 if self.keywords: |
23 | 261 self._keywords.update(parse_keywords(self.keywords.split())) |
24
b09e90803d1b
Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents:
23
diff
changeset
|
262 |
117
e1dffa3423a0
Made new frontend tests more ''unit-y'', i.e. calling the APIs directly instead of launching the scripts.
cmlenz
parents:
112
diff
changeset
|
263 if not self.output_file: |
e1dffa3423a0
Made new frontend tests more ''unit-y'', i.e. calling the APIs directly instead of launching the scripts.
cmlenz
parents:
112
diff
changeset
|
264 raise DistutilsOptionError('no output file specified') |
23 | 265 if self.no_wrap and self.width: |
71 | 266 raise DistutilsOptionError("'--no-wrap' and '--width' are mutually " |
24
b09e90803d1b
Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents:
23
diff
changeset
|
267 "exclusive") |
423
fb926f48efba
Now, the `--width` option, although with a default value of 76, it's not set to any value initially so that the `--no-wrap` option can be passed without throwing an error. Fixes #145.
palgarvio
parents:
417
diff
changeset
|
268 if not self.no_wrap and not self.width: |
fb926f48efba
Now, the `--width` option, although with a default value of 76, it's not set to any value initially so that the `--no-wrap` option can be passed without throwing an error. Fixes #145.
palgarvio
parents:
417
diff
changeset
|
269 self.width = 76 |
fb926f48efba
Now, the `--width` option, although with a default value of 76, it's not set to any value initially so that the `--no-wrap` option can be passed without throwing an error. Fixes #145.
palgarvio
parents:
417
diff
changeset
|
270 elif self.width is not None: |
23 | 271 self.width = int(self.width) |
95
f9007588a860
Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents:
90
diff
changeset
|
272 |
71 | 273 if self.sort_output and self.sort_by_file: |
274 raise DistutilsOptionError("'--sort-output' and '--sort-by-file' " | |
275 "are mutually exclusive") | |
1 | 276 |
57
d930a3dfbf3d
* The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents:
56
diff
changeset
|
277 if not self.input_dirs: |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
278 self.input_dirs = dict.fromkeys([k.split('.',1)[0] |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
279 for k in self.distribution.packages |
57
d930a3dfbf3d
* The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents:
56
diff
changeset
|
280 ]).keys() |
95
f9007588a860
Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents:
90
diff
changeset
|
281 |
80
116e34b8cefa
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
79
diff
changeset
|
282 if self.add_comments: |
116e34b8cefa
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
79
diff
changeset
|
283 self._add_comments = self.add_comments.split(',') |
57
d930a3dfbf3d
* The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents:
56
diff
changeset
|
284 |
1 | 285 def run(self): |
62
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
286 mappings = self._get_mappings() |
1 | 287 outfile = open(self.output_file, 'w') |
288 try: | |
102
14a3d766a701
Project name and version, and the charset are available via the `Catalog` object, and do not need to be passed to `write_pot()`.
cmlenz
parents:
95
diff
changeset
|
289 catalog = Catalog(project=self.distribution.get_name(), |
14a3d766a701
Project name and version, and the charset are available via the `Catalog` object, and do not need to be passed to `write_pot()`.
cmlenz
parents:
95
diff
changeset
|
290 version=self.distribution.get_version(), |
14a3d766a701
Project name and version, and the charset are available via the `Catalog` object, and do not need to be passed to `write_pot()`.
cmlenz
parents:
95
diff
changeset
|
291 msgid_bugs_address=self.msgid_bugs_address, |
105
c62b68a0b65e
`Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents:
104
diff
changeset
|
292 copyright_holder=self.copyright_holder, |
102
14a3d766a701
Project name and version, and the charset are available via the `Catalog` object, and do not need to be passed to `write_pot()`.
cmlenz
parents:
95
diff
changeset
|
293 charset=self.charset) |
14a3d766a701
Project name and version, and the charset are available via the `Catalog` object, and do not need to be passed to `write_pot()`.
cmlenz
parents:
95
diff
changeset
|
294 |
62
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
295 for dirname, (method_map, options_map) in mappings.items(): |
57
d930a3dfbf3d
* The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents:
56
diff
changeset
|
296 def callback(filename, method, options): |
d930a3dfbf3d
* The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents:
56
diff
changeset
|
297 if method == 'ignore': |
d930a3dfbf3d
* The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents:
56
diff
changeset
|
298 return |
d930a3dfbf3d
* The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents:
56
diff
changeset
|
299 filepath = os.path.normpath(os.path.join(dirname, filename)) |
d930a3dfbf3d
* The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents:
56
diff
changeset
|
300 optstr = '' |
d930a3dfbf3d
* The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents:
56
diff
changeset
|
301 if options: |
d930a3dfbf3d
* The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents:
56
diff
changeset
|
302 optstr = ' (%s)' % ', '.join(['%s="%s"' % (k, v) for |
d930a3dfbf3d
* The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents:
56
diff
changeset
|
303 k, v in options.items()]) |
232 | 304 log.info('extracting messages from %s%s', filepath, optstr) |
47
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
305 |
57
d930a3dfbf3d
* The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents:
56
diff
changeset
|
306 extracted = extract_from_dir(dirname, method_map, options_map, |
117
e1dffa3423a0
Made new frontend tests more ''unit-y'', i.e. calling the APIs directly instead of launching the scripts.
cmlenz
parents:
112
diff
changeset
|
307 keywords=self._keywords, |
84
3ae316b58231
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
80
diff
changeset
|
308 comment_tags=self._add_comments, |
338
b39145076d8a
Stripping of comment tags is optional now. If enabled it will strip the tags from all lines of a comment now.
aronacher
parents:
335
diff
changeset
|
309 callback=callback, |
b39145076d8a
Stripping of comment tags is optional now. If enabled it will strip the tags from all lines of a comment now.
aronacher
parents:
335
diff
changeset
|
310 strip_comment_tags= |
b39145076d8a
Stripping of comment tags is optional now. If enabled it will strip the tags from all lines of a comment now.
aronacher
parents:
335
diff
changeset
|
311 self.strip_comments) |
569
1b801a0cb2cb
Support for context-aware methods during message extraction (fixes #229, patch by David Rios)
fschwarz
parents:
563
diff
changeset
|
312 for filename, lineno, message, comments, context in extracted: |
57
d930a3dfbf3d
* The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents:
56
diff
changeset
|
313 filepath = os.path.normpath(os.path.join(dirname, filename)) |
80
116e34b8cefa
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
79
diff
changeset
|
314 catalog.add(message, None, [(filepath, lineno)], |
569
1b801a0cb2cb
Support for context-aware methods during message extraction (fixes #229, patch by David Rios)
fschwarz
parents:
563
diff
changeset
|
315 auto_comments=comments, context=context) |
24
b09e90803d1b
Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents:
23
diff
changeset
|
316 |
51
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
317 log.info('writing PO template file to %s' % self.output_file) |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
318 write_po(outfile, catalog, width=self.width, |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
319 no_location=self.no_location, |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
320 omit_header=self.omit_header, |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
321 sort_output=self.sort_output, |
105
c62b68a0b65e
`Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents:
104
diff
changeset
|
322 sort_by_file=self.sort_by_file) |
1 | 323 finally: |
324 outfile.close() | |
325 | |
62
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
326 def _get_mappings(self): |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
327 mappings = {} |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
328 |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
329 if self.mapping_file: |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
330 fileobj = open(self.mapping_file, 'U') |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
331 try: |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
332 method_map, options_map = parse_mapping(fileobj) |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
333 for dirname in self.input_dirs: |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
334 mappings[dirname] = method_map, options_map |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
335 finally: |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
336 fileobj.close() |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
337 |
123
31ca37101a24
Make the check for the `message_extractors` setup keyword more robst.
cmlenz
parents:
120
diff
changeset
|
338 elif getattr(self.distribution, 'message_extractors', None): |
62
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
339 message_extractors = self.distribution.message_extractors |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
340 for dirname, mapping in message_extractors.items(): |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
341 if isinstance(mapping, basestring): |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
342 method_map, options_map = parse_mapping(StringIO(mapping)) |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
343 else: |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
344 method_map, options_map = [], {} |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
345 for pattern, method, options in mapping: |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
346 method_map.append((pattern, method)) |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
347 options_map[pattern] = options or {} |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
348 mappings[dirname] = method_map, options_map |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
349 |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
350 else: |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
351 for dirname in self.input_dirs: |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
352 mappings[dirname] = DEFAULT_MAPPING, {} |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
353 |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
354 return mappings |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
355 |
1 | 356 |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
357 def check_message_extractors(dist, name, value): |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
358 """Validate the ``message_extractors`` keyword argument to ``setup()``. |
47
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
359 |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
360 :param dist: the distutils/setuptools ``Distribution`` object |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
361 :param name: the name of the keyword argument (should always be |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
362 "message_extractors") |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
363 :param value: the value of the keyword argument |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
364 :raise `DistutilsSetupError`: if the value is not valid |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
365 :see: `Adding setup() arguments |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
366 <http://peak.telecommunity.com/DevCenter/setuptools#adding-setup-arguments>`_ |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
367 """ |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
368 assert name == 'message_extractors' |
62
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
369 if not isinstance(value, dict): |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
370 raise DistutilsSetupError('the value of the "message_extractors" ' |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
371 'parameter must be a dictionary') |
1 | 372 |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
373 |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
374 class init_catalog(Command): |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
375 """New catalog initialization command for use in ``setup.py`` scripts. |
51
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
376 |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
377 If correctly installed, this command is available to Setuptools-using |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
378 setup scripts automatically. For projects using plain old ``distutils``, |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
379 the command needs to be registered explicitly in ``setup.py``:: |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
380 |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
381 from babel.messages.frontend import init_catalog |
51
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
382 |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
383 setup( |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
384 ... |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
385 cmdclass = {'init_catalog': init_catalog} |
51
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
386 ) |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
387 |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
388 :see: `Integrating new distutils commands <http://docs.python.org/dist/node32.html>`_ |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
389 :see: `setuptools <http://peak.telecommunity.com/DevCenter/setuptools>`_ |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
390 """ |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
391 |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
392 description = 'create a new catalog based on a POT file' |
51
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
393 user_options = [ |
55
a258e4015eb6
`new_catalog` now accepts another argument, `--domain`, which is used to build the output file path, which now is of the form `<output_dir>/<locale>/<domain>.po`, the correct form.
palgarvio
parents:
54
diff
changeset
|
394 ('domain=', 'D', |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
395 "domain of PO file (default 'messages')"), |
51
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
396 ('input-file=', 'i', |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
397 'name of the input file'), |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
398 ('output-dir=', 'd', |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
399 'path to output directory'), |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
400 ('output-file=', 'o', |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
401 "name of the output file (default " |
87
72c7ac384609
Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents:
86
diff
changeset
|
402 "'<output_dir>/<locale>/LC_MESSAGES/<domain>.po')"), |
51
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
403 ('locale=', 'l', |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
404 'locale for the new localized catalog'), |
600 | 405 ('width=', 'w', |
406 'set output line width (default 76)'), | |
574
99c48a6ca1d6
add "--no-wrap" option for init/update commands (#289)
fschwarz
parents:
569
diff
changeset
|
407 ('no-wrap', None, |
99c48a6ca1d6
add "--no-wrap" option for init/update commands (#289)
fschwarz
parents:
569
diff
changeset
|
408 'do not break long message lines, longer than the output line width, ' |
99c48a6ca1d6
add "--no-wrap" option for init/update commands (#289)
fschwarz
parents:
569
diff
changeset
|
409 'into several lines'), |
51
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
410 ] |
574
99c48a6ca1d6
add "--no-wrap" option for init/update commands (#289)
fschwarz
parents:
569
diff
changeset
|
411 boolean_options = ['no-wrap'] |
51
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
412 |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
413 def initialize_options(self): |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
414 self.output_dir = None |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
415 self.output_file = None |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
416 self.input_file = None |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
417 self.locale = None |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
418 self.domain = 'messages' |
574
99c48a6ca1d6
add "--no-wrap" option for init/update commands (#289)
fschwarz
parents:
569
diff
changeset
|
419 self.no_wrap = False |
99c48a6ca1d6
add "--no-wrap" option for init/update commands (#289)
fschwarz
parents:
569
diff
changeset
|
420 self.width = None |
51
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
421 |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
422 def finalize_options(self): |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
423 if not self.input_file: |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
424 raise DistutilsOptionError('you must specify the input file') |
87
72c7ac384609
Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents:
86
diff
changeset
|
425 |
51
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
426 if not self.locale: |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
427 raise DistutilsOptionError('you must provide a locale for the ' |
87
72c7ac384609
Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents:
86
diff
changeset
|
428 'new catalog') |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
429 try: |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
430 self._locale = Locale.parse(self.locale) |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
431 except UnknownLocaleError, e: |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
432 raise DistutilsOptionError(e) |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
433 |
51
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
434 if not self.output_file and not self.output_dir: |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
435 raise DistutilsOptionError('you must specify the output directory') |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
436 if not self.output_file: |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
437 self.output_file = os.path.join(self.output_dir, self.locale, |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
438 'LC_MESSAGES', self.domain + '.po') |
87
72c7ac384609
Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents:
86
diff
changeset
|
439 |
72c7ac384609
Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents:
86
diff
changeset
|
440 if not os.path.exists(os.path.dirname(self.output_file)): |
72c7ac384609
Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents:
86
diff
changeset
|
441 os.makedirs(os.path.dirname(self.output_file)) |
601
3eeaadb290be
raise exception if setuptools integration for init catalog uses both 'width' and 'no-wrap' parameter
fschwarz
parents:
600
diff
changeset
|
442 if self.no_wrap and self.width: |
3eeaadb290be
raise exception if setuptools integration for init catalog uses both 'width' and 'no-wrap' parameter
fschwarz
parents:
600
diff
changeset
|
443 raise DistutilsOptionError("'--no-wrap' and '--width' are mutually " |
3eeaadb290be
raise exception if setuptools integration for init catalog uses both 'width' and 'no-wrap' parameter
fschwarz
parents:
600
diff
changeset
|
444 "exclusive") |
600 | 445 if not self.no_wrap and not self.width: |
574
99c48a6ca1d6
add "--no-wrap" option for init/update commands (#289)
fschwarz
parents:
569
diff
changeset
|
446 self.width = 76 |
600 | 447 elif self.width is not None: |
448 self.width = int(self.width) | |
51
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
449 |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
450 def run(self): |
90 | 451 log.info('creating catalog %r based on %r', self.output_file, |
55
a258e4015eb6
`new_catalog` now accepts another argument, `--domain`, which is used to build the output file path, which now is of the form `<output_dir>/<locale>/<domain>.po`, the correct form.
palgarvio
parents:
54
diff
changeset
|
452 self.input_file) |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
453 |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
454 infile = open(self.input_file, 'r') |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
455 try: |
370
bc18179832b7
We no longer neglect `catalog.plurals`. Added tests for it. Fixes #120.
palgarvio
parents:
338
diff
changeset
|
456 # Although reading from the catalog template, read_po must be fed |
563 | 457 # the locale in order to correctly calculate plurals |
370
bc18179832b7
We no longer neglect `catalog.plurals`. Added tests for it. Fixes #120.
palgarvio
parents:
338
diff
changeset
|
458 catalog = read_po(infile, locale=self.locale) |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
459 finally: |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
460 infile.close() |
87
72c7ac384609
Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents:
86
diff
changeset
|
461 |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
462 catalog.locale = self._locale |
251 | 463 catalog.fuzzy = False |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
464 |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
465 outfile = open(self.output_file, 'w') |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
466 try: |
574
99c48a6ca1d6
add "--no-wrap" option for init/update commands (#289)
fschwarz
parents:
569
diff
changeset
|
467 write_po(outfile, catalog, width=self.width) |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
468 finally: |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
469 outfile.close() |
51
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
470 |
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
471 |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
472 class update_catalog(Command): |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
473 """Catalog merging command for use in ``setup.py`` scripts. |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
474 |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
475 If correctly installed, this command is available to Setuptools-using |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
476 setup scripts automatically. For projects using plain old ``distutils``, |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
477 the command needs to be registered explicitly in ``setup.py``:: |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
478 |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
479 from babel.messages.frontend import update_catalog |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
480 |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
481 setup( |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
482 ... |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
483 cmdclass = {'update_catalog': update_catalog} |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
484 ) |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
485 |
234 | 486 :since: version 0.9 |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
487 :see: `Integrating new distutils commands <http://docs.python.org/dist/node32.html>`_ |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
488 :see: `setuptools <http://peak.telecommunity.com/DevCenter/setuptools>`_ |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
489 """ |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
490 |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
491 description = 'update message catalogs from a POT file' |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
492 user_options = [ |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
493 ('domain=', 'D', |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
494 "domain of PO file (default 'messages')"), |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
495 ('input-file=', 'i', |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
496 'name of the input file'), |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
497 ('output-dir=', 'd', |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
498 'path to base directory containing the catalogs'), |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
499 ('output-file=', 'o', |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
500 "name of the output file (default " |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
501 "'<output_dir>/<locale>/LC_MESSAGES/<domain>.po')"), |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
502 ('locale=', 'l', |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
503 'locale of the catalog to compile'), |
602
7a8ee579f31e
"update" command now supports "--width" option (#284)
fschwarz
parents:
601
diff
changeset
|
504 ('width=', 'w', |
7a8ee579f31e
"update" command now supports "--width" option (#284)
fschwarz
parents:
601
diff
changeset
|
505 'set output line width (default 76)'), |
574
99c48a6ca1d6
add "--no-wrap" option for init/update commands (#289)
fschwarz
parents:
569
diff
changeset
|
506 ('no-wrap', None, |
99c48a6ca1d6
add "--no-wrap" option for init/update commands (#289)
fschwarz
parents:
569
diff
changeset
|
507 'do not break long message lines, longer than the output line width, ' |
99c48a6ca1d6
add "--no-wrap" option for init/update commands (#289)
fschwarz
parents:
569
diff
changeset
|
508 'into several lines'), |
191
c171a0041ad2
Add an option to the frontend commands for catalog updating that removes completely any obsolete messages, instead of putting them comments.
cmlenz
parents:
185
diff
changeset
|
509 ('ignore-obsolete=', None, |
200
1c778cccd330
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
197
diff
changeset
|
510 'whether to omit obsolete messages from the output'), |
1c778cccd330
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
197
diff
changeset
|
511 ('no-fuzzy-matching', 'N', |
1c778cccd330
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
197
diff
changeset
|
512 'do not use fuzzy matching'), |
1c778cccd330
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
197
diff
changeset
|
513 ('previous', None, |
1c778cccd330
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
197
diff
changeset
|
514 'keep previous msgids of translated messages') |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
515 ] |
200
1c778cccd330
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
197
diff
changeset
|
516 boolean_options = ['ignore_obsolete', 'no_fuzzy_matching', 'previous'] |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
517 |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
518 def initialize_options(self): |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
519 self.domain = 'messages' |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
520 self.input_file = None |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
521 self.output_dir = None |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
522 self.output_file = None |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
523 self.locale = None |
602
7a8ee579f31e
"update" command now supports "--width" option (#284)
fschwarz
parents:
601
diff
changeset
|
524 self.width = None |
574
99c48a6ca1d6
add "--no-wrap" option for init/update commands (#289)
fschwarz
parents:
569
diff
changeset
|
525 self.no_wrap = False |
191
c171a0041ad2
Add an option to the frontend commands for catalog updating that removes completely any obsolete messages, instead of putting them comments.
cmlenz
parents:
185
diff
changeset
|
526 self.ignore_obsolete = False |
200
1c778cccd330
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
197
diff
changeset
|
527 self.no_fuzzy_matching = False |
1c778cccd330
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
197
diff
changeset
|
528 self.previous = False |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
529 |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
530 def finalize_options(self): |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
531 if not self.input_file: |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
532 raise DistutilsOptionError('you must specify the input file') |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
533 if not self.output_file and not self.output_dir: |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
534 raise DistutilsOptionError('you must specify the output file or ' |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
535 'directory') |
196
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
536 if self.output_file and not self.locale: |
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
537 raise DistutilsOptionError('you must specify the locale') |
602
7a8ee579f31e
"update" command now supports "--width" option (#284)
fschwarz
parents:
601
diff
changeset
|
538 if self.no_wrap and self.width: |
7a8ee579f31e
"update" command now supports "--width" option (#284)
fschwarz
parents:
601
diff
changeset
|
539 raise DistutilsOptionError("'--no-wrap' and '--width' are mutually " |
7a8ee579f31e
"update" command now supports "--width" option (#284)
fschwarz
parents:
601
diff
changeset
|
540 "exclusive") |
7a8ee579f31e
"update" command now supports "--width" option (#284)
fschwarz
parents:
601
diff
changeset
|
541 if not self.no_wrap and not self.width: |
7a8ee579f31e
"update" command now supports "--width" option (#284)
fschwarz
parents:
601
diff
changeset
|
542 self.width = 76 |
7a8ee579f31e
"update" command now supports "--width" option (#284)
fschwarz
parents:
601
diff
changeset
|
543 elif self.width is not None: |
7a8ee579f31e
"update" command now supports "--width" option (#284)
fschwarz
parents:
601
diff
changeset
|
544 self.width = int(self.width) |
200
1c778cccd330
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
197
diff
changeset
|
545 if self.no_fuzzy_matching and self.previous: |
1c778cccd330
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
197
diff
changeset
|
546 self.previous = False |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
547 |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
548 def run(self): |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
549 po_files = [] |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
550 if not self.output_file: |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
551 if self.locale: |
196
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
552 po_files.append((self.locale, |
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
553 os.path.join(self.output_dir, self.locale, |
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
554 'LC_MESSAGES', |
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
555 self.domain + '.po'))) |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
556 else: |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
557 for locale in os.listdir(self.output_dir): |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
558 po_file = os.path.join(self.output_dir, locale, |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
559 'LC_MESSAGES', |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
560 self.domain + '.po') |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
561 if os.path.exists(po_file): |
196
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
562 po_files.append((locale, po_file)) |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
563 else: |
196
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
564 po_files.append((self.locale, self.output_file)) |
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
565 |
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
566 domain = self.domain |
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
567 if not domain: |
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
568 domain = os.path.splitext(os.path.basename(self.input_file))[0] |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
569 |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
570 infile = open(self.input_file, 'U') |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
571 try: |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
572 template = read_po(infile) |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
573 finally: |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
574 infile.close() |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
575 |
208
d17f4b876f95
Make frontends that make use of a ''loop all'' fail if no message catalogs are found.
palgarvio
parents:
207
diff
changeset
|
576 if not po_files: |
d17f4b876f95
Make frontends that make use of a ''loop all'' fail if no message catalogs are found.
palgarvio
parents:
207
diff
changeset
|
577 raise DistutilsOptionError('no message catalogs found') |
d17f4b876f95
Make frontends that make use of a ''loop all'' fail if no message catalogs are found.
palgarvio
parents:
207
diff
changeset
|
578 |
196
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
579 for locale, filename in po_files: |
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
580 log.info('updating catalog %r based on %r', filename, |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
581 self.input_file) |
196
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
582 infile = open(filename, 'U') |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
583 try: |
196
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
584 catalog = read_po(infile, locale=locale, domain=domain) |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
585 finally: |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
586 infile.close() |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
587 |
204 | 588 catalog.update(template, self.no_fuzzy_matching) |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
589 |
197
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
590 tmpname = os.path.join(os.path.dirname(filename), |
200
1c778cccd330
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
197
diff
changeset
|
591 tempfile.gettempprefix() + |
197
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
592 os.path.basename(filename)) |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
593 tmpfile = open(tmpname, 'w') |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
594 try: |
197
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
595 try: |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
596 write_po(tmpfile, catalog, |
200
1c778cccd330
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
197
diff
changeset
|
597 ignore_obsolete=self.ignore_obsolete, |
602
7a8ee579f31e
"update" command now supports "--width" option (#284)
fschwarz
parents:
601
diff
changeset
|
598 include_previous=self.previous, width=self.width) |
197
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
599 finally: |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
600 tmpfile.close() |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
601 except: |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
602 os.remove(tmpname) |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
603 raise |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
604 |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
605 try: |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
606 os.rename(tmpname, filename) |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
607 except OSError: |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
608 # We're probably on Windows, which doesn't support atomic |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
609 # renames, at least not through Python |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
610 # If the error is in fact due to a permissions problem, that |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
611 # same error is going to be raised from one of the following |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
612 # operations |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
613 os.remove(filename) |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
614 shutil.copy(tmpname, filename) |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
615 os.remove(tmpname) |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
616 |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
617 |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
618 class CommandLineInterface(object): |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
619 """Command-line interface. |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
620 |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
621 This class provides a simple command-line interface to the message |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
622 extraction and PO file generation functionality. |
51
d484eb9a70d5
Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents:
49
diff
changeset
|
623 """ |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
624 |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
625 usage = '%%prog %s [options] %s' |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
626 version = '%%prog %s' % VERSION |
161 | 627 commands = { |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
628 'compile': 'compile message catalogs to MO files', |
63
47353672f1a8
Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents:
62
diff
changeset
|
629 'extract': 'extract messages from source files and generate a POT file', |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
630 'init': 'create new message catalogs from a POT file', |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
631 'update': 'update existing message catalogs from a POT file' |
63
47353672f1a8
Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents:
62
diff
changeset
|
632 } |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
633 |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
634 def run(self, argv=sys.argv): |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
635 """Main entry point of the command-line interface. |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
636 |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
637 :param argv: list of arguments passed on the command-line |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
638 """ |
127 | 639 self.parser = OptionParser(usage=self.usage % ('command', '[args]'), |
185
6503a227ba93
Add a command-line option that prints out all available locales. Closes #24.
cmlenz
parents:
181
diff
changeset
|
640 version=self.version) |
63
47353672f1a8
Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents:
62
diff
changeset
|
641 self.parser.disable_interspersed_args() |
47353672f1a8
Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents:
62
diff
changeset
|
642 self.parser.print_help = self._help |
185
6503a227ba93
Add a command-line option that prints out all available locales. Closes #24.
cmlenz
parents:
181
diff
changeset
|
643 self.parser.add_option('--list-locales', dest='list_locales', |
6503a227ba93
Add a command-line option that prints out all available locales. Closes #24.
cmlenz
parents:
181
diff
changeset
|
644 action='store_true', |
6503a227ba93
Add a command-line option that prints out all available locales. Closes #24.
cmlenz
parents:
181
diff
changeset
|
645 help="print all known locales and exit") |
232 | 646 self.parser.add_option('-v', '--verbose', action='store_const', |
647 dest='loglevel', const=logging.DEBUG, | |
648 help='print as much as possible') | |
649 self.parser.add_option('-q', '--quiet', action='store_const', | |
650 dest='loglevel', const=logging.ERROR, | |
651 help='print as little as possible') | |
652 self.parser.set_defaults(list_locales=False, loglevel=logging.INFO) | |
185
6503a227ba93
Add a command-line option that prints out all available locales. Closes #24.
cmlenz
parents:
181
diff
changeset
|
653 |
63
47353672f1a8
Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents:
62
diff
changeset
|
654 options, args = self.parser.parse_args(argv[1:]) |
185
6503a227ba93
Add a command-line option that prints out all available locales. Closes #24.
cmlenz
parents:
181
diff
changeset
|
655 |
523
e5a2231ce176
shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents:
521
diff
changeset
|
656 self._configure_logging(options.loglevel) |
185
6503a227ba93
Add a command-line option that prints out all available locales. Closes #24.
cmlenz
parents:
181
diff
changeset
|
657 if options.list_locales: |
546
fd3bda2d3d34
rename babel.localedata.list() to ease Python 3 transition (fixes #250)
fschwarz
parents:
533
diff
changeset
|
658 identifiers = localedata.locale_identifiers() |
185
6503a227ba93
Add a command-line option that prints out all available locales. Closes #24.
cmlenz
parents:
181
diff
changeset
|
659 longest = max([len(identifier) for identifier in identifiers]) |
440
2e8fa2145a13
remove sorted and don't assume dict ordering (Python 2.3 & Jython compat)
pjenvey
parents:
429
diff
changeset
|
660 identifiers.sort() |
210
9c237f83d7cb
When parsing catalog headers, look for the content-type first, to be able to use a specified encoding on all other headers.
cmlenz
parents:
209
diff
changeset
|
661 format = u'%%-%ds %%s' % (longest + 1) |
440
2e8fa2145a13
remove sorted and don't assume dict ordering (Python 2.3 & Jython compat)
pjenvey
parents:
429
diff
changeset
|
662 for identifier in identifiers: |
185
6503a227ba93
Add a command-line option that prints out all available locales. Closes #24.
cmlenz
parents:
181
diff
changeset
|
663 locale = Locale.parse(identifier) |
267
385083341519
Default the encoding of output by the `pybabel --list-locales` command to ASCII with errors replaced, if the output stream has no encoding set. For a reason unknown to me I got an encoding error, but only when when running the output through a pipe on the shell.
cmlenz
parents:
251
diff
changeset
|
664 output = format % (identifier, locale.english_name) |
298
03b4ed33d413
When using sys.stdout with a pipe or redirection the sys.stdout.encoding value
jruigrok
parents:
290
diff
changeset
|
665 print output.encode(sys.stdout.encoding or |
03b4ed33d413
When using sys.stdout with a pipe or redirection the sys.stdout.encoding value
jruigrok
parents:
290
diff
changeset
|
666 getpreferredencoding() or |
03b4ed33d413
When using sys.stdout with a pipe or redirection the sys.stdout.encoding value
jruigrok
parents:
290
diff
changeset
|
667 'ascii', 'replace') |
185
6503a227ba93
Add a command-line option that prints out all available locales. Closes #24.
cmlenz
parents:
181
diff
changeset
|
668 return 0 |
6503a227ba93
Add a command-line option that prints out all available locales. Closes #24.
cmlenz
parents:
181
diff
changeset
|
669 |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
670 if not args: |
424
e24e6a4d3512
Use a more explicit error message if no option or argument(command) is passed to `pybabel`. Fixes #81.
palgarvio
parents:
423
diff
changeset
|
671 self.parser.error('no valid command or option passed. ' |
e24e6a4d3512
Use a more explicit error message if no option or argument(command) is passed to `pybabel`. Fixes #81.
palgarvio
parents:
423
diff
changeset
|
672 'Try the -h/--help option for more information.') |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
673 |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
674 cmdname = args[0] |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
675 if cmdname not in self.commands: |
127 | 676 self.parser.error('unknown command "%s"' % cmdname) |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
677 |
185
6503a227ba93
Add a command-line option that prints out all available locales. Closes #24.
cmlenz
parents:
181
diff
changeset
|
678 return getattr(self, cmdname)(args[1:]) |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
679 |
523
e5a2231ce176
shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents:
521
diff
changeset
|
680 def _configure_logging(self, loglevel): |
e5a2231ce176
shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents:
521
diff
changeset
|
681 self.log = logging.getLogger('babel') |
e5a2231ce176
shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents:
521
diff
changeset
|
682 self.log.setLevel(loglevel) |
e5a2231ce176
shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents:
521
diff
changeset
|
683 # Don't add a new handler for every instance initialization (#227), this |
e5a2231ce176
shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents:
521
diff
changeset
|
684 # would cause duplicated output when the CommandLineInterface as an |
e5a2231ce176
shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents:
521
diff
changeset
|
685 # normal Python class. |
e5a2231ce176
shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents:
521
diff
changeset
|
686 if self.log.handlers: |
e5a2231ce176
shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents:
521
diff
changeset
|
687 handler = self.log.handlers[0] |
e5a2231ce176
shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents:
521
diff
changeset
|
688 else: |
e5a2231ce176
shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents:
521
diff
changeset
|
689 handler = logging.StreamHandler() |
e5a2231ce176
shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents:
521
diff
changeset
|
690 self.log.addHandler(handler) |
e5a2231ce176
shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents:
521
diff
changeset
|
691 handler.setLevel(loglevel) |
e5a2231ce176
shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents:
521
diff
changeset
|
692 formatter = logging.Formatter('%(message)s') |
e5a2231ce176
shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents:
521
diff
changeset
|
693 handler.setFormatter(formatter) |
e5a2231ce176
shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents:
521
diff
changeset
|
694 |
63
47353672f1a8
Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents:
62
diff
changeset
|
695 def _help(self): |
47353672f1a8
Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents:
62
diff
changeset
|
696 print self.parser.format_help() |
127 | 697 print "commands:" |
63
47353672f1a8
Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents:
62
diff
changeset
|
698 longest = max([len(command) for command in self.commands]) |
185
6503a227ba93
Add a command-line option that prints out all available locales. Closes #24.
cmlenz
parents:
181
diff
changeset
|
699 format = " %%-%ds %%s" % max(8, longest + 1) |
161 | 700 commands = self.commands.items() |
701 commands.sort() | |
702 for name, description in commands: | |
703 print format % (name, description) | |
87
72c7ac384609
Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents:
86
diff
changeset
|
704 |
160 | 705 def compile(self, argv): |
706 """Subcommand for compiling a message catalog to a MO file. | |
707 | |
708 :param argv: the command arguments | |
234 | 709 :since: version 0.9 |
160 | 710 """ |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
711 parser = OptionParser(usage=self.usage % ('compile', ''), |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
712 description=self.commands['compile']) |
160 | 713 parser.add_option('--domain', '-D', dest='domain', |
714 help="domain of MO and PO files (default '%default')") | |
715 parser.add_option('--directory', '-d', dest='directory', | |
716 metavar='DIR', help='base directory of catalog files') | |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
717 parser.add_option('--locale', '-l', dest='locale', metavar='LOCALE', |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
718 help='locale of the catalog') |
160 | 719 parser.add_option('--input-file', '-i', dest='input_file', |
720 metavar='FILE', help='name of the input file') | |
721 parser.add_option('--output-file', '-o', dest='output_file', | |
722 metavar='FILE', | |
723 help="name of the output file (default " | |
724 "'<output_dir>/<locale>/LC_MESSAGES/" | |
725 "<domain>.mo')") | |
726 parser.add_option('--use-fuzzy', '-f', dest='use_fuzzy', | |
727 action='store_true', | |
728 help='also include fuzzy translations (default ' | |
207 | 729 '%default)') |
730 parser.add_option('--statistics', dest='statistics', | |
731 action='store_true', | |
732 help='print statistics about translations') | |
160 | 733 |
170
3f9d9268537d
Allow the compile catalog frontends to compile all available locales.
palgarvio
parents:
169
diff
changeset
|
734 parser.set_defaults(domain='messages', use_fuzzy=False, |
207 | 735 compile_all=False, statistics=False) |
170
3f9d9268537d
Allow the compile catalog frontends to compile all available locales.
palgarvio
parents:
169
diff
changeset
|
736 options, args = parser.parse_args(argv) |
160 | 737 |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
738 po_files = [] |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
739 mo_files = [] |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
740 if not options.input_file: |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
741 if not options.directory: |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
742 parser.error('you must specify either the input file or the ' |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
743 'base directory') |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
744 if options.locale: |
331
afc5070a623c
Fix message catalog compilation for locales with more than two plural forms. Closes #95. Many thanks to Victor Safronovich for the patch.
cmlenz
parents:
317
diff
changeset
|
745 po_files.append((options.locale, |
afc5070a623c
Fix message catalog compilation for locales with more than two plural forms. Closes #95. Many thanks to Victor Safronovich for the patch.
cmlenz
parents:
317
diff
changeset
|
746 os.path.join(options.directory, |
afc5070a623c
Fix message catalog compilation for locales with more than two plural forms. Closes #95. Many thanks to Victor Safronovich for the patch.
cmlenz
parents:
317
diff
changeset
|
747 options.locale, 'LC_MESSAGES', |
afc5070a623c
Fix message catalog compilation for locales with more than two plural forms. Closes #95. Many thanks to Victor Safronovich for the patch.
cmlenz
parents:
317
diff
changeset
|
748 options.domain + '.po'))) |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
749 mo_files.append(os.path.join(options.directory, options.locale, |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
750 'LC_MESSAGES', |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
751 options.domain + '.mo')) |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
752 else: |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
753 for locale in os.listdir(options.directory): |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
754 po_file = os.path.join(options.directory, locale, |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
755 'LC_MESSAGES', options.domain + '.po') |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
756 if os.path.exists(po_file): |
331
afc5070a623c
Fix message catalog compilation for locales with more than two plural forms. Closes #95. Many thanks to Victor Safronovich for the patch.
cmlenz
parents:
317
diff
changeset
|
757 po_files.append((locale, po_file)) |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
758 mo_files.append(os.path.join(options.directory, locale, |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
759 'LC_MESSAGES', |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
760 options.domain + '.mo')) |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
761 else: |
331
afc5070a623c
Fix message catalog compilation for locales with more than two plural forms. Closes #95. Many thanks to Victor Safronovich for the patch.
cmlenz
parents:
317
diff
changeset
|
762 po_files.append((options.locale, options.input_file)) |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
763 if options.output_file: |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
764 mo_files.append(options.output_file) |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
765 else: |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
766 if not options.directory: |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
767 parser.error('you must specify either the input file or ' |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
768 'the base directory') |
290 | 769 mo_files.append(os.path.join(options.directory, options.locale, |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
770 'LC_MESSAGES', |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
771 options.domain + '.mo')) |
208
d17f4b876f95
Make frontends that make use of a ''loop all'' fail if no message catalogs are found.
palgarvio
parents:
207
diff
changeset
|
772 if not po_files: |
d17f4b876f95
Make frontends that make use of a ''loop all'' fail if no message catalogs are found.
palgarvio
parents:
207
diff
changeset
|
773 parser.error('no message catalogs found') |
160 | 774 |
331
afc5070a623c
Fix message catalog compilation for locales with more than two plural forms. Closes #95. Many thanks to Victor Safronovich for the patch.
cmlenz
parents:
317
diff
changeset
|
775 for idx, (locale, po_file) in enumerate(po_files): |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
776 mo_file = mo_files[idx] |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
777 infile = open(po_file, 'r') |
170
3f9d9268537d
Allow the compile catalog frontends to compile all available locales.
palgarvio
parents:
169
diff
changeset
|
778 try: |
331
afc5070a623c
Fix message catalog compilation for locales with more than two plural forms. Closes #95. Many thanks to Victor Safronovich for the patch.
cmlenz
parents:
317
diff
changeset
|
779 catalog = read_po(infile, locale) |
170
3f9d9268537d
Allow the compile catalog frontends to compile all available locales.
palgarvio
parents:
169
diff
changeset
|
780 finally: |
3f9d9268537d
Allow the compile catalog frontends to compile all available locales.
palgarvio
parents:
169
diff
changeset
|
781 infile.close() |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
782 |
207 | 783 if options.statistics: |
784 translated = 0 | |
785 for message in list(catalog)[1:]: | |
786 if message.string: | |
787 translated +=1 | |
317 | 788 percentage = 0 |
789 if len(catalog): | |
790 percentage = translated * 100 // len(catalog) | |
232 | 791 self.log.info("%d of %d messages (%d%%) translated in %r", |
317 | 792 translated, len(catalog), percentage, po_file) |
207 | 793 |
175
5d32098d8352
Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents:
170
diff
changeset
|
794 if catalog.fuzzy and not options.use_fuzzy: |
232 | 795 self.log.warn('catalog %r is marked as fuzzy, skipping', |
796 po_file) | |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
797 continue |
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
798 |
220
97b4b289e792
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
799 for message, errors in catalog.check(): |
97b4b289e792
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
800 for error in errors: |
232 | 801 self.log.error('error: %s:%d: %s', po_file, message.lineno, |
802 error) | |
220
97b4b289e792
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
803 |
232 | 804 self.log.info('compiling catalog %r to %r', po_file, mo_file) |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
805 |
279 | 806 outfile = open(mo_file, 'wb') |
170
3f9d9268537d
Allow the compile catalog frontends to compile all available locales.
palgarvio
parents:
169
diff
changeset
|
807 try: |
3f9d9268537d
Allow the compile catalog frontends to compile all available locales.
palgarvio
parents:
169
diff
changeset
|
808 write_mo(outfile, catalog, use_fuzzy=options.use_fuzzy) |
3f9d9268537d
Allow the compile catalog frontends to compile all available locales.
palgarvio
parents:
169
diff
changeset
|
809 finally: |
3f9d9268537d
Allow the compile catalog frontends to compile all available locales.
palgarvio
parents:
169
diff
changeset
|
810 outfile.close() |
160 | 811 |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
812 def extract(self, argv): |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
813 """Subcommand for extracting messages from source files and generating |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
814 a POT file. |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
815 |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
816 :param argv: the command arguments |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
817 """ |
66
2504451884f3
Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents:
63
diff
changeset
|
818 parser = OptionParser(usage=self.usage % ('extract', 'dir1 <dir2> ...'), |
161 | 819 description=self.commands['extract']) |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
820 parser.add_option('--charset', dest='charset', |
160 | 821 help='charset to use in the output (default ' |
822 '"%default")') | |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
823 parser.add_option('-k', '--keyword', dest='keywords', action='append', |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
824 help='keywords to look for in addition to the ' |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
825 'defaults. You can specify multiple -k flags on ' |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
826 'the command line.') |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
827 parser.add_option('--no-default-keywords', dest='no_default_keywords', |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
828 action='store_true', |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
829 help="do not include the default keywords") |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
830 parser.add_option('--mapping', '-F', dest='mapping_file', |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
831 help='path to the extraction mapping file') |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
832 parser.add_option('--no-location', dest='no_location', |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
833 action='store_true', |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
834 help='do not include location comments with filename ' |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
835 'and line number') |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
836 parser.add_option('--omit-header', dest='omit_header', |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
837 action='store_true', |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
838 help='do not include msgid "" entry in header') |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
839 parser.add_option('-o', '--output', dest='output', |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
840 help='path to the output POT file') |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
841 parser.add_option('-w', '--width', dest='width', type='int', |
423
fb926f48efba
Now, the `--width` option, although with a default value of 76, it's not set to any value initially so that the `--no-wrap` option can be passed without throwing an error. Fixes #145.
palgarvio
parents:
417
diff
changeset
|
842 help="set output line width (default 76)") |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
843 parser.add_option('--no-wrap', dest='no_wrap', action = 'store_true', |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
844 help='do not break long message lines, longer than ' |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
845 'the output line width, into several lines') |
71 | 846 parser.add_option('--sort-output', dest='sort_output', |
847 action='store_true', | |
848 help='generate sorted output (default False)') | |
849 parser.add_option('--sort-by-file', dest='sort_by_file', | |
850 action='store_true', | |
851 help='sort output by file location (default False)') | |
78
d0d8d6cd8601
Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents:
71
diff
changeset
|
852 parser.add_option('--msgid-bugs-address', dest='msgid_bugs_address', |
d0d8d6cd8601
Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents:
71
diff
changeset
|
853 metavar='EMAIL@ADDRESS', |
d0d8d6cd8601
Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents:
71
diff
changeset
|
854 help='set report address for msgid') |
79
450ac2291ca5
Implemented item 4 from #12. Set the copyright holder in the output.
palgarvio
parents:
78
diff
changeset
|
855 parser.add_option('--copyright-holder', dest='copyright_holder', |
450ac2291ca5
Implemented item 4 from #12. Set the copyright holder in the output.
palgarvio
parents:
78
diff
changeset
|
856 help='set copyright holder in output') |
429
28755da4bf13
add `--project` and `--version` options for commandline (fixes #173)
dfraser
parents:
424
diff
changeset
|
857 parser.add_option('--project', dest='project', |
28755da4bf13
add `--project` and `--version` options for commandline (fixes #173)
dfraser
parents:
424
diff
changeset
|
858 help='set project name in output') |
28755da4bf13
add `--project` and `--version` options for commandline (fixes #173)
dfraser
parents:
424
diff
changeset
|
859 parser.add_option('--version', dest='version', |
28755da4bf13
add `--project` and `--version` options for commandline (fixes #173)
dfraser
parents:
424
diff
changeset
|
860 help='set project version in output') |
95
f9007588a860
Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents:
90
diff
changeset
|
861 parser.add_option('--add-comments', '-c', dest='comment_tags', |
80
116e34b8cefa
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
79
diff
changeset
|
862 metavar='TAG', action='append', |
116e34b8cefa
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
79
diff
changeset
|
863 help='place comment block with TAG (or those ' |
116e34b8cefa
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
79
diff
changeset
|
864 'preceding keyword lines) in output file. One ' |
116e34b8cefa
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
79
diff
changeset
|
865 'TAG per argument call') |
338
b39145076d8a
Stripping of comment tags is optional now. If enabled it will strip the tags from all lines of a comment now.
aronacher
parents:
335
diff
changeset
|
866 parser.add_option('--strip-comment-tags', '-s', |
b39145076d8a
Stripping of comment tags is optional now. If enabled it will strip the tags from all lines of a comment now.
aronacher
parents:
335
diff
changeset
|
867 dest='strip_comment_tags', action='store_true', |
b39145076d8a
Stripping of comment tags is optional now. If enabled it will strip the tags from all lines of a comment now.
aronacher
parents:
335
diff
changeset
|
868 help='Strip the comment tags from the comments.') |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
869 |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
870 parser.set_defaults(charset='utf-8', keywords=[], |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
871 no_default_keywords=False, no_location=False, |
423
fb926f48efba
Now, the `--width` option, although with a default value of 76, it's not set to any value initially so that the `--no-wrap` option can be passed without throwing an error. Fixes #145.
palgarvio
parents:
417
diff
changeset
|
872 omit_header = False, width=None, no_wrap=False, |
80
116e34b8cefa
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
79
diff
changeset
|
873 sort_output=False, sort_by_file=False, |
338
b39145076d8a
Stripping of comment tags is optional now. If enabled it will strip the tags from all lines of a comment now.
aronacher
parents:
335
diff
changeset
|
874 comment_tags=[], strip_comment_tags=False) |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
875 options, args = parser.parse_args(argv) |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
876 if not args: |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
877 parser.error('incorrect number of arguments') |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
878 |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
879 if options.output not in (None, '-'): |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
880 outfile = open(options.output, 'w') |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
881 else: |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
882 outfile = sys.stdout |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
883 |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
884 keywords = DEFAULT_KEYWORDS.copy() |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
885 if options.no_default_keywords: |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
886 if not options.keywords: |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
887 parser.error('you must specify new keywords if you disable the ' |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
888 'default ones') |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
889 keywords = {} |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
890 if options.keywords: |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
891 keywords.update(parse_keywords(options.keywords)) |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
892 |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
893 if options.mapping_file: |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
894 fileobj = open(options.mapping_file, 'U') |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
895 try: |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
896 method_map, options_map = parse_mapping(fileobj) |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
897 finally: |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
898 fileobj.close() |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
899 else: |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
900 method_map = DEFAULT_MAPPING |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
901 options_map = {} |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
902 |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
903 if options.width and options.no_wrap: |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
904 parser.error("'--no-wrap' and '--width' are mutually exclusive.") |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
905 elif not options.width and not options.no_wrap: |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
906 options.width = 76 |
87
72c7ac384609
Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents:
86
diff
changeset
|
907 |
71 | 908 if options.sort_output and options.sort_by_file: |
909 parser.error("'--sort-output' and '--sort-by-file' are mutually " | |
910 "exclusive") | |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
911 |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
912 try: |
429
28755da4bf13
add `--project` and `--version` options for commandline (fixes #173)
dfraser
parents:
424
diff
changeset
|
913 catalog = Catalog(project=options.project, |
28755da4bf13
add `--project` and `--version` options for commandline (fixes #173)
dfraser
parents:
424
diff
changeset
|
914 version=options.version, |
28755da4bf13
add `--project` and `--version` options for commandline (fixes #173)
dfraser
parents:
424
diff
changeset
|
915 msgid_bugs_address=options.msgid_bugs_address, |
105
c62b68a0b65e
`Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents:
104
diff
changeset
|
916 copyright_holder=options.copyright_holder, |
102
14a3d766a701
Project name and version, and the charset are available via the `Catalog` object, and do not need to be passed to `write_pot()`.
cmlenz
parents:
95
diff
changeset
|
917 charset=options.charset) |
14a3d766a701
Project name and version, and the charset are available via the `Catalog` object, and do not need to be passed to `write_pot()`.
cmlenz
parents:
95
diff
changeset
|
918 |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
919 for dirname in args: |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
920 if not os.path.isdir(dirname): |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
921 parser.error('%r is not a directory' % dirname) |
232 | 922 |
923 def callback(filename, method, options): | |
924 if method == 'ignore': | |
925 return | |
926 filepath = os.path.normpath(os.path.join(dirname, filename)) | |
927 optstr = '' | |
928 if options: | |
929 optstr = ' (%s)' % ', '.join(['%s="%s"' % (k, v) for | |
930 k, v in options.items()]) | |
931 self.log.info('extracting messages from %s%s', filepath, | |
932 optstr) | |
933 | |
95
f9007588a860
Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents:
90
diff
changeset
|
934 extracted = extract_from_dir(dirname, method_map, options_map, |
232 | 935 keywords, options.comment_tags, |
338
b39145076d8a
Stripping of comment tags is optional now. If enabled it will strip the tags from all lines of a comment now.
aronacher
parents:
335
diff
changeset
|
936 callback=callback, |
b39145076d8a
Stripping of comment tags is optional now. If enabled it will strip the tags from all lines of a comment now.
aronacher
parents:
335
diff
changeset
|
937 strip_comment_tags= |
b39145076d8a
Stripping of comment tags is optional now. If enabled it will strip the tags from all lines of a comment now.
aronacher
parents:
335
diff
changeset
|
938 options.strip_comment_tags) |
569
1b801a0cb2cb
Support for context-aware methods during message extraction (fixes #229, patch by David Rios)
fschwarz
parents:
563
diff
changeset
|
939 for filename, lineno, message, comments, context in extracted: |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
940 filepath = os.path.normpath(os.path.join(dirname, filename)) |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
941 catalog.add(message, None, [(filepath, lineno)], |
569
1b801a0cb2cb
Support for context-aware methods during message extraction (fixes #229, patch by David Rios)
fschwarz
parents:
563
diff
changeset
|
942 auto_comments=comments, context=context) |
56
f40fc143439c
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
55
diff
changeset
|
943 |
232 | 944 if options.output not in (None, '-'): |
945 self.log.info('writing PO template file to %s' % options.output) | |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
946 write_po(outfile, catalog, width=options.width, |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
947 no_location=options.no_location, |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
948 omit_header=options.omit_header, |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
949 sort_output=options.sort_output, |
112
5c55ca587c89
copyright_holder arg is no longer needed for write_po
pjenvey
parents:
110
diff
changeset
|
950 sort_by_file=options.sort_by_file) |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
951 finally: |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
952 if options.output: |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
953 outfile.close() |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
954 |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
955 def init(self, argv): |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
956 """Subcommand for creating new message catalogs from a template. |
177
beb8a9eabe6d
* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents:
176
diff
changeset
|
957 |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
958 :param argv: the command arguments |
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
959 """ |
165
628bc271ece4
Implement fuzzy matching to catalog updates. No frontend yet.
cmlenz
parents:
161
diff
changeset
|
960 parser = OptionParser(usage=self.usage % ('init', ''), |
161 | 961 description=self.commands['init']) |
66
2504451884f3
Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents:
63
diff
changeset
|
962 parser.add_option('--domain', '-D', dest='domain', |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
963 help="domain of PO file (default '%default')") |
66
2504451884f3
Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents:
63
diff
changeset
|
964 parser.add_option('--input-file', '-i', dest='input_file', |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
965 metavar='FILE', help='name of the input file') |
66
2504451884f3
Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents:
63
diff
changeset
|
966 parser.add_option('--output-dir', '-d', dest='output_dir', |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
967 metavar='DIR', help='path to output directory') |
66
2504451884f3
Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents:
63
diff
changeset
|
968 parser.add_option('--output-file', '-o', dest='output_file', |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
969 metavar='FILE', |
66
2504451884f3
Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents:
63
diff
changeset
|
970 help="name of the output file (default " |
87
72c7ac384609
Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents:
86
diff
changeset
|
971 "'<output_dir>/<locale>/LC_MESSAGES/" |
72c7ac384609
Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents:
86
diff
changeset
|
972 "<domain>.po')") |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
973 parser.add_option('--locale', '-l', dest='locale', metavar='LOCALE', |
66
2504451884f3
Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents:
63
diff
changeset
|
974 help='locale for the new localized catalog') |
600 | 975 parser.add_option('-w', '--width', dest='width', type='int', |
976 help="set output line width (default 76)") | |
574
99c48a6ca1d6
add "--no-wrap" option for init/update commands (#289)
fschwarz
parents:
569
diff
changeset
|
977 parser.add_option('--no-wrap', dest='no_wrap', action='store_true', |
99c48a6ca1d6
add "--no-wrap" option for init/update commands (#289)
fschwarz
parents:
569
diff
changeset
|
978 help='do not break long message lines, longer than ' |
99c48a6ca1d6
add "--no-wrap" option for init/update commands (#289)
fschwarz
parents:
569
diff
changeset
|
979 'the output line width, into several lines') |
87
72c7ac384609
Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents:
86
diff
changeset
|
980 |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
981 parser.set_defaults(domain='messages') |
66
2504451884f3
Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents:
63
diff
changeset
|
982 options, args = parser.parse_args(argv) |
87
72c7ac384609
Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents:
86
diff
changeset
|
983 |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
984 if not options.locale: |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
985 parser.error('you must provide a locale for the new catalog') |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
986 try: |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
987 locale = Locale.parse(options.locale) |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
988 except UnknownLocaleError, e: |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
989 parser.error(e) |
87
72c7ac384609
Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents:
86
diff
changeset
|
990 |
66
2504451884f3
Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents:
63
diff
changeset
|
991 if not options.input_file: |
2504451884f3
Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents:
63
diff
changeset
|
992 parser.error('you must specify the input file') |
87
72c7ac384609
Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents:
86
diff
changeset
|
993 |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
994 if not options.output_file and not options.output_dir: |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
995 parser.error('you must specify the output file or directory') |
87
72c7ac384609
Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents:
86
diff
changeset
|
996 |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
997 if not options.output_file: |
66
2504451884f3
Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents:
63
diff
changeset
|
998 options.output_file = os.path.join(options.output_dir, |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
999 options.locale, 'LC_MESSAGES', |
66
2504451884f3
Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents:
63
diff
changeset
|
1000 options.domain + '.po') |
87
72c7ac384609
Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents:
86
diff
changeset
|
1001 if not os.path.exists(os.path.dirname(options.output_file)): |
72c7ac384609
Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents:
86
diff
changeset
|
1002 os.makedirs(os.path.dirname(options.output_file)) |
600 | 1003 if options.width and options.no_wrap: |
1004 parser.error("'--no-wrap' and '--width' are mutually exclusive.") | |
1005 elif not options.width and not options.no_wrap: | |
1006 options.width = 76 | |
87
72c7ac384609
Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents:
86
diff
changeset
|
1007 |
66
2504451884f3
Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents:
63
diff
changeset
|
1008 infile = open(options.input_file, 'r') |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
1009 try: |
371 | 1010 # Although reading from the catalog template, read_po must be fed |
563 | 1011 # the locale in order to correctly calculate plurals |
371 | 1012 catalog = read_po(infile, locale=options.locale) |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
1013 finally: |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
1014 infile.close() |
87
72c7ac384609
Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents:
86
diff
changeset
|
1015 |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
1016 catalog.locale = locale |
132 | 1017 catalog.revision_date = datetime.now(LOCALTZ) |
66
2504451884f3
Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents:
63
diff
changeset
|
1018 |
232 | 1019 self.log.info('creating catalog %r based on %r', options.output_file, |
1020 options.input_file) | |
66
2504451884f3
Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents:
63
diff
changeset
|
1021 |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
1022 outfile = open(options.output_file, 'w') |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
1023 try: |
600 | 1024 write_po(outfile, catalog, width=options.width) |
104
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
1025 finally: |
395704fda00b
Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents:
103
diff
changeset
|
1026 outfile.close() |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
1027 |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1028 def update(self, argv): |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1029 """Subcommand for updating existing message catalogs from a template. |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1030 |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1031 :param argv: the command arguments |
234 | 1032 :since: version 0.9 |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1033 """ |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1034 parser = OptionParser(usage=self.usage % ('update', ''), |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1035 description=self.commands['update']) |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1036 parser.add_option('--domain', '-D', dest='domain', |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1037 help="domain of PO file (default '%default')") |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1038 parser.add_option('--input-file', '-i', dest='input_file', |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1039 metavar='FILE', help='name of the input file') |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1040 parser.add_option('--output-dir', '-d', dest='output_dir', |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1041 metavar='DIR', help='path to output directory') |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1042 parser.add_option('--output-file', '-o', dest='output_file', |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1043 metavar='FILE', |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1044 help="name of the output file (default " |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1045 "'<output_dir>/<locale>/LC_MESSAGES/" |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1046 "<domain>.po')") |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1047 parser.add_option('--locale', '-l', dest='locale', metavar='LOCALE', |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1048 help='locale of the translations catalog') |
602
7a8ee579f31e
"update" command now supports "--width" option (#284)
fschwarz
parents:
601
diff
changeset
|
1049 parser.add_option('-w', '--width', dest='width', type='int', |
7a8ee579f31e
"update" command now supports "--width" option (#284)
fschwarz
parents:
601
diff
changeset
|
1050 help="set output line width (default 76)") |
574
99c48a6ca1d6
add "--no-wrap" option for init/update commands (#289)
fschwarz
parents:
569
diff
changeset
|
1051 parser.add_option('--no-wrap', dest='no_wrap', action = 'store_true', |
99c48a6ca1d6
add "--no-wrap" option for init/update commands (#289)
fschwarz
parents:
569
diff
changeset
|
1052 help='do not break long message lines, longer than ' |
99c48a6ca1d6
add "--no-wrap" option for init/update commands (#289)
fschwarz
parents:
569
diff
changeset
|
1053 'the output line width, into several lines') |
191
c171a0041ad2
Add an option to the frontend commands for catalog updating that removes completely any obsolete messages, instead of putting them comments.
cmlenz
parents:
185
diff
changeset
|
1054 parser.add_option('--ignore-obsolete', dest='ignore_obsolete', |
c171a0041ad2
Add an option to the frontend commands for catalog updating that removes completely any obsolete messages, instead of putting them comments.
cmlenz
parents:
185
diff
changeset
|
1055 action='store_true', |
c171a0041ad2
Add an option to the frontend commands for catalog updating that removes completely any obsolete messages, instead of putting them comments.
cmlenz
parents:
185
diff
changeset
|
1056 help='do not include obsolete messages in the output ' |
417 | 1057 '(default %default)') |
200
1c778cccd330
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
197
diff
changeset
|
1058 parser.add_option('--no-fuzzy-matching', '-N', dest='no_fuzzy_matching', |
1c778cccd330
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
197
diff
changeset
|
1059 action='store_true', |
417 | 1060 help='do not use fuzzy matching (default %default)') |
200
1c778cccd330
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
197
diff
changeset
|
1061 parser.add_option('--previous', dest='previous', action='store_true', |
1c778cccd330
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
197
diff
changeset
|
1062 help='keep previous msgids of translated messages ' |
417 | 1063 '(default %default)') |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1064 |
200
1c778cccd330
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
197
diff
changeset
|
1065 parser.set_defaults(domain='messages', ignore_obsolete=False, |
1c778cccd330
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
197
diff
changeset
|
1066 no_fuzzy_matching=False, previous=False) |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1067 options, args = parser.parse_args(argv) |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1068 |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1069 if not options.input_file: |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1070 parser.error('you must specify the input file') |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1071 if not options.output_file and not options.output_dir: |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1072 parser.error('you must specify the output file or directory') |
196
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
1073 if options.output_file and not options.locale: |
417 | 1074 parser.error('you must specify the locale') |
200
1c778cccd330
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
197
diff
changeset
|
1075 if options.no_fuzzy_matching and options.previous: |
1c778cccd330
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
197
diff
changeset
|
1076 options.previous = False |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1077 |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1078 po_files = [] |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1079 if not options.output_file: |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1080 if options.locale: |
196
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
1081 po_files.append((options.locale, |
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
1082 os.path.join(options.output_dir, |
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
1083 options.locale, 'LC_MESSAGES', |
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
1084 options.domain + '.po'))) |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1085 else: |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1086 for locale in os.listdir(options.output_dir): |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1087 po_file = os.path.join(options.output_dir, locale, |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1088 'LC_MESSAGES', |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1089 options.domain + '.po') |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1090 if os.path.exists(po_file): |
196
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
1091 po_files.append((locale, po_file)) |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1092 else: |
196
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
1093 po_files.append((options.locale, options.output_file)) |
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
1094 |
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
1095 domain = options.domain |
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
1096 if not domain: |
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
1097 domain = os.path.splitext(os.path.basename(options.input_file))[0] |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1098 |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1099 infile = open(options.input_file, 'U') |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1100 try: |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1101 template = read_po(infile) |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1102 finally: |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1103 infile.close() |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1104 |
208
d17f4b876f95
Make frontends that make use of a ''loop all'' fail if no message catalogs are found.
palgarvio
parents:
207
diff
changeset
|
1105 if not po_files: |
d17f4b876f95
Make frontends that make use of a ''loop all'' fail if no message catalogs are found.
palgarvio
parents:
207
diff
changeset
|
1106 parser.error('no message catalogs found') |
d17f4b876f95
Make frontends that make use of a ''loop all'' fail if no message catalogs are found.
palgarvio
parents:
207
diff
changeset
|
1107 |
602
7a8ee579f31e
"update" command now supports "--width" option (#284)
fschwarz
parents:
601
diff
changeset
|
1108 if options.width and options.no_wrap: |
7a8ee579f31e
"update" command now supports "--width" option (#284)
fschwarz
parents:
601
diff
changeset
|
1109 parser.error("'--no-wrap' and '--width' are mutually exclusive.") |
7a8ee579f31e
"update" command now supports "--width" option (#284)
fschwarz
parents:
601
diff
changeset
|
1110 elif not options.width and not options.no_wrap: |
7a8ee579f31e
"update" command now supports "--width" option (#284)
fschwarz
parents:
601
diff
changeset
|
1111 options.width = 76 |
196
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
1112 for locale, filename in po_files: |
232 | 1113 self.log.info('updating catalog %r based on %r', filename, |
1114 options.input_file) | |
196
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
1115 infile = open(filename, 'U') |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1116 try: |
196
b38a6b220ea2
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
191
diff
changeset
|
1117 catalog = read_po(infile, locale=locale, domain=domain) |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1118 finally: |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1119 infile.close() |
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1120 |
204 | 1121 catalog.update(template, options.no_fuzzy_matching) |
197
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
1122 |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
1123 tmpname = os.path.join(os.path.dirname(filename), |
200
1c778cccd330
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
197
diff
changeset
|
1124 tempfile.gettempprefix() + |
197
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
1125 os.path.basename(filename)) |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
1126 tmpfile = open(tmpname, 'w') |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1127 try: |
197
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
1128 try: |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
1129 write_po(tmpfile, catalog, |
200
1c778cccd330
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
197
diff
changeset
|
1130 ignore_obsolete=options.ignore_obsolete, |
602
7a8ee579f31e
"update" command now supports "--width" option (#284)
fschwarz
parents:
601
diff
changeset
|
1131 include_previous=options.previous, |
7a8ee579f31e
"update" command now supports "--width" option (#284)
fschwarz
parents:
601
diff
changeset
|
1132 width=options.width) |
197
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
1133 finally: |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
1134 tmpfile.close() |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
1135 except: |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
1136 os.remove(tmpname) |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
1137 raise |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
1138 |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
1139 try: |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
1140 os.rename(tmpname, filename) |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
1141 except OSError: |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
1142 # We're probably on Windows, which doesn't support atomic |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
1143 # renames, at least not through Python |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
1144 # If the error is in fact due to a permissions problem, that |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
1145 # same error is going to be raised from one of the following |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
1146 # operations |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
1147 os.remove(filename) |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
1148 shutil.copy(tmpname, filename) |
0eb3eb447256
Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents:
196
diff
changeset
|
1149 os.remove(tmpname) |
181
8a762ce37bf7
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
178
diff
changeset
|
1150 |
165
628bc271ece4
Implement fuzzy matching to catalog updates. No frontend yet.
cmlenz
parents:
161
diff
changeset
|
1151 |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
1152 def main(): |
185
6503a227ba93
Add a command-line option that prints out all available locales. Closes #24.
cmlenz
parents:
181
diff
changeset
|
1153 return CommandLineInterface().run(sys.argv) |
1 | 1154 |
48
22b90b3b161a
Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents:
47
diff
changeset
|
1155 def parse_mapping(fileobj, filename=None): |
47
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
1156 """Parse an extraction method mapping from a file-like object. |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
1157 |
47
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
1158 >>> buf = StringIO(''' |
250
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1159 ... [extractors] |
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1160 ... custom = mypackage.module:myfunc |
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1161 ... |
47
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
1162 ... # Python source files |
62
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
1163 ... [python: **.py] |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
1164 ... |
47
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
1165 ... # Genshi templates |
62
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
1166 ... [genshi: **/templates/**.html] |
48
22b90b3b161a
Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents:
47
diff
changeset
|
1167 ... include_attrs = |
62
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
1168 ... [genshi: **/templates/**.txt] |
144 | 1169 ... template_class = genshi.template:TextTemplate |
48
22b90b3b161a
Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents:
47
diff
changeset
|
1170 ... encoding = latin-1 |
250
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1171 ... |
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1172 ... # Some custom extractor |
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1173 ... [custom: **/custom/*.*] |
47
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
1174 ... ''') |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
1175 |
47
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
1176 >>> method_map, options_map = parse_mapping(buf) |
250
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1177 >>> len(method_map) |
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1178 4 |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
1179 |
62
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
1180 >>> method_map[0] |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
1181 ('**.py', 'python') |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
1182 >>> options_map['**.py'] |
47
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
1183 {} |
62
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
1184 >>> method_map[1] |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
1185 ('**/templates/**.html', 'genshi') |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
1186 >>> options_map['**/templates/**.html']['include_attrs'] |
47
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
1187 '' |
62
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
1188 >>> method_map[2] |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
1189 ('**/templates/**.txt', 'genshi') |
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
1190 >>> options_map['**/templates/**.txt']['template_class'] |
144 | 1191 'genshi.template:TextTemplate' |
62
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
1192 >>> options_map['**/templates/**.txt']['encoding'] |
47
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
1193 'latin-1' |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
1194 |
250
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1195 >>> method_map[3] |
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1196 ('**/custom/*.*', 'mypackage.module:myfunc') |
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1197 >>> options_map['**/custom/*.*'] |
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1198 {} |
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1199 |
47
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
1200 :param fileobj: a readable file-like object containing the configuration |
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
1201 text to parse |
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
1202 :return: a `(method_map, options_map)` tuple |
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
1203 :rtype: `tuple` |
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
1204 :see: `extract_from_directory` |
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
1205 """ |
250
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1206 extractors = {} |
62
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
1207 method_map = [] |
47
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
1208 options_map = {} |
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
1209 |
48
22b90b3b161a
Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents:
47
diff
changeset
|
1210 parser = RawConfigParser() |
62
2df27f49c320
The order of extraction methods is now preserved (see #10).
cmlenz
parents:
59
diff
changeset
|
1211 parser._sections = odict(parser._sections) # We need ordered sections |
48
22b90b3b161a
Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents:
47
diff
changeset
|
1212 parser.readfp(fileobj, filename) |
22b90b3b161a
Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents:
47
diff
changeset
|
1213 for section in parser.sections(): |
250
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1214 if section == 'extractors': |
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1215 extractors = dict(parser.items(section)) |
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1216 else: |
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1217 method, pattern = [part.strip() for part in section.split(':', 1)] |
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1218 method_map.append((pattern, method)) |
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1219 options_map[pattern] = dict(parser.items(section)) |
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1220 |
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1221 if extractors: |
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1222 for idx, (pattern, method) in enumerate(method_map): |
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1223 if method in extractors: |
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1224 method = extractors[method] |
6c06570af1b9
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
234
diff
changeset
|
1225 method_map[idx] = (pattern, method) |
47
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
1226 |
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
1227 return (method_map, options_map) |
f8469ab4b257
Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents:
24
diff
changeset
|
1228 |
12
e6ba3e878b10
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
1229 def parse_keywords(strings=[]): |
e6ba3e878b10
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
1230 """Parse keywords specifications from the given list of strings. |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
1231 |
569
1b801a0cb2cb
Support for context-aware methods during message extraction (fixes #229, patch by David Rios)
fschwarz
parents:
563
diff
changeset
|
1232 >>> kw = parse_keywords(['_', 'dgettext:2', 'dngettext:2,3', 'pgettext:1c,2']).items() |
414
05487ae7696e
fix Python 2.3 compat: rearrange set/itemgetter/rsplit/sorted/unicode.decode
pjenvey
parents:
371
diff
changeset
|
1233 >>> kw.sort() |
05487ae7696e
fix Python 2.3 compat: rearrange set/itemgetter/rsplit/sorted/unicode.decode
pjenvey
parents:
371
diff
changeset
|
1234 >>> for keyword, indices in kw: |
12
e6ba3e878b10
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
1235 ... print (keyword, indices) |
e6ba3e878b10
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
1236 ('_', None) |
e6ba3e878b10
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
1237 ('dgettext', (2,)) |
e6ba3e878b10
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
1238 ('dngettext', (2, 3)) |
569
1b801a0cb2cb
Support for context-aware methods during message extraction (fixes #229, patch by David Rios)
fschwarz
parents:
563
diff
changeset
|
1239 ('pgettext', ((1, 'c'), 2)) |
12
e6ba3e878b10
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
1240 """ |
e6ba3e878b10
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
1241 keywords = {} |
e6ba3e878b10
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
1242 for string in strings: |
e6ba3e878b10
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
1243 if ':' in string: |
e6ba3e878b10
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
1244 funcname, indices = string.split(':') |
e6ba3e878b10
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
1245 else: |
e6ba3e878b10
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
1246 funcname, indices = string, None |
e6ba3e878b10
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
1247 if funcname not in keywords: |
e6ba3e878b10
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
1248 if indices: |
569
1b801a0cb2cb
Support for context-aware methods during message extraction (fixes #229, patch by David Rios)
fschwarz
parents:
563
diff
changeset
|
1249 inds = [] |
1b801a0cb2cb
Support for context-aware methods during message extraction (fixes #229, patch by David Rios)
fschwarz
parents:
563
diff
changeset
|
1250 for x in indices.split(','): |
1b801a0cb2cb
Support for context-aware methods during message extraction (fixes #229, patch by David Rios)
fschwarz
parents:
563
diff
changeset
|
1251 if x[-1] == 'c': |
1b801a0cb2cb
Support for context-aware methods during message extraction (fixes #229, patch by David Rios)
fschwarz
parents:
563
diff
changeset
|
1252 inds.append((int(x[:-1]), 'c')) |
1b801a0cb2cb
Support for context-aware methods during message extraction (fixes #229, patch by David Rios)
fschwarz
parents:
563
diff
changeset
|
1253 else: |
1b801a0cb2cb
Support for context-aware methods during message extraction (fixes #229, patch by David Rios)
fschwarz
parents:
563
diff
changeset
|
1254 inds.append(int(x)) |
1b801a0cb2cb
Support for context-aware methods during message extraction (fixes #229, patch by David Rios)
fschwarz
parents:
563
diff
changeset
|
1255 indices = tuple(inds) |
12
e6ba3e878b10
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
1256 keywords[funcname] = indices |
e6ba3e878b10
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
1257 return keywords |
e6ba3e878b10
* Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents:
10
diff
changeset
|
1258 |
52
6b9c32893007
Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents:
51
diff
changeset
|
1259 |
1 | 1260 if __name__ == '__main__': |
55
a258e4015eb6
`new_catalog` now accepts another argument, `--domain`, which is used to build the output file path, which now is of the form `<output_dir>/<locale>/<domain>.po`, the correct form.
palgarvio
parents:
54
diff
changeset
|
1261 main() |