Я нарушаю какие-либо "хорошие практики php" в следующем массиве php, который имеет дело с 3 (человеческими) языками? - PullRequest
3 голосов
/ 25 февраля 2010

Это самый оптимальный способ работы с многоязычным веб-сайтом, который я могу себе представить, прямо сейчас (не уверен), который не включает gettext, zend_translate или любой плагин или фреймворк php.

Я думаю, что это довольно просто: у меня есть 3 языка, и я пишу их «контент» в разных файлах (в виде массивов), а позже я называю этот контент моим index.php, как вы можете оценить в следующем фото:

альтернативный текст http://img31.imageshack.us/img31/1471/codew.png

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

РЕДАКТИРОВАТЬ: я опубликовал картинку, чтобы вы могли видеть дерево файлов (я не ленивый)

EDIT2: я использую Vim с темой ir_black и NERDTree.

Ответы [ 6 ]

10 голосов
/ 25 февраля 2010

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

<?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 () .

2 голосов
/ 25 февраля 2010

Это нормально, как правило. Например, локализация 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]);
2 голосов
/ 25 февраля 2010

Мне тоже хорошо смотрится, , но :

Кажется, у вас есть локализация для нескольких модулей / сайтов, так почему бы не разбить ее на многомерный массив?

$localization = array(
  'module' => (object)array(
    'heading' => 'oh, no!',
    'perex'   => 'oh, yes!'
  )
);

Мне лично нравится создавать stdClass из массивов с

$localization = (object)$localization;

так что вы можете использовать

$localization->module->heading;

:) мои 2 цента

0 голосов
/ 25 февраля 2010

Нужно следить за интерполяцией; это действительно единственное место, куда может проникнуть XSS, если настройки вашего сервера разумны. Если вам в какой-то момент нужно что-то сделать в соответствии с переводом «$ project-> name has $ project-> member_count members», вам необходимо убедиться, что вы избегаете всего, что там содержится.

Но кроме этого, у вас все будет хорошо.

0 голосов
/ 25 февраля 2010

Не лучше ли было бы опубликовать код и кратко объяснить нам эту проблему?

В любом случае, каждый язык помещается в отдельный файл и загружается через какой-либо компонент языка. Я бы предпочел использовать какой-то метод gettext, но я думаю, это тоже нормально.

Вы должны сделать функцию для вызова ключей языка, а не полагаться на массив, что-то вроде <?php echo lang('yourKey'); ?>

0 голосов
/ 25 февраля 2010

Единственный способ, которым это может быть xss - это если register_globals = On и вы не устанавливаете $ lang ['showcase_lil'] или другие $ lang. Но я не думаю, что тебе стоит беспокоиться об этом. Так что я думаю, что вы в чистом виде.

в качестве теста xss: http://127.0.0.1/whatever.php?lang[showcase_lil]=alert(/xss/)

...