annotate roundup/cgi/TAL/talgettext.py @ 4651:beb8d43f4d9d

issue2550765: Don't show links in calendar that will fail. Found and fixed by Cédric Krier.
author Bernhard Reiter <bernhard@intevation.de>
date Wed, 01 Aug 2012 08:49:41 +0200
parents 3a407f0d5dad
children 198b6e810c67
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
4572
3a407f0d5dad Add import for version info
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4570
diff changeset
41 from roundup import __version__
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
42 from roundup.cgi.TAL.HTMLTALParser import HTMLTALParser
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
43 from roundup.cgi.TAL.TALInterpreter import TALInterpreter
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
44 from roundup.cgi.TAL.DummyEngine import DummyEngine
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
45 #from ITALES import ITALESEngine
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
46 from roundup.cgi.TAL.TALDefs import TALESError
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
47
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
48 pot_header = '''\
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
49 # SOME DESCRIPTIVE TITLE.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
50 # Copyright (C) YEAR ORGANIZATION
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
51 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
52 #
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
53 msgid ""
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
54 msgstr ""
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
55 "Project-Id-Version: PACKAGE VERSION\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
56 "POT-Creation-Date: %(time)s\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
57 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
58 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
59 "Language-Team: LANGUAGE <LL@li.org>\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
60 "MIME-Version: 1.0\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
61 "Content-Type: text/plain; charset=CHARSET\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
62 "Content-Transfer-Encoding: ENCODING\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
63 "Generated-By: talgettext.py %(version)s\\n"
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
64 '''
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 NLSTR = '"\n"'
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
67
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
68 try:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
69 True
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
70 except NameError:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
71 True=1
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
72 False=0
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
73
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
74 def usage(code, msg=''):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
75 # Python 2.1 required
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
76 print >> sys.stderr, __doc__
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
77 if msg:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
78 print >> sys.stderr, msg
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
79 sys.exit(code)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
80
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 class POTALInterpreter(TALInterpreter):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
83 def translate(self, msgid, default, i18ndict=None, obj=None):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
84 # XXX is this right?
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
85 if i18ndict is None:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
86 i18ndict = {}
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
87 if obj:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
88 i18ndict.update(obj)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
89 # 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
90 # possible?
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
91 if msgid is None:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
92 return None
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
93 # 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
94 return self.engine.translate(msgid, self.i18nContext.domain, i18ndict,
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
95 position=self.position, default=default)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
96
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 class POEngine(DummyEngine):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
99 #__implements__ = ITALESEngine
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
100
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
101 def __init__(self, macros=None):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
102 self.catalog = {}
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
103 DummyEngine.__init__(self, macros)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
104
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
105 def evaluate(*args):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
106 return '' # who cares
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
107
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
108 def evaluatePathOrVar(*args):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
109 return '' # who cares
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
110
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
111 def evaluateSequence(self, expr):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
112 return (0,) # dummy
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
113
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
114 def evaluateBoolean(self, expr):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
115 return True # dummy
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
116
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
117 def translate(self, msgid, domain=None, mapping=None, default=None,
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
118 # XXX position is not part of the ITALESEngine
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
119 # interface
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
120 position=None):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
121
2802
e816a232f988 don't collect empty msgids
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2385
diff changeset
122 if not msgid: return 'x'
e816a232f988 don't collect empty msgids
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2385
diff changeset
123
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
124 if domain not in self.catalog:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
125 self.catalog[domain] = {}
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
126 domain = self.catalog[domain]
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
127
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
128 if msgid not in domain:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
129 domain[msgid] = []
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
130 domain[msgid].append((self.file, position))
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
131 return 'x'
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
132
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 class UpdatePOEngine(POEngine):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
135 """A slightly-less braindead POEngine which supports loading an existing
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
136 .po file first."""
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
137
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
138 def __init__ (self, macros=None, filename=None):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
139 POEngine.__init__(self, macros)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
140
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
141 self._filename = filename
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
142 self._loadFile()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
143 self.base = self.catalog
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
144 self.catalog = {}
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
145
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
146 def __add(self, id, s, fuzzy):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
147 "Add a non-fuzzy translation to the dictionary."
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
148 if not fuzzy and str:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
149 # check for multi-line values and munge them appropriately
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
150 if '\n' in s:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
151 lines = s.rstrip().split('\n')
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
152 s = NLSTR.join(lines)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
153 self.catalog[id] = s
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
154
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
155 def _loadFile(self):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
156 # shamelessly cribbed from Python's Tools/i18n/msgfmt.py
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
157 # 25-Mar-2003 Nathan R. Yergler (nathan@zope.org)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
158 # 14-Apr-2003 Hacked by Barry Warsaw (barry@zope.com)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
159
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
160 ID = 1
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
161 STR = 2
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
162
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
163 try:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
164 lines = open(self._filename).readlines()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
165 except IOError, msg:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
166 print >> sys.stderr, msg
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
167 sys.exit(1)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
168
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
169 section = None
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
170 fuzzy = False
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
171
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
172 # Parse the catalog
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
173 lno = 0
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
174 for l in lines:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
175 lno += True
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
176 # 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
177 if l[0] == '#' and section == STR:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
178 self.__add(msgid, msgstr, fuzzy)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
179 section = None
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
180 fuzzy = False
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
181 # Record a fuzzy mark
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
182 if l[:2] == '#,' and l.find('fuzzy'):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
183 fuzzy = True
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
184 # Skip comments
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
185 if l[0] == '#':
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
186 continue
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
187 # Now we are in a msgid section, output previous section
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
188 if l.startswith('msgid'):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
189 if section == STR:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
190 self.__add(msgid, msgstr, fuzzy)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
191 section = ID
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
192 l = l[5:]
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
193 msgid = msgstr = ''
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
194 # Now we are in a msgstr section
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
195 elif l.startswith('msgstr'):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
196 section = STR
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
197 l = l[6:]
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
198 # Skip empty lines
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
199 if not l.strip():
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
200 continue
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
201 # XXX: Does this always follow Python escape semantics?
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
202 l = eval(l)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
203 if section == ID:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
204 msgid += l
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
205 elif section == STR:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
206 msgstr += '%s\n' % l
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
207 else:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
208 print >> sys.stderr, 'Syntax error on %s:%d' % (infile, lno), \
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
209 'before:'
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
210 print >> sys.stderr, l
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
211 sys.exit(1)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
212 # Add last entry
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
213 if section == STR:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
214 self.__add(msgid, msgstr, fuzzy)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
215
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
216 def evaluate(self, expression):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
217 try:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
218 return POEngine.evaluate(self, expression)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
219 except TALESError:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
220 pass
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
221
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
222 def evaluatePathOrVar(self, expr):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
223 return 'who cares'
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
224
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
225 def translate(self, msgid, domain=None, mapping=None, default=None,
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
226 position=None):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
227 if msgid not in self.base:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
228 POEngine.translate(self, msgid, domain, mapping, default, position)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
229 return 'x'
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
230
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 def main():
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
233 try:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
234 opts, args = getopt.getopt(
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
235 sys.argv[1:],
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
236 'ho:u:',
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
237 ['help', 'output=', 'update='])
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
238 except getopt.error, msg:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
239 usage(1, msg)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
240
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
241 outfile = None
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
242 engine = None
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
243 update_mode = False
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
244 for opt, arg in opts:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
245 if opt in ('-h', '--help'):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
246 usage(0)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
247 elif opt in ('-o', '--output'):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
248 outfile = arg
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
249 elif opt in ('-u', '--update'):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
250 update_mode = True
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
251 if outfile is None:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
252 outfile = arg
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
253 engine = UpdatePOEngine(filename=arg)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
254
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
255 if not args:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
256 print 'nothing to do'
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
257 return
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
258
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
259 # 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
260 class Devnull:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
261 def write(self, s):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
262 pass
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
263
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
264 # check if we've already instantiated an engine;
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
265 # if not, use the stupidest one available
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
266 if not engine:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
267 engine = POEngine()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
268
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
269 # process each file specified
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
270 for filename in args:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
271 try:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
272 engine.file = filename
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
273 p = HTMLTALParser()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
274 p.parseFile(filename)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
275 program, macros = p.getCode()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
276 POTALInterpreter(program, macros, engine, stream=Devnull(),
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
277 metal=False)()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
278 except: # Hee hee, I love bare excepts!
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
279 print 'There was an error processing', filename
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
280 traceback.print_exc()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
281
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
282 # 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
283 # --update was specified; otherwise use standard out.
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
284 if (outfile is None):
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
285 outfile = sys.stdout
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
286 else:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
287 outfile = file(outfile, update_mode and "a" or "w")
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
288
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
289 catalog = {}
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
290 for domain in engine.catalog.keys():
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
291 catalog.update(engine.catalog[domain])
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
292
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
293 messages = catalog.copy()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
294 try:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
295 messages.update(engine.base)
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
296 except AttributeError:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
297 pass
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
298 if '' not in messages:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
299 print >> outfile, pot_header % {'time': time.ctime(),
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
300 'version': __version__}
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
301
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
302 msgids = catalog.keys()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
303 # 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
304 msgids.sort()
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
305 for msgid in msgids:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
306 positions = catalog[msgid]
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
307 for filename, position in positions:
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
308 outfile.write('#: %s:%s\n' % (filename, position[0]))
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
309
2385
85cbfc4a5946 escape newlines
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2382
diff changeset
310 outfile.write('msgid "%s"\n'
85cbfc4a5946 escape newlines
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2382
diff changeset
311 % msgid.replace('"', '\\"').replace("\n", '\\n"\n"'))
2352
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
312 outfile.write('msgstr ""\n')
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
313 outfile.write('\n')
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
314
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 if __name__ == '__main__':
0d302e93abd3 make unix
Richard Jones <richard@users.sourceforge.net>
parents: 2351
diff changeset
317 main()

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