У меня многоязычная система 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 предметов – это не так.