Локализация, русификация и кодировки
- Какое-то решение проблем с парсером, который не умеет читать русские буквы для php5 и кодировки windows-1251
- Как сделать дату в выводимых новостях на русском языке
- Сайт выводится в неверной кодировке. Если выставляю в браузере кодировку вручную, то всё OK
- Я поставил Joomla а там везде нечитаемый текст вместо русских букв
- Ситуация вокруг Joomla и UTF-8
- Как вылечить плохую кодировку дампа, если данные на сайте отображаются нормально, но читаемый дамп создать не удается
Итак. Имеем исходную тему - если мы создаем модуль и в нем указываем url rss-фида написанного в кодировке windows-1251, то на выходе имеем неприятный баг - знаки вопроса вместо буковок. Для решения этого можно попробовать применить следующий патч. Патч будет работать только для php5 с поддержкой iconv и на Joomla RE.
Прежде всего делаем бэкап всех изменяемых файлов. Не факт что это сработает.
Идем в \includes\domit\xml_domit_rss_shared.php и ищем функцию function getTextFromFile() в ее конец вставляем вот что
if ($fileContents == '') {
$this->establishConnection($filename);
$response =& $this->httpConnection->get($filename);
if ($response != null) {
$fileContents = $response->getResponse();
}
}
}
preg_match("||Umsi",$fileContents,$m);
$fileContents = iconv($m[1],'utf-8',$fileContents);
$fileContents = str_replace($m[1],'utf-8',$fileContents);
return $fileContents;
} //getTextFromFile
Далее в этом же файле ищем функцию function getElementText($elementName) и пишем
function getElementText($elementName) {
$elementName = strtolower($elementName);
return iconv('utf-8','windows-1251',$this->_getElementText($elementName, $this->DOMIT_RSS_indexer));
//return $this->_getElementText($elementName, $this->DOMIT_RSS_indexer);
} //getElementText
Теперь открываем /includes/frontend.html.php и функцию function modoutput_feed(). В ней надо удалить все вхождения
$что_то_там = mosCommonHTML::newsfeedEncoding( $rssDoc, $что_то_там );
Я удалил их для переменных (в скобочках указана приблизительная строка): $feed_title (173), $feed_descrip (189), $item_title (226), $text (253)
То же самое решение для компонента com_newsfeeds (и снова для пхп5).
Нужно сделать тот же самый хак rss-xml парсера (/includes/domit/xml_domit_rss_shared.php) и удалить строчки (всего их четыре) в файле /components/com_newsfeeds/newsfeeds.html.php в функции function showNewsfeeds()
$feed_title = mosCommonHTML::newsfeedEncoding( $rssDoc, $feed_title );
+ для переменных $feed_descrip, $item_title, $text.
2. Как сделать дату в выводимых новостях на русском языке
Во-первых надо настроить локаль. Для этого идем в глобальную конфигурацию и на вкладке Locale настраиваем локаль страны. Для windows нужно написать ru (или RU), для юникса надо попробовать различные варианты: ru_RU, ru_RU.CP1251. По умолчанию в этом поле стоит en_GB. Во-вторых открываем файл /language/russian.php и находим определение константы
DEFINE('_DATE_FORMAT_LC',"%A, %d %B %Y");
Собственно это и есть формат выводимой даты. Если он вас устроит то можно все оставить как есть. Скорее всего (если с локалью все в порядке) дата будет на русском языке. Если он вас не устраивает, то вот возможные модификаторы, которые можно применять здесь (полный список можно увидеть здесь http://www.php.net/manual/ru/function.strftime.php)
%A - название дня недели в текущей локали
%B - название месяца в текущей локали
%d - день месяца в виде десятичного числа (от 01 до 31)
%H - номер часа от 00 до 23
%M - минуты
%S - секунды
%Y - год, включая столетие
%y - год, без столетия - последние 2 цифры
3. Сайт выводится в неверной кодировке. Если выставляю в браузере кодировку вручную, то всё OK
Все примеры даны для сайта в кодировке windows-1251 (Если кодировка вашего сайта UTF-8 или другая, то в коде надо заменять windows-1251 на вашу кодировку). Очень часто подобная проблема возникает на зарубежных серверах, админам которых неведомы кодировки, кроме iso-8859-1. Возможные пути исправления:
1. Надо создать файл .htaccess (или дополнить его)(ДА, НЕ УДИВЛЯЙТЕСЬ, ФАЙЛ НАЧИНАЕТСЯ С ТОЧКИ) следующей строчкой:
AddDefaultCharset windows-1251
или сразу три директивы
AddDefaultCharset windows-1251
CharsetSourceEnc windows-1251
CharsetDisable On
2. Проверьте, что написано в строке
3. Проверьте http-заголовок ответа сервера. Для этого зайдите на эту страницу, введите адрес своего сайта и затем ищите строку с Content-Type.
Должно быть так
Content-Type: text/html; charset=WINDOWS-1251
Если такой строки вообще нет, то открываем файл index.php в корне Joomla и добавляем
header( 'Content-Type: text/html; charset=windows-1251' );
после
header( 'Pragma: no-cache' );
4. Я поставил Joomla а там везде нечитаемый текст вместо русских букв
Тут возможны два варианта решения - простой и сложный. Простой состоит в добавлении некоторых запросов в файл database.php, а сложный в полной переустановке Joomla.
1. Сами запроcы, которые надо добавить, приведены во втором пункте данного вопроса. Просто дописываем куда надо mysql_query и проверяем как работает сайт. Если знаков вопроса или закорючек больше нет, значит все нормально. Ничего больше делать не надо.
2. Промежуточный вариант - подходит если вы только что установили Joomla, а вместо букв знаки вопроса. Вам надо внести изменения в файл database.php восстановить папку installation из дистрибутива и удалить файл configaration.php. После этого надо попробовать установить ее снова. Должно сработать.
3. Если первый пункт не сработал, то надо ее переустановить. Но до этого сделать несколько дополнительных вещей (Этот способ решения проблемы не относится к варианту, когда у вас уже стоит и работает сайт, и вы начинаете в таблицах менять кодировки, это не поможет - здесь рассматривается вопрос "я поставил - русских буковок нет", вопросы переноса сайта тут не рассматриваются, если вы хотитет узнать именно про тот как же переносить сайт с локального компьютера в интернет - прочтите статью Перенос Joomla). Ниже описана последовательность действий:
* В phpMyAdmin изменить кодировку для вашей базы в cp1251 (или создать базу в этой кодировке)
* Открыть /installation/sql/joomla.sql и заменить каждую команду создания таблицы (таблиц много)
Заменить
CREATE TABLE `#__какая-то_таблица` (
на
CREATE TABLE `#__какая-то_таблица`(
поле1 таблицы,
поле2 таблицы
)
{ТУТ МОЖЕТ СТОЯТЬ TYPE=MyISAM ИЛИ AUTO_INCREMENT=1} DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci;
Подправить файл /includes/database.php примерно на 100 строке, так что бы там было следующее
$this->_table_prefix = $table_prefix;
@mysql_query("SET NAMES 'cp1251'", $this->_resource);
@mysql_query( "set session character_set_server=cp1251", $this->_resource );
@mysql_query( "set session character_set_database=cp1251", $this->_resource );
@mysql_query( "set session character_set_connection=cp1251", $this->_resource );
@mysql_query( "set session character_set_results=cp1251", $this->_resource );
@mysql_query( "set session character_set_client=cp1251", $this->_resource );
$this->_ticker = 0;
$this->_log = array();
Только после этого можно попытаться ее ставить
5. Ситуация вокруг Joomla и UTF-8
Общеизвестно, что кодировка UTF считается самой оптимальной для создания многоязычных сайтов. Конечно, если текст на сайте написан в одной кодировке (просто на русском языке), то большого смысла задумываться о ней нет. Так же ее можно не применять на псевдо-двуязычных сайтах на которых расположен текст на английском языке и каком-либо другом, потому что английский язык в любой кодировке всегда будет выводиться правильно (набор символов a-zA-Z).
Не надо думать, что сделав поддержку UTF на своем сайте вы сразу же попадаете в касту тех, кто может использовать UTF-расширения сторонних производителей. Чаще всего заявление "UTF-совместимости" не имеет ничего общего с реальностью и несет лишь цель прорекламировать себя в лучшем свете. О реальной работе с UTF никто не задумывается, потому что чаще всего такие расшерения производят англоговорящие программисты, для которых набор букв a-zA-Z в какой угодно кодировке будет всегда одним и тем же.
Вопрос встает лишь тогда, когда нам нужно создать реальную многоязычность, точнее не многоязычность а именно обеспечить наличие двух различных языков (например, русского и французского) на одной и той же странице. Можно конечно писать все тексты в кодировке ISO-8859, но минус таких текстов будет в том, что размеры базы данных для их хранения будут непозволимо большими, да и кроме того стандартных способов реализовать ввод сразу двух и более различных наборов символов не может ни один редактор.
Выходом является использование кодировки UTF. Для сайтов построенных на Joomla версии 1.5 и выше проблем в принципе не может возникнуть - она в полной мере ее поддерживает.
Для версий 1.0.x проблемы возникают. Необходимо отметить, что простая перекодировка текста из кодировки cp1251 (локализованная версия) в UTF-8 проблемы не решает. Для обеспечения работы с UTF требуется поддержка именно на уровне CMS (или PHP). В 1.5 и далее такая поддержка есть, в 1.0.х ее нет (поддержка касается работы строковых функций).
Существует половинчатый выход из данной ситуации - использовать перекодированную в UTF русскую локализацию. В данной версии база данных тоже использует данную кодировку для хранения данных и для передачи запросов внутри соединения (utf8_general_ci). Помимо этого кодировка в шаблоне тоже должна быть UTF-8. Скорее всего проблем не возникнет. Но если возникнут - никто ответственности не несет, по понятным обстоятельствам. Полного решения для версий 1.0.х не существует (иначе как переписать некоторую часть самой CMS).
6. Как вылечить плохую кодировку дампа, если данные на сайте отображаются нормально, но читаемый дамп создать не удается
1. Во-первых получаем чистый дамп файла при помощи консольной утилиты (нужен доступ по SSH)
mysqldump.exe -u ИМЯ_ПОЛЬЗОВАТЕЛЯ -p ПАРОЛЬ --default-character-set=latin1 > sitedump.sql
2. В файле sitedump.sql заменяем
CHARSET=utf8; на CHARSET=cp1251;
3. В начале этого файла добавляем строчку если её нет
set names cp1251;
4. (Не обязательно) Если дамп читаем то спасаем себя от дальнейших проблем залив его в свежесозданную таблицу.
Similar material
Вопросы по языку PHP
Выдается ошибка “Syntax error, unexpected XXX in …”. Как ее решить?Как определить абсолютный путь к папке с JoomlaЯ поставил компонент, а в нем возникают непонятные ошибки...
Выдается ошибка “Syntax error, unexpected XXX in …”. Как ее решить?Как определить абсолютный путь к папке с JoomlaЯ поставил компонент, а в нем возникают непонятные ошибки...
Безопасность
Как мне защитить сайт от взломаЧто такое chmod/чмод и права файлов (777, 664 и т.д. )А если меня взломали как мне проанализировать ситуацию, предотвратить такое в...
Как мне защитить сайт от взломаЧто такое chmod/чмод и права файлов (777, 664 и т.д. )А если меня взломали как мне проанализировать ситуацию, предотвратить такое в...
Интерфейс пользователя
Какая страница считается главной, что делать, если я хочу заменить frontpage на свою главную?Установил компонент com_xxx, а как до него добраться-то?Как убрать на сайте...
Какая страница считается главной, что делать, если я хочу заменить frontpage на свою главную?Установил компонент com_xxx, а как до него добраться-то?Как убрать на сайте...
Joomla и SEF
Как включить SEF, как его использоватьОшибка: "Not Found The requested URL /content/view/1/21/ was not found on this server"Как включить mod_rewrite на локальном...
Как включить SEF, как его использоватьОшибка: "Not Found The requested URL /content/view/1/21/ was not found on this server"Как включить mod_rewrite на локальном...