1

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

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

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

4

1 回答 1

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 就足够了,您可以在每次更新时更新文件。如果服务器将重新启动,它将加载新文件...您必须先编译目录。

于 2012-04-21T22:01:16.953 回答