Перейти к содержимому


Информация статьи

  • Дабавлена: 01 янв 2013 00:51
  • Обновлена: 01 янв 2013 00:52
  • Просмотров: 1736
 


* * * * *
1 Рейтинг

Транслитерация URL в англоязычных версиях IPB

Написано Гость_Гость_* 01 янв 2013 00:51
В русскоязычных версиях IPB встроена функция транслитерации URL. В англоязычных версиях ее нет, поэтому сейчас мы добавим ее. Поддерживается как русский, так и украинский языки.

ВНИМАНИЕ! Производите изменения в файлах только если у вас оригинальная, англоязычная версия от IPS.

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

Шаг 1. Откройте файл admin\sources\base\core.php (тут и далее пути указываются с корня форума).
Найдите код
static public function encodeForXml( $string )
{
if ( function_exists( 'mb_detect_encoding' ) )
{
$encoding = mb_detect_encoding( $string );
if ( $encoding != 'UTF-8' )
{
$string = IPSText::convertCharsets( $string, $encoding );
}
}
elseif ( strtolower( IPS_DOC_CHAR_SET ) == 'utf-8' )
{
$string = utf8_encode( $string );
}

return $string;
}
И ПОСЛЕ вставьте
static public function transliterate( $text )
{
return str_replace( array('а','б','в','г','д','е','є','ё','ж','з','и','і','ї','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','э','ю','я','ы','ь','ъ'), array('a','b','v','g','d','e','ye','e','zh','z','i','i','yi','i','k','l','m','n','o','p','r','s','t','u','f','h','c','ch','sh','sh','a','ju','ja','i','',''), $text);
}

static public function makeSeoTransliterate( $text )
{
$text = urldecode($text);
$text = self::transliterate( $text );
$text = preg_replace('#[^a-z0-9-]#', '', $text);
$text = urlencode($text);
return $text;
}
В этом же файле найдите
/**
* Make an SEO title for use in the URL
* We parse them even if friendly urls are off so that the data is there when you do switch it on
*
* @param string Raw SEO title or text
* @return string Cleaned up SEO title
*/
static public function makeSeoTitle( $text )
{
if ( ! $text )
{
return '';
}

/* Strip all HTML tags first */
$text = strip_tags($text);

/* Preserve %data */
$text = preg_replace('#%([a-fA-F0-9][a-fA-F0-9])#', '-xx-$1-xx-', $text);
$text = str_replace( array( '%', '`' ), '', $text);
$text = preg_replace('#-xx-([a-fA-F0-9][a-fA-F0-9])-xx-#', '%$1', $text);

/* Convert accented chars */
$text = self::convertAccents($text);

/* Convert it */
if ( self::isUTF8( $text ) )
{
if ( function_exists('mb_strtolower') )
{
$text = mb_strtolower($text, 'UTF-8');
}

$text = self::utf8Encode( $text, 250 );
}

/* Finish off */
$text = strtolower($text);

if ( strtolower( IPS_DOC_CHAR_SET ) == 'utf-8' )
{
$text = preg_replace( '#&.+?;#'	 , '', $text );
$text = preg_replace( '#[^%a-z0-9 _-]#', '', $text );
}
else
{
/* Remove &#xx; and &#xxx; but keep &#xxxx; */
$text = preg_replace( '/&#(d){2,3};/', '', $text );
$text = preg_replace( '#[^%&#;a-z0-9 _-]#', '', $text );
$text = str_replace( array( '"', '&'), '', $text );
}

$text = str_replace( array( '`', ' ', '+', '.', '?', '_', '#' ), '-', $text );
$text = preg_replace( "#-{2,}#", '-', $text );
$text = trim($text, '-');

IPSDebug::addMessage( "<span style='color:red'>makeSeoTitle ($text) called</span>" );

return ( $text ) ? $text : '-';
}
И после строки
$text = trim($text, '-');
Вставьте
$text = self::makeSeoTransliterate( $text );
Внимание! Перед сохранением нужно изменить кодировку файла на UTF-8 без BOM для корректной обработки кириллических символов.
На примере Notepad++: нажмите Кодировка > Преобразовать в UTF-8 без BOM

C__Users_Олександр_Dropbox_openserv_domains_dev_translate_index.php - Notepad++ (2012-12-31 18.46.59).png

Шаг 2. Откройте файл admin\sources\classes\output\publicOutput.php
Найдите в нем
/**
* Formats the URL (.htaccess SEO, etc)
*
* @access public
* @param string Raw URL
* @param string Any special SEO title passed
* @param string Any special SEO template to use. If none is passed but SEO is enabled, IPB will search all templates for a match
* @return string Formatted URL
*/
public function formatUrl( $url, $seoTitle='', $seoTemplate='' )
{
//-----------------------------------------
// INIT
//-----------------------------------------
if ( ! ipsRegistry::$settings['use_friendly_urls'] )
{
return $url;
}
И ПОСЛЕ вставьте
$seoTitle = IPSText::makeSeoTransliterate( $seoTitle );
На этом все. Теперь и в версии от IPS транслитерация ссылок будет работать.

Powered by Tutorials 1.5.0 © 2016, by Michael McCune