UTF-8 и русский язык

Вопросы, связанные с локализацией phpBB 2.0.x
Дятелл
phpBB 1.0.0
Сообщения: 7
Зарегистрирован: 07.04.2006 15:41

Сообщение Дятелл » 22.04.2006 15:42

если режутся ТОЛЬКО ники, а не темы и скажем ещё что-то....
и режутся не все а только длинные....

то надо полезть в код и посмотреть как там обрабатывается ник.
-при регистрации
-при показе ника.

вполне возможно что считают байты а не символы.

в php были ошибки при работе с мультибайт-строками, как раз кажется в функции substr
поставить php4.4 и проверить - минутное дело во FreeBSD - из портов.

P.S. по количеству бредятинок в коде phpbb держит наверное второе место после oscommerce :-)

Xpert
phpBB Guru
phpBB Guru
Сообщения: 5484
Зарегистрирован: 13.03.2004 21:27
Поблагодарили: 2 раза

Сообщение Xpert » 22.04.2006 21:04

Дятелл писал(а):P.S. по количеству бредятинок в коде phpbb держит наверное второе место после oscommerce
Например? Что-нибудь в студию, пожалуйста.
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений

danilevsky
phpBB 1.0.0
Сообщения: 8
Зарегистрирован: 15.04.2006 13:56

Сообщение danilevsky » 22.04.2006 21:22

Вот только что нашел эти йо...ые функции, вот они то неправильно режут мультибайтные строки:

Код: Выделить всё

function phpbb_clean_username($username)
{
	$username = substr(htmlspecialchars(str_replace("\'", "'", trim($username))), 0, 25);
	$username = phpbb_rtrim($username, "\\");
	$username = str_replace("'", "\'", $username);

	return $username;
}

function phpbb_rtrim($str, $charlist = false)
{
	if ($charlist === false)
	{
		return rtrim($str);
	}
	
	$php_version = explode('.', PHP_VERSION);

	// php version < 4.1.0
	if ((int) $php_version[0] < 4 || ((int) $php_version[0] == 4 && (int) $php_version[1] < 1))
	{
		while ($str{strlen($str)-1} == $charlist)
		{
			$str = substr($str, 0, strlen($str)-1);
		}
	}
	else
	{
		$str = rtrim($str, $charlist);
	}

	return $str;
}
пробовал менять substr на mb_substring не помогло.
помогло только в лоб поменять 25 на 50, теперь нормально.
Но чувствует мое сердце, что это не правильно. :)

Xpert
phpBB Guru
phpBB Guru
Сообщения: 5484
Зарегистрирован: 13.03.2004 21:27
Поблагодарили: 2 раза

Сообщение Xpert » 22.04.2006 21:44

Как-то вот так, выдрано из search.php

Код: Выделить всё

//
// encoding match for workaround
//
$multibyte_charset = 'utf-8, big5, shift_jis, euc-kr, gb2312';

...

if (strstr($multibyte_charset, $lang['ENCODING']))
{
...
}
else
{
...
}
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений

Аватара пользователя
RWinner
phpBB 1.4.4
Сообщения: 160
Зарегистрирован: 08.01.2006 8:18
Благодарил (а): 15 раз
Поблагодарили: 1 раз

Сообщение RWinner » 22.04.2006 23:41

Дятелл писал(а): P.S. по количеству бредятинок в коде phpbb держит наверное второе место после oscommerce :-)
А я-то и думаю - чего oscommerce такой популярный? А оно вона как! :wink:
Давненько я здесь не был... (-:

Аватара пользователя
direqtor
phpBB 1.4.1
Сообщения: 43
Зарегистрирован: 07.06.2006 4:54
Откуда: Владивосток

Сообщение direqtor » 07.06.2006 5:39

Добавлю свой способ перекодировки на лету.
В файле includes/functions.php добавляем функцию:

Код: Выделить всё

function charset_encoder ($from, $to, &$array) {

   foreach ($array as $a=>$b) if (gettype ($b)=='array') {

      charset_encoder ($from, $to, $b);
      $array[$a] = $b;

   } else {

      $array[$a] = iconv ($from, $to, $b);

   }

}
В том же файле изменяем функцию init_userprefs, после включения файла языка пишем код, изменяющий кодировку в массиве $lang

Код: Выделить всё

$from = strtoupper ($lang['ENCODING']);
$to = 'UTF-8';
charset_encoder ($from, $to, $lang);
$lang['ENCODING'] = 'utf-8';
И, наконец, в файле includes/emailer.php меняем код метода класса use_template, перед return true; вставляем код

Код: Выделить всё

if (eregi('Charset\:[[:space:]]+([.a-z0-9-]+)', $this->msg, $regs)) {

   $from = strtoupper ($regs[1]);
   $this->msg = eregi_replace ('Charset\:[[:space:]]+([.a-z0-9-]+)', 'Charset: utf-8', $this->msg);
   $this->msg = iconv ($from, 'UTF-8', $this->msg);

}
Все это работает на http://areal.asiadata.ru. В рассылке сообщений можно отправлять иероглифы совместно с русским текстом. Можно на ходу изменять интерфейс (их у меня три: русский, китайский, английский). Остальное не тестировал пока. Потестирую - сообщу результаты.
Конечно, для применения этого метода на действующем форуме придется сперва перекодировать в UTF-8 всю базу данных.

Jos
phpBB 1.0.0
Сообщения: 1
Зарегистрирован: 03.07.2006 19:21
Откуда: Israel

Сообщение Jos » 03.07.2006 19:45

direqtor писал(а):Добавлю свой способ перекодировки на лету.
Хороший способ, все работает!

Я добавил некоторые изменения, позволяющие менять на лету язык интерфейса форума, нажав на иконку языка. Результат можно посмотреть тут

Версия 2.0.21. В самом начале функции init_userprefs() в includes/functions.php:

Код: Выделить всё

if ( isset( $_GET['lang'] ) ) {
    $default_lang = $_GET['lang'];
    $default_lang = htmlspecialchars( $default_lang );
} else {
    // Old code starts here
    if ( $userdata['user_id'] != ANONYMOUS )
    ...
    else {
        $default_lang = phpbb_ltrim(basename(phpbb_rtrim($board_config['default_lang'])), "'");
     }
    // Old code ends here
}

В результате, если добавить ?lang=english|russian|hebrew в URL запроса, то в профиле пользователя запомнится его выбор языка без того, чтобы он должен был заходить на страницу профиля.

Добавлено спустя 10 минут 51 секунду:
direqtor писал(а):Конечно, для применения этого метода на действующем форуме придется сперва перекодировать в UTF-8 всю базу данных.
Именно, а как это сделать, чтобы все нормально перенеслось? Я так понимаю есть две проблемы: собственно сама перекодировка и перенос сообщений.

Перекодировка - пробовал сделать backup старой базы (таблицы постов) и перекодировать в редакторе. Не вышло. Старая база тоже была UTF8, но интерфейс был в кодировке 1251. :roll:

Перенос сообщений (еще не дошел до этого) тоже будет проблематичен - ведь id сообщений в старой базе могут наложиться на id в новой (которая уже активна).

Заранее благодарю за конструктивные советы.

Аватара пользователя
direqtor
phpBB 1.4.1
Сообщения: 43
Зарегистрирован: 07.06.2006 4:54
Откуда: Владивосток

Сообщение direqtor » 31.07.2006 14:03

Именно, а как это сделать, чтобы все нормально перенеслось?
Перекодировка - пробовал сделать backup старой базы (таблицы постов) и перекодировать в редакторе. Не вышло. Старая база тоже была UTF8, но интерфейс был в кодировке 1251.
Заранее благодарю за конструктивные советы.
Мои хостеры с Фарпоста обновили phpMyAdmin на версию 2.8.0.2, а там очень интересные добавления на заглавной и на странице импорта таблиц.
На заглавной странице можно выбрать кодировку базы данных, например utf-8. А при импорте дампа таблицы или базы можно указать кодировку исходных данных. И все текстовые данные на лету перекодируются.
Я думаю, это поможет.
Правда, сам сперва матом ругался. У меня в одной таблице для сайта несколько языков одновременно, каждый в своей кодировке. Так мне все перекоддировала, что при взгляде на сайт волосы дыбом встали. Но там можно выбрать опцию binary, и тогда текст не перекодируется.

danilevsky
phpBB 1.0.0
Сообщения: 8
Зарегистрирован: 15.04.2006 13:56

Сообщение danilevsky » 05.08.2006 8:17

direqtor, отлично!!! Ты просто герой!! Наконец-то юникод заработал нормально! Хочу еще заметить что нужно текстовые поля в базе данных увеличить в двое, потому как юникод в два раза больше места жрет. После увеличения текстовых полей не будет резать ники, темы...

Аватара пользователя
Diesel
phpBB 1.4.1
Сообщения: 45
Зарегистрирован: 12.07.2006 4:32

Сообщение Diesel » 23.08.2006 9:44

direqtor,
подскажите пожалуйста по подробнее где именно это нужно поставить:
direqtor писал(а):В файле includes/functions.php добавляем функцию:
и
direqtor писал(а):В том же файле изменяем функцию init_userprefs, после включения файла языка пишем код, изменяющий кодировку в массиве $lang
(если будет время, то пожалуйста по подробнее как в модах)
очень долго уже ищу решение этой проблеммы и наконец с помощью Эксперта нашел.
мне для этофо нужно:
http://phpbbguru.net/community/viewtopi ... highlight=
заранее спасибо!

Аватара пользователя
direqtor
phpBB 1.4.1
Сообщения: 43
Зарегистрирован: 07.06.2006 4:54
Откуда: Владивосток

Сообщение direqtor » 24.08.2006 6:50

Diesel писал(а):(если будет время, то пожалуйста по подробнее как в модах)
очень долго уже ищу решение этой проблеммы и наконец с помощью Эксперта нашел.
мне для этофо нужно:
http://phpbbguru.net/community/viewtopi ... highlight=
заранее спасибо!
Из меня все-таки phpbbguru, как из балерины сталевар :) Мало я есчё с ним якшаюсь. Даже толком не пойму с чем едят эти моды :shock: Но с этим модом разобраться легко. Ответ я запостил.

Касаемо изменений в includes/functions.php, то лишнюю функцию можно добавить в любом его месте, только не внутри другой функции. :)

Привожу так же полный код измененной функции init_userprefs

Код: Выделить всё

// Initialise user settings on page load
function init_userprefs($userdata)
{
	global $board_config, $theme, $images;
	global $template, $lang, $phpEx, $phpbb_root_path;
	global $nav_links;

	if ( $userdata['user_id'] != ANONYMOUS )
	{
		if ( !empty($userdata['user_lang']))
		{
			$board_config['default_lang'] = $userdata['user_lang'];
		}

		if ( !empty($userdata['user_dateformat']) )
		{
			$board_config['default_dateformat'] = $userdata['user_dateformat'];
		}

		if ( isset($userdata['user_timezone']) )
		{
			$board_config['board_timezone'] = $userdata['user_timezone'];
		}
	}

	if ( !file_exists(@phpbb_realpath($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_main.'.$phpEx)) )
	{
		$board_config['default_lang'] = 'english';
	}

	include($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_main.' . $phpEx);

	if ( defined('IN_ADMIN') )
	{
		if( !file_exists(@phpbb_realpath($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_admin.'.$phpEx)) )
		{
			$board_config['default_lang'] = 'english';
		}

		include($phpbb_root_path . 'language/lang_' . $board_config['default_lang'] . '/lang_admin.' . $phpEx);
	}

	//
	// DIREQTOR CODE BEGIN
	//
	$from = strtoupper ($lang['ENCODING']);
	$to = 'UTF-8';
	drqCharsetEncoder ($from, $to, $lang);
	$lang['ENCODING'] = 'utf-8';
	//
	// DIREQTOR CODE END
	//

	//
	// Set up style
	//
	if ( !$board_config['override_user_style'] )
	{
		if ( $userdata['user_id'] != ANONYMOUS && $userdata['user_style'] > 0 )
		{
			if ( $theme = setup_style($userdata['user_style']) )
			{
				return;
			}
		}
	}

	$theme = setup_style($board_config['default_style']);

	//
	// Mozilla navigation bar
	// Default items that should be valid on all pages.
	// Defined here to correctly assign the Language Variables
	// and be able to change the variables within code.
	//
	$nav_links['top'] = array ( 
		'url' => append_sid($phpbb_root_path . 'index.' . $phpEx),
		'title' => sprintf($lang['Forum_Index'], $board_config['sitename'])
	);
	$nav_links['search'] = array ( 
		'url' => append_sid($phpbb_root_path . 'search.' . $phpEx),
		'title' => $lang['Search']
	);
	$nav_links['help'] = array ( 
		'url' => append_sid($phpbb_root_path . 'faq.' . $phpEx),
		'title' => $lang['FAQ']
	);
	$nav_links['author'] = array ( 
		'url' => append_sid($phpbb_root_path . 'memberlist.' . $phpEx),
		'title' => $lang['Memberlist']
	);

	return;
}

Моя добавка начинается с DIREQTOR CODE BEGIN
Правда, в вашей версии phpbb остальной код может отличаться, будте внимательны

druidos
phpBB 1.0.0
Сообщения: 1
Зарегистрирован: 24.04.2006 15:23

Сообщение druidos » 12.09.2006 18:18

Еще вопрос:

И база, и сайт - utf-8. Поиск работает.

А вот авто Автоцензор не работает на руские символы, т.е. работает только на слова, где все символы латинские.

Собака, как понимаю, порылась в файле functions.php, в функции obtain_word_list, в строчке:

Код: Выделить всё

$orig_word[] = '#\b(' . str_replace('\*', '\w*?', preg_quote($row['word'], '#')) . ')\b#i';
Почитав связанное с функцией preg_replace, понял, что надо добавить модификатор u.

Так вот и вопрос - в каком месте этот u ставить, пробовал разные варианты - не получается? :(

Аватара пользователя
Гога
phpBB 2.0.0
Сообщения: 220
Зарегистрирован: 09.05.2005 16:06
Откуда: Архангельск

Сообщение Гога » 13.10.2006 0:20

Этот скрипт на Перле производит замену всех однобайтовых функций (например, strlen) на многобайтныей (mb_strlen). Это для тех, кто не имеет возможности указать PHP переопределить функции (mbstring.func_overload). Спрашивается, как потом обновлять phpBB? Очень просто: берётся патч, на него натравливается этот скрипт, затем патч накладывается как обычно.

Код: Выделить всё

#!/usr/bin/perl -w

use integer;
use strict;

foreach my $s (@ARGV)
{
	rename($s, "$s.bak") || die "Can't rename $s: $?";
	open(IN, "<$s.bak") || die "Can't read $s.bak: $?";
	open(OUT, ">$s") || die "Can't write $s: $?";

	while(<IN>)
	{
		s/(\W)mail *(?=\()/$1mb_send_mail/g;
		s/(\W)(strlen|strpos|substr) *(?=\()/$1mb_$2/g;
		s/(\W)(strtolower|strtoupper) *(?=\()/$1mb_$2/g;
		s/(\W)(ereg|eregi|ereg_replace|eregi_replace) *(?=\()/$1mb_$2/g;
		s/(\W)(split|substr_count) *(?=\()/$1mb_$2/g;

		print;
		print OUT;
	}
	close(OUT);
	close(IN);
}
Гугл рулит. Я люблю ЛОР.
Интересно, они пришли с миром или им таки нужен наш моск?
Знания принадлежат всему человечеству.

leskov_oleg
phpBB 1.0.0
Сообщения: 4
Зарегистрирован: 20.10.2006 18:03

Сообщение leskov_oleg » 20.10.2006 18:12

Подскажите ПЛЗ есть форум forum.chihara.ru и все хорошо все работает в кодировке utf-8 и впринципе замечаний нет кроме одной проблемы в одну тему мне постоянно пишут спамеры :o ну и это еще ничего можно жить но они какимто образом умудряются писать в CP-1251 как уних это получается не могу понять хоть убейте меня все остальные пользователи как пользователи пишут и знать не знают что там какието кодировки существуют ....

:?: :?:
Вобщем как такое может быть все работает в utf-8, но ктото умудряется писать в CP-1251 (эти ктото спамеры!!)?????? :?: :?:

Аватара пользователя
Палыч
Former team member
Сообщения: 9683
Зарегистрирован: 24.05.2006 23:20
Откуда: Питер
Благодарил (а): 3 раза
Поблагодарили: 453 раза

Сообщение Палыч » 20.10.2006 20:46

leskov_oleg, дружок, эта строчка из твоего overall_header.tpl
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
Ничего не впечатляет? 8)
Не все то WINDOWS, что висит... phpBB только учусь.
ICQ, email, ЛС - только для личных сообщений. Вопросы по phpbb только на форумах. По найму не работаю.

Вернуться в «Локализация phpBB 2.0.x»