Проблемы с кодировкой символов при переводе с английского на русский язык

Я использовал Poedit (работает на Win7) для генерации файлов .mo/.po для создания русской версии веб-страницы с использованием PHP gettext. Когда я вывожу русскую версию страницы, все символы отображаются в виде черных ромбов/квадратов.

Вот пример веб-страницы, демонстрирующей проблему:

http://cthorn.co.uk/localization/index.php

... и вот русская версия:

http://cthorn.co.uk/localization/index.php?locale=ru_RU

Код для index.php:

<?php require_once("locale/localization.php"); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
        <title>Test</title>
    </head>

    <body>
        <p><? echo _("This is the text to be translated."); ?></p>
    </body>
</html>

Код для файла localization.php:

<?php
    $locale = "en_GB";
    if (isSet($_GET["locale"])) $locale = $_GET["locale"];
    putenv("LC_ALL=$locale");
    setlocale(LC_ALL, $locale);
    bindtextdomain("messages", "./locale");
    textdomain("messages");
?>

Структура каталогов:

 - localization
    - locale
       - ru_RU
          - LC_MESSAGES
               messages.mo
               messages.po
         localization.php
      index.php

В Poedit я установил для «Charset» и «Charset исходного кода» значение UTF-8. «Язык» установлен как Russian, а «Страна» установлен как RUSSIAN FEDERATION.

Я убедился, что русский текст был скопирован из текстового файла в кодировке UTF-8 перед вставкой в ​​Poedit.

Что мне не хватает?

Вот messages.po, скопированный из Notepad++:

msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-11-16 10:49-0000\n"
"PO-Revision-Date: 2011-11-16 10:49-0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Poedit-KeywordsList: _;gettext;gettext_noop\n"
"X-Poedit-Basepath: C:\\websites\\cthorn.co.uk\\live\n"
"X-Poedit-Language: Russian\n"
"X-Poedit-Country: RUSSIAN FEDERATION\n"
"X-Poedit-SourceCharset: utf-8\n"
"X-Poedit-SearchPath-0: .\n"

#: localization/index.php:10
msgid "This is the text to be translated."
msgstr "Это текст для перевода."

Ах, извините, скачайте файлы с:

cthorn(точка)co(точка)uk/localization/locale/ru_RU/LC_MESSAGES/messages.mo cthorn(точка)co(dot)uk/localization/locale/ru_RU/LC_MESSAGES/messages.po

(Я могу опубликовать только две ссылки, так как я n00b)


person Chris    schedule 16.11.2011    source источник
comment
Я имею в виду сам файл. Текст определенно UTF-8 после того, как вы вставите его сюда)   -  person Eugene    schedule 16.11.2011


Ответы (2)


Убедитесь, что все в utf-8, и все будет отлично работать.

различные Content-кодировки всегда заканчиваются настоящей занозой в заднице **

person Frederick Behrends    schedule 16.11.2011
comment
Я думал, что я установил все в UTF-8? Я убедился, что для всех файлов PHP установлена ​​кодировка UTF-8. Как вы можете видеть в разделе ‹head›, кодировка установлена ​​​​как UTF-8, а в Poedit единственные значения кодировки символов, которые я смог найти («Charset» и «Source code charset»), установлены как UTF-8. - person Chris; 16.11.2011
comment
Кодировка вашего переведенного текста - ISO-8859-5, попробуйте установить <meta http-equiv="content-type" content="text/html; charset=ISO-8859-5" />, и вы увидите, поэтому, я думаю, должна быть проблема с вашими файлами, созданными POedit. Убедитесь, что текст, который вы вводите в POedit, также имеет кодировку UTF-8. - person Frederick Behrends; 16.11.2011
comment
Теперь я точно понимаю, что вы имеете в виду - спасибо. Сейчас попробую воссоздать файлы .mo/.po. - person Chris; 16.11.2011
comment
Пересборка файлов Poedit ничего не изменила. Я очень осторожно копировал текст UTF-8 из Notepad++ в Poedit, но без особого удовольствия. Изменение META-тега индексной страницы на ISO-8859-5 заставляет русский текст работать. Похоже, что Poedit автоматически принимает текст, закодированный в ISO-8859-5, а не в UTF-8. Я попробую программное обеспечение, отличное от Poedit, и посмотрю, решит ли оно проблему. - person Chris; 16.11.2011

Ну, русский текст на вашей странице - ISO-8859-5. Вопрос как он оказался в такой кодировке :) Можете показать свой .po файл?

УПД. Все в ваших файлах выглядит нормально. Единственное, о чем я могу думать, это попробовать это:

    setlocale(LC_ALL, $locale.'.utf8');
    bind_textdomain_codeset("messages", 'UTF-8');
person Eugene    schedule 16.11.2011
comment
Спасибо, но это не работает :( Все, что происходит, это то, что страница остается на английском языке независимо от ?locale=ru_RU. - person Chris; 16.11.2011
comment
Это может означать, что на сервере не полностью установлен русский языковой пакет. Запустите locale -a в консоли, если у вас есть доступ к серверу через оболочку. Это даст вам список поддерживаемых локалей. - person Eugene; 16.11.2011
comment
Теперь все работает, спасибо! Я проверил, какие языки были установлены с помощью <?php system('locale -a') ?>, и в списке был ru_RU.utf8. Возвращаясь к вашему первому предложению, я использовал setlocale(LC_ALL, $locale.'.utf8');, но не bind_textdomain_codeset("messages", 'UTF-8');, и вуаля, страница работает на кириллице. Спасибо! - person Chris; 16.11.2011