annotate roundup/cgi/TAL/talgettext.py @ 3726:b11142bb2aa2 1.2.1

Password confirm field in user editing. Pre-1.2.1-release stuff too
author Richard Jones <richard@users.sourceforge.net>
date Sat, 07 Oct 2006 03:03:29 +0000
parents e816a232f988
children 6e3e4f24c753
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
1 #!/usr/bin/env python
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
2 ##############################################################################
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
3 #
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
4 # Copyright (c) 2002 Zope Corporation and Contributors.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
5 # All Rights Reserved.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
6 #
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
7 # This software is subject to the provisions of the Zope Public License,
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
8 # Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
9 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
10 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
11 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
12 # FOR A PARTICULAR PURPOSE.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
13 #
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
14 ##############################################################################
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
15 # Modifications for Roundup:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
16 # 1. commented out ITALES references
2385
85cbfc4a5946 escape newlines
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2382
diff changeset
17 # 2. escape quotes and line feeds in msgids
2802
e816a232f988 don't collect empty msgids
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2385
diff changeset
18 # 3. don't collect empty msgids
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
19
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
20 """Program to extract internationalization markup from Page Templates.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
21
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
22 Once you have marked up a Page Template file with i18n: namespace tags, use
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
23 this program to extract GNU gettext .po file entries.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
24
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
25 Usage: talgettext.py [options] files
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
26 Options:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
27 -h / --help
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
28 Print this message and exit.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
29 -o / --output <file>
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
30 Output the translation .po file to <file>.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
31 -u / --update <file>
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
32 Update the existing translation <file> with any new translation strings
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
33 found.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
34 """
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
35
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
36 import sys
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
37 import time
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
38 import getopt
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
39 import traceback
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
40
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
41 from roundup.cgi.TAL.HTMLTALParser import HTMLTALParser
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
42 from roundup.cgi.TAL.TALInterpreter import TALInterpreter
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
43 from roundup.cgi.TAL.DummyEngine import DummyEngine
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
44 #from ITALES import ITALESEngine
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
45 from roundup.cgi.TAL.TALDefs import TALESError
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
46
2802
e816a232f988 don't collect empty msgids
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2385
diff changeset
47 __version__ = '$Revision: 1.6 $'
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
48
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
49 pot_header = '''\
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
50 # SOME DESCRIPTIVE TITLE.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
51 # Copyright (C) YEAR ORGANIZATION
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
52 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
53 #
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
54 msgid ""
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
55 msgstr ""
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
56 "Project-Id-Version: PACKAGE VERSION\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
57 "POT-Creation-Date: %(time)s\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
58 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
59 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
60 "Language-Team: LANGUAGE <LL@li.org>\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
61 "MIME-Version: 1.0\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
62 "Content-Type: text/plain; charset=CHARSET\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
63 "Content-Transfer-Encoding: ENCODING\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
64 "Generated-By: talgettext.py %(version)s\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
65 '''
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
66
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
67 NLSTR = '"\n"'
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
68
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
69 try:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
70 True
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
71 except NameError:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
72 True=1
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
73 False=0
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
74
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
75 def usage(code, msg=''):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
76 # Python 2.1 required
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
77 print >> sys.stderr, __doc__
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
78 if msg:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
79 print >> sys.stderr, msg
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
80 sys.exit(code)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
81
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
82
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
83 class POTALInterpreter(TALInterpreter):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
84 def translate(self, msgid, default, i18ndict=None, obj=None):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
85 # XXX is this right?
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
86 if i18ndict is None:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
87 i18ndict = {}
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
88 if obj:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
89 i18ndict.update(obj)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
90 # XXX Mmmh, it seems that sometimes the msgid is None; is that really
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
91 # possible?
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
92 if msgid is None:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
93 return None
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
94 # XXX We need to pass in one of context or target_language
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
95 return self.engine.translate(msgid, self.i18nContext.domain, i18ndict,
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
96 position=self.position, default=default)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
97
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
98
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
99 class POEngine(DummyEngine):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
100 #__implements__ = ITALESEngine
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
101
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
102 def __init__(self, macros=None):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
103 self.catalog = {}
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
104 DummyEngine.__init__(self, macros)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
105
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
106 def evaluate(*args):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
107 return '' # who cares
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
108
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
109 def evaluatePathOrVar(*args):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
110 return '' # who cares
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
111
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
112 def evaluateSequence(self, expr):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
113 return (0,) # dummy
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
114
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
115 def evaluateBoolean(self, expr):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
116 return True # dummy
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
117
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
118 def translate(self, msgid, domain=None, mapping=None, default=None,
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
119 # XXX position is not part of the ITALESEngine
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
120 # interface
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
121 position=None):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
122
2802
e816a232f988 don't collect empty msgids
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2385
diff changeset
123 if not msgid: return 'x'
e816a232f988 don't collect empty msgids
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2385
diff changeset
124
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
125 if domain not in self.catalog:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
126 self.catalog[domain] = {}
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
127 domain = self.catalog[domain]
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
128
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
129 if msgid not in domain:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
130 domain[msgid] = []
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
131 domain[msgid].append((self.file, position))
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
132 return 'x'
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
133
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
134
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
135 class UpdatePOEngine(POEngine):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
136 """A slightly-less braindead POEngine which supports loading an existing
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
137 .po file first."""
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
138
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
139 def __init__ (self, macros=None, filename=None):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
140 POEngine.__init__(self, macros)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
141
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
142 self._filename = filename
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
143 self._loadFile()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
144 self.base = self.catalog
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
145 self.catalog = {}
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
146
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
147 def __add(self, id, s, fuzzy):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
148 "Add a non-fuzzy translation to the dictionary."
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
149 if not fuzzy and str:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
150 # check for multi-line values and munge them appropriately
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
151 if '\n' in s:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
152 lines = s.rstrip().split('\n')
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
153 s = NLSTR.join(lines)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
154 self.catalog[id] = s
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
155
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
156 def _loadFile(self):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
157 # shamelessly cribbed from Python's Tools/i18n/msgfmt.py
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
158 # 25-Mar-2003 Nathan R. Yergler (nathan@zope.org)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
159 # 14-Apr-2003 Hacked by Barry Warsaw (barry@zope.com)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
160
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
161 ID = 1
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
162 STR = 2
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
163
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
164 try:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
165 lines = open(self._filename).readlines()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
166 except IOError, msg:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
167 print >> sys.stderr, msg
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
168 sys.exit(1)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
169
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
170 section = None
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
171 fuzzy = False
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
172
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
173 # Parse the catalog
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
174 lno = 0
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
175 for l in lines:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
176 lno += True
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
177 # If we get a comment line after a msgstr, this is a new entry
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
178 if l[0] == '#' and section == STR:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
179 self.__add(msgid, msgstr, fuzzy)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
180 section = None
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
181 fuzzy = False
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
182 # Record a fuzzy mark
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
183 if l[:2] == '#,' and l.find('fuzzy'):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
184 fuzzy = True
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
185 # Skip comments
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
186 if l[0] == '#':
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
187 continue
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
188 # Now we are in a msgid section, output previous section
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
189 if l.startswith('msgid'):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
190 if section == STR:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
191 self.__add(msgid, msgstr, fuzzy)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
192 section = ID
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
193 l = l[5:]
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
194 msgid = msgstr = ''
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
195 # Now we are in a msgstr section
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
196 elif l.startswith('msgstr'):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
197 section = STR
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
198 l = l[6:]
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
199 # Skip empty lines
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
200 if not l.strip():
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
201 continue
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
202 # XXX: Does this always follow Python escape semantics?
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
203 l = eval(l)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
204 if section == ID:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
205 msgid += l
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
206 elif section == STR:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
207 msgstr += '%s\n' % l
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
208 else:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
209 print >> sys.stderr, 'Syntax error on %s:%d' % (infile, lno), \
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
210 'before:'
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
211 print >> sys.stderr, l
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
212 sys.exit(1)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
213 # Add last entry
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
214 if section == STR:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
215 self.__add(msgid, msgstr, fuzzy)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
216
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
217 def evaluate(self, expression):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
218 try:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
219 return POEngine.evaluate(self, expression)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
220 except TALESError:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
221 pass
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
222
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
223 def evaluatePathOrVar(self, expr):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
224 return 'who cares'
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
225
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
226 def translate(self, msgid, domain=None, mapping=None, default=None,
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
227 position=None):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
228 if msgid not in self.base:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
229 POEngine.translate(self, msgid, domain, mapping, default, position)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
230 return 'x'
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
231
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
232
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
233 def main():
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
234 try:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
235 opts, args = getopt.getopt(
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
236 sys.argv[1:],
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
237 'ho:u:',
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
238 ['help', 'output=', 'update='])
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
239 except getopt.error, msg:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
240 usage(1, msg)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
241
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
242 outfile = None
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
243 engine = None
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
244 update_mode = False
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
245 for opt, arg in opts:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
246 if opt in ('-h', '--help'):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
247 usage(0)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
248 elif opt in ('-o', '--output'):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
249 outfile = arg
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
250 elif opt in ('-u', '--update'):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
251 update_mode = True
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
252 if outfile is None:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
253 outfile = arg
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
254 engine = UpdatePOEngine(filename=arg)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
255
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
256 if not args:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
257 print 'nothing to do'
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
258 return
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
259
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
260 # We don't care about the rendered output of the .pt file
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
261 class Devnull:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
262 def write(self, s):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
263 pass
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
264
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
265 # check if we've already instantiated an engine;
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
266 # if not, use the stupidest one available
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
267 if not engine:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
268 engine = POEngine()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
269
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
270 # process each file specified
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
271 for filename in args:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
272 try:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
273 engine.file = filename
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
274 p = HTMLTALParser()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
275 p.parseFile(filename)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
276 program, macros = p.getCode()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
277 POTALInterpreter(program, macros, engine, stream=Devnull(),
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
278 metal=False)()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
279 except: # Hee hee, I love bare excepts!
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
280 print 'There was an error processing', filename
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
281 traceback.print_exc()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
282
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
283 # Now output the keys in the engine. Write them to a file if --output or
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
284 # --update was specified; otherwise use standard out.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
285 if (outfile is None):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
286 outfile = sys.stdout
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
287 else:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
288 outfile = file(outfile, update_mode and "a" or "w")
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
289
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
290 catalog = {}
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
291 for domain in engine.catalog.keys():
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
292 catalog.update(engine.catalog[domain])
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
293
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
294 messages = catalog.copy()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
295 try:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
296 messages.update(engine.base)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
297 except AttributeError:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
298 pass
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
299 if '' not in messages:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
300 print >> outfile, pot_header % {'time': time.ctime(),
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
301 'version': __version__}
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
302
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
303 msgids = catalog.keys()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
304 # XXX: You should not sort by msgid, but by filename and position. (SR)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
305 msgids.sort()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
306 for msgid in msgids:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
307 positions = catalog[msgid]
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
308 for filename, position in positions:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
309 outfile.write('#: %s:%s\n' % (filename, position[0]))
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
310
2385
85cbfc4a5946 escape newlines
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2382
diff changeset
311 outfile.write('msgid "%s"\n'
85cbfc4a5946 escape newlines
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2382
diff changeset
312 % msgid.replace('"', '\\"').replace("\n", '\\n"\n"'))
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
313 outfile.write('msgstr ""\n')
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
314 outfile.write('\n')
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
315
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
316
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
317 if __name__ == '__main__':
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
318 main()

Roundup Issue Tracker: http://roundup-tracker.org/