如何在 Google App Engine 上本地化应用程序?

Posted

技术标签:

【中文标题】如何在 Google App Engine 上本地化应用程序?【英文标题】:How to localize an app on Google App Engine? 【发布时间】:2011-02-02 10:38:27 【问题描述】:

在 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 i18n 和 l10n 用于 Django 模板?

Jinja2 template language provides integration with Babel。根据您的经验,它的效果如何?

您选择的模板语言有哪些可用选项?

3。翻译的数据存储内容

从数据存储提供内容(或将其存储到)时:有没有比从 HTTP 请求中获取 accept_language 参数并将其与您为每个设置设置的语言属性匹配更好的方法实体?

【问题讨论】:

在阅读了***.com/questions/522466/what-makes-a-friendly-url 之后,我决定在文章中使用数字 ID,从而避免 URL 的翻译和重命名问题。 有关保留字符和不安全字符的列表,请参阅***.com/questions/695438/… 【参考方案1】:

关于第 1 点,实际上没有必要如此冗长:只需使用 unicode 键名即可。它们将在数据存储区中为您编码为 UTF-8。

关于第 3 点,有很多方法可以处理语言检测。当然,accept_language 应该是其中的一部分,您会发现 webob's accept_language support 在这里特别有用(希望 Django 或您选择的框架有类似的东西)。但是,通常情况下,用户的浏览器的语言配置不正确,因此您需要确保用户有某种方法可以覆盖检测到的语言 - 例如,每个页面上都有一个链接来更改语言,设置偏好cookie。

【讨论】:

我不知道除 IE6 之外的所有主流浏览器都支持国际化资源标识符 (rfc3987)。然而,这就是 W3C 告诉我们的:w3.org/International/articles/idn-and-iri IRI 与数据存储键名无关。 我最初的问题不清楚......我使用键名作为 URL 的最后一部分。它们作为参数传递给 webapp 请求处理程序。我担心的是国际化字符串不会完整地传递给请求处理程序(我不知道 rfc3987)。【参考方案2】:

关于第2点,几个月前我问过a similar question。我已经设法使应用程序国际化,但只是内容,而不是网址(也不打算这样做)。

我还添加了我对代码所做的修订,以便人们可以看到对这个 Google App Engine 应用程序进行了哪些更改。看看我对已接受答案的第二条评论。

祝你其他 2 分好运!

【讨论】:

以上是关于如何在 Google App Engine 上本地化应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何从本地 Google App-engine 数据存储中删除所有实体?

Google App Engine - 哪些工具可以在本地编辑数据存储? [关闭]

在 Google-App-Engine 中使用 HSQLDB

如何在我的 Google App Engine 项目中实现 OpenID 使用者?

在 Google App Engine 上部署 create-react-app

Google Datastore 仍然指向 App Engine 生产数据库而不是本地模拟器