在PHP中实现多语言的最佳方式

时间:2014-07-11 18:20:56

标签: php multilingual

我有30多种语言的多语言PHP系统。每个定义都使用define():

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

有超过400种定义。

我进行了一些比较并创建了具有400多个常量的抽象类Lang,而这些常量当然不是define(),例如:

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

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

1)要求具有400个define()的文件占用执行脚本的70%以上 2)使用带常量的抽象类比define()

快得多

我想与您分享此分析并问您:从" define()"重写我的系统是否最佳和最聪明?多语言到"抽象类,常数"多语言?或者也许有任何缺点?

2 个答案:

答案 0 :(得分:3)

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

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

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

有些工具已经完成了所有这些工作,最成熟的工具是gettext。使用它(或类似的东西),不要使用常量。

请参阅:

答案 1 :(得分:0)

我认为理想的是使用帮助者并仅按需执行翻译。

示例:

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

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

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