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/)
,它会正确显示语言,但如果我想从那里改为使用其他语言,那么我就不会让它这样做。
它只是重新加载当前页面。
有任何建议如何实现这一目标?
答案 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反转功能。
也许更好的选择是编写中间件然后自定义标签。
无论如何,现在它的确有效,但我欢迎任何人拥有或找到更好的解决方案。
对于这个问题,没有开箱即用的解决方案似乎很奇怪。
但也许我错了,只是找不到它。