Mercurial > p > roundup > code
annotate roundup/cgi/TranslationService.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 | 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 : |
