在金字塔中编写自定义翻译分配

时间:2012-04-10 17:12:58

标签: python localization internationalization translation pyramid

Pyramid使用gettext * .po文件进行翻译,这是一种非常好且稳定的应用程序国际化方式。它的一个缺点是无法从应用程序本身进行更改。我需要一些方法让普通用户能够自己更改翻译。 Django 允许直接更改文件,并在更改后重新启动整个应用程序。我没有这种自由,因为这种变化会非常频繁。

由于我找不到任何可以帮助我完成任务的软件包,我决定覆盖 Localizer 。我的想法是基于使用翻译域,例如 Zope 项目使用并使 Localizer 搜索注册域名,如果找不到,请退回到默认翻译策略。

问题在于我找不到将自定义翻译解决方案放入Localizer本身的好方法。我能想到的是重新实现 get_localizer 方法并重写整个 Localizer 。但是有几件事需要在这里进行复制,例如映射插值和与翻译字符串相关的其他tweek。

1 个答案:

答案 0 :(得分:0)

我不知道你在那里有多少东西,但我前一段时间做过类似的事情......将不得不再次这样做。实施非常简单......

如果您可以确定所有通话都将通过_()或类似的方式处理。您可以提供自己的功能。它会看起来像它。

def _(val):
    val = db.translations.find({key: id, locale: request.locale_name})
    if val:
        return val['value']
    else:
        return real_gettext(val)

这很简单......那么你需要有一些能将数据库转储到文件中的东西......

但我想重写本地化器更有意义..我很久以前就做过了,而且覆盖函数比在代码中搜索更容易。

Localiser的优势在于它可以在任何地方使用。猴子补丁非常酷,但它也很难看。如果我不得不再次这样做,我将提供我自己的本地化程序,它将首先从数据库加载,然后显示它自己的值。数据库背后的原因是,如果某人关闭服务器并且文件未被修改,您将看不到结果。

如果数据库超出需要,则Localize足够好,您可以在每次更新时更新文件。如果服务器将重新启动,它将加载新文件......您必须首先编译目录。