До сих пор только 2 хороших вещи, что я занялся использованием gettext вместо массивов, состоят в том, что я не должен создавать "приветствие" "подмассив" (или безотносительно его названного). И я не должен создавать папку для "языка по умолчанию".
Есть ли другие профессионалы и из-за использования gettext и массивов php для многоязычных веб-сайтов?
ИСПОЛЬЗУЯ GETTEXT:
spanish/messages.po:
#: test.php:3
msgid "Hello World!"
msgstr "Hola Mundo"
index.php:
<?php echo _("Hello World!"); ?>
index.php? lang=spanish:
<?php echo _("Hello World!"); ?> turns to Hola Mundo
ИСПОЛЬЗУЯ МАССИВЫ PHP:
lang.en.php
<?php
$lang = array(
"greeting" => "Hello World",
);
?>
lang.es.php
<?php
$lang = array(
"greeting" => "Hola Mundo",
);
?>
index.php:
<?php echo $lang['greeting']; ?> greeting turns to Hello World
index.php? lang=spanish
<?php echo $lang['greeting']; ?> greeting turns to Hola Mundo
(Я сначала запустил с gettext, но он не поддерживался в моем общем бесплатном размещении Zymic. Я не хотел использовать Zend_translate, я нашел, что он также усложнил к моей простой задаче, таким образом, я наконец закончил тем, что использовал php define
, но позже кто-то сказал мне, что я должен использовать массивы),
Используя GNU gettext, вы получаете поддержку для заполнители, такие как printf и международные формы множественного числа. Порядок заполнителей можно изменить при переводе или пропустить.
Пример из документации PHP:
<?php
setlocale(LC_ALL, 'cs_CZ');
printf(ngettext("%d window", "%d windows", 1), 1); // gives "1 okno"
printf(ngettext("%d window", "%d windows", 2), 2); // gives "2 okna"
printf(ngettext("%d window", "%d windows", 5), 5); // gives "5 oke"
?>
Еще одним преимуществом является то, что вы можете использовать стандартные инструменты для управления терминологией, памяти переводов и машинного перевода, как указано @middus.
Для общих сред существует отличная библиотека php-gettext от Данило Сегана.
На мой взгляд, не имеет особого смысла использовать двоичный формат (файлы .mo gettext) для динамического языка, такого как php.
Однако преимуществом gettext является наличие огромной экосистемы инструментов, которые переводчики вашего программного обеспечения могут использовать (например, Poedit ). Обратной стороной является то, что вам всегда нужно компилировать свой .po в .mo перед его развертыванием, в то время как вы можете просто заменить файл php, содержащий массив, на лету.
Еще один недостаток - как вы уже заметили, он доступен не во всех установках php.
Самым очевидным плюсом использования gettext() является, конечно, то, что исходная строка располагается там, где ей и место. Т.е. гораздо логичнее написать так
echo _("This is a string");
чем
echo $lang['a_string'];
Не говоря уже о том, что для каждого возможного перевода вам придется создавать новую переменную-заместитель. В gettext() в качестве индекса выступает сама строка перевода.