昨天我已经对站点“春天音乐”进行了国际化,添加了英文翻译。
但当时后端是根据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 = TrueMIDDLEWARE_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 %}
Just How to Generate income –