2 /**********************************************************************
3 Copyright (C) FrontAccounting, LLC.
4 Released under the terms of the GNU General Public License, GPL,
5 as published by the Free Software Foundation, either version 3
6 of the License, or (at your option) any later version.
7 This program is distributed in the hope that it will be useful,
8 but WITHOUT ANY WARRANTY; without even the implied warranty of
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10 See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
11 ***********************************************************************/
12 $page_security = 'SA_CREATELANGUAGE';
14 include_once($path_to_root . "/includes/session.inc");
16 include_once($path_to_root."/includes/packages.inc");
17 include_once($path_to_root . "/admin/db/maintenance_db.inc");
18 include_once($path_to_root . "/includes/ui.inc");
20 if ($use_popup_windows)
21 $js = get_js_open_window(900, 500);
23 page(_($help_context = "Install/Update Languages"), false, false, "", $js);
25 simple_page_mode(true);
27 //---------------------------------------------------------------------------------------------
29 // Display all packages - both already installed and available from repository
31 function display_languages()
33 global $table_style, $installed_languages, $dflt_lang;
34 global $repository, $FA_repo_version;
36 $th = array(_("Language"), _("Name"), _("Encoding"), _("Right To Left"),
37 _("Installed"), _("Available"), _("Default"), "", "");
38 $currlang = $_SESSION["language"]->code;
40 div_start('lang_tbl');
43 // select/display system locales support for sites using native gettext
45 if (function_exists('gettext'))
47 if (check_value('DisplayAll'))
48 array_insert($th, 7, _("Supported"));
50 check_row(_('Display also languages not supported by server locales'), 'DisplayAll', null, true);
54 start_table(TABLESTYLE);
59 // get list of all (available and installed) langauges
60 $langs = get_languages_list();
61 foreach ($langs as $pkg_name => $lng)
64 $lang_name = $lng['name'];
65 $charset = $lng['encoding'];
66 $rtl = @$lng['rtl'] == 'yes' || @$lng['rtl'] === true;
67 $available = @$lng['available'];
68 $installed = @$lng['version'];
69 $id = @$lng['local_id'];
71 if ($lang == $currlang)
72 start_row("class='stockmankobg'");
74 alt_table_row_color($k);
76 $support = ($lang == 'en_GB') ||
77 $_SESSION['get_text']->check_support($lang, $charset);
79 if (function_exists('gettext') && !$support && !get_post('DisplayAll')) continue;
82 label_cell($available ? get_package_view_str($lang, $lang_name) : $lang_name);
84 label_cell($rtl ? _("Yes") : _("No"));
86 label_cell($id === null ? _("None") :
87 ($available && $installed ? $installed : _("Unknown")));
89 label_cell($available ? $available : _("None"));
91 label_cell($id === null ? '' :
92 radio(null, 'CurDflt', $id, $dflt_lang == $lang, true),
95 if (function_exists('gettext') && check_value('DisplayAll'))
96 label_cell($support ? _("Yes") :_("No"));
98 if (!$available && ($lang != 'en_GB')) // manually installed language
99 button_cell('Edit'.$id, _("Edit"), _('Edit non standard language configuration'),
101 elseif (check_pkg_upgrade($installed, $available)) // outdated or not installed language in repo
102 button_cell('Update'.$pkg_name, $installed ? _("Update") : _("Install"),
103 _('Upload and install latest language package'), ICON_DOWN);
107 if (($id !== null) && ($lang != $currlang) && ($lang != 'en_GB')) {
108 delete_button_cell('Delete'.$id, _('Delete'));
109 submit_js_confirm('Delete'.$id,
110 sprintf(_("You are about to remove language \'%s\'.\nDo you want to continue ?"),
117 display_note(_("The marked language is the current language which cannot be deleted."), 0, 0, "class='currentfg'");
119 submit_center_first('Refresh', _("Update default"), '', null);
121 submit_center_last('Add', _("Add new language manually"), '', false);
126 //---------------------------------------------------------------------------------------------
127 // Non standard (manually entered) languages support.
129 function check_data()
131 global $installed_languages;
133 if (get_post('code') == '' || get_post('name') == '' || get_post('encoding') == '') {
134 display_error(_("Language name, code nor encoding cannot be empty"));
137 $id = array_search_value($_POST['code'], $installed_languages, 'code');
138 if ($id !== null && $installed_languages[$id]['package'] != null) {
139 display_error(_('Standard package for this language is already installed. If you want to install this language manually, uninstall standard language package first.'));
145 function handle_submit($id)
147 global $path_to_root, $installed_languages, $dflt_lang, $Mode;
149 if ($_POST['dflt']) {
150 $dflt_lang = $_POST['code'];
153 $installed_languages[$id]['code'] = $_POST['code'];
154 $installed_languages[$id]['name'] = $_POST['name'];
155 $installed_languages[$id]['path'] = 'lang/' . $_POST['code'];
156 $installed_languages[$id]['encoding'] = $_POST['encoding'];
157 $installed_languages[$id]['rtl'] = (bool)$_POST['rtl'];
158 $installed_languages[$id]['package'] = '';
159 $installed_languages[$id]['version'] = '';
162 $directory = $path_to_root . "/lang/" . $_POST['code'];
163 if (!file_exists($directory))
166 mkdir($directory . "/LC_MESSAGES");
168 if (is_uploaded_file($_FILES['uploadfile']['tmp_name']))
170 $file1 = $_FILES['uploadfile']['tmp_name'];
171 $file2 = $directory . "/LC_MESSAGES/".$_POST['code'].".po";
172 if (file_exists($file2))
174 move_uploaded_file($file1, $file2);
176 if (is_uploaded_file($_FILES['uploadfile2']['tmp_name']))
178 $file1 = $_FILES['uploadfile2']['tmp_name'];
179 $file2 = $directory . "/LC_MESSAGES/".$_POST['code'].".mo";
180 if (file_exists($file2))
182 move_uploaded_file($file1, $file2);
187 //---------------------------------------------------------------------------------------------
189 function display_language_edit($selected_id)
191 global $installed_languages, $dflt_lang;
193 if ($selected_id == -1)
194 $n = count($installed_languages);
200 start_table(TABLESTYLE2);
202 if ($selected_id != -1)
204 $lang = $installed_languages[$n];
205 $_POST['code'] = $lang['code'];
206 $_POST['name'] = $lang['name'];
207 $_POST['encoding'] = $lang['encoding'];
208 if (isset($conn['rtl']))
209 $_POST['rtl'] = $lang['rtl'];
211 $_POST['rtl'] = false;
212 $_POST['dflt'] = $dflt_lang == $lang['code'];
213 hidden('selected_id', $selected_id);
215 text_row_ex(_("Language Code"), 'code', 20);
216 text_row_ex(_("Language Name"), 'name', 20);
217 text_row_ex(_("Encoding"), 'encoding', 20);
219 yesno_list_row(_("Right To Left"), 'rtl', null, "", "", false);
220 yesno_list_row(_("Default Language"), 'dflt', null, "", "", false);
222 file_row(_("Language File") . " (PO)", 'uploadfile');
223 file_row(_("Language File") . " (MO)", 'uploadfile2');
226 display_note(_("Select your language files from your local harddisk."), 0, 1);
228 submit_add_or_update_center(false, '', 'both');
233 function handle_delete($id)
235 global $path_to_root, $installed_languages, $dflt_lang;
237 $lang = $installed_languages[$id]['code'];
238 if ($installed_languages[$id]['package'])
239 if (!uninstall_package($installed_languages[$id]['package']))
242 if ($lang == $dflt_lang ) {
243 // on delete set default to current.
244 $dflt_lang = $_SESSION['language']->code;
247 unset($installed_languages[$id]);
248 $installed_languages = array_values($installed_languages);
253 $dirname = "$path_to_root/lang/$lang";
254 if ($lang && is_dir($dirname)) { // remove nonstadard language dir
255 flush_dir($dirname, true);
260 //---------------------------------------------------------------------------------------------
262 if ($Mode == 'Delete')
263 handle_delete($selected_id);
265 if ($Mode == 'ADD_ITEM' || $Mode == 'UPDATE_ITEM')
266 if (check_data() && handle_submit($selected_id))
269 if ($id = find_submit('Update', false))
270 install_language($id);
272 if (get_post('_CurDflt_update') || (get_post('Refresh') && get_post('CurDflt', -1) != -1)) {
273 $new_lang = $installed_languages[get_post('CurDflt', 0)]['code'];
274 if ($new_lang != $dflt_lang) {
275 $dflt_lang = $new_lang;
277 $Ajax->activate('lang_tbl');
280 if (get_post('_DisplayAll_update')) {
281 $Ajax->activate('lang_tbl');
284 //---------------------------------------------------------------------------------------------
286 if (isset($_GET['popup']) || get_post('Add') || $Mode == 'Edit' || $Mode == 'ADD_ITEM' || $Mode == 'UPDATE_ITEM') {
287 display_language_edit($selected_id);
291 //---------------------------------------------------------------------------------------------