Django i18n多语言的URL差异化解决方案

昨天我已经对站点“春天音乐”进行了国际化,添加了英文翻译。

但当时后端是根据session和cookie记录用户的语言设定,

这造成的问题是,同一URL,存在一个中文版、一个英文版。

搜索引擎的爬虫进入后,大多只能抓取并保存对应的中文版(默认语言),而遗失了对应的英文版。

因此,必须对中文版和英文版进行URL差异化。有两种选择:

1. 增加一个参数,类似 http://www.fachun.net/?lang=en

2. 增加一个前缀,类似 http://www.fachun.net/en/

因为第二种更好看,我选择了第二种。整个实现过程较繁琐,下面提供我采用的解决方案。

1. 安装django-localeurl

我安装的版本是2.0.1: https://pypi.python.org/pypi/django-localeurl

该程序包的作用,是允许你在URL中设定语言,而不需要修改原有的URL配置(urls.py中的设置)。

安装完成后,编辑settings.py文件配置:

LANGUAGE_CODE = ‘zh-CN’
LANGUAGES = {
(‘zh-cn’, ‘中文’),
(‘en’, ‘English’),
}
PREFIX_DEFAULT_LOCALE = False
LOCALEURL_USE_ACCEPT_LANGUAGE = True

MIDDLEWARE_CLASSES = (
#’django.middleware.cache.CacheMiddleware’,
‘django.contrib.sessions.middleware.SessionMiddleware’,
‘localeurl.middleware.LocaleURLMiddleware’,
‘django.middleware.common.CommonMiddleware’,

#’django.middleware.locale.LocaleMiddleware’,

)

INSTALLED_APPS = (

..

‘localeurl’,

)

几点说明:

PREFIX_DEFAULT_LOCALE参数代表默认语言是否需要添加前缀,我这里是不要的,

如果设置成True,那么用户打开网站首页http://www.fachun.net/,会自动跳转到http://www.fachun.net/zh-cn/

显然,我不需要让URL变得这么难看。

LOCALEURL_USE_ACCEPT_LANGUAGE参数是指是否对浏览器header中发出的Accept-Language字段敏感,

什么意思呢,外国用户的浏览器,默认语言英文是排在前面的,网站会自动地呈现显示英文内容。

一般,使用非中文版的浏览器访问,自动就会跳转到英文内容了。

MIDDLEWARE_CLASSES的设置必须注意顺序,’localeurl.middleware.LocaleURLMiddleware’应该位于’django.middleware.common.CommonMiddleware’之前,

django内置的LocaleMiddleware中间件是必须注释掉的。

关于安装的问题,可以参考: http://django-localeurl.readthedocs.org/en/v2.0.1/setup.html

2. 静态URL的处理工作

静态URL的处理工作是最繁琐的。

比如原先,在菜单中你有一个超链接,类似:

<a href=”/”>首页</a>

django和django-localeurl都不会自动去翻译这个超链接,添加前缀的。

这意味着,模板中所有的静态链接都需要重新处理!

我在views.py中写了一个单独的context processer,用来向模板中引入一个lang_prefix变量。

def language_proc(request):
    from django.utils.translation import get_language
    lang_prefix = get_language().lower()
    if lang_prefix != 'zh-cn':
        lang_prefix += '/'
    else:
        lang_prefix = ''
    return {'lang_prefix': lang_prefix}

这个函数的作用是,当用户选择了中文时,变量为空。

而如果选择了其他语言,比如en,则变量的值是前缀en/

完成了上面的处理器之后,还必须在每个视图函数中添加该处理器。(需要多语言支持的视图函数都加上)。

每个视图函数都需要使用到一个RequestContext,比如我的首页index函数就是:

def index(request):
    albums = ...
    albums = list(albums)
    return render_to_response('index.html', {'albums': albums},
                              context_instance = RequestContext(request, processors=[language_proc]))

接着是修改模板文件,在所有的静态URL前面增加变量{{lang_prefix}}。上面的例子中,超链接将变为:

<a href=”/{{lang_prefix}}”>首页</a>

3. 语言切换功能

参考我现有模板中的代码:

{% load localeurl_tags %}
{% load i18n %}
{% get_current_language as LANGUAGE_CODE %}

《Django i18n多语言的URL差异化解决方案》上有1条评论

发表回复

您的电子邮箱地址不会被公开。