annotate babel/messages/frontend.py @ 90:cbc44fce25aa

Completely fixed the bug reported by pjenvey, partially addressed on [87].
author palgarvio
date Mon, 11 Jun 2007 19:43:58 +0000
parents 31519c52c0fe
children 6d1a7777003e
rev   line source
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
1 #!/usr/bin/env python
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
2 # -*- coding: utf-8 -*-
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
3 #
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
4 # Copyright (C) 2007 Edgewall Software
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
5 # All rights reserved.
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
6 #
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
7 # This software is licensed as described in the file COPYING, which
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
8 # you should have received as part of this distribution. The terms
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
9 # are also available at http://babel.edgewall.org/wiki/License.
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
10 #
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
11 # This software consists of voluntary contributions made by many
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
12 # individuals. For the exact contribution history, see the revision
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
13 # history and logs, available at http://babel.edgewall.org/log/.
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
14
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
15 """Frontends for the message extraction functionality."""
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
16
50
b6497cfd06d6 Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 49
diff changeset
17 from ConfigParser import RawConfigParser
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
18 from distutils import log
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
19 from distutils.cmd import Command
51
3664c93860f1 Support a `message_extractors` keyword argument directly in `setup()`. Closes #4.
cmlenz
parents: 50
diff changeset
20 from distutils.errors import DistutilsOptionError, DistutilsSetupError
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
21 from optparse import OptionParser
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
22 import os
49
9979a409589e 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: 26
diff changeset
23 import re
51
3664c93860f1 Support a `message_extractors` keyword argument directly in `setup()`. Closes #4.
cmlenz
parents: 50
diff changeset
24 from StringIO import StringIO
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
25 import sys
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
26
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
27 from babel import __version__ as VERSION
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
28 from babel import Locale
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
29 from babel.core import UnknownLocaleError
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents: 57
diff changeset
30 from babel.messages.catalog import Catalog
56
27d55a07c897 Rename the `babel.catalog` package to `babel.messages` for consistency with the other package names.
cmlenz
parents: 54
diff changeset
31 from babel.messages.extract import extract_from_dir, DEFAULT_KEYWORDS, \
27d55a07c897 Rename the `babel.catalog` package to `babel.messages` for consistency with the other package names.
cmlenz
parents: 54
diff changeset
32 DEFAULT_MAPPING
27d55a07c897 Rename the `babel.catalog` package to `babel.messages` for consistency with the other package names.
cmlenz
parents: 54
diff changeset
33 from babel.messages.pofile import write_po, write_pot
27d55a07c897 Rename the `babel.catalog` package to `babel.messages` for consistency with the other package names.
cmlenz
parents: 54
diff changeset
34 from babel.messages.plurals import PLURALS
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
35 from babel.util import odict
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
36
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
37 __all__ = ['CommandLineInterface', 'extract_messages',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
38 'check_message_extractors', 'main']
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
39 __docformat__ = 'restructuredtext en'
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
40
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
41
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
42 class extract_messages(Command):
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
43 """Message extraction command for use in ``setup.py`` scripts.
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
44
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
45 If correctly installed, this command is available to Setuptools-using
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
46 setup scripts automatically. For projects using plain old ``distutils``,
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
47 the command needs to be registered explicitly in ``setup.py``::
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
48
56
27d55a07c897 Rename the `babel.catalog` package to `babel.messages` for consistency with the other package names.
cmlenz
parents: 54
diff changeset
49 from babel.messages.frontend import extract_messages
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
50
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
51 setup(
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
52 ...
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
53 cmdclass = {'extract_messages': extract_messages}
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
54 )
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
55
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
56 :see: `Integrating new distutils commands <http://docs.python.org/dist/node32.html>`_
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
57 :see: `setuptools <http://peak.telecommunity.com/DevCenter/setuptools>`_
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
58 """
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
59
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
60 description = 'extract localizable strings from the project code'
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
61 user_options = [
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
62 ('charset=', None,
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
63 'charset to use in the output file'),
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
64 ('keywords=', 'k',
12
0ce673c24cb1 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: 9
diff changeset
65 'space-separated list of keywords to look for in addition to the '
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
66 'defaults'),
12
0ce673c24cb1 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: 9
diff changeset
67 ('no-default-keywords', None,
14
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
68 'do not include the default keywords'),
49
9979a409589e 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: 26
diff changeset
69 ('mapping-file=', 'F',
9979a409589e 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: 26
diff changeset
70 'path to the mapping configuration file'),
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
71 ('no-location', None,
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
72 'do not include location comments with filename and line number'),
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
73 ('omit-header', None,
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
74 'do not include msgid "" entry in header'),
7
8d7b3077e6d1 * The creation-date header in generated PO files now includes the timezone offset.
cmlenz
parents: 3
diff changeset
75 ('output-file=', 'o',
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
76 'name of the output file'),
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
77 ('width=', 'w',
26
93eaa2f4a0a2 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: 25
diff changeset
78 'set output line width (default 76)'),
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
79 ('no-wrap', None,
26
93eaa2f4a0a2 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: 25
diff changeset
80 'do not break long message lines, longer than the output line width, '
60
341d04297f24 Fix typo in [58].
cmlenz
parents: 59
diff changeset
81 'into several lines'),
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
82 ('sort-output', None,
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
83 'generate sorted output (default False)'),
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
84 ('sort-by-file', None,
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
85 'sort output by file location (default False)'),
80
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 73
diff changeset
86 ('msgid-bugs-address=', None,
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 73
diff changeset
87 'set report address for msgid'),
81
51f73a110a84 Implemented item 4 from #12. Set the copyright holder in the output.
palgarvio
parents: 80
diff changeset
88 ('copyright-holder=', None,
51f73a110a84 Implemented item 4 from #12. Set the copyright holder in the output.
palgarvio
parents: 80
diff changeset
89 'set copyright holder in output'),
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
90 ('add-comments=', 'c',
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
91 'place comment block with TAG (or those preceding keyword lines) in '
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
92 'output file. Seperate multiple TAGs with commas(,)'),
61
477cf09c22e5 Fix 2nd typo of [58].
palgarvio
parents: 60
diff changeset
93 ('input-dirs=', None,
59
e68fd956ebce * 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: 58
diff changeset
94 'directories that should be scanned for messages'),
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
95 ]
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
96 boolean_options = [
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
97 'no-default-keywords', 'no-location', 'omit-header', 'no-wrap',
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
98 'sort-output', 'sort-by-file'
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
99 ]
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
100
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
101 def initialize_options(self):
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
102 self.charset = 'utf-8'
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
103 self.keywords = self._keywords = DEFAULT_KEYWORDS.copy()
14
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
104 self.no_default_keywords = False
49
9979a409589e 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: 26
diff changeset
105 self.mapping_file = None
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
106 self.no_location = False
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
107 self.omit_header = False
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
108 self.output_file = None
59
e68fd956ebce * 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: 58
diff changeset
109 self.input_dirs = None
49
9979a409589e 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: 26
diff changeset
110 self.width = 76
9979a409589e 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: 26
diff changeset
111 self.no_wrap = False
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
112 self.sort_output = False
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
113 self.sort_by_file = False
80
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 73
diff changeset
114 self.msgid_bugs_address = None
81
51f73a110a84 Implemented item 4 from #12. Set the copyright holder in the output.
palgarvio
parents: 80
diff changeset
115 self.copyright_holder = None
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
116 self.add_comments = None
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
117 self._add_comments = None
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
118
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
119 def finalize_options(self):
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
120 if self.no_default_keywords and not self.keywords:
26
93eaa2f4a0a2 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: 25
diff changeset
121 raise DistutilsOptionError('you must specify new keywords if you '
93eaa2f4a0a2 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: 25
diff changeset
122 'disable the default ones')
14
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
123 if self.no_default_keywords:
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
124 self._keywords = {}
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
125 if isinstance(self.keywords, basestring):
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
126 self._keywords.update(parse_keywords(self.keywords.split()))
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
127 self.keywords = self._keywords
26
93eaa2f4a0a2 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: 25
diff changeset
128
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
129 if self.no_wrap and self.width:
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
130 raise DistutilsOptionError("'--no-wrap' and '--width' are mutually "
26
93eaa2f4a0a2 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: 25
diff changeset
131 "exclusive")
93eaa2f4a0a2 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: 25
diff changeset
132 if self.no_wrap:
93eaa2f4a0a2 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: 25
diff changeset
133 self.width = None
93eaa2f4a0a2 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: 25
diff changeset
134 else:
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
135 self.width = int(self.width)
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
136
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
137 if self.sort_output and self.sort_by_file:
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
138 raise DistutilsOptionError("'--sort-output' and '--sort-by-file' "
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
139 "are mutually exclusive")
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
140
59
e68fd956ebce * 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: 58
diff changeset
141 if not self.input_dirs:
e68fd956ebce * 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: 58
diff changeset
142 self.input_dirs = dict.fromkeys([k.split('.',1)[0]
e68fd956ebce * 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: 58
diff changeset
143 for k in self.distribution.packages
e68fd956ebce * 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: 58
diff changeset
144 ]).keys()
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
145
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
146 if self.add_comments:
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
147 self._add_comments = self.add_comments.split(',')
59
e68fd956ebce * 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: 58
diff changeset
148
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
149 def run(self):
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
150 mappings = self._get_mappings()
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
151 outfile = open(self.output_file, 'w')
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
152 try:
80
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 73
diff changeset
153 catalog = Catalog(msgid_bugs_address=self.msgid_bugs_address)
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
154 for dirname, (method_map, options_map) in mappings.items():
59
e68fd956ebce * 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: 58
diff changeset
155 def callback(filename, method, options):
e68fd956ebce * 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: 58
diff changeset
156 if method == 'ignore':
e68fd956ebce * 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: 58
diff changeset
157 return
e68fd956ebce * 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: 58
diff changeset
158 filepath = os.path.normpath(os.path.join(dirname, filename))
e68fd956ebce * 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: 58
diff changeset
159 optstr = ''
e68fd956ebce * 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: 58
diff changeset
160 if options:
e68fd956ebce * 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: 58
diff changeset
161 optstr = ' (%s)' % ', '.join(['%s="%s"' % (k, v) for
e68fd956ebce * 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: 58
diff changeset
162 k, v in options.items()])
e68fd956ebce * 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: 58
diff changeset
163 log.info('extracting messages from %s%s'
e68fd956ebce * 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: 58
diff changeset
164 % (filepath, optstr))
49
9979a409589e 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: 26
diff changeset
165
59
e68fd956ebce * 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: 58
diff changeset
166 extracted = extract_from_dir(dirname, method_map, options_map,
e68fd956ebce * 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: 58
diff changeset
167 keywords=self.keywords,
86
8a703ecdba91 Some cosmetic changes for the new translator comments support.
cmlenz
parents: 82
diff changeset
168 comment_tags=self._add_comments,
59
e68fd956ebce * 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: 58
diff changeset
169 callback=callback)
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
170 for filename, lineno, message, comments in extracted:
59
e68fd956ebce * 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: 58
diff changeset
171 filepath = os.path.normpath(os.path.join(dirname, filename))
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
172 catalog.add(message, None, [(filepath, lineno)],
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
173 comments=comments)
26
93eaa2f4a0a2 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: 25
diff changeset
174
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
175 log.info('writing PO template file to %s' % self.output_file)
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents: 57
diff changeset
176 write_pot(outfile, catalog, project=self.distribution.get_name(),
26
93eaa2f4a0a2 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: 25
diff changeset
177 version=self.distribution.get_version(), width=self.width,
7
8d7b3077e6d1 * The creation-date header in generated PO files now includes the timezone offset.
cmlenz
parents: 3
diff changeset
178 charset=self.charset, no_location=self.no_location,
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
179 omit_header=self.omit_header, sort_output=self.sort_output,
81
51f73a110a84 Implemented item 4 from #12. Set the copyright holder in the output.
palgarvio
parents: 80
diff changeset
180 sort_by_file=self.sort_by_file,
51f73a110a84 Implemented item 4 from #12. Set the copyright holder in the output.
palgarvio
parents: 80
diff changeset
181 copyright_holder=self.copyright_holder)
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
182 finally:
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
183 outfile.close()
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
184
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
185 def _get_mappings(self):
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
186 mappings = {}
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
187
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
188 if self.mapping_file:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
189 fileobj = open(self.mapping_file, 'U')
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
190 try:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
191 method_map, options_map = parse_mapping(fileobj)
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
192 for dirname in self.input_dirs:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
193 mappings[dirname] = method_map, options_map
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
194 finally:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
195 fileobj.close()
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
196
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
197 elif self.distribution.message_extractors:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
198 message_extractors = self.distribution.message_extractors
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
199 for dirname, mapping in message_extractors.items():
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
200 if isinstance(mapping, basestring):
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
201 method_map, options_map = parse_mapping(StringIO(mapping))
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
202 else:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
203 method_map, options_map = [], {}
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
204 for pattern, method, options in mapping:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
205 method_map.append((pattern, method))
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
206 options_map[pattern] = options or {}
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
207 mappings[dirname] = method_map, options_map
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
208
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
209 else:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
210 for dirname in self.input_dirs:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
211 mappings[dirname] = DEFAULT_MAPPING, {}
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
212
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
213 return mappings
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
214
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
215
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
216 def check_message_extractors(dist, name, value):
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
217 """Validate the ``message_extractors`` keyword argument to ``setup()``.
49
9979a409589e 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: 26
diff changeset
218
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
219 :param dist: the distutils/setuptools ``Distribution`` object
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
220 :param name: the name of the keyword argument (should always be
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
221 "message_extractors")
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
222 :param value: the value of the keyword argument
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
223 :raise `DistutilsSetupError`: if the value is not valid
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
224 :see: `Adding setup() arguments
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
225 <http://peak.telecommunity.com/DevCenter/setuptools#adding-setup-arguments>`_
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
226 """
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
227 assert name == 'message_extractors'
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
228 if not isinstance(value, dict):
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
229 raise DistutilsSetupError('the value of the "message_extractors" '
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
230 'parameter must be a dictionary')
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
231
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
232
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
233 class new_catalog(Command):
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
234 """New catalog command for use in ``setup.py`` scripts.
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
235
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
236 If correctly installed, this command is available to Setuptools-using
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
237 setup scripts automatically. For projects using plain old ``distutils``,
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
238 the command needs to be registered explicitly in ``setup.py``::
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
239
56
27d55a07c897 Rename the `babel.catalog` package to `babel.messages` for consistency with the other package names.
cmlenz
parents: 54
diff changeset
240 from babel.messages.frontend import new_catalog
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
241
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
242 setup(
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
243 ...
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
244 cmdclass = {'new_catalog': new_catalog}
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
245 )
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
246
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
247 :see: `Integrating new distutils commands <http://docs.python.org/dist/node32.html>`_
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
248 :see: `setuptools <http://peak.telecommunity.com/DevCenter/setuptools>`_
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
249 """
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
250
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
251 description = 'create new catalogs based on a catalog template'
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
252 user_options = [
57
e7080996fc46 `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: 56
diff changeset
253 ('domain=', 'D',
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
254 "domain of PO file (defaults to lower-cased project name)"),
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
255 ('input-file=', 'i',
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
256 'name of the input file'),
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
257 ('output-dir=', 'd',
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
258 'path to output directory'),
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
259 ('output-file=', 'o',
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
260 "name of the output file (default "
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
261 "'<output_dir>/<locale>/LC_MESSAGES/<domain>.po')"),
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
262 ('locale=', 'l',
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
263 'locale for the new localized catalog'),
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
264 ('first-author=', None,
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
265 'name of first author'),
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
266 ('first-author-email=', None,
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
267 'email of first author')
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
268 ]
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
269
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
270 def initialize_options(self):
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
271 self.output_dir = None
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
272 self.output_file = None
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
273 self.input_file = None
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
274 self.locale = None
57
e7080996fc46 `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: 56
diff changeset
275 self.domain = None
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
276 self.first_author = None
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
277 self.first_author_email = None
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
278
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
279 def finalize_options(self):
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
280 if not self.input_file:
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
281 raise DistutilsOptionError('you must specify the input file')
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
282
57
e7080996fc46 `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: 56
diff changeset
283 if not self.domain:
e7080996fc46 `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: 56
diff changeset
284 self.domain = self.distribution.get_name().lower()
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
285
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
286 if not self.locale:
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
287 raise DistutilsOptionError('you must provide a locale for the '
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
288 'new catalog')
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
289 else:
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
290 try:
57
e7080996fc46 `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: 56
diff changeset
291 self._locale = Locale.parse(self.locale)
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
292 except UnknownLocaleError, error:
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
293 log.error(error)
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
294 sys.exit(1)
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
295
57
e7080996fc46 `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: 56
diff changeset
296 if self._locale.territory.lower() == self._locale.language:
e7080996fc46 `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: 56
diff changeset
297 # Remove country part if equal to language
e7080996fc46 `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: 56
diff changeset
298 # XXX: This might not be the best behaviour, investigate
e7080996fc46 `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: 56
diff changeset
299 self.locale = self._locale.language
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
300
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
301 if not self.output_file and not self.output_dir:
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
302 raise DistutilsOptionError('you must specify the output directory')
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
303
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
304 if not self.output_file and self.output_dir:
57
e7080996fc46 `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: 56
diff changeset
305 self.output_file = os.path.join(self.output_dir,
e7080996fc46 `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: 56
diff changeset
306 self.locale,
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
307 'LC_MESSAGES',
57
e7080996fc46 `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: 56
diff changeset
308 self.domain + '.po')
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
309
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
310 if not os.path.exists(os.path.dirname(self.output_file)):
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
311 os.makedirs(os.path.dirname(self.output_file))
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
312
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
313 def run(self):
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
314 outfile = open(self.output_file, 'w')
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
315 infile = open(self.input_file, 'r')
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
316
57
e7080996fc46 `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: 56
diff changeset
317 if PLURALS.has_key(str(self._locale)):
e7080996fc46 `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: 56
diff changeset
318 # Try <language>_<COUNTRY> if passed by user
e7080996fc46 `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: 56
diff changeset
319 plurals = PLURALS[str(self._locale)]
e7080996fc46 `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: 56
diff changeset
320 elif PLURALS.has_key(self._locale.language):
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
321 # Try <language>
57
e7080996fc46 `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: 56
diff changeset
322 plurals = PLURALS[self._locale.language]
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
323 else:
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
324 plurals = ('INTEGER', 'EXPRESSION')
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
325
57
e7080996fc46 `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: 56
diff changeset
326 log.info('Creating %s %r PO from %r PO template',
e7080996fc46 `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: 56
diff changeset
327 self._locale.english_name,
e7080996fc46 `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: 56
diff changeset
328 self.output_file,
e7080996fc46 `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: 56
diff changeset
329 self.input_file)
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
330
57
e7080996fc46 `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: 56
diff changeset
331 write_po(outfile, infile, self._locale,
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
332 project=self.distribution.get_name(),
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
333 version=self.distribution.get_version(),
57
e7080996fc46 `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: 56
diff changeset
334 plurals=plurals,
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
335 first_author=self.first_author,
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
336 first_author_email=self.first_author_email)
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
337
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
338 infile.close()
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
339 outfile.close()
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
340
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
341
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
342 class CommandLineInterface(object):
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
343 """Command-line interface.
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
344
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
345 This class provides a simple command-line interface to the message
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
346 extraction and PO file generation functionality.
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
347 """
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
348
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
349 usage = '%%prog %s [options] %s'
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
350 version = '%%prog %s' % VERSION
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
351 commands = ['extract', 'init']
65
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
352 command_descriptions = {
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
353 'extract': 'extract messages from source files and generate a POT file',
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
354 'init': 'create new message catalogs from a template'
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
355 }
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
356
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
357 def run(self, argv=sys.argv):
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
358 """Main entry point of the command-line interface.
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
359
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
360 :param argv: list of arguments passed on the command-line
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
361 """
65
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
362 self.parser = OptionParser(usage=self.usage % ('subcommand', '[args]'),
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
363 version=self.version)
65
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
364 self.parser.disable_interspersed_args()
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
365 self.parser.print_help = self._help
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
366 options, args = self.parser.parse_args(argv[1:])
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
367 if not args:
65
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
368 self.parser.error('incorrect number of arguments')
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
369
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
370 cmdname = args[0]
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
371 if cmdname not in self.commands:
65
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
372 self.parser.error('unknown subcommand "%s"' % cmdname)
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
373
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
374 getattr(self, cmdname)(args[1:])
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
375
65
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
376 def _help(self):
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
377 print self.parser.format_help()
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
378 print "Subcommands:"
65
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
379 longest = max([len(command) for command in self.commands])
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
380 format = " %" + str(longest) + "s %s"
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
381 self.commands.sort()
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
382 for command in self.commands:
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
383 print format % (command, self.command_descriptions[command])
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
384
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
385 def extract(self, argv):
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
386 """Subcommand for extracting messages from source files and generating
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
387 a POT file.
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
388
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
389 :param argv: the command arguments
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
390 """
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
391 parser = OptionParser(usage=self.usage % ('extract', 'dir1 <dir2> ...'),
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
392 description=self.command_descriptions['extract'])
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
393 parser.add_option('--charset', dest='charset',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
394 help='charset to use in the output')
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
395 parser.add_option('-k', '--keyword', dest='keywords', action='append',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
396 help='keywords to look for in addition to the '
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
397 'defaults. You can specify multiple -k flags on '
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
398 'the command line.')
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
399 parser.add_option('--no-default-keywords', dest='no_default_keywords',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
400 action='store_true',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
401 help="do not include the default keywords")
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
402 parser.add_option('--mapping', '-F', dest='mapping_file',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
403 help='path to the extraction mapping file')
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
404 parser.add_option('--no-location', dest='no_location',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
405 action='store_true',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
406 help='do not include location comments with filename '
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
407 'and line number')
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
408 parser.add_option('--omit-header', dest='omit_header',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
409 action='store_true',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
410 help='do not include msgid "" entry in header')
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
411 parser.add_option('-o', '--output', dest='output',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
412 help='path to the output POT file')
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
413 parser.add_option('-w', '--width', dest='width', type='int',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
414 help="set output line width (default %default)")
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
415 parser.add_option('--no-wrap', dest='no_wrap', action = 'store_true',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
416 help='do not break long message lines, longer than '
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
417 'the output line width, into several lines')
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
418 parser.add_option('--sort-output', dest='sort_output',
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
419 action='store_true',
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
420 help='generate sorted output (default False)')
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
421 parser.add_option('--sort-by-file', dest='sort_by_file',
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
422 action='store_true',
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
423 help='sort output by file location (default False)')
80
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 73
diff changeset
424 parser.add_option('--msgid-bugs-address', dest='msgid_bugs_address',
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 73
diff changeset
425 metavar='EMAIL@ADDRESS',
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 73
diff changeset
426 help='set report address for msgid')
81
51f73a110a84 Implemented item 4 from #12. Set the copyright holder in the output.
palgarvio
parents: 80
diff changeset
427 parser.add_option('--copyright-holder', dest='copyright_holder',
51f73a110a84 Implemented item 4 from #12. Set the copyright holder in the output.
palgarvio
parents: 80
diff changeset
428 help='set copyright holder in output')
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
429 parser.add_option('--add-comments', '-c', dest='add_comments',
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
430 metavar='TAG', action='append',
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
431 help='place comment block with TAG (or those '
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
432 'preceding keyword lines) in output file. One '
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
433 'TAG per argument call')
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
434
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
435 parser.set_defaults(charset='utf-8', keywords=[],
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
436 no_default_keywords=False, no_location=False,
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
437 omit_header = False, width=76, no_wrap=False,
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
438 sort_output=False, sort_by_file=False,
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
439 add_comments=[])
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
440 options, args = parser.parse_args(argv)
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
441 if not args:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
442 parser.error('incorrect number of arguments')
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
443
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
444 if options.output not in (None, '-'):
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
445 outfile = open(options.output, 'w')
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
446 else:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
447 outfile = sys.stdout
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
448
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
449 keywords = DEFAULT_KEYWORDS.copy()
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
450 if options.no_default_keywords:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
451 if not options.keywords:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
452 parser.error('you must specify new keywords if you disable the '
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
453 'default ones')
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
454 keywords = {}
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
455 if options.keywords:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
456 keywords.update(parse_keywords(options.keywords))
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
457
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
458 if options.mapping_file:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
459 fileobj = open(options.mapping_file, 'U')
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
460 try:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
461 method_map, options_map = parse_mapping(fileobj)
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
462 finally:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
463 fileobj.close()
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
464 else:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
465 method_map = DEFAULT_MAPPING
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
466 options_map = {}
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
467
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
468 if options.width and options.no_wrap:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
469 parser.error("'--no-wrap' and '--width' are mutually exclusive.")
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
470 elif not options.width and not options.no_wrap:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
471 options.width = 76
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
472 elif not options.width and options.no_wrap:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
473 options.width = 0
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
474
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
475 if options.sort_output and options.sort_by_file:
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
476 parser.error("'--sort-output' and '--sort-by-file' are mutually "
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
477 "exclusive")
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
478
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
479 try:
80
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 73
diff changeset
480 catalog = Catalog(msgid_bugs_address=options.msgid_bugs_address)
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
481 for dirname in args:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
482 if not os.path.isdir(dirname):
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
483 parser.error('%r is not a directory' % dirname)
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
484 extracted = extract_from_dir(dirname, method_map,
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
485 options_map, keywords,
90
cbc44fce25aa Completely fixed the bug reported by pjenvey, partially addressed on [87].
palgarvio
parents: 89
diff changeset
486 comment_tags=options.add_comments)
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
487 for filename, lineno, message, comments in extracted:
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
488 filepath = os.path.normpath(os.path.join(dirname, filename))
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
489 catalog.add(message, None, [(filepath, lineno)],
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
490 comments=comments)
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents: 57
diff changeset
491
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents: 57
diff changeset
492 write_pot(outfile, catalog, width=options.width,
56
27d55a07c897 Rename the `babel.catalog` package to `babel.messages` for consistency with the other package names.
cmlenz
parents: 54
diff changeset
493 charset=options.charset, no_location=options.no_location,
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
494 omit_header=options.omit_header,
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
495 sort_output=options.sort_output,
81
51f73a110a84 Implemented item 4 from #12. Set the copyright holder in the output.
palgarvio
parents: 80
diff changeset
496 sort_by_file=options.sort_by_file,
51f73a110a84 Implemented item 4 from #12. Set the copyright holder in the output.
palgarvio
parents: 80
diff changeset
497 copyright_holder=options.copyright_holder)
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
498 finally:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
499 if options.output:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
500 outfile.close()
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
501
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
502 def init(self, argv):
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
503 """Subcommand for creating new message catalogs from a template.
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
504
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
505 :param argv: the command arguments
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
506 """
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
507 parser = OptionParser(usage=self.usage % ('init',''),
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
508 description=self.command_descriptions['init'])
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
509 parser.add_option('--domain', '-D', dest='domain',
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
510 help="domain of PO file (defaults to lower-cased "
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
511 "project name)")
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
512 parser.add_option('--input-file', '-i', dest='input_file',
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
513 help='name of the input file')
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
514 parser.add_option('--output-dir', '-d', dest='output_dir',
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
515 help='path to output directory')
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
516 parser.add_option('--output-file', '-o', dest='output_file',
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
517 help="name of the output file (default "
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
518 "'<output_dir>/<locale>/LC_MESSAGES/"
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
519 "<domain>.po')")
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
520 parser.add_option('--locale', '-l', dest='locale',
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
521 help='locale for the new localized catalog')
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
522 parser.add_option('--first-author', dest='first_author',
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
523 metavar='FIRST_AUTHOR_NAME',
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
524 help='name of first author')
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
525 parser.add_option('--first-author-email', dest='first_author_email',
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
526 help='email of first author')
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
527 parser.add_option('--project-name', dest='project_name', metavar='NAME',
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
528 default='PROJECT', help='the project name')
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
529 parser.add_option('--project-version', dest='project_version',
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
530 metavar='VERSION', help='the project version')
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
531
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
532 options, args = parser.parse_args(argv)
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
533
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
534 if not options.project_name:
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
535 parser.error('please provide the project name')
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
536
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
537 if not options.project_version:
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
538 parser.error('please provide the project version')
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
539
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
540 if not options.input_file:
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
541 parser.error('you must specify the input file')
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
542
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
543 if not options.domain:
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
544 options.domain = options.project_name.lower()
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
545
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
546 if not options.locale:
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
547 parser.error('you must provide a locale for the new catalog')
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
548 else:
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
549 try:
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
550 _locale = Locale.parse(options.locale)
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
551 except UnknownLocaleError, error:
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
552 parser.error(error)
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
553
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
554 if _locale.territory.lower() == _locale.language:
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
555 # Remove country part if equal to language
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
556 # XXX: This might not be the best behaviour, investigate
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
557 options.locale = _locale.language
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
558
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
559 if not options.output_file and not options.output_dir:
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
560 parser.error('you must specify the output directory')
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
561
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
562 if not options.output_file and options.output_dir:
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
563 options.output_file = os.path.join(options.output_dir,
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
564 options.locale,
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
565 'LC_MESSAGES',
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
566 options.domain + '.po')
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
567 if not os.path.exists(os.path.dirname(options.output_file)):
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
568 os.makedirs(os.path.dirname(options.output_file))
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
569
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
570 outfile = open(options.output_file, 'w')
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
571 infile = open(options.input_file, 'r')
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
572
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
573 if PLURALS.has_key(str(_locale)):
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
574 # Try <language>_<COUNTRY> if passed by user
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
575 plurals = PLURALS[str(_locale)]
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
576 elif PLURALS.has_key(_locale.language):
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
577 # Try <language>
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
578 plurals = PLURALS[_locale.language]
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
579 else:
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
580 plurals = ('INTEGER', 'EXPRESSION')
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
581
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
582 print 'Creating %s %r PO from %r PO template' % (_locale.english_name,
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
583 options.output_file,
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
584 options.input_file)
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
585
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
586 write_po(outfile, infile, _locale,
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
587 project=options.project_name,
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
588 version=options.project_version,
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
589 plurals=plurals,
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
590 first_author=options.first_author,
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
591 first_author_email=options.first_author_email)
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
592
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
593 infile.close()
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
594 outfile.close()
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
595
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
596 def main():
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
597 CommandLineInterface().run(sys.argv)
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
598
50
b6497cfd06d6 Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 49
diff changeset
599 def parse_mapping(fileobj, filename=None):
49
9979a409589e 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: 26
diff changeset
600 """Parse an extraction method mapping from a file-like object.
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
601
49
9979a409589e 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: 26
diff changeset
602 >>> buf = StringIO('''
9979a409589e 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: 26
diff changeset
603 ... # Python source files
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
604 ... [python: **.py]
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
605 ...
49
9979a409589e 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: 26
diff changeset
606 ... # Genshi templates
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
607 ... [genshi: **/templates/**.html]
50
b6497cfd06d6 Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 49
diff changeset
608 ... include_attrs =
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
609 ... [genshi: **/templates/**.txt]
50
b6497cfd06d6 Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 49
diff changeset
610 ... template_class = genshi.template.text.TextTemplate
b6497cfd06d6 Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 49
diff changeset
611 ... encoding = latin-1
49
9979a409589e 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: 26
diff changeset
612 ... ''')
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
613
49
9979a409589e 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: 26
diff changeset
614 >>> method_map, options_map = parse_mapping(buf)
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
615
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
616 >>> method_map[0]
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
617 ('**.py', 'python')
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
618 >>> options_map['**.py']
49
9979a409589e 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: 26
diff changeset
619 {}
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
620 >>> method_map[1]
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
621 ('**/templates/**.html', 'genshi')
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
622 >>> options_map['**/templates/**.html']['include_attrs']
49
9979a409589e 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: 26
diff changeset
623 ''
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
624 >>> method_map[2]
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
625 ('**/templates/**.txt', 'genshi')
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
626 >>> options_map['**/templates/**.txt']['template_class']
49
9979a409589e 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: 26
diff changeset
627 'genshi.template.text.TextTemplate'
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
628 >>> options_map['**/templates/**.txt']['encoding']
49
9979a409589e 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: 26
diff changeset
629 'latin-1'
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
630
49
9979a409589e 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: 26
diff changeset
631 :param fileobj: a readable file-like object containing the configuration
9979a409589e 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: 26
diff changeset
632 text to parse
9979a409589e 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: 26
diff changeset
633 :return: a `(method_map, options_map)` tuple
9979a409589e 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: 26
diff changeset
634 :rtype: `tuple`
9979a409589e 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: 26
diff changeset
635 :see: `extract_from_directory`
9979a409589e 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: 26
diff changeset
636 """
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
637 method_map = []
49
9979a409589e 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: 26
diff changeset
638 options_map = {}
9979a409589e 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: 26
diff changeset
639
50
b6497cfd06d6 Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 49
diff changeset
640 parser = RawConfigParser()
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
641 parser._sections = odict(parser._sections) # We need ordered sections
50
b6497cfd06d6 Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 49
diff changeset
642 parser.readfp(fileobj, filename)
b6497cfd06d6 Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 49
diff changeset
643 for section in parser.sections():
b6497cfd06d6 Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 49
diff changeset
644 method, pattern = [part.strip() for part in section.split(':', 1)]
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
645 method_map.append((pattern, method))
50
b6497cfd06d6 Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 49
diff changeset
646 options_map[pattern] = dict(parser.items(section))
49
9979a409589e 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: 26
diff changeset
647
9979a409589e 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: 26
diff changeset
648 return (method_map, options_map)
9979a409589e 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: 26
diff changeset
649
14
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
650 def parse_keywords(strings=[]):
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
651 """Parse keywords specifications from the given list of strings.
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
652
14
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
653 >>> kw = parse_keywords(['_', 'dgettext:2', 'dngettext:2,3'])
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
654 >>> for keyword, indices in sorted(kw.items()):
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
655 ... print (keyword, indices)
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
656 ('_', None)
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
657 ('dgettext', (2,))
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
658 ('dngettext', (2, 3))
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
659 """
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
660 keywords = {}
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
661 for string in strings:
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
662 if ':' in string:
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
663 funcname, indices = string.split(':')
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
664 else:
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
665 funcname, indices = string, None
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
666 if funcname not in keywords:
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
667 if indices:
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
668 indices = tuple([(int(x)) for x in indices.split(',')])
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
669 keywords[funcname] = indices
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
670 return keywords
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
671
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
672
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
673 if __name__ == '__main__':
57
e7080996fc46 `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: 56
diff changeset
674 main()
Copyright (C) 2012-2017 Edgewall Software