Python

URL模式中的国际化

2018-03-31  本文已影响64人  大爷的二舅

Django提供了两种机制来使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.
上一篇下一篇

猜你喜欢

热点阅读