X-Git-Url: https://delta.frontaccounting.com/gitweb/?a=blobdiff_plain;f=admin%2Finst_lang.php;h=b2264c1dfd8e7b1b92be0a34f92d3c3b75e3e742;hb=5a3cbfe6d2df1c8c32edcab8bf93e8a8432a15fc;hp=e5eae2e79f727338021d532a3bcf2dfd123f1c04;hpb=da8311619dd73feae101d246a1957b972e00cbd2;p=fa-stable.git diff --git a/admin/inst_lang.php b/admin/inst_lang.php index e5eae2e7..b2264c1d 100644 --- a/admin/inst_lang.php +++ b/admin/inst_lang.php @@ -1,349 +1,296 @@ . +***********************************************************************/ +$page_security = 'SA_CREATELANGUAGE'; $path_to_root=".."; include_once($path_to_root . "/includes/session.inc"); -page(_("Install/Update Languages")); - -include_once($path_to_root . "/includes/date_functions.inc"); -include_once($path_to_root . "/admin/db/company_db.inc"); +include_once($path_to_root."/includes/packages.inc"); include_once($path_to_root . "/admin/db/maintenance_db.inc"); include_once($path_to_root . "/includes/ui.inc"); -//--------------------------------------------------------------------------------------------- - -if (isset($_GET['selected_id'])) -{ - $selected_id = $_GET['selected_id']; -} -elseif (isset($_POST['selected_id'])) -{ - $selected_id = $_POST['selected_id']; -} -else - $selected_id = -1; +if ($SysPrefs->use_popup_windows) + $js = get_js_open_window(900, 500); -//--------------------------------------------------------------------------------------------- +page(_($help_context = "Install/Update Languages"), false, false, "", $js); -function check_data() -{ - return true; -} +simple_page_mode(true); -/** - * @return Returns the array sorted as required - * @param $aryData Array containing data to sort - * @param $strIndex name of column to use as an index - * @param $strSortBy Column to sort the array by - * @param $strSortType String containing either asc or desc [default to asc] - * @desc Naturally sorts an array using by the column $strSortBy - */ -function array_natsort($aryData, $strIndex, $strSortBy, $strSortType=false) -{ - // if the parameters are invalid - if (!is_array($aryData) || !$strIndex || !$strSortBy) - // return the array - return $aryData; - - // create our temporary arrays - $arySort = $aryResult = array(); - - // loop through the array - foreach ($aryData as $aryRow) - // set up the value in the array - $arySort[$aryRow[$strIndex]] = $aryRow[$strSortBy]; - - // apply the natural sort - natsort($arySort); - - // if the sort type is descending - if ($strSortType=="desc") - // reverse the array - arsort($arySort); - - // loop through the sorted and original data - foreach ($arySort as $arySortKey => $arySorted) - foreach ($aryData as $aryOriginal) - // if the key matches - if ($aryOriginal[$strIndex]==$arySortKey) - // add it to the output array - array_push($aryResult, $aryOriginal); - - // return the return - return $aryResult; -} - -function write_lang() +//--------------------------------------------------------------------------------------------- +// +// Display all packages - both already installed and available from repository +// +function display_languages() { - global $path_to_root, $installed_languages; - include_once($path_to_root . "/lang/installed_languages.inc"); - - $conn = array_natsort($installed_languages, 'code', 'code'); - $installed_languages = $conn; - //reset($installed_languages); - $n = count($installed_languages); - $msg = " ')\n"; - $msg .= "-- 'code' should match the name of the directory for the language under \\lang\n"; - $msg .= "-- 'name' is the name that will be displayed in the language selection list (in Users and Display Setup)\n"; - $msg .= "-- 'rtl' only needs to be set for right-to-left languages like Arabic and Hebrew\n\n"; - $msg .= "*/\n\n\n"; - - $msg .= "\$installed_languages = array (\n"; - $msg .= "\t0 => "; - for ($i = 0; $i < $n; $i++) + $th = array(_("Language"), _("Name"), _("Encoding"), _("Right To Left"), + _("Installed"), _("Available"), _("Default"), "", ""); + $currlang = $_SESSION["language"]->code; + + div_start('lang_tbl'); + start_form(); + // + // select/display system locales support for sites using native gettext + // + if (function_exists('gettext')) { - if ($i > 0) - $msg .= "\t\tarray "; - else - $msg .= "array "; - $msg .= "('code' => '" . $installed_languages[$i]['code'] . "', "; - $msg .= "'name' => '" . $installed_languages[$i]['name'] . "', "; - $msg .= "'encoding' => '" . $installed_languages[$i]['encoding'] . "'"; - if (isset($installed_languages[$i]['rtl']) && $installed_languages[$i]['rtl']) - $msg .= ", 'rtl' => true),\n"; - else - $msg .= "),\n"; + if (check_value('DisplayAll')) + array_insert($th, 7, _("Supported")); + start_table(); + check_row(_('Display also languages not supported by server locales'), 'DisplayAll', null, true); + end_table(); } - $msg .= "\t);\n?>"; - $filename = $path_to_root . "/lang/installed_languages.inc"; - // Check if the file exists and is writable first. - if (file_exists($filename) && is_writable($filename)) - { - if (!$zp = fopen($filename, 'w')) - { - display_error(_("Cannot open the languages file - ") . $filename); - return false; - } - else - { - if (!fwrite($zp, $msg)) - { - display_error(_("Cannot write to the language file - ") . $filename); - fclose($zp); - return false; - } - // Close file - fclose($zp); - } - } - else + start_table(TABLESTYLE); + table_header($th); + + $k = 0; + + // get list of all (available and installed) langauges + $langs = get_languages_list(); + foreach ($langs as $pkg_name => $lng) { - display_error(_("The language file ") . $filename . _(" is not writable. Change its permissions so it is, then re-run the operation.")); - return false; + if ($lng == 'C') // skip default locale (aka no translation) + continue; + + $lang = $lng['code']; + $lang_name = $lng['name']; + $charset = $lng['encoding']; + $rtl = @$lng['rtl'] == 'yes' || @$lng['rtl'] === true; + $available = @$lng['available']; + $installed = @$lng['version']; + $id = @$lng['local_id']; + + if ($lang == $currlang) + start_row("class='stockmankobg'"); + else + alt_table_row_color($k); + + $support = $GetText->check_support($lang, $charset); + + if (function_exists('gettext') && !$support && !get_post('DisplayAll') && $lang != 'C') continue; + + label_cell($lang); + label_cell($available ? get_package_view_str($lang, $lang_name) : $lang_name); + label_cell($charset); + label_cell($rtl ? _("Yes") : _("No")); + + label_cell($id === null ? _("None") : + ($available && $installed ? $installed : _("Unknown"))); + + label_cell($available ? $available : _("None")); + + label_cell($id === null ? '' : + radio(null, 'CurDflt', $id, $dflt_lang == $lang, true), + "align='center'"); + + if (function_exists('gettext') && check_value('DisplayAll')) + label_cell($support ? _("Yes") :_("No")); + + if (!$available && ($lang != 'C')) // manually installed language + button_cell('Edit'.$id, _("Edit"), _('Edit non standard language configuration'), + ICON_EDIT); + elseif (check_pkg_upgrade($installed, $available)) // outdated or not installed language in repo + button_cell('Update'.$pkg_name, $installed ? _("Update") : _("Install"), + _('Upload and install latest language package'), ICON_DOWN); + else + label_cell(''); + + if (($id !== null) && ($lang != $currlang) && ($lang != 'C')) { + delete_button_cell('Delete'.$id, _('Delete')); + submit_js_confirm('Delete'.$id, + sprintf(_("You are about to remove language \'%s\'.\nDo you want to continue ?"), + $lang_name)); + } else + label_cell(''); + end_row(); } - return true; -} + end_table(); + display_note(_("The marked language is the current language which cannot be deleted."), 0, 0, "class='currentfg'"); + br(); + submit_center_first('Refresh', _("Update default"), '', null); -//--------------------------------------------------------------------------------------------- + submit_center_last('Add', _("Add new language manually"), '', false); -function handle_submit() + end_form(); + div_end(); +} +//--------------------------------------------------------------------------------------------- +// Non standard (manually entered) languages support. +// +function check_data() { - global $path_to_root, $installed_languages; + global $installed_languages; - if (!check_data()) + if (get_post('code') == '' || get_post('name') == '' || get_post('encoding') == '') { + display_error(_("Language name, code nor encoding cannot be empty")); + return false; + } + $id = array_search_value($_POST['code'], $installed_languages, 'code'); + if ($id !== null && $installed_languages[$id]['package'] != null) { + display_error(_('Standard package for this language is already installed. If you want to install this language manually, uninstall standard language package first.')); return false; + } + return true; +} - $id = $_GET['id']; +function handle_submit($id) +{ + global $path_to_root, $installed_languages, $dflt_lang, $Mode; + if ($_POST['dflt']) { + $dflt_lang = $_POST['code']; + } + $installed_languages[$id]['code'] = $_POST['code']; $installed_languages[$id]['name'] = $_POST['name']; + $installed_languages[$id]['path'] = 'lang/' . $_POST['code']; $installed_languages[$id]['encoding'] = $_POST['encoding']; $installed_languages[$id]['rtl'] = (bool)$_POST['rtl']; + $installed_languages[$id]['package'] = ''; + $installed_languages[$id]['version'] = ''; if (!write_lang()) return false; - $directory = $path_to_root . "/lang/" . $_POST['code']; + $directory = $path_to_root . "/lang/" . $_POST['code']; if (!file_exists($directory)) { mkdir($directory); mkdir($directory . "/LC_MESSAGES"); - } + } if (is_uploaded_file($_FILES['uploadfile']['tmp_name'])) { $file1 = $_FILES['uploadfile']['tmp_name']; - $file2 = $directory . "/LC_MESSAGES/".$_POST['code'].".mo"; + $code = preg_replace('/[^a-zA-Z_]/', '', $_POST['code']); + $file2 = $directory . "/LC_MESSAGES/$code.po"; if (file_exists($file2)) unlink($file2); move_uploaded_file($file1, $file2); } - return true; -} - -//--------------------------------------------------------------------------------------------- - -function handle_delete() -{ - global $path_to_root, $installed_languages; - - $id = $_GET['id']; - - $lang = $installed_languages[$id]['code']; - $filename = "$path_to_root/lang/$lang/LC_MESSAGES"; - if ($h = opendir($filename)) + if (is_uploaded_file($_FILES['uploadfile2']['tmp_name'])) { - while (($file = readdir($h)) !== false) - { - if (is_file("$filename/$file")) - unlink("$filename/$file"); - } - closedir($h); - } - rmdir($filename); - $filename = "$path_to_root/lang/$lang"; - if ($h = opendir($filename)) - { - while (($file = readdir($h)) !== false) - { - if (is_file("$filename/$file")) - unlink("$filename/$file"); - } - closedir($h); - } - rmdir($filename); - - unset($installed_languages[$id]); - $conn = array_values($installed_languages); - $installed_languages = $conn; - - //$$db_connections = array_values($db_connections); - - if (!write_lang()) - return; - meta_forward($_SERVER['PHP_SELF']); -} - -//--------------------------------------------------------------------------------------------- - -function display_languages() -{ - global $table_style, $installed_languages; - - $lang = $_SESSION["language"]->code; - - echo " - "; - start_table($table_style); - $th = array(_("Language"), _("Name"), _("Encoding"), _("Right To Left"), "", ""); - table_header($th); - - $k = 0; - $conn = $installed_languages; - $n = count($conn); - for ($i = 0; $i < $n; $i++) - { - if ($conn[$i]['code'] == $lang) - start_row("class='stockmankobg'"); - else - alt_table_row_color($k); - - label_cell($conn[$i]['code']); - label_cell($conn[$i]['name']); - label_cell($conn[$i]['encoding']); - if (isset($conn[$i]['rtl']) && $conn[$i]['rtl']) - $rtl = _("Yes"); - else - $rtl = _("No"); - label_cell($rtl); - edit_link_cell("selected_id=" . $i); - if ($conn[$i]['code'] != $lang) - label_cell("" . _("Delete") . ""); - end_row(); + $file1 = $_FILES['uploadfile2']['tmp_name']; + $code = preg_replace('/[^a-zA-Z_]/', '', $_POST['code']); + $file2 = $directory . "/LC_MESSAGES/$code.mo"; + if (file_exists($file2)) + unlink($file2); + move_uploaded_file($file1, $file2); } - - end_table(); - display_note(_("The marked language is the current language which cannot be deleted."), 0, 0, "class='currentfg'"); + return true; } //--------------------------------------------------------------------------------------------- function display_language_edit($selected_id) { - global $installed_languages, $table_style2; + global $installed_languages, $dflt_lang; - if ($selected_id != -1) - $n = $selected_id; - else + if ($selected_id == -1) $n = count($installed_languages); + else + $n = $selected_id; - start_form(true, true); - - echo " - "; - - start_table($table_style2); + start_form(true); + + start_table(TABLESTYLE2); - if ($selected_id != -1) + if ($selected_id != -1) { - $conn = $installed_languages[$selected_id]; - $_POST['code'] = $conn['code']; - $_POST['name'] = $conn['name']; - $_POST['encoding'] = $conn['encoding']; - if (isset($conn['rtl'])) - $_POST['rtl'] = $conn['rtl']; + $lang = $installed_languages[$n]; + $_POST['code'] = $lang['code']; + $_POST['name'] = $lang['name']; + $_POST['encoding'] = $lang['encoding']; + if (isset($lang['rtl']) && $lang['rtl'] === true) + $_POST['rtl'] = $lang['rtl']; else $_POST['rtl'] = false; + $_POST['dflt'] = $dflt_lang == $lang['code']; hidden('selected_id', $selected_id); - } - text_row_ex(_("Language"), 'code', 20); - text_row_ex(_("Name"), 'name', 20); + } + text_row_ex(_("Language Code"), 'code', 20); + text_row_ex(_("Language Name"), 'name', 20); text_row_ex(_("Encoding"), 'encoding', 20); yesno_list_row(_("Right To Left"), 'rtl', null, "", "", false); + yesno_list_row(_("Default Language"), 'dflt', null, "", "", false); - label_row(_("Language File"), ""); + file_row(_("Language File") . " (PO)", 'uploadfile'); + file_row(_("Language File") . " (MO)", 'uploadfile2'); end_table(0); - display_note(_("Select your language MO file from your local harddisk."), 0, 1); - echo "
"; + display_note(_("Select your language files from your local harddisk."), 0, 1); + submit_add_or_update_center(false, '', 'both'); end_form(); } - -//--------------------------------------------------------------------------------------------- - -if (isset($_GET['c'])) +function handle_delete($id) { - if ($_GET['c'] == 'df') - { - handle_delete(); + global $path_to_root, $installed_languages, $dflt_lang; + + $lang = $installed_languages[$id]['code']; + if ($installed_languages[$id]['package']) + if (!uninstall_package($installed_languages[$id]['package'])) + return; + + if ($lang == $dflt_lang ) { + // on delete set default to current. + $dflt_lang = $_SESSION['language']->code; } + + unset($installed_languages[$id]); + $installed_languages = array_values($installed_languages); - if ($_GET['c'] == 'u') - { - if (handle_submit()) - { - //meta_forward($_SERVER['PHP_SELF']); - } - } + if (!write_lang()) + return; + + $dirname = "$path_to_root/lang/$lang"; + if ($lang && is_dir($dirname)) { // remove nonstadard language dir + flush_dir($dirname, true); + rmdir($dirname); + } } //--------------------------------------------------------------------------------------------- -display_languages(); +if ($Mode == 'Delete') + handle_delete($selected_id); -hyperlink_no_params($_SERVER['PHP_SELF'], _("Create a new language")); +if ($Mode == 'ADD_ITEM' || $Mode == 'UPDATE_ITEM') + if (check_data() && handle_submit($selected_id)) + $Mode = 'RESET'; -display_language_edit($selected_id); +if ($id = find_submit('Update', false)) + install_language($id); +if (get_post('_CurDflt_update') || (get_post('Refresh') && get_post('CurDflt', -1) != -1)) { + $new_lang = $installed_languages[get_post('CurDflt', 0)]['code']; + if ($new_lang != $dflt_lang) { + $dflt_lang = $new_lang; + write_lang(); + $Ajax->activate('lang_tbl'); + } +} +if (get_post('_DisplayAll_update')) { + $Ajax->activate('lang_tbl'); +} + //--------------------------------------------------------------------------------------------- +if (isset($_GET['popup']) || get_post('Add') || $Mode == 'Edit' || $Mode == 'ADD_ITEM' || $Mode == 'UPDATE_ITEM') { + display_language_edit($selected_id); +} else + display_languages(); + +//--------------------------------------------------------------------------------------------- end_page(); -?> \ No newline at end of file