【问题标题】:MultiLanguage application - what would you use?MultiLanguage 应用程序 - 你会使用什么?
【发布时间】:2011-06-21 15:03:00
【问题描述】:

你更愿意使用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 文件

【问题讨论】:

  • 这取决于您的用例。谁将不得不编辑这些文件?他们需要网络界面吗?
  • 以 Facebook 为例 - 他们确实有工具供所有人翻译,然后添加/编辑最佳翻译投票
  • 我自己会使用一个 XML 文件,因为制作一个可以维护语言的小 UI 并不难,使用 DB(在我看来)是不必要的负载..

标签: php mysql


【解决方案1】:

这取决于一些事情:

  1. 你想要persistence(例如你想要变量被存储一次,然后被检索)吗?

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

  2. 您想要轻松编辑吗? 如果您将数据保存在 php 文件中,则外部编辑可能会很困难,因为您要么必须重写该文件,要么必须以某种方式保存较新的更改。更改存储在 SQL 表中的内容比更改代码文件中的内容更容易。

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

【讨论】:

    【解决方案2】:

    嗯,看情况。对于添加和/或编辑,我会选择存储在数据库中。为了性能,我会选择一个 php 文件——比如一对常量文本列表。

    无论如何,您都不应该为此使用多维数组。当页面加载时,您肯定知道您需要的语言。这样,您可以使用一维数组。 而不是

    $language['en']["hello"] = "Hello";
    

    应该是:

    $language["hello"] = "Hello";
    

    $language["hello"] = "Ahoj";
    

    因为你好你会采取适当的语言文本。

    【讨论】:

    • 所以我应该使用 if ($default_lang == "en"){$language['hello'] = 'hello';} if ($default_lang == "cz"){$language['hello'] = 'ahoj';} 之类的东西?
    • 不完全是。例如,如果您决定将其保存在数据库中,您将进行如下查询:SELECT * FROM LANGUAGES WHERE LANGUAGE='en'。这会给你所有的英语单词。如果您将它们保存在磁盘上,您可以为每种语言创建不同的文件:en_lang.php 或 cz_lang.php。根据客户语言,您可以包含相应的文件。
    【解决方案3】:

    我建议使用标准解决方案,因为您不是第一个需要国际化支持的人 :-)

    如果您使用的是 zend 框架,请查看 Zend_Translate。它们有不同的适配器,因此您可以使用 XML 文件、php 数组或 gettext 来保存到文本。 http://framework.zend.com/manual/en/zend.translate.introduction.html

    如果它是一个没有框架的项目,PECL 有一个很好的国际化包: http://pecl.php.net/package/intl

    【讨论】:

      【解决方案4】:

      一般来说,如果只有程序员要编辑这些变量,我建议在 PHP 中定义变量。但是,如果您希望其他人编辑它们(也许通过 Web 界面),最好将它们放在数据库中。这对性能来说稍差一些,但允许无权访问代码的人编辑它们(当然,前提是您制作了一个用于编辑的界面)。

      【讨论】:

      • 那么如何将它们存储在数据库中,并且每次(或 10 分钟一次)使用 vars 创建(生成)php 文件?
      • 这也是一种可能。每次生成文件根本不会提高性能(事实上,它会比简单地从数据库中访问变量更糟糕)所以这似乎不是一个好主意。但是,每 10 分钟生成一个 PHP 文件可能会比简单地访问数据库中的变量提供更好的性能。因此,它将为您提供接近于简单地在 PHP 中定义变量的性能,以及在数据库中拥有变量的灵活性。不过,它确实有需要 cron 或其他一些调度工具的缺点。
      【解决方案5】:

      出于性能原因,我使用了缓存数据库方法。

      在我们的某些页面上,我们可能有 100 个需要翻译的项目,如果每个项目都单独调用数据库,则会导致巨大的开销。

      我们很快决定不翻译超过几千个项目,在经过一些性能测试后,我们意识到最快的方法是获取所需语言的整个(或一个子集)字典,并且为页面。然后将此字典加载到 HashTable 中以快速查找。因此,每个服务器请求只需要 1 个 DB 访问权限。

      我们在包含 50,000 个翻译项的词典上对其进行了测试,性能非常好。

      它还有一个优点是它可以很容易地与管理工具绑定,以允许用户编辑翻译。

      【讨论】:

        【解决方案6】:

        我使用标准的 linux gettext 库,它也是 PHP 提供的。

        在代码中:

        _('ahoj');
        

        然后我只需编辑文件messages_en.po 进行英文翻译,仅此而已。我制作了一个 Makefile,以便能够快速编译文件并在不翻译的情况下查找新添加的短语。

        【讨论】:

          【解决方案7】:

          当我将我的一个网站翻译成多语言时,数据库 Idea 很快就消失了。

          我知道将翻译后的数据保存在变量中似乎是新手。但它也给了我使用函数的灵活性。

          毕竟网站翻译与字典不同,在某些情况下语法是个问题。 Hello ##username 在英语中可能会写成 ##username Hello 在另一种语言中。还可以将用户名、实名等全局会话变量合并到翻译字符串中。使用 mysql 执行此操作需要在返回的翻译数据(##username hello, hello ##username)之上运行 php 搜索替换函数,并使事情变得更加复杂和缓慢,因为每个字符串都必须通过这个函数或在至少一个 if 语句。

          【讨论】:

            猜你喜欢
            • 2011-02-14
            • 2012-10-16
            • 1970-01-01
            • 2010-11-08
            • 2011-03-24
            • 1970-01-01
            • 2020-12-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多