首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使Django支持IETF语言标记(xx-YY格式)?

如何使Django支持IETF语言标记(xx-YY格式)?
EN

Stack Overflow用户
提问于 2017-05-05 09:15:26
回答 2查看 430关注 0票数 1

我们有一个Django站点,支持多种语言。尝试添加对多语言的开放搜索插件支持。

OpenSearch.org规范使用IETF语言标签(xx-YY格式)。默认Django设置使用完全匹配。

  • 当前状态下,站点只支持xx格式,其他任何形式都返回E404。示例: http://website.domain/en/..

取决于用户配置,浏览器将语言参数插入为xx或xx-YY。它需要对两者都适用。

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

要支持的URL示例:

代码语言:javascript
复制
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',_(‘英语’)), 此示例将可用于自动选择的语言限制为德语和英语(以及任何子语言,如de-ch或en-us)。

以下是相关的代码部分:

settings.py

代码语言:javascript
复制
# 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

代码语言:javascript
复制
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'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-08 16:17:53

就我所能测试的情况而言,Django i18n确实支持将xx-YY降到xx然后默认(在我的例子中是en),但只支持Accept-Language用户代理头。对于URL语言开关,它不做同样的事情。

以下是我可以想出的解决方案:

代码语言:javascript
复制
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)),
)
  • 任何未被重定向到xx-YY的i18n模式处理的xx
  • 使用xx重定向到默认语言集的i18n模式没有处理的任何LANGUAGE_CODE
票数 2
EN

Stack Overflow用户

发布于 2017-05-05 10:19:54

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

代码语言:javascript
复制
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等。有关更多信息,请检查这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43801008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档