您是否宁愿使用mySQL数据库存储语言变量或php变量?
请考虑
你会怎么做?将其存储到php变量,例如
$language['en']["hello"] = "Hello";
$language['cz']["hello"] = "Ahoj";
并使用功能
function l($lvar)
{
global $language, $default_language;
return $language[$default_language][$lvar];
}
并像
一样使用它<div id="test">
<?php echo l("hello"); ?>
</div>
?什么更好?
然后将它们存储在数据库中,每次(或一次10分钟)创建(生成)带变量的php文件
答案 0 :(得分:2)
这取决于一些事情:
您想要persistence(例如,您希望将变量存储一次,然后检索)吗?
如果您想要持久性,那么您应该使用MySQL(或某些XML / YAML文件)来存储您的数据,这样即使您以某种方式编辑代码或迁移到另一种语言,它也不会丢失。
您想要轻松编辑吗? 如果将数据保存在php文件中,外部编辑可能很难,因为您必须重写该文件,或者必须保存更新的更改。更改SQL表中的某些商店比在代码文件中更容易。
最后,我个人更喜欢外部存储,以便于迁移和简化编辑。
答案 1 :(得分:2)
嗯,取决于。对于添加和/或编辑,我会选择存储在数据库中。为了性能,我会选择一个php文件 - 就像一对常量文本对。
无论如何,你不应该使用多维数组。页面加载时,您肯定知道您需要的语言。这样,您就可以使用一维数组。 而不是
$language['en']["hello"] = "Hello";
应该是:
$language["hello"] = "Hello";
或
$language["hello"] = "Ahoj";
因为你好,你会采用适当的语言文本。
答案 2 :(得分:1)
我建议使用标准解决方案,因为您不是第一个需要国际化支持的人: - )
如果您正在使用zend框架,请查看Zend_Translate。它们具有不同的适配器,因此您可以使用XML文件,php数组或gettext来保存到文本。 http://framework.zend.com/manual/en/zend.translate.introduction.html
如果这是一个没有框架的项目,PECL有一个很好的国际化包: http://pecl.php.net/package/intl
答案 3 :(得分:1)
一般来说,如果只有程序员要编辑这些变量,我建议在PHP中定义变量。但是,如果您希望其他人编辑它们(可能通过Web界面),最好将它们放在数据库中。这对性能稍差,但允许那些无法访问代码的人编辑它们(前提是你创建了一个编辑界面)。
答案 4 :(得分:1)
出于性能原因,我使用了缓存数据库方法。
在我们的一些页面上,我们可能有100个需要翻译的项目,如果每个项目都对数据库进行单独调用,则会产生巨大的开销。
我们很快决定,我们不会翻译超过几千个项目,经过一些性能测试后发现,最快的方法是获取所需语言的整个(或一个子集,如果可以的话)字典。对于页面。然后将此字典加载到HashTable中以快速查找。因此,每个服务器请求只需要1个DB访问权限。
我们在一本包含50,000个翻译项目的字典中进行了测试,性能非常好。
它还具有以下优点:它可以轻松绑定到管理工具,以允许用户编辑翻译。
答案 5 :(得分:0)
我使用标准的linux gettext库,它也是在PHP中提供的。
在代码中:
_('ahoj');
然后我只编辑messages_en.po文件进行英文翻译,就是这样。我制作了一个Makefile,能够快速编译文件,并在没有翻译的情况下查找新添加的短语。
答案 6 :(得分:0)
当我将我的一个网站翻译成多语言时,数据库Idea很快就消失了。
我知道将变量数据保存在变量中似乎是新手。但它也让我可以灵活地使用功能。
在所有网站翻译与字典不同之后,存在语法问题的情况。你好##用户名用英文写的## username你好用另一种语言写的。此外,全局会话变量(如用户名,真实姓名等)也可以合并到翻译字符串中。使用mysql执行此操作需要在返回的转换数据(## username hello,hello ## username)之上运行php搜索替换函数,并使事情变得更复杂和缓慢,因为每个字符串都必须通过此函数或在至少是if语句。