#php #internationalization #gettext
#php #интернационализация #gettext
Вопрос:
У меня есть PHP-приложение, использующее Gettext в качестве движка i18n. Перевод работает нормально, единственная проблема в том, что у меня проблемы с кодировкой символов UTF8. Мой PHP-код для загрузки gettext выглядит примерно так:
bindtextdomain( $domain, PATH_BASE . DS . "language" . DS );
$this->utf8Encode = strtolower($encoding) == "utf-8";
bind_textdomain_codeset($domain, $encoding);
textdomain($domain);
Мои шаблоны отображают страницы с использованием кодировки utf8, и я пробовал практически все, чтобы загрузить правильную кодировку. Для текущей локали, которую я загружаю SL_sl, имена отображаются правильно, но имеют проблемы с символами UTF8, поэтому там, где он должен появиться Država
, он появляется Dr?ava
Ответ №1:
Итак, это случалось раньше, и теперь это случилось снова, я сам нашел решение! Проблема заключалась в том, что, как я уже сказал @bozdoz, я уже преобразовывал текст в формате UTF8, но я не понял, что функция gettext возвращает строку UTF8, поэтому, если вы сделаете это:
$encoded = utf8_encode($utf8String);
Тогда у вас будет действительно неприятная ошибка, когда $utf8String
это фактическая строка UTF8. Поэтому я внес некоторые изменения в свой код, и метод перевода (упрощенный) оказался таким:
$translation = gettext($singular);
$encoded = $this->utf8Encode ? $this->Utf8Encode($translation) : $translation;
И Utf8Encode
метод такой:
private function Utf8Encode( $text )
{
if ( mb_check_encoding($text, "utf8") == TRUE ){
return $text;
return utf8_encode($text);
}
Я надеюсь, что если у кого-то такая же ошибка, это может помочь!
Ответ №2:
Из частичной информации, которую я могу предложить вам взглянуть на фактические файлы mo / po, в poedit есть несколько предупреждений о кодировке utf8. Предполагая, что все остальное правильно (мета, заголовки и т.д.), Это единственное, что осталось проверить
Комментарии:
1. Проблема не в файлах mo / po, потому что я проверил их кодировку, и они в порядке.
Ответ №3:
Попробуйте закодировать его с помощью utf8_encode(). Я не могу сказать из вашего кода, но, возможно, это можно было бы реализовать следующим образом:
utf8_encode($domain);
Комментарии:
1. Нет, я пробовал это, кроме того, весь мой проект проверяет строки UTF8 перед выводом и вводом. в любом случае спасибо. кстати, $domain — это просто имя домена для переводов