Использование PHP Gettext Extension vs PHP-массивов на многоязычных сайтах?

До сих пор только две хорошие вещи, которые я видел об использовании gettext вместо массивов, это то, что мне не нужно создавать "приветствие" "подматрица" (или как бы то ни было его называемое). И мне не нужно создавать папку для "языка по умолчанию".

Есть ли другие преимущества и возможности использования gettext и php-массивов для многоязычных веб-сайтов?

ИСПОЛЬЗОВАНИЕ GETTEXT:

испанский /messages.po:

#: test.php:3
msgid "Hello World!"
msgstr "Hola Mundo"

index.php:

<?php echo _("Hello World!"); ?>
?

index.php языки = испанский:

<?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? Языки = испанский

<?php echo $lang['greeting']; ?> greeting turns to Hola Mundo

(я сначала начал с gettext, но не был поддержан в моем общем бесплатном хостинге Zymic. Я не хотел использовать Zend_translate, я нашел это слишком сложным для моей простой задачи, поэтому я, наконец, закончил использование php define, но позже кто-то сказал мне, что я должен использовать массивы)

Ответ 1

Используя 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 library от Данило Сегана.

Ответ 2

Я рекомендую использовать gettext, я делаю это в PHP в течение 5 лет с хорошими результатами.

Прежде всего, если вы используете echo _('my text to translate') и не имеете перевода для него, вы увидите исходную строку на выходе, что хорошо. Используя массивы типа echo $translation['were is my translation'], и их нет, вы ничего не увидите. но будьте осторожны, используя poedit и делая echo _('');, это не очень хорошая идея, poedit использует msgid "" для информации о проекте, которая, скорее всего, вы не хотите показывать свою аудиторию, поэтому нужно позаботиться о том, чтобы не пытаться перевести пустые строки:)

Также он очень быстрый и имеет некоторые дополнительные функции для множественного числа и прочее, а также poedit, например, облегчает жизнь, имея перевод db, поэтому вы не должны переводить один и тот же материал снова и снова, те, которые вы уже сделали, будут заполнены заранее и помечены как "проверьте, правильно ли это". Очень удобно.

thebymidus упомянутый недостаток, что вы должны скомпилировать po файл, в то время как вы можете легко перезаписать php файл при использовании массивов - ну вы просто перезаписываете свой mo файл тоже, а если используете poedit, он компилирует после сохранения файла, Так что на самом деле вы нажимаете save и копируете файл, sam, как при редактировании php файла.

Но реальным недостатком является использование mod_php. Имейте в виду, что с mod_php он не является потокобезопасным, хотя у меня никогда не было трудных проблем.

В основном, вы должны перезапустить apache при использовании mod_php или вызовы gettext не удастся (иногда переводы не возвращаются, иногда вы попадаете на любимую белую страницу без содержимого). Но, используя что-то вроде mod_itk (я считаю, cgi/fastcgi может это сделать), у вас даже не будет этой проблемы больше.

Ответ 3

Самый очевидный pro для использования gettext() - это, конечно, то, что исходная строка позиционируется там, где она принадлежит. То есть это имеет смысл написать это

echo _("This is a string");

чем

echo $lang['a_string'];

Не говоря уже о том, что вы должны создать новую переменную-заполнителя для каждого возможного перевода. С gettext() сама строка перевода действует как индекс.

Ответ 4

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

Однако pro gettext - это наличие огромной экосистемы инструментов, которые могут использовать переводчики вашего программного обеспечения (например, Poedit). Недостатком является то, что вам всегда нужно скомпилировать ваш .po до .mo, прежде чем развертывать его, пока вы можете просто заменить php файл, содержащий массив на лету.

Другой con, как вы уже узнали, не доступен на всех установках php.

Ответ 5

Когда пользователь выбирает любой язык из раскрывающегося списка или любой области, затем сохраняет выбранный язык в сеансе, например,

$_ SESSION [ 'язык'] = 1;

Теперь выберите данные из таблицы базы данных на основе идентификатора языка, сохраненного в сеансе.

Подробнее здесь

http://skillrow.com/multilingual-website-in-php-2/