annotate roundup/i18n.py @ 4546:d39c37fd2940 git

Repository conversion from Subversion to git.
author Eric S. Raymond <esr@thyrsus.com>
date Tue, 18 Oct 2011 10:20:29 -0400
parents 73ef4805a2eb
children 6e3e4f24c753
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 #
3350
73ef4805a2eb search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2918
diff changeset
18 # $Id: i18n.py,v 1.15 2005-06-14 05:33:32 a1s Exp $
399
96b0db9ad389 Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
19
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
20 """
399
96b0db9ad389 Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
21 RoundUp Internationalization (I18N)
96b0db9ad389 Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
22
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
23 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
24
96b0db9ad389 Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
25 from roundup.i18n import _
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 print _("Some text that can be translated")
96b0db9ad389 Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
28
96b0db9ad389 Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
29 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
30 (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
31 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
32
96b0db9ad389 Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
33 ... _('Index of %(classname)s') % {'classname': cn} ...
96b0db9ad389 Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
34
96b0db9ad389 Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
35 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
36 the dynamic portion of a message really means.
96b0db9ad389 Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
37 """
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
38 __docformat__ = 'restructuredtext'
399
96b0db9ad389 Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
39
2355
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
40 import errno
2806
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
41 import gettext as gettext_module
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
42 import os
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
43
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
44 from roundup import msgfmt
2355
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
45
3350
73ef4805a2eb search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2918
diff changeset
46 # 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
47 LOCALE_DIRS = [
73ef4805a2eb search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2918
diff changeset
48 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
49 ]
73ef4805a2eb search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2918
diff changeset
50 # 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
51 # (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
52 # 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
53 # 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
54 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
55 _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
56 else:
73ef4805a2eb search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2918
diff changeset
57 _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
58 _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
59 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
60 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
61 del _mo_path
73ef4805a2eb search mo files relative ro roundup installation path [SF#1219689]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2918
diff changeset
62
2355
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
63 # Roundup text domain
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
64 DOMAIN = "roundup"
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
65
2806
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
66 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
67 # gettext_module has everything needed
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
68 RoundupNullTranslations = gettext_module.NullTranslations
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
69 RoundupTranslations = gettext_module.GNUTranslations
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
70 else:
2355
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
71 # 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
72 class PluralFormsMixIn:
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
73 def ngettext(self, singular, plural, count):
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
74 if count == 1:
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
75 _msg = singular
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
76 else:
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
77 _msg = plural
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
78 return self.gettext(_msg)
2356
c2db20eca3fa fix ungettext() in PluralFormsMixIn;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2355
diff changeset
79 def ungettext(self, singular, plural, count):
2355
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
80 if count == 1:
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
81 _msg = singular
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
82 else:
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
83 _msg = plural
2356
c2db20eca3fa fix ungettext() in PluralFormsMixIn;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2355
diff changeset
84 return self.ugettext(_msg)
2355
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
85 class RoundupNullTranslations(
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
86 gettext_module.NullTranslations, PluralFormsMixIn
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
87 ):
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
88 pass
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
89 class RoundupTranslations(
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
90 gettext_module.GNUTranslations, PluralFormsMixIn
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
91 ):
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
92 pass
2806
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
93
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
94 def find_locales(language=None):
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
95 """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
96
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
97 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
98 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
99
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
100 """
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
101 # 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
102 if language is None:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
103 languages = []
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
104 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
105 val = os.environ.get(envar)
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
106 if val:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
107 languages = val.split(':')
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
108 break
2918
a3d9d7e98c36 oops. isinstance() did not accept tuples in 2.1.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2917
diff changeset
109 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
110 languages = [language]
2806
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
111 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
112 # '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
113 languages = language
2806
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
114 # 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
115 nelangs = []
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
116 for lang in languages:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
117 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
118 if nelang not in nelangs:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
119 nelangs.append(nelang)
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
120 return nelangs
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
121
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
122 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
123 """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
124
2806
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
125 Parameters:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
126 languages:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
127 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
128 localedir:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
129 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
130 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
131 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
132 domain:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
133 optional name of messages domain.
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
134 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
135 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
136 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
137 instead of locale/LC_MESSAGES/domain.po
399
96b0db9ad389 Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
138
2806
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
139 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
140 If nothing found, return None.
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 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
143
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
144 """
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
145 for locale in languages:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
146 if locale == "C":
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
147 break
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
148 if domain:
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, "LC_MESSAGES", domain)
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
150 else:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
151 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
152 # 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
153 mofile = basename + ".mo"
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
154 if os.path.isfile(mofile):
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
155 motime = os.path.getmtime(mofile)
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
156 else:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
157 motime = 0
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
158 pofile = basename + ".po"
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
159 if os.path.isfile(pofile):
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
160 potime = os.path.getmtime(pofile)
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
161 else:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
162 potime = 0
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
163 # see what we've found
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
164 if motime < potime:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
165 # compile
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
166 msgfmt.make(pofile, mofile)
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
167 elif motime == 0:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
168 # 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
169 continue
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
170 # .mo file found or made
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
171 return mofile
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
172 return None
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
173
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
174 def get_translation(language=None, tracker_home=None,
2555
e8b2044d82a6 fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2356
diff changeset
175 translation_class=RoundupTranslations,
e8b2044d82a6 fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2356
diff changeset
176 null_translation_class=RoundupNullTranslations
e8b2044d82a6 fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2356
diff changeset
177 ):
e8b2044d82a6 fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2356
diff changeset
178 """Return Translation object for given language and domain
e8b2044d82a6 fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2356
diff changeset
179
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
180 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
181 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
182
2555
e8b2044d82a6 fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2356
diff changeset
183 Arguments 'translation_class' and 'null_translation_class'
e8b2044d82a6 fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2356
diff changeset
184 specify the classes that are instantiated for existing
e8b2044d82a6 fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2356
diff changeset
185 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
186
2555
e8b2044d82a6 fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2356
diff changeset
187 """
2806
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
188 mofiles = []
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
189 # locale directory paths
2810
ca541343c3ae straighten "if not ... else" logic;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2806
diff changeset
190 if tracker_home is None:
ca541343c3ae straighten "if not ... else" logic;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2806
diff changeset
191 tracker_locale = None
ca541343c3ae straighten "if not ... else" logic;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2806
diff changeset
192 else:
2806
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
193 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
194 # get the list of locales
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
195 locales = find_locales(language)
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
196 # 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
197 if tracker_locale:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
198 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
199 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
200 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
201 # 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
202 if "en" not in locales:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
203 locales = find_locales("en")
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
204 # 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
205 if tracker_locale:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
206 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
207 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
208 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
209 # 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
210 mofiles = filter(None, mofiles)
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
211 if mofiles:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
212 translator = translation_class(open(mofiles[0], "rb"))
2810
ca541343c3ae straighten "if not ... else" logic;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2806
diff changeset
213 for mofile in mofiles[1:]:
ca541343c3ae straighten "if not ... else" logic;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2806
diff changeset
214 # note: current implementation of gettext_module
ca541343c3ae straighten "if not ... else" logic;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2806
diff changeset
215 # 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
216 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
217 else:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
218 translator = null_translation_class()
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
219 return translator
2355
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
220
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
221 # static translations object
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
222 translation = get_translation()
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
223 # static translation functions
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
224 _ = gettext = translation.gettext
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
225 ugettext = translation.ugettext
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
226 ngettext = translation.ngettext
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
227 ungettext = translation.ungettext
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
228
2555
e8b2044d82a6 fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2356
diff changeset
229 # vim: set filetype=python sts=4 sw=4 et si :

Roundup Issue Tracker: http://roundup-tracker.org/