Как загрузить язык с помощью gettext в PHP?
Вопрос
Я создал языковой файл в poedit для использования функции PHP gettext, теперь на странице, на которой я пытаюсь его протестировать, я не могу заставить его найти / загрузить созданный мной файл .po или .mo, кто-нибудь видит, что я делаю неправильно?
$locale = "en_US";
putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
bindtextdomain("default", "/includes/locale");
textdomain("default");
//my .po ad .mo file is located here /includes/locale/en/default.mo
Несмотря на то, что я пытаюсь загрузить файл английского языка по умолчанию, я изменил некоторый текст в файле, чтобы убедиться, что он читается из языкового файла, и в настоящее время он показывает только текст по умолчанию и не выполняет перевод, я думаю, что, возможно, у меня неправильный путь
Решение
Наконец-то у меня это заработало, я публикую здесь, так что, возможно, это может помочь кому-то еще, я думаю, это несколько сбивает с толку то, как это задокументировано.
Для этой демонстрации я буду использовать FR для французского языка
$locale = "fr_fr";
putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
bindtextdomain("default", "/includes/locale");
textdomain("default");
В bindtextdomain
функция выше первый параметр - это имя языкового файла .po за вычетом расширения.Второй параметр - это путь к папке, именно здесь он становится немного сложным / недокументированным...В папке, которую вы задаете здесь, вы должны создать папку для каждого языка с его 2-значным кодом страны, затем внутри этой папки с кодом страны я должен был добавить эту папку с именем LC_MESSAGES
, внутри LC_MESSAGES
находится там, где ваш default.po
файл отправляется.
Это был единственный способ заставить его работать, немного сбивающий с толку, поскольку путь к папке lang здесь ничего не упоминает о выделенной жирным шрифтом части:
языковая папка/fr_FR/LC_MESSAGES fr_FR/LC_СООБЩЕНИЯ/по умолчанию.po
Хотя это все еще действительно странно, default.po
работает для меня, но если я изменю его на что-то другое в приведенном выше коде, а затем изменю имя файла .po и .mo, чтобы оно соответствовало, оно больше не будет работать, работает только с default
имя для меня, я начинаю думать, может быть, gettext выполняет какое-то закулисное кэширование
Другие советы
Я подозреваю, что это ваш путь.
Является ли "/includes/locale" правильным каталогом на вашем хостинге?Или это связано с чем-то?Примечание:вам нужен полный путь, не относящийся к вашему домашнему каталогу или каталогу установки.так что это может быть что-то вроде:
- C:/xampp/htdocs/include/locale
- /var/www/включить/локаль
- /главная страница/имя пользователя/включить/язык
- и т.д.
Каков полный каталог, в котором он найден?