[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * 4 * @package acp 5 * @version $Id$ 6 * @copyright (c) 2005 phpBB Group 7 * @license http://opensource.org/licenses/gpl-license.php GNU Public License 8 * 9 */ 10 11 /** 12 * @ignore 13 */ 14 if (!defined('IN_PHPBB')) 15 { 16 exit; 17 } 18 19 /** 20 * @package acp 21 */ 22 class acp_language 23 { 24 var $u_action; 25 var $main_files; 26 var $language_header = ''; 27 var $lang_header = ''; 28 29 var $language_file = ''; 30 var $language_directory = ''; 31 32 function main($id, $mode) 33 { 34 global $config, $db, $user, $auth, $template, $cache; 35 global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix; 36 global $safe_mode, $file_uploads; 37 38 include_once($phpbb_root_path . 'includes/functions_user.' . $phpEx); 39 40 $this->default_variables(); 41 42 // Check and set some common vars 43 44 $action = (isset($_POST['update_details'])) ? 'update_details' : ''; 45 $action = (isset($_POST['download_file'])) ? 'download_file' : $action; 46 $action = (isset($_POST['upload_file'])) ? 'upload_file' : $action; 47 $action = (isset($_POST['upload_data'])) ? 'upload_data' : $action; 48 $action = (isset($_POST['submit_file'])) ? 'submit_file' : $action; 49 $action = (isset($_POST['remove_store'])) ? 'details' : $action; 50 51 $submit = (empty($action) && !isset($_POST['update']) && !isset($_POST['test_connection'])) ? false : true; 52 $action = (empty($action)) ? request_var('action', '') : $action; 53 54 $form_name = 'acp_lang'; 55 add_form_key('acp_lang'); 56 57 $lang_id = request_var('id', 0); 58 if (isset($_POST['missing_file'])) 59 { 60 $missing_file = request_var('missing_file', array('' => 0)); 61 list($_REQUEST['language_file'], ) = array_keys($missing_file); 62 } 63 64 $selected_lang_file = request_var('language_file', '|common.' . $phpEx); 65 66 list($this->language_directory, $this->language_file) = explode('|', $selected_lang_file); 67 68 $this->language_directory = basename($this->language_directory); 69 $this->language_file = basename($this->language_file); 70 71 $user->add_lang('acp/language'); 72 $this->tpl_name = 'acp_language'; 73 $this->page_title = 'ACP_LANGUAGE_PACKS'; 74 75 if ($submit && $action == 'upload_data' && request_var('test_connection', '')) 76 { 77 $test_connection = false; 78 $action = 'upload_file'; 79 $method = request_var('method', ''); 80 81 include_once($phpbb_root_path . 'includes/functions_transfer.' . $phpEx); 82 83 switch ($method) 84 { 85 case 'ftp': 86 $transfer = new ftp(request_var('host', ''), request_var('username', ''), request_var('password', ''), request_var('root_path', ''), request_var('port', ''), request_var('timeout', '')); 87 break; 88 89 case 'ftp_fsock': 90 $transfer = new ftp_fsock(request_var('host', ''), request_var('username', ''), request_var('password', ''), request_var('root_path', ''), request_var('port', ''), request_var('timeout', '')); 91 break; 92 93 default: 94 trigger_error($user->lang['INVALID_UPLOAD_METHOD'], E_USER_ERROR); 95 break; 96 } 97 98 $test_connection = $transfer->open_session(); 99 $transfer->close_session(); 100 } 101 102 switch ($action) 103 { 104 case 'upload_file': 105 106 include_once($phpbb_root_path . 'includes/functions_transfer.' . $phpEx); 107 108 $method = request_var('method', ''); 109 110 if (!class_exists($method)) 111 { 112 trigger_error('Method does not exist.', E_USER_ERROR); 113 } 114 115 $requested_data = call_user_func(array($method, 'data')); 116 foreach ($requested_data as $data => $default) 117 { 118 $template->assign_block_vars('data', array( 119 'DATA' => $data, 120 'NAME' => $user->lang[strtoupper($method . '_' . $data)], 121 'EXPLAIN' => $user->lang[strtoupper($method . '_' . $data) . '_EXPLAIN'], 122 'DEFAULT' => (!empty($_REQUEST[$data])) ? request_var($data, '') : $default 123 )); 124 } 125 126 $hidden_data = build_hidden_fields(array( 127 'file' => $this->language_file, 128 'dir' => $this->language_directory, 129 'language_file' => $selected_lang_file, 130 'method' => $method) 131 ); 132 133 $hidden_data .= build_hidden_fields(array('entry' => $_POST['entry']), true, STRIP); 134 135 $template->assign_vars(array( 136 'S_UPLOAD' => true, 137 'NAME' => $method, 138 'U_ACTION' => $this->u_action . "&id=$lang_id&action=upload_data", 139 'U_BACK' => $this->u_action . "&id=$lang_id&action=details&language_file=" . urlencode($selected_lang_file), 140 'HIDDEN' => $hidden_data, 141 142 'S_CONNECTION_SUCCESS' => (request_var('test_connection', '') && $test_connection === true) ? true : false, 143 'S_CONNECTION_FAILED' => (request_var('test_connection', '') && $test_connection !== true) ? true : false 144 )); 145 break; 146 147 case 'update_details': 148 149 if (!$submit || !check_form_key($form_name)) 150 { 151 trigger_error($user->lang['FORM_INVALID']. adm_back_link($this->u_action), E_USER_WARNING); 152 } 153 154 if (!$lang_id) 155 { 156 trigger_error($user->lang['NO_LANG_ID'] . adm_back_link($this->u_action), E_USER_WARNING); 157 } 158 159 $sql = 'SELECT * 160 FROM ' . LANG_TABLE . " 161 WHERE lang_id = $lang_id"; 162 $result = $db->sql_query($sql); 163 $row = $db->sql_fetchrow($result); 164 $db->sql_freeresult($result); 165 166 $sql_ary = array( 167 'lang_english_name' => request_var('lang_english_name', $row['lang_english_name']), 168 'lang_local_name' => utf8_normalize_nfc(request_var('lang_local_name', $row['lang_local_name'], true)), 169 'lang_author' => utf8_normalize_nfc(request_var('lang_author', $row['lang_author'], true)), 170 ); 171 172 $db->sql_query('UPDATE ' . LANG_TABLE . ' 173 SET ' . $db->sql_build_array('UPDATE', $sql_ary) . ' 174 WHERE lang_id = ' . $lang_id); 175 176 add_log('admin', 'LOG_LANGUAGE_PACK_UPDATED', $sql_ary['lang_english_name']); 177 178 trigger_error($user->lang['LANGUAGE_DETAILS_UPDATED'] . adm_back_link($this->u_action)); 179 break; 180 181 case 'submit_file': 182 case 'download_file': 183 case 'upload_data': 184 185 if (!$submit || !check_form_key($form_name)) 186 { 187 trigger_error($user->lang['FORM_INVALID']. adm_back_link($this->u_action), E_USER_WARNING); 188 } 189 190 if (!$lang_id || empty($_POST['entry'])) 191 { 192 trigger_error($user->lang['NO_LANG_ID'] . adm_back_link($this->u_action), E_USER_WARNING); 193 } 194 195 if ($this->language_directory != 'email' && !is_array($_POST['entry'])) 196 { 197 trigger_error($user->lang['NO_LANG_ID'] . adm_back_link($this->u_action), E_USER_WARNING); 198 } 199 200 if (!$this->language_file || (!$this->language_directory && !in_array($this->language_file, $this->main_files))) 201 { 202 trigger_error($user->lang['NO_FILE_SELECTED'] . adm_back_link($this->u_action), E_USER_WARNING); 203 } 204 205 $sql = 'SELECT * 206 FROM ' . LANG_TABLE . " 207 WHERE lang_id = $lang_id"; 208 $result = $db->sql_query($sql); 209 $row = $db->sql_fetchrow($result); 210 $db->sql_freeresult($result); 211 212 if (!$row) 213 { 214 trigger_error($user->lang['NO_LANG_ID'] . adm_back_link($this->u_action), E_USER_WARNING); 215 } 216 217 // Before we attempt to write anything let's check if the admin really chose a correct filename 218 switch ($this->language_directory) 219 { 220 case 'email': 221 // Get email templates 222 $email_files = filelist($phpbb_root_path . 'language/' . $row['lang_iso'], 'email', 'txt'); 223 $email_files = $email_files['email/']; 224 225 if (!in_array($this->language_file, $email_files)) 226 { 227 trigger_error($user->lang['WRONG_LANGUAGE_FILE'] . adm_back_link($this->u_action . '&action=details&id=' . $lang_id), E_USER_WARNING); 228 } 229 break; 230 231 case 'acp': 232 // Get acp files 233 $acp_files = filelist($phpbb_root_path . 'language/' . $row['lang_iso'], 'acp', $phpEx); 234 $acp_files = $acp_files['acp/']; 235 236 if (!in_array($this->language_file, $acp_files)) 237 { 238 trigger_error($user->lang['WRONG_LANGUAGE_FILE'] . adm_back_link($this->u_action . '&action=details&id=' . $lang_id), E_USER_WARNING); 239 } 240 break; 241 242 case 'mods': 243 // Get mod files 244 $mods_files = filelist($phpbb_root_path . 'language/' . $row['lang_iso'], 'mods', $phpEx); 245 $mods_files = (isset($mods_files['mods/'])) ? $mods_files['mods/'] : array(); 246 247 if (!in_array($this->language_file, $mods_files)) 248 { 249 trigger_error($user->lang['WRONG_LANGUAGE_FILE'] . adm_back_link($this->u_action . '&action=details&id=' . $lang_id), E_USER_WARNING); 250 } 251 break; 252 253 default: 254 if (!in_array($this->language_file, $this->main_files)) 255 { 256 trigger_error($user->lang['WRONG_LANGUAGE_FILE'] . adm_back_link($this->u_action . '&action=details&id=' . $lang_id), E_USER_WARNING); 257 } 258 break; 259 } 260 261 if (!$safe_mode) 262 { 263 $mkdir_ary = array('language', 'language/' . $row['lang_iso']); 264 265 if ($this->language_directory) 266 { 267 $mkdir_ary[] = 'language/' . $row['lang_iso'] . '/' . $this->language_directory; 268 } 269 270 foreach ($mkdir_ary as $dir) 271 { 272 $dir = $phpbb_root_path . 'store/' . $dir; 273 274 if (!is_dir($dir)) 275 { 276 if (!@mkdir($dir, 0777)) 277 { 278 trigger_error("Could not create directory $dir", E_USER_ERROR); 279 } 280 @chmod($dir, 0777); 281 } 282 } 283 } 284 285 // Get target filename for storage folder 286 $filename = $this->get_filename($row['lang_iso'], $this->language_directory, $this->language_file, true, true); 287 $fp = @fopen($phpbb_root_path . $filename, 'wb'); 288 289 if (!$fp) 290 { 291 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); 292 } 293 294 if ($this->language_directory == 'email') 295 { 296 // Email Template 297 $entry = $this->prepare_lang_entry($_POST['entry'], false); 298 fwrite($fp, $entry); 299 } 300 else 301 { 302 $name = (($this->language_directory) ? $this->language_directory . '_' : '') . $this->language_file; 303 $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); 304 305 if (strpos($this->language_file, 'help_') === 0) 306 { 307 // Help File 308 $header .= '$help = array(' . "\n"; 309 fwrite($fp, $header); 310 311 foreach ($_POST['entry'] as $key => $value) 312 { 313 if (!is_array($value)) 314 { 315 continue; 316 } 317 318 $entry = "\tarray(\n"; 319 320 foreach ($value as $_key => $_value) 321 { 322 $entry .= "\t\t" . (int) $_key . "\t=> '" . $this->prepare_lang_entry($_value) . "',\n"; 323 } 324 325 $entry .= "\t),\n"; 326 fwrite($fp, $entry); 327 } 328 329 $footer = ");\n\n?>"; 330 fwrite($fp, $footer); 331 } 332 else 333 { 334 // Language File 335 $header .= $this->lang_header; 336 fwrite($fp, $header); 337 338 foreach ($_POST['entry'] as $key => $value) 339 { 340 $entry = $this->format_lang_array($key, $value); 341 fwrite($fp, $entry); 342 } 343 344 $footer = "));\n\n?>"; 345 fwrite($fp, $footer); 346 } 347 } 348 349 fclose($fp); 350 351 if ($action == 'download_file') 352 { 353 header('Pragma: no-cache'); 354 header('Content-Type: application/octetstream; name="' . $this->language_file . '"'); 355 header('Content-disposition: attachment; filename=' . $this->language_file); 356 357 $fp = @fopen($phpbb_root_path . $filename, 'rb'); 358 while ($buffer = fread($fp, 1024)) 359 { 360 echo $buffer; 361 } 362 fclose($fp); 363 364 add_log('admin', 'LOG_LANGUAGE_FILE_SUBMITTED', $this->language_file); 365 366 exit; 367 } 368 else if ($action == 'upload_data') 369 { 370 $sql = 'SELECT lang_iso 371 FROM ' . LANG_TABLE . " 372 WHERE lang_id = $lang_id"; 373 $result = $db->sql_query($sql); 374 $row = $db->sql_fetchrow($result); 375 $db->sql_freeresult($result); 376 377 $file = request_var('file', ''); 378 $dir = request_var('dir', ''); 379 380 $selected_lang_file = $dir . '|' . $file; 381 382 $old_file = '/' . $this->get_filename($row['lang_iso'], $dir, $file, false, true); 383 $lang_path = 'language/' . $row['lang_iso'] . '/' . (($dir) ? $dir . '/' : ''); 384 385 include_once($phpbb_root_path . 'includes/functions_transfer.' . $phpEx); 386 $method = request_var('method', ''); 387 388 if ($method != 'ftp' && $method != 'ftp_fsock') 389 { 390 trigger_error($user->lang['INVALID_UPLOAD_METHOD'], E_USER_ERROR); 391 } 392 393 $transfer = new $method(request_var('host', ''), request_var('username', ''), request_var('password', ''), request_var('root_path', ''), request_var('port', ''), request_var('timeout', '')); 394 395 if (($result = $transfer->open_session()) !== true) 396 { 397 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); 398 } 399 400 $transfer->rename($lang_path . $file, $lang_path . $file . '.bak'); 401 $result = $transfer->copy_file('store/' . $lang_path . $file, $lang_path . $file); 402 403 if ($result === false) 404 { 405 // If failed, try to rename again and print error out... 406 $transfer->delete_file($lang_path . $file); 407 $transfer->rename($lang_path . $file . '.bak', $lang_path . $file); 408 409 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); 410 } 411 412 $transfer->close_session(); 413 414 // Remove from storage folder 415 if (file_exists($phpbb_root_path . 'store/' . $lang_path . $file)) 416 { 417 @unlink($phpbb_root_path . 'store/' . $lang_path . $file); 418 } 419 420 add_log('admin', 'LOG_LANGUAGE_FILE_REPLACED', $file); 421 422 trigger_error($user->lang['UPLOAD_COMPLETED'] . adm_back_link($this->u_action . '&action=details&id=' . $lang_id . '&language_file=' . urlencode($selected_lang_file))); 423 } 424 425 add_log('admin', 'LOG_LANGUAGE_FILE_SUBMITTED', $this->language_file); 426 $action = 'details'; 427 428 // no break; 429 430 case 'details': 431 432 if (!$lang_id) 433 { 434 trigger_error($user->lang['NO_LANG_ID'] . adm_back_link($this->u_action), E_USER_WARNING); 435 } 436 437 $this->page_title = 'LANGUAGE_PACK_DETAILS'; 438 439 $sql = 'SELECT * 440 FROM ' . LANG_TABLE . ' 441 WHERE lang_id = ' . $lang_id; 442 $result = $db->sql_query($sql); 443 $lang_entries = $db->sql_fetchrow($result); 444 $db->sql_freeresult($result); 445 446 $lang_iso = $lang_entries['lang_iso']; 447 $missing_vars = $missing_files = array(); 448 449 // Get email templates 450 $email_files = filelist($phpbb_root_path . 'language/' . $config['default_lang'], 'email', 'txt'); 451 $email_files = $email_files['email/']; 452 453 // Get acp files 454 $acp_files = filelist($phpbb_root_path . 'language/' . $config['default_lang'], 'acp', $phpEx); 455 $acp_files = $acp_files['acp/']; 456 457 // Get mod files 458 $mods_files = filelist($phpbb_root_path . 'language/' . $config['default_lang'], 'mods', $phpEx); 459 $mods_files = (isset($mods_files['mods/'])) ? $mods_files['mods/'] : array(); 460 461 // Check if our current filename matches the files 462 switch ($this->language_directory) 463 { 464 case 'email': 465 if (!in_array($this->language_file, $email_files)) 466 { 467 trigger_error($user->lang['WRONG_LANGUAGE_FILE'] . adm_back_link($this->u_action . '&action=details&id=' . $lang_id), E_USER_WARNING); 468 } 469 break; 470 471 case 'acp': 472 if (!in_array($this->language_file, $acp_files)) 473 { 474 trigger_error($user->lang['WRONG_LANGUAGE_FILE'] . adm_back_link($this->u_action . '&action=details&id=' . $lang_id), E_USER_WARNING); 475 } 476 break; 477 478 case 'mods': 479 if (!in_array($this->language_file, $mods_files)) 480 { 481 trigger_error($user->lang['WRONG_LANGUAGE_FILE'] . adm_back_link($this->u_action . '&action=details&id=' . $lang_id), E_USER_WARNING); 482 } 483 break; 484 485 default: 486 if (!in_array($this->language_file, $this->main_files)) 487 { 488 trigger_error($user->lang['WRONG_LANGUAGE_FILE'] . adm_back_link($this->u_action . '&action=details&id=' . $lang_id), E_USER_WARNING); 489 } 490 } 491 492 if (isset($_POST['remove_store'])) 493 { 494 $store_filename = $this->get_filename($lang_iso, $this->language_directory, $this->language_file, true, true); 495 496 if (file_exists($phpbb_root_path . $store_filename)) 497 { 498 @unlink($phpbb_root_path . $store_filename); 499 } 500 } 501 502 include_once($phpbb_root_path . 'includes/functions_transfer.' . $phpEx); 503 504 $methods = transfer::methods(); 505 506 foreach ($methods as $method) 507 { 508 $template->assign_block_vars('buttons', array( 509 'VALUE' => $method 510 )); 511 } 512 513 $template->assign_vars(array( 514 'S_DETAILS' => true, 515 'U_ACTION' => $this->u_action . "&action=details&id=$lang_id", 516 'U_BACK' => $this->u_action, 517 'LANG_LOCAL_NAME' => $lang_entries['lang_local_name'], 518 'LANG_ENGLISH_NAME' => $lang_entries['lang_english_name'], 519 'LANG_ISO' => $lang_entries['lang_iso'], 520 'LANG_AUTHOR' => $lang_entries['lang_author'], 521 'ALLOW_UPLOAD' => sizeof($methods) 522 ) 523 ); 524 525 // If current lang is different from the default lang, then first try to grab missing/additional vars 526 if ($lang_iso != $config['default_lang']) 527 { 528 $is_missing_var = false; 529 530 foreach ($this->main_files as $file) 531 { 532 if (file_exists($phpbb_root_path . $this->get_filename($lang_iso, '', $file))) 533 { 534 $missing_vars[$file] = $this->compare_language_files($config['default_lang'], $lang_iso, '', $file); 535 536 if (sizeof($missing_vars[$file])) 537 { 538 $is_missing_var = true; 539 } 540 } 541 else 542 { 543 $missing_files[] = $this->get_filename($lang_iso, '', $file); 544 } 545 } 546 547 // Now go through acp/mods directories 548 foreach ($acp_files as $file) 549 { 550 if (file_exists($phpbb_root_path . $this->get_filename($lang_iso, 'acp', $file))) 551 { 552 $missing_vars['acp/' . $file] = $this->compare_language_files($config['default_lang'], $lang_iso, 'acp', $file); 553 554 if (sizeof($missing_vars['acp/' . $file])) 555 { 556 $is_missing_var = true; 557 } 558 } 559 else 560 { 561 $missing_files[] = $this->get_filename($lang_iso, 'acp', $file); 562 } 563 } 564 565 if (sizeof($mods_files)) 566 { 567 foreach ($mods_files as $file) 568 { 569 if (file_exists($phpbb_root_path . $this->get_filename($lang_iso, 'mods', $file))) 570 { 571 $missing_vars['mods/' . $file] = $this->compare_language_files($config['default_lang'], $lang_iso, 'mods', $file); 572 573 if (sizeof($missing_vars['mods/' . $file])) 574 { 575 $is_missing_var = true; 576 } 577 } 578 else 579 { 580 $missing_files[] = $this->get_filename($lang_iso, 'mods', $file); 581 } 582 } 583 } 584 585 // More missing files... for example email templates? 586 foreach ($email_files as $file) 587 { 588 if (!file_exists($phpbb_root_path . $this->get_filename($lang_iso, 'email', $file))) 589 { 590 $missing_files[] = $this->get_filename($lang_iso, 'email', $file); 591 } 592 } 593 594 if (sizeof($missing_files)) 595 { 596 $template->assign_vars(array( 597 'S_MISSING_FILES' => true, 598 'L_MISSING_FILES' => sprintf($user->lang['THOSE_MISSING_LANG_FILES'], $lang_entries['lang_local_name']), 599 'MISSING_FILES' => implode('<br />', $missing_files)) 600 ); 601 } 602 603 if ($is_missing_var) 604 { 605 $template->assign_vars(array( 606 'S_MISSING_VARS' => true, 607 'L_MISSING_VARS_EXPLAIN' => sprintf($user->lang['THOSE_MISSING_LANG_VARIABLES'], $lang_entries['lang_local_name']), 608 'U_MISSING_ACTION' => $this->u_action . "&action=$action&id=$lang_id") 609 ); 610 611 foreach ($missing_vars as $file => $vars) 612 { 613 if (!sizeof($vars)) 614 { 615 continue; 616 } 617 618 $template->assign_block_vars('missing', array( 619 'FILE' => $file, 620 'TPL' => $this->print_language_entries($vars, '', false), 621 'KEY' => (strpos($file, '/') === false) ? '|' . $file : str_replace('/', '|', $file)) 622 ); 623 } 624 } 625 } 626 627 // Main language files 628 $s_lang_options = '<option value="|common.' . $phpEx . '" class="sep">' . $user->lang['LANGUAGE_FILES'] . '</option>'; 629 foreach ($this->main_files as $file) 630 { 631 if (strpos($file, 'help_') === 0) 632 { 633 continue; 634 } 635 636 $prefix = (file_exists($phpbb_root_path . $this->get_filename($lang_iso, '', $file, true, true))) ? '* ' : ''; 637 638 $selected = (!$this->language_directory && $this->language_file == $file) ? ' selected="selected"' : ''; 639 $s_lang_options .= '<option value="|' . $file . '"' . $selected . '>' . $prefix . $file . '</option>'; 640 } 641 642 // Help Files 643 $s_lang_options .= '<option value="|common.' . $phpEx . '" class="sep">' . $user->lang['HELP_FILES'] . '</option>'; 644 foreach ($this->main_files as $file) 645 { 646 if (strpos($file, 'help_') !== 0) 647 { 648 continue; 649 } 650 651 $prefix = (file_exists($phpbb_root_path . $this->get_filename($lang_iso, '', $file, true, true))) ? '* ' : ''; 652 653 $selected = (!$this->language_directory && $this->language_file == $file) ? ' selected="selected"' : ''; 654 $s_lang_options .= '<option value="|' . $file . '"' . $selected . '>' . $prefix . $file . '</option>'; 655 } 656 657 // Now every other language directory 658 $check_files = array('email', 'acp', 'mods'); 659 660 foreach ($check_files as $check) 661 { 662 if (!sizeof(${$check . '_files'})) 663 { 664 continue; 665 } 666 667 $s_lang_options .= '<option value="|common.' . $phpEx . '" class="sep">' . $user->lang[strtoupper($check) . '_FILES'] . '</option>'; 668 669 foreach (${$check . '_files'} as $file) 670 { 671 $prefix = (file_exists($phpbb_root_path . $this->get_filename($lang_iso, $check, $file, true, true))) ? '* ' : ''; 672 673 $selected = ($this->language_directory == $check && $this->language_file == $file) ? ' selected="selected"' : ''; 674 $s_lang_options .= '<option value="' . $check . '|' . $file . '"' . $selected . '>' . $prefix . $file . '</option>'; 675 } 676 } 677 678 // Get Language Entries - if saved within store folder, we take this one (with the option to remove it) 679 $lang = array(); 680 681 $is_email_file = ($this->language_directory == 'email') ? true : false; 682 $is_help_file = (strpos($this->language_file, 'help_') === 0) ? true : false; 683 684 $file_from_store = (file_exists($phpbb_root_path . $this->get_filename($lang_iso, $this->language_directory, $this->language_file, true, true))) ? true : false; 685 $no_store_filename = $this->get_filename($lang_iso, $this->language_directory, $this->language_file); 686 687 if (!$file_from_store && !file_exists($phpbb_root_path . $no_store_filename)) 688 { 689 $print_message = sprintf($user->lang['MISSING_LANGUAGE_FILE'], $no_store_filename); 690 } 691 else 692 { 693 if ($is_email_file) 694 { 695 $lang = file_get_contents($phpbb_root_path . $this->get_filename($lang_iso, $this->language_directory, $this->language_file, $file_from_store)); 696 } 697 else 698 { 699 $help = array(); 700 include($phpbb_root_path . $this->get_filename($lang_iso, $this->language_directory, $this->language_file, $file_from_store)); 701 702 if ($is_help_file) 703 { 704 $lang = $help; 705 unset($help); 706 } 707 } 708 709 $print_message = (($this->language_directory) ? $this->language_directory . '/' : '') . $this->language_file; 710 } 711 712 // Normal language pack entries 713 $template->assign_vars(array( 714 'U_ENTRY_ACTION' => $this->u_action . "&action=details&id=$lang_id#entries", 715 'S_EMAIL_FILE' => $is_email_file, 716 'S_FROM_STORE' => $file_from_store, 717 'S_LANG_OPTIONS' => $s_lang_options, 718 'PRINT_MESSAGE' => $print_message, 719 ) 720 ); 721 722 if (!$is_email_file) 723 { 724 $tpl = ''; 725 $name = (($this->language_directory) ? $this->language_directory . '/' : '') . $this->language_file; 726 727 if (isset($missing_vars[$name]) && sizeof($missing_vars[$name])) 728 { 729 $tpl .= $this->print_language_entries($missing_vars[$name], '* '); 730 } 731 732 $tpl .= $this->print_language_entries($lang); 733 734 $template->assign_var('TPL', $tpl); 735 unset($tpl); 736 } 737 else 738 { 739 $template->assign_vars(array( 740 'LANG' => $lang) 741 ); 742 743 unset($lang); 744 } 745 746 return; 747 748 break; 749 750 case 'delete': 751 752 if (!$lang_id) 753 { 754 trigger_error($user->lang['NO_LANG_ID'] . adm_back_link($this->u_action), E_USER_WARNING); 755 } 756 757 $sql = 'SELECT * 758 FROM ' . LANG_TABLE . ' 759 WHERE lang_id = ' . $lang_id; 760 $result = $db->sql_query($sql); 761 $row = $db->sql_fetchrow($result); 762 $db->sql_freeresult($result); 763 764 if ($row['lang_iso'] == $config['default_lang']) 765 { 766 trigger_error($user->lang['NO_REMOVE_DEFAULT_LANG'] . adm_back_link($this->u_action), E_USER_WARNING); 767 } 768 769 if (confirm_box(true)) 770 { 771 $db->sql_query('DELETE FROM ' . LANG_TABLE . ' WHERE lang_id = ' . $lang_id); 772 773 $sql = 'UPDATE ' . USERS_TABLE . " 774 SET user_lang = '" . $db->sql_escape($config['default_lang']) . "' 775 WHERE user_lang = '" . $db->sql_escape($row['lang_iso']) . "'"; 776 $db->sql_query($sql); 777 778 // We also need to remove the translated entries for custom profile fields - we want clean tables, don't we? 779 $sql = 'DELETE FROM ' . PROFILE_LANG_TABLE . ' WHERE lang_id = ' . $lang_id; 780 $db->sql_query($sql); 781 782 $sql = 'DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . ' WHERE lang_id = ' . $lang_id; 783 $db->sql_query($sql); 784 785 $sql = 'DELETE FROM ' . STYLES_IMAGESET_DATA_TABLE . " WHERE image_lang = '" . $db->sql_escape($row['lang_iso']) . "'"; 786 $result = $db->sql_query($sql); 787 788 $cache->destroy('sql', STYLES_IMAGESET_DATA_TABLE); 789 790 add_log('admin', 'LOG_LANGUAGE_PACK_DELETED', $row['lang_english_name']); 791 792 trigger_error(sprintf($user->lang['LANGUAGE_PACK_DELETED'], $row['lang_english_name']) . adm_back_link($this->u_action)); 793 } 794 else 795 { 796 $s_hidden_fields = array( 797 'i' => $id, 798 'mode' => $mode, 799 'action' => $action, 800 'id' => $lang_id, 801 ); 802 confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields($s_hidden_fields)); 803 } 804 break; 805 806 case 'install': 807 $lang_iso = request_var('iso', ''); 808 $lang_iso = basename($lang_iso); 809 810 if (!$lang_iso || !file_exists("{$phpbb_root_path}language/$lang_iso/iso.txt")) 811 { 812 trigger_error($user->lang['LANGUAGE_PACK_NOT_EXIST'] . adm_back_link($this->u_action), E_USER_WARNING); 813 } 814 815 $file = file("{$phpbb_root_path}language/$lang_iso/iso.txt"); 816 817 $lang_pack = array( 818 'iso' => $lang_iso, 819 'name' => trim(htmlspecialchars($file[0])), 820 'local_name'=> trim(htmlspecialchars($file[1], ENT_COMPAT, 'UTF-8')), 821 'author' => trim(htmlspecialchars($file[2], ENT_COMPAT, 'UTF-8')) 822 ); 823 unset($file); 824 825 $sql = 'SELECT lang_iso 826 FROM ' . LANG_TABLE . " 827 WHERE lang_iso = '" . $db->sql_escape($lang_iso) . "'"; 828 $result = $db->sql_query($sql); 829 $row = $db->sql_fetchrow($result); 830 $db->sql_freeresult($result); 831 832 if ($row) 833 { 834 trigger_error($user->lang['LANGUAGE_PACK_ALREADY_INSTALLED'] . adm_back_link($this->u_action), E_USER_WARNING); 835 } 836 837 if (!$lang_pack['name'] || !$lang_pack['local_name']) 838 { 839 trigger_error($user->lang['INVALID_LANGUAGE_PACK'] . adm_back_link($this->u_action), E_USER_WARNING); 840 } 841 842 // Add language pack 843 $sql_ary = array( 844 'lang_iso' => $lang_pack['iso'], 845 'lang_dir' => $lang_pack['iso'], 846 'lang_english_name' => $lang_pack['name'], 847 'lang_local_name' => $lang_pack['local_name'], 848 'lang_author' => $lang_pack['author'] 849 ); 850 851 $db->sql_query('INSERT INTO ' . LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary)); 852 $lang_id = $db->sql_nextid(); 853 854 $valid_localized = array( 855 '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', 856 ); 857 858 $sql_ary = array(); 859 860 $sql = 'SELECT * 861 FROM ' . STYLES_IMAGESET_TABLE; 862 $result = $db->sql_query($sql); 863 while ($imageset_row = $db->sql_fetchrow($result)) 864 { 865 if (@file_exists("{$phpbb_root_path}styles/{$imageset_row['imageset_path']}/imageset/{$lang_pack['iso']}/imageset.cfg")) 866 { 867 $cfg_data_imageset_data = parse_cfg_file("{$phpbb_root_path}styles/{$imageset_row['imageset_path']}/imageset/{$lang_pack['iso']}/imageset.cfg"); 868 foreach ($cfg_data_imageset_data as $image_name => $value) 869 { 870 if (strpos($value, '*') !== false) 871 { 872 if (substr($value, -1, 1) === '*') 873 { 874 list($image_filename, $image_height) = explode('*', $value); 875 $image_width = 0; 876 } 877 else 878 { 879 list($image_filename, $image_height, $image_width) = explode('*', $value); 880 } 881 } 882 else 883 { 884 $image_filename = $value; 885 $image_height = $image_width = 0; 886 } 887 888 if (strpos($image_name, 'img_') === 0 && $image_filename) 889 { 890 $image_name = substr($image_name, 4); 891 if (in_array($image_name, $valid_localized)) 892 { 893 $sql_ary[] = array( 894 'image_name' => (string) $image_name, 895 'image_filename' => (string) $image_filename, 896 'image_height' => (int) $image_height, 897 'image_width' => (int) $image_width, 898 'imageset_id' => (int) $imageset_row['imageset_id'], 899 'image_lang' => (string) $lang_pack['iso'], 900 ); 901 } 902 } 903 } 904 } 905 } 906 $db->sql_freeresult($result); 907 908 if (sizeof($sql_ary)) 909 { 910 $db->sql_multi_insert(STYLES_IMAGESET_DATA_TABLE, $sql_ary); 911 $cache->destroy('sql', STYLES_IMAGESET_DATA_TABLE); 912 } 913 914 // Now let's copy the default language entries for custom profile fields for this new language - makes admin's life easier. 915 $sql = 'SELECT lang_id 916 FROM ' . LANG_TABLE . " 917 WHERE lang_iso = '" . $db->sql_escape($config['default_lang']) . "'"; 918 $result = $db->sql_query($sql); 919 $default_lang_id = (int) $db->sql_fetchfield('lang_id'); 920 $db->sql_freeresult($result); 921 922 // We want to notify the admin that custom profile fields need to be updated for the new language. 923 $notify_cpf_update = false; 924 925 // From the mysql documentation: 926 // 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. 927 // Due to this we stay on the safe side if we do the insertion "the manual way" 928 929 $sql = 'SELECT field_id, lang_name, lang_explain, lang_default_value 930 FROM ' . PROFILE_LANG_TABLE . ' 931 WHERE lang_id = ' . $default_lang_id; 932 $result = $db->sql_query($sql); 933 934 while ($row = $db->sql_fetchrow($result)) 935 { 936 $row['lang_id'] = $lang_id; 937 $db->sql_query('INSERT INTO ' . PROFILE_LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $row)); 938 $notify_cpf_update = true; 939 } 940 $db->sql_freeresult($result); 941 942 $sql = 'SELECT field_id, option_id, field_type, lang_value 943 FROM ' . PROFILE_FIELDS_LANG_TABLE . ' 944 WHERE lang_id = ' . $default_lang_id; 945 $result = $db->sql_query($sql); 946 947 while ($row = $db->sql_fetchrow($result)) 948 { 949 $row['lang_id'] = $lang_id; 950 $db->sql_query('INSERT INTO ' . PROFILE_FIELDS_LANG_TABLE . ' ' . $db->sql_build_array('INSERT', $row)); 951 $notify_cpf_update = true; 952 } 953 $db->sql_freeresult($result); 954 955 add_log('admin', 'LOG_LANGUAGE_PACK_INSTALLED', $lang_pack['name']); 956 957 $message = sprintf($user->lang['LANGUAGE_PACK_INSTALLED'], $lang_pack['name']); 958 $message .= ($notify_cpf_update) ? '<br /><br />' . $user->lang['LANGUAGE_PACK_CPF_UPDATE'] : ''; 959 trigger_error($message . adm_back_link($this->u_action)); 960 961 break; 962 963 case 'download': 964 965 if (!$lang_id) 966 { 967 trigger_error($user->lang['NO_LANG_ID'] . adm_back_link($this->u_action), E_USER_WARNING); 968 } 969 970 $sql = 'SELECT * 971 FROM ' . LANG_TABLE . ' 972 WHERE lang_id = ' . $lang_id; 973 $result = $db->sql_query($sql); 974 $row = $db->sql_fetchrow($result); 975 $db->sql_freeresult($result); 976 977 $use_method = request_var('use_method', ''); 978 $methods = array('.tar'); 979 980 $available_methods = array('.tar.gz' => 'zlib', '.tar.bz2' => 'bz2', '.zip' => 'zlib'); 981 foreach ($available_methods as $type => $module) 982 { 983 if (!@extension_loaded($module)) 984 { 985 continue; 986 } 987 988 $methods[] = $type; 989 } 990 991 // Let the user decide in which format he wants to have the pack 992 if (!$use_method) 993 { 994 $this->page_title = 'SELECT_DOWNLOAD_FORMAT'; 995 996 $radio_buttons = ''; 997 foreach ($methods as $method) 998 { 999 $radio_buttons .= '<label><input type="radio"' . ((!$radio_buttons) ? ' id="use_method"' : '') . ' class="radio" value="' . $method . '" name="use_method" /> ' . $method . '</label>'; 1000 } 1001 1002 $template->assign_vars(array( 1003 'S_SELECT_METHOD' => true, 1004 'U_BACK' => $this->u_action, 1005 'U_ACTION' => $this->u_action . "&action=$action&id=$lang_id", 1006 'RADIO_BUTTONS' => $radio_buttons) 1007 ); 1008 1009 return; 1010 } 1011 1012 if (!in_array($use_method, $methods)) 1013 { 1014 $use_method = '.tar'; 1015 } 1016 1017 include_once($phpbb_root_path . 'includes/functions_compress.' . $phpEx); 1018 1019 if ($use_method == '.zip') 1020 { 1021 $compress = new compress_zip('w', $phpbb_root_path . 'store/lang_' . $row['lang_iso'] . $use_method); 1022 } 1023 else 1024 { 1025 $compress = new compress_tar('w', $phpbb_root_path . 'store/lang_' . $row['lang_iso'] . $use_method, $use_method); 1026 } 1027 1028 // Get email templates 1029 $email_templates = filelist($phpbb_root_path . 'language/' . $row['lang_iso'], 'email', 'txt'); 1030 $email_templates = $email_templates['email/']; 1031 1032 // Get acp files 1033 $acp_files = filelist($phpbb_root_path . 'language/' . $row['lang_iso'], 'acp', $phpEx); 1034 $acp_files = $acp_files['acp/']; 1035 1036 // Get mod files 1037 $mod_files = filelist($phpbb_root_path . 'language/' . $row['lang_iso'], 'mods', $phpEx); 1038 $mod_files = (isset($mod_files['mods/'])) ? $mod_files['mods/'] : array(); 1039 1040 // Add main files 1041 $this->add_to_archive($compress, $this->main_files, $row['lang_iso']); 1042 1043 // Add search files if they exist... 1044 if (file_exists($phpbb_root_path . 'language/' . $row['lang_iso'] . '/search_ignore_words.' . $phpEx)) 1045 { 1046 $this->add_to_archive($compress, array("search_ignore_words.$phpEx"), $row['lang_iso']); 1047 } 1048 1049 if (file_exists($phpbb_root_path . 'language/' . $row['lang_iso'] . '/search_synonyms.' . $phpEx)) 1050 { 1051 $this->add_to_archive($compress, array("search_synonyms.$phpEx"), $row['lang_iso']); 1052 } 1053 1054 // Write files in folders 1055 $this->add_to_archive($compress, $email_templates, $row['lang_iso'], 'email'); 1056 $this->add_to_archive($compress, $acp_files, $row['lang_iso'], 'acp'); 1057 $this->add_to_archive($compress, $mod_files, $row['lang_iso'], 'mods'); 1058 1059 // Write ISO File 1060 $iso_src = htmlspecialchars_decode($row['lang_english_name']) . "\n"; 1061 $iso_src .= htmlspecialchars_decode($row['lang_local_name']) . "\n"; 1062 $iso_src .= htmlspecialchars_decode($row['lang_author']); 1063 $compress->add_data($iso_src, 'language/' . $row['lang_iso'] . '/iso.txt'); 1064 1065 // index.htm files 1066 $compress->add_data('', 'language/' . $row['lang_iso'] . '/index.htm'); 1067 $compress->add_data('', 'language/' . $row['lang_iso'] . '/email/index.htm'); 1068 $compress->add_data('', 'language/' . $row['lang_iso'] . '/acp/index.htm'); 1069 1070 if (sizeof($mod_files)) 1071 { 1072 $compress->add_data('', 'language/' . $row['lang_iso'] . '/mods/index.htm'); 1073 } 1074 1075 $compress->close(); 1076 1077 $compress->download('lang_' . $row['lang_iso']); 1078 @unlink($phpbb_root_path . 'store/lang_' . $row['lang_iso'] . $use_method); 1079 1080 exit; 1081 1082 break; 1083 } 1084 1085 $sql = 'SELECT user_lang, COUNT(user_lang) AS lang_count 1086 FROM ' . USERS_TABLE . ' 1087 GROUP BY user_lang'; 1088 $result = $db->sql_query($sql); 1089 1090 $lang_count = array(); 1091 while ($row = $db->sql_fetchrow($result)) 1092 { 1093 $lang_count[$row['user_lang']] = $row['lang_count']; 1094 } 1095 $db->sql_freeresult($result); 1096 1097 $sql = 'SELECT * 1098 FROM ' . LANG_TABLE . ' 1099 ORDER BY lang_english_name'; 1100 $result = $db->sql_query($sql); 1101 1102 $installed = array(); 1103 1104 while ($row = $db->sql_fetchrow($result)) 1105 { 1106 $installed[] = $row['lang_iso']; 1107 $tagstyle = ($row['lang_iso'] == $config['default_lang']) ? '*' : ''; 1108 1109 $template->assign_block_vars('lang', array( 1110 'U_DETAILS' => $this->u_action . "&action=details&id={$row['lang_id']}", 1111 'U_DOWNLOAD' => $this->u_action . "&action=download&id={$row['lang_id']}", 1112 'U_DELETE' => $this->u_action . "&action=delete&id={$row['lang_id']}", 1113 1114 'ENGLISH_NAME' => $row['lang_english_name'], 1115 'TAG' => $tagstyle, 1116 'LOCAL_NAME' => $row['lang_local_name'], 1117 'ISO' => $row['lang_iso'], 1118 'USED_BY' => (isset($lang_count[$row['lang_iso']])) ? $lang_count[$row['lang_iso']] : 0, 1119 )); 1120 } 1121 $db->sql_freeresult($result); 1122 1123 $new_ary = $iso = array(); 1124 $dp = @opendir("{$phpbb_root_path}language"); 1125 1126 if ($dp) 1127 { 1128 while (($file = readdir($dp)) !== false) 1129 { 1130 if ($file[0] == '.' || !is_dir($phpbb_root_path . 'language/' . $file)) 1131 { 1132 continue; 1133 } 1134 1135 if (file_exists("{$phpbb_root_path}language/$file/iso.txt")) 1136 { 1137 if (!in_array($file, $installed)) 1138 { 1139 if ($iso = file("{$phpbb_root_path}language/$file/iso.txt")) 1140 { 1141 if (sizeof($iso) == 3) 1142 { 1143 $new_ary[$file] = array( 1144 'iso' => $file, 1145 'name' => trim($iso[0]), 1146 'local_name'=> trim($iso[1]), 1147 'author' => trim($iso[2]) 1148 ); 1149 } 1150 } 1151 } 1152 } 1153 } 1154 closedir($dp); 1155 } 1156 1157 unset($installed); 1158 1159 if (sizeof($new_ary)) 1160 { 1161 foreach ($new_ary as $iso => $lang_ary) 1162 { 1163 $template->assign_block_vars('notinst', array( 1164 'ISO' => htmlspecialchars($lang_ary['iso']), 1165 'LOCAL_NAME' => htmlspecialchars($lang_ary['local_name'], ENT_COMPAT, 'UTF-8'), 1166 'NAME' => htmlspecialchars($lang_ary['name'], ENT_COMPAT, 'UTF-8'), 1167 'U_INSTALL' => $this->u_action . '&action=install&iso=' . urlencode($lang_ary['iso'])) 1168 ); 1169 } 1170 } 1171 1172 unset($new_ary); 1173 } 1174 1175 1176 /** 1177 * Set default language variables/header 1178 */ 1179 function default_variables() 1180 { 1181 global $phpEx; 1182 1183 $this->language_file_header = '<?php 1184 /** 1185 * 1186 * {FILENAME} [{LANG_NAME}] 1187 * 1188 * @package language 1189 * @version $' . 'Id: ' . '$ 1190 * @copyright (c) ' . date('Y') . ' phpBB Group 1191 * @author {CHANGED} - {AUTHOR} 1192 * @license http://opensource.org/licenses/gpl-license.php GNU Public License 1193 * 1194 */ 1195 1196 /** 1197 * DO NOT CHANGE 1198 */ 1199 if (!defined(\'IN_PHPBB\')) 1200 { 1201 exit; 1202 } 1203 1204 if (empty($lang) || !is_array($lang)) 1205 { 1206 $lang = array(); 1207 } 1208 1209 // DEVELOPERS PLEASE NOTE 1210 // 1211 // All language files should use UTF-8 as their encoding and the files must not contain a BOM. 1212 // 1213 // Placeholders can now contain order information, e.g. instead of 1214 // \'Page %s of %s\' you can (and should) write \'Page %1$s of %2$s\', this allows 1215 // translators to re-order the output of data while ensuring it remains correct 1216 // 1217 // You do not need this where single placeholders are used, e.g. \'Message %d\' is fine 1218 // equally where a string contains only two placeholders which are used to wrap text 1219 // in a url you again do not need to specify an order e.g., \'Click %sHERE%s\' is fine 1220 '; 1221 1222 $this->lang_header = ' 1223 $lang = array_merge($lang, array( 1224 '; 1225 1226 // Language files in language root directory 1227 $this->main_files = array("captcha_qa.$phpEx", "captcha_recaptcha.$phpEx", "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"); 1228 } 1229 1230 /** 1231 * Get filename/location of language file 1232 */ 1233 function get_filename($lang_iso, $directory, $filename, $check_store = false, $only_return_filename = false) 1234 { 1235 global $phpbb_root_path, $safe_mode; 1236 1237 $check_filename = "language/$lang_iso/" . (($directory) ? $directory . '/' : '') . $filename; 1238 1239 if ($check_store) 1240 { 1241 $check_store_filename = ($safe_mode) ? "store/langfile_{$lang_iso}" . (($directory) ? '_' . $directory : '') . "_{$filename}" : "store/language/$lang_iso/" . (($directory) ? $directory . '/' : '') . $filename; 1242 1243 if (!$only_return_filename && file_exists($phpbb_root_path . $check_store_filename)) 1244 { 1245 return $check_store_filename; 1246 } 1247 else if ($only_return_filename) 1248 { 1249 return $check_store_filename; 1250 } 1251 } 1252 1253 return $check_filename; 1254 } 1255 1256 /** 1257 * Add files to archive 1258 */ 1259 function add_to_archive(&$compress, $filelist, $lang_iso, $directory = '') 1260 { 1261 global $phpbb_root_path; 1262 1263 foreach ($filelist as $file) 1264 { 1265 // Get source filename 1266 $source = $this->get_filename($lang_iso, $directory, $file, true); 1267 $destination = 'language/' . $lang_iso . '/' . (($directory) ? $directory . '/' : '') . $file; 1268 1269 // Add file to archive 1270 $compress->add_custom_file($phpbb_root_path . $source, $destination); 1271 } 1272 } 1273 1274 /** 1275 * Little helper to add some hardcoded template bits 1276 */ 1277 function add_input_field() 1278 { 1279 $keys = func_get_args(); 1280 1281 $non_static = array_shift($keys); 1282 $value = utf8_normalize_nfc(array_shift($keys)); 1283 1284 if (!$non_static) 1285 { 1286 return '<strong>' . htmlspecialchars($value, ENT_COMPAT, 'UTF-8') . '</strong>'; 1287 } 1288 1289 // If more then 270 characters, then we present a textarea, else an input field 1290 $textarea = (utf8_strlen($value) > 270) ? true : false; 1291 $tpl = ''; 1292 1293 $tpl .= ($textarea) ? '<textarea name="' : '<input type="text" name="'; 1294 $tpl .= 'entry[' . implode('][', array_map('utf8_htmlspecialchars', $keys)) . ']"'; 1295 1296 $tpl .= ($textarea) ? ' cols="80" rows="5" class="langvalue">' : ' class="langvalue" value="'; 1297 $tpl .= htmlspecialchars($value, ENT_COMPAT, 'UTF-8'); 1298 $tpl .= ($textarea) ? '</textarea>' : '" />'; 1299 1300 return $tpl; 1301 } 1302 1303 /** 1304 * Print language entries 1305 */ 1306 function print_language_entries(&$lang_ary, $key_prefix = '', $input_field = true) 1307 { 1308 $tpl = ''; 1309 1310 foreach ($lang_ary as $key => $value) 1311 { 1312 if (is_array($value)) 1313 { 1314 // Write key 1315 $tpl .= ' 1316 <tr> 1317 <td class="row3" colspan="2">' . htmlspecialchars($key_prefix, ENT_COMPAT, 'UTF-8') . '<strong>' . htmlspecialchars($key, ENT_COMPAT, 'UTF-8') . '</strong></td> 1318 </tr>'; 1319 1320 foreach ($value as $_key => $_value) 1321 { 1322 if (is_array($_value)) 1323 { 1324 // Write key 1325 $tpl .= ' 1326 <tr> 1327 <td class="row3" colspan="2">' . htmlspecialchars($key_prefix, ENT_COMPAT, 'UTF-8') . ' <strong>' . htmlspecialchars($_key, ENT_COMPAT, 'UTF-8') . '</strong></td> 1328 </tr>'; 1329 1330 foreach ($_value as $__key => $__value) 1331 { 1332 // Write key 1333 $tpl .= ' 1334 <tr> 1335 <td class="row1" style="white-space: nowrap;">' . htmlspecialchars($key_prefix, ENT_COMPAT, 'UTF-8') . '<strong>' . htmlspecialchars($__key, ENT_COMPAT, 'UTF-8') . '</strong></td> 1336 <td class="row2">'; 1337 1338 $tpl .= $this->add_input_field($input_field, $__value, $key, $_key, $__key); 1339 1340 $tpl .= '</td> 1341 </tr>'; 1342 } 1343 } 1344 else 1345 { 1346 // Write key 1347 $tpl .= ' 1348 <tr> 1349 <td class="row1" style="white-space: nowrap;">' . htmlspecialchars($key_prefix, ENT_COMPAT, 'UTF-8') . '<strong>' . htmlspecialchars($_key, ENT_COMPAT, 'UTF-8') . '</strong></td> 1350 <td class="row2">'; 1351 1352 $tpl .= $this->add_input_field($input_field, $_value, $key, $_key); 1353 1354 $tpl .= '</td> 1355 </tr>'; 1356 } 1357 } 1358 1359 $tpl .= ' 1360 <tr> 1361 <td class="spacer" colspan="2"> </td> 1362 </tr>'; 1363 } 1364 else 1365 { 1366 // Write key 1367 $tpl .= ' 1368 <tr> 1369 <td class="row1" style="white-space: nowrap;">' . htmlspecialchars($key_prefix, ENT_COMPAT, 'UTF-8') . '<strong>' . htmlspecialchars($key, ENT_COMPAT, 'UTF-8') . '</strong></td> 1370 <td class="row2">'; 1371 1372 $tpl .= $this->add_input_field($input_field, $value, $key); 1373 1374 $tpl .= '</td> 1375 </tr>'; 1376 } 1377 } 1378 1379 return $tpl; 1380 } 1381 1382 /** 1383 * Compare two language files 1384 */ 1385 function compare_language_files($source_lang, $dest_lang, $directory, $file) 1386 { 1387 global $phpbb_root_path, $phpEx; 1388 1389 $return_ary = array(); 1390 1391 $lang = array(); 1392 include("{$phpbb_root_path}language/{$source_lang}/" . (($directory) ? $directory . '/' : '') . $file); 1393 $lang_entry_src = $lang; 1394 1395 $lang = array(); 1396 1397 if (!file_exists($phpbb_root_path . $this->get_filename($dest_lang, $directory, $file, true))) 1398 { 1399 return array(); 1400 } 1401 1402 include($phpbb_root_path . $this->get_filename($dest_lang, $directory, $file, true)); 1403 1404 $lang_entry_dst = $lang; 1405 1406 unset($lang); 1407 1408 $diff_array_keys = array_diff(array_keys($lang_entry_src), array_keys($lang_entry_dst)); 1409 unset($lang_entry_dst); 1410 1411 foreach ($diff_array_keys as $key) 1412 { 1413 $return_ary[$key] = $lang_entry_src[$key]; 1414 } 1415 1416 unset($lang_entry_src); 1417 1418 return $return_ary; 1419 } 1420 1421 /** 1422 * Return language string value for storage 1423 */ 1424 function prepare_lang_entry($text, $store = true) 1425 { 1426 $text = (STRIP) ? stripslashes($text) : $text; 1427 1428 // Adjust for storage... 1429 if ($store) 1430 { 1431 $text = str_replace("'", "\\'", str_replace('\\', '\\\\', $text)); 1432 } 1433 1434 return $text; 1435 } 1436 1437 /** 1438 * Format language array for storage 1439 */ 1440 function format_lang_array($key, $value, $tabs = "\t") 1441 { 1442 $entry = ''; 1443 1444 if (!is_array($value)) 1445 { 1446 $entry .= "{$tabs}'" . $this->prepare_lang_entry($key) . "'\t=> '" . $this->prepare_lang_entry($value) . "',\n"; 1447 } 1448 else 1449 { 1450 $_tabs = $tabs . "\t"; 1451 $entry .= "\n{$tabs}'" . $this->prepare_lang_entry($key) . "'\t=> array(\n"; 1452 1453 foreach ($value as $_key => $_value) 1454 { 1455 $entry .= $this->format_lang_array($_key, $_value, $_tabs); 1456 } 1457 1458 $entry .= "{$tabs}),\n\n"; 1459 } 1460 1461 return $entry; 1462 } 1463 } 1464 1465 ?>
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Wed Oct 2 15:03:47 2013 | Cross-referenced by PHPXref 0.7.1 |