Package gluon :: Module languages
[hide private]
[frames] | no frames]

Source Code for Module gluon.languages

  1  """ 
  2  This file is part of web2py Web Framework (Copyrighted, 2007) 
  3  Developed by Massimo Di Pierro <mdipierro@cs.depaul.edu> 
  4  License: GPL v2 
  5  """ 
  6   
  7  import sys, os, re, cgi 
  8  from fileutils import listdir 
  9   
 10  __all__=['translator','findT','update_all_languages'] 
 11   
 12  # pattern to find T(bla bla bla) expressions 
 13  PY_STRING_LITERAL_RE= r'(?<=[^\w]T\()(?P<name>'+ \ 
 14    r"[uU]?[rR]?(?:'''(?:[^']|'{1,2}(?!'))*''')|" +\ 
 15                r"(?:'(?:[^'\\]|\\.)*')|" +\ 
 16              r'(?:"""(?:[^"]|"{1,2}(?!"))*""")|'+ \ 
 17                r'(?:"(?:[^"\\]|\\.)*"))' 
 18              
 19  regex_translate=re.compile(PY_STRING_LITERAL_RE,re.DOTALL) 
 20   
 21  # patter for a valid accept_language 
 22  regex_language=re.compile('[a-zA-Z]{2}(\-[a-zA-Z]{2})?(\-[a-zA-Z]+)?') 
 23   
24 -class lazyT(object):
25 """ 26 never to be called explicitly, returned by translator.__call__ 27 """
28 - def __init__(self,message,symbols={},self_t=None):
29 self.m=message 30 self.s=symbols 31 self.t=self_t
32 - def __str__(self):
33 m=self.m 34 if self.t and self.t.has_key(m): m=self.t[m] 35 if self.s: m % self.s 36 else: return m
37 - def xml(self):
38 return cgi.escape(str(self))
39
40 -class translator(object):
41 """ 42 this class is intantiated once in gluon/main.py as the T object 43 44 T.force(None) # turns off translation 45 T.force('fr, it') # forces web2py to translate using fr.py or it.py 46 47 T("Hello World") # translates "Hello World" using the selected file 48 49 notice 1: there is no need to force since, by default, T uses accept_langauge 50 to determine a translation file. 51 52 notice 2: en and en-en are considered different languages! 53 """
54 - def __init__(self,request):
55 self.folder=request.folder 56 self.current_languages=[] 57 self.force(languages=request.env.http_accept_language)
58 - def force(self,languages=None):
59 if languages: 60 if isinstance(languages,(str,unicode)): 61 accept_languages=languages.split(';') 62 languages=[] 63 for al in accept_languages: languages+=al.split(',') 64 for language in languages: 65 language=language.strip() 66 if language in self.current_languages: break 67 if not regex_language.match(language): continue 68 filename=os.path.join(self.folder,'languages/','%s.py'%language) 69 if os.access(filename,os.R_OK): 70 self.accepted_language=language 71 self.t=eval(open(filename,'r').read()) 72 return 73 self.t=None ### no langauge by default
74 - def __call__(self,message,symbols={}):
75 return lazyT(message,symbols,self.t)
76
77 -def findT(application_path,language='en-us'):
78 """ 79 must be run by the admin app 80 """ 81 path=application_path 82 try: 83 sentences=eval(open(os.path.join(path,'languages','%s.py' % language),'r').read()) 84 except: 85 sentences={} 86 mp=os.path.join(path,'models') 87 cp=os.path.join(path,'controllers') 88 vp=os.path.join(path,'views') 89 for file in listdir(mp,'.+\.py',0)+listdir(cp,'.+\.py',0)+listdir(vp,'.+\.html',0): 90 data=open(file,'r').read() 91 items=regex_translate.findall(data) 92 for item in items: 93 msg=eval(item) 94 if msg and not sentences.has_key(msg): 95 sentences[msg]='*** %s' % msg 96 keys=sentences.keys() 97 keys.sort() 98 file=open(os.path.join(path,'languages','%s.py' % language),'w') 99 file.write('{\n') 100 for key in keys: 101 file.write("%s:%s,\n" % (repr(key),repr(str(sentences[key])))) 102 file.write('}\n') 103 file.close()
104
105 -def update_all_languages(application_path):
106 path=os.path.join(application_path,'languages/') 107 for language in listdir(path,'.+'): 108 findT(application_path,language[:-3])
109