ave-cms/functions/func.locale.php
2018-04-19 19:11:58 +03:00

851 lines
19 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
// Язык системы
function set_locale()
{
$acp_language = empty($_SESSION['admin_language'])
? $_SESSION['user_language']
: $_SESSION['admin_language'];
$locale = strtolower(defined('ACP')
? $acp_language
: $_SESSION['user_language']);
switch ($locale)
{
case 'ru':
@setlocale(LC_ALL, 'ru_RU.UTF-8', 'rus_RUS.UTF-8', 'russian');
@setlocale(LC_NUMERIC, "C");
break;
case 'bg':
@setlocale(LC_ALL, 'bg_BG.UTF-8', 'bgr_BGR.UTF-8', 'bulgarian');
@setlocale(LC_NUMERIC, "C");
break;
default:
@setlocale (LC_ALL, $locale . '_' . strtoupper($locale), $locale, '');
break;
}
}
/**
* Переводит в нижний регистр
*
* @param string $string строка для перевода в нижний регистр
* @return string
*/
function _strtolower($string)
{
$language = (defined('ACP') && ACP)
? $_SESSION['admin_language']
: $_SESSION['user_language'];
$language = strtolower($language);
switch ($language)
{
case 'de':
return mb_strtolower($string);
break;
case 'en':
return mb_strtolower($string);
break;
case 'ru':
case 'bg':
$small = array('а','б','в','г','д','е','ё','ж','з','и','й',
'к','л','м','н','о','п','р','с','т','у','ф',
'х','ч','ц','ш','щ','э','ю','я','ы','ъ','ь',
'э', 'ю', 'я');
$large = array('А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й',
'К','Л','М','Н','О','П','Р','С','Т','У','Ф',
'Х','Ч','Ц','Ш','Щ','Э','Ю','Я','Ы','Ъ','Ь',
'Э', 'Ю', 'Я');
break;
case 'ua':
case 'uk':
$small = array('а','б','в','г','д','е','є','ж','з','и','і','й','ї',
'к','л','м','н','о','п','р','с','т','у','ф',
'х','ч','ц','ш','щ','ь','ю','я');
$large = array('А','Б','В','Г','Д','Е','Є','Ж','З','И','І','Й','Ї',
'К','Л','М','Н','О','П','Р','С','Т','У','Ф',
'Х','Ч','Ц','Ш','Щ','Ь','Ю','Я');
break;
default:
return mb_strtolower($string);
break;
}
return str_replace($large, $small, $string);
}
/**
* Транслитерация
*
* @param string $string строка для транслитерации
* @return string
*/
function translit_string($string)
{
// $st = htmlspecialchars_decode($st);
//
// // Convert all named HTML entities to numeric entities
// $st = preg_replace_callback('/&([a-zA-Z][a-zA-Z0-9]{1,7});/', 'convert_entity', $st);
//
// // Convert all numeric entities to their actual character
// $st = preg_replace('/&#x([0-9a-f]{1,7});/ei', 'chr(hexdec("\\1"))', $st);
// $st = preg_replace('/&#([0-9]{1,7});/e', 'chr("\\1")', $st);
//
$language = (defined('ACP') && ACP)
? $_SESSION['admin_language']
: $_SESSION['user_language'];
$language = strtolower($language);
switch ($language)
{
default:
case 'ru':
$table = array(
//-- Заглавные
'А' => 'A',
'Б' => 'B',
'В' => 'V',
'Г' => 'G',
'Д' => 'D',
'Е' => 'E',
'Ё' => 'YO',
'Ж' => 'ZH',
'З' => 'Z',
'И' => 'I',
'Й' => 'J',
'К' => 'K',
'Л' => 'L',
'М' => 'M',
'Н' => 'N',
'О' => 'O',
'П' => 'P',
'Р' => 'R',
'С' => 'S',
'Т' => 'T',
'У' => 'U',
'Ф' => 'F',
'Х' => 'H',
'Ц' => 'C',
'Ч' => 'CH',
'Ш' => 'SH',
'Щ' => 'CSH',
'Ь' => '',
'Ы' => 'Y',
'Ъ' => '',
'Э' => 'E',
'Ю' => 'YU',
'Я' => 'YA',
//-- Строчные
'а' => 'a',
'б' => 'b',
'в' => 'v',
'г' => 'g',
'д' => 'd',
'е' => 'e',
'ё' => 'yo',
'ж' => 'zh',
'з' => 'z',
'и' => 'i',
'й' => 'j',
'к' => 'k',
'л' => 'l',
'м' => 'm',
'н' => 'n',
'о' => 'o',
'п' => 'p',
'р' => 'r',
'с' => 's',
'т' => 't',
'у' => 'u',
'ф' => 'f',
'х' => 'h',
'ц' => 'c',
'ч' => 'ch',
'ш' => 'sh',
'щ' => 'csh',
'ь' => '',
'ы' => 'y',
'ъ' => '',
'э' => 'e',
'ю' => 'yu',
'я' => 'ya',
);
break;
//болгарский
case 'bg':
$table = array(
//-- Заглавные
'А' => 'A',
'Б' => 'B',
'В' => 'V',
'Г' => 'G',
'Д' => 'D',
'Е' => 'E',
'Ё' => 'YO',
'Ж' => 'ZH',
'З' => 'Z',
'И' => 'I',
'Й' => 'J',
'К' => 'K',
'Л' => 'L',
'М' => 'M',
'Н' => 'N',
'О' => 'O',
'П' => 'P',
'Р' => 'R',
'С' => 'S',
'Т' => 'T',
'У' => 'U',
'Ф' => 'F',
'Х' => 'H',
'Ц' => 'C',
'Ч' => 'CH',
'Ш' => 'SH',
'Щ' => 'SHT',
'Ь' => 'Y',
'Ы' => 'Y',
'Ъ' => 'A',
'Э' => 'E',
'Ю' => 'YU',
'Я' => 'YA',
//-- Строчные
'а' => 'a',
'б' => 'b',
'в' => 'v',
'г' => 'g',
'д' => 'd',
'е' => 'e',
'ё' => 'yo',
'ж' => 'zh',
'з' => 'z',
'и' => 'i',
'й' => 'j',
'к' => 'k',
'л' => 'l',
'м' => 'm',
'н' => 'n',
'о' => 'o',
'п' => 'p',
'р' => 'r',
'с' => 's',
'т' => 't',
'у' => 'u',
'ф' => 'f',
'х' => 'h',
'ц' => 'c',
'ч' => 'ch',
'ш' => 'sh',
'щ' => 'sht',
'ь' => 'a',
'ы' => 'y',
'ъ' => 'a',
'э' => 'e',
'ю' => 'yu',
'я' => 'ya',
);
break;
//-- українська мова:
case 'ua':
$table = array(
//-- Заглавные
'А' => 'A',
'Б' => 'B',
'В' => 'V',
'Г' => 'G',
'Д' => 'D',
'Е' => 'E',
'Є' => 'IE',
'Ж' => 'J',
'З' => 'Z',
'И' => 'Y',
'І' => 'I',
'Й' => 'I',
'К' => 'K',
'Л' => 'L',
'М' => 'M',
'Н' => 'N',
'О' => 'O',
'П' => 'P',
'Р' => 'R',
'С' => 'S',
'Т' => 'T',
'У' => 'U',
'Ф' => 'F',
'Х' => 'H',
'Ц' => 'C',
'Ч' => 'CH',
'Ш' => 'SH',
'Щ' => 'CSH',
'Ь' => '',
'Ю' => 'IU',
'Я' => 'IA',
//-- Строчные
'а' => 'a',
'б' => 'b',
'в' => 'v',
'г' => 'g',
'д' => 'd',
'е' => 'e',
'є' => 'ie',
'ж' => 'j',
'з' => 'z',
'и' => 'y',
'і' => 'i',
'й' => 'i',
'к' => 'k',
'л' => 'l',
'м' => 'm',
'н' => 'n',
'о' => 'o',
'п' => 'p',
'р' => 'r',
'с' => 's',
'т' => 't',
'у' => 'u',
'ф' => 'f',
'х' => 'h',
'ц' => 'c',
'ч' => 'ch',
'ш' => 'sh',
'щ' => 'csh',
'ь' => '',
'ю' => 'iu',
'я' => 'ia',
);
break;
case 'uk':
$table = array(
//-- Заглавные
'А' => 'A',
'Б' => 'B',
'В' => 'V',
'Г' => 'G',
'Ґ' => 'G',
'Д' => 'D',
'Е' => 'E',
'Є' => 'IE',
'Ж' => 'J',
'З' => 'Z',
'И' => 'Y',
'І' => 'I',
'Й' => 'I',
'К' => 'K',
'Л' => 'L',
'М' => 'M',
'Н' => 'N',
'О' => 'O',
'П' => 'P',
'Р' => 'R',
'С' => 'S',
'Т' => 'T',
'У' => 'U',
'Ф' => 'F',
'Х' => 'H',
'Ц' => 'C',
'Ч' => 'CH',
'Ш' => 'SH',
'Щ' => 'CSH',
'Ь' => '',
'Ю' => 'IU',
'Я' => 'IA',
//-- Строчные
'а' => 'a',
'б' => 'b',
'в' => 'v',
'г' => 'g',
'ґ' => 'g',
'д' => 'd',
'е' => 'e',
'є' => 'ie',
'ж' => 'j',
'з' => 'z',
'и' => 'y',
'і' => 'i',
'й' => 'i',
'к' => 'k',
'л' => 'l',
'м' => 'm',
'н' => 'n',
'о' => 'o',
'п' => 'p',
'р' => 'r',
'с' => 's',
'т' => 't',
'у' => 'u',
'ф' => 'f',
'х' => 'h',
'ц' => 'c',
'ч' => 'ch',
'ш' => 'sh',
'щ' => 'csh',
'ь' => '',
'ю' => 'iu',
'я' => 'ia',
);
break;
//-- polski język
case 'pl':
$table = array(
'Ą' => 'ya',
'ą' => 'ya',
'Ć' => 'ya',
'ć' => 'ya',
'Ę' => 'ya',
'ę' => 'ya',
'Ł' => 'ya',
'ł' => 'ya',
'Ń' => 'ya',
'ń' => 'ya',
'Ó' => 'ya',
'ó' => 'ya',
'Ś' => 'ya',
'ś' => 'ya',
'Ź' => 'ya',
'ź' => 'ya',
'Ż' => 'ya',
'ż' => 'ya',
);
break;
}
$string = str_replace(array_keys($table), array_values($table), $string);
switch ($language)
{
default:
case 'ru':
$replace = array(
'ье'=>'ye',
'ъе'=>'ye',
'ьи'=>'yi',
'ъи'=>'yi',
'ъо'=>'yo',
'ьо'=>'yo',
'ё'=>'yo',
'ю'=>'yu',
'я'=>'ya',
'ж'=>'zh',
'х'=>'kh',
'ц'=>'ts',
'ч'=>'ch',
'ш'=>'sh',
'щ'=>'shch',
'ъ'=>'',
'ь'=>'',
'є'=>'ye'
);
break;
case 'bg':
$replace = array(
'ье'=>'ye',
'ъе'=>'ye',
'ьи'=>'yi',
'ъи'=>'yi',
'ъо'=>'yo',
'ьо'=>'yo',
'ё'=>'yo',
'ю'=>'yu',
'я'=>'ya',
'ж'=>'zh',
'ц'=>'ts',
'ч'=>'ch',
'ш'=>'sh',
'щ'=>'sht',
'ъ'=>'a',
'ь'=>'a'
);
break;
}
$string = strtr($string, $replace);
switch ($language)
{
default:
case 'ru':
$search = 'абвгдезийклмнопрстуфыэі';
$replace = 'abvgdeziyklmnoprstufyei';
break;
case 'ua':
$search = 'абвгґдеєжзиійїклмнопрстуфхцчшщьюя';
$replace = 'abvggdeejzyiiklmnoprstufhccssua';
break;
case 'uk':
$search = 'абвгґдеєжзиійїклмнопрстуфхцчшщьюя';
$replace = 'abvggdeejzyiiklmnoprstufhccssua';
break;
case 'bg':
$search = 'абвгдезийклмнопрстуфыэіъ';
$replace = 'abvgdeziyklmnoprstufyeia';
break;
}
$string = strtr($string, $search, $replace);
return trim($string, '-');
}
/**
* Исправление форматирования даты
* Функцию можно использовать в шаблонах Smarty как модификатор
*
* @param string $string - дата отформатированная в соответствии с текущей локалью
* @param string $language - язык
* @return string
*/
function pretty_date($string, $language = '')
{
// пытаемся решить проблему для кодировки дат на лок. серверах
if (! mb_check_encoding($string, 'UTF-8'))
{
$string = iconv('Windows-1251', 'UTF-8', $string);
}
if ($language == '')
{
$language = (defined('ACP') && ACP)
? $_SESSION['admin_language']
: $_SESSION['user_language'];
}
$language = strtolower($language);
switch ($language)
{
default:
case 'ru':
$pretty = array(
'Январь' =>'января', 'Февраль' =>'февраля', 'Март' =>'марта',
'Апрель' =>'апреля', 'Май' =>'мая', 'Июнь' =>'июня',
'Июль' =>'июля', 'Август' =>'августа', 'Сентябрь'=>'сентября',
'Октябрь' =>'октября', 'Ноябрь' =>'ноября', 'Декабрь' =>'декабря',
'воскресенье'=>'Воскресенье', 'понедельник'=>'Понедельник', 'вторник' =>'Вторник',
'среда' =>'Среда', 'четверг' =>'Четверг', 'пятница' =>'Пятница',
'суббота' =>'Суббота'
);
break;
case 'ua':
case 'uk':
$pretty = array(
'Січень' =>'січня', 'Лютий' =>'лютого', 'Березень'=>'березня',
'Квітень'=>'квітня', 'Травень' =>'травня', 'Червень' =>'червня',
'Липень' =>'липня', 'Серпень' =>'серпня', 'Вересень'=>'вересня',
'Жовтень'=>'жовтня', 'Листопад' =>'листопада', 'Грудень' =>'грудня',
'неділя' =>'Неділя', 'понеділок'=>'Понеділок', 'вівторок'=>'Вівторок',
'середа' =>'Середа', 'четвер' =>'Четвер', 'п’ятниця'=>'П’ятниця',
'субота' =>'Субота'
);
break;
}
return (isset($pretty)
? strtr($string, $pretty)
: $string);
}
/**
* Функция перевода даты с en на ru
*
* @param string $data данные
* @return string
*/
function translate_date($data)
{
$language = (defined('ACP') && ACP)
? $_SESSION['admin_language']
: $_SESSION['user_language'];
$language = strtolower($language);
switch ($language)
{
default:
case 'ru':
$data = strtr($data, array(
'January'=>'Января',
'February'=>'Февраля',
'March'=>'Марта',
'April'=>'Апреля',
'May'=>'Мая',
'June'=>'Июня',
'July'=>'Июля',
'August'=>'Августа',
'September'=>'Сентября',
'October'=>'Октября',
'November'=>'Ноября',
'December'=>'Декабря',
'Jan'=>'Янв',
'Feb'=>'Фев',
'Mar'=>'Мрт',
'Apr'=>'Апр',
'May'=>'Май',
'Jun'=>'Июн',
'Jul'=>'Июл',
'Aug'=>'Авг',
'Sep'=>'Сен',
'Oct'=>'Окт',
'Nov'=>'Нбр',
'Dec'=>'Дек',
'Monday'=>'Понедельник',
'Tuesday'=>'Вторник',
'Wednesday'=>'Среда',
'Thursday'=>'Четверг',
'Friday'=>'Пятница',
'Saturday'=>'Суббота',
'Sunday'=>'Воскресенье',
'Mon'=>'Пн',
'Tue'=>'Вт',
'Wed'=>'Ср',
'Thu'=>'Чт',
'Fri'=>'Пт',
'Sat'=>'Сб',
'Sun'=>'Вс'
));
break;
case 'ua':
case 'uk':
$data = strtr($data, array(
'January'=>'Січня',
'February'=>'Лютого',
'March'=>'Березня',
'April'=>'Квітня',
'May'=>'Травня',
'June'=>'Червня',
'July'=>'Липня',
'August'=>'Серпня',
'September'=>'Вересня',
'October'=>'Жовтня',
'November'=>'Листопада',
'December'=>'Грудня',
'Jan'=>'Січ',
'Feb'=>'Лют',
'Mar'=>'Бер',
'Apr'=>'Кві',
'May'=>'Тра',
'Jun'=>'Чер',
'Jul'=>'Лип',
'Aug'=>'Сер',
'Sep'=>'Вер',
'Oct'=>'Жов',
'Nov'=>'Лис',
'Dec'=>'Гру',
'Monday'=>'Понеділок',
'Tuesday'=>'Вівторок',
'Wednesday'=>'Середа',
'Thursday'=>'Четвер',
'Friday'=>'П’ятниця',
'Saturday'=>'Субота',
'Sunday'=>'Неділя',
'Mon'=>'Пн',
'Tue'=>'Вт',
'Wed'=>'Ср',
'Thu'=>'Чт',
'Fri'=>'Пт',
'Sat'=>'Сб',
'Sun'=>'Нд'
));
break;
case 'bg':
$data = strtr($data, array(
'January'=>'Януари',
'February'=>'Февруари',
'March'=>'Март',
'April'=>'Април',
'May'=>'Май',
'June'=>'Юни',
'July'=>'Юли',
'August'=>'Август',
'September'=>'Септември',
'October'=>'Октомври',
'November'=>'Нември',
'December'=>'Декември',
'Jan'=>'Яну',
'Feb'=>'Фев',
'Mar'=>'Мрт',
'Apr'=>'Апр',
'May'=>'Май',
'Jun'=>'Юни',
'Jul'=>'Юли',
'Aug'=>'Авг',
'Sep'=>'Сеп',
'Oct'=>'Окт',
'Nov'=>'Ное',
'Dec'=>'Дек',
'Monday'=>'Понеделник',
'Tuesday'=>'Вторник',
'Wednesday'=>'Сряда',
'Thursday'=>'Четвъртък',
'Friday'=>'Петък',
'Saturday'=>'Събота',
'Sunday'=>'Неделя',
'Mon'=>'Пн',
'Tue'=>'Вт',
'Wed'=>'Ср',
'Thu'=>'Чт',
'Fri'=>'Пт',
'Sat'=>'Сб',
'Sun'=>'Нд'
));
break;
}
return $data;
}
/**
* Подготовка имени файла или директории
*
* @param string $st
* @return string
*/
function prepare_fname($st)
{
$st = strip_tags($st);
$st = strtr($st,'ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЪЫЭЮЯ',
'abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщьъыэюя');
$st = translit_string(trim($st));
$st = preg_replace(array('/[^a-z0-9_-]/', '/--+/'), '-', $st);
return trim($st, '-');
}
/**
* Отображение даты в фармате
* 25 дней/минут/секунд назад
* и т.д.
*
* @param string $date (TIMESTAMP)
* @return string
*/
function human_date($date)
{
$stf = 0;
$cur_time = time();
$diff = $cur_time - $date;
$language = (defined('ACP') && ACP)
? $_SESSION['admin_language']
: $_SESSION['user_language'];
$language = strtolower($language);
switch ($language)
{
default:
case 'ru':
$seconds = array('секунда', 'секунды', 'секунд');
$minutes = array('минута', 'минуты', 'минут');
$hours = array('час', 'часа', 'часов');
$days = array('день', 'дня', 'дней');
$weeks = array('неделя', 'недели', 'недель' );
$months = array('месяц', 'месяца', 'месяцев');
$years = array('год', 'года', 'лет');
$decades = array('десятилетие', 'десятилетия', 'десятилетий');
$ago = 'назад';
break;
case 'ua':
case 'uk':
$seconds = array('секунда', 'секунди', 'секунд');
$minutes = array('хвилина', 'хвилини', 'хвилин');
$hours = array('година', 'години', 'годин');
$days = array('день', 'дня', 'днів');
$weeks = array('тиждень', 'тижня', 'тижнів' );
$months = array('месяць', 'місяця', 'місяців');
$years = array('рік', 'року', 'років');
$decades = array('десятиріччя', 'десятиріччя', 'десятиріч');
$ago = 'назад';
break;
case 'en':
$seconds = array('second', 'seconds', 'seconds');
$minutes = array('minute', 'minutes', 'minutes');
$hours = array('hour', 'hours', 'hours');
$days = array('day', 'days', 'days');
$weeks = array('week', 'weeks', 'weeks' );
$months = array('month', 'months', 'months');
$years = array('year', 'years', 'years');
$decades = array('decade', 'decades', 'decades');
$ago = 'ago';
break;
}
$phrase = array($seconds, $minutes, $hours, $days, $weeks, $months, $years, $decades);
$length = array(1, 60, 3600, 86400, 604800, 2630880, 31570560, 315705600);
for ($i = sizeof($length) - 1; ($i >= 0) && (($no = $diff / $length[ $i ]) <= 1 ); $i --)
{
;
}
if ($i < 0)
{
$i = 0;
}
$_time = $cur_time - ($diff % $length[$i]);
$no = floor($no);
$value = sprintf("%d %s ", $no, date_phrase($no, $phrase[$i]));
if (($stf == 1) && ($i >= 1) && (($cur_time - $_time) > 0))
{
$value .= time_ago($_time);
}
return $value . $ago;
}
function date_phrase($number, $titles)
{
$cases = array( 2, 0, 1, 1, 1, 2 );
return $titles[($number % 100 > 4 && $number % 100 < 20)
? 2
: $cases[min($number % 10, 5)]];
}
?>