Mercurial > p > roundup > code
annotate roundup/i18n.py @ 4587:a2eb4fb3e6d8
New Chameleon templating engine, engine is now configurable.
We now have two configurable templating engines, the old Zope TAL
templates (called zopetal in the config) and the new Chameleon (called
chameleon in the config). A new config-option "template_engine" under
[main] can take these config-options, the default is zopetal.
Thanks to Cheer Xiao for the idea of making this configurable *and*
for the actual implementation!
Cheer Xiao commit log:
- The original TAL engine ported from Zope is thereafter referred to as
"zopetal", in speech and in code
- A new option "template_engine" under [main] introduced
- Zopetal-specific code stripped from cgi/templating.py to form the new
cgi/engine_zopetal.py
- Interface to Chameleon in cgi/engine_chameleon.py
- Engines are supposed to provide a Templates class that mimics the
behavior of the old cgi.templating.Templates. The Templates class is
preferably subclassed from cgi.templating.TemplatesBase.
- New function cgi.templating.get_templates to get the appropriate engine's
Templates instance according to the engine name
| author | Ralf Schlatterbeck <rsc@runtux.com> |
|---|---|
| date | Thu, 23 Feb 2012 18:10:03 +0100 |
| parents | 6e3e4f24c753 |
| children | a072b35d0606 |
| rev | line source |
|---|---|
|
399
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
1 # |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
2 # Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/) |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
3 # This module is free software, and you may redistribute it and/or modify |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
4 # under the same terms as Python, so long as this copyright message and |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
5 # disclaimer are retained in their original form. |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
6 # |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
7 # IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
8 # DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
9 # OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
10 # POSSIBILITY OF SUCH DAMAGE. |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
11 # |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
12 # BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
13 # BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
14 # FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS" |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
15 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
16 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. |
|
2302
004dff9a159f
use python gettext engine
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2005
diff
changeset
|
17 # |
|
2005
fc52d57c6c3e
documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents:
1090
diff
changeset
|
18 """ |
|
399
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
19 RoundUp Internationalization (I18N) |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
20 |
|
2005
fc52d57c6c3e
documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents:
1090
diff
changeset
|
21 To use this module, the following code should be used:: |
|
399
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
22 |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
23 from roundup.i18n import _ |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
24 ... |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
25 print _("Some text that can be translated") |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
26 |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
27 Note that to enable re-ordering of inserted texts in formatting strings |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
28 (which can easily happen if a sentence has to be re-ordered due to |
|
2005
fc52d57c6c3e
documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents:
1090
diff
changeset
|
29 grammatical changes), translatable formats should use named format specs:: |
|
399
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
30 |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
31 ... _('Index of %(classname)s') % {'classname': cn} ... |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
32 |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
33 Also, this eases the job of translators since they have some context what |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
34 the dynamic portion of a message really means. |
|
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
35 """ |
|
2005
fc52d57c6c3e
documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents:
1090
diff
changeset
|
36 __docformat__ = 'restructuredtext' |
|
399
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
37 |
|
2355
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
38 import errno |
|
2806
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
39 import gettext as gettext_module |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
40 import os |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
41 |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
42 from roundup import msgfmt |
|
2355
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
43 |
|
3350
73ef4805a2eb
search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2918
diff
changeset
|
44 # List of directories for mo file search (see SF bug 1219689) |
|
73ef4805a2eb
search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2918
diff
changeset
|
45 LOCALE_DIRS = [ |
|
73ef4805a2eb
search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2918
diff
changeset
|
46 gettext_module._default_localedir, |
|
73ef4805a2eb
search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2918
diff
changeset
|
47 ] |
|
73ef4805a2eb
search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2918
diff
changeset
|
48 # compute mo location relative to roundup installation directory |
|
73ef4805a2eb
search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2918
diff
changeset
|
49 # (prefix/lib/python/site-packages/roundup/msgfmt.py on posix systems, |
|
73ef4805a2eb
search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2918
diff
changeset
|
50 # prefix/lib/site-packages/roundup/msgfmt.py on windows). |
|
73ef4805a2eb
search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2918
diff
changeset
|
51 # locale root is prefix/share/locale. |
|
73ef4805a2eb
search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2918
diff
changeset
|
52 if os.name == "nt": |
|
73ef4805a2eb
search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2918
diff
changeset
|
53 _mo_path = [".."] * 4 + ["share", "locale"] |
|
73ef4805a2eb
search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2918
diff
changeset
|
54 else: |
|
73ef4805a2eb
search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2918
diff
changeset
|
55 _mo_path = [".."] * 5 + ["share", "locale"] |
|
73ef4805a2eb
search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2918
diff
changeset
|
56 _mo_path = os.path.normpath(os.path.join(msgfmt.__file__, *_mo_path)) |
|
73ef4805a2eb
search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2918
diff
changeset
|
57 if _mo_path not in LOCALE_DIRS: |
|
73ef4805a2eb
search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2918
diff
changeset
|
58 LOCALE_DIRS.append(_mo_path) |
|
73ef4805a2eb
search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2918
diff
changeset
|
59 del _mo_path |
|
73ef4805a2eb
search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2918
diff
changeset
|
60 |
|
2355
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
61 # Roundup text domain |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
62 DOMAIN = "roundup" |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
63 |
|
2806
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
64 if hasattr(gettext_module.GNUTranslations, "ngettext"): |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
65 # gettext_module has everything needed |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
66 RoundupNullTranslations = gettext_module.NullTranslations |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
67 RoundupTranslations = gettext_module.GNUTranslations |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
68 else: |
|
2355
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
69 # prior to 2.3, there was no plural forms. mix simple emulation in |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
70 class PluralFormsMixIn: |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
71 def ngettext(self, singular, plural, count): |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
72 if count == 1: |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
73 _msg = singular |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
74 else: |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
75 _msg = plural |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
76 return self.gettext(_msg) |
|
2356
c2db20eca3fa
fix ungettext() in PluralFormsMixIn;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2355
diff
changeset
|
77 def ungettext(self, singular, plural, count): |
|
2355
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
78 if count == 1: |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
79 _msg = singular |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
80 else: |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
81 _msg = plural |
|
2356
c2db20eca3fa
fix ungettext() in PluralFormsMixIn;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2355
diff
changeset
|
82 return self.ugettext(_msg) |
|
2355
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
83 class RoundupNullTranslations( |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
84 gettext_module.NullTranslations, PluralFormsMixIn |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
85 ): |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
86 pass |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
87 class RoundupTranslations( |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
88 gettext_module.GNUTranslations, PluralFormsMixIn |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
89 ): |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
90 pass |
|
2806
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
91 |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
92 def find_locales(language=None): |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
93 """Return normalized list of locale names to try for given language |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
94 |
|
2917
5809f81fba24
accept a list of languages as well as single language name (thanks donfu)
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2810
diff
changeset
|
95 Argument 'language' may be a single language code or a list of codes. |
|
5809f81fba24
accept a list of languages as well as single language name (thanks donfu)
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2810
diff
changeset
|
96 If 'language' is omitted or None, use locale settings in OS environment. |
|
2806
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
97 |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
98 """ |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
99 # body of this function is borrowed from gettext_module.find() |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
100 if language is None: |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
101 languages = [] |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
102 for envar in ('LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG'): |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
103 val = os.environ.get(envar) |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
104 if val: |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
105 languages = val.split(':') |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
106 break |
|
2918
a3d9d7e98c36
oops. isinstance() did not accept tuples in 2.1.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2917
diff
changeset
|
107 elif isinstance(language, str) or isinstance(language, unicode): |
|
2917
5809f81fba24
accept a list of languages as well as single language name (thanks donfu)
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2810
diff
changeset
|
108 languages = [language] |
|
2806
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
109 else: |
|
2917
5809f81fba24
accept a list of languages as well as single language name (thanks donfu)
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2810
diff
changeset
|
110 # 'language' must be iterable |
|
5809f81fba24
accept a list of languages as well as single language name (thanks donfu)
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2810
diff
changeset
|
111 languages = language |
|
2806
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
112 # now normalize and expand the languages |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
113 nelangs = [] |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
114 for lang in languages: |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
115 for nelang in gettext_module._expand_lang(lang): |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
116 if nelang not in nelangs: |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
117 nelangs.append(nelang) |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
118 return nelangs |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
119 |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
120 def get_mofile(languages, localedir, domain=None): |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
121 """Return the first of .mo files found in localedir for languages |
|
2355
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
122 |
|
2806
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
123 Parameters: |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
124 languages: |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
125 list of locale names to try |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
126 localedir: |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
127 path to directory containing locale files. |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
128 Usually this is either gettext_module._default_localedir |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
129 or 'locale' subdirectory in the tracker home. |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
130 domain: |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
131 optional name of messages domain. |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
132 If omitted or None, work with simplified |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
133 locale directory, as used in tracker homes: |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
134 message catalogs are kept in files locale.po |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
135 instead of locale/LC_MESSAGES/domain.po |
|
399
96b0db9ad389
Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff
changeset
|
136 |
|
2806
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
137 Return the path of the first .mo file found. |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
138 If nothing found, return None. |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
139 |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
140 Automatically compile .po files if necessary. |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
141 |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
142 """ |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
143 for locale in languages: |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
144 if locale == "C": |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
145 break |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
146 if domain: |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
147 basename = os.path.join(localedir, locale, "LC_MESSAGES", domain) |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
148 else: |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
149 basename = os.path.join(localedir, locale) |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
150 # look for message catalog files, check timestamps |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
151 mofile = basename + ".mo" |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
152 if os.path.isfile(mofile): |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
153 motime = os.path.getmtime(mofile) |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
154 else: |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
155 motime = 0 |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
156 pofile = basename + ".po" |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
157 if os.path.isfile(pofile): |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
158 potime = os.path.getmtime(pofile) |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
159 else: |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
160 potime = 0 |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
161 # see what we've found |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
162 if motime < potime: |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
163 # compile |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
164 msgfmt.make(pofile, mofile) |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
165 elif motime == 0: |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
166 # no files found - proceed to the next locale name |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
167 continue |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
168 # .mo file found or made |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
169 return mofile |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
170 return None |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
171 |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
172 def get_translation(language=None, tracker_home=None, |
|
2555
e8b2044d82a6
fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2356
diff
changeset
|
173 translation_class=RoundupTranslations, |
|
e8b2044d82a6
fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2356
diff
changeset
|
174 null_translation_class=RoundupNullTranslations |
|
e8b2044d82a6
fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2356
diff
changeset
|
175 ): |
|
e8b2044d82a6
fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2356
diff
changeset
|
176 """Return Translation object for given language and domain |
|
e8b2044d82a6
fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2356
diff
changeset
|
177 |
|
2917
5809f81fba24
accept a list of languages as well as single language name (thanks donfu)
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2810
diff
changeset
|
178 Argument 'language' may be a single language code or a list of codes. |
|
5809f81fba24
accept a list of languages as well as single language name (thanks donfu)
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2810
diff
changeset
|
179 If 'language' is omitted or None, use locale settings in OS environment. |
|
5809f81fba24
accept a list of languages as well as single language name (thanks donfu)
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2810
diff
changeset
|
180 |
|
2555
e8b2044d82a6
fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2356
diff
changeset
|
181 Arguments 'translation_class' and 'null_translation_class' |
|
e8b2044d82a6
fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2356
diff
changeset
|
182 specify the classes that are instantiated for existing |
|
e8b2044d82a6
fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2356
diff
changeset
|
183 and non-existing translations, respectively. |
|
2806
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
184 |
|
2555
e8b2044d82a6
fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2356
diff
changeset
|
185 """ |
|
2806
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
186 mofiles = [] |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
187 # locale directory paths |
|
2810
ca541343c3ae
straighten "if not ... else" logic;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2806
diff
changeset
|
188 if tracker_home is None: |
|
ca541343c3ae
straighten "if not ... else" logic;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2806
diff
changeset
|
189 tracker_locale = None |
|
ca541343c3ae
straighten "if not ... else" logic;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2806
diff
changeset
|
190 else: |
|
2806
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
191 tracker_locale = os.path.join(tracker_home, "locale") |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
192 # get the list of locales |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
193 locales = find_locales(language) |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
194 # add mofiles found in the tracker, then in the system locale directory |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
195 if tracker_locale: |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
196 mofiles.append(get_mofile(locales, tracker_locale)) |
|
3350
73ef4805a2eb
search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2918
diff
changeset
|
197 for system_locale in LOCALE_DIRS: |
|
73ef4805a2eb
search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2918
diff
changeset
|
198 mofiles.append(get_mofile(locales, system_locale, DOMAIN)) |
|
2806
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
199 # we want to fall back to english unless english is selected language |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
200 if "en" not in locales: |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
201 locales = find_locales("en") |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
202 # add mofiles found in the tracker, then in the system locale directory |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
203 if tracker_locale: |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
204 mofiles.append(get_mofile(locales, tracker_locale)) |
|
3350
73ef4805a2eb
search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2918
diff
changeset
|
205 for system_locale in LOCALE_DIRS: |
|
73ef4805a2eb
search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2918
diff
changeset
|
206 mofiles.append(get_mofile(locales, system_locale, DOMAIN)) |
|
2806
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
207 # filter out elements that are not found |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
208 mofiles = filter(None, mofiles) |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
209 if mofiles: |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
210 translator = translation_class(open(mofiles[0], "rb")) |
|
2810
ca541343c3ae
straighten "if not ... else" logic;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2806
diff
changeset
|
211 for mofile in mofiles[1:]: |
|
ca541343c3ae
straighten "if not ... else" logic;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2806
diff
changeset
|
212 # note: current implementation of gettext_module |
|
ca541343c3ae
straighten "if not ... else" logic;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2806
diff
changeset
|
213 # always adds fallback to the end of the fallback chain. |
|
2806
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
214 translator.add_fallback(translation_class(open(mofile, "rb"))) |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
215 else: |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
216 translator = null_translation_class() |
|
845e87d5e3ba
translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2576
diff
changeset
|
217 return translator |
|
2355
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
218 |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
219 # static translations object |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
220 translation = get_translation() |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
221 # static translation functions |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
222 _ = gettext = translation.gettext |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
223 ugettext = translation.ugettext |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
224 ngettext = translation.ngettext |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
225 ungettext = translation.ungettext |
|
6c2d8183a235
export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2326
diff
changeset
|
226 |
|
2555
e8b2044d82a6
fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2356
diff
changeset
|
227 # vim: set filetype=python sts=4 sw=4 et si : |
