Blame Identity/Models/Html/phpBB/3.0.4/includes/acp/acp_language.php

d6e8d8
d6e8d8
/**
d6e8d8
*
d6e8d8
* @package acp
d6e8d8
* @version $Id: acp_language.php 8780 2008-08-22 12:52:48Z acydburn $
d6e8d8
* @copyright (c) 2005 phpBB Group
d6e8d8
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
d6e8d8
*
d6e8d8
*/
d6e8d8
d6e8d8
/**
d6e8d8
* @ignore
d6e8d8
*/
d6e8d8
if (!defined('IN_PHPBB'))
d6e8d8
{
d6e8d8
	exit;
d6e8d8
}
d6e8d8
d6e8d8
/**
d6e8d8
* @package acp
d6e8d8
*/
d6e8d8
class acp_language
d6e8d8
{
d6e8d8
	var $u_action;
d6e8d8
	var $main_files;
d6e8d8
	var $language_header = '';
d6e8d8
	var $lang_header = '';
d6e8d8
d6e8d8
	var $language_file = '';
d6e8d8
	var $language_directory = '';
d6e8d8
d6e8d8
	function main($id, $mode)
d6e8d8
	{
d6e8d8
		global $config, $db, $user, $auth, $template, $cache;
d6e8d8
		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix;
d6e8d8
		global $safe_mode, $file_uploads;
d6e8d8
d6e8d8
		include_once($phpbb_root_path . 'includes/functions_user.' . $phpEx);
d6e8d8
d6e8d8
		$this->default_variables();
d6e8d8
d6e8d8
		// Check and set some common vars
d6e8d8
d6e8d8
		$action		= (isset($_POST['update_details'])) ? 'update_details' : '';
d6e8d8
		$action		= (isset($_POST['download_file'])) ? 'download_file' : $action;
d6e8d8
		$action		= (isset($_POST['upload_file'])) ? 'upload_file' : $action;
d6e8d8
		$action		= (isset($_POST['upload_data'])) ? 'upload_data' : $action;
d6e8d8
		$action		= (isset($_POST['submit_file'])) ? 'submit_file' : $action;
d6e8d8
		$action		= (isset($_POST['remove_store'])) ? 'details' : $action;
d6e8d8
d6e8d8
		$submit = (empty($action) && !isset($_POST['update']) && !isset($_POST['test_connection'])) ? false : true;
d6e8d8
		$action = (empty($action)) ? request_var('action', '') : $action;
d6e8d8
d6e8d8
		$form_name = 'acp_lang';
d6e8d8
		add_form_key('acp_lang');
d6e8d8
d6e8d8
		$lang_id = request_var('id', 0);
d6e8d8
		if (isset($_POST['missing_file']))
d6e8d8
		{
d6e8d8
			$missing_file = request_var('missing_file', array('' => 0));
d6e8d8
			list($_REQUEST['language_file'], ) = array_keys($missing_file);
d6e8d8
		}
d6e8d8
d6e8d8
		$selected_lang_file = request_var('language_file', '|common.' . $phpEx);
d6e8d8
d6e8d8
		list($this->language_directory, $this->language_file) = explode('|', $selected_lang_file);
d6e8d8
d6e8d8
		$this->language_directory = basename($this->language_directory);
d6e8d8
		$this->language_file = basename($this->language_file);
d6e8d8
d6e8d8
		$user->add_lang('acp/language');
d6e8d8
		$this->tpl_name = 'acp_language';
d6e8d8
		$this->page_title = 'ACP_LANGUAGE_PACKS';
d6e8d8
d6e8d8
		if ($submit && $action == 'upload_data' && request_var('test_connection', ''))
d6e8d8
		{
d6e8d8
			$test_connection = false;
d6e8d8
			$action = 'upload_file';
d6e8d8
			$method = request_var('method', '');
d6e8d8
d6e8d8
			include_once($phpbb_root_path . 'includes/functions_transfer.' . $phpEx);
d6e8d8
d6e8d8
			switch ($method)
d6e8d8
			{
d6e8d8
				case 'ftp':
d6e8d8
					$transfer = new ftp(request_var('host', ''), request_var('username', ''), request_var('password', ''), request_var('root_path', ''), request_var('port', ''), request_var('timeout', ''));
d6e8d8
				break;
d6e8d8
d6e8d8
				case 'ftp_fsock':
d6e8d8
					$transfer = new ftp_fsock(request_var('host', ''), request_var('username', ''), request_var('password', ''), request_var('root_path', ''), request_var('port', ''), request_var('timeout', ''));
d6e8d8
				break;
d6e8d8
d6e8d8
				default:
d6e8d8
					trigger_error($user->lang['INVALID_UPLOAD_METHOD'], E_USER_ERROR);
d6e8d8
				break;
d6e8d8
			}
d6e8d8
d6e8d8
			$test_connection = $transfer->open_session();
d6e8d8
			$transfer->close_session();
d6e8d8
		}
d6e8d8
d6e8d8
		switch ($action)
d6e8d8
		{
d6e8d8
			case 'upload_file':
d6e8d8
d6e8d8
				include_once($phpbb_root_path . 'includes/functions_transfer.' . $phpEx);
d6e8d8
d6e8d8
				$method = request_var('method', '');
d6e8d8
d6e8d8
				if (!class_exists($method))
d6e8d8
				{
d6e8d8
					trigger_error('Method does not exist.', E_USER_ERROR);
d6e8d8
				}
d6e8d8
d6e8d8
				$requested_data = call_user_func(array($method, 'data'));
d6e8d8
				foreach ($requested_data as $data => $default)
d6e8d8
				{
d6e8d8
					$template->assign_block_vars('data', array(
d6e8d8
						'DATA'		=> $data,
d6e8d8
						'NAME'		=> $user->lang[strtoupper($method . '_' . $data)],
d6e8d8
						'EXPLAIN'	=> $user->lang[strtoupper($method . '_' . $data) . '_EXPLAIN'],
d6e8d8
						'DEFAULT'	=> (!empty($_REQUEST[$data])) ? request_var($data, '') : $default
d6e8d8
					));
d6e8d8
				}
d6e8d8
d6e8d8
				$hidden_data = build_hidden_fields(array(
d6e8d8
					'file'			=> $this->language_file,
d6e8d8
					'dir'			=> $this->language_directory,
d6e8d8
					'language_file'	=> $selected_lang_file,
d6e8d8
					'method'		=> $method)
d6e8d8
				);
d6e8d8
d6e8d8
				$hidden_data .= build_hidden_fields(array('entry' => $_POST['entry']), true, STRIP);
d6e8d8
d6e8d8
				$template->assign_vars(array(
d6e8d8
					'S_UPLOAD'	=> true,
d6e8d8
					'NAME'		=> $method,
d6e8d8
					'U_ACTION'	=> $this->u_action . "&id=$lang_id&action=upload_data",
d6e8d8
					'U_BACK'	=> $this->u_action . "&id=$lang_id&action=details&language_file=" . urlencode($selected_lang_file),
d6e8d8
					'HIDDEN'	=> $hidden_data,
d6e8d8
d6e8d8
					'S_CONNECTION_SUCCESS'		=> (request_var('test_connection', '') && $test_connection === true) ? true : false,
d6e8d8
					'S_CONNECTION_FAILED'		=> (request_var('test_connection', '') && $test_connection !== true) ? true : false
d6e8d8
				));
d6e8d8
			break;
d6e8d8
d6e8d8
			case 'update_details':
d6e8d8
d6e8d8
				if (!$submit || !check_form_key($form_name))
d6e8d8
				{
d6e8d8
					trigger_error($user->lang['FORM_INVALID']. adm_back_link($this->u_action), E_USER_WARNING);
d6e8d8
				}
d6e8d8
d6e8d8
				if (!$lang_id)
d6e8d8
				{
d6e8d8
					trigger_error($user->lang['NO_LANG_ID'] . adm_back_link($this->u_action), E_USER_WARNING);
d6e8d8
				}
d6e8d8
d6e8d8
				$sql = 'SELECT *
d6e8d8
					FROM ' . LANG_TABLE . "
d6e8d8
					WHERE lang_id = $lang_id";
d6e8d8
				$result = $db->sql_query($sql);
d6e8d8
				$row = $db->sql_fetchrow($result);
d6e8d8
				$db->sql_freeresult($result);
d6e8d8
d6e8d8
				$sql_ary	= array(
d6e8d8
					'lang_english_name'		=> request_var('lang_english_name', $row['lang_english_name']),
d6e8d8
					'lang_local_name'		=> utf8_normalize_nfc(request_var('lang_local_name', $row['lang_local_name'], true)),
d6e8d8
					'lang_author'			=> utf8_normalize_nfc(request_var('lang_author', $row['lang_author'], true)),
d6e8d8
				);
d6e8d8
d6e8d8
				$db->sql_query('UPDATE ' . LANG_TABLE . '
d6e8d8
					SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
d6e8d8
					WHERE lang_id = ' . $lang_id);
d6e8d8
d6e8d8
				add_log('admin', 'LOG_LANGUAGE_PACK_UPDATED', $sql_ary['lang_english_name']);
d6e8d8
d6e8d8
				trigger_error($user->lang['LANGUAGE_DETAILS_UPDATED'] . adm_back_link($this->u_action));
d6e8d8
			break;
d6e8d8
d6e8d8
			case 'submit_file':
d6e8d8
			case 'download_file':
d6e8d8
			case 'upload_data':
d6e8d8
d6e8d8
				if (!$submit || !check_form_key($form_name))
d6e8d8
				{
d6e8d8
					trigger_error($user->lang['FORM_INVALID']. adm_back_link($this->u_action), E_USER_WARNING);
d6e8d8
				}
d6e8d8
d6e8d8
				if (!$lang_id || empty($_POST['entry']))
d6e8d8
				{
d6e8d8
					trigger_error($user->lang['NO_LANG_ID'] . adm_back_link($this->u_action), E_USER_WARNING);
d6e8d8
				}
d6e8d8
d6e8d8
				if ($this->language_directory != 'email' && !is_array($_POST['entry']))
d6e8d8
				{
d6e8d8
					trigger_error($user->lang['NO_LANG_ID'] . adm_back_link($this->u_action), E_USER_WARNING);
d6e8d8
				}
d6e8d8
d6e8d8
				if (!$this->language_file || (!$this->language_directory && !in_array($this->language_file, $this->main_files)))
d6e8d8
				{
d6e8d8
					trigger_error($user->lang['NO_FILE_SELECTED'] . adm_back_link($this->u_action), E_USER_WARNING);
d6e8d8
				}
d6e8d8
d6e8d8
				$sql = 'SELECT *
d6e8d8
					FROM ' . LANG_TABLE . "
d6e8d8
					WHERE lang_id = $lang_id";
d6e8d8
				$result = $db->sql_query($sql);
d6e8d8
				$row = $db->sql_fetchrow($result);
d6e8d8
				$db->sql_freeresult($result);
d6e8d8
d6e8d8
				if (!$row)
d6e8d8
				{
d6e8d8
					trigger_error($user->lang['NO_LANG_ID'] . adm_back_link($this->u_action), E_USER_WARNING);
d6e8d8
				}
d6e8d8
d6e8d8
				// Before we attempt to write anything let's check if the admin really chose a correct filename
d6e8d8
				switch ($this->language_directory)
d6e8d8
				{
d6e8d8
					case 'email':
d6e8d8
						// Get email templates
d6e8d8
						$email_files = filelist($phpbb_root_path . 'language/' . $row['lang_iso'], 'email', 'txt');
d6e8d8
						$email_files = $email_files['email/'];
d6e8d8
d6e8d8
						if (!in_array($this->language_file, $email_files))
d6e8d8
						{
d6e8d8
							trigger_error($user->lang['WRONG_LANGUAGE_FILE'] . adm_back_link($this->u_action . '&action=details&id=' . $lang_id), E_USER_WARNING);
d6e8d8
						}
d6e8d8
					break;
d6e8d8
d6e8d8
					case 'acp':
d6e8d8
						// Get acp files
d6e8d8
						$acp_files = filelist($phpbb_root_path . 'language/' . $row['lang_iso'], 'acp', $phpEx);
d6e8d8
						$acp_files = $acp_files['acp/'];
d6e8d8
d6e8d8
						if (!in_array($this->language_file, $acp_files))
d6e8d8
						{
d6e8d8
							trigger_error($user->lang['WRONG_LANGUAGE_FILE'] . adm_back_link($this->u_action . '&action=details&id=' . $lang_id), E_USER_WARNING);
d6e8d8
						}
d6e8d8
					break;
d6e8d8
d6e8d8
					case 'mods':
d6e8d8
						// Get mod files
d6e8d8
						$mods_files = filelist($phpbb_root_path . 'language/' . $row['lang_iso'], 'mods', $phpEx);
d6e8d8
						$mods_files = (isset($mods_files['mods/'])) ? $mods_files['mods/'] : array();
d6e8d8
d6e8d8
						if (!in_array($this->language_file, $mods_files))
d6e8d8
						{
d6e8d8
							trigger_error($user->lang['WRONG_LANGUAGE_FILE'] . adm_back_link($this->u_action . '&action=details&id=' . $lang_id), E_USER_WARNING);
d6e8d8
						}
d6e8d8
					break;
d6e8d8
d6e8d8
					default:
d6e8d8
						if (!in_array($this->language_file, $this->main_files))
d6e8d8
						{
d6e8d8
							trigger_error($user->lang['WRONG_LANGUAGE_FILE'] . adm_back_link($this->u_action . '&action=details&id=' . $lang_id), E_USER_WARNING);
d6e8d8
						}
d6e8d8
					break;
d6e8d8
				}
d6e8d8
d6e8d8
				if (!$safe_mode)
d6e8d8
				{
d6e8d8
					$mkdir_ary = array('language', 'language/' . $row['lang_iso']);
d6e8d8
d6e8d8
					if ($this->language_directory)
d6e8d8
					{
d6e8d8
						$mkdir_ary[] = 'language/' . $row['lang_iso'] . '/' . $this->language_directory;
d6e8d8
					}
d6e8d8
d6e8d8
					foreach ($mkdir_ary as $dir)
d6e8d8
					{
d6e8d8
						$dir = $phpbb_root_path . 'store/' . $dir;
d6e8d8
d6e8d8
						if (!is_dir($dir))
d6e8d8
						{
d6e8d8
							if (!@mkdir($dir, 0777))
d6e8d8
							{
d6e8d8
								trigger_error("Could not create directory $dir", E_USER_ERROR);
d6e8d8
							}
d6e8d8
							@chmod($dir, 0777);
d6e8d8
						}
d6e8d8
					}
d6e8d8
				}
d6e8d8
d6e8d8
				// Get target filename for storage folder
d6e8d8
				$filename = $this->get_filename($row['lang_iso'], $this->language_directory, $this->language_file, true, true);
d6e8d8
				$fp = @fopen($phpbb_root_path . $filename, 'wb');
d6e8d8
d6e8d8
				if (!$fp)
d6e8d8
				{
d6e8d8
					trigger_error(sprintf($user->lang['UNABLE_TO_WRITE_FILE'], $filename) . adm_back_link($this->u_action . '&id=' . $lang_id . '&action=details&language_file=' . urlencode($selected_lang_file)), E_USER_WARNING);
d6e8d8
				}
d6e8d8
d6e8d8
				if ($this->language_directory == 'email')
d6e8d8
				{
d6e8d8
					// Email Template
d6e8d8
					$entry = $this->prepare_lang_entry($_POST['entry'], false);
d6e8d8
					fwrite($fp, $entry);
d6e8d8
				}
d6e8d8
				else
d6e8d8
				{
d6e8d8
					$name = (($this->language_directory) ? $this->language_directory . '_' : '') . $this->language_file;
d6e8d8
					$header = str_replace(array('{FILENAME}', '{LANG_NAME}', '{CHANGED}', '{AUTHOR}'), array($name, $row['lang_english_name'], date('Y-m-d', time()), $row['lang_author']), $this->language_file_header);
d6e8d8
d6e8d8
					if (strpos($this->language_file, 'help_') === 0)
d6e8d8
					{
d6e8d8
						// Help File
d6e8d8
						$header .= '$help = array(' . "\n";
d6e8d8
						fwrite($fp, $header);
d6e8d8
d6e8d8
						foreach ($_POST['entry'] as $key => $value)
d6e8d8
						{
d6e8d8
							if (!is_array($value))
d6e8d8
							{
d6e8d8
								continue;
d6e8d8
							}
d6e8d8
d6e8d8
							$entry = "\tarray(\n";
d6e8d8
d6e8d8
							foreach ($value as $_key => $_value)
d6e8d8
							{
d6e8d8
								$entry .= "\t\t" . (int) $_key . "\t=> '" . $this->prepare_lang_entry($_value) . "',\n";
d6e8d8
							}
d6e8d8
d6e8d8
							$entry .= "\t),\n";
d6e8d8
							fwrite($fp, $entry);
d6e8d8
						}
d6e8d8
d6e8d8
						$footer = ");\n\n?>";
d6e8d8
						fwrite($fp, $footer);
d6e8d8
					}
d6e8d8
					else
d6e8d8
					{
d6e8d8
						// Language File
d6e8d8
						$header .= $this->lang_header;
d6e8d8
						fwrite($fp, $header);
d6e8d8
d6e8d8
						foreach ($_POST['entry'] as $key => $value)
d6e8d8
						{
d6e8d8
							$entry = $this->format_lang_array($key, $value);
d6e8d8
							fwrite($fp, $entry);
d6e8d8
						}
d6e8d8
d6e8d8
						$footer = "));\n\n?>";
d6e8d8
						fwrite($fp, $footer);
d6e8d8
					}
d6e8d8
				}
d6e8d8
d6e8d8
				fclose($fp);
d6e8d8
d6e8d8
				if ($action == 'download_file')
d6e8d8
				{
d6e8d8
					header('Pragma: no-cache');
d6e8d8
					header('Content-Type: application/octetstream; name="' . $this->language_file . '"');
d6e8d8
					header('Content-disposition: attachment; filename=' . $this->language_file);
d6e8d8
d6e8d8
					$fp = @fopen($phpbb_root_path . $filename, 'rb');
d6e8d8
					while ($buffer = fread($fp, 1024))
d6e8d8
					{
d6e8d8
						echo $buffer;
d6e8d8
					}
d6e8d8
					fclose($fp);
d6e8d8
d6e8d8
					add_log('admin', 'LOG_LANGUAGE_FILE_SUBMITTED', $this->language_file);
d6e8d8
d6e8d8
					exit;
d6e8d8
				}
d6e8d8
				else if ($action == 'upload_data')
d6e8d8
				{
d6e8d8
					$sql = 'SELECT lang_iso
d6e8d8
						FROM ' . LANG_TABLE . "
d6e8d8
						WHERE lang_id = $lang_id";
d6e8d8
					$result = $db->sql_query($sql);
d6e8d8
					$row = $db->sql_fetchrow($result);
d6e8d8
					$db->sql_freeresult($result);
d6e8d8
d6e8d8
					$file = request_var('file', '');
d6e8d8
					$dir = request_var('dir', '');
d6e8d8
d6e8d8
					$selected_lang_file = $dir . '|' . $file;
d6e8d8
d6e8d8
					$old_file = '/' . $this->get_filename($row['lang_iso'], $dir, $file, false, true);
d6e8d8
					$lang_path = 'language/' . $row['lang_iso'] . '/' . (($dir) ? $dir . '/' : '');
d6e8d8
d6e8d8
					include_once($phpbb_root_path . 'includes/functions_transfer.' . $phpEx);
d6e8d8
					$method = request_var('method', '');
d6e8d8
d6e8d8
					if ($method != 'ftp' && $method != 'ftp_fsock')
d6e8d8
					{
d6e8d8
						trigger_error($user->lang['INVALID_UPLOAD_METHOD'], E_USER_ERROR);
d6e8d8
					}
d6e8d8
d6e8d8
					$transfer = new $method(request_var('host', ''), request_var('username', ''), request_var('password', ''), request_var('root_path', ''), request_var('port', ''), request_var('timeout', ''));
d6e8d8
d6e8d8
					if (($result = $transfer->open_session()) !== true)
d6e8d8
					{
d6e8d8
						trigger_error($user->lang[$result] . adm_back_link($this->u_action . '&action=details&id=' . $lang_id . '&language_file=' . urlencode($selected_lang_file)), E_USER_WARNING);
d6e8d8
					}
d6e8d8
d6e8d8
					$transfer->rename($lang_path . $file, $lang_path . $file . '.bak');
d6e8d8
					$result = $transfer->copy_file('store/' . $lang_path . $file, $lang_path . $file);
d6e8d8
d6e8d8
					if ($result === false)
d6e8d8
					{
d6e8d8
						// If failed, try to rename again and print error out...
d6e8d8
						$transfer->delete_file($lang_path . $file);
d6e8d8
						$transfer->rename($lang_path . $file . '.bak', $lang_path . $file);
d6e8d8
d6e8d8
						trigger_error($user->lang['UPLOAD_FAILED'] . adm_back_link($this->u_action . '&action=details&id=' . $lang_id . '&language_file=' . urlencode($selected_lang_file)), E_USER_WARNING);
d6e8d8
					}
d6e8d8
d6e8d8
					$transfer->close_session();
d6e8d8
d6e8d8
					// Remove from storage folder
d6e8d8
					if (file_exists($phpbb_root_path . 'store/' . $lang_path . $file))
d6e8d8
					{
d6e8d8
						@unlink($phpbb_root_path . 'store/' . $lang_path . $file);
d6e8d8
					}
d6e8d8
d6e8d8
					add_log('admin', 'LOG_LANGUAGE_FILE_REPLACED', $file);
d6e8d8
d6e8d8
					trigger_error($user->lang['UPLOAD_COMPLETED'] . adm_back_link($this->u_action . '&action=details&id=' . $lang_id . '&language_file=' . urlencode($selected_lang_file)));
d6e8d8
				}
d6e8d8
d6e8d8
				add_log('admin', 'LOG_LANGUAGE_FILE_SUBMITTED', $this->language_file);
d6e8d8
				$action = 'details';
d6e8d8
d6e8d8
			// no break;
d6e8d8
d6e8d8
			case 'details':
d6e8d8
d6e8d8
				if (!$lang_id)
d6e8d8
				{
d6e8d8
					trigger_error($user->lang['NO_LANG_ID'] . adm_back_link($this->u_action), E_USER_WARNING);
d6e8d8
				}
d6e8d8
d6e8d8
				$this->page_title = 'LANGUAGE_PACK_DETAILS';
d6e8d8
d6e8d8
				$sql = 'SELECT *
d6e8d8
					FROM ' . LANG_TABLE . '
d6e8d8
					WHERE lang_id = ' . $lang_id;
d6e8d8
				$result = $db->sql_query($sql);
d6e8d8
				$lang_entries = $db->sql_fetchrow($result);
d6e8d8
				$db->sql_freeresult($result);
d6e8d8
d6e8d8
				$lang_iso = $lang_entries['lang_iso'];
d6e8d8
				$missing_vars = $missing_files = array();
d6e8d8
d6e8d8
				// Get email templates
d6e8d8
				$email_files = filelist($phpbb_root_path . 'language/' . $config['default_lang'], 'email', 'txt');
d6e8d8
				$email_files = $email_files['email/'];
d6e8d8
d6e8d8
				// Get acp files
d6e8d8
				$acp_files = filelist($phpbb_root_path . 'language/' . $config['default_lang'], 'acp', $phpEx);
d6e8d8
				$acp_files = $acp_files['acp/'];
d6e8d8
d6e8d8
				// Get mod files
d6e8d8
				$mods_files = filelist($phpbb_root_path . 'language/' . $config['default_lang'], 'mods', $phpEx);
d6e8d8
				$mods_files = (isset($mods_files['mods/'])) ? $mods_files['mods/'] : array();
d6e8d8
d6e8d8
				// Check if our current filename matches the files
d6e8d8
				switch ($this->language_directory)
d6e8d8
				{
d6e8d8
					case 'email':
d6e8d8
						if (!in_array($this->language_file, $email_files))
d6e8d8
						{
d6e8d8
							trigger_error($user->lang['WRONG_LANGUAGE_FILE'] . adm_back_link($this->u_action . '&action=details&id=' . $lang_id), E_USER_WARNING);
d6e8d8
						}
d6e8d8
					break;
d6e8d8
d6e8d8
					case 'acp':
d6e8d8
						if (!in_array($this->language_file, $acp_files))
d6e8d8
						{
d6e8d8
							trigger_error($user->lang['WRONG_LANGUAGE_FILE'] . adm_back_link($this->u_action . '&action=details&id=' . $lang_id), E_USER_WARNING);
d6e8d8
						}
d6e8d8
					break;
d6e8d8
d6e8d8
					case 'mods':
d6e8d8
						if (!in_array($this->language_file, $mods_files))
d6e8d8
						{
d6e8d8
							trigger_error($user->lang['WRONG_LANGUAGE_FILE'] . adm_back_link($this->u_action . '&action=details&id=' . $lang_id), E_USER_WARNING);
d6e8d8
						}
d6e8d8
					break;
d6e8d8
d6e8d8
					default:
d6e8d8
						if (!in_array($this->language_file, $this->main_files))
d6e8d8
						{
d6e8d8
							trigger_error($user->lang['WRONG_LANGUAGE_FILE'] . adm_back_link($this->u_action . '&action=details&id=' . $lang_id), E_USER_WARNING);
d6e8d8
						}
d6e8d8
				}
d6e8d8
d6e8d8
				if (isset($_POST['remove_store']))
d6e8d8
				{
d6e8d8
					$store_filename = $this->get_filename($lang_iso, $this->language_directory, $this->language_file, true, true);
d6e8d8
d6e8d8
					if (file_exists($phpbb_root_path . $store_filename))
d6e8d8
					{
d6e8d8
						@unlink($phpbb_root_path . $store_filename);
d6e8d8
					}
d6e8d8
				}
d6e8d8
d6e8d8
				include_once($phpbb_root_path . 'includes/functions_transfer.' . $phpEx);
d6e8d8
d6e8d8
				$methods = transfer::methods();
d6e8d8
d6e8d8
				foreach ($methods as $method)
d6e8d8
				{
d6e8d8
					$template->assign_block_vars('buttons', array(
d6e8d8
						'VALUE' => $method
d6e8d8
					));
d6e8d8
				}
d6e8d8
d6e8d8
				$template->assign_vars(array(
d6e8d8
					'S_DETAILS'			=> true,
d6e8d8
					'U_ACTION'			=> $this->u_action . "&action=details&id=$lang_id",
d6e8d8
					'U_BACK'			=> $this->u_action,
d6e8d8
					'LANG_LOCAL_NAME'	=> $lang_entries['lang_local_name'],
d6e8d8
					'LANG_ENGLISH_NAME'	=> $lang_entries['lang_english_name'],
d6e8d8
					'LANG_ISO'			=> $lang_entries['lang_iso'],
d6e8d8
					'LANG_AUTHOR'		=> $lang_entries['lang_author'],
d6e8d8
					'ALLOW_UPLOAD'		=> sizeof($methods)
d6e8d8
					)
d6e8d8
				);
d6e8d8
d6e8d8
				// If current lang is different from the default lang, then first try to grab missing/additional vars
d6e8d8
				if ($lang_iso != $config['default_lang'])
d6e8d8
				{
d6e8d8
					$is_missing_var = false;
d6e8d8
d6e8d8
					foreach ($this->main_files as $file)
d6e8d8
					{
d6e8d8
						if (file_exists($phpbb_root_path . $this->get_filename($lang_iso, '', $file)))
d6e8d8
						{
d6e8d8
							$missing_vars[$file] = $this->compare_language_files($config['default_lang'], $lang_iso, '', $file);
d6e8d8
d6e8d8
							if (sizeof($missing_vars[$file]))
d6e8d8
							{
d6e8d8
								$is_missing_var = true;
d6e8d8
							}
d6e8d8
						}
d6e8d8
						else
d6e8d8
						{
d6e8d8
							$missing_files[] = $this->get_filename($lang_iso, '', $file);
d6e8d8
						}
d6e8d8
					}
d6e8d8
d6e8d8
					// Now go through acp/mods directories
d6e8d8
					foreach ($acp_files as $file)
d6e8d8
					{
d6e8d8
						if (file_exists($phpbb_root_path . $this->get_filename($lang_iso, 'acp', $file)))
d6e8d8
						{
d6e8d8
							$missing_vars['acp/' . $file] = $this->compare_language_files($config['default_lang'], $lang_iso, 'acp', $file);
d6e8d8
d6e8d8
							if (sizeof($missing_vars['acp/' . $file]))
d6e8d8
							{
d6e8d8
								$is_missing_var = true;
d6e8d8
							}
d6e8d8
						}
d6e8d8
						else
d6e8d8
						{
d6e8d8
							$missing_files[] = $this->get_filename($lang_iso, 'acp', $file);
d6e8d8
						}
d6e8d8
					}
d6e8d8
d6e8d8
					if (sizeof($mods_files))
d6e8d8
					{
d6e8d8
						foreach ($mods_files as $file)
d6e8d8
						{
d6e8d8
							if (file_exists($phpbb_root_path . $this->get_filename($lang_iso, 'mods', $file)))
d6e8d8
							{
d6e8d8
								$missing_vars['mods/' . $file] = $this->compare_language_files($config['default_lang'], $lang_iso, 'mods', $file);
d6e8d8
d6e8d8
								if (sizeof($missing_vars['mods/' . $file]))
d6e8d8
								{
d6e8d8
									$is_missing_var = true;
d6e8d8
								}
d6e8d8
							}
d6e8d8
							else
d6e8d8
							{
d6e8d8
								$missing_files[] = $this->get_filename($lang_iso, 'mods', $file);
d6e8d8
							}
d6e8d8
						}
d6e8d8
					}
d6e8d8
d6e8d8
					// More missing files... for example email templates?
d6e8d8
					foreach ($email_files as $file)
d6e8d8
					{
d6e8d8
						if (!file_exists($phpbb_root_path . $this->get_filename($lang_iso, 'email', $file)))
d6e8d8
						{
d6e8d8
							$missing_files[] = $this->get_filename($lang_iso, 'email', $file);
d6e8d8
						}
d6e8d8
					}
d6e8d8
d6e8d8
					if (sizeof($missing_files))
d6e8d8
					{
d6e8d8
						$template->assign_vars(array(
d6e8d8
							'S_MISSING_FILES'		=> true,
d6e8d8
							'L_MISSING_FILES'		=> sprintf($user->lang['THOSE_MISSING_LANG_FILES'], $lang_entries['lang_local_name']),
d6e8d8
							'MISSING_FILES'			=> implode('
', $missing_files))
d6e8d8
						);
d6e8d8
					}
d6e8d8
d6e8d8
					if ($is_missing_var)
d6e8d8
					{
d6e8d8
						$template->assign_vars(array(
d6e8d8
							'S_MISSING_VARS'			=> true,
d6e8d8
							'L_MISSING_VARS_EXPLAIN'	=> sprintf($user->lang['THOSE_MISSING_LANG_VARIABLES'], $lang_entries['lang_local_name']),
d6e8d8
							'U_MISSING_ACTION'			=> $this->u_action . "&action=$action&id=$lang_id")
d6e8d8
						);
d6e8d8
d6e8d8
						foreach ($missing_vars as $file => $vars)
d6e8d8
						{
d6e8d8
							if (!sizeof($vars))
d6e8d8
							{
d6e8d8
								continue;
d6e8d8
							}
d6e8d8
d6e8d8
							$template->assign_block_vars('missing', array(
d6e8d8
								'FILE'			=> $file,
d6e8d8
								'TPL'			=> $this->print_language_entries($vars, '', false),
d6e8d8
								'KEY'			=> (strpos($file, '/') === false) ? '|' . $file : str_replace('/', '|', $file))
d6e8d8
							);
d6e8d8
						}
d6e8d8
					}
d6e8d8
				}
d6e8d8
d6e8d8
				// Main language files
d6e8d8
				$s_lang_options = '<option value="|common.' . $phpEx . '" class="sep">' . $user->lang['LANGUAGE_FILES'] . '</option>';
d6e8d8
				foreach ($this->main_files as $file)
d6e8d8
				{
d6e8d8
					if (strpos($file, 'help_') === 0)
d6e8d8
					{
d6e8d8
						continue;
d6e8d8
					}
d6e8d8
d6e8d8
					$prefix = (file_exists($phpbb_root_path . $this->get_filename($lang_iso, '', $file, true, true))) ? '* ' : '';
d6e8d8
d6e8d8
					$selected = (!$this->language_directory && $this->language_file == $file) ? ' selected="selected"' : '';
d6e8d8
					$s_lang_options .= '<option value="|' . $file . '"' . $selected . '>' . $prefix . $file . '</option>';
d6e8d8
				}
d6e8d8
d6e8d8
				// Help Files
d6e8d8
				$s_lang_options .= '<option value="|common.' . $phpEx . '" class="sep">' . $user->lang['HELP_FILES'] . '</option>';
d6e8d8
				foreach ($this->main_files as $file)
d6e8d8
				{
d6e8d8
					if (strpos($file, 'help_') !== 0)
d6e8d8
					{
d6e8d8
						continue;
d6e8d8
					}
d6e8d8
d6e8d8
					$prefix = (file_exists($phpbb_root_path . $this->get_filename($lang_iso, '', $file, true, true))) ? '* ' : '';
d6e8d8
d6e8d8
					$selected = (!$this->language_directory && $this->language_file == $file) ? ' selected="selected"' : '';
d6e8d8
					$s_lang_options .= '<option value="|' . $file . '"' . $selected . '>' . $prefix . $file . '</option>';
d6e8d8
				}
d6e8d8
d6e8d8
				// Now every other language directory
d6e8d8
				$check_files = array('email', 'acp', 'mods');
d6e8d8
d6e8d8
				foreach ($check_files as $check)
d6e8d8
				{
d6e8d8
					if (!sizeof(${$check . '_files'}))
d6e8d8
					{
d6e8d8
						continue;
d6e8d8
					}
d6e8d8
d6e8d8
					$s_lang_options .= '<option value="|common.' . $phpEx . '" class="sep">' . $user->lang[strtoupper($check) . '_FILES'] . '</option>';
d6e8d8
d6e8d8
					foreach (${$check . '_files'} as $file)
d6e8d8
					{
d6e8d8
						$prefix = (file_exists($phpbb_root_path . $this->get_filename($lang_iso, $check, $file, true, true))) ? '* ' : '';
d6e8d8
d6e8d8
						$selected = ($this->language_directory == $check && $this->language_file == $file) ? ' selected="selected"' : '';
d6e8d8
						$s_lang_options .= '<option value="' . $check . '|' . $file . '"' . $selected . '>' . $prefix . $file . '</option>';
d6e8d8
					}
d6e8d8
				}
d6e8d8
d6e8d8
				// Get Language Entries - if saved within store folder, we take this one (with the option to remove it)
d6e8d8
				$lang = array();
d6e8d8
d6e8d8
				$is_email_file = ($this->language_directory == 'email') ? true : false;
d6e8d8
				$is_help_file = (strpos($this->language_file, 'help_') === 0) ? true : false;
d6e8d8
d6e8d8
				$file_from_store = (file_exists($phpbb_root_path . $this->get_filename($lang_iso, $this->language_directory, $this->language_file, true, true))) ? true : false;
d6e8d8
				$no_store_filename = $this->get_filename($lang_iso, $this->language_directory, $this->language_file);
d6e8d8
d6e8d8
				if (!$file_from_store && !file_exists($phpbb_root_path . $no_store_filename))
d6e8d8
				{
d6e8d8
					$print_message = sprintf($user->lang['MISSING_LANGUAGE_FILE'], $no_store_filename);
d6e8d8
				}
d6e8d8
				else
d6e8d8
				{
d6e8d8
					if ($is_email_file)
d6e8d8
					{
d6e8d8
						$lang = file_get_contents($phpbb_root_path . $this->get_filename($lang_iso, $this->language_directory, $this->language_file, $file_from_store));
d6e8d8
					}
d6e8d8
					else
d6e8d8
					{
d6e8d8
						$help = array();
d6e8d8
						include($phpbb_root_path . $this->get_filename($lang_iso, $this->language_directory, $this->language_file, $file_from_store));
d6e8d8
d6e8d8
						if ($is_help_file)
d6e8d8
						{
d6e8d8
							$lang = $help;
d6e8d8
							unset($help);
d6e8d8
						}
d6e8d8
					}
d6e8d8
d6e8d8
					$print_message = (($this->language_directory) ? $this->language_directory . '/' : '') . $this->language_file;
d6e8d8
				}
d6e8d8
d6e8d8
				// Normal language pack entries
d6e8d8
				$template->assign_vars(array(
d6e8d8
					'U_ENTRY_ACTION'		=> $this->u_action . "&action=details&id=$lang_id#entries",
d6e8d8
					'S_EMAIL_FILE'			=> $is_email_file,
d6e8d8
					'S_FROM_STORE'			=> $file_from_store,
d6e8d8
					'S_LANG_OPTIONS'		=> $s_lang_options,
d6e8d8
					'PRINT_MESSAGE'			=> $print_message,
d6e8d8
					)
d6e8d8
				);
d6e8d8
d6e8d8
				if (!$is_email_file)
d6e8d8
				{
d6e8d8
					$tpl = '';
d6e8d8
					$name = (($this->language_directory) ? $this->language_directory . '/' : '') . $this->language_file;
d6e8d8
d6e8d8
					if (isset($missing_vars[$name]) && sizeof($missing_vars[$name]))
d6e8d8
					{
d6e8d8
						$tpl .= $this->print_language_entries($missing_vars[$name], '* ');
d6e8d8
					}
d6e8d8
d6e8d8
					$tpl .= $this->print_language_entries($lang);
d6e8d8
d6e8d8
					$template->assign_var('TPL', $tpl);
d6e8d8
					unset($tpl);
d6e8d8
				}
d6e8d8
				else
d6e8d8
				{
d6e8d8
					$template->assign_vars(array(
d6e8d8
						'LANG'		=> $lang)
d6e8d8
					);
d6e8d8
d6e8d8
					unset($lang);
d6e8d8
				}
d6e8d8
d6e8d8
				return;
d6e8d8
d6e8d8
			break;
d6e8d8
d6e8d8
			case 'delete':
d6e8d8
d6e8d8
				if (!$lang_id)
d6e8d8
				{
d6e8d8
					trigger_error($user->lang['NO_LANG_ID'] . adm_back_link($this->u_action), E_USER_WARNING);
d6e8d8
				}
d6e8d8
d6e8d8
				$sql = 'SELECT *
d6e8d8
					FROM ' . LANG_TABLE . '
d6e8d8
					WHERE lang_id = ' . $lang_id;
d6e8d8
				$result = $db->sql_query($sql);
d6e8d8
				$row = $db->sql_fetchrow($result);
d6e8d8
				$db->sql_freeresult($result);
d6e8d8
d6e8d8
				if ($row['lang_iso'] == $config['default_lang'])
d6e8d8
				{
d6e8d8
					trigger_error($user->lang['NO_REMOVE_DEFAULT_LANG'] . adm_back_link($this->u_action), E_USER_WARNING);
d6e8d8
				}
d6e8d8
d6e8d8
				$db->sql_query('DELETE FROM ' . LANG_TABLE . ' WHERE lang_id = ' . $lang_id);
d6e8d8
d6e8d8
				$sql = 'UPDATE ' . USERS_TABLE . "
d6e8d8
					SET user_lang = '" . $db->sql_escape($config['default_lang']) . "'
d6e8d8
					WHERE user_lang = '" . $db->sql_escape($row['lang_iso']) . "'";
d6e8d8
				$db->sql_query($sql);
d6e8d8
d6e8d8
				// We also need to remove the translated entries for custom profile fields - we want clean tables, don't we?
d6e8d8
				$sql = 'DELETE FROM ' . PROFILE_LANG_TABLE . ' WHERE lang_id = ' . $lang_id;
d6e8d8
				$db->sql_query($sql);
d6e8d8
d6e8d8
				$sql = 'DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . ' WHERE lang_id = ' . $lang_id;
d6e8d8
				$db->sql_query($sql);
d6e8d8
d6e8d8
				$sql = 'DELETE FROM ' . STYLES_IMAGESET_DATA_TABLE . " WHERE image_lang = '" . $db->sql_escape($row['lang_iso']) . "'";
d6e8d8
				$result = $db->sql_query($sql);
d6e8d8
d6e8d8
				$cache->destroy('sql', STYLES_IMAGESET_DATA_TABLE);
d6e8d8
d6e8d8
				add_log('admin', 'LOG_LANGUAGE_PACK_DELETED', $row['lang_english_name']);
d6e8d8
d6e8d8
				trigger_error(sprintf($user->lang['LANGUAGE_PACK_DELETED'], $row['lang_english_name']) . adm_back_link($this->u_action));
d6e8d8
			break;
d6e8d8
d6e8d8
			case 'install':
d6e8d8
				$lang_iso = request_var('iso', '');
d6e8d8
				$lang_iso = basename($lang_iso);
d6e8d8
d6e8d8
				if (!$lang_iso || !file_exists("{$phpbb_root_path}language/$lang_iso/iso.txt"))
d6e8d8
				{
d6e8d8
					trigger_error($user->lang['LANGUAGE_PACK_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING);
d6e8d8
				}
d6e8d8
d6e8d8
				$file = file("{$phpbb_root_path}language/$lang_iso/iso.txt");
d6e8d8
d6e8d8
				$lang_pack = array(
d6e8d8
					'iso'		=> $lang_iso,
d6e8d8
					'name'		=> trim(htmlspecialchars($file[0])),
d6e8d8
					'local_name'=> trim(htmlspecialchars($file[1], ENT_COMPAT, 'UTF-8')),
d6e8d8
					'author'	=> trim(htmlspecialchars($file[2], ENT_COMPAT, 'UTF-8'))
d6e8d8
				);
d6e8d8
				unset($file);
d6e8d8
d6e8d8
				$sql = 'SELECT lang_iso
d6e8d8
					FROM ' . LANG_TABLE . "
d6e8d8
					WHERE lang_iso = '" . $db->sql_escape($lang_iso) . "'";
d6e8d8
				$result = $db->sql_query($sql);
d6e8d8
				$row = $db->sql_fetchrow($result);
d6e8d8
				$db->sql_freeresult($result);
d6e8d8
d6e8d8
				if ($row)
d6e8d8
				{
d6e8d8
					trigger_error($user->lang['LANGUAGE_PACK_ALREADY_INSTALLED'] . adm_back_link($this->u_action), E_USER_WARNING);
d6e8d8
				}
d6e8d8
d6e8d8
				if (!$lang_pack['name'] || !$lang_pack['local_name'])
d6e8d8
				{
d6e8d8
					trigger_error($user->lang['INVALID_LANGUAGE_PACK'] . adm_back_link($this->u_action), E_USER_WARNING);
d6e8d8
				}
d6e8d8
d6e8d8
				// Add language pack
d6e8d8
				$sql_ary = array(
d6e8d8
					'lang_iso'			=> $lang_pack['iso'],
d6e8d8
					'lang_dir'			=> $lang_pack['iso'],
d6e8d8
					'lang_english_name'	=> $lang_pack['name'],
d6e8d8
					'lang_local_name'	=> $lang_pack['local_name'],
d6e8d8
					'lang_author'		=> $lang_pack['author']
d6e8d8
				);
d6e8d8
d6e8d8
				$db->sql_query('INSERT INTO ' . LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
d6e8d8
				$lang_id = $db->sql_nextid();
d6e8d8
d6e8d8
				$valid_localized = array(
d6e8d8
					'icon_back_top', 'icon_contact_aim', 'icon_contact_email', 'icon_contact_icq', 'icon_contact_jabber', 'icon_contact_msnm', 'icon_contact_pm', 'icon_contact_yahoo', 'icon_contact_www', 'icon_post_delete', 'icon_post_edit', 'icon_post_info', 'icon_post_quote', 'icon_post_report', 'icon_user_online', 'icon_user_offline', 'icon_user_profile', 'icon_user_search', 'icon_user_warn', 'button_pm_forward', 'button_pm_new', 'button_pm_reply', 'button_topic_locked', 'button_topic_new', 'button_topic_reply',
d6e8d8
				);
d6e8d8
d6e8d8
				$sql_ary = array();
d6e8d8
d6e8d8
				$sql = 'SELECT *
d6e8d8
					FROM ' . STYLES_IMAGESET_TABLE;
d6e8d8
				$result = $db->sql_query($sql);
d6e8d8
				while ($imageset_row = $db->sql_fetchrow($result))
d6e8d8
				{
d6e8d8
					if (@file_exists("{$phpbb_root_path}styles/{$imageset_row['imageset_path']}/imageset/{$lang_pack['iso']}/imageset.cfg"))
d6e8d8
					{
d6e8d8
						$cfg_data_imageset_data = parse_cfg_file("{$phpbb_root_path}styles/{$imageset_row['imageset_path']}/imageset/{$lang_pack['iso']}/imageset.cfg");
d6e8d8
						foreach ($cfg_data_imageset_data as $image_name => $value)
d6e8d8
						{
d6e8d8
							if (strpos($value, '*') !== false)
d6e8d8
							{
d6e8d8
								if (substr($value, -1, 1) === '*')
d6e8d8
								{
d6e8d8
									list($image_filename, $image_height) = explode('*', $value);
d6e8d8
									$image_width = 0;
d6e8d8
								}
d6e8d8
								else
d6e8d8
								{
d6e8d8
									list($image_filename, $image_height, $image_width) = explode('*', $value);
d6e8d8
								}
d6e8d8
							}
d6e8d8
							else
d6e8d8
							{
d6e8d8
								$image_filename = $value;
d6e8d8
								$image_height = $image_width = 0;
d6e8d8
							}
d6e8d8
d6e8d8
							if (strpos($image_name, 'img_') === 0 && $image_filename)
d6e8d8
							{
d6e8d8
								$image_name = substr($image_name, 4);
d6e8d8
								if (in_array($image_name, $valid_localized))
d6e8d8
								{
d6e8d8
									$sql_ary[] = array(
d6e8d8
										'image_name'		=> (string) $image_name,
d6e8d8
										'image_filename'	=> (string) $image_filename,
d6e8d8
										'image_height'		=> (int) $image_height,
d6e8d8
										'image_width'		=> (int) $image_width,
d6e8d8
										'imageset_id'		=> (int) $imageset_row['imageset_id'],
d6e8d8
										'image_lang'		=> (string) $lang_pack['iso'],
d6e8d8
									);
d6e8d8
								}
d6e8d8
							}
d6e8d8
						}
d6e8d8
					}
d6e8d8
				}
d6e8d8
				$db->sql_freeresult($result);
d6e8d8
d6e8d8
				if (sizeof($sql_ary))
d6e8d8
				{
d6e8d8
					$db->sql_multi_insert(STYLES_IMAGESET_DATA_TABLE, $sql_ary);
d6e8d8
					$cache->destroy('sql', STYLES_IMAGESET_DATA_TABLE);
d6e8d8
				}
d6e8d8
d6e8d8
				// Now let's copy the default language entries for custom profile fields for this new language - makes admin's life easier.
d6e8d8
				$sql = 'SELECT lang_id
d6e8d8
					FROM ' . LANG_TABLE . "
d6e8d8
					WHERE lang_iso = '" . $db->sql_escape($config['default_lang']) . "'";
d6e8d8
				$result = $db->sql_query($sql);
d6e8d8
				$default_lang_id = (int) $db->sql_fetchfield('lang_id');
d6e8d8
				$db->sql_freeresult($result);
d6e8d8
d6e8d8
				// From the mysql documentation:
d6e8d8
				// Prior to MySQL 4.0.14, the target table of the INSERT statement cannot appear in the FROM clause of the SELECT part of the query. This limitation is lifted in 4.0.14.
d6e8d8
				// Due to this we stay on the safe side if we do the insertion "the manual way"
d6e8d8
d6e8d8
				$sql = 'SELECT field_id, lang_name, lang_explain, lang_default_value
d6e8d8
					FROM ' . PROFILE_LANG_TABLE . '
d6e8d8
					WHERE lang_id = ' . $default_lang_id;
d6e8d8
				$result = $db->sql_query($sql);
d6e8d8
d6e8d8
				while ($row = $db->sql_fetchrow($result))
d6e8d8
				{
d6e8d8
					$row['lang_id'] = $lang_id;
d6e8d8
					$db->sql_query('INSERT INTO ' . PROFILE_LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $row));
d6e8d8
				}
d6e8d8
				$db->sql_freeresult($result);
d6e8d8
d6e8d8
				$sql = 'SELECT field_id, option_id, field_type, lang_value
d6e8d8
					FROM ' . PROFILE_FIELDS_LANG_TABLE . '
d6e8d8
					WHERE lang_id = ' . $default_lang_id;
d6e8d8
				$result = $db->sql_query($sql);
d6e8d8
d6e8d8
				while ($row = $db->sql_fetchrow($result))
d6e8d8
				{
d6e8d8
					$row['lang_id'] = $lang_id;
d6e8d8
					$db->sql_query('INSERT INTO ' . PROFILE_FIELDS_LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $row));
d6e8d8
				}
d6e8d8
				$db->sql_freeresult($result);
d6e8d8
d6e8d8
				add_log('admin', 'LOG_LANGUAGE_PACK_INSTALLED', $lang_pack['name']);
d6e8d8
d6e8d8
				trigger_error(sprintf($user->lang['LANGUAGE_PACK_INSTALLED'], $lang_pack['name']) . adm_back_link($this->u_action));
d6e8d8
d6e8d8
			break;
d6e8d8
d6e8d8
			case 'download':
d6e8d8
d6e8d8
				if (!$lang_id)
d6e8d8
				{
d6e8d8
					trigger_error($user->lang['NO_LANG_ID'] . adm_back_link($this->u_action), E_USER_WARNING);
d6e8d8
				}
d6e8d8
d6e8d8
				$sql = 'SELECT *
d6e8d8
					FROM ' . LANG_TABLE . '
d6e8d8
					WHERE lang_id = ' . $lang_id;
d6e8d8
				$result = $db->sql_query($sql);
d6e8d8
				$row = $db->sql_fetchrow($result);
d6e8d8
				$db->sql_freeresult($result);
d6e8d8
d6e8d8
				$use_method = request_var('use_method', '');
d6e8d8
				$methods = array('.tar');
d6e8d8
d6e8d8
				$available_methods = array('.tar.gz' => 'zlib', '.tar.bz2' => 'bz2', '.zip' => 'zlib');
d6e8d8
				foreach ($available_methods as $type => $module)
d6e8d8
				{
d6e8d8
					if (!@extension_loaded($module))
d6e8d8
					{
d6e8d8
						continue;
d6e8d8
					}
d6e8d8
d6e8d8
					$methods[] = $type;
d6e8d8
				}
d6e8d8
d6e8d8
				// Let the user decide in which format he wants to have the pack
d6e8d8
				if (!$use_method)
d6e8d8
				{
d6e8d8
					$this->page_title = 'SELECT_DOWNLOAD_FORMAT';
d6e8d8
d6e8d8
					$radio_buttons = '';
d6e8d8
					foreach ($methods as $method)
d6e8d8
					{
d6e8d8
						$radio_buttons .= '<label><input type="radio"' . ((!$radio_buttons) ? ' id="use_method"' : '') . ' class="radio" value="' . $method . '" name="use_method" /> ' . $method . '</label>';
d6e8d8
					}
d6e8d8
d6e8d8
					$template->assign_vars(array(
d6e8d8
						'S_SELECT_METHOD'		=> true,
d6e8d8
						'U_BACK'				=> $this->u_action,
d6e8d8
						'U_ACTION'				=> $this->u_action . "&action=$action&id=$lang_id",
d6e8d8
						'RADIO_BUTTONS'			=> $radio_buttons)
d6e8d8
					);
d6e8d8
d6e8d8
					return;
d6e8d8
				}
d6e8d8
d6e8d8
				if (!in_array($use_method, $methods))
d6e8d8
				{
d6e8d8
					$use_method = '.tar';
d6e8d8
				}
d6e8d8
d6e8d8
				include_once($phpbb_root_path . 'includes/functions_compress.' . $phpEx);
d6e8d8
d6e8d8
				if ($use_method == '.zip')
d6e8d8
				{
d6e8d8
					$compress = new compress_zip('w', $phpbb_root_path . 'store/lang_' . $row['lang_iso'] . $use_method);
d6e8d8
				}
d6e8d8
				else
d6e8d8
				{
d6e8d8
					$compress = new compress_tar('w', $phpbb_root_path . 'store/lang_' . $row['lang_iso'] . $use_method, $use_method);
d6e8d8
				}
d6e8d8
d6e8d8
				// Get email templates
d6e8d8
				$email_templates = filelist($phpbb_root_path . 'language/' . $row['lang_iso'], 'email', 'txt');
d6e8d8
				$email_templates = $email_templates['email/'];
d6e8d8
d6e8d8
				// Get acp files
d6e8d8
				$acp_files = filelist($phpbb_root_path . 'language/' . $row['lang_iso'], 'acp', $phpEx);
d6e8d8
				$acp_files = $acp_files['acp/'];
d6e8d8
d6e8d8
				// Get mod files
d6e8d8
				$mod_files = filelist($phpbb_root_path . 'language/' . $row['lang_iso'], 'mods', $phpEx);
d6e8d8
				$mod_files = (isset($mod_files['mods/'])) ? $mod_files['mods/'] : array();
d6e8d8
d6e8d8
				// Add main files
d6e8d8
				$this->add_to_archive($compress, $this->main_files, $row['lang_iso']);
d6e8d8
d6e8d8
				// Add search files if they exist...
d6e8d8
				if (file_exists($phpbb_root_path . 'language/' . $row['lang_iso'] . '/search_ignore_words.' . $phpEx))
d6e8d8
				{
d6e8d8
					$this->add_to_archive($compress, array("search_ignore_words.$phpEx"), $row['lang_iso']);
d6e8d8
				}
d6e8d8
d6e8d8
				if (file_exists($phpbb_root_path . 'language/' . $row['lang_iso'] . '/search_synonyms.' . $phpEx))
d6e8d8
				{
d6e8d8
					$this->add_to_archive($compress, array("search_synonyms.$phpEx"), $row['lang_iso']);
d6e8d8
				}
d6e8d8
d6e8d8
				// Write files in folders
d6e8d8
				$this->add_to_archive($compress, $email_templates, $row['lang_iso'], 'email');
d6e8d8
				$this->add_to_archive($compress, $acp_files, $row['lang_iso'], 'acp');
d6e8d8
				$this->add_to_archive($compress, $mod_files, $row['lang_iso'], 'mods');
d6e8d8
d6e8d8
				// Write ISO File
d6e8d8
				$iso_src = htmlspecialchars_decode($row['lang_english_name']) . "\n";
d6e8d8
				$iso_src .= htmlspecialchars_decode($row['lang_local_name']) . "\n";
d6e8d8
				$iso_src .= htmlspecialchars_decode($row['lang_author']);
d6e8d8
				$compress->add_data($iso_src, 'language/' . $row['lang_iso'] . '/iso.txt');
d6e8d8
d6e8d8
				// index.html files
d6e8d8
				$compress->add_data('', 'language/' . $row['lang_iso'] . '/index.html');
d6e8d8
				$compress->add_data('', 'language/' . $row['lang_iso'] . '/email/index.html');
d6e8d8
				$compress->add_data('', 'language/' . $row['lang_iso'] . '/acp/index.html');
d6e8d8
d6e8d8
				if (sizeof($mod_files))
d6e8d8
				{
d6e8d8
					$compress->add_data('', 'language/' . $row['lang_iso'] . '/mods/index.html');
d6e8d8
				}
d6e8d8
d6e8d8
				$compress->close();
d6e8d8
d6e8d8
				$compress->download('lang_' . $row['lang_iso']);
d6e8d8
				@unlink($phpbb_root_path . 'store/lang_' . $row['lang_iso'] . $use_method);
d6e8d8
d6e8d8
				exit;
d6e8d8
d6e8d8
			break;
d6e8d8
		}
d6e8d8
d6e8d8
		$sql = 'SELECT user_lang, COUNT(user_lang) AS lang_count
d6e8d8
			FROM ' . USERS_TABLE . '
d6e8d8
			GROUP BY user_lang';
d6e8d8
		$result = $db->sql_query($sql);
d6e8d8
d6e8d8
		$lang_count = array();
d6e8d8
		while ($row = $db->sql_fetchrow($result))
d6e8d8
		{
d6e8d8
			$lang_count[$row['user_lang']] = $row['lang_count'];
d6e8d8
		}
d6e8d8
		$db->sql_freeresult($result);
d6e8d8
d6e8d8
		$sql = 'SELECT *
d6e8d8
			FROM ' . LANG_TABLE . '
d6e8d8
			ORDER BY lang_english_name';
d6e8d8
		$result = $db->sql_query($sql);
d6e8d8
d6e8d8
		$installed = array();
d6e8d8
d6e8d8
		while ($row = $db->sql_fetchrow($result))
d6e8d8
		{
d6e8d8
			$installed[] = $row['lang_iso'];
d6e8d8
			$tagstyle = ($row['lang_iso'] == $config['default_lang']) ? '*' : '';
d6e8d8
d6e8d8
			$template->assign_block_vars('lang', array(
d6e8d8
				'U_DETAILS'			=> $this->u_action . "&action=details&id={$row['lang_id']}",
d6e8d8
				'U_DOWNLOAD'		=> $this->u_action . "&action=download&id={$row['lang_id']}",
d6e8d8
				'U_DELETE'			=> $this->u_action . "&action=delete&id={$row['lang_id']}",
d6e8d8
d6e8d8
				'ENGLISH_NAME'		=> $row['lang_english_name'],
d6e8d8
				'TAG'				=> $tagstyle,
d6e8d8
				'LOCAL_NAME'		=> $row['lang_local_name'],
d6e8d8
				'ISO'				=> $row['lang_iso'],
d6e8d8
				'USED_BY'			=> (isset($lang_count[$row['lang_iso']])) ? $lang_count[$row['lang_iso']] : 0,
d6e8d8
			));
d6e8d8
		}
d6e8d8
		$db->sql_freeresult($result);
d6e8d8
d6e8d8
		$new_ary = $iso = array();
d6e8d8
		$dp = @opendir("{$phpbb_root_path}language");
d6e8d8
d6e8d8
		if ($dp)
d6e8d8
		{
d6e8d8
			while (($file = readdir($dp)) !== false)
d6e8d8
			{
d6e8d8
				if ($file[0] != '.' && file_exists("{$phpbb_root_path}language/$file/iso.txt"))
d6e8d8
				{
d6e8d8
					if (!in_array($file, $installed))
d6e8d8
					{
d6e8d8
						if ($iso = file("{$phpbb_root_path}language/$file/iso.txt"))
d6e8d8
						{
d6e8d8
							if (sizeof($iso) == 3)
d6e8d8
							{
d6e8d8
								$new_ary[$file] = array(
d6e8d8
									'iso'		=> $file,
d6e8d8
									'name'		=> trim($iso[0]),
d6e8d8
									'local_name'=> trim($iso[1]),
d6e8d8
									'author'	=> trim($iso[2])
d6e8d8
								);
d6e8d8
							}
d6e8d8
						}
d6e8d8
					}
d6e8d8
				}
d6e8d8
			}
d6e8d8
			closedir($dp);
d6e8d8
		}
d6e8d8
d6e8d8
		unset($installed);
d6e8d8
d6e8d8
		if (sizeof($new_ary))
d6e8d8
		{
d6e8d8
			foreach ($new_ary as $iso => $lang_ary)
d6e8d8
			{
d6e8d8
				$template->assign_block_vars('notinst', array(
d6e8d8
					'ISO'			=> htmlspecialchars($lang_ary['iso']),
d6e8d8
					'LOCAL_NAME'	=> htmlspecialchars($lang_ary['local_name'], ENT_COMPAT, 'UTF-8'),
d6e8d8
					'NAME'			=> htmlspecialchars($lang_ary['name'], ENT_COMPAT, 'UTF-8'),
d6e8d8
					'U_INSTALL'		=> $this->u_action . '&action=install&iso=' . urlencode($lang_ary['iso']))
d6e8d8
				);
d6e8d8
			}
d6e8d8
		}
d6e8d8
d6e8d8
		unset($new_ary);
d6e8d8
	}
d6e8d8
d6e8d8
d6e8d8
	/**
d6e8d8
	* Set default language variables/header
d6e8d8
	*/
d6e8d8
	function default_variables()
d6e8d8
	{
d6e8d8
		global $phpEx;
d6e8d8
d6e8d8
		$this->language_file_header = '
d6e8d8
/**
d6e8d8
*
d6e8d8
* {FILENAME} [{LANG_NAME}]
d6e8d8
*
d6e8d8
* @package language
d6e8d8
* @version $' . 'Id: ' . '$
d6e8d8
* @copyright (c) ' . date('Y') . ' phpBB Group
d6e8d8
* @author {CHANGED} - {AUTHOR}
d6e8d8
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
d6e8d8
*
d6e8d8
*/
d6e8d8
d6e8d8
/**
d6e8d8
* DO NOT CHANGE
d6e8d8
*/
d6e8d8
if (!defined(\'IN_PHPBB\'))
d6e8d8
{
d6e8d8
	exit;
d6e8d8
}
d6e8d8
d6e8d8
if (empty($lang) || !is_array($lang))
d6e8d8
{
d6e8d8
	$lang = array();
d6e8d8
}
d6e8d8
d6e8d8
// DEVELOPERS PLEASE NOTE
d6e8d8
//
d6e8d8
// All language files should use UTF-8 as their encoding and the files must not contain a BOM.
d6e8d8
//
d6e8d8
// Placeholders can now contain order information, e.g. instead of
d6e8d8
// \'Page %s of %s\' you can (and should) write \'Page %1$s of %2$s\', this allows
d6e8d8
// translators to re-order the output of data while ensuring it remains correct
d6e8d8
//
d6e8d8
// You do not need this where single placeholders are used, e.g. \'Message %d\' is fine
d6e8d8
// equally where a string contains only two placeholders which are used to wrap text
d6e8d8
// in a url you again do not need to specify an order e.g., \'Click %sHERE%s\' is fine
d6e8d8
';
d6e8d8
d6e8d8
		$this->lang_header = '
d6e8d8
$lang = array_merge($lang, array(
d6e8d8
';
d6e8d8
d6e8d8
		// Language files in language root directory
d6e8d8
		$this->main_files = array("common.$phpEx", "groups.$phpEx", "install.$phpEx", "mcp.$phpEx", "memberlist.$phpEx", "posting.$phpEx", "search.$phpEx", "ucp.$phpEx", "viewforum.$phpEx", "viewtopic.$phpEx", "help_bbcode.$phpEx", "help_faq.$phpEx");
d6e8d8
	}
d6e8d8
d6e8d8
	/**
d6e8d8
	* Get filename/location of language file
d6e8d8
	*/
d6e8d8
	function get_filename($lang_iso, $directory, $filename, $check_store = false, $only_return_filename = false)
d6e8d8
	{
d6e8d8
		global $phpbb_root_path, $safe_mode;
d6e8d8
d6e8d8
		$check_filename = "language/$lang_iso/" . (($directory) ? $directory . '/' : '') . $filename;
d6e8d8
d6e8d8
		if ($check_store)
d6e8d8
		{
d6e8d8
			$check_store_filename = ($safe_mode) ? "store/langfile_{$lang_iso}" . (($directory) ? '_' . $directory : '') . "_{$filename}" : "store/language/$lang_iso/" . (($directory) ? $directory . '/' : '') . $filename;
d6e8d8
d6e8d8
			if (!$only_return_filename && file_exists($phpbb_root_path . $check_store_filename))
d6e8d8
			{
d6e8d8
				return $check_store_filename;
d6e8d8
			}
d6e8d8
			else if ($only_return_filename)
d6e8d8
			{
d6e8d8
				return $check_store_filename;
d6e8d8
			}
d6e8d8
		}
d6e8d8
d6e8d8
		return $check_filename;
d6e8d8
	}
d6e8d8
d6e8d8
	/**
d6e8d8
	* Add files to archive
d6e8d8
	*/
d6e8d8
	function add_to_archive(&$compress, $filelist, $lang_iso, $directory = '')
d6e8d8
	{
d6e8d8
		global $phpbb_root_path;
d6e8d8
d6e8d8
		foreach ($filelist as $file)
d6e8d8
		{
d6e8d8
			// Get source filename
d6e8d8
			$source = $this->get_filename($lang_iso, $directory, $file, true);
d6e8d8
			$destination = 'language/' . $lang_iso . '/' . (($directory) ? $directory . '/' : '') . $file;
d6e8d8
d6e8d8
			// Add file to archive
d6e8d8
			$compress->add_custom_file($phpbb_root_path . $source, $destination);
d6e8d8
		}
d6e8d8
	}
d6e8d8
d6e8d8
	/**
d6e8d8
	* Little helper to add some hardcoded template bits
d6e8d8
	*/
d6e8d8
	function add_input_field()
d6e8d8
	{
d6e8d8
		$keys = func_get_args();
d6e8d8
d6e8d8
		$non_static		= array_shift($keys);
d6e8d8
		$value			= array_shift($keys);
d6e8d8
d6e8d8
		if (!$non_static)
d6e8d8
		{
d6e8d8
			return '' . htmlspecialchars($value, ENT_COMPAT, 'UTF-8') . '';
d6e8d8
		}
d6e8d8
d6e8d8
		// If more then 270 characters, then we present a textarea, else an input field
d6e8d8
		$textarea = (utf8_strlen($value) > 270) ? true : false;
d6e8d8
		$tpl = '';
d6e8d8
d6e8d8
		$tpl .= ($textarea) ? '
d6e8d8
		$tpl .= 'entry[' . implode('][', array_map('utf8_htmlspecialchars', $keys)) . ']"';
d6e8d8
d6e8d8
		$tpl .= ($textarea) ? ' cols="80" rows="5" class="langvalue">' : ' class="langvalue" value="';
d6e8d8
		$tpl .= htmlspecialchars($value, ENT_COMPAT, 'UTF-8');
d6e8d8
		$tpl .= ($textarea) ? '</textarea>' : '" />';
d6e8d8
d6e8d8
		return $tpl;
d6e8d8
	}
d6e8d8
d6e8d8
	/**
d6e8d8
	* Print language entries
d6e8d8
	*/
d6e8d8
	function print_language_entries(&$lang_ary, $key_prefix = '', $input_field = true)
d6e8d8
	{
d6e8d8
		$tpl = '';
d6e8d8
d6e8d8
		foreach ($lang_ary as $key => $value)
d6e8d8
		{
d6e8d8
			if (is_array($value))
d6e8d8
			{
d6e8d8
				// Write key
d6e8d8
				$tpl .= '
d6e8d8
				
d6e8d8
					' . htmlspecialchars($key_prefix, ENT_COMPAT, 'UTF-8') . '' . htmlspecialchars($key, ENT_COMPAT, 'UTF-8') . '
d6e8d8
				';
d6e8d8
d6e8d8
				foreach ($value as $_key => $_value)
d6e8d8
				{
d6e8d8
					if (is_array($_value))
d6e8d8
					{
d6e8d8
						// Write key
d6e8d8
						$tpl .= '
d6e8d8
							
d6e8d8
								' . htmlspecialchars($key_prefix, ENT_COMPAT, 'UTF-8') . '   ' . htmlspecialchars($_key, ENT_COMPAT, 'UTF-8') . '
d6e8d8
							';
d6e8d8
d6e8d8
						foreach ($_value as $__key => $__value)
d6e8d8
						{
d6e8d8
							// Write key
d6e8d8
							$tpl .= '
d6e8d8
								
d6e8d8
									' . htmlspecialchars($key_prefix, ENT_COMPAT, 'UTF-8') . '' . htmlspecialchars($__key, ENT_COMPAT, 'UTF-8') . '
d6e8d8
									';
d6e8d8
d6e8d8
							$tpl .= $this->add_input_field($input_field, $__value, $key, $_key, $__key);
d6e8d8
d6e8d8
							$tpl .= '
d6e8d8
								';
d6e8d8
						}
d6e8d8
					}
d6e8d8
					else
d6e8d8
					{
d6e8d8
						// Write key
d6e8d8
						$tpl .= '
d6e8d8
							
d6e8d8
								' . htmlspecialchars($key_prefix, ENT_COMPAT, 'UTF-8') . '' . htmlspecialchars($_key, ENT_COMPAT, 'UTF-8') . '
d6e8d8
								';
d6e8d8
d6e8d8
						$tpl .= $this->add_input_field($input_field, $_value, $key, $_key);
d6e8d8
d6e8d8
						$tpl .= '
d6e8d8
							';
d6e8d8
					}
d6e8d8
				}
d6e8d8
d6e8d8
				$tpl .= '
d6e8d8
				
d6e8d8
					 
d6e8d8
				';
d6e8d8
			}
d6e8d8
			else
d6e8d8
			{
d6e8d8
				// Write key
d6e8d8
				$tpl .= '
d6e8d8
				
d6e8d8
					' . htmlspecialchars($key_prefix, ENT_COMPAT, 'UTF-8') . '' . htmlspecialchars($key, ENT_COMPAT, 'UTF-8') . '
d6e8d8
					';
d6e8d8
d6e8d8
				$tpl .= $this->add_input_field($input_field, $value, $key);
d6e8d8
d6e8d8
				$tpl .= '
d6e8d8
					';
d6e8d8
			}
d6e8d8
		}
d6e8d8
d6e8d8
		return $tpl;
d6e8d8
	}
d6e8d8
d6e8d8
	/**
d6e8d8
	* Compare two language files
d6e8d8
	*/
d6e8d8
	function compare_language_files($source_lang, $dest_lang, $directory, $file)
d6e8d8
	{
d6e8d8
		global $phpbb_root_path, $phpEx;
d6e8d8
d6e8d8
		$return_ary = array();
d6e8d8
d6e8d8
		$lang = array();
d6e8d8
		include("{$phpbb_root_path}language/{$source_lang}/" . (($directory) ? $directory . '/' : '') . $file);
d6e8d8
		$lang_entry_src = $lang;
d6e8d8
d6e8d8
		$lang = array();
d6e8d8
d6e8d8
		if (!file_exists($phpbb_root_path . $this->get_filename($dest_lang, $directory, $file, true)))
d6e8d8
		{
d6e8d8
			return array();
d6e8d8
		}
d6e8d8
d6e8d8
		include($phpbb_root_path . $this->get_filename($dest_lang, $directory, $file, true));
d6e8d8
d6e8d8
		$lang_entry_dst = $lang;
d6e8d8
d6e8d8
		unset($lang);
d6e8d8
d6e8d8
		$diff_array_keys = array_diff(array_keys($lang_entry_src), array_keys($lang_entry_dst));
d6e8d8
		unset($lang_entry_dst);
d6e8d8
d6e8d8
		foreach ($diff_array_keys as $key)
d6e8d8
		{
d6e8d8
			$return_ary[$key] = $lang_entry_src[$key];
d6e8d8
		}
d6e8d8
d6e8d8
		unset($lang_entry_src);
d6e8d8
d6e8d8
		return $return_ary;
d6e8d8
	}
d6e8d8
d6e8d8
	/**
d6e8d8
	* Return language string value for storage
d6e8d8
	*/
d6e8d8
	function prepare_lang_entry($text, $store = true)
d6e8d8
	{
d6e8d8
		$text = (STRIP) ? stripslashes($text) : $text;
d6e8d8
d6e8d8
		// Adjust for storage...
d6e8d8
		if ($store)
d6e8d8
		{
d6e8d8
			$text = str_replace("'", "\\'", str_replace('\\', '\\\\', $text));
d6e8d8
		}
d6e8d8
d6e8d8
		return $text;
d6e8d8
	}
d6e8d8
d6e8d8
	/**
d6e8d8
	* Format language array for storage
d6e8d8
	*/
d6e8d8
	function format_lang_array($key, $value, $tabs = "\t")
d6e8d8
	{
d6e8d8
		$entry = '';
d6e8d8
d6e8d8
		if (!is_array($value))
d6e8d8
		{
d6e8d8
			$entry .= "{$tabs}'" . $this->prepare_lang_entry($key) . "'\t=> '" . $this->prepare_lang_entry($value) . "',\n";
d6e8d8
		}
d6e8d8
		else
d6e8d8
		{
d6e8d8
			$_tabs = $tabs . "\t";
d6e8d8
			$entry .= "\n{$tabs}'" . $this->prepare_lang_entry($key) . "'\t=> array(\n";
d6e8d8
d6e8d8
			foreach ($value as $_key => $_value)
d6e8d8
			{
d6e8d8
				$entry .= $this->format_lang_array($_key, $_value, $_tabs);
d6e8d8
			}
d6e8d8
d6e8d8
			$entry .= "{$tabs}),\n\n";
d6e8d8
		}
d6e8d8
d6e8d8
		return $entry;
d6e8d8
	}
d6e8d8
}
d6e8d8
d6e8d8
?>