【问题标题】:How to make Django support IETF language tag (xx-YY format)?如何让 Django 支持 IETF 语言标签(xx-YY 格式)?
【发布时间】:2017-10-03 16:52:29
【问题描述】:

我们有一个支持多种语言的 Django 站点。正在尝试添加对多语言的 opensearch 插件支持。

OpenSearch.org spec 使用IETF language tag (xx-YY format)。默认 Django 设置使用完全匹配。

  • 目前的状态,本站只支持 xx 形式,其他的都返回 E404。示例:

    http://website.domain/en/...
    

根据用户配置,浏览器插入语言参数为 xx 或 xx-YY。它需要对两者都有效

  • 如果xx-YY 不可用,网站应提供xx(母国语言)结果。
  • 如果xx 不可用,网站应提供en(英文)结果。

支持的 URL 示例:

http://website.domain/fr-YY/...

  fall-back to: http://website.domain/fr/...

http://website.domain/xx/...

  fall-back to: http://website.domain/en/...

来自 Mozilla 网站的示例 URL: https://support.mozilla.org/en-US/questions/949545

如何让Django支持IETF语言标签(xx-YY格式)?我什至正在寻找在不修改 django 上游代码的情况下实现这一点的提示。

更新:

好吧,官方文档清楚地表明它应该回退(例如:en-us to en),但我的案例引发了 404 错误。

来源:https://django.readthedocs.io/en/1.5.x/topics/i18n/translation.html

如果基础语言可用但指定的子语言不可用,则 Django 使用基础语言。例如,如果用户指定 de-at(奥地利德语)但 Django 只有 de 可用,则 Django 使用 de。

...

语言 = ( ('de', _('德语')), ('en', _('English')), )

此示例将可用于自动选择的语言限制为德语和英语(以及任何子语言,例如 de-ch 或 en-us)。

以下是相关代码部分:

settings.py

# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en'

LANGUAGES = (
  ( 'ar', "Arabic" ),
  ( 'en', "English" ),
  ( 'fr', "French" ),
  ( 'id', "Indonesian" ),
  ( 'ja', "Japanese"),
  ( 'ku', "Kurdish" ),
  #( 'ur', "Urdu" ),
  ( 'ms', "Malay" ),
  ( 'ml', "Malayalam" ),
  #( 'tr', "Turkish" ),
  ( 'es', "Spanish" ),
  ( 'pt', "Portuguese"),
  #( 'sv', "swedish" )
)

# These are languages not supported by Django core. We have to provide
# their info here so we can use them in our templates. This is mainly
# used in `wui.templatetags.languages`.
EXTRA_LANGUAGES = {
  'ku': {
    'code': 'ku',
    'name': 'Kurdish',
    'bidi': True,
    'name_local': 'Kurdish'
  },
  'ms': {
    'code': 'ms',
    'name': 'Malay',
    'bidi': False,
    'name_local': 'Malay'
  },
}


SITE_ID = 1

# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True

# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale
USE_L10N = True

urls.py

from django.conf.urls import patterns, include, url
from django.conf.urls.i18n import i18n_patterns

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()

urlpatterns = patterns( '',
  url( r'^jos2', 'wui.views.jos2' ),
  url(r'^r', 'wui.views.one_aya_page'),
  url(r'^$', 'wui.views.results'),
  # url( r'^admin/', include( admin.site.urls ) ),
)

# These URLs accept the language prefix.
urlpatterns += i18n_patterns('',
  url(r'^$', 'wui.views.results'),
  url(r'^(?P<unit>\w{3,15})/', 'wui.views.results'),
)

# 404 not found handler

handler404 = 'wui.views.custom_404'

【问题讨论】:

    标签: python django internationalization opensearch


    【解决方案1】:

    您需要在设置中指定支持的语言:

    LANGUAGES = (
        ('en', _('English'),
        ('en-gb', _('British English'),
        ('en-au', _('Australian English'),
        ('es', _('Spanish'),
        ('es-ar', _('Argentinian Spanish'),
    )
    

    从那里,使用i18n_urlpatterns。创建 PO 文件时,您需要运行 python manage.py makemessages -l en_GB 等。请查看 here 了解更多信息。

    【讨论】:

    • 但我不想为en-gb 创建单独的翻译,我只想显示en 而不是任何en-??。 Doc 说 django 应该解决这个问题,所以我的设置可能有问题。我将使用相关代码部分更新我的问题。
    • 如果你只想要en,那么只为en生成一个PO文件。代码将回退到对en_AUen_GB 都使用enpython manage.py makemessages -l en
    • slurms,对于任何en-?? lang,如en-us,我仍然会引发 404 错误,我预计 i18n 的 urls.py 设置中有错误。我在问题中添加了相关代码,请您看一下。
    • 您必须确保变体包含在LANGUAGES 中。看起来您只是在定义 en,而不是 en-gben-au。你总是可以制作自己的i18n_urlpatterns 版本,它做一些非常相似的事情,但总是激活非变体语言language_code.split('-')[0] 或其他东西。
    • 感谢您的帮助,Django 使用来自用户代理标头的 Accept-Language 的回退,而不是 URL 语言切换。我最终添加了自己的 URL 重定向。
    【解决方案2】:

    据我所知,Django i18n 确实支持将xx-YY 回退到xx 然后默认(在我的情况下为en),但仅适用于Accept-Language 用户代理标头。 URL 语言切换不一样。

    这是我能想到的解决方案:

    from django.views.generic import RedirectView
    from django.conf import settings
    ...
    urlpatterns += patterns('',
      url(r'^(?P<lang>[a-z]{2})-[A-Za-z]{2}/(?P<path>.*)$', RedirectView.as_view(url='/%(lang)s/%(path)s',query_string=True)),
      url(r'^[a-z]{2}/(?P<path>.*)$', RedirectView.as_view(url='/{}/%(path)s'.format(settings.LANGUAGE_CODE),query_string=True)),
    )
    
    • 任何未由 i18n 模式处理的 xx-YY 重定向到 xx
    • 任何未被 i18n 模式处理的 xx 都重定向到使用 LANGUAGE_CODE 设置的默认语言。

    【讨论】:

      猜你喜欢
      • 2011-02-27
      • 2019-07-16
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      • 2014-07-05
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      相关资源
      最近更新 更多