Pyramid使用gettext * .po文件进行翻译,这是一种非常好且稳定的应用程序国际化方式。它的一个缺点是无法从应用程序本身进行更改。我需要一些方法让普通用户能够自己更改翻译。 Django 允许直接更改文件,并在更改后重新启动整个应用程序。我没有这种自由,因为这种变化会非常频繁。
由于我找不到任何可以帮助我完成任务的软件包,我决定覆盖 Localizer 。我的想法是基于使用翻译域,例如 Zope 项目使用并使 Localizer 搜索注册域名,如果找不到,请退回到默认翻译策略。
问题在于我找不到将自定义翻译解决方案放入Localizer本身的好方法。我能想到的是重新实现 get_localizer 方法并重写整个 Localizer 。但是有几件事需要在这里进行复制,例如映射插值和与翻译字符串相关的其他tweek。
答案 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足够好,您可以在每次更新时更新文件。如果服务器将重新启动,它将加载新文件......您必须首先编译目录。