我正在开发一个PHP网站,我想让用户轻松地从德语切换到英语。
因此,必须考虑翻译政治:
我应该将数据及其翻译存储在数据库表中((1,“Hello”,“hallo”),(2,“早上好”,“Guten Tag”)等。?
或者我应该使用“.mo”文件存储它?
哪种方式最好?
有什么优点和缺点?
答案 0 :(得分:10)
在我最近刚刚解决了这个问题(12种语言和计数)之后,在生产系统上遇到了一些主要的性能问题,我建议使用混合系统。
1)将语言字符串和翻译存储在数据库中 - 这样可以轻松地与/ update / remove项目进行交互,并且将成为正常备份例程的一部分。
2)将语言缓存到服务器上的平面文件中,并根据需要绘制出来以显示在页面上。
这里的好处很多 - 大多数都很快!我没有处理MySQL的连接开销或传输过程中的任何流量减慢。 (如果您的数据库服务器不是localhost,则尤为重要。)
这也使它易于使用。将数据库中的数据作为php序列化数组存储在文件中,然后GZIP文件内容以减少存储开销(这也使我的基准测试速度更快)。
示例:强>
$lang = array(
'hello' => 'Hallo',
'good_morning' => 'Guten Tag',
'logout_message' = > 'We are sorry to see you go, come again!'
);
$storage_lang = gzcompress( serialize( $lang ) );
// WRITE THIS INTO A FILE SUCH AS 'my_page.de'
当用户第一次加载您的系统时,请执行file_exists('/files/languages/my_page.de')
。如果该文件存在,则加载内容,取消gzip和取消序列化,然后就可以开始了。
示例强>
$file_contents = get_contents( 'my_page.de' );
$lang = unserialize( gzuncompress( $file_contents ) );
如您所见,您可以对系统中的每个页面进行特定的缓存,使开销更小,并使用文件扩展名来表示语言...(my_page.en,my_page.de,my_page.fr)
如果文件不存在,则查询数据库,构建数组,序列化数据,gzip并编写丢失的文件 - 同时你刚刚构建了所需页面的数组,继续显示页面,每个人都很高兴。
最后,这允许您构建非程序员可访问的更新页面,但您还可以通过决定何时删除缓存文件来控制何时出现更改,以便系统可以重建它们。
警告和陷阱
当我将所有内容直接保存在数据库中时,当我们的流量飙升时,我们会遇到一些主要的减速。
尝试将它们保存在平面文件阵列中只是非常麻烦,因为更新很痛苦且容易出错。
GZIP压缩缓存文件的内容使得语言系统的基准测试速度降低了约20%。
确保包含语言的所有数据库字段都设置为UTF8-general-ci(或者至少有一个UTF8选项,我发现general-ci最适合我使用)。如果不这样做,您将无法在数据库中存储非unicode字符集(如中文,日文等)
<强>扩展:强> 在回答下面的注释时,请务必在设置数据库表时考虑页面级语言字符串。
id string page global
1 hello NULL 1
2 good_morning my_page.php 0
在页眉或页脚中显示的任何内容都可以在创建的每个缓存文件中查询全局标志,否则请逐页查询以保持系统响应。
答案 1 :(得分:6)
我还建议使用Zend Framework Zend_Translate包。
本手册概述了How to decide which translation adapter to use。即使不使用ZF,这也会给你一些关于什么以及利弊是什么的想法。
适用于Zend_Translate的适配器
答案 2 :(得分:5)
PHP数组确实是加载翻译的最快方式。但是,您确实不希望在编辑器中手动更新这些文件。这可能在一开始就有用,对于一种或两种语言,但是当你的网站增长时,这很难维护。
我建议您在数据库中设置一些简单的表格来保存翻译,并构建一个简单的应用程序,让您更新翻译(一些表格来添加和更新文本)。至于数据库:使用一个表来存储翻译变量;使用另一个链接将翻译链接到这些变量。
示例:
`text` id variable 1 hello 2 bye
`text_translations` id textId language translation 1 1 en hello 2 1 de hallo 3 2 en bye 4 2 de tschüss
所以你要做的是:
在第一个表格中创建变量
在第二个表格中添加翻译(用您想要的任何语言)
更新翻译后,为您正在使用的每种语言创建/更新语言文件:
选择您需要的变量及其翻译(提示:如果没有翻译,请使用英语)
用所有这些东西创建一个大数组,例如:
$texts = array('hello' => 'hallo', 'bye' => 'tschüss');
file_put_contents('de.php', serialize($texts));
$texts = unserialize(file_get_contents('de.php'));
<h1><?php echo $texts['hello']; ?></h1>
or if you like/enabled PHP short tags:
<p><?=$texts['bye'];?></p>
此设置非常灵活,只需几种表格即可更新翻译,您可以轻松地以多种语言更新网站。
答案 3 :(得分:4)
您应该考虑一些因素。
网站是否会频繁更新?如果是的话,由谁?你还是老板?你要处理多少数据/信息?而且......你经常这样做(对很多客户来说)?
我很难想象使用关系型数据库可以避免任何严重的速度影响,除非您的流量非常高(每天数十万次综合浏览量)。
如果您经常这样做(对于许多客户),请不要再思考:建立CMS(或使用现有的CMS)。如果您确实需要考虑速度影响,可以对其进行自定义,以便在完成网站后可以尽可能导出静态HTML页面。
如果您经常更新,则适用与上述相同的内容。 如果客户端必须再次更新(而不是您),则需要CMS。 如果您正在处理大量信息(大量和大量文章),则需要CMS。
总而言之,CMS将帮助您快速构建网站结构,快速添加内容,而不用担心代码,因为它可以重复使用。
现在,如果您只需要快速创建一个小型网站,您可以使用硬编码数组和数据文件轻松完成此操作。
答案 4 :(得分:1)
如果您需要提供用于添加/编辑翻译的Web界面,那么数据库是一个好主意。
但是,如果你的翻译是静态的,我会使用gettext甚至普通的PHP数组。
无论哪种方式,您都可以利用Zend_Translate。
小比较,前两个来自Zend教程:
答案 5 :(得分:0)
我建议使用PHP数组,它们可以围绕GUI构建,以便于访问。
答案 6 :(得分:0)
在处理计算机时要认识世界上的每个人,他们通常会知道一些常用的英语,如计算机或互联网,如关于我们,家庭,发送,删除,阅读等等。问题:他们真的需要翻译吗?
好吧,老实说,对这些词的翻译实际上不是“必需的”,而是“风格”。
现在,如果它真的需要,对于不需要永远改变的常用词,最好使用一个只输出本地和英语的lang数组的php文件。对于一些内容,如博客,新闻和一些描述,使用数据库并保存所需的语言翻译。你必须手动完成。
使用并依赖Google翻译?我想你必须要想1000次。至少在这十年里。