До сих пор только две хорошие вещи, которые я видел об использовании gettext вместо массивов, – это то, что мне не нужно создавать «приветствие» «подматрица» (или как бы то ни было его называемое). И мне не нужно создавать папку для «языка по умолчанию».
Существуют ли другие плюсы и минусы использования gettext и php-массивов для многоязычных сайтов?
ИСПОЛЬЗОВАНИЕ GETTEXT:
испанский / messages.po:
#: test.php:3 msgid "Hello World!" msgstr "Hola Mundo"
index.php:
<?php echo _("Hello World!"); ?>
index.php? LANG = испанский:
<?php echo _("Hello World!"); ?> turns to Hola Mundo
ИСПОЛЬЗОВАНИЕ PHP ARRAYS:
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 = испанский
<?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 от Danilo Segan.
Я рекомендую использовать gettext
, я делаю это на PHP в течение 5 лет с хорошими результатами.
Прежде всего, если вы используете echo _('my text to translate')
и не имеете перевода для него, вы увидите исходную строку на выходе, что хорошо. Использование таких массивов, как echo $translation['were is my translation']
и их нет, вы ничего не увидите. но будьте осторожны, используя poedit и делая echo _('');
это не очень хорошая идея, poedit использует msgid ""
для информации о проекте, которая, скорее всего, вы не хотите показывать свою аудиторию, поэтому нужно позаботиться о том, чтобы не пытаться переводить пустые строки 🙂
Кроме того, это очень быстро и имеет некоторые дополнительные функции для множественного числа и прочее, а также poedit, например, облегчает жизнь, имея перевод db, поэтому вы не должны переводить один и тот же материал снова и снова, те, которые вы уже сделали, будут заполнены и отмечены как «проверьте, правильно ли это». Очень комфортно.
что вы должны скомпилировать po-файл, в то время как вы можете легко перезаписать php-файл при использовании массивов – ну вы просто перезаписываете свой mo-файл тоже, а если используете poedit, он компилирует после сохранения файла. Так что на самом деле вы нажимаете save и копируете файл, sam, как при редактировании php-файла.
Но реальный недостаток, если вы используете mod_php
. Имейте в виду, что с mod_php
он не является потокобезопасным, хотя у меня никогда не было серьезных проблем.
В основном просто нужно перезапустить apache при использовании mod_php или вызовы gettext
не удастся (иногда переводы не вернутся, иногда вы попадаете на любимую белую страницу без содержимого). Но, используя что-то вроде mod_itk (я считаю, cgi / fastcgi может это сделать), у вас даже не будет этой проблемы больше.
Наиболее очевидным pro для использования gettext (), конечно, является то, что исходная строка позиционируется там, где она принадлежит. Т.е. имеет смысл написать это
echo _("This is a string");
чем
echo $lang['a_string'];
Не говоря уже о том, что вы должны создать новую переменную-заполнителя для каждого возможного перевода. С gettext () сама строка перевода действует как индекс.
По-моему, не имеет смысла использовать двоичный формат (файлы .mo gettext) для динамического языка, такого как php.
Тем не менее, pro gettext – это наличие огромной экосистемы инструментов, которые могут использовать переводчики вашего программного обеспечения (например, Poedit ). Недостатком является то, что вам всегда нужно скомпилировать ваш .po до .mo, прежде чем развертывать его, в то время как вы можете просто заменить php-файл, содержащий массив на лету.
Другой con, как вы уже узнали, недоступен на всех установках php.
Когда пользователь выбирает любой язык из раскрывающегося списка или любой области, затем сохраняет выбранный идентификатор языка в сеансе, например,
$ _SESSION [ 'язык'] = 1;
Теперь извлеките данные из «содержимого» таблицы базы данных на основе идентификатора языка, хранящегося в сеансе.
Подробнее здесь