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


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

  • Дабавлена: 03 мар 2013 04:24
  • Просмотров: 1641
 


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

Транслитерация URL IPB форума 3.4 ENG

Написано ๖ۣۣۜDesperate™ 03 мар 2013 04:24

При попытке сделать транслит на англ. версиях ипб 3.4 у многих может возникнуть ошибка при переходе в профиль администратора, пример ошибки:

 

Warning: urldecode() expects parameter 1 to be string, array given in /home/*****/domains/******/public_html/admin/sources/base/core.php on line 4488

 
Warning: Cannot modify header information - headers already sent by (output started at /home/******/domains/*********/public_html/admin/sources/base/core.php:4488) in /home/******/domains/*******/public_html/admin/sources/classes/output/formats/html/htmlOutput.php on line 114

 

Процедура практически та же что и данной статье Транслитерация URL

Не много изменен код. И так начнем

 

Шаг 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 monthNameRu2En( $text )
	{
		
 		return str_replace( array('Январь','Февраль','Март','Апрель','Май','Июнь,','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'), array('January','February','March','April','May','June','July','August','September','October','November','December'), $text );
	}

	static public function transliterate( $text )
	{
		return str_replace( array('а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','э','ю','я','ы','ь','ъ'), array('a','b','v','g','d','e','yo','zh','z','i','i','k','l','m','n','o','p','r','s','t','u','f','kh','tc','ch','sh','sch','e','iu','ia','y','',''), $text);
	
	}

	static public function makeSeoTransliterate( $text )
	{
		if  (!IPB_USE_SEO_TRANSLIT )
		{
			return $text;
		}
		
		if ((is_array($text)) && (count($text)))
		{ 
			foreach( $text as $titlefortranslit)
			{
				$titlefortranslit = self::makeSeoTransliterate( $titlefortranslit );
			}
			return $text;
				
		}
		else
		{
				 
			$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

 

Шаг 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 );

 

Все готово )

  • 0

Powered by Tutorials 1.5.0 © 2016, by Michael McCune