Ich habe gerade das grundlegende Pyramid "Hallo Welt" Vorlage Projekt erstellt und i18n Unterstützung hinzugefügt. Ich benutze Python 3.5 und Chameleon Vorlagen (.pt
) mit gettext.Wie fügt man der URL in Pyramid Sprachencode hinzu?
Ich kann derzeit die Sprache über die Datei .ini
ändern.
Jetzt möchte ich es dynamisch machen und den Sprachcode von der URL lesen. Daher werden URLs in /<language code>/page/{possible params}
geändert, also zum Beispiel /fi/home
. Ich möchte {language}
nicht zu vorhandenen Routen/Sichten hinzufügen, so dass der Sprachencode-Parameter ausgeblendet wird und Sichten nichts davon wissen, außer wenn Links zu anderen Seiten in Vorlagen/Ansichten erstellt werden.
EDIT: Hier ist mein Versuch tweens von Mikko Ohtamaa erwähnt werden:
hinzugefügt __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 Sprache auf die Standard gibt Ausnahme:
Der Versuch, neue Wege zu setzen gibt:
AttributeError: can't set attribute
Wenn ich request.path = newpath
Kommentar aus und gehen Sie zu /fi/
und /en/
ich in der richtigen Sprache 404-Seite. Hier