【问题标题】:Best way to implement multilanguage in PHP在 PHP 中实现多语言的最佳方法
【发布时间】:2014-07-12 02:29:59
【问题描述】:

我有超过 30 种语言的多语言 PHP 系统。每个定义都是用define()进行的:

define('LN_loader_alt', 'Loading...');

并且有超过 400 个定义。

我做了一点比较,创建了包含 400 多个常量的抽象类 Lang,这些常量当然不是 define(),例如:

abstract class Lang{
    const LN_loader_alt = 'Loading';
    ...
}

接下来我需要这两个文件并从类 Lang 中调用 1 个定义和 1 个常量。接下来我用 webgrind 进行了分析,结果让我感到惊讶:

1) 需要 400 个 define() 的文件占用了执行脚本的 70% 以上时间 2) 使用带常量的抽象类比define()快很多

我想和你分享这个分析并问你:将我的系统从“define()”多语言重写为“具有常量的抽象类”多语言是最优和明智的吗?或者它有什么缺点?

【问题讨论】:

    标签: php multilingual


    【解决方案1】:

    我的自发猜测是define() 是一个运行时函数调用,具有一定的开销,但类定义及其常量是在编译时解析的。因此有区别。

    话虽如此,这两种解决方案都很糟糕。 I18n 是一个已解决的问题,不需要再次重新发明。 i18n 中最大的问题是工作流程,您需要支持该工作流程的工具。该工作流程是:

    • 源中可翻译字符串的标记
    • 将所述字符串提取为源代码中性格式
    • 将这些字符串翻译成各种语言
    • 以上所有内容都是异步进行的,并行更改由不同的人完成,并使所有语言之间的所有内容保持同步

    已经有一些工具可以做到这一切,最成熟的工具是 gettext。使用它(或类似的东西),不要使用常量。

    见:

    【讨论】:

    • 在那一刻我选择了gettext,直到现在我在许多项目中都使用了它。这是正确的选择。
    【解决方案2】:

    我认为理想的做法是使用助手并仅按需执行翻译。

    例子:

    <?php
    // View.php
    //...
    echo translate('Hello World');
    

    该函数在当前语言词典中搜索对应的表达式,如果没有找到一个翻译,则直接回显“Hello World”。

    我认为你重写你的系统很好,因为 400 项不是那么多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 2016-04-15
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多