在Django的i18n和l10n有不同的看法

时间:2015-04-23 01:41:37

标签: python django localization django-i18n

我正在尝试将我的应用程序本地化以实现国际化,但是在选择语言后,我在为视图开发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.
)

所以这“在本地工作”。我转到localhost:8080/es/并查看我的西班牙语页面。但是,当我点击我的应用程序按钮导航到Downloads页面时,我会转到英文的localhost:8080/downloads。如果我输入localhost:8080/es/downloads,我会收到一个不合格的网址错误。

如何让这更加自然地本地化和国际化?如果缺少任何信息,请告诉我。我会加上它。

我正在使用Django 1.7.4。

谢谢, erip

修改

从家到下载,我有一些看起来像这样的HTML ......

  <a class="navbar-brand" href="/"> {% trans "Home"%}</a>
  <a class="navbar-brand" href="/downloads/"> {% trans "Downloads"%}</a>

1 个答案:

答案 0 :(得分:1)

您是否已将django.middleware.locale.LocaleMiddleware添加到MIDDLEWARE_CLASSESdocs)?

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.
)

更新:在模板中构建网址

在网址格式中,为name模式添加downloads属性:

urlpatterns = i18n_patterns('',
    # ...
    url(r'^downloads/$', 'myApp.views.downloads', name='downloads'),
    # ...
)

在模板中,使用url标记解析链接:

<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/'