Структура директории 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');
?>