MultiLanguage应用程序 - 你会用什么?

时间:2011-06-21 15:03:00

标签: php mysql

您是否宁愿使用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文件

7 个答案:

答案 0 :(得分:2)

这取决于一些事情:

  1. 您想要persistence(例如,您希望将变量存储一次,然后检索)吗?

    如果您想要持久性,那么您应该使用MySQL(或某些XML / YAML文件)来存储您的数据,这样即使您以某种方式编辑代码或迁移到另一种语言,它也不会丢失。

  2. 您想要轻松编辑吗? 如果将数据保存在php文件中,外部编辑可能很难,因为您必须重写该文件,或者必须保存更新的更改。更改SQL表中的某些商店比在代码文件中更容易。

  3. 最后,我个人更喜欢外部存储,以便于迁移和简化编辑。

答案 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语句。