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

在PHP中实现多语言的最佳方法,php,multilingual,Php,Multilingual,我有超过30种语言的多语言PHP系统。每个定义都使用define()进行: 有400多个定义 我做了一些比较,创建了包含400多个常量的抽象类Lang,这些常量代替了define(),例如: abstract class Lang{ const LN_loader_alt = 'Loading'; ... } 接下来,我需要这两个文件,并从Lang类调用了1 define和1 const。接下来,我使用webgrind进行了分析,结果令我惊讶: 1) 需要使用400 defin

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

有400多个定义

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

abstract class Lang{
    const LN_loader_alt = 'Loading';
    ...
}
接下来,我需要这两个文件,并从Lang类调用了1 define和1 const。接下来,我使用webgrind进行了分析,结果令我惊讶:

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


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

我认为理想的做法是使用助手,只在需要时进行翻译

例如:

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

我认为理想的做法是使用助手,仅在需要时执行翻译

例如:

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

我认为理想的做法是使用助手,仅在需要时执行翻译

例如:

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

我认为理想的做法是使用助手,仅在需要时执行翻译

例如:

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

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

尽管如此,这两种解决方案都很糟糕。这是一个已经解决的问题,不需要再重新设计。i18n中最大的问题是工作流,您需要支持该工作流的工具。该工作流程是:

  • 源中可翻译字符串的标记
  • 将所述字符串提取为源代码中性格式
  • 将这些字符串翻译成各种语言
  • 以上所有内容都是异步的,并行的更改由不同的人完成,并保持所有语言之间的同步
有一些工具已经完成了这一切,最成熟的工具是gettext。使用它(或类似的东西),不要使用常量

见:


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

尽管如此,这两种解决方案都很糟糕。这是一个已经解决的问题,不需要再重新设计。i18n中最大的问题是工作流,您需要支持该工作流的工具。该工作流程是:

  • 源中可翻译字符串的标记
  • 将所述字符串提取为源代码中性格式
  • 将这些字符串翻译成各种语言
  • 以上所有内容都是异步的,并行的更改由不同的人完成,并保持所有语言之间的同步
有一些工具已经完成了这一切,最成熟的工具是gettext。使用它(或类似的东西),不要使用常量

见:


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

尽管如此,这两种解决方案都很糟糕。这是一个已经解决的问题,不需要再重新设计。i18n中最大的问题是工作流,您需要支持该工作流的工具。该工作流程是:

  • 源中可翻译字符串的标记
  • 将所述字符串提取为源代码中性格式
  • 将这些字符串翻译成各种语言
  • 以上所有内容都是异步的,并行的更改由不同的人完成,并保持所有语言之间的同步
有一些工具已经完成了这一切,最成熟的工具是gettext。使用它(或类似的东西),不要使用常量

见:


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

尽管如此,这两种解决方案都很糟糕。这是一个已经解决的问题,不需要再重新设计。i18n中最大的问题是工作流,您需要支持该工作流的工具。该工作流程是:

  • 源中可翻译字符串的标记
  • 将所述字符串提取为源代码中性格式
  • 将这些字符串翻译成各种语言
  • 以上所有内容都是异步的,并行的更改由不同的人完成,并保持所有语言之间的同步
有一些工具已经完成了这一切,最成熟的工具是gettext。使用它(或类似的东西),不要使用常量

见:


当时我选择了gettext,直到现在我已经在许多项目中使用了它。这是一个正确的选择。当时我选择了gettext,直到现在我已经在许多项目中使用它。这是一个正确的选择。当时我选择了gettext,直到现在我已经在许多项目中使用它。这是一个正确的选择。当时我选择了gettext,直到现在我已经在许多项目中使用它。这是正确的选择。