annotate roundup/i18n.py @ 6524:f961dbbc3573

issue2551167 roundup issues when using pip install Running pip install generates a wheel install. This places locale, template and man pages under site-packages/usr/share/.... These changes make roundup look there for templates (affecting admin.py) and locale (affecting i18n.py) files. This also makes it work better in virtual environment and containers (docker). There is also a commented out bit of code in setup.py that prevents it from making a bdist_wheel forcing a regular install with files put under /usr/locale etc. This can be re-enabled if needed for 2.2 if there are still issues with roundup that aren't solved by then.
author John Rouillard <rouilj@ieee.org>
date Sun, 07 Nov 2021 01:49:03 -0400
parents 808f7a8ed2b6
children 5ad7fb912227
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 #
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
2806
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
38 import gettext as gettext_module
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
39 import os
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
40
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
41 from roundup import msgfmt
5416
56c9bcdea47f Python 3 preparation: unicode.
Joseph Myers <jsm@polyomino.org.uk>
parents: 4838
diff changeset
42 from roundup.anypy.strings import is_us
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
6524
f961dbbc3573 issue2551167 roundup issues when using pip install
John Rouillard <rouilj@ieee.org>
parents: 6479
diff changeset
61 # find path when locale files are installed as part of a wheel
f961dbbc3573 issue2551167 roundup issues when using pip install
John Rouillard <rouilj@ieee.org>
parents: 6479
diff changeset
62 # roundup.__path__ should be something like:
f961dbbc3573 issue2551167 roundup issues when using pip install
John Rouillard <rouilj@ieee.org>
parents: 6479
diff changeset
63 # /usr/local/lib/python3.10/site-packages/roundup
f961dbbc3573 issue2551167 roundup issues when using pip install
John Rouillard <rouilj@ieee.org>
parents: 6479
diff changeset
64 # os.prefix should be /usr, /usr/local or root of virtualenv
f961dbbc3573 issue2551167 roundup issues when using pip install
John Rouillard <rouilj@ieee.org>
parents: 6479
diff changeset
65 # strip leading / to make os.path.join work right.
f961dbbc3573 issue2551167 roundup issues when using pip install
John Rouillard <rouilj@ieee.org>
parents: 6479
diff changeset
66 import roundup, sys
f961dbbc3573 issue2551167 roundup issues when using pip install
John Rouillard <rouilj@ieee.org>
parents: 6479
diff changeset
67 _ldir = os.path.join(
f961dbbc3573 issue2551167 roundup issues when using pip install
John Rouillard <rouilj@ieee.org>
parents: 6479
diff changeset
68 os.path.dirname(roundup.__path__[0]),
f961dbbc3573 issue2551167 roundup issues when using pip install
John Rouillard <rouilj@ieee.org>
parents: 6479
diff changeset
69 sys.prefix[1:], 'share', 'locale')
f961dbbc3573 issue2551167 roundup issues when using pip install
John Rouillard <rouilj@ieee.org>
parents: 6479
diff changeset
70 if os.path.isdir(_ldir):
f961dbbc3573 issue2551167 roundup issues when using pip install
John Rouillard <rouilj@ieee.org>
parents: 6479
diff changeset
71 LOCALE_DIRS.append(_ldir)
f961dbbc3573 issue2551167 roundup issues when using pip install
John Rouillard <rouilj@ieee.org>
parents: 6479
diff changeset
72 del _ldir
f961dbbc3573 issue2551167 roundup issues when using pip install
John Rouillard <rouilj@ieee.org>
parents: 6479
diff changeset
73
2355
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
74 # Roundup text domain
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
75 DOMAIN = "roundup"
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
76
4813
a072b35d0606 i18n: Remove Python 2.3 compatibility
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
77 RoundupNullTranslations = gettext_module.NullTranslations
a072b35d0606 i18n: Remove Python 2.3 compatibility
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
78 RoundupTranslations = gettext_module.GNUTranslations
2806
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
79
6067
289cee42cc19 flake8 whitespace fixes; remove unused import errno.
John Rouillard <rouilj@ieee.org>
parents: 5528
diff changeset
80
2806
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
81 def find_locales(language=None):
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
82 """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
83
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
84 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
85 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
86
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
87 """
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
88 # 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
89 if language is None:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
90 languages = []
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
91 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
92 val = os.environ.get(envar)
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
93 if val:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
94 languages = val.split(':')
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
95 break
5416
56c9bcdea47f Python 3 preparation: unicode.
Joseph Myers <jsm@polyomino.org.uk>
parents: 4838
diff changeset
96 elif is_us(language):
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 languages = [language]
2806
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
98 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
99 # '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
100 languages = language
2806
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
101 # 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
102 nelangs = []
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
103 for lang in languages:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
104 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
105 if nelang not in nelangs:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
106 nelangs.append(nelang)
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
107 return nelangs
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
108
6067
289cee42cc19 flake8 whitespace fixes; remove unused import errno.
John Rouillard <rouilj@ieee.org>
parents: 5528
diff changeset
109
2806
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
110 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
111 """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
112
2806
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
113 Parameters:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
114 languages:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
115 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
116 localedir:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
117 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
118 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
119 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
120 domain:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
121 optional name of messages domain.
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
122 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
123 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
124 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
125 instead of locale/LC_MESSAGES/domain.po
399
96b0db9ad389 Added dummy hooks for I18N...
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
126
2806
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
127 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
128 If nothing found, return None.
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
129
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
130 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
131
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
132 """
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
133 for locale in languages:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
134 if locale == "C":
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
135 break
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
136 if domain:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
137 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
138 else:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
139 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
140 # 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
141 mofile = basename + ".mo"
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
142 if os.path.isfile(mofile):
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
143 motime = os.path.getmtime(mofile)
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
144 else:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
145 motime = 0
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
146 pofile = basename + ".po"
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
147 if os.path.isfile(pofile):
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
148 potime = os.path.getmtime(pofile)
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
149 else:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
150 potime = 0
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
151 # see what we've found
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
152 if motime < potime:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
153 # compile
5528
bb364082a14a msgfmt.make doesn't exist any more
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5477
diff changeset
154 mo = msgfmt.Msgfmt(pofile).get()
bb364082a14a msgfmt.make doesn't exist any more
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5477
diff changeset
155 open(mofile, 'wb').write(mo)
2806
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
156 elif motime == 0:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
157 # 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
158 continue
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
159 # .mo file found or made
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
160 return mofile
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
161 return None
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
162
6067
289cee42cc19 flake8 whitespace fixes; remove unused import errno.
John Rouillard <rouilj@ieee.org>
parents: 5528
diff changeset
163
2806
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
164 def get_translation(language=None, tracker_home=None,
6067
289cee42cc19 flake8 whitespace fixes; remove unused import errno.
John Rouillard <rouilj@ieee.org>
parents: 5528
diff changeset
165 translation_class=RoundupTranslations,
289cee42cc19 flake8 whitespace fixes; remove unused import errno.
John Rouillard <rouilj@ieee.org>
parents: 5528
diff changeset
166 null_translation_class=RoundupNullTranslations):
2555
e8b2044d82a6 fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2356
diff changeset
167 """Return Translation object for given language and domain
e8b2044d82a6 fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2356
diff changeset
168
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
169 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
170 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
171
2555
e8b2044d82a6 fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2356
diff changeset
172 Arguments 'translation_class' and 'null_translation_class'
e8b2044d82a6 fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2356
diff changeset
173 specify the classes that are instantiated for existing
e8b2044d82a6 fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2356
diff changeset
174 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
175
2555
e8b2044d82a6 fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2356
diff changeset
176 """
2806
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
177 mofiles = []
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
178 # locale directory paths
2810
ca541343c3ae straighten "if not ... else" logic;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2806
diff changeset
179 if tracker_home is None:
ca541343c3ae straighten "if not ... else" logic;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2806
diff changeset
180 tracker_locale = None
ca541343c3ae straighten "if not ... else" logic;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2806
diff changeset
181 else:
2806
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
182 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
183 # get the list of locales
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
184 locales = find_locales(language)
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
185 # 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
186 if tracker_locale:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
187 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
188 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
189 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
190 # 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
191 if "en" not in locales:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
192 locales = find_locales("en")
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
193 # 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
194 if tracker_locale:
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
195 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
196 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
197 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
198 # 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
199 mofiles = filter(None, mofiles)
4838
6102252d3a8a Do not throw an internal error if a .mo file can not be read
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4813
diff changeset
200 translator = None
6102252d3a8a Do not throw an internal error if a .mo file can not be read
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4813
diff changeset
201 for mofile in mofiles:
6102252d3a8a Do not throw an internal error if a .mo file can not be read
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4813
diff changeset
202 try:
6102252d3a8a Do not throw an internal error if a .mo file can not be read
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4813
diff changeset
203 mo = open(mofile, "rb")
6102252d3a8a Do not throw an internal error if a .mo file can not be read
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4813
diff changeset
204 if translator is None:
6102252d3a8a Do not throw an internal error if a .mo file can not be read
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4813
diff changeset
205 translator = translation_class(mo)
6102252d3a8a Do not throw an internal error if a .mo file can not be read
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4813
diff changeset
206 else:
6102252d3a8a Do not throw an internal error if a .mo file can not be read
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4813
diff changeset
207 # note: current implementation of gettext_module
6102252d3a8a Do not throw an internal error if a .mo file can not be read
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4813
diff changeset
208 # always adds fallback to the end of the fallback chain.
6102252d3a8a Do not throw an internal error if a .mo file can not be read
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4813
diff changeset
209 translator.add_fallback(translation_class(mo))
6479
808f7a8ed2b6 Clean leaking file descriptors. Eliminates ResourceWarnings.
John Rouillard <rouilj@ieee.org>
parents: 6067
diff changeset
210 mo.close()
4838
6102252d3a8a Do not throw an internal error if a .mo file can not be read
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4813
diff changeset
211 except IOError:
6102252d3a8a Do not throw an internal error if a .mo file can not be read
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4813
diff changeset
212 # ignore unreadable .mo files
6102252d3a8a Do not throw an internal error if a .mo file can not be read
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4813
diff changeset
213 pass
6102252d3a8a Do not throw an internal error if a .mo file can not be read
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4813
diff changeset
214 if translator is None:
2806
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
215 translator = null_translation_class()
845e87d5e3ba translator objects now have the following search path:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2576
diff changeset
216 return translator
2355
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
217
6067
289cee42cc19 flake8 whitespace fixes; remove unused import errno.
John Rouillard <rouilj@ieee.org>
parents: 5528
diff changeset
218
2355
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
5477
b0c2307be3d1 applied remaining part of original patch 045 (slightly modified)
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5416
diff changeset
223 try:
b0c2307be3d1 applied remaining part of original patch 045 (slightly modified)
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5416
diff changeset
224 # Python 2.
b0c2307be3d1 applied remaining part of original patch 045 (slightly modified)
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5416
diff changeset
225 ugettext = translation.ugettext
b0c2307be3d1 applied remaining part of original patch 045 (slightly modified)
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5416
diff changeset
226 except AttributeError:
b0c2307be3d1 applied remaining part of original patch 045 (slightly modified)
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5416
diff changeset
227 # Python 3.
b0c2307be3d1 applied remaining part of original patch 045 (slightly modified)
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5416
diff changeset
228 ugettext = translation.gettext
2355
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
229 ngettext = translation.ngettext
5477
b0c2307be3d1 applied remaining part of original patch 045 (slightly modified)
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5416
diff changeset
230 try:
b0c2307be3d1 applied remaining part of original patch 045 (slightly modified)
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5416
diff changeset
231 # Python 2.
b0c2307be3d1 applied remaining part of original patch 045 (slightly modified)
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5416
diff changeset
232 ungettext = translation.ungettext
b0c2307be3d1 applied remaining part of original patch 045 (slightly modified)
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5416
diff changeset
233 except AttributeError:
b0c2307be3d1 applied remaining part of original patch 045 (slightly modified)
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5416
diff changeset
234 # Python 3.
b0c2307be3d1 applied remaining part of original patch 045 (slightly modified)
Christof Meerwald <cmeerw@cmeerw.org>
parents: 5416
diff changeset
235 ungettext = translation.ngettext
2355
6c2d8183a235 export unicode functions and DOMAIN name;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2326
diff changeset
236
2555
e8b2044d82a6 fix vim modeline;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2356
diff changeset
237 # vim: set filetype=python sts=4 sw=4 et si :

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