File: Tracker.py

package info (click to toggle)
zope-pts 1.3.3-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 300 kB
  • ctags: 330
  • sloc: python: 2,022; makefile: 31; sh: 2
file content (184 lines) | stat: -rw-r--r-- 6,204 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# -*- coding: ISO-8859-1 -*-
#
# $Id: Tracker.py 18265 2006-01-21 03:05:25Z hannosch $
#
__version__ = "$Id: Tracker.py 18265 2006-01-21 03:05:25Z hannosch $"[11:-2]
__author__ = "Gilles Lenfant <gilles.lenfant@ingeniweb.com>"

import time
from AccessControl import ClassSecurityInfo
from Globals import InitializeClass

# Template of .po / .pot file header
PO_HEADER_TPL = """# Generated by PlacelessTranslationService tracker
msgid ""
msgstr ""
"Project-Id-Version: YOUR PROJECT HERE\\n"
"POT-Creation-Date: %(date)s\\n"
"Last-Translator: YOUR NAME HERE <your@mail.here>\\n"
"Language-Team:  YOUR ORGANISATION HERE\\n"
"MIME-Version: 1.0\\n"
"Content-Type: text/plain; charset=utf-8\\n"
"Content-Transfer-Encoding: 8bit\\n"
"Plural-Forms: nplurals=1; plural=0;\\n"
"Language-code: %(language)s\\n"
"Language-name: %(languagename)s\\n"
"Preferred-encodings: ascii latin1 utf-8\\n"
"Domain: %(domain)s\\n"

"""

class Tracker:
    """Provides all services for tracking missing messages on domains
    """

    # FIXME: Replace this with real security assertions
    __allow_access_to_unprotected_subobjects__ = 1    
    
    security = ClassSecurityInfo()

    def __init__(self):
        """Constructor
        """
        self.mode = False # Off
        self.domain = ''
        self.cleanup()
        return

    def cleanup(self):
        """Resetting the content
        """
        # All msgids for current domain
        self.msgids = []
        # Indexes in self.msgids for various languages
        self.by_language = {}

    def recordFailure(self, domain, msgid, language):
        """Must be called at each failing translation request
        """
        # Don't do anything in following cases
        if ((not self.mode)
            or (domain != self.domain)):
            return

        if msgid not in self.msgids:
            self.msgids.append(msgid)
        position = self.msgids.index(msgid)
        positions = self.by_language.get(language)
        if positions:
            if not position in positions:
                self.by_language[language].append(position)
        else:
            self.by_language[language] = [position]
        return

    def availableLanguages(self):
        """For what languages the messages are recorded
        """
        languages = self.by_language.keys()
        languages.sort()
        return languages

    def availableMsgids(self, language=None):
        """Sorted msgids for a language or all nalguages if not provided
        """
        if language:
            msgids = [self.msgids[x] for x in self.by_language[language]]
            msgids.sort()
        else:
            msgids = self.msgids[:]
            msgids.sort()
        return msgids

    def potFile(self, stream, language=None):
        """The raw text of the .po or .pot file
        """
        self.potHeader(stream, language=language)
        for msgid in self.availableMsgids(language=language):
            stream.write('msgid "%s"\n' % msgid)
            stream.write('msgstr ""\n\n')
        return
        
    def potHeader(self, stream, language=None):
        """Formats the .po / .pot header
        """
        global PO_HEADER_TPL
        if not language:
            language = 'any'
        date = time.strftime("%Y-%m-%d %H:%M")
        # FIXME: should change to a real language name (needs a dict)
        languagename = language
        domain = self.domain
        stream.write(PO_HEADER_TPL % locals())
        return

    def manage_tracker(self, pts, REQUEST):
        """Actions from the ZMI management tab "Tracker"
        """
        form = REQUEST.form
        message = ''
        if form.has_key('button.setdomain'):
            # Domain has changed
            new_domain = form['domain'].strip()
            if new_domain != self.domain:
                self.domain = new_domain
                self.mode = True
                self.cleanup()
                message = "Domain changed and tracker reset."
            else:
                message = "No change..."

        elif form.has_key('button.togglemode'):
            # Toggling mode
            self.mode = not self.mode
            if self.mode:
                message = "Tracking is ON"
            else:
                message = "Tracking is OFF"

        elif form.has_key('button.download.pot'):
            # Download for the whole .pot
            REQUEST.RESPONSE.setHeader('Content-Type', 'text/plain')
            REQUEST.RESPONSE.setHeader('Content-Disposition',
                                       'attachment; filename=%s.pot' % self.domain)
            self.potFile(REQUEST.RESPONSE)
            return

        elif form.has_key('button.view.pot'):
            # View the whole .pot
            REQUEST.RESPONSE.setHeader('Content-Type', 'text/plain')
            self.potFile(REQUEST.RESPONSE)
            return

        elif form.has_key('button.clear'):
            # Cleanup all
            self.cleanup()
            message = "Removed recorded msgids"

        else:
            button_dl_po = [k for k in form.keys() if k.startswith('button.download.po.')]
            button_view_po = [k for k in form.keys() if k.startswith('button.view.po.')]

            if len(button_dl_po):
                # Download .po for a language
                button_dl_po = button_dl_po[0]
                language = button_dl_po.split('.')[-1]
                REQUEST.RESPONSE.setHeader('Content-Type', 'text/plain')
                REQUEST.RESPONSE.setHeader('Content-Disposition',
                                           'attachment; filename=%s-%s.po' % (self.domain, language))
                self.potFile(REQUEST.RESPONSE, language=language)
                return

            elif len(button_view_po):
                # View a .po for a language
                button_view_po = button_view_po[0]
                language = button_view_po.split('.')[-1]
                REQUEST.RESPONSE.setHeader('Content-Type', 'text/plain')
                self.potFile(REQUEST.RESPONSE, language=language)
                return

        return pts.manage_trackerForm(pts, REQUEST, manage_tabs_message=message)

InitializeClass(Tracker)

global_tracker = Tracker()