Mercurial > p > roundup > code
annotate roundup/cgi/TranslationService.py @ 4145:c15fcee3d8a1
Fix issue2550552.
| author | Stefan Seefeld <stefan@seefeld.name> |
|---|---|
| date | Tue, 30 Jun 2009 01:32:06 +0000 |
| parents | 0112e9e1d068 |
| children | 6e3e4f24c753 |
| 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 |
|
3989
0112e9e1d068
improvements to session management
Richard Jones <richard@users.sourceforge.net>
parents:
3978
diff
changeset
|
16 __version__ = "$Revision: 1.6 $"[11:-2] |
|
0112e9e1d068
improvements to session management
Richard Jones <richard@users.sourceforge.net>
parents:
3978
diff
changeset
|
17 __date__ = "$Date: 2008-08-18 05:04:01 $"[7:-2] |
|
2556
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
18 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
19 from roundup import i18n |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
20 from roundup.cgi.PageTemplates import Expressions, PathIterator, TALES |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
21 from roundup.cgi.TAL import TALInterpreter |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
22 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
23 ### Translation classes |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
24 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
25 class TranslationServiceMixin: |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
26 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
27 OUTPUT_ENCODING = "utf-8" |
|
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 def translate(self, domain, msgid, mapping=None, |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
30 context=None, target_language=None, default=None |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
31 ): |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
32 _msg = self.gettext(msgid) |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
33 #print ("TRANSLATE", msgid, _msg, mapping, context) |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
34 _msg = TALInterpreter.interpolate(_msg, mapping) |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
35 return _msg |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
36 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
37 def gettext(self, msgid): |
|
3806
a16239e37598
Handle 8-bit untranslateable messages from database properties
Richard Jones <richard@users.sourceforge.net>
parents:
3775
diff
changeset
|
38 if not isinstance(msgid, unicode): |
|
a16239e37598
Handle 8-bit untranslateable messages from database properties
Richard Jones <richard@users.sourceforge.net>
parents:
3775
diff
changeset
|
39 msgid = unicode(msgid, 'utf8') |
|
3978
f11fe2a13234
Fix for translations (patch [SF#2032526])
Richard Jones <richard@users.sourceforge.net>
parents:
3806
diff
changeset
|
40 msgtrans=self.ugettext(msgid) |
|
f11fe2a13234
Fix for translations (patch [SF#2032526])
Richard Jones <richard@users.sourceforge.net>
parents:
3806
diff
changeset
|
41 return msgtrans.encode(self.OUTPUT_ENCODING) |
|
2556
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
42 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
43 def ngettext(self, singular, plural, number): |
|
3978
f11fe2a13234
Fix for translations (patch [SF#2032526])
Richard Jones <richard@users.sourceforge.net>
parents:
3806
diff
changeset
|
44 if not isinstance(singular, unicode): |
|
f11fe2a13234
Fix for translations (patch [SF#2032526])
Richard Jones <richard@users.sourceforge.net>
parents:
3806
diff
changeset
|
45 singular = unicode(singular, 'utf8') |
|
f11fe2a13234
Fix for translations (patch [SF#2032526])
Richard Jones <richard@users.sourceforge.net>
parents:
3806
diff
changeset
|
46 if not isinstance(plural, unicode): |
|
f11fe2a13234
Fix for translations (patch [SF#2032526])
Richard Jones <richard@users.sourceforge.net>
parents:
3806
diff
changeset
|
47 plural = unicode(plural, 'utf8') |
|
f11fe2a13234
Fix for translations (patch [SF#2032526])
Richard Jones <richard@users.sourceforge.net>
parents:
3806
diff
changeset
|
48 msgtrans=self.ungettext(singular, plural, number) |
|
f11fe2a13234
Fix for translations (patch [SF#2032526])
Richard Jones <richard@users.sourceforge.net>
parents:
3806
diff
changeset
|
49 return msgtrans.encode(self.OUTPUT_ENCODING) |
|
2556
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 TranslationService(TranslationServiceMixin, i18n.RoundupTranslations): |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
52 pass |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
53 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
54 class NullTranslationService(TranslationServiceMixin, |
|
3775
beaf7ea86e5e
handle 8-bit untranslateable messages in tracker templates
Richard Jones <richard@users.sourceforge.net>
parents:
2807
diff
changeset
|
55 i18n.RoundupNullTranslations): |
|
beaf7ea86e5e
handle 8-bit untranslateable messages in tracker templates
Richard Jones <richard@users.sourceforge.net>
parents:
2807
diff
changeset
|
56 def ugettext(self, message): |
|
beaf7ea86e5e
handle 8-bit untranslateable messages in tracker templates
Richard Jones <richard@users.sourceforge.net>
parents:
2807
diff
changeset
|
57 if self._fallback: |
|
beaf7ea86e5e
handle 8-bit untranslateable messages in tracker templates
Richard Jones <richard@users.sourceforge.net>
parents:
2807
diff
changeset
|
58 return self._fallback.ugettext(message) |
|
beaf7ea86e5e
handle 8-bit untranslateable messages in tracker templates
Richard Jones <richard@users.sourceforge.net>
parents:
2807
diff
changeset
|
59 # 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
|
60 # (thanks to PageTemplate's internals). |
|
beaf7ea86e5e
handle 8-bit untranslateable messages in tracker templates
Richard Jones <richard@users.sourceforge.net>
parents:
2807
diff
changeset
|
61 if not isinstance(message, unicode): |
|
beaf7ea86e5e
handle 8-bit untranslateable messages in tracker templates
Richard Jones <richard@users.sourceforge.net>
parents:
2807
diff
changeset
|
62 return unicode(message, 'utf8') |
|
beaf7ea86e5e
handle 8-bit untranslateable messages in tracker templates
Richard Jones <richard@users.sourceforge.net>
parents:
2807
diff
changeset
|
63 return message |
|
2556
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
64 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
65 ### TAL patching |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
66 # |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
67 # Template Attribute Language (TAL) uses only global translation service, |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
68 # 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
|
69 # to access request-dependent transalation service (with domain |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
70 # and target language set during initializations of the roundup |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
71 # client interface. |
|
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 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
74 class Context(TALES.Context): |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
75 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
76 def __init__(self, compiler, contexts): |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
77 TALES.Context.__init__(self, compiler, contexts) |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
78 if not self.contexts.get('i18n', None): |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
79 # if the context contains no TranslationService, |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
80 # create default one |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
81 self.contexts['i18n'] = get_translation() |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
82 self.i18n = self.contexts['i18n'] |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
83 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
84 def translate(self, domain, msgid, mapping=None, |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
85 context=None, target_language=None, default=None): |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
86 if context is None: |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
87 context = self.contexts.get('here') |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
88 return self.i18n.translate(domain, msgid, |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
89 mapping=mapping, context=context, default=default, |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
90 target_language=target_language) |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
91 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
92 class Engine(TALES.Engine): |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
93 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
94 def getContext(self, contexts=None, **kwcontexts): |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
95 if contexts is not None: |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
96 if kwcontexts: |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
97 kwcontexts.update(contexts) |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
98 else: |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
99 kwcontexts = contexts |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
100 return Context(self, kwcontexts) |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
101 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
102 # patching TAL like this is a dirty hack, |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
103 # 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
|
104 Expressions._engine = Engine(PathIterator.Iterator) |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
105 Expressions.installHandlers(Expressions._engine) |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
106 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
107 ### main API function |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
108 |
|
2807
aa0316a1b2aa
get_translation: removed 'domain' argument, added 'tracker_home' argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2556
diff
changeset
|
109 def get_translation(language=None, tracker_home=None, |
|
2556
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
110 translation_class=TranslationService, |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
111 null_translation_class=NullTranslationService |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
112 ): |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
113 """Return Translation object for given language and domain |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
114 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
115 Arguments 'translation_class' and 'null_translation_class' |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
116 specify the classes that are instantiated for existing |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
117 and non-existing translations, respectively. |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
118 """ |
|
2807
aa0316a1b2aa
get_translation: removed 'domain' argument, added 'tracker_home' argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2556
diff
changeset
|
119 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
|
120 tracker_home=tracker_home, |
|
2556
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
121 translation_class=translation_class, |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
122 null_translation_class=null_translation_class) |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
123 |
|
297dedb7226e
TranslationService for Roundup templates
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
124 # vim: set et sts=4 sw=4 : |
