Допустим, вы создаете многоязычное веб-приложение, в котором весь текст интерфейса должен быть перемещен на языковые ресурсы и загружен при необходимости.Ресурс строки может быть огромным: скажем, у вас есть несколько тысяч переведенных строк.В оконных средах (Windows, OS X, X11) у вас обычно есть механизм, предоставляемый ОС или некоторым API для этого, и они обычно называются строковыми ресурсами.Тогда как насчет PHP?
Помните, однако, что здесь нужно серьезно относиться к производительности, так как PHP компилирует и выполняет все ваши модули с каждым запросом пользователя.
Я могу придумать несколько возможных способов сделать это.Но прежде всего у меня будет глобальная переменная $ LANGUAGE, которая может быть установлена в 'en', 'de', 'fr' и т. Д. Я буду использовать эту переменную для включения модуля, зависящего от языка, с каждым запросомas
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'!;
...
Менее читаемый, немногоменее пригодный для использования в вашем основном коде (больше задействовано при наборе текста) также немного загромождает ваш код.Это будет медленнее, потому что это не простые назначения, а ассоциированные.назначения массивов: здесь будет больше инструкций для виртуальной машины по сравнению с (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).Ужасно, медленно, требуется синхронизация ваших идентификаторов в коде с идентификаторами БД, однако нет необходимости загружать все, когда все ваши страницы нуждаются в нескольких строках.Честно говоря, не могу сказать, является ли это хорошим решением или нет.
Есть еще предложения?Кроме того, мысли об этих?
И, пожалуйста, имейте в виду, простота, элегантность и производительность!