Предположим, вы создаете многоязычное веб-приложение, в котором весь текст интерфейса должен быть перемещен в зависящие от языка ресурсы и загружен при необходимости. Строковый ресурс может быть огромным: скажем, вы переводили несколько тысяч строк. В оконных средах (Windows, OS X, X11) у вас обычно есть механизм, предоставляемый ОС или какой-то API для выполнения именно этого, и их обычно называют строковыми ресурсами. Как насчет PHP?
Помните, однако, производительность должна рассматриваться здесь серьезно, так как PHP компилирует и выполняет все ваши модули с каждым запросом пользователя.
Я могу придумать несколько возможных способов сделать это. Но, прежде всего, у меня будет глобальная переменная $ LANGUAGE, которая может быть установлена на «en», «de», «fr» и т. Д. Я буду использовать эту переменную для включения модуля, специфичного для языка, с каждым запросом в виде
require_once "lang-$LANGUAGE.inc.php"
Поэтому некоторые из возможных решений включают:
(1) Определение всех строк как глобальных варов в каждом языковом модуле, например
$str_signin = 'Sign in'; $str_welcome_user = 'Welcome, %s'!; ...
Очень просто, легко читается и относительно легко работать для нетехнических людей (переводчиков, то есть). Существует некоторое глобальное загрязнение космоса, хотя это немного замедлит поиск глобальных переменных.
(2) Тот же, но определенный как один огромный массив, например
$str['signin'] = 'Sign in'; $str['welcome_user'] = 'Welcome, %s'!; ...
Менее читаемый, немного менее пригодный для использования в вашем основном коде (более типизированный) также немного загромождает ваш код. Это будет медленнее, потому что это не простые назначения, а связывание. назначение массива: для VM будет больше инструкций для сравнения по сравнению с (1).
(3) PHP 5.3+: определить как константы, возможно, в классе или пространстве имен
class str { const signin = 'Sign in'; const welcome_user = 'Welcome, %s'!; const signin_to_a = self::signin . ' to area A'; // can't do this! ... }
… и использовать их как str :: signin и т. д. Приятно, мне это больше всего нравится, хотя есть и несколько незначительных недостатков: только PHP 5.3+; не могут использовать выражения, только одиночные значения (которые могут или не могут быть точными в вашем случае); не может использоваться в $ -расширении в строках с двойными кавычками (или вы можете?).
(4) База данных: помещаем все в таблицу и извлекаем с помощью некоторого идентификатора, например str_get (STR_SIGNIN). Ужасно, медленно, вам нужна синхронизация ваших идентификаторов в коде с идентификаторами базы данных, однако не нужно загружать все, когда вам нужно всего лишь несколько строк. Честно говоря, нельзя сказать, является ли это хорошим решением или нет.
Любые другие предложения? Кроме того, мысли об этих?
И, пожалуйста, имейте в виду простоту, элегантность и производительность!