Russian TYPO3 community Форум больше не используется. Присоединяйтесь к каналу #community-ru в Slack for TYPO3 community  

Вернуться   Russian TYPO3 community > Тематические форумы > Локализация проекта

Ответ
 
Опции темы Опции просмотра
Старый 15.02.2006, 21:07   #1
stoun
Продвинутый
 
Регистрация: 01.10.2004
Сообщений: 48
По умолчанию re: (не)русские буквы в javascript-окнах

Всем привет.
Тема остается открытой, как я понимаю.
Я установил этот onet_correctform - ничего не изменилось. Надпись об ошибке как была иероглифами, так и осталась.
МОжет его как-то настроить надо?
В новом репозитории этого ext нет... Описания никакого найти не могу.

Может кто сталкивался с подобной проблемой?
stoun вне форума   Ответить с цитированием
Старый 16.02.2006, 14:07   #2
Клим
Новенький
 
Регистрация: 03.02.2006
Сообщений: 5
По умолчанию re: (не)русские буквы в javascript-окнах

Я зделал пару следующих изменений в файле typo3conf/ext/onet_correctform/class.ux_tslib_cObj.php и теперь все как бы работает, но я не знаю, не повлияют ли эти изменение негативно?!
Образец на: Полиграфические услуги Полиграфический Дом [Коммерсантk

Однако еще есть маленькая проблема:Проблема состоит в том, что если я меняю выдающее сообщение через Template-Constant-Editor или через Setup, эти изменения не влияют. Только если я редактирую эти сообщения прямо в файле t3lib/jsfunc.validateform.js, изменения действуют.

Код:
switch((string)$modeParameters[0]){
  case 'EREG':
    $fieldlist[] = '_EREG';
    $fieldlist[] = rawurlencode($modeParameters[1]);                                 
    $fieldlist[] = rawurlencode($modeParameters[2]);                                
    $fieldlist[] = rawurlencode($confData['fieldname']);   
    
    //$fieldlist[] = rawurlencode($confData['label']);  //Original       
    $fieldlist[] = $confData['label'];           // Мои изменения        
    $confData['required'] = 1; // Setting this so "required" layout is used.
  break;

  case 'EMAIL':
    $fieldlist[] = '_EMAIL';                                                               
    $fieldlist[] = rawurlencode($confData['fieldname']);
    //$fieldlist[] = rawurlencode($confData['label']);  //Original
    $fieldlist[] = $confData['label'];        // Мои изменения
    $confData['required'] = 1; // Setting this so "required" layout is used.
  break;
  default:
     if ($confData['required'] && $confData['type']!='check')    {
        //$fieldlist[] = rawurlencode($confData['fieldname']);  //Original
        //$fieldlist[] = rawurlencode($confData['label']);     //Original
       $fieldlist[] = $confData['fieldname'];       // Мои изменения
       $fieldlist[] = $confData['label'];         // Мои изменения

       // SV+
       $fieldlist_clean[] = $confData['fieldname'];
       $fieldlist_clean[] = $confData['label'];

       // SV-
      }
   break;

}
и здесь тоже...
Код:
if ($conf['REQ']){
  // SV+
   // original
  // $validateForm=' onsubmit="return validateForm(\\''.$formname.'\\',\\''.implode(',',$fieldlist_clean).'\\',\\''.rawurlencode($conf['goodMess']).'\\',\\''.rawurlencode($conf['badMess']).'\\',\\''.rawurlencode($conf['emailMess']).'\\')"';
  // изменил 
  $validateForm=' onsubmit="return validateForm(\\''.$formname.'\\',\\''.implode(',',$fieldlist).'\\',\\''.rawurlencode($conf['goodMess']).'\\',\\''.rawurlencode($conf['badMess']).'\\',\\''.rawurlencode($conf['emailMess']).'\\')"';

// SV-
  $GLOBALS['TSFE']->additionalHeaderData['JSFormValidate'] = '<script type="text/javascript" src="'.$GLOBALS['TSFE']->absRefPrefix.'t3lib/jsfunc.validateform.js"></script>';
} else $validateForm='';
Клим вне форума   Ответить с цитированием
Старый 19.05.2006, 15:11   #3
kit
Новенький
 
Регистрация: 08.05.2006
Сообщений: 5
По умолчанию

/**
* Apache 2.0.49
* PHP 4.3.4
* Mysql 4.0.18
* Typo3 4.0
*/
Копал сам, вот что нашел.
Проблема имеет место при кодировке UTF-8.
В файле typo3/sysext/cms/tslib/class.tslib_content.php, формируется текст обработчика события onsubmit() формы так (строка 2027):
Код:
$validateForm=' onsubmit="return validateForm(\''.$formname.'\',\''.implode(',',$fieldlist).'\','.t3lib_div::quoteJSvalue($conf['goodMess']).','.t3lib_div::quoteJSvalue($conf['badMess']).','.t3lib_div::quoteJSvalue($conf['emailMess']).')"';
Интересующие нас строки (метки полей) лежат в массиве $fieldlist, закодированные функцей rawurlencode(), которая кодирует utf8 строки побайтово и в итоге мы получаем вместо строки "Ваш e-mail:" строку "%D0%92%D0%B0%D1%88%20e-mail%3A", т.е. каждая русская буква становится двумя символами "В" -> "%D0%92".
Едем дальше. JavaScript функция validateForm(theFormname,theFieldlist,goodMess,bad Mess,emailMess) в файле t3lib/jsfunc.validateform.js принимает эту строку в качестве параметра theFieldlist, и декодирует ее функцией unescape().
Цитата:
Сообщение от Справочник по javascript
unescape(string) возвращает декодированную версию URL-КОДИРОВАННОЙ строки, прошедший как параметр функции. Кодирование URL преобразовывает неалфавитно-цифровые символы в шестнадцатеричные значения (типа %20 для пробела). Функции escape и unescape неправильно работают с не- ASCII символами.
Функции escape и unescape не используют Unicode, как указано в спецификации ECMA. Вместо этого они используют указания Internet Engineering Task Force (IETF) для заменяющих/escaping символов. В URI символы используют US-ASCII-символы (набор символов ISO-Latin-1). URI это последовательность символов из базового латинского алфавита, цифры и несколько специальных символов (например, / и @). Еscape-последовательности не поддерживают как Unicode-значения \uXXXX или %uXXXX, как специфицировано ECMA, но поддерживают %XX, где XX это 16-ричное число из двух цифр (например, %7E). В URI представлены восьмеричными числами, как 8-битные байты. Чтобы escape и unescape могли работать с поддерживаемыми Web-сервером URL и URI, JavaScript не использует Unicode для этих функций.

* escape возвращает 16-ричную кодировку специфицированной строки из набора символов ISO-Latin-1.
* unescape возвращает ASCII-строку, последовательность символов из набора ISO-Latin-1.

Unicode-специфичные escape-последовательности %uXXXX не поддерживаются.
А теперь внимание вопрос
Какая функция javascript раскодирует urlencoded строку и примет во внимание utf-8? Или может я не в том направлении копать начал?

Последний раз редактировалось kit; 19.05.2006 в 15:22
kit вне форума   Ответить с цитированием
Старый 19.05.2006, 15:21   #4
kit
Новенький
 
Регистрация: 08.05.2006
Сообщений: 5
По умолчанию

Впринципе я пока обхожусь такми решением:
В файле typo3/sysext/cms/tslib/class.tslib_content.php, формируется текст обработчика события onsubmit() формы так (строка 2027):
Код:
//$validateForm=' onsubmit="return validateForm(\''.$formname.'\',\''.implode(',',$fieldlist).'\','.t3lib_div::quoteJSvalue($conf['goodMess']).','.t3lib_div::quoteJSvalue($conf['badMess']).','.t3lib_div::quoteJSvalue($conf['emailMess']).')"';

$validateForm=' onsubmit="return validateForm(\''.$formname.'\',\''.rawurldecode(implode(',',$fieldlist)).'\','.t3lib_div::quoteJSvalue($conf['goodMess']).','.t3lib_div::quoteJSvalue($conf['badMess']).','.t3lib_div::quoteJSvalue($conf['emailMess']).')"';
Таким образом передавая незакодированную строку в функцию javascript validateForm().
Примечание, нельзя использовать символ `"` и `,` в метке поля. (ну и не надо)

Последний раз редактировалось kit; 19.05.2006 в 15:35
kit вне форума   Ответить с цитированием
Старый 19.05.2006, 16:04   #5
kit
Новенький
 
Регистрация: 08.05.2006
Сообщений: 5
Lightbulb решение проблемы

В javascript есть функция decodeURI() - она умеет декодить utf-8 строку, закодированную rawurlencoded()
Так что можно не трогать typo3/sysext/cms/tslib/class.tslib_content.php, а поправить файл t3lib/jsfunc.validateform.js
Код:
function validateForm(theFormname,theFieldlist,goodMess,badMess,emailMess)      {
        var formObject = document[theFormname];
        theFieldlist = decodeURI(theFieldlist);   // добавленная строка
        if (!formObj............

Последний раз редактировалось kit; 19.05.2006 в 16:13
kit вне форума   Ответить с цитированием
Старый 21.05.2006, 12:50   #6
Valery Romanchev
Administrator
 
Аватар для Valery Romanchev
 
Регистрация: 23.08.2003
Адрес: Moscow, Russia
Сообщений: 1,926
Отправить сообщение для Valery Romanchev с помощью Skype™
По умолчанию

да решение работает. Большое спасиб!!
Я запостил в баг-треккер
http://bugs.typo3.org/view.php?id=3527
__________________
Веб-студия ТТЛАБ
www.ttlab.ru
Valery Romanchev вне форума   Ответить с цитированием
Старый 22.05.2006, 08:36   #7
kit
Новенький
 
Регистрация: 08.05.2006
Сообщений: 5
По умолчанию еще одна проблема

В t3lib/jsfunc.validateform.js есть еще одна проблемма, которая
проявляется в TYPO3 4.0. Когда в форме ставишь "обязательное поле",
например "Email: | *_EMAIL=input,40", то проверка правильности _EMAIL
тоже не работает. Найдите в файле t3lib/jsfunc.validateform.js блок (в
оригинале номер строки 57):
Код:
    if (specialMode) {
    //index++;  //  <-- закомментируйте эту строку
      theField = split(theFieldlist, ",", index);
    }
Проблема решена.
Файл jsfunc.validateform.js с исправлениями
jsfunc.validateform.zip

Последний раз редактировалось kit; 22.05.2006 в 08:41
kit вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB code is Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 15:20.


Работает на vBulletin® версия 3.8.1.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot

Хостинг и техническая поддержка: TYPO3 Лаборатория