Feature 5388: Print Invoices (documents) list gets too long. Fixed by default 180...
[fa-stable.git] / admin / inst_lang.php
1 <?php
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';
13 $path_to_root="..";
14 include_once($path_to_root . "/includes/session.inc");
15
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");
19
20 if ($SysPrefs->use_popup_windows)
21         $js = get_js_open_window(900, 500);
22
23 page(_($help_context = "Install/Update Languages"), false, false, "", $js);
24
25 simple_page_mode(true);
26
27 //---------------------------------------------------------------------------------------------
28 //
29 // Display all packages - both already installed and available from repository
30 //
31 function display_languages()
32 {
33         global $installed_languages, $dflt_lang, $GetText;
34         
35         $th = array(_("Language"), _("Name"), _("Encoding"), _("Right To Left"),
36                 _("Installed"), _("Available"), _("Default"), "", "");
37         $currlang = $_SESSION["language"]->code;
38
39         div_start('lang_tbl');
40         start_form();
41         //
42         // select/display system locales support for sites using native gettext
43         //
44         if (function_exists('gettext'))
45         {
46                 if (check_value('DisplayAll'))
47                          array_insert($th, 7, _("Supported"));
48                 start_table();
49                 check_row(_('Display also languages not supported by server locales'), 'DisplayAll', null, true);
50                 end_table();
51         }
52
53         start_table(TABLESTYLE);
54         table_header($th);
55
56         $k = 0;
57
58         // get list of all (available and installed) langauges
59         $langs = get_languages_list();
60         foreach ($langs as $pkg_name => $lng)
61         {
62                 if ($lng == 'C') // skip default locale (aka no translation)
63                         continue;
64
65                 $lang = $lng['code'];
66                 $lang_name = $lng['name'];
67                 $charset = $lng['encoding'];
68                 $rtl = @$lng['rtl'] == 'yes' || @$lng['rtl'] === true;
69                 $available = @$lng['available'];
70                 $installed = @$lng['version'];
71                 $id = @$lng['local_id'];
72                 
73                 if ($lang == $currlang)
74                         start_row("class='stockmankobg'");
75                 else
76                         alt_table_row_color($k);
77
78                 $support = $GetText->check_support($lang, $charset);
79
80                 if (function_exists('gettext') && !$support && !get_post('DisplayAll') && $lang != 'C') continue;
81
82                 label_cell($lang);
83                 label_cell($available ? get_package_view_str($lang, $lang_name) : $lang_name);
84                 label_cell($charset);
85                 label_cell($rtl ? _("Yes") : _("No"));
86                 
87                 label_cell($id === null ? _("None") :
88                         ($available && $installed ? $installed : _("Unknown")));
89
90                 label_cell($available ? $available : _("None"));
91
92                 label_cell($id === null ? '' :
93                         radio(null, 'CurDflt', $id, $dflt_lang == $lang, true),
94                         "align='center'");
95                 
96                 if (function_exists('gettext') && check_value('DisplayAll'))
97                         label_cell($support ? _("Yes") :_("No"));
98
99                 if (!$available && ($lang != 'C'))      // manually installed language
100                         button_cell('Edit'.$id, _("Edit"), _('Edit non standard language configuration'), 
101                                 ICON_EDIT);
102                 elseif (check_pkg_upgrade($installed, $available)) // outdated or not installed language in repo
103                         button_cell('Update'.$pkg_name, $installed ? _("Update") : _("Install"),
104                                 _('Upload and install latest language package'), ICON_DOWN);
105                 else
106                         label_cell('');
107
108                 if (($id !== null) && ($lang != $currlang) && ($lang != 'C')) {
109                         delete_button_cell('Delete'.$id, _('Delete'));
110                         submit_js_confirm('Delete'.$id, 
111                                 sprintf(_("You are about to remove language \'%s\'.\nDo you want to continue ?"), 
112                                         $lang_name));
113                 } else
114                         label_cell('');
115                 end_row();
116         }
117         end_table();
118         display_note(_("The marked language is the current language which cannot be deleted."), 0, 0, "class='currentfg'");
119         br();
120         submit_center_first('Refresh', _("Update default"), '', null);
121
122         submit_center_last('Add', _("Add new language manually"), '', false);
123
124         end_form();
125         div_end();
126 }
127 //---------------------------------------------------------------------------------------------
128 // Non standard (manually entered) languages support.
129 //
130 function check_data()
131 {
132         global $installed_languages;
133
134         if (get_post('code') == '' || get_post('name') == '' || get_post('encoding') == '') {
135                 display_error(_("Language name, code nor encoding cannot be empty"));
136                 return false;
137         }
138         $id = array_search_value($_POST['code'], $installed_languages, 'code');
139         if ($id !== null && $installed_languages[$id]['package'] != null) {
140                 display_error(_('Standard package for this language is already installed. If you want to install this language manually, uninstall standard language package first.'));
141                 return false;
142         }
143         return true;
144 }
145
146 function handle_submit($id)
147 {
148         global $path_to_root, $installed_languages, $dflt_lang, $Mode;
149
150         if ($_POST['dflt']) {
151                         $dflt_lang = $_POST['code'];
152         }
153         
154         $installed_languages[$id]['code'] = clean_file_name($_POST['code']);
155         $installed_languages[$id]['name'] = $_POST['name'];
156         $installed_languages[$id]['path'] = 'lang/' . clean_file_name(get_post('code'));
157         $installed_languages[$id]['encoding'] = $_POST['encoding'];
158         $installed_languages[$id]['rtl'] = (bool)$_POST['rtl'];
159         $installed_languages[$id]['package'] = '';
160         $installed_languages[$id]['version'] = '';
161         if (!write_lang())
162                 return false;
163         $directory = $path_to_root . "/lang/" . clean_file_name(get_post('code'));
164         if (!file_exists($directory))
165         {
166                 mkdir($directory);
167                 mkdir($directory . "/LC_MESSAGES");
168         }
169         if (is_uploaded_file($_FILES['uploadfile']['tmp_name']))
170         {
171                 $file1 = $_FILES['uploadfile']['tmp_name'];
172                 $code = preg_replace('/[^a-zA-Z_]/', '', $_POST['code']);
173                 $file2 = $directory . "/LC_MESSAGES/$code.po";
174                 if (file_exists($file2))
175                         unlink($file2);
176                 move_uploaded_file($file1, $file2);
177         }
178         if (is_uploaded_file($_FILES['uploadfile2']['tmp_name']))
179         {
180                 $file1 = $_FILES['uploadfile2']['tmp_name'];
181                 $code = preg_replace('/[^a-zA-Z_]/', '', $_POST['code']);
182                 $file2 = $directory . "/LC_MESSAGES/$code.mo";
183                 if (file_exists($file2))
184                         unlink($file2);
185                 move_uploaded_file($file1, $file2);
186         }
187         return true;
188 }
189
190 //---------------------------------------------------------------------------------------------
191
192 function display_language_edit($selected_id)
193 {
194         global $installed_languages, $dflt_lang;
195
196         if ($selected_id == -1)
197                 $n = count($installed_languages);
198         else
199                 $n = $selected_id;
200         
201         start_form(true);
202
203         start_table(TABLESTYLE2);
204
205         if ($selected_id != -1)
206         {
207                 $lang = $installed_languages[$n];
208                 $_POST['code'] = $lang['code'];
209                 $_POST['name']  = $lang['name'];
210                 $_POST['encoding']  = $lang['encoding'];
211                 if (isset($lang['rtl']) && $lang['rtl'] === true)
212                         $_POST['rtl']  = $lang['rtl'];
213                 else
214                         $_POST['rtl'] = false;
215                 $_POST['dflt'] = $dflt_lang == $lang['code'];
216                 hidden('selected_id', $selected_id);
217         }
218         text_row_ex(_("Language Code"), 'code', 20);
219         text_row_ex(_("Language Name"), 'name', 20);
220         text_row_ex(_("Encoding"), 'encoding', 20);
221
222         yesno_list_row(_("Right To Left"), 'rtl', null, "", "", false);
223         yesno_list_row(_("Default Language"), 'dflt', null, "", "", false);
224
225         file_row(_("Language File") . " (PO)", 'uploadfile');
226         file_row(_("Language File") . " (MO)", 'uploadfile2');
227
228         end_table(0);
229         display_note(_("Select your language files from your local harddisk."), 0, 1);
230
231         submit_add_or_update_center(false, '', 'both');
232
233         end_form();
234 }
235
236 function handle_delete($id)
237 {
238         global  $path_to_root, $installed_languages, $dflt_lang;
239
240         $lang = $installed_languages[$id]['code'];
241         if ($installed_languages[$id]['package'])
242                 if (!uninstall_package($installed_languages[$id]['package']))
243                         return;
244                         
245         if ($lang == $dflt_lang ) { 
246                 // on delete set default to current.
247                 $dflt_lang = $_SESSION['language']->code;
248         }
249         
250         unset($installed_languages[$id]);
251         $installed_languages = array_values($installed_languages);
252
253         if (!write_lang())
254                 return;
255
256         $dirname = "$path_to_root/lang/$lang";
257         if ($lang && is_dir($dirname)) {        // remove nonstadard language dir
258                 flush_dir($dirname, true);
259                 rmdir($dirname);
260         }
261 }
262
263 //---------------------------------------------------------------------------------------------
264
265 if ($Mode == 'Delete')
266         handle_delete($selected_id);
267
268 if ($Mode == 'ADD_ITEM' || $Mode == 'UPDATE_ITEM')
269         if (check_data() && handle_submit($selected_id))
270                 $Mode = 'RESET';
271
272 if ($id = find_submit('Update', false))
273         install_language($id);
274
275 if (get_post('_CurDflt_update') || (get_post('Refresh') && get_post('CurDflt', -1) != -1)) {
276         $new_lang = $installed_languages[get_post('CurDflt', 0)]['code'];
277         if ($new_lang != $dflt_lang) {
278                 $dflt_lang = $new_lang;
279                 write_lang();
280                 $Ajax->activate('lang_tbl');
281         }
282 }
283 if (get_post('_DisplayAll_update')) {
284         $Ajax->activate('lang_tbl');
285 }
286         
287 //---------------------------------------------------------------------------------------------
288
289 if (isset($_GET['popup']) || get_post('Add') || $Mode == 'Edit' || $Mode == 'ADD_ITEM' || $Mode == 'UPDATE_ITEM') {
290         display_language_edit($selected_id);
291 } else
292         display_languages();
293
294 //---------------------------------------------------------------------------------------------
295 end_page();
296