Django: перевод шаблона URL с использованием gettext - PullRequest
4 голосов
/ 07 марта 2011

В некоторых приложениях Django я сталкивался с шаблонами URL с gettext, такими как:

from django.utils.translation import ugettext as _

urlpatterns = patterns('',
    ...
    url(r'^%s$' % _('about/'), about, name='about'),
    ...
)

Сначала, казалось бы, неплохо было бы интернационализировать URL-адреса одинаковым образом с остальной частью проекта, ноУ меня есть сомнения.

AFAIK, шаблоны URL загружаются при запуске приложения.Поэтому я подозреваю, что они будут построены в соответствии с языковыми предпочтениями пользователя, который делает первый запрос к приложению.Это может стать еще более непредсказуемым, когда потоки тоже находятся в игре.

Этот подход может быть разумным для случаев, когда установка будет на одном языке, но могут быть и другие установки на других языках, например, на форумах.

Как вы думаете, это проблема или просто мое воображение?Можно ли использовать этот подход для многоязычных сайтов?Может ли ugettext_lazy избежать этой проблемы?

Ответы [ 4 ]

3 голосов
/ 01 марта 2014

Прочитайте документы django: https://docs.djangoproject.com/en/dev/topics/i18n/translation/#url-internationalization

По сути, вы можете использовать ugettext_lazy для перевода ваших шаблонов, и это будет работать, если для каждого запроса установлен язык.Для этого вам следует использовать LocaleMiddleware.https://docs.djangoproject.com/en/dev/ref/middleware/#django.middleware.locale.LocaleMiddleware

1 голос
/ 07 марта 2011

Этот подход не будет работать.Ваш перевод происходит при загрузке приложения.Это означает, что ваши шаблоны URL будут на одном языке, языке по умолчанию вашего приложения.

Переводы работают только тогда, когда контекст, из которого они вызваны, имеет доступ к языковым настройкам пользователя.

Чтобы ваши URL-адреса были многоязычными, вам нужно использовать некоторые определения URL-адресов во время выполнения.Они будут загружены на основе текущего языка пользователя.

0 голосов
/ 24 июля 2017

Вы можете сделать это следующим образом:

import six
from django.utils.functional import lazy


def lazy_url_pattern(pattern):
    return lazy(pattern, six.text_type)()

А затем в вашем диспетчере:

urlpatterns = [
    url(lazy_url_pattern(lambda: r'^{n}/$'.format(n=ugettext_lazy(u'foo'))), MyView.as_view(), name='...'),

Но это все равно подвержено ошибкам ....

Пол

0 голосов
/ 26 октября 2012

Вы правы насчет ugettext_lazy, который оценивается сразу при конкатенации строк.

Sth, как это работает: url (_ (r '^ contact /'), include ('contact.urls')),

Но вы должны переводить шаблоны, что может быть ошибочным.

...