不要国际化/翻译 URL

Posted

技术标签:

【中文标题】不要国际化/翻译 URL【英文标题】:Do not internationalize/translate URLs 【发布时间】:2017-03-24 10:47:09 【问题描述】:

问题

我目前正在尝试从 Django 1.9.8 升级到 Django 1.10.3。但是目前我的测试失败了,因为出于某种原因,当我reverse()它们时,Django 试图翻译/国际化我的 URL。

在国际化方面我没有做任何改变,我非常想关闭这个“功能”。它不仅没有通过很多测试,而且还有一些项目必须静态引用该网站的 URL。这意味着该网站上的 URL 不允许更改(否则我必须为 Django 提供的每个翻译编辑它们,这将是一个真正的痛苦)。


错误

我在测试中遇到的实际错误如下:

Traceback (most recent call last):
  File "/tests/unit/views/test_index.py", line 14, in setUp
    self.url = reverse('indexpage')
  File "/local/lib/python2.7/site-packages/django/urls/base.py", line 91, in reverse
    return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)))
  File "/local/lib/python2.7/site-packages/django/urls/resolvers.py", line 346, in _reverse_with_prefix
    possibilities = self.reverse_dict.getlist(lookup_view)
  File "/local/lib/python2.7/site-packages/django/urls/resolvers.py", line 243, in reverse_dict
    return self._reverse_dict[language_code]
KeyError: 'nl-nl'

很明显 Django 正在尝试使用此项目设置中提供的语言代码来做一些事情。


我尝试了什么

我尝试将USE_I18N 设置为False。我也试过这个USE_L10N。我还尝试删除我的设置中指定的LANGUAGE_CODE,但随后引发的错误是指en-us 语言代码而不是nl-nl 语言代码。我还尝试安装LocaleMiddleware,看看我是否至少可以让错误停止显示,但不幸的是这也不起作用。


问题

如何在 Django 中关闭 URL 内部化/翻译。或者如果这是不可能的,有什么好的选择?

提前致谢。

【问题讨论】:

您可以从 settings.py 本身停用国际化:USE_I18N = True //将其设置为 False @VijeshVenugopal 我已经事先尝试过了,但这不起作用。我仍然收到我在回答中指定的错误。 这与翻译无关,但似乎与#26888有关。你能显示你的网址和你的test_index.py吗? 【参考方案1】:

这可能是一个红鲱鱼(由不同的错误引起)。在此错误消失之前,我必须处理在加载 urls.py 文件时引发的几个不同异常。尝试放入 django shell 并运行以下命令:

from django.urls import reverse
reverse('indexpage')

您应该会看到导致问题的真正错误。解决问题并重复,直到没有更多异常为止。

【讨论】:

美丽。谢谢。一定会喜欢这些红鲱鱼。 请注意,我发现实际错误通常位于所有错误的首位。因此,向上滚动到最初的几个实际上可能会给你一个关于哪里出了问题的迹象。这可能会为您节省一些在 CI 位置等方面的麻烦。【参考方案2】:

在引入错误的更改上使用reverse_lazy 而不是reverse

看起来你正在尝试在 django 注册之前使用reverse 获取网址。

http://www.boxtricks.com/keyerror-en-us-when-doing-a-reverse-lookup-in-urls-py/

【讨论】:

【参考方案3】:

你需要升旗

USE_I18N = False

按照 Vijesh Venugopal 的建议,还要确保您的网址包含在以下部分中:-

urlpatterns += [
    url("^", include("your_app.urls")),
]

不要将它们包括在这些下面

urlpatterns = i18n_patterns(
    # Change the admin prefix here to use an alternate URL for the
    # admin interface, which would be marginally more secure.
    url("^admin/", include(admin.site.urls)),
)

【讨论】:

谢谢,但不幸的是这不起作用(已经事先尝试过)。当我关闭它时,它仍然尝试使用语言代码解析 URL。它仍然不断抛出我在问题中指定的错误。

以上是关于不要国际化/翻译 URL的主要内容,如果未能解决你的问题,请参考以下文章

Qt 国际化翻译

odoo国际化翻译

国际化文本翻译数据利用nodeJS转换成JSON文件

javascript 角度国际化翻译

Flowable入门系列文章89 - 国际化

Qt 国际化翻译,函数外部字符串Map 翻译(QT_TRANSLATE_NOOP)