X-Git-Url: https://delta.frontaccounting.com/gitweb/?a=blobdiff_plain;f=admin%2Finst_lang.php;h=b2264c1dfd8e7b1b92be0a34f92d3c3b75e3e742;hb=a31195793c023906ab5da62f06ab84aefed445c3;hp=ccdd3d8e31245d3e56c739c87ff01ff41ce75446;hpb=6cd42b4b7e4e5a199949a33fcf7fbd1f5d0ad3cb;p=fa-stable.git diff --git a/admin/inst_lang.php b/admin/inst_lang.php index ccdd3d8e..b2264c1d 100644 --- a/admin/inst_lang.php +++ b/admin/inst_lang.php @@ -9,162 +9,143 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the License here . ***********************************************************************/ -$page_security = 20; +$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 ($SysPrefs->use_popup_windows) + $js = get_js_open_window(900, 500); -if (isset($_GET['selected_id'])) -{ - $selected_id = $_GET['selected_id']; -} -elseif (isset($_POST['selected_id'])) -{ - $selected_id = $_POST['selected_id']; -} -else - $selected_id = -1; +page(_($help_context = "Install/Update Languages"), false, false, "", $js); -//--------------------------------------------------------------------------------------------- +simple_page_mode(true); -function check_data() +//--------------------------------------------------------------------------------------------- +// +// Display all packages - both already installed and available from repository +// +function display_languages() { - if ($_POST['code'] == "" || $_POST['name'] == "" || $_POST['encoding'] == "") { - display_error(_("Language name, code nor encoding cannot be empty")); - return false; + global $installed_languages, $dflt_lang, $GetText; + + $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 (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(); } - return 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; -} + start_table(TABLESTYLE); + table_header($th); -function write_lang() -{ - global $path_to_root, $installed_languages, $dflt_lang; - 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"; - if ($n > 0) - $msg .= "\t0 => "; - for ($i = 0; $i < $n; $i++) + $k = 0; + + // get list of all (available and installed) langauges + $langs = get_languages_list(); + foreach ($langs as $pkg_name => $lng) { - if ($i > 0) - $msg .= "\t\tarray "; + 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 - $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"; + 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 - $msg .= "),\n"; + 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(); } + 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); - $msg .= "\t);\n"; - $msg .= "\n\$dflt_lang = '$dflt_lang';\n?>\n"; + submit_center_last('Add', _("Add new language manually"), '', false); - $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); - } + end_form(); + div_end(); +} +//--------------------------------------------------------------------------------------------- +// Non standard (manually entered) languages support. +// +function check_data() +{ + global $installed_languages; + + if (get_post('code') == '' || get_post('name') == '' || get_post('encoding') == '') { + display_error(_("Language name, code nor encoding cannot be empty")); + return false; } - else - { - display_error(_("The language file ") . $filename . _(" is not writable. Change its permissions so it is, then re-run the operation.")); + $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; } -//--------------------------------------------------------------------------------------------- - -function handle_submit() +function handle_submit($id) { - global $path_to_root, $installed_languages, $dflt_lang; - - if (!check_data()) - return false; - - $id = $_GET['id']; + global $path_to_root, $installed_languages, $dflt_lang, $Mode; if ($_POST['dflt']) { $dflt_lang = $_POST['code']; @@ -172,8 +153,11 @@ function handle_submit() $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']; @@ -185,7 +169,8 @@ function handle_submit() if (is_uploaded_file($_FILES['uploadfile']['tmp_name'])) { $file1 = $_FILES['uploadfile']['tmp_name']; - $file2 = $directory . "/LC_MESSAGES/".$_POST['code'].".po"; + $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); @@ -193,7 +178,8 @@ function handle_submit() if (is_uploaded_file($_FILES['uploadfile2']['tmp_name'])) { $file1 = $_FILES['uploadfile2']['tmp_name']; - $file2 = $directory . "/LC_MESSAGES/".$_POST['code'].".mo"; + $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); @@ -203,123 +189,30 @@ function handle_submit() //--------------------------------------------------------------------------------------------- -function handle_delete() -{ - global $path_to_root, $installed_languages, $dflt_lang; - - $id = $_GET['id']; - - $lang = $installed_languages[$id]['code']; - $filename = "$path_to_root/lang/$lang/LC_MESSAGES"; - - 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 (!write_lang()) - return; - - $filename = "$path_to_root/lang/$lang"; - flush_dir($filename); - rmdir($filename); - - meta_forward($_SERVER['PHP_SELF']); -} - -//--------------------------------------------------------------------------------------------- - -function display_languages() -{ - global $table_style, $installed_languages, $dflt_lang; - - $lang = $_SESSION["language"]->code; - - echo " - "; - start_table($table_style); - $th = array(_("Language"), _("Name"), _("Encoding"), _("Right To Left"), _("Default"), "", ""); - 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); - label_cell($dflt_lang == $conn[$i]['code'] ? _("Yes") :_("No")); - $edit = _("Edit"); - $delete = _("Delete"); - if (user_graphic_links()) - { - $edit = set_icon(ICON_EDIT, $edit); - $delete = set_icon(ICON_DELETE, $delete); - } - label_cell("$edit"); - label_cell($conn[$i]['code'] == $lang ? '' : - "$delete"); - end_row(); - } - - end_table(); - display_note(_("The marked language is the current language which cannot be deleted."), 0, 0, "class='currentfg'"); -} - -//--------------------------------------------------------------------------------------------- - function display_language_edit($selected_id) { - global $installed_languages, $table_style2, $dflt_lang; + 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); - start_form(true, true); - - echo " - "; - - start_table($table_style2); + start_table(TABLESTYLE2); 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 == $conn['code']; + $_POST['dflt'] = $dflt_lang == $lang['code']; hidden('selected_id', $selected_id); } text_row_ex(_("Language Code"), 'code', 20); @@ -329,46 +222,75 @@ function display_language_edit($selected_id) yesno_list_row(_("Right To Left"), 'rtl', null, "", "", false); yesno_list_row(_("Default Language"), 'dflt', null, "", "", false); - label_row(_("Language File") . " (PO)", ""); - label_row(_("Language File") . " (MO)", ""); + file_row(_("Language File") . " (PO)", 'uploadfile'); + file_row(_("Language File") . " (MO)", 'uploadfile2'); end_table(0); display_note(_("Select your language files from your local harddisk."), 0, 1); - echo "
"; + 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