annotate babel/messages/frontend.py @ 593:99983baf1067 trunk

resort to hard-coded message extractors/checkers if pkg_resources is installed but no egg-info was found (#230)
author fschwarz
date Thu, 09 Aug 2012 11:20:25 +0000
parents 99c48a6ca1d6
children e61e27d9347d
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
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
2 # -*- coding: utf-8 -*-
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
3 #
530
ca203b2af83c Update the copyright line.
jruigrok
parents: 523
diff changeset
4 # Copyright (C) 2007-2011 Edgewall Software
1
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
5 # All rights reserved.
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
6 #
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
7 # This software is licensed as described in the file COPYING, which
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
8 # you should have received as part of this distribution. The terms
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
9 # are also available at http://babel.edgewall.org/wiki/License.
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
10 #
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
11 # This software consists of voluntary contributions made by many
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
12 # individuals. For the exact contribution history, see the revision
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
13 # history and logs, available at http://babel.edgewall.org/log/.
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
14
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
15 """Frontends for the message extraction functionality."""
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
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
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
19 from distutils import log
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
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
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
23 import logging
1
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
24 from optparse import OptionParser
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
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
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
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
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
30
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
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
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
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
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
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
38053412171b Add more `since` tags to stuff added in trunk.
cmlenz
parents: 232
diff changeset
42 'init_catalog', 'check_message_extractors', 'update_catalog']
1
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
43 __docformat__ = 'restructuredtext en'
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
44
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
45
160
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
46 class compile_catalog(Command):
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
47 """Catalog compilation command for use in ``setup.py`` scripts.
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
48
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
49 If correctly installed, this command is available to Setuptools-using
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
50 setup scripts automatically. For projects using plain old ``distutils``,
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
51 the command needs to be registered explicitly in ``setup.py``::
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
52
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
53 from babel.messages.frontend import compile_catalog
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
54
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
55 setup(
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
56 ...
169
ff2df4c980fb Typo fix.
palgarvio
parents: 165
diff changeset
57 cmdclass = {'compile_catalog': compile_catalog}
160
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
58 )
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
59
234
38053412171b Add more `since` tags to stuff added in trunk.
cmlenz
parents: 232
diff changeset
60 :since: version 0.9
160
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
61 :see: `Integrating new distutils commands <http://docs.python.org/dist/node32.html>`_
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
62 :see: `setuptools <http://peak.telecommunity.com/DevCenter/setuptools>`_
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
63 """
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
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
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
66 user_options = [
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
67 ('domain=', 'D',
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
68 "domain of PO file (default 'messages')"),
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
69 ('directory=', 'd',
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
70 'path to base directory containing the catalogs'),
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
71 ('input-file=', 'i',
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
72 'name of the input file'),
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
73 ('output-file=', 'o',
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
74 "name of the output file (default "
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
75 "'<output_dir>/<locale>/LC_MESSAGES/<domain>.po')"),
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
76 ('locale=', 'l',
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
77 'locale of the catalog to compile'),
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
78 ('use-fuzzy', 'f',
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
79 'also include fuzzy translations'),
207
0b6a48c8c26c Implement translations statistics, closes #18.
palgarvio
parents: 205
diff changeset
80 ('statistics', None,
0b6a48c8c26c Implement translations statistics, closes #18.
palgarvio
parents: 205
diff changeset
81 'print statistics about translations')
160
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
82 ]
207
0b6a48c8c26c Implement translations statistics, closes #18.
palgarvio
parents: 205
diff changeset
83 boolean_options = ['use-fuzzy', 'statistics']
160
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
84
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
85 def initialize_options(self):
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
86 self.domain = 'messages'
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
87 self.directory = None
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
88 self.input_file = None
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
89 self.output_file = None
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
90 self.locale = None
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
91 self.use_fuzzy = False
207
0b6a48c8c26c Implement translations statistics, closes #18.
palgarvio
parents: 205
diff changeset
92 self.statistics = False
160
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
93
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
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
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
101
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
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
0b6a48c8c26c Implement translations statistics, closes #18.
palgarvio
parents: 205
diff changeset
144 if self.statistics:
0b6a48c8c26c Implement translations statistics, closes #18.
palgarvio
parents: 205
diff changeset
145 translated = 0
0b6a48c8c26c Implement translations statistics, closes #18.
palgarvio
parents: 205
diff changeset
146 for message in list(catalog)[1:]:
0b6a48c8c26c Implement translations statistics, closes #18.
palgarvio
parents: 205
diff changeset
147 if message.string:
0b6a48c8c26c Implement translations statistics, closes #18.
palgarvio
parents: 205
diff changeset
148 translated +=1
317
67c039fc0a45 Fix for #60.
cmlenz
parents: 315
diff changeset
149 percentage = 0
67c039fc0a45 Fix for #60.
cmlenz
parents: 315
diff changeset
150 if len(catalog):
67c039fc0a45 Fix for #60.
cmlenz
parents: 315
diff changeset
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
67c039fc0a45 Fix for #60.
cmlenz
parents: 315
diff changeset
153 translated, len(catalog), percentage, po_file)
207
0b6a48c8c26c Implement translations statistics, closes #18.
palgarvio
parents: 205
diff changeset
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
bbb917a96be4 Write PO files in binary mode. Closes #61.
cmlenz
parents: 267
diff changeset
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
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
171
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
172
1
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
173 class extract_messages(Command):
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
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
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
176 If correctly installed, this command is available to Setuptools-using
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
177 setup scripts automatically. For projects using plain old ``distutils``,
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
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
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
182 setup(
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
183 ...
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
184 cmdclass = {'extract_messages': extract_messages}
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
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
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
187 :see: `Integrating new distutils commands <http://docs.python.org/dist/node32.html>`_
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
188 :see: `setuptools <http://peak.telecommunity.com/DevCenter/setuptools>`_
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
189 """
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
190
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
191 description = 'extract localizable strings from the project code'
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
192 user_options = [
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
193 ('charset=', None,
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
194 'charset to use in the output file'),
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
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
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
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
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
202 ('no-location', None,
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
203 'do not include location comments with filename and line number'),
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
204 ('omit-header', None,
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
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
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
207 'name of the output file'),
23
a05c25898be4 Added line-wrap support for `write_po`.
palgarvio
parents: 12
diff changeset
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
a05c25898be4 Added line-wrap support for `write_po`.
palgarvio
parents: 12
diff changeset
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
fccc9147d9b3 Fix typo in [58].
cmlenz
parents: 57
diff changeset
212 'into several lines'),
71
27f01e7626ea Implemented message sorting, see #7.
palgarvio
parents: 66
diff changeset
213 ('sort-output', None,
27f01e7626ea Implemented message sorting, see #7.
palgarvio
parents: 66
diff changeset
214 'generate sorted output (default False)'),
27f01e7626ea Implemented message sorting, see #7.
palgarvio
parents: 66
diff changeset
215 ('sort-by-file', None,
27f01e7626ea Implemented message sorting, see #7.
palgarvio
parents: 66
diff changeset
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
d9c6ea20904b Fix 2nd typo of [58].
palgarvio
parents: 58
diff changeset
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
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
228 ]
23
a05c25898be4 Added line-wrap support for `write_po`.
palgarvio
parents: 12
diff changeset
229 boolean_options = [
71
27f01e7626ea Implemented message sorting, see #7.
palgarvio
parents: 66
diff changeset
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
a05c25898be4 Added line-wrap support for `write_po`.
palgarvio
parents: 12
diff changeset
232 ]
1
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
233
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
234 def initialize_options(self):
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
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
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
240 self.no_location = False
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
241 self.omit_header = False
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
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
27f01e7626ea Implemented message sorting, see #7.
palgarvio
parents: 66
diff changeset
246 self.sort_output = False
27f01e7626ea Implemented message sorting, see #7.
palgarvio
parents: 66
diff changeset
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
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
253
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
254 def finalize_options(self):
23
a05c25898be4 Added line-wrap support for `write_po`.
palgarvio
parents: 12
diff changeset
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
a05c25898be4 Added line-wrap support for `write_po`.
palgarvio
parents: 12
diff changeset
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
a05c25898be4 Added line-wrap support for `write_po`.
palgarvio
parents: 12
diff changeset
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
a05c25898be4 Added line-wrap support for `write_po`.
palgarvio
parents: 12
diff changeset
265 if self.no_wrap and self.width:
71
27f01e7626ea Implemented message sorting, see #7.
palgarvio
parents: 66
diff changeset
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
a05c25898be4 Added line-wrap support for `write_po`.
palgarvio
parents: 12
diff changeset
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
27f01e7626ea Implemented message sorting, see #7.
palgarvio
parents: 66
diff changeset
273 if self.sort_output and self.sort_by_file:
27f01e7626ea Implemented message sorting, see #7.
palgarvio
parents: 66
diff changeset
274 raise DistutilsOptionError("'--sort-output' and '--sort-by-file' "
27f01e7626ea Implemented message sorting, see #7.
palgarvio
parents: 66
diff changeset
275 "are mutually exclusive")
1
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
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
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
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
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
287 outfile = open(self.output_file, 'w')
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
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
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
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
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
323 finally:
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
324 outfile.close()
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
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
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
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
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
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'),
574
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
405 ('no-wrap', None,
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
406 '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
407 'into several lines'),
51
d484eb9a70d5 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 49
diff changeset
408 ]
574
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
409 boolean_options = ['no-wrap']
51
d484eb9a70d5 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 49
diff changeset
410
d484eb9a70d5 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 49
diff changeset
411 def initialize_options(self):
d484eb9a70d5 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 49
diff changeset
412 self.output_dir = None
d484eb9a70d5 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 49
diff changeset
413 self.output_file = None
d484eb9a70d5 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 49
diff changeset
414 self.input_file = None
d484eb9a70d5 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 49
diff changeset
415 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
416 self.domain = 'messages'
574
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
417 self.no_wrap = False
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
418 self.width = None
51
d484eb9a70d5 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 49
diff changeset
419
d484eb9a70d5 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 49
diff changeset
420 def finalize_options(self):
d484eb9a70d5 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 49
diff changeset
421 if not self.input_file:
d484eb9a70d5 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 49
diff changeset
422 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
423
51
d484eb9a70d5 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 49
diff changeset
424 if not self.locale:
d484eb9a70d5 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 49
diff changeset
425 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
426 '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
427 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
428 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
429 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
430 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
431
51
d484eb9a70d5 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 49
diff changeset
432 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
433 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
434 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
435 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
436 '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
437
72c7ac384609 Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 86
diff changeset
438 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
439 os.makedirs(os.path.dirname(self.output_file))
574
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
440 if not self.no_wrap:
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
441 self.width = 76
51
d484eb9a70d5 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 49
diff changeset
442
d484eb9a70d5 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 49
diff changeset
443 def run(self):
90
21e3f63ee8a5 Some doc improvements on distutils integration.
cmlenz
parents: 88
diff changeset
444 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
445 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
446
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
447 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
448 try:
370
bc18179832b7 We no longer neglect `catalog.plurals`. Added tests for it. Fixes #120.
palgarvio
parents: 338
diff changeset
449 # Although reading from the catalog template, read_po must be fed
563
c6bc419cc32a fix spelling in comments
fschwarz
parents: 546
diff changeset
450 # 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
451 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
452 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
453 infile.close()
87
72c7ac384609 Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 86
diff changeset
454
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
455 catalog.locale = self._locale
251
242c9ba1d41d don't init new catalogs as fuzzy
pjenvey
parents: 250
diff changeset
456 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
457
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
458 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
459 try:
574
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
460 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
461 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
462 outfile.close()
51
d484eb9a70d5 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 49
diff changeset
463
d484eb9a70d5 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 49
diff changeset
464
181
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
465 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
466 """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
467
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
468 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
469 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
470 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
471
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
472 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
473
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
474 setup(
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
475 ...
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
476 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
477 )
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
478
234
38053412171b Add more `since` tags to stuff added in trunk.
cmlenz
parents: 232
diff changeset
479 :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
480 :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
481 :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
482 """
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
483
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
484 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
485 user_options = [
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
486 ('domain=', 'D',
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
487 "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
488 ('input-file=', 'i',
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
489 '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
490 ('output-dir=', 'd',
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
491 '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
492 ('output-file=', 'o',
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
493 "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
494 "'<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
495 ('locale=', 'l',
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
496 'locale of the catalog to compile'),
574
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
497 ('no-wrap', None,
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
498 '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
499 '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
500 ('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
501 '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
502 ('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
503 '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
504 ('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
505 '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
506 ]
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
507 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
508
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
509 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
510 self.domain = 'messages'
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
511 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
512 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
513 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
514 self.locale = None
574
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
515 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
516 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
517 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
518 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
519
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
520 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
521 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
522 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
523 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
524 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
525 'directory')
196
b38a6b220ea2 Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 191
diff changeset
526 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
527 raise DistutilsOptionError('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
528 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
529 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
530
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
531 def run(self):
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
532 po_files = []
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:
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
534 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
535 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
536 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
537 'LC_MESSAGES',
b38a6b220ea2 Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 191
diff changeset
538 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
539 else:
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
540 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
541 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
542 'LC_MESSAGES',
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
543 self.domain + '.po')
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
544 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
545 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
546 else:
196
b38a6b220ea2 Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 191
diff changeset
547 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
548
b38a6b220ea2 Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 191
diff changeset
549 domain = self.domain
b38a6b220ea2 Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 191
diff changeset
550 if not domain:
b38a6b220ea2 Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 191
diff changeset
551 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
552
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
553 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
554 try:
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
555 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
556 finally:
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
557 infile.close()
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
558
208
d17f4b876f95 Make frontends that make use of a ''loop all'' fail if no message catalogs are found.
palgarvio
parents: 207
diff changeset
559 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
560 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
561
574
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
562 extra_params = {}
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
563 if self.no_wrap:
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
564 extra_params['width'] = None
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
565
196
b38a6b220ea2 Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 191
diff changeset
566 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
567 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
568 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
569 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
570 try:
196
b38a6b220ea2 Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 191
diff changeset
571 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
572 finally:
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
573 infile.close()
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
574
204
aee836bafc4e Fix for bug introduced in [208]. Closes #37.
cmlenz
parents: 200
diff changeset
575 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
576
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
577 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
578 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
579 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
580 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
581 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
582 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
583 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
584 ignore_obsolete=self.ignore_obsolete,
574
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
585 include_previous=self.previous, **extra_params)
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
586 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
587 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
588 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
589 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
590 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
591
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 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
593 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
594 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
595 # 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
596 # 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
597 # 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
598 # 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
599 # 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
600 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
601 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
602 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
603
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
604
52
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
605 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
606 """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
607
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
608 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
609 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
610 """
52
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
611
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
612 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
613 version = '%%prog %s' % VERSION
161
212d8469ec8c Slightly simplified CLI-frontend class.
cmlenz
parents: 160
diff changeset
614 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
615 '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
616 '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
617 '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
618 '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
619 }
52
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 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
622 """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
623
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
624 :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
625 """
127
1bf549a5dc1c Add a couple of CLI tests.
cmlenz
parents: 123
diff changeset
626 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
627 version=self.version)
63
47353672f1a8 Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 62
diff changeset
628 self.parser.disable_interspersed_args()
47353672f1a8 Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 62
diff changeset
629 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
630 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
631 action='store_true',
6503a227ba93 Add a command-line option that prints out all available locales. Closes #24.
cmlenz
parents: 181
diff changeset
632 help="print all known locales and exit")
232
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
633 self.parser.add_option('-v', '--verbose', action='store_const',
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
634 dest='loglevel', const=logging.DEBUG,
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
635 help='print as much as possible')
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
636 self.parser.add_option('-q', '--quiet', action='store_const',
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
637 dest='loglevel', const=logging.ERROR,
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
638 help='print as little as possible')
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
639 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
640
63
47353672f1a8 Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 62
diff changeset
641 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
642
523
e5a2231ce176 shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents: 521
diff changeset
643 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
644 if options.list_locales:
546
fd3bda2d3d34 rename babel.localedata.list() to ease Python 3 transition (fixes #250)
fschwarz
parents: 533
diff changeset
645 identifiers = localedata.locale_identifiers()
185
6503a227ba93 Add a command-line option that prints out all available locales. Closes #24.
cmlenz
parents: 181
diff changeset
646 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
647 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
648 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
649 for identifier in identifiers:
185
6503a227ba93 Add a command-line option that prints out all available locales. Closes #24.
cmlenz
parents: 181
diff changeset
650 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
651 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
652 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
653 getpreferredencoding() or
03b4ed33d413 When using sys.stdout with a pipe or redirection the sys.stdout.encoding value
jruigrok
parents: 290
diff changeset
654 'ascii', 'replace')
185
6503a227ba93 Add a command-line option that prints out all available locales. Closes #24.
cmlenz
parents: 181
diff changeset
655 return 0
6503a227ba93 Add a command-line option that prints out all available locales. Closes #24.
cmlenz
parents: 181
diff changeset
656
52
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
657 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
658 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
659 '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
660
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
661 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
662 if cmdname not in self.commands:
127
1bf549a5dc1c Add a couple of CLI tests.
cmlenz
parents: 123
diff changeset
663 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
664
185
6503a227ba93 Add a command-line option that prints out all available locales. Closes #24.
cmlenz
parents: 181
diff changeset
665 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
666
523
e5a2231ce176 shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents: 521
diff changeset
667 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
668 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
669 self.log.setLevel(loglevel)
e5a2231ce176 shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents: 521
diff changeset
670 # 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
671 # 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
672 # normal Python class.
e5a2231ce176 shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents: 521
diff changeset
673 if self.log.handlers:
e5a2231ce176 shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents: 521
diff changeset
674 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
675 else:
e5a2231ce176 shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents: 521
diff changeset
676 handler = logging.StreamHandler()
e5a2231ce176 shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents: 521
diff changeset
677 self.log.addHandler(handler)
e5a2231ce176 shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents: 521
diff changeset
678 handler.setLevel(loglevel)
e5a2231ce176 shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents: 521
diff changeset
679 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
680 handler.setFormatter(formatter)
e5a2231ce176 shorten the __init__() method of !CommandLineInterface by extracting the logging configuration into another method
fschwarz
parents: 521
diff changeset
681
63
47353672f1a8 Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 62
diff changeset
682 def _help(self):
47353672f1a8 Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 62
diff changeset
683 print self.parser.format_help()
127
1bf549a5dc1c Add a couple of CLI tests.
cmlenz
parents: 123
diff changeset
684 print "commands:"
63
47353672f1a8 Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 62
diff changeset
685 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
686 format = " %%-%ds %%s" % max(8, longest + 1)
161
212d8469ec8c Slightly simplified CLI-frontend class.
cmlenz
parents: 160
diff changeset
687 commands = self.commands.items()
212d8469ec8c Slightly simplified CLI-frontend class.
cmlenz
parents: 160
diff changeset
688 commands.sort()
212d8469ec8c Slightly simplified CLI-frontend class.
cmlenz
parents: 160
diff changeset
689 for name, description in commands:
212d8469ec8c Slightly simplified CLI-frontend class.
cmlenz
parents: 160
diff changeset
690 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
691
160
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
692 def compile(self, argv):
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
693 """Subcommand for compiling a message catalog to a MO file.
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
694
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
695 :param argv: the command arguments
234
38053412171b Add more `since` tags to stuff added in trunk.
cmlenz
parents: 232
diff changeset
696 :since: version 0.9
160
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
697 """
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
698 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
699 description=self.commands['compile'])
160
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
700 parser.add_option('--domain', '-D', dest='domain',
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
701 help="domain of MO and PO files (default '%default')")
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
702 parser.add_option('--directory', '-d', dest='directory',
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
703 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
704 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
705 help='locale of the catalog')
160
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
706 parser.add_option('--input-file', '-i', dest='input_file',
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
707 metavar='FILE', help='name of the input file')
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
708 parser.add_option('--output-file', '-o', dest='output_file',
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
709 metavar='FILE',
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
710 help="name of the output file (default "
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
711 "'<output_dir>/<locale>/LC_MESSAGES/"
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
712 "<domain>.mo')")
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
713 parser.add_option('--use-fuzzy', '-f', dest='use_fuzzy',
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
714 action='store_true',
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
715 help='also include fuzzy translations (default '
207
0b6a48c8c26c Implement translations statistics, closes #18.
palgarvio
parents: 205
diff changeset
716 '%default)')
0b6a48c8c26c Implement translations statistics, closes #18.
palgarvio
parents: 205
diff changeset
717 parser.add_option('--statistics', dest='statistics',
0b6a48c8c26c Implement translations statistics, closes #18.
palgarvio
parents: 205
diff changeset
718 action='store_true',
0b6a48c8c26c Implement translations statistics, closes #18.
palgarvio
parents: 205
diff changeset
719 help='print statistics about translations')
160
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
720
170
3f9d9268537d Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 169
diff changeset
721 parser.set_defaults(domain='messages', use_fuzzy=False,
207
0b6a48c8c26c Implement translations statistics, closes #18.
palgarvio
parents: 205
diff changeset
722 compile_all=False, statistics=False)
170
3f9d9268537d Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 169
diff changeset
723 options, args = parser.parse_args(argv)
160
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
724
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
725 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
726 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
727 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
728 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
729 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
730 '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
731 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
732 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
733 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
734 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
735 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
736 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
737 '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
738 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
739 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
740 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
741 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
742 '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
743 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
744 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
745 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
746 '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
747 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
748 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
749 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
750 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
751 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
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 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
754 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
755 'the base directory')
290
4f48bc780538 we must mean options.locale here
pjenvey
parents: 288
diff changeset
756 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
757 '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
758 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
759 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
760 parser.error('no message catalogs found')
160
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
761
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 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
763 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
764 infile = open(po_file, 'r')
170
3f9d9268537d Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 169
diff changeset
765 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
766 catalog = read_po(infile, locale)
170
3f9d9268537d Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 169
diff changeset
767 finally:
3f9d9268537d Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 169
diff changeset
768 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
769
207
0b6a48c8c26c Implement translations statistics, closes #18.
palgarvio
parents: 205
diff changeset
770 if options.statistics:
0b6a48c8c26c Implement translations statistics, closes #18.
palgarvio
parents: 205
diff changeset
771 translated = 0
0b6a48c8c26c Implement translations statistics, closes #18.
palgarvio
parents: 205
diff changeset
772 for message in list(catalog)[1:]:
0b6a48c8c26c Implement translations statistics, closes #18.
palgarvio
parents: 205
diff changeset
773 if message.string:
0b6a48c8c26c Implement translations statistics, closes #18.
palgarvio
parents: 205
diff changeset
774 translated +=1
317
67c039fc0a45 Fix for #60.
cmlenz
parents: 315
diff changeset
775 percentage = 0
67c039fc0a45 Fix for #60.
cmlenz
parents: 315
diff changeset
776 if len(catalog):
67c039fc0a45 Fix for #60.
cmlenz
parents: 315
diff changeset
777 percentage = translated * 100 // len(catalog)
232
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
778 self.log.info("%d of %d messages (%d%%) translated in %r",
317
67c039fc0a45 Fix for #60.
cmlenz
parents: 315
diff changeset
779 translated, len(catalog), percentage, po_file)
207
0b6a48c8c26c Implement translations statistics, closes #18.
palgarvio
parents: 205
diff changeset
780
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
781 if catalog.fuzzy and not options.use_fuzzy:
232
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
782 self.log.warn('catalog %r is marked as fuzzy, skipping',
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
783 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
784 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
785
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
786 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
787 for error in errors:
232
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
788 self.log.error('error: %s:%d: %s', po_file, message.lineno,
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
789 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
790
232
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
791 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
792
279
bbb917a96be4 Write PO files in binary mode. Closes #61.
cmlenz
parents: 267
diff changeset
793 outfile = open(mo_file, 'wb')
170
3f9d9268537d Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 169
diff changeset
794 try:
3f9d9268537d Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 169
diff changeset
795 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
796 finally:
3f9d9268537d Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 169
diff changeset
797 outfile.close()
160
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
798
52
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
799 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
800 """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
801 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
802
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
803 :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
804 """
66
2504451884f3 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 63
diff changeset
805 parser = OptionParser(usage=self.usage % ('extract', 'dir1 <dir2> ...'),
161
212d8469ec8c Slightly simplified CLI-frontend class.
cmlenz
parents: 160
diff changeset
806 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
807 parser.add_option('--charset', dest='charset',
160
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
808 help='charset to use in the output (default '
23005b4efc99 Add MO file generation. Closes #21.
cmlenz
parents: 144
diff changeset
809 '"%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
810 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
811 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
812 '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
813 '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
814 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
815 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
816 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
817 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
818 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
819 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
820 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
821 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
822 '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
823 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
824 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
825 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
826 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
827 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
828 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
829 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
830 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
831 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
832 'the output line width, into several lines')
71
27f01e7626ea Implemented message sorting, see #7.
palgarvio
parents: 66
diff changeset
833 parser.add_option('--sort-output', dest='sort_output',
27f01e7626ea Implemented message sorting, see #7.
palgarvio
parents: 66
diff changeset
834 action='store_true',
27f01e7626ea Implemented message sorting, see #7.
palgarvio
parents: 66
diff changeset
835 help='generate sorted output (default False)')
27f01e7626ea Implemented message sorting, see #7.
palgarvio
parents: 66
diff changeset
836 parser.add_option('--sort-by-file', dest='sort_by_file',
27f01e7626ea Implemented message sorting, see #7.
palgarvio
parents: 66
diff changeset
837 action='store_true',
27f01e7626ea Implemented message sorting, see #7.
palgarvio
parents: 66
diff changeset
838 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
839 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
840 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
841 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
842 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
843 help='set copyright holder in output')
429
28755da4bf13 add `--project` and `--version` options for commandline (fixes #173)
dfraser
parents: 424
diff changeset
844 parser.add_option('--project', dest='project',
28755da4bf13 add `--project` and `--version` options for commandline (fixes #173)
dfraser
parents: 424
diff changeset
845 help='set project name in output')
28755da4bf13 add `--project` and `--version` options for commandline (fixes #173)
dfraser
parents: 424
diff changeset
846 parser.add_option('--version', dest='version',
28755da4bf13 add `--project` and `--version` options for commandline (fixes #173)
dfraser
parents: 424
diff changeset
847 help='set project version in output')
95
f9007588a860 Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents: 90
diff changeset
848 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
849 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
850 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
851 '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
852 '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
853 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
854 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
855 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
856
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
857 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
858 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
859 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
860 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
861 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
862 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
863 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
864 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
865
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
866 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
867 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
868 else:
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
869 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
870
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
871 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
872 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
873 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
874 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
875 '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
876 keywords = {}
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
877 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
878 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
879
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
880 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
881 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
882 try:
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
883 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
884 finally:
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
885 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
886 else:
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
887 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
888 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
889
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.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
891 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
892 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
893 options.width = 76
87
72c7ac384609 Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 86
diff changeset
894
71
27f01e7626ea Implemented message sorting, see #7.
palgarvio
parents: 66
diff changeset
895 if options.sort_output and options.sort_by_file:
27f01e7626ea Implemented message sorting, see #7.
palgarvio
parents: 66
diff changeset
896 parser.error("'--sort-output' and '--sort-by-file' are mutually "
27f01e7626ea Implemented message sorting, see #7.
palgarvio
parents: 66
diff changeset
897 "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
898
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
899 try:
429
28755da4bf13 add `--project` and `--version` options for commandline (fixes #173)
dfraser
parents: 424
diff changeset
900 catalog = Catalog(project=options.project,
28755da4bf13 add `--project` and `--version` options for commandline (fixes #173)
dfraser
parents: 424
diff changeset
901 version=options.version,
28755da4bf13 add `--project` and `--version` options for commandline (fixes #173)
dfraser
parents: 424
diff changeset
902 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
903 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
904 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
905
52
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
906 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
907 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
908 parser.error('%r is not a directory' % dirname)
232
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
909
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
910 def callback(filename, method, options):
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
911 if method == 'ignore':
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
912 return
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
913 filepath = os.path.normpath(os.path.join(dirname, filename))
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
914 optstr = ''
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
915 if options:
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
916 optstr = ' (%s)' % ', '.join(['%s="%s"' % (k, v) for
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
917 k, v in options.items()])
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
918 self.log.info('extracting messages from %s%s', filepath,
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
919 optstr)
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
920
95
f9007588a860 Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents: 90
diff changeset
921 extracted = extract_from_dir(dirname, method_map, options_map,
232
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
922 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
923 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
924 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
925 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
926 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
927 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
928 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
929 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
930
232
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
931 if options.output not in (None, '-'):
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
932 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
933 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
934 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
935 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
936 sort_output=options.sort_output,
112
5c55ca587c89 copyright_holder arg is no longer needed for write_po
pjenvey
parents: 110
diff changeset
937 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
938 finally:
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
939 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
940 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
941
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
942 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
943 """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
944
52
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
945 :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
946 """
165
628bc271ece4 Implement fuzzy matching to catalog updates. No frontend yet.
cmlenz
parents: 161
diff changeset
947 parser = OptionParser(usage=self.usage % ('init', ''),
161
212d8469ec8c Slightly simplified CLI-frontend class.
cmlenz
parents: 160
diff changeset
948 description=self.commands['init'])
66
2504451884f3 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 63
diff changeset
949 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
950 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
951 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
952 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
953 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
954 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
955 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
956 metavar='FILE',
66
2504451884f3 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 63
diff changeset
957 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
958 "'<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
959 "<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
960 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
961 help='locale for the new localized catalog')
574
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
962 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
963 help='do not break long message lines, longer than '
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
964 '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
965
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
966 parser.set_defaults(domain='messages')
66
2504451884f3 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 63
diff changeset
967 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
968
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 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
970 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
971 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
972 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
973 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
974 parser.error(e)
87
72c7ac384609 Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 86
diff changeset
975
66
2504451884f3 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 63
diff changeset
976 if not options.input_file:
2504451884f3 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 63
diff changeset
977 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
978
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
979 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
980 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
981
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
982 if not options.output_file:
66
2504451884f3 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 63
diff changeset
983 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
984 options.locale, 'LC_MESSAGES',
66
2504451884f3 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 63
diff changeset
985 options.domain + '.po')
87
72c7ac384609 Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 86
diff changeset
986 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
987 os.makedirs(os.path.dirname(options.output_file))
574
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
988 width = 76
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
989 if options.no_wrap:
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
990 width = None
87
72c7ac384609 Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 86
diff changeset
991
66
2504451884f3 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 63
diff changeset
992 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
993 try:
371
8717e7302887 Include fix of [407] in `pybabel`.
palgarvio
parents: 370
diff changeset
994 # Although reading from the catalog template, read_po must be fed
563
c6bc419cc32a fix spelling in comments
fschwarz
parents: 546
diff changeset
995 # the locale in order to correctly calculate plurals
371
8717e7302887 Include fix of [407] in `pybabel`.
palgarvio
parents: 370
diff changeset
996 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
997 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
998 infile.close()
87
72c7ac384609 Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 86
diff changeset
999
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
1000 catalog.locale = locale
132
7fcd542fdd75 Set explicit local timezone for CLI `init` command.
cmlenz
parents: 127
diff changeset
1001 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
1002
232
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
1003 self.log.info('creating catalog %r based on %r', options.output_file,
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
1004 options.input_file)
66
2504451884f3 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 63
diff changeset
1005
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
1006 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
1007 try:
574
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
1008 write_po(outfile, catalog, width=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
1009 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
1010 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
1011
181
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
1012 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
1013 """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
1014
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
1015 :param argv: the command arguments
234
38053412171b Add more `since` tags to stuff added in trunk.
cmlenz
parents: 232
diff changeset
1016 :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
1017 """
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
1018 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
1019 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
1020 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
1021 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
1022 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
1023 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
1024 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
1025 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
1026 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
1027 metavar='FILE',
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
1028 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
1029 "'<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
1030 "<domain>.po')")
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
1031 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
1032 help='locale of the translations catalog')
574
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
1033 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
1034 help='do not break long message lines, longer than '
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
1035 '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
1036 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
1037 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
1038 help='do not include obsolete messages in the output '
417
4acdc0fdb87c Typo's and sorted output of `list-locales`.
palgarvio
parents: 414
diff changeset
1039 '(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
1040 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
1041 action='store_true',
417
4acdc0fdb87c Typo's and sorted output of `list-locales`.
palgarvio
parents: 414
diff changeset
1042 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
1043 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
1044 help='keep previous msgids of translated messages '
417
4acdc0fdb87c Typo's and sorted output of `list-locales`.
palgarvio
parents: 414
diff changeset
1045 '(default %default)')
181
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
1046
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
1047 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
1048 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
1049 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
1050
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
1051 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
1052 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
1053 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
1054 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
1055 if options.output_file and not options.locale:
417
4acdc0fdb87c Typo's and sorted output of `list-locales`.
palgarvio
parents: 414
diff changeset
1056 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
1057 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
1058 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
1059
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
1060 po_files = []
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
1061 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
1062 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
1063 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
1064 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
1065 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
1066 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
1067 else:
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
1068 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
1069 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
1070 'LC_MESSAGES',
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
1071 options.domain + '.po')
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
1072 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
1073 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
1074 else:
196
b38a6b220ea2 Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 191
diff changeset
1075 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
1076
b38a6b220ea2 Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 191
diff changeset
1077 domain = options.domain
b38a6b220ea2 Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 191
diff changeset
1078 if not domain:
b38a6b220ea2 Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 191
diff changeset
1079 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
1080
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
1081 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
1082 try:
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
1083 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
1084 finally:
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
1085 infile.close()
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
1086
208
d17f4b876f95 Make frontends that make use of a ''loop all'' fail if no message catalogs are found.
palgarvio
parents: 207
diff changeset
1087 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
1088 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
1089
574
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
1090 extra_params = {}
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
1091 if options.no_wrap:
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
1092 extra_params['width'] = None
196
b38a6b220ea2 Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 191
diff changeset
1093 for locale, filename in po_files:
232
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
1094 self.log.info('updating catalog %r based on %r', filename,
bdbbfc7c1d79 Use logging module for output from CLI frontend.
cmlenz
parents: 231
diff changeset
1095 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
1096 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
1097 try:
196
b38a6b220ea2 Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents: 191
diff changeset
1098 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
1099 finally:
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
1100 infile.close()
8a762ce37bf7 The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents: 178
diff changeset
1101
204
aee836bafc4e Fix for bug introduced in [208]. Closes #37.
cmlenz
parents: 200
diff changeset
1102 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
1103
0eb3eb447256 Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents: 196
diff changeset
1104 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
1105 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
1106 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
1107 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
1108 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
1109 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
1110 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
1111 ignore_obsolete=options.ignore_obsolete,
574
99c48a6ca1d6 add "--no-wrap" option for init/update commands (#289)
fschwarz
parents: 569
diff changeset
1112 include_previous=options.previous, **extra_params)
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
1113 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
1114 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
1115 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
1116 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
1117 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
1118
0eb3eb447256 Fix for #36: avoid corrupting the catalog on update when there's an error in the writing process.
cmlenz
parents: 196
diff changeset
1119 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
1120 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
1121 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
1122 # 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
1123 # 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
1124 # 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
1125 # 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
1126 # 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
1127 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
1128 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
1129 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
1130
165
628bc271ece4 Implement fuzzy matching to catalog updates. No frontend yet.
cmlenz
parents: 161
diff changeset
1131
52
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
1132 def main():
185
6503a227ba93 Add a command-line option that prints out all available locales. Closes #24.
cmlenz
parents: 181
diff changeset
1133 return CommandLineInterface().run(sys.argv)
1
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
1134
48
22b90b3b161a Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 47
diff changeset
1135 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
1136 """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
1137
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
1138 >>> 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
1139 ... [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
1140 ... 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
1141 ...
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
1142 ... # Python source files
62
2df27f49c320 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 59
diff changeset
1143 ... [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
1144 ...
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
1145 ... # Genshi templates
62
2df27f49c320 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 59
diff changeset
1146 ... [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
1147 ... include_attrs =
62
2df27f49c320 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 59
diff changeset
1148 ... [genshi: **/templates/**.txt]
144
14fe2a8fb842 Some doc fixes.
cmlenz
parents: 132
diff changeset
1149 ... 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
1150 ... 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
1151 ...
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
1152 ... # 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
1153 ... [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
1154 ... ''')
52
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
1155
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 >>> 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
1157 >>> 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
1158 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
1159
62
2df27f49c320 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 59
diff changeset
1160 >>> method_map[0]
2df27f49c320 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 59
diff changeset
1161 ('**.py', 'python')
2df27f49c320 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 59
diff changeset
1162 >>> 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
1163 {}
62
2df27f49c320 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 59
diff changeset
1164 >>> method_map[1]
2df27f49c320 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 59
diff changeset
1165 ('**/templates/**.html', 'genshi')
2df27f49c320 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 59
diff changeset
1166 >>> 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
1167 ''
62
2df27f49c320 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 59
diff changeset
1168 >>> method_map[2]
2df27f49c320 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 59
diff changeset
1169 ('**/templates/**.txt', 'genshi')
2df27f49c320 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 59
diff changeset
1170 >>> options_map['**/templates/**.txt']['template_class']
144
14fe2a8fb842 Some doc fixes.
cmlenz
parents: 132
diff changeset
1171 'genshi.template:TextTemplate'
62
2df27f49c320 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 59
diff changeset
1172 >>> 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
1173 '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
1174
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
1175 >>> 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
1176 ('**/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
1177 >>> 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
1178 {}
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
1179
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
1180 :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
1181 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
1182 :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
1183 :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
1184 :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
1185 """
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
1186 extractors = {}
62
2df27f49c320 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 59
diff changeset
1187 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
1188 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
1189
48
22b90b3b161a Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 47
diff changeset
1190 parser = RawConfigParser()
62
2df27f49c320 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 59
diff changeset
1191 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
1192 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
1193 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
1194 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
1195 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
1196 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
1197 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
1198 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
1199 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
1200
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
1201 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
1202 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
1203 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
1204 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
1205 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
1206
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
1207 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
1208
12
e6ba3e878b10 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 10
diff changeset
1209 def parse_keywords(strings=[]):
e6ba3e878b10 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 10
diff changeset
1210 """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
1211
569
1b801a0cb2cb Support for context-aware methods during message extraction (fixes #229, patch by David Rios)
fschwarz
parents: 563
diff changeset
1212 >>> 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
1213 >>> kw.sort()
05487ae7696e fix Python 2.3 compat: rearrange set/itemgetter/rsplit/sorted/unicode.decode
pjenvey
parents: 371
diff changeset
1214 >>> for keyword, indices in kw:
12
e6ba3e878b10 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 10
diff changeset
1215 ... print (keyword, indices)
e6ba3e878b10 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 10
diff changeset
1216 ('_', None)
e6ba3e878b10 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 10
diff changeset
1217 ('dgettext', (2,))
e6ba3e878b10 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 10
diff changeset
1218 ('dngettext', (2, 3))
569
1b801a0cb2cb Support for context-aware methods during message extraction (fixes #229, patch by David Rios)
fschwarz
parents: 563
diff changeset
1219 ('pgettext', ((1, 'c'), 2))
12
e6ba3e878b10 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 10
diff changeset
1220 """
e6ba3e878b10 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 10
diff changeset
1221 keywords = {}
e6ba3e878b10 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 10
diff changeset
1222 for string in strings:
e6ba3e878b10 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 10
diff changeset
1223 if ':' in string:
e6ba3e878b10 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 10
diff changeset
1224 funcname, indices = string.split(':')
e6ba3e878b10 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 10
diff changeset
1225 else:
e6ba3e878b10 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 10
diff changeset
1226 funcname, indices = string, None
e6ba3e878b10 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 10
diff changeset
1227 if funcname not in keywords:
e6ba3e878b10 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 10
diff changeset
1228 if indices:
569
1b801a0cb2cb Support for context-aware methods during message extraction (fixes #229, patch by David Rios)
fschwarz
parents: 563
diff changeset
1229 inds = []
1b801a0cb2cb Support for context-aware methods during message extraction (fixes #229, patch by David Rios)
fschwarz
parents: 563
diff changeset
1230 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
1231 if x[-1] == 'c':
1b801a0cb2cb Support for context-aware methods during message extraction (fixes #229, patch by David Rios)
fschwarz
parents: 563
diff changeset
1232 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
1233 else:
1b801a0cb2cb Support for context-aware methods during message extraction (fixes #229, patch by David Rios)
fschwarz
parents: 563
diff changeset
1234 inds.append(int(x))
1b801a0cb2cb Support for context-aware methods during message extraction (fixes #229, patch by David Rios)
fschwarz
parents: 563
diff changeset
1235 indices = tuple(inds)
12
e6ba3e878b10 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 10
diff changeset
1236 keywords[funcname] = indices
e6ba3e878b10 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 10
diff changeset
1237 return keywords
e6ba3e878b10 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 10
diff changeset
1238
52
6b9c32893007 Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 51
diff changeset
1239
1
7870274479f5 Import of initial code base.
cmlenz
parents:
diff changeset
1240 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
1241 main()
Copyright (C) 2012-2017 Edgewall Software