Решаем проблему кириллической почты в joomla 1.6-2.5
На данный момент проверка почты происходит как на стороне клиента, так и на стороне сервера.
перед проверкой адрес переводится в punycode, но почему то, переводится только его доменная часть.
Для стороны сервера, сласс определен в файле \libraries\joomla\string\punycode.php
В методе emailToPunycode
	public static function emailToPunycode($email)
	{
		$explodedAddress = explode('@', $email);
		// Not addressing UTF-8 user names
		$newEmail = $explodedAddress[0];
		if (!empty($explodedAddress[1]))
		{
			$domainExploded = explode('.', $explodedAddress[1]);
			$newdomain = '';
			foreach ($domainExploded as $domainex)
			{
				$domainex = static::toPunycode($domainex);
				$newdomain .= $domainex . '.';
			}
			$newdomain = substr($newdomain, 0, -1);
			$newEmail = $newEmail . '@' . $newdomain;
		}
		return $newEmail;
	}
Обратное преобразование происходит в методе emailToUTF8:
	public static function emailToUTF8($email)
	{
		$explodedAddress = explode('@', $email);
		// Not addressing UTF-8 user names
		$newEmail = $explodedAddress[0];
		if (!empty($explodedAddress[1]))
		{
			$domainExploded = explode('.', $explodedAddress[1]);
			$newdomain = '';
			foreach ($domainExploded as $domainex)
			{
				$domainex = static::fromPunycode($domainex);
				$newdomain .= $domainex . '.';
			}
			$newdomain = substr($newdomain, 0, -1);
			$newEmail = $newEmail . '@' . $newdomain;
		}
		return $newEmail;
	}
Их надо отредактироват следующим образом:
В методе emailToPunycode 
надо поменять строку
$newEmail = $explodedAddress[0];
на:
$newEmail = static::toPunycode($explodedAddress[0]);
В методе emailToUTF8 строку:
$newEmail = $explodedAddress[0];
На:
$newEmail = static::fromPunycode($explodedAddress[0]);
Для стороны клиента надо редактировать файл \media\system\js\punycode.js , но он сжат, поэтому предварительно в него надо перенести содержимое из файла \media\system\js\punycode-uncompressed.js и изменить метод mapDomain
	function mapDomain(string, fn) {
		var parts = string.split('@');
		var result = '';
		if (parts.length > 1) {
			// In email addresses, only the domain name should be punycoded. Leave
			// the local part (i.e. everything up to `@`) intact.
			result = parts[0] + '@';
			string = parts[1];
		}
		// Avoid `split(regex)` for IE8 compatibility. See #17.
		string = string.replace(regexSeparators, '\x2E');
		var labels = string.split('.');
		var encoded = map(labels, fn).join('.');
		return result + encoded;
	}
Строку:
result = parts[0] + '@';
надо изменить на:
result = fn(parts[0]) + '@';
Все это надо делать с помощью плагина для восстановления хаков, чтобы не слетела при обновлении.
