/
i18n.py
103 lines (80 loc) · 3.18 KB
/
i18n.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
from google.appengine.api import users
from google.appengine.api import memcache
from google.appengine.ext import webapp
from ajax import redirectPage
from io import readFile
availableLanguages = ['es', 'en']
languageData = {}
# Returns a default language to use based on the Accept-Language
# header of the given reuqest.
def getDefaultLanguage(handler):
cookie = 'lang' in handler.request.cookies
if cookie:
return ensureLanguage(handler.request.cookies['lang'])
global availableLanguages
langs = ['en']
if 'Accept-Language' in handler.request.headers:
langs = handler.request.headers['Accept-Language'].split(',')
for lang in langs:
for availableLang in availableLanguages:
if lang == availableLang:
return lang
return 'en'
# Returns the preferred language of the current logged user, defaulting
# to the request header Accept-Language if none was previously selected
def getLanguage(handler, user):
# Try getting the preference from memcache
key = '%s language' % user
lang = memcache.get(key)
# If it's not there, default and set in memcache
if not lang:
lang = getDefaultLanguage(handler)
memcache.set(key, lang)
return lang
def ensureLanguage(lang):
global availableLanguages
for availableLang in availableLanguages:
if lang == availableLang:
return lang
return 'en'
# Returns a localized text for the given key, in the given language
def _(key, language):
global languageData
# Load language data if it's not loaded yet
if not (language in languageData):
_initializeLanguageData(language)
# Return value, or key if value is empty
value = languageData[language][key]
if value.strip() == '':
value = key
return value
def _initializeLanguageData(language):
global languageData
props = {}
lines = readFile('locale/%s.properties' % language).split('\n')
for line in lines:
[key, value] = line.split(':=', 1)
props[key] = value.strip()
languageData[language] = props
def addMasterKeys(model, lang):
model['lang'] = lang
model['YouNeedAGoogleAccount'] = _('You need a Google Account', lang)
model['AllRightsReserved'] = _('All rights reserved', lang)
model['DevelopedBy'] = _('Developed by', lang)
model['OriginalIdeaBy'] = _('Original idea by', lang)
model['Hello'] = _('Hello', lang)
model['Logout'] = _('Logout', lang)
global availableLanguages
for availableLang in availableLanguages:
model['%sSelected' % availableLang] = lang == availableLang
class ChangeLanguageHandler(webapp.RequestHandler):
def get(self):
user = users.get_current_user()
lang = ensureLanguage(self.request.get('lang'))
# Set cookie
self.response.headers['Set-Cookie'] = str('lang=%s; path=/;' % lang)
# Set memcache if possible
if user:
key = '%s language' % user
memcache.set(key, lang)
redirectPage(self, '/')