我想建立一个可以处理提取语言环境字符串以支持国际化的CMS。我计划将字符串存储在数据库中,然后在数据库和应用程序之间放置一个密钥/值缓存(如memcache),以防止性能下降,从而使数据库的每个页面进行翻译。
这比使用带有字符串数组的PHP文件更复杂 – 但是当您有2000个翻译行时,该方法是非常低效的。
我想到了使用gettext,但是我不确定CMS的用户将会喜欢使用gettext文件。如果字符串存储在数据库中,那么可以设置一个不错的管理系统,以便他们可以随时进行更改,并且RAM中的缓存将确保提取这些字符串的速度快于或快于gettext。考虑到not even the zend framework uses it,我也不觉得安全使用PHP扩展。
这种方法有什么问题吗?
更新
我想我也许会为思想添加更多的食物。字符串翻译的一个问题是它们不支持日期,金钱或条件语句。不过,由于intl现在有MessageFormatter这是真正需要使用的。
// Load string from gettext file
$string = _("{0} resulted in {1,choice,0#no errors|1#single error|1
// Format using the current locale
msgfmt_format_message(setlocale(LC_ALL, 0), $string, array('Update', 3));
另一个注意事项,我不喜欢gettext的其中一个事情是将文本嵌入到应用程序中。这意味着负责主要翻译(通常为英语)的团队必须能够访问项目源代码,以便在所有地方进行默认语句的更改。这几乎与具有SQL意大利面代码的应用程序一样糟糕。
所以,使用_(‘error.404_not_found’)这样的键是有意义的,然后允许内容编写者和翻译者担心PO / MO文件,而不会弄乱代码。
但是,如果给定键不存在gettext转换,则无法回退到默认值(就像您可以使用自定义处理程序)。这意味着你可能会在你的代码中写入一些文字,或者给没有语言环境翻译的用户显示“error.404_not_found”。
另外,我不知道使用PHP的gettext的任何大型项目。我会感谢任何实际依赖于本机PHP gettext扩展的系统的良好使用(并因此测试)的链接。