Mercurial > p > roundup > code
annotate roundup/cgi/TranslationService.py @ 5179:e8b3d3a14563
- issue2550796: Calendar and Classhelp selection tools don't cause
onchange event to be triggered.
Using the helper popups for modifying lists of users, lists of
issues, dates etc.. now trigger the change event on the form's
field. This allows onchange javascript to trigger to highlight
changes, recalculate other form values etc. See ``upgrading.txt``
for details on applying these changes to your tracker.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Sat, 28 Jan 2017 20:58:19 -0500 |
| parents | 6e3e4f24c753 |
| children | 56c9bcdea47f |
| rev | line source |
|---|---|
|
2556
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
1 # TranslationService for Roundup templates |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
2 # |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
3 # This module is free software, you may redistribute it |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
4 # and/or modify under the same terms as Python. |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
5 # |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
6 # This module provides National Language Support |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
7 # for Roundup templating - much like roundup.i18n |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
8 # module for Roundup command line interface. |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
9 # The only difference is that translator objects |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
10 # returned by get_translation() have one additional |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
11 # method which is used by TAL engines: |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
12 # |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
13 # translate(domain, msgid, mapping, context, target_language, default) |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
14 # |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
15 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
16 from roundup import i18n |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
17 from roundup.cgi.PageTemplates import Expressions, PathIterator, TALES |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
18 from roundup.cgi.TAL import TALInterpreter |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
19 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
20 ### Translation classes |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
21 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
22 class TranslationServiceMixin: |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
23 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
24 OUTPUT_ENCODING = "utf-8" |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
25 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
26 def translate(self, domain, msgid, mapping=None, |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
27 context=None, target_language=None, default=None |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
28 ): |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
29 _msg = self.gettext(msgid) |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
30 #print ("TRANSLATE", msgid, _msg, mapping, context) |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
31 _msg = TALInterpreter.interpolate(_msg, mapping) |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
32 return _msg |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
33 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
34 def gettext(self, msgid): |
|
3806
a16239e37598
Handle 8-bit untranslateable messages from database properties
Richard Jones <richard@users.sourceforge.net>
parents:
3775
diff
changeset
|
35 if not isinstance(msgid, unicode): |
|
a16239e37598
Handle 8-bit untranslateable messages from database properties
Richard Jones <richard@users.sourceforge.net>
parents:
3775
diff
changeset
|
36 msgid = unicode(msgid, 'utf8') |
|
3978
f11fe2a13234
Fix for translations (patch [SF#2032526])
Richard Jones <richard@users.sourceforge.net>
parents:
3806
diff
changeset
|
37 msgtrans=self.ugettext(msgid) |
|
f11fe2a13234
Fix for translations (patch [SF#2032526])
Richard Jones <richard@users.sourceforge.net>
parents:
3806
diff
changeset
|
38 return msgtrans.encode(self.OUTPUT_ENCODING) |
|
2556
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
39 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
40 def ngettext(self, singular, plural, number): |
|
3978
f11fe2a13234
Fix for translations (patch [SF#2032526])
Richard Jones <richard@users.sourceforge.net>
parents:
3806
diff
changeset
|
41 if not isinstance(singular, unicode): |
|
f11fe2a13234
Fix for translations (patch [SF#2032526])
Richard Jones <richard@users.sourceforge.net>
parents:
3806
diff
changeset
|
42 singular = unicode(singular, 'utf8') |
|
f11fe2a13234
Fix for translations (patch [SF#2032526])
Richard Jones <richard@users.sourceforge.net>
parents:
3806
diff
changeset
|
43 if not isinstance(plural, unicode): |
|
f11fe2a13234
Fix for translations (patch [SF#2032526])
Richard Jones <richard@users.sourceforge.net>
parents:
3806
diff
changeset
|
44 plural = unicode(plural, 'utf8') |
|
f11fe2a13234
Fix for translations (patch [SF#2032526])
Richard Jones <richard@users.sourceforge.net>
parents:
3806
diff
changeset
|
45 msgtrans=self.ungettext(singular, plural, number) |
|
f11fe2a13234
Fix for translations (patch [SF#2032526])
Richard Jones <richard@users.sourceforge.net>
parents:
3806
diff
changeset
|
46 return msgtrans.encode(self.OUTPUT_ENCODING) |
|
2556
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
47 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
48 class TranslationService(TranslationServiceMixin, i18n.RoundupTranslations): |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
49 pass |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
50 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
51 class NullTranslationService(TranslationServiceMixin, |
|
3775
beaf7ea86e5e
handle 8-bit untranslateable messages in tracker templates
Richard Jones <richard@users.sourceforge.net>
parents:
2807
diff
changeset
|
52 i18n.RoundupNullTranslations): |
|
beaf7ea86e5e
handle 8-bit untranslateable messages in tracker templates
Richard Jones <richard@users.sourceforge.net>
parents:
2807
diff
changeset
|
53 def ugettext(self, message): |
|
beaf7ea86e5e
handle 8-bit untranslateable messages in tracker templates
Richard Jones <richard@users.sourceforge.net>
parents:
2807
diff
changeset
|
54 if self._fallback: |
|
beaf7ea86e5e
handle 8-bit untranslateable messages in tracker templates
Richard Jones <richard@users.sourceforge.net>
parents:
2807
diff
changeset
|
55 return self._fallback.ugettext(message) |
|
beaf7ea86e5e
handle 8-bit untranslateable messages in tracker templates
Richard Jones <richard@users.sourceforge.net>
parents:
2807
diff
changeset
|
56 # Sometimes the untranslatable message is a UTF-8 encoded string |
|
beaf7ea86e5e
handle 8-bit untranslateable messages in tracker templates
Richard Jones <richard@users.sourceforge.net>
parents:
2807
diff
changeset
|
57 # (thanks to PageTemplate's internals). |
|
beaf7ea86e5e
handle 8-bit untranslateable messages in tracker templates
Richard Jones <richard@users.sourceforge.net>
parents:
2807
diff
changeset
|
58 if not isinstance(message, unicode): |
|
beaf7ea86e5e
handle 8-bit untranslateable messages in tracker templates
Richard Jones <richard@users.sourceforge.net>
parents:
2807
diff
changeset
|
59 return unicode(message, 'utf8') |
|
beaf7ea86e5e
handle 8-bit untranslateable messages in tracker templates
Richard Jones <richard@users.sourceforge.net>
parents:
2807
diff
changeset
|
60 return message |
|
2556
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
61 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
62 ### TAL patching |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
63 # |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
64 # Template Attribute Language (TAL) uses only global translation service, |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
65 # which is not thread-safe. We will use context variable 'i18n' |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
66 # to access request-dependent transalation service (with domain |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
67 # and target language set during initializations of the roundup |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
68 # client interface. |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
69 # |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
70 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
71 class Context(TALES.Context): |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
72 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
73 def __init__(self, compiler, contexts): |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
74 TALES.Context.__init__(self, compiler, contexts) |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
75 if not self.contexts.get('i18n', None): |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
76 # if the context contains no TranslationService, |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
77 # create default one |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
78 self.contexts['i18n'] = get_translation() |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
79 self.i18n = self.contexts['i18n'] |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
80 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
81 def translate(self, domain, msgid, mapping=None, |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
82 context=None, target_language=None, default=None): |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
83 if context is None: |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
84 context = self.contexts.get('here') |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
85 return self.i18n.translate(domain, msgid, |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
86 mapping=mapping, context=context, default=default, |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
87 target_language=target_language) |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
88 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
89 class Engine(TALES.Engine): |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
90 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
91 def getContext(self, contexts=None, **kwcontexts): |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
92 if contexts is not None: |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
93 if kwcontexts: |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
94 kwcontexts.update(contexts) |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
95 else: |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
96 kwcontexts = contexts |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
97 return Context(self, kwcontexts) |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
98 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
99 # patching TAL like this is a dirty hack, |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
100 # but i see no other way to specify different Context class |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
101 Expressions._engine = Engine(PathIterator.Iterator) |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
102 Expressions.installHandlers(Expressions._engine) |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
103 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
104 ### main API function |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
105 |
|
2807
aa0316a1b2aa
get_translation: removed 'domain' argument, added 'tracker_home' argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2556
diff
changeset
|
106 def get_translation(language=None, tracker_home=None, |
|
2556
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
107 translation_class=TranslationService, |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
108 null_translation_class=NullTranslationService |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
109 ): |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
110 """Return Translation object for given language and domain |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
111 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
112 Arguments 'translation_class' and 'null_translation_class' |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
113 specify the classes that are instantiated for existing |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
114 and non-existing translations, respectively. |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
115 """ |
|
2807
aa0316a1b2aa
get_translation: removed 'domain' argument, added 'tracker_home' argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2556
diff
changeset
|
116 return i18n.get_translation(language=language, |
|
aa0316a1b2aa
get_translation: removed 'domain' argument, added 'tracker_home' argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2556
diff
changeset
|
117 tracker_home=tracker_home, |
|
2556
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
118 translation_class=translation_class, |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
119 null_translation_class=null_translation_class) |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
120 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
121 # vim: set et sts=4 sw=4 : |
