|
Server : Apache/2.2.17 (Unix) mod_ssl/2.2.17 OpenSSL/0.9.8e-fips-rhel5 DAV/2 PHP/5.2.17 System : Linux localhost 2.6.18-419.el5 #1 SMP Fri Feb 24 22:47:42 UTC 2017 x86_64 User : nobody ( 99) PHP Version : 5.2.17 Disable Function : NONE Directory : /proc/21585/root/usr/lib64/python2.4/site-packages/rhpl/ |
Upload File : |
#
# translate.py - persistent global gettext service for python programs
# needing transparent access to multiple textdomains
#
# adapted from translate.py originally in anaconda
#
# Matt Wilson <msw@redhat.com>
# Jeremy Katz <katzj@redhat.com>
#
# Copyright 2002 Red Hat, Inc.
#
# This software may be freely redistributed under the terms of the GNU
# library public license.
#
# You should have received a copy of the GNU Library Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
import gettext
import iconv
import os, sys, string
import gzip
import locale
import _translate
def _expandLang(str):
langs = [str]
# remove charset ...
if '.' in str:
langs.append(string.split(str, '.')[0])
# also add 2 character language code ...
if len(str) > 2:
langs.append(str[:2])
return langs
def getDefaultLangs():
lang = []
for env in 'LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG':
if os.environ.has_key(env):
lang = string.split(os.environ[env], ':')
lang = map(_expandLang, lang)
lang = reduce(lambda a, b: a + b, lang)
break
if 'C' not in lang:
lang.append('C')
return lang
class i18n:
def __init__(self, langs=None, conversion=0, domain=None, paths=None):
# FIXME: legacy method names
self.utf8 = self.convert
self.setunicode = self.setconversion
self.getunicode = self.getconversion
# do we convert to codeset or not?
self.conversion = conversion
# codeset to convert to
self.codeset = 'utf-8'
# dictionary of catalogs. keyed by domain, val is (cat, iconv)
self.cats = {}
# list of domains in search order. setting textdomain adds
# to the front of the list
self.domains = []
if langs:
self.langs = langs
else:
try:
self.langs = getDefaultLangs()
except:
self.langs = ['C']
if paths is None:
self.paths = [ "/usr/share/locale" ]
else:
self.paths = paths
self.setDomain(domain)
# add a dir to our search path for po files
def addPoPath(self, path):
if path not in self.paths:
self.paths.insert(0, path)
self.updateCachedCatPaths()
def setDomain(self, domain):
# add domain to the front of our domain list
if type(domain) == type([]):
domain.reverse()
for dom in domain:
if dom in self.domains:
self.domains.pop(self.domains.index(dom))
self.domains.insert(0, dom)
else:
if domain in self.domains:
self.domains.pop(self.domains.index(domain))
self.domains.insert(0, domain)
# let's pop None out of the list if its there and special case it
if None in self.domains:
self.domains.pop(self.domains.index(None))
self.updateCachedCatPaths()
def updateCachedCatPaths(self):
# should we recreate this each time?
self.cats = {}
self.iconv = None
for domain in self.domains + [ None ]:
for mypath in self.paths:
if not domain:
path = 'po/%s.mo'
else:
path = '%s/%s/LC_MESSAGES/%s.mo' % (mypath, '%s', domain,)
mofile = None
for lang in self.langs:
try:
file_path = path %(lang,)
f = open(file_path)
buf = f.read(2)
f.close()
if buf == "\037\213":
mofile = gzip.open(file_path)
else:
mofile = open(file_path)
except IOError:
pass
if mofile:
break
if mofile is None:
continue
catalog = gettext.GNUTranslations(mofile)
try:
theiconv = iconv.open(self.codeset, catalog.charset())
except Exception, e:
sys.stderr.write('unable to translate from %s to utf-8: %s\n' %(catalog.charset(), e))
theiconv = iconv.open(self.codeset, 'UTF-8')
self.cats[domain] = (catalog, theiconv)
if self.iconv is None:
self.iconv = theiconv
break
# now let's put None at the beginning of the list as it corresponds
# to the "current" local po files for testing
self.domains.insert(0, None)
if len(self.cats) == 0:
encoding = locale.nl_langinfo (locale.CODESET)
# sys.stderr.write("WARNING: Unable to find catalog, using %s for codeset, %s for encoding\n" %(self.codeset, encoding))
try:
self.iconv = iconv.open(self.codeset, encoding)
except:
sys.stderr.write("FAILED to create iconv with codeset %s and encoding %s\n" %(self.codeset, encoding));
return
def setDomainCodeset(self, domain, codeset):
self.codeset = codeset
self.conversion = 1
self.setDomain (domain)
def setCodeset(self, codeset):
self.codeset = codeset
self.conversion = 1
def setconversion(self, value):
self.conversion = value
def getconversion(self, value):
return self.conversion
def getlangs(self):
return self.langs
def setlangs(self, langs):
self.__init__(langs, self.conversion, self.domains, self.paths)
def convert(self, string):
try:
return self.iconv.iconv(string)
except:
return string
def gettext(self, string):
if len(self.cats) == 0:
return string
translation = None
for domain in self.domains:
if not self.cats.has_key(domain):
continue
(cat, iconv) = self.cats[domain]
translation = cat._catalog.get(string)
if translation is not None:
if self.conversion:
return iconv.iconv(translation)
else:
return translation.encode("UTF-8")
return string
def N_(str):
return str
def textdomain_codeset(domain, codeset):
global cat
cat.setDomainCodeset(domain, codeset)
def textdomain(domain):
global cat
cat.setDomain(domain)
def addPoPath(path):
global cat
cat.addPoPath(path)
def py_bind_textdomain_codeset(domain, codeset):
_translate.bind_textdomain_codeset(domain, codeset)
cat = i18n()
_ = cat.gettext
utf8 = cat.convert
convert = cat.convert