Лучший способ реализовать многоязычность в PHP

У меня многоязычная система PHP с более чем 30 языками. Каждое определение выполняется с помощью define ():

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

И существует более 400 определений.

Я сделал небольшое сравнение и создал абстрактный класс Lang с более чем 400 константами, и эти константы вместо define (), конечно, например:

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

Затем мне потребовались оба файла и назвали 1 define и 1 const из класса Lang. Затем я сделал анализ с webgrind, и результаты удивили меня:

1) требование файла с 400 define () заняло более 70% времени выполнения сценария 2) Использование абстрактного класса с константой намного быстрее, чем define ()

Я хотел бы поделиться с вами этим анализом и спросить вас: оптимально ли и умно переписывать мою систему из «define ()» многоязычного в «абстрактный класс с постоянным» многоязычным языком? Или, может быть, есть какие-то недостатки?

Мое спонтанное предположение заключалось в том, что define() – это вызов функции времени выполнения с определенными издержками, но определение класса и его константы анализируются во время компиляции. Отсюда и различие.

Сказав это, оба решения ужасны. I18n – это решенная проблема, которую не нужно снова изобретать. Самая большая проблема в i18n – это рабочий процесс, и вам нужны инструменты, которые поддерживают этот рабочий процесс. Этот рабочий процесс:

  • разметка переводимых строк в источнике
  • извлечение указанных строк в нейтральный формат исходного кода
  • перевод этих строк на разные языки
  • все вышеперечисленное асинхронно с параллельными изменениями, выполняемыми отдельными людьми, и сохранение всех синхронизаций между всеми вашими языками

Есть инструменты, которые уже делают все это, причем наиболее распространенным является gettext. Используйте его (или что-то подобное), не используйте константы.

Видеть:

Я считаю, что идеал состоит в том, чтобы использовать помощников и выполнять перевод только по требованию.

Пример:

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

Функция ищет соответствующее выражение в текущем словаре языка или просто эхо «Hello World», если не найден один перевод.

Я считаю, что вы переписываете свою систему, поскольку 400 предметов – это не так.