【问题标题】:How to structure a multilanguage Website in Django 1.6如何在 Django 1.6 中构建多语言网站
【发布时间】:2013-11-20 12:58:03
【问题描述】:

我正在用 Django 编写一个简单的多语言网站,但我在切换语言方面有点挣扎。我认为为每种语言设置不同的 url 会很好(例如 /en/contact/ 用于英语站点,/de/kontakt/ 用于德语站点)。也许这不仅看起来更好,而且在 SEO 环境中也有意义。

所以我在 urls.py 中有:

urlpatterns = pattern(‘’,
    url(r’^de/kontakt/$’, mysite.views.DeKontaktView, name=‘kontakt’,),
    url(r’^en/contact/$’, mysite.views.EnContactView, name=‘contact’,),
)

现在我想在每个页面(在基本模板中)都有链接,以便在德语和英语之间切换语言。在 Django 文档中,我找到了“set_language 重定向视图”(https://docs.djangoproject.com/en/1.6/topics/i18n/translation/#the-set-language-redirect-view)。

我的问题是在切换语言时,它应该在哪里以及如何告诉视图它应该重定向到哪里。我并不总是想重定向到我网站的首页,而是重定向到另一种语言的相应页面 - 它具有完全不同的 url - 不仅是 url 中的不同语言前缀。

由于“set_language 重定向视图”似乎使用引用者,除非帖子数据中有下一个参数,所以我的第一个想法是这样的:

views.py:

def EnContactView(request):
    …
    if request.LANGUAGE_CODE == ‘en’:
        return render_to_response(‘en/contact.html’), context)
    else:
        return redirect(‘/de/kontakt/‘)

def DeKontaktView(request):
    …
    if request.LANGUAGE_CODE == ‘de’:
        return render_to_response(‘de/kontakt.html’), context)
    else:
        return redirect(‘/en/contact/‘)

但我认为这可能不是一个好的解决方案,因为这也会根据浏览器语言进行重定向。例如:如果浏览器语言为“en”的人直接访问我们的德语网址之一,例如通过谷歌。由于会话中既没有 cookie “en”也没有语言选择,因此访问者将被重定向到英文 url——这不是有意的。

那么,针对这些情况的最佳做法是什么?总结一下:我有完全不同的语言网址——不仅仅是网址中的不同语言前缀。对于每种语言,我都有一个模板(目录 templates/en/ 和 templates/de/)。

  • 如何在不同语言的对应页面之间切换?
  • 顺便问一下:是否可以不使用表单作为语言切换器,而是使用简单的链接“de”和“en”?

如果有人可以帮助我,那就太好了。对于 django 菜鸟来说,“语言的东西”是相当令人困惑的。

【问题讨论】:

标签: python django


【解决方案1】:

https://docs.djangoproject.com/en/1.6/topics/i18n/translation/#translating-url-patterns

#setting.py
gettext = lambda s: s

LANGUAGES = (
    ('en', gettext('English')),
    ('de', gettext('De')),

)

#url
from django.http import Http404
from django.conf.urls.i18n import i18n_patterns

urlpatterns += i18n_patterns('',
    url(r'^contact/$', mysite.views.ContactView, name='contact'),
)

#view
def ContactView(request)
    if request.LANGUAGE_CODE == 'de':
        return render_to_response('de/kontakt.html')
    if request.LANGUAGE_CODE == 'en':
        return render_to_response('en/contact.html')
    raise Http404

【讨论】:

    【解决方案2】:

    django.conf.urls.i18n.i18n_patterns 将处理语言前缀部分,django.views.i18n.set_language (大部分)语言切换部分,您可以使用django.utils.translation.ugettext_lazy 来翻译您的 url 模式,就像任何其他可翻译的“静态”文本一样。您仍然必须以一种或另一种方式处理内容的翻译(有很多或多或少的可插拔应用程序为 Django 模型解决了这个问题),但这部分实际上取决于您的应用程序的域和逻辑。

    【讨论】:

      【解决方案3】:

      对于那些有翻译问题或正在创建多语言网站的人来说,这是一个更全面的解决方案。

      在 settings.py 中……

      添加到 MIDDLEWEAR_CLASSES,语言环境,它可以根据请求启用语言选择:

      'django.middleware.locale.LocaleMiddleware',
      

      添加 LOCALE_PATHS,这是您的翻译文件将被存储的地方,同时启用 i18N: USE_I18N = 真 本地路径 = ( os.path.join(PROJECT_PATH, 'locale/'), )

      设置您要将网站翻译成的语言:

      ugettext = lambda s: s
      LANGUAGES = (
          ('en', ugettext('English')),
          ('fr', ugettext('French')),
          ('pl', ugettext('Polish')),
      )
      

      添加 i18n 模板上下文处理器,请求现在将包括 LANGUAGES 和 LANGUAGE_CODE:

      TEMPLATE_CONTEXT_PROCESSORS = (
          'django.contrib.auth.context_processors.auth',
          'django.core.context_processors.debug',
          'django.core.context_processors.i18n', # this one
          'django.core.context_processors.request',
          'django.core.context_processors.static',
          'django.contrib.messages.context_processors.messages',  
      )
      

      嵌套,在 urls.py 中:

      在 url_patterns 中,添加以下内容,将启用设置语言重定向视图:

      url(r'^i18n/', include('django.conf.urls.i18n')),
      

      有关更多信息,请参阅 Translations 中的杂项。

      添加以下导入,并用 i18n_patterns 封装要翻译的 url。这是我的样子:

      from django.conf.urls.i18n import i18n_patterns
      from django.utils.translation import ugettext_lazy as _
      
      urlpatterns = patterns('',
          url(r'^admin/', include(admin.site.urls)),
          url(r'^i18n/', include('django.conf.urls.i18n')),
      )
      
      urlpatterns += i18n_patterns('',
          (_(r'^dual-lang/'), include('duallang.urls')),
          (r'^', include('home.urls')),
      )
      

      注意:您也可以将管理员网址放入 i18n_patterns。

      现在任何你使用文本并想要转换它的地方,导入lazytext并用它包装每个字符串,就像这样_('text'),你甚至可以去你的其他urls.py文件并像这样进行url翻译:

      url(_(r'^dual_language/$'), landing, name='duallang_landing'),
      

      您可以将要翻译的文本包装在其他文件中,例如 models.py、views.py 等。这是一个示例模型字段,其中包含 label 和 help_text 的翻译:

      name = models.CharField(_('name'), max_length=255, unique=True, help_text=_("Name of the FAQ Topic"))
      

      在您的 html 模板中...

      现在您可以进入您的模板并加载 i18n 模板标签,并对您要翻译的静态内容使用 trans 和 transblock。这是一个例子:

      {% load i18n %}
      
      {% trans "This is a translation" %}<br><br>
      {% blocktrans with book_t='book title'|title author_t='an author'|title %}
      This is {{ book_t }} by {{ author_t }}. Block trans is powerful!
      {% endblocktrans %}
      

      现在为您的每个语言环境运行一个 makemessages:

      ./manage.py makemessages -l pl
      

      现在剩下的就是进入您的 /locales 文件夹,并编辑每个 .po 文件。填写每个 msgstr 的数据。这是一个这样的例子:

      msgid "English"
      msgstr "Angielski"
      

      将有意义的留空以选择默认语言。

      最后编译消息:

      ./manage.py compilemessages
      

      翻译还有很多东西要学,internationalization 与这个主题密切相关,所以也请查看文档。我还建议查看一些可用于 Django 的国际化包,例如 django-rosettadjango-linguo。它们帮助翻译模型内容,django-rosetta 不会在您的数据库中为此创建新条目,而 django-linguo 会。

      如果你遵循这个,你应该有一个好的开始。我相信这是让您的网站以多种语言运行的最标准化方式。干杯!

      【讨论】:

        猜你喜欢
        • 2014-02-26
        • 1970-01-01
        • 2021-05-22
        • 1970-01-01
        • 1970-01-01
        • 2018-12-13
        • 2016-07-31
        • 2012-03-23
        相关资源
        最近更新 更多