Это немного сложнее, чем просто бросить _()
в urls.py
. Вы сами определили причину: URL-адреса оцениваются один раз, когда запускается Django, и не для каждого запроса. Поэтому вам придется
а) поместите все возможные переводы в urls.py
или
б) реализовать маршрутизацию самостоятельно
A. Все в urls.py
url('hello', hello, name="hello_en"),
url('hallo', hello, name="hello_de"),
url('buenos_dias', hello, name="hello_es"),
Очевидно, что это не очень хорошее решение, но оно работает для небольших проектов.
B. Реализация маршрутизации
У этого есть свой собственный недостаток, особенно когда дело доходит до reverse()
. Тем не менее, это работает в принципе:
urls.py:
#...
url('(?<path>.+)', dispatcher),
#...
views.py:
def dispatcher(request, path):
if path == "hallo":
lang = "de"
elif path == "buenos_dias":
lang = "de"
else:
lang = "en"
Конечно, вы можете сделать поиск более интеллектуальным, но тогда вы должны сделать предположение:
# if request.session['language'] can be trusted:
def dispatcher(request, path):
list_of_views = ['contact', 'about', 'foo']
v = None
for view in list_of_views:
if _(view) == path:
v = view
break
if v is None:
# return 404 or the home page