URL模式中的国际化
2018-03-31 本文已影响64人
大爷的二舅
Django提供了两种机制来使URL模式国际化:
-
将语言前缀添加到URL模式的根目录,以使LocaleMiddleware可以从请求的URL检测要激活的语言。
-
通过django.utils.translation.ugettext_lazy()函数使URL模式本身可以翻译。
使用这些功能中的任何一个都需要为每个请求设置活动语言; 换句话说,您需要在MIDDLEWARE_CLASSES设置中使用django.middleware.locale.LocaleMiddleware。
URL模式中的语言前缀
这个函数可以用在你的根URLconf中,并且Django会自动将当前活动的语言代码加入i18n_patterns()中定义的所有url模式中。 示例网址格式:
from django.conf.urls import include, url
from django.conf.urls.i18n import i18n_patterns
from about import views as about_views
from news import views as news_views
from sitemap.views import sitemap
urlpatterns = [
url(r'^sitemap\.xml$', sitemap, name='sitemap_xml'),
]
news_patterns = [
url(r'^$', news_views.index, name='index'),
url(r'^category/(?P<slug>[\w-]+)/$',
news_views.category,
name='category'),
url(r'^(?P<slug>[\w-]+)/$', news_views.details, name='detail'),
]
urlpatterns += i18n_patterns(
url(r'^about/$', about_views.main, name='about'),
url(r'^news/', include(news_patterns, namespace='news')),
)
定义这些URL模式后,Django会自动将语言前缀添加到由i18n_patterns函数添加的URL模式。 例:
>>> from django.core.urlresolvers import reverse
>>> from django.utils.translation import activate
>>> activate('en')
>>> reverse('sitemap_xml')
'/sitemap.xml'
>>> reverse('news:index')
'/en/news/'
>>> activate('nl')
>>> reverse('news:detail', kwargs={'slug': 'news-slug'})
'/nl/news/news-slug/'
i18n_patterns()仅在您的根URLconf中允许。 在包含的URLconf中使用它将引发错误配置的异常。
翻译URL模式
URL模式也可以使用ugettext_lazy()函数标记为可翻译的。 例:
from django.conf.urls import include, url
from django.conf.urls.i18n import i18n_patterns
from django.utils.translation import ugettext_lazy as _
from about import views as about_views
from news import views as news_views
from sitemaps.views import sitemap
urlpatterns = [
url(r'^sitemap\.xml$', sitemap, name='sitemap_xml'),
]
news_patterns = [
url(r'^$', news_views.index, name='index'),
url(_(r'^category/(?P<slug>[\w-]+)/$'),
news_views.category,
name='category'),
url(r'^(?P<slug>[\w-]+)/$', news_views.details, name='detail'),
]
urlpatterns += i18n_patterns(
url(_(r'^about/$'), about_views.main, name='about'),
url(_(r'^news/'), include(news_patterns, namespace='news')),
)
创建翻译后,reverse()函数将以活动语言返回URL。 例:
from django.core.urlresolvers import reverse
from django.utils.translation import activate
>>> activate('en')
>>> reverse('news:category', kwargs={'slug': 'recent'})
'/en/news/category/recent/'
>>> activate('nl')
>>> reverse('news:category', kwargs={'slug': 'recent'})
'/nl/nieuws/categorie/recent/'
在大多数情况下,最好仅在带有语言代码前缀的模式块(使用i18n_patterns())内使用翻译的URL,以避免粗心翻译的URL导致与未翻译的URL模式冲突的可能性。
在模板中反转
如果在模板中本地化的网址被颠倒过来,它们将始终使用当前的语言。 要链接到另一种语言的网址,请使用语言模板标签。 它在封闭的模板部分中启用了给定的语言:
{% load i18n %}
{% get_available_languages as languages %}
{% trans "View this category in:" %}
{% for lang_code, lang_name in languages %}
{% language lang_code %}
<a href="{% url 'category' slug=category.slug %}">{{
lang_name }}</a>
{% endlanguage %}
{% endfor %}
The `language` tag expects the language code as the only argument.