Feature 5388: Print Invoices (documents) list gets too long. Fixed by default 180...
[fa-stable.git] / admin / inst_lang.php
index 9c8ea4b555cbe1c565ae026864b1f2a3d0081968..3ed51a6819fdae185b24d2b5385f277bca4ab5f3 100644 (file)
@@ -13,127 +13,154 @@ $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;
-}
 
-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 = "<?php\n\n";
-
-       $msg .= "/* How to make new entries here\n\n";
-       $msg .= "-- if adding languages at the beginning of the list, make sure it's index is set to 0 (it has ' 0 => ')\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++)
+       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)
        {
-               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'];
        }
        
-       $installed_languages[$id]['code'] = $_POST['code'];
+       $installed_languages[$id]['code'] = clean_file_name($_POST['code']);
        $installed_languages[$id]['name'] = $_POST['name'];
+       $installed_languages[$id]['path'] = 'lang/' . clean_file_name(get_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/" . clean_file_name(get_post('code'));
        if (!file_exists($directory))
        {
                mkdir($directory);
@@ -142,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);
@@ -150,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);
@@ -160,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 "
-               <script language='javascript'>
-               function deleteLanguage(id) {
-                       if (!confirm('" . _("Are you sure you want to delete language no. ") . "'+id))
-                               return
-                       document.location.replace('inst_lang.php?c=df&id='+id)
-               }
-               </script>";
-       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("<a href='" . $_SERVER['PHP_SELF']. "?selected_id=$i'>$edit</a>");
-               label_cell($conn[$i]['code'] == $lang ? '' :
-                       "<a href='javascript:deleteLanguage(" . $i . ")'>$delete</a>");
-               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);
 
-       echo "
-               <script language='javascript'>
-               function updateLanguage() {
-                       document.forms[0].action='inst_lang.php?c=u&id=" . $n . "'
-                       document.forms[0].submit()
-               }
-               </script>";
-
-       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);
@@ -286,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)", "<input name='uploadfile' type='file'>");
-       label_row(_("Language File") . " (MO)", "<input name='uploadfile2' type='file'>");
+       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 "<center><input onclick='javascript:updateLanguage()' type='button' style='width:150px' value='". _("Save"). "'></center>";
 
+       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