Использование PHP Gettext Extension против PHP массивов на многоязычных сайтах? - PullRequest
10 голосов
/ 23 февраля 2010

Пока что есть только две хороших вещи, которые я видел об использовании 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-МОДЕЛЕЙ:

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, но позже кто-то сказал мне, что я должен использовать массивы)

Ответы [ 5 ]

8 голосов
/ 08 октября 2010

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

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

Кроме того, это очень быстро и имеет некоторые дополнительные функции для множественного числа и тому подобного, также poedit, например, облегчает жизнь благодаря наличию БД перевода, поэтому вы не должны переводить одно и то же снова и снова, те, что вы уже делали, будут предварительно заполнены и помечены как «проверьте, правильно ли». Очень удобно.

theby middus отметил недостаток, что вам нужно скомпилировать po-файл, в то время как вы можете легко перезаписать php-файл при использовании массивов - хорошо, вы просто перезаписываете свой mo-файл, и если вы используете poedit, он выполняет компиляцию после сохранения файла , Таким образом, вы нажимаете сохранить и скопировать файл, как при редактировании php-файла.

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

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

7 голосов
/ 23 февраля 2010

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

5 голосов
/ 25 марта 2010

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

echo _("This is a string");

чем

echo $lang['a_string'];

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

4 голосов
/ 23 февраля 2010

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

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

Еще один минус, как вы уже узнали, не доступен на всех установках php.

0 голосов
/ 04 апреля 2014

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

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

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

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

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

...