Структура директории php gettext в разных средах

Я использую gettext для интернационализации для моих файлов PHP. У меня есть два сервера; сервер песочницы и сервер релизов. в песочнице на сервере такой каталог, как locale/LC_MESSAGES/en не работает и я должен использовать locale/LC_MESSAGES/en_GB вместо. Но с "en_GB" он не работает на моем производственном сервере, а "en" работает нормально. для некоторых языков, таких как португальский, у меня есть pt_PT и pt_BR (бразильский португальский). Поэтому я предпочитаю использовать структуру "A_B".

Я понятия не имею, как gettext обнаруживает эти папки. Есть ли стандартный способ использовать ту же структуру папок?

1 ответ

Решение

Если вы используете свой код в Linux, gettext работает только с локалями, уже установленными в ОС. Это означает, что если вы установите язык en_GB тогда, если единственная установленная локаль en_GB.utf8 или же en_USтогда вы не получите переводы.

Попробуйте это в обеих ваших средах и сравните результаты:

locale -a

Это дает вам список всех установленных локалей:

en_US
en_US.ISO8859-1
en_US.ISO8859-15
en_US.US-ASCII
en_GB
en_GB.utf8
de_DE

de_DE.utf8
C
POSIX

Теперь вам нужно убедиться, что в обеих средах установлены одинаковые локали; Если тебе надо en_US.utf8, en_AU, а также en_AU.utf8, вы можете создать недостающие локали на основе существующей (читайте localedef чтобы узнать подробности):

sudo localedef -c -i en_US -f UTF-8 en_US.utf8
sudo localedef -c -i en_GB -f UTF-8 en_AU
sudo localedef -c -i en_GB -f UTF-8 en_AU.utf8

Кроме того, то, что следует, является общей передовой практикой использования gettext на PHP:

<?php

    // Set language to German
    putenv('LC_ALL=de_DE.utf8');
    setlocale(LC_ALL, 'de_DE.utf8');

    // Specify location of translation tables
    bindtextdomain("myPHPApp", "./locale");

    // Choose domain
    textdomain("myPHPApp");

    // Translation is looking for in ./locale/de_DE.utf8/LC_MESSAGES/myPHPApp.mo now

    // Print a test message
    echo gettext("Welcome to My PHP Application");

    // Or use the alias _() for gettext()
    echo _("Have a nice day");

?>

Хотя вы можете просто сбросить кодировку и просто de_DE, но хорошей практикой является использование набора символов в локали, так как в некоторых конкретных случаях вам может потребоваться поддержка содержимого в наборах символов, отличных от Юникода. Увидеть ниже

<?php

  // Set language to German written in Latin-1
  putenv('LC_ALL=de_DE.ISO8859-1');
  setlocale(LC_ALL, 'de_DE.ISO8859-1');

?>
Другие вопросы по тегам