Django:如何设置和更改它正确反映网址的语言?

时间:2016-04-28 09:01:59

标签: python django django-urls django-i18n

settings.py:
INSTALLED_APPS = [
    ...,
    'modeltranslation',
]
TIME_ZONE = 'Europe/Belgrade'
USE_I18N = True
USE_L10N = True
USE_TZ = True
LANGUAGES = (
    ('en-us', _('English')),
    ('hu', _('Hungarian')),
    ('sr-latn', _('Serbian')),
)
LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'),
    os.path.join(BASE_DIR, 'books', 'locale'),
)

urls.py:
urlpatterns = [
    url(r'^i18n/', include('django.conf.urls.i18n')),
    ]
urlpatterns += i18n_patterns(
    url(_r('^books/'), include('books.urls', namespace='books'))
    )

我的默认语言是英语。 我的模型为每种语言都有3个标题字段。 这就是模型翻译包的工作原理,即:

(title_en,title_hu,title_sr_latn)

由于我使用slug字段来表示url中模型实例的url表示,因此我的模型类中每种语言都有3个slug文件。

我没有看到任何意见,例如我的网址应该像匈牙利人一样:

127.0.0.1/hu/konyvek/learn-django

我希望我的网址看起来像这样:

英文网址(我不想使用默认语言的语言前缀!):

127.0.0.1/books/the-lord-of-the-rings

匈牙利网址

127.0.0.1/hu/konyvek/a-gyuruk-ura

塞尔维亚网址(不幸的是,塞尔维亚语言前缀看起来非常丑陋但这是另一个主题):

127.0.0.1/sr-latn/knjige/gospodar-prstenova

到目前为止我找不到任何可以解决这个问题的方法。 很明显,我不能在我的语言切换中使用其中任何一个' next'表单元素在模板中的值: {{ request.path }}{{ request.get_absolute_path|slice:'3:' }}

所以我排除了下一个'元素暂时。 当我切换语言时,在我的头版上一切正常。 如果我转到书籍页面,例如(/hu/konyvek/),它会正确显示语言,但如果我想从那里改为使用其他语言,那么我就不会让它这样做。 它只是重新加载当前页面。

有任何建议如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

目前,我无法找到解决此问题的优雅方法。 我现在有一个丑陋的解决方案暂时只能在这个项目上工作,因为它是硬编码的。

我在https://djangosnippets.org/snippets/2875/

找到了此代码
@register.simple_tag(takes_context=True)
def change_lang(context, lang=None, *args, **kwargs):
    path = context['request'].path
    url_parts = resolve( path )

    cur_language = get_language()

    try:
        activate(lang)
        url = reverse( url_parts.view_name, kwargs=url_parts.kwargs )
    finally:
        activate(cur_language)


    return "%s" % url

但这个解决方案只能解决我问题的一半。 它翻译了这本书/'正确的部分网址,但部分e.i. '该位主的最型圈/'还是老了,所以。 django无法解析url路径,因为语言被切换,url的第一级被更改但urlconf中没有这样的东西,例如e.i. ' konyvek /所述-主的最型圈/'

我稍微改了一下代码:

@register.simple_tag(takes_context=True)
def change_lang(context, lang=None, *args, **kwargs):

    path = context['request'].path
    url_parts = resolve(path)

    cur_language = get_language()

    try:
        translation.activate(lang)
        if 'book' in context:
            slug = context['book'].slug
            url = reverse(url_parts.view_name, kwargs={'slug': slug})
        else:
            url = reverse(url_parts.view_name, kwargs=url_parts.kwargs)
    finally:
        translation.activate(cur_language)

    return '%s' % url

"幸运的是",上下文列表中有一个名为' book'的对象实例,因此在激活新语言然后将其转发给kwargs后,我可以用它来选择合适的Slugfield反转功能。

也许更好的选择是编写中间件然后自定义标签。

无论如何,现在它的确有效,但我欢迎任何人拥有或找到更好的解决方案。

对于这个问题,没有开箱即用的解决方案似乎很奇怪。

但也许我错了,只是找不到它。