@@ -63,7 +63,20 @@ opensearch_xml = '''<?xml version="1.0" encoding="utf-8"?>
6363
6464@babel.localeselector
6565def get_locale():
66− return request.accept_languages.best_match(settings['languages'].keys())
66+ locale = request.accept_languages.best_match(settings['locales'].keys())
67+
68+ if request.cookies.get('locale', '') in settings['locales']:
69+ locale = request.cookies.get('locale', '')
70+
71+ if 'locale' in request.args\
72+ and request.args['locale'] in settings['locales']:
73+ locale = request.args['locale']
74+
75+ if 'locale' in request.form\
76+ and request.form['locale'] in settings['locales']:
77+ locale = request.form['locale']
78+
79+ return locale
6780
6881
6982def get_base_url():
@@ -213,21 +226,35 @@ def preferences():
213226
214227 if request.method == 'POST':
215228 selected_categories = []
229+ locale = None
216230 for pd_name, pd in request.form.items():
217231 if pd_name.startswith('category_'):
218232 category = pd_name[9:]
219233 if not category in categories:
220234 continue
221235 selected_categories.append(category)
236+ elif pd_name == 'locale' and pd in settings['locales']:
237+ locale = pd
238+
239+ resp = make_response(redirect('/'))
240+
241+ if locale:
242+ # cookie max age: 4 weeks
243+ resp.set_cookie(
244+ 'locale', locale,
245+ max_age=60 * 60 * 24 * 7 * 4
246+ )
247+
222248 if selected_categories:
223− resp = make_response(redirect('/'))
224249 # cookie max age: 4 weeks
225250 resp.set_cookie(
226251 'categories', ','.join(selected_categories),
227252 max_age=60 * 60 * 24 * 7 * 4
228253 )
229− return resp
230− return render('preferences.html')
254+ return resp
255+ return render('preferences.html'
256+ ,locales=settings['locales']
257+ ,current_locale=get_locale())
231258
232259
233260@app.route('/stats', methods=['GET'])