-
Notifications
You must be signed in to change notification settings - Fork 32
/
i18n.py
107 lines (73 loc) · 2.53 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
104
105
106
107
from babel import Locale
from flask import current_app as cur_app, request
from flask.ext.babel import Babel, get_locale
from functools import wraps
from popong_nlp.utils.translit import translit
__all__ = ['PopongBabel']
class PopongBabel(Babel):
def init_app(self, app):
super(PopongBabel, self).init_app(app)
self.localeselector(localeselector)
# shortcuts
app.babel = self
app.LOCALES = self.list_translations() + [Locale('en')]
# cmd-line locale option
if hasattr(app, 'locale') and getattr(app, 'locale') in app.LOCALES:
app.babel.force_locale(app.locale)
# jinja filters
app.jinja_env.filters['translit'] = filter_translit
app.jinja_env.globals.update(translit=filter_translit)
# context processor
app.context_processor(inject_locales)
def force_locale(self, locale):
self.locale_selector_func = lambda: locale
class InvalidLocaleError(Exception):
pass
class NotInAppContextError(Exception):
pass
@wraps
def babel_context(f):
def decorated(*args, **kwargs):
if not hasattr(cur_app, 'babel') or not hasattr(cur_app, 'LOCALES'):
raise NotInAppContextError()
f(*args, **kwargs)
return decorated
@babel_context
def is_valid_locale(locale):
return locale in cur_app.LOCALES
def assert_valid_locale(locale):
if not is_valid_locale(locale):
raise InvalidLocaleError()
def host(locale=None):
assert_valid_locale(locale)
t = request.host.split('.', 1)
if len(t) < 2 or not is_valid_locale(t[0]):
host = request.host
else:
host = t[1]
return '{locale}.{host}'.format(locale=locale, host=host)
@babel_context
def localeselector():
locale = request.host.split('.', 1)[0]
if not is_valid_locale(locale):
locale = cur_app.babel.default_locale
return locale
@babel_context
def inject_locales():
# TODO: caching
locale_links = {
locale: request.url.replace(request.host, host(locale))
for locale in cur_app.LOCALES
}
return dict(locale_links=locale_links,
locale=str(get_locale()))
def filter_translit(*args, **kwargs):
locale = str(get_locale())
_type = kwargs.get('type')
if len(args) == 1:
string = args[0]
return translit(string, 'ko', locale, _type) if locale != 'ko' else string
elif args:
raise Exception('filter_translit() only accepts one or zero argument')
else:
return lambda x: filter_translit(x, type=_type)