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
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
22 regex_language=re.compile('[a-zA-Z]{2}(\-[a-zA-Z]{2})?(\-[a-zA-Z]+)?')
23
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
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
38 return cgi.escape(str(self))
39
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 """
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
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
106 path=os.path.join(application_path,'languages/')
107 for language in listdir(path,'.+'):
108 findT(application_path,language[:-3])
109