Je viens de créer le projet de base Pyramid "hello world" et j'ai ajouté le support i18n. J'utilise des modèles Python 3.5 et Chameleon (.pt
) avec gettext.Comment ajouter un code de langue à une URL dans Pyramid?
Je peux actuellement changer la langue grâce au fichier .ini
.
Maintenant je voudrais le rendre dynamique et lire le code de langue de l'URL. Les URL sont donc remplacées par /<language code>/page/{possible params}
, par exemple /fi/home
. Je ne souhaite pas ajouter {language}
aux routes/vues existantes pour que le paramètre de code de langue soit masqué et que les vues n'en sachent rien, sauf lors de la création de liens vers d'autres pages dans des modèles/vues.
EDIT: Voici ma tentative à l'aide tweens mentionné par Mikko Ohtamaa:
Ajouté à __init__.py
:
config.add_tween('myapp.tweens.LocalizerTween')
tweens.py
:
import logging
from pyramid.registry import Registry
from pyramid.request import Request
log = logging.getLogger(__name__)
class LocalizerTween(object):
"""
Set translator based on URL
"""
def __init__(self, handler, registry: Registry):
self.handler = handler
self.registry = registry
def __call__(self, request: Request):
if request.path.count("/") > 1 and len(request.path) > 3:
request.locale_name = request.path[1:].split("/", 1)[0]
else:
# Redirect to default language
from pyramid.settings import aslist
import pyramid.httpexceptions as exc
raise exc.HTTPFound("/" + aslist(request.registry.settings['pyramid.default_locale_name'])[0] + "/")
newpath = request.path[1:]
newpath = newpath[newpath.find("/"):]
log.debug("new path: %s", newpath)
request.path = newpath
response = self.handler(request)
return response
Redirect par défaut la langue donne exception:
pyramid.httpexceptions.HTTPFound: The resource was found at
Essayer de définir le nouveau chemin donne:
AttributeError: can't set attribute
Si je commente sur request.path = newpath
et aller à /fi/
et /en/
je reçois la page 404 dans une langue correcte.