summaryrefslogtreecommitdiff
path: root/repoze/bfg/i18n.py
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2010-04-27 16:44:52 +0000
committerChris McDonough <chrism@agendaless.com>2010-04-27 16:44:52 +0000
commit12cb6df7728c8321905a08b0864b3ff0386c62cf (patch)
tree945e3cbf094775c57f0a6b94f36e78885cbd4a53 /repoze/bfg/i18n.py
parent4c8f4d965e06b6bd584151896bfb37663cd69501 (diff)
downloadpyramid-12cb6df7728c8321905a08b0864b3ff0386c62cf.tar.gz
pyramid-12cb6df7728c8321905a08b0864b3ff0386c62cf.tar.bz2
pyramid-12cb6df7728c8321905a08b0864b3ff0386c62cf.zip
Features
-------- - A locale negotiator no longer needs to be registered explicitly. The default locale negotiator at ``repoze.bfg.i18n.default_locale_negotiator`` is now used unconditionally as... um, the default locale negotiator. - The default locale negotiator has become more complex. * First, the negotiator looks for the ``_LOCALE_`` attribute of the request object (possibly set by an :term:`event listener`). * Then it looks for the ``request.params['_LOCALE_']`` value. * Then it looks for the ``request.cookies['_LOCALE_']`` value. Backwards Incompatibilities --------------------------- - The default locale negotiator now looks for the parameter named ``_LOCALE_`` rather than a parameter named ``locale`` in ``request.params``. Behavior Changes ---------------- - A locale negotiator may now return ``None``, signifying that the default locale should be used. Documentation ------------- - Documentation concerning locale negotiation in the Internationalizationa and Localization chapter was updated.
Diffstat (limited to 'repoze/bfg/i18n.py')
-rw-r--r--repoze/bfg/i18n.py37
1 files changed, 26 insertions, 11 deletions
diff --git a/repoze/bfg/i18n.py b/repoze/bfg/i18n.py
index e3b276331..640ee030b 100644
--- a/repoze/bfg/i18n.py
+++ b/repoze/bfg/i18n.py
@@ -96,14 +96,27 @@ class Localizer(object):
def default_locale_negotiator(request):
- """ The default :term:`locale negotiator`. Returns a locale
- name based on ``request.params.get('locale')`` or the
- ``default_locale_name`` settings option; or ``en`` if all else
- fails."""
- locale_name = request.params.get('locale')
+ """ The default :term:`locale negotiator`. Returns a locale name
+ or ``None``.
+
+ - First, the negotiator looks for the ``_LOCALE_`` attribute of
+ the request object (possibly set by an :term:`event listener`).
+
+ - Then it looks for the ``request.params['_LOCALE_']`` value.
+
+ - Then it looks for the ``request.cookies['_LOCALE_']`` value.
+
+ - Finally, the negotiator returns ``None`` if the locale could not
+ be determined via any of the previous checks (when a locale
+ negotiator returns ``None``, it signifies that the
+ :term:`default locale` should be used.)
+ """
+ name = '_LOCALE_'
+ locale_name = getattr(request, name, None)
if locale_name is None:
- settings = get_settings() or {}
- locale_name = settings.get('default_locale_name', 'en')
+ locale_name = request.params.get(name)
+ if locale_name is None:
+ locale_name = request.cookies.get(name)
return locale_name
def negotiate_locale_name(request):
@@ -113,12 +126,14 @@ def negotiate_locale_name(request):
registry = request.registry
except AttributeError:
registry = get_current_registry()
- negotiator = registry.queryUtility(ILocaleNegotiator)
- if negotiator is None:
+ negotiator = registry.queryUtility(ILocaleNegotiator,
+ default=default_locale_negotiator)
+ locale_name = negotiator(request)
+
+ if locale_name is None:
settings = get_settings() or {}
locale_name = settings.get('default_locale_name', 'en')
- else:
- locale_name = negotiator(request)
+
return locale_name
def get_locale_name(request):