Django 中的 i18n 和 l10n 具有不同的视图
i18n and l10n in Django with different views
我正尝试将我的应用程序本地化以实现国际化,但在选择语言后为视图开发 URL 时遇到问题。
我的 settings.py
中有这些相关条目
...
USE_I18N = True
USE_L10N = True
LOCALE_PATHS = (
os.path.join(BASE_DIR, 'locale'),
)
from django.utils.translation import ugettext_lazy as _
LANGUAGES = (
('en', _('English')),
('es', _('Spanish')),
('zh', _('Chinese')),
)
...
我的 urls.py
看起来像这样...
# -*- coding: utf-8 -*-
from django.conf.urls import include, url, patterns
from django.contrib import admin
from django.conf import settings
from django.conf.urls.i18n import i18n_patterns
urlpatterns = patterns('',
url(r'^$', 'myApp.views.home', name='home'),
url(r'^admin/', include(admin.site.urls)),
url(r'^downloads/$', 'myApp.views.downloads'),
# etc. etc.
)
urlpatterns += i18n_patterns('',
url(r'^$', 'myApp.views.home', name='home'),
url(r'^admin/', include(admin.site.urls)),
url(r'^downloads/$', 'myApp.views.downloads'),
# etc. etc.
)
所以这个 "works" 在本地。我转到 localhost:8080/es/
并查看我的西班牙语页面。但是,当我单击我的应用程序按钮导航到 Downloads
页面时,我转到了英文的 localhost:8080/downloads
。如果我输入 localhost:8080/es/downloads
,我会收到未找到的 URL 错误。
如何使它更自然地本地化和国际化?如果缺少任何信息,请告诉我。我来补充。
我正在使用 Django 1.7.4。
谢谢,
埃里普
编辑
从家里到下载,我有一些 HTML 看起来像这样...
<a class="navbar-brand" href="/"> {% trans "Home"%}</a>
<a class="navbar-brand" href="/downloads/"> {% trans "Downloads"%}</a>
您是否已将 django.middleware.locale.LocaleMiddleware
添加到您的 MIDDLEWARE_CLASSES
(docs)?
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
)
另外,你不应该定义你的模式两次。您希望由 I18N 处理的所有模式只能在 i18n_patterns(...)
中定义。所以如果它们相同,这个块就足够了:
# -*- coding: utf-8 -*-
from django.conf.urls import include, url, patterns
from django.contrib import admin
from django.conf import settings
from django.conf.urls.i18n import i18n_patterns
urlpatterns = i18n_patterns('',
url(r'^$', 'myApp.views.home', name='home'),
url(r'^admin/', include(admin.site.urls)),
url(r'^downloads/$', 'myApp.views.downloads'),
# etc. etc.
)
更新:在模板中构建 URL
在 url 模式中向 downloads
模式添加一个 name
属性:
urlpatterns = i18n_patterns('',
# ...
url(r'^downloads/$', 'myApp.views.downloads', name='downloads'),
# ...
)
在模板中,用 url
标签解析 link:
<a class="navbar-brand" href="{% url 'home' %}">{% trans "Home"%}</a>
<a class="navbar-brand" href="{% url 'downloads' %}">{% trans "Downloads"%}</a>
这样 Django 构建 url 尊重当前语言。
解析正确后如何调试
为了调试 Django 当前将 URL 解析为什么,您可以在 shell.
中尝试以下操作
$ ./manage.py shell
>>> from django.core.urlresolvers import reverse
>>> from django.utils.translation import activate
>>> activate('en')
>>> reverse('downloads')
'/en/downloads'
>>> activate('es')
>>> reverse('downloads')
'/es/downloads/'
我正尝试将我的应用程序本地化以实现国际化,但在选择语言后为视图开发 URL 时遇到问题。
我的 settings.py
...
USE_I18N = True
USE_L10N = True
LOCALE_PATHS = (
os.path.join(BASE_DIR, 'locale'),
)
from django.utils.translation import ugettext_lazy as _
LANGUAGES = (
('en', _('English')),
('es', _('Spanish')),
('zh', _('Chinese')),
)
...
我的 urls.py
看起来像这样...
# -*- coding: utf-8 -*-
from django.conf.urls import include, url, patterns
from django.contrib import admin
from django.conf import settings
from django.conf.urls.i18n import i18n_patterns
urlpatterns = patterns('',
url(r'^$', 'myApp.views.home', name='home'),
url(r'^admin/', include(admin.site.urls)),
url(r'^downloads/$', 'myApp.views.downloads'),
# etc. etc.
)
urlpatterns += i18n_patterns('',
url(r'^$', 'myApp.views.home', name='home'),
url(r'^admin/', include(admin.site.urls)),
url(r'^downloads/$', 'myApp.views.downloads'),
# etc. etc.
)
所以这个 "works" 在本地。我转到 localhost:8080/es/
并查看我的西班牙语页面。但是,当我单击我的应用程序按钮导航到 Downloads
页面时,我转到了英文的 localhost:8080/downloads
。如果我输入 localhost:8080/es/downloads
,我会收到未找到的 URL 错误。
如何使它更自然地本地化和国际化?如果缺少任何信息,请告诉我。我来补充。
我正在使用 Django 1.7.4。
谢谢, 埃里普
编辑
从家里到下载,我有一些 HTML 看起来像这样...
<a class="navbar-brand" href="/"> {% trans "Home"%}</a>
<a class="navbar-brand" href="/downloads/"> {% trans "Downloads"%}</a>
您是否已将 django.middleware.locale.LocaleMiddleware
添加到您的 MIDDLEWARE_CLASSES
(docs)?
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
)
另外,你不应该定义你的模式两次。您希望由 I18N 处理的所有模式只能在 i18n_patterns(...)
中定义。所以如果它们相同,这个块就足够了:
# -*- coding: utf-8 -*-
from django.conf.urls import include, url, patterns
from django.contrib import admin
from django.conf import settings
from django.conf.urls.i18n import i18n_patterns
urlpatterns = i18n_patterns('',
url(r'^$', 'myApp.views.home', name='home'),
url(r'^admin/', include(admin.site.urls)),
url(r'^downloads/$', 'myApp.views.downloads'),
# etc. etc.
)
更新:在模板中构建 URL
在 url 模式中向 downloads
模式添加一个 name
属性:
urlpatterns = i18n_patterns('',
# ...
url(r'^downloads/$', 'myApp.views.downloads', name='downloads'),
# ...
)
在模板中,用 url
标签解析 link:
<a class="navbar-brand" href="{% url 'home' %}">{% trans "Home"%}</a>
<a class="navbar-brand" href="{% url 'downloads' %}">{% trans "Downloads"%}</a>
这样 Django 构建 url 尊重当前语言。
解析正确后如何调试
为了调试 Django 当前将 URL 解析为什么,您可以在 shell.
中尝试以下操作$ ./manage.py shell
>>> from django.core.urlresolvers import reverse
>>> from django.utils.translation import activate
>>> activate('en')
>>> reverse('downloads')
'/en/downloads'
>>> activate('es')
>>> reverse('downloads')
'/es/downloads/'