Gettext неправильно обнаруживает utf8 в PHP

#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 — это просто имя домена для переводов