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

Вопросы, связанные с локализацией phpBB 2.0.x

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

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

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

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

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

P.S. по количеству бредятинок в коде phpbb держит наверное второе место после oscommerce :-)
Дятелл
phpBB 1.0.0
 
Сообщения: 7
Зарегистрирован: 07.04.2006 15:41


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

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

Например? Что-нибудь в студию, пожалуйста.
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Аватара пользователя
Xpert
phpBB Guru
 
Сообщения: 5716
Зарегистрирован: 13.03.2004 22:27
Откуда: msk.ru

Сообщение 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, теперь нормально.
Но чувствует мое сердце, что это не правильно. :)
danilevsky
phpBB 1.2.0
 
Сообщения: 14
Зарегистрирован: 15.04.2006 13:56

Сообщение 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
{
...
}
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Аватара пользователя
Xpert
phpBB Guru
 
Сообщения: 5716
Зарегистрирован: 13.03.2004 22:27
Откуда: msk.ru

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

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


А я-то и думаю - чего oscommerce такой популярный? А оно вона как! :wink:
Аватара пользователя
RWinner
phpBB 2.0.3
 
Сообщения: 198
Зарегистрирован: 08.01.2006 9:18

Сообщение 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 всю базу данных.
Аватара пользователя
direqtor
phpBB 1.4.1
 
Сообщения: 42
Зарегистрирован: 07.06.2006 4:54
Откуда: Владивосток

Сообщение 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 в новой (которая уже активна).

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

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

Именно, а как это сделать, чтобы все нормально перенеслось?
Перекодировка - пробовал сделать backup старой базы (таблицы постов) и перекодировать в редакторе. Не вышло. Старая база тоже была UTF8, но интерфейс был в кодировке 1251.
Заранее благодарю за конструктивные советы.

Мои хостеры с Фарпоста обновили phpMyAdmin на версию 2.8.0.2, а там очень интересные добавления на заглавной и на странице импорта таблиц.
На заглавной странице можно выбрать кодировку базы данных, например utf-8. А при импорте дампа таблицы или базы можно указать кодировку исходных данных. И все текстовые данные на лету перекодируются.
Я думаю, это поможет.
Правда, сам сперва матом ругался. У меня в одной таблице для сайта несколько языков одновременно, каждый в своей кодировке. Так мне все перекоддировала, что при взгляде на сайт волосы дыбом встали. Но там можно выбрать опцию binary, и тогда текст не перекодируется.
Аватара пользователя
direqtor
phpBB 1.4.1
 
Сообщения: 42
Зарегистрирован: 07.06.2006 4:54
Откуда: Владивосток

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

direqtor, отлично!!! Ты просто герой!! Наконец-то юникод заработал нормально! Хочу еще заметить что нужно текстовые поля в базе данных увеличить в двое, потому как юникод в два раза больше места жрет. После увеличения текстовых полей не будет резать ники, темы...
danilevsky
phpBB 1.2.0
 
Сообщения: 14
Зарегистрирован: 15.04.2006 13:56

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

direqtor,
подскажите пожалуйста по подробнее где именно это нужно поставить:
direqtor писал(а):В файле includes/functions.php добавляем функцию:
и
direqtor писал(а):В том же файле изменяем функцию init_userprefs, после включения файла языка пишем код, изменяющий кодировку в массиве $lang
(если будет время, то пожалуйста по подробнее как в модах)
очень долго уже ищу решение этой проблеммы и наконец с помощью Эксперта нашел.
мне для этофо нужно:
http://phpbbguru.net/community/viewtopic.php?t=10822&highlight=
заранее спасибо!
Аватара пользователя
Diesel
phpBB 1.4.2
 
Сообщения: 57
Зарегистрирован: 12.07.2006 4:32

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

Diesel писал(а):(если будет время, то пожалуйста по подробнее как в модах)
очень долго уже ищу решение этой проблеммы и наконец с помощью Эксперта нашел.
мне для этофо нужно:
http://phpbbguru.net/community/viewtopic.php?t=10822&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 остальной код может отличаться, будте внимательны
Аватара пользователя
direqtor
phpBB 1.4.1
 
Сообщения: 42
Зарегистрирован: 07.06.2006 4:54
Откуда: Владивосток

Сообщение 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 ставить, пробовал разные варианты - не получается? :(
druidos
phpBB 1.0.0
 
Сообщения: 1
Зарегистрирован: 24.04.2006 15:23

Сообщение Гога 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);
}
Гугл рулит. Я люблю ЛОР.
Интересно, они пришли с миром или им таки нужен наш моск?
Знания принадлежат всему человечеству.
Аватара пользователя
Гога
phpBB 2.0.5
 
Сообщения: 235
Зарегистрирован: 09.05.2005 16:06
Откуда: Архангельск

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

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

:?: :?:
Вобщем как такое может быть все работает в utf-8, но ктото умудряется писать в CP-1251 (эти ктото спамеры!!)?????? :?: :?:
leskov_oleg
phpBB 1.0.0
 
Сообщения: 4
Зарегистрирован: 20.10.2006 18:03

Сообщение Палыч 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 только на форумах. По найму не работаю.
Никогда не бойся делать то, что ты пока не умеешь. Помни, что Ковчег был построен любителем. Профессионалы строили Титаник...
Аватара пользователя
Палыч
Просто Палыч
 
Сообщения: 6770
Зарегистрирован: 24.05.2006 23:20
Откуда: Питер

Пред.След.

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0