经过一些测试,我最终决定基本上采用Alecs的第二和第三种选择的组合。
Gettext问题
我试图先设置整个gettext系统来试用一下,但结果比我想象的要复杂得多。问题在于
Windows和Unix系统对
setlocale()使用不同的语言简称。目前,我在Windows上用
Wamp运行我的开发服务器,而最终的网站将在Linux上运行。在查阅了几十个
指南、
论坛、
问题等,并在每次修改后重新启动服务器后,我发现没有找到任何简单的设置方法。此外,gettext不是线程安全的,要更新语言文件,服务器需要重新启动或者需要使用
某种技巧,没有简单的方法来处理不同版本的语言文件或者处理原始的英文文本而不修改源代码或使用Mikes的建议,正如Alec指出的那样,这并不是最佳选择。
解决方案
根据Alec的回答,我最终得出了我认为是最佳解决方案:
1. 将所有翻译保存在数据库中,包括语言、页面、变量键、版本、修订和最后修改时间等字段。其中,版本对应原始翻译(英文)的不同版本,而修订允许翻译人员在版本内修改/修正最终翻译。
2. 使用一种与数据库连接的CMS进行翻译,该CMS可以处理不同版本,并且可以轻松查看已翻译的语言、版本以及翻译的完整程度。
3. 当某个版本的修订完成后,将生成缓存文件。每个文件都包含一个数组,只包含一个语言和一个页面的变量键和文本翻译,并以
ISO 639-1语言代码和页面名称命名,例如:lang/en_index.php。然后,这些语言文件只需被包含并封装在一个名为t($var_key)的函数中,这样在开发过程中可以使用数据库,而后续只需使用缓存文件。
性能
我从来没有测试过gettext,但根据
Mike发布的链接,对于上述自定义系统所提供的好处,使用数组和gettext之间的性能差异对我来说完全可以接受。然而,我将一个包含20个翻译文本字符串的数组与从
MySQL数据库检索相同的20个文本字符串进行了比较。结果表明,使用从文件中包含的数组比同时从MySQL数据库中检索所有20个字符串要快
6倍。这并不是一个真正科学的基准测试,结果在不同的系统和设置上可能会有所不同,但它清楚地展示了我预期的情况 - 使用数据库比直接使用数组要慢得多,这就是为什么我选择为数组生成缓存文件而不使用数据库的原因。
作为对比,我还测试了只输出简单回显的速度,使用相同的文本。结果发现,与使用包含文件中的数组相比,速度大约快了20倍。但是,这样就无法在不同语言版本的页面上进行翻译,这违背了动态页面的目的。这时最好也使用一个良好的缓存系统。
性能测试源文件:
PHP:[链接2](http://pastie.org/964082)
MySQL表格:[链接3](http://pastie.org/964115)
虽然肯定不是完美的,但至少能给出性能差异的一个概念。