Это самый оптимальный способ иметь дело с многоязычным веб-сайтом, о котором я могу думать, прямо сейчас (не уверен), который не включает gettext, zend_translate или любой плагин php или фреймворк.
Я думаю, что это довольно просто: у меня есть 3 языка, и я пишу их «контент» в разных файлах (в виде массивов), а позже я называю этот контент своим index.php
как вы можете оценить на следующем рисунке:
alt text http://img31.imageshack.us/img31/1471/codew.png
Я только начинал с php, и мне хотелось бы знать, не нарушаю ли я хорошие методы работы с PHP, если код уязвим для атаки XSS или если я пишу больше кода, чем необходимо.
EDIT: я разместил изображение, чтобы вы могли видеть дерево файлов (я не ленив)
EDIT2: Я использую Vim с темой ir_black и NERDTree.
Выглядит хорошо, хотя я лично предпочитаю создавать и использовать вспомогательную функцию словаря:
<?php echo dictionary("showcase_li2"); ?>
что позволит вам легко переключать методы позже и дает вам в целом больше контроля над вашим словарем. Также с массивом у вас будет проблема с областью – вам придется импортировать ее в каждую функцию, используя global $language;
очень надоедливый.
Вы, вероятно, также достигнете точки, когда вам нужно вставить значения в интернационализированную строку:
You have %1 votes left in the next %2 hours. Sie haben %1 stimmen übrig für die nächsten %2 stunden. Sinulla on %1 ääntä jäljellä seuraavan %2 tunnin ajassa.
это что-то вспомогательная функция может быть очень полезно для:
<?php echo dictionary("xyz", $value1, $value2 ); ?>
$value1
и $value2
будут вставлены в %1
и %2
в строку словаря.
Такая вспомогательная функция может быть легко построена с неограниченным количеством параметров, используя func_get_args () .
Все нормально. Например, локализация punBB работает таким образом. Это очень быстро. Быстрее вызова функции или метода или свойства объекта. Но я вижу проблему с этим подходом, поскольку он не поддерживает языковые резервные копии. Я имею в виду, если у вас нет строки для китайского языка, пусть она будет отображаться на английском языке.
Эта проблема актуальна, когда вы обновляете свою систему, и у вас нет времени переводить все на каждом языке.
Мне лучше использовать что-то вроде
lang.en.php
$langs['en'] = array( ... );
lang.cn.php
$langs['cn'] = array( ... );
[prepend].php
(некоторые общие библиотеки)
define('DEFAULT_LANG', 'en'); include_once('lang.' . DEFAULT_LANG '.php'); include_once('lang.' . $user->lang . '.php'); $lang = array_merge($langs[DEFAULT_LANG], $langs[$user->lang]);
Похоже на меня, но :
Кажется, что у вас есть локализация для нескольких модулей / сайтов, так почему бы не разбить ее на многомерный массив?
$localization = array( 'module' => (object)array( 'heading' => 'oh, no!', 'perex' => 'oh, yes!' ) );
Мне лично нравится stdClass
из массивов с помощью
$localization = (object)$localization;
поэтому вы можете использовать
$localization->module->heading;
🙂 мои 2 цента
Единственным способом, которым это может быть xss, является то, что у вас есть register_globals = On, и вы не устанавливаете $ lang ['showcase_lil'] или другие $ lang's. Но я не думаю, что вам нужно беспокоиться об этом. Поэтому я думаю, что вы в ясности.
как xss-тест: http://127.0.0.1/whatever.php?lang%5Bshowcase_lil%5D= alert (/ xss /)
Разве не лучше было бы опубликовать код и кратко объяснить эту проблему нам?
В любом случае, каждый язык в своем собственном файле и загрузка его через какой-то компонент языка выглядит нормально. Я бы предпочел использовать какой-то gettext, но это тоже нормально.
Вы должны сделать функцию вызова языковых ключей, а не полагаться на массив, что-то вроде <?php echo lang('yourKey'); ?>
<?php echo lang('yourKey'); ?>
Одна вещь, на которую нужно обратить внимание, – интерполяция; это действительно единственное место, где XSS может проникнуть, если ваши настройки сервера разумны. Если вам в какой-то момент нужно что-то сделать в соответствии с переводом «имя проекта $ project->, у него есть члены проекта $ project-> member_count», вам нужно убедиться, что вы избегаете всего HTML, который там находится.
Но кроме этого, все должно быть хорошо.