aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Schadt <kingdread@gmx.de>2022-07-02 17:34:06 +0200
committerDaniel Schadt <kingdread@gmx.de>2022-07-02 17:34:06 +0200
commit2343c1e059be3936fc32545105b2bbf4f3d8d638 (patch)
treede387641164688c1ffa9a7d9b025daaa741d5897
parentaac08f66bad5e2d2488c9aeb6e38cd7e1f8a32ce (diff)
downloadfietsboek-2343c1e059be3936fc32545105b2bbf4f3d8d638.tar.gz
fietsboek-2343c1e059be3936fc32545105b2bbf4f3d8d638.tar.bz2
fietsboek-2343c1e059be3936fc32545105b2bbf4f3d8d638.zip
add a locale negotiator that uses Accept-Language
-rw-r--r--development.ini1
-rw-r--r--fietsboek/__init__.py33
2 files changed, 33 insertions, 1 deletions
diff --git a/development.ini b/development.ini
index a93c838..15250c4 100644
--- a/development.ini
+++ b/development.ini
@@ -27,6 +27,7 @@ retry.attempts = 3
email.from = fietsboek@kingdread.de
email.smtp_url = debug://localhost:1025
+available_locales = en de
enable_account_registration = true
session_key = hklurha7ildshgfljhrbuajelghug
diff --git a/fietsboek/__init__.py b/fietsboek/__init__.py
index 80b6c7d..98e6846 100644
--- a/fietsboek/__init__.py
+++ b/fietsboek/__init__.py
@@ -4,11 +4,39 @@ For more information, see the README or the included documentation.
"""
from pyramid.config import Configurator
from pyramid.session import SignedCookieSessionFactory
-from pyramid.settings import asbool
+from pyramid.settings import asbool, aslist
+from pyramid.i18n import default_locale_negotiator
from .security import SecurityPolicy
+def locale_negotiator(request):
+ """Negotiates the right locale to use.
+
+ This tries the following:
+ 1. It runs the default negotiator. This allows the locale to be overriden
+ by using the _LOCALE_ query parameter.
+ 2. It uses the `Accept-Language`_ header.
+
+ .. Accept-Language: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language
+
+ :param request: The request for which to get the language.
+ :type request: pyramid.request.Request
+ :return: The determined locale, or ``None`` if the default should be used.
+ :rtype: str
+ """
+ locale = default_locale_negotiator(request)
+ if locale:
+ return locale
+
+ installed_locales = request.registry.settings['available_locales']
+ sentinel = object()
+ negotiated = request.accept_language.lookup(installed_locales, default=sentinel)
+ if negotiated is sentinel:
+ return None
+ return negotiated
+
+
def main(global_config, **settings):
""" This function returns a Pyramid WSGI application.
"""
@@ -18,6 +46,8 @@ def main(global_config, **settings):
settings['enable_account_registration'] = asbool(
settings.get('enable_account_registration', 'false'))
+ settings['available_locales'] = aslist(
+ settings.get('available_locales', 'en'))
my_session_factory = SignedCookieSessionFactory(settings['session_key'])
with Configurator(settings=settings) as config:
@@ -28,4 +58,5 @@ def main(global_config, **settings):
config.add_translation_dirs('fietsboek:locale/')
config.set_session_factory(my_session_factory)
config.set_security_policy(SecurityPolicy())
+ config.set_locale_negotiator(locale_negotiator)
return config.make_wsgi_app()