如何在Google App Engine上本地化应用?
在Google App Engine上,有哪些方法可以让应用程序支持多种语言?使用Webapp、Django、web2py或其他框架时,应该怎么做呢?
1. 可读的URL和实体键名
可读的URL对用户体验和搜索引擎优化都很重要(Stack Overflow就是一个很好的例子)。在Google App Engine上,建议使用基于键的查询,这样性能会更好。因此,在URL中使用实体的键名是个好习惯,这样可以更快地从数据存储中获取实体。
有些字符在URL中有特殊含义(比如&、"、'等)。为了能在URL中使用键名,这些键名不能包含这些字符。目前我使用下面的函数来创建键名:
import re
import unicodedata
def urlify(unicode_string):
"""Translates latin1 unicode strings to url friendly ASCII.
Converts accented latin1 characters to their non-accented ASCII
counterparts, converts to lowercase, converts spaces to hyphens
and removes all characters that are not alphanumeric ASCII.
Arguments
unicode_string: Unicode encoded string.
Returns
String consisting of alphanumeric (ASCII) characters and hyphens.
"""
str = unicodedata.normalize('NFKD', unicode_string).encode('ASCII',
'ignore')
str = re.sub('[^\w\s-]', '', str).strip().lower()
return re.sub('[-\s]+', '-', str)
这个函数基本上是一个允许使用的字符列表。对于英语和瑞典语来说效果很好,但对于一些非西方语言就不行了,还会把某些西方语言的字母(比如挪威语和丹麦语中的œ和ø)去掉。
有没有人能推荐一种适合更多语言的方法?是不是应该直接去掉那些有问题的字符(黑名单)?
2. 翻译模板
Django的国际化和本地化功能在Google App Engine上能用吗?需要额外的步骤吗?在使用Webapp的同时,能否在Django模板中使用Django的i18n和l10n?
Jinja2模板语言与Babel集成。根据你的经验,这个集成效果如何?
你选择的模板语言有哪些可用的选项?
3. 翻译后的数据存储内容
在从数据存储中提供内容(或存储内容)时:有没有比从HTTP请求中获取accept_language参数并与每个实体设置的语言属性进行匹配更好的方法?
2 个回答
关于第二点,我几个月前问过一个类似的问题。我已经成功让这个应用程序支持多语言了,但只是内容部分,网址没有做国际化(我也没打算去做网址的国际化)。
我还把我对代码所做的修改添加上去了,这样大家可以看到我在让这个Google App Engine应用程序支持多语言时做了哪些更改。可以看看我在被接受的答案下的第二条评论。
祝你在其他两个问题上好运!
关于第一点,其实没必要那么麻烦:直接使用unicode键名就可以了。它们会自动以UTF-8格式存储在数据库里。
关于第三点,处理语言检测的方法有很多。肯定要考虑accept_language这个部分,你会发现webob的accept_language支持在这里特别有用(希望Django或者你选择的框架也有类似的功能)。不过,用户的浏览器语言设置有时候并不正确,所以你需要确保用户有办法手动更改检测到的语言,比如在每个页面上放一个链接,让他们可以切换语言,或者设置一个偏好cookie。