53 $result = install_language($lang_code, $lang_data['name_eng'], $lang_data['name']); |
67 $result = install_language($lang_code, $lang_data['name_eng'], $lang_data['name']); |
54 if ( $result ) |
68 if ( $result ) |
55 { |
69 { |
56 // Language installed. Import the language files. |
70 // Language installed. Import the language files. |
57 $lang_local = new Language($lang_code); |
71 $lang_local = new Language($lang_code); |
58 foreach ( array('core', 'admin', 'tools', 'user') as $file ) |
72 if ( file_exists(ENANO_ROOT . "/language/{$lang_data['dir']}/backup.json") ) |
59 { |
73 { |
60 $lang_local->import(ENANO_ROOT . "/language/{$lang_data['dir']}/$file.json"); |
74 $lang_local->import(ENANO_ROOT . "/language/{$lang_data['dir']}/backup.json"); |
|
75 } |
|
76 else |
|
77 { |
|
78 foreach ( array('core', 'admin', 'tools', 'user') as $file ) |
|
79 { |
|
80 $lang_local->import(ENANO_ROOT . "/language/{$lang_data['dir']}/$file.json"); |
|
81 } |
61 } |
82 } |
62 unset($lang_local); |
83 unset($lang_local); |
63 |
84 |
64 echo '<div class="info-box">' . $lang->get('acplm_msg_lang_install_success', array('lang_name' => htmlspecialchars($lang_data['name_eng']))) . '</div>'; |
85 echo '<div class="info-box">' . $lang->get('acplm_msg_lang_install_success', array('lang_name' => htmlspecialchars($lang_data['name_eng']))) . '</div>'; |
65 } |
86 } |
66 } |
87 } |
67 break; |
88 break; |
|
89 case 'modify_language': |
|
90 $lang_id =& $parms['lang_id']; |
|
91 if ( !is_int($lang_id) ) |
|
92 { |
|
93 echo 'Hacking attempt'; |
|
94 break; |
|
95 } |
|
96 |
|
97 if ( isset($parms['finish']) && !empty($_POST['lang_name_native']) && !empty($_POST['lang_name_english']) ) |
|
98 { |
|
99 // We just did validation above, it's safe to save. |
|
100 $name_native = $db->escape($_POST['lang_name_native']); |
|
101 $name_english = $db->escape($_POST['lang_name_english']); |
|
102 |
|
103 $q = $db->sql_query('UPDATE ' . table_prefix . "language SET lang_name_native = '$name_native', lang_name_default = '$name_english' WHERE lang_id = $lang_id;"); |
|
104 if ( !$q ) |
|
105 $db->_die(); |
|
106 |
|
107 echo '<div class="info-box">' . $lang->get('acplm_msg_basic_save_success') . '</div>'; |
|
108 } |
|
109 |
|
110 // Select language data |
|
111 $q = $db->sql_query('SELECT lang_name_native, lang_name_default, lang_code FROM ' . table_prefix . "language WHERE lang_id = $lang_id;"); |
|
112 if ( !$q ) |
|
113 $db->_die(); |
|
114 |
|
115 list($name_native, $name_english, $lang_code) = $db->fetchrow_num(); |
|
116 |
|
117 // Output properties table |
|
118 echo '<h3>' . $lang->get('acplm_heading_modify') . '</h3>'; |
|
119 |
|
120 acp_start_form(); |
|
121 |
|
122 ?> |
|
123 <div class="tblholder"> |
|
124 <table border="0" cellspacing="1" cellpadding="4"> |
|
125 <tr> |
|
126 <th colspan="2"> |
|
127 <?php |
|
128 echo $lang->get('acplm_th_lang_basic'); |
|
129 ?> |
|
130 </th> |
|
131 </tr> |
|
132 <tr> |
|
133 <td class="row2" style="width: 50%;"> |
|
134 <?php |
|
135 echo str_replace('"', '', $lang->get('acplm_field_lang_name_native')); |
|
136 ?> |
|
137 </td> |
|
138 <td class="row1"> |
|
139 <input type="text" name="lang_name_native" value="<?php echo htmlspecialchars($name_native); ?>" /> |
|
140 </td> |
|
141 </tr> |
|
142 <tr> |
|
143 <td class="row2"> |
|
144 <?php |
|
145 echo $lang->get('acplm_field_lang_name_english'); |
|
146 ?> |
|
147 </td> |
|
148 <td class="row1"> |
|
149 <input type="text" name="lang_name_english" value="<?php echo htmlspecialchars($name_english); ?>" /> |
|
150 </td> |
|
151 </tr> |
|
152 <tr> |
|
153 <td class="row2"> |
|
154 <?php |
|
155 echo $lang->get('acplm_field_lang_code') . '<br />' |
|
156 . '<small>' . $lang->get('acplm_field_lang_code_hint') . '</small>'; |
|
157 ?> |
|
158 </td> |
|
159 <td class="row1"> |
|
160 <?php |
|
161 echo $lang_code; |
|
162 ?> |
|
163 </td> |
|
164 </tr> |
|
165 <tr> |
|
166 <th class="subhead" colspan="2"> |
|
167 <button name="action" value="modify_language;finish=1;lang_id=<?php echo $lang_id; ?>"><?php echo $lang->get('etc_save_changes'); ?></button> |
|
168 </th> |
|
169 </tr> |
|
170 </table> |
|
171 </div> |
|
172 </form> |
|
173 |
|
174 <?php |
|
175 acp_start_form(); |
|
176 ?> |
|
177 |
|
178 <h3><?php echo $lang->get('acplm_heading_edit_strings_portal'); ?></h3> |
|
179 <p><?php echo $lang->get('acplm_msg_edit_strings_portal_intro'); ?></p> |
|
180 |
|
181 <p> |
|
182 |
|
183 <?php |
|
184 |
|
185 // Grab a Language object |
|
186 if ( $lang->lang_id == $lang_id ) |
|
187 { |
|
188 $lang_local =& $lang; |
|
189 } |
|
190 else |
|
191 { |
|
192 $lang_local = new Language($lang_id); |
|
193 $lang_local->fetch(); |
|
194 } |
|
195 |
|
196 $categories_loc = array(); |
|
197 |
|
198 // Using the & here ensures that a reference is created, thus avoiding wasting memory |
|
199 foreach ( $lang_local->strings as $cat => &$_ ) |
|
200 { |
|
201 unset($_); |
|
202 $categories_loc[$cat] = htmlspecialchars($lang->get("meta_$cat")); |
|
203 } |
|
204 |
|
205 asort($categories_loc); |
|
206 |
|
207 echo '<select name="cat_id">'; |
|
208 foreach ( $categories_loc as $cat_id => $cat_name) |
|
209 { |
|
210 echo "<option value=\"$cat_id\">$cat_name</option>"; |
|
211 } |
|
212 echo '</select>'; |
|
213 |
|
214 ?> |
|
215 <button name="action" value="edit_strings;lang_id=<?php echo $lang_id; ?>"> |
|
216 <?php echo $lang->get('acplm_btn_edit_strings_portal'); ?> |
|
217 </button> |
|
218 </p> |
|
219 |
|
220 <h3><?php echo $lang->get('acplm_heading_reimport_portal'); ?></h3> |
|
221 <p><?php echo $lang->get('acplm_msg_reimport_portal_intro'); ?></p> |
|
222 |
|
223 <p> |
|
224 <button name="action" value="reimport;iso639=<?php echo $lang_code; ?>;lang_id=<?php echo $lang_id; ?>"> |
|
225 <?php echo $lang->get('acplm_btn_reimport'); ?> |
|
226 </button> |
|
227 </p> |
|
228 |
|
229 </form> |
|
230 |
|
231 <?php |
|
232 |
|
233 echo '<h3>' . $lang->get('acplm_heading_backup') . '</h3>'; |
|
234 echo '<p>' . $lang->get('acplm_backup_intro') . '</p>'; |
|
235 |
|
236 echo '<form action="' . makeUrlNS('Admin', 'LangManager') . '" method="post">'; |
|
237 echo '<button name="action" value="backup_language;lang_id=' . $lang_id . '">' . $lang->get('acplm_btn_create_backup') . '</button>'; |
|
238 echo '</form>'; |
|
239 |
|
240 return true; |
|
241 case 'edit_strings': |
|
242 |
|
243 $cat_id = @$_POST['cat_id']; |
|
244 if ( !preg_match('/^[a-z0-9]+$/', $cat_id) || !is_int(@$parms['lang_id']) ) |
|
245 break; |
|
246 |
|
247 $lang_id =& $parms['lang_id']; |
|
248 |
|
249 if ( isset($parms['save']) ) |
|
250 { |
|
251 // Grab a Language object |
|
252 if ( $lang->lang_id == $lang_id ) |
|
253 { |
|
254 $lang_local =& $lang; |
|
255 } |
|
256 else |
|
257 { |
|
258 $lang_local = new Language($lang_id); |
|
259 } |
|
260 // Main save loop |
|
261 // Trying to minimize queries as much as possible here, but you know how that goes. |
|
262 $count_upd = 0; |
|
263 foreach ( $_POST['string'] as $string_id => $user_content ) |
|
264 { |
|
265 $curr_content = $lang_local->get_uncensored("{$cat_id}_{$string_id}"); |
|
266 if ( $curr_content != $user_content ) |
|
267 { |
|
268 $count_upd++; |
|
269 $user_content = $db->escape($user_content); |
|
270 $string_id = $db->escape($string_id); |
|
271 $q = $db->sql_query('UPDATE ' . table_prefix . "language_strings SET string_content = '$user_content' WHERE lang_id = $lang_id AND string_category = '$cat_id' AND string_name = '$string_id';"); |
|
272 if ( !$q ) |
|
273 $db->_die(); |
|
274 } |
|
275 } |
|
276 if ( $count_upd > 0 ) |
|
277 { |
|
278 // Update the cache |
|
279 $lang_local->regen_caches(); |
|
280 |
|
281 // Update modification time |
|
282 $q = $db->sql_query('UPDATE ' . table_prefix . "language SET last_changed = " . time() . " WHERE lang_id = $lang_id;"); |
|
283 if ( !$q ) |
|
284 $db->_die(); |
|
285 } |
|
286 |
|
287 echo '<div class="info-box">' . $lang->get('acplm_msg_string_save_success') . '</div>'; |
|
288 } |
|
289 |
|
290 acp_start_form(); |
|
291 |
|
292 $cat_name = $lang->get("meta_$cat_id"); |
|
293 echo '<h3>' . $lang->get('acplm_editor_heading', array('cat_name' => $cat_name)) . '</h3>'; |
|
294 |
|
295 // Fetch all strings |
|
296 // This is more efficient than iterating through $lang->strings, I think. |
|
297 $q = $db->sql_query('SELECT string_id, string_name, string_content FROM ' . table_prefix . "language_strings WHERE string_category = '$cat_id' AND lang_id = $lang_id;"); |
|
298 if ( !$q ) |
|
299 $db->_die(); |
|
300 |
|
301 ?> |
|
302 <div class="tblholder"> |
|
303 <table border="0" cellspacing="1" cellpadding="4"> |
|
304 <tr> |
|
305 <th style="width: 3%;"><?php echo $lang->get('acplm_editor_col_string_name'); ?></th> |
|
306 <th><?php echo $lang->get('acplm_editor_col_string_content'); ?></th> |
|
307 </tr> |
|
308 <?php |
|
309 |
|
310 while ( $row = $db->fetchrow_num() ) |
|
311 { |
|
312 list($string_id, $string_name, $string_content) = $row; |
|
313 unset($row); |
|
314 |
|
315 echo '<tr>'; |
|
316 |
|
317 if ( strpos($string_content, "\n") ) |
|
318 { |
|
319 $editor = '<textarea rows="' . get_line_count($string_content) . '" cols="50" style="width: 99%;" '; |
|
320 $editor .= 'name="string[' . htmlspecialchars($string_name) . ']" '; |
|
321 $editor .= '>' . htmlspecialchars($string_content); |
|
322 $editor .= '</textarea>'; |
|
323 } |
|
324 else |
|
325 { |
|
326 $editor = '<input type="text" size="50" style="width: 99%;" '; |
|
327 $editor .= 'name="string[' . htmlspecialchars($string_name) . ']" '; |
|
328 $editor .= 'value="' . htmlspecialchars($string_content) . '" '; |
|
329 $editor .= '/>'; |
|
330 } |
|
331 |
|
332 echo '<td class="row2">' . htmlspecialchars($string_name) . '</td>'; |
|
333 echo '<td class="row1">' . $editor . '</td>'; |
|
334 |
|
335 |
|
336 echo '</tr>'; |
|
337 echo "\n"; |
|
338 } |
|
339 |
|
340 echo '<tr> |
|
341 <th class="subhead" colspan="2">'; |
|
342 |
|
343 echo '<input type="hidden" name="cat_id" value="' . $cat_id . '" />'; |
|
344 |
|
345 // Button: save |
|
346 echo '<button name="action" value="edit_strings;lang_id=' . $lang_id . ';save=1" style="font-weight: bold;">' . $lang->get('etc_save_changes') . '</button> '; |
|
347 // Button: revert |
|
348 echo '<button name="action" value="edit_strings;lang_id=' . $lang_id . '" style="font-weight: normal;">' . $lang->get('acplm_editor_btn_revert') . '</button> '; |
|
349 // Button: cancel |
|
350 echo '<button name="action" value="modify_language;lang_id=' . $lang_id . '" style="font-weight: normal;">' . $lang->get('acplm_editor_btn_cancel') . '</button>'; |
|
351 |
|
352 echo ' </th> |
|
353 </tr>'; |
|
354 |
|
355 ?> |
|
356 </table> |
|
357 </div> |
|
358 <?php |
|
359 echo '</form>'; |
|
360 |
|
361 return true; |
|
362 case 'reimport': |
|
363 if ( !isset($parms['iso639']) || !is_int(@$parms['lang_id']) ) |
|
364 break; |
|
365 |
|
366 $lang_code =& $parms['iso639']; |
|
367 $lang_id =& $parms['lang_id']; |
|
368 |
|
369 $lang_list = list_available_languages(); |
|
370 |
|
371 if ( !isset($lang_list[$lang_code]) ) |
|
372 break; |
|
373 |
|
374 // Grab a Language object |
|
375 if ( $lang->lang_id == $lang_id ) |
|
376 { |
|
377 $lang_local =& $lang; |
|
378 } |
|
379 else |
|
380 { |
|
381 $lang_local = new Language($lang_id); |
|
382 } |
|
383 |
|
384 $lang_data =& $lang_list[$lang_code]; |
|
385 |
|
386 // This is the big re-import loop |
|
387 if ( file_exists(ENANO_ROOT . "/language/{$lang_data['dir']}/backup.json") ) |
|
388 { |
|
389 $lang_local->import(ENANO_ROOT . "/language/{$lang_data['dir']}/backup.json"); |
|
390 } |
|
391 else |
|
392 { |
|
393 foreach ( array('core', 'admin', 'tools', 'user') as $file ) |
|
394 { |
|
395 $lang_local->import(ENANO_ROOT . "/language/{$lang_data['dir']}/$file.json"); |
|
396 } |
|
397 } |
|
398 |
|
399 echo '<div class="info-box">' . $lang->get('acplm_msg_reimport_success') . '</div>'; |
|
400 |
|
401 break; |
|
402 case 'backup_language': |
|
403 if ( !is_int(@$parms['lang_id']) ) |
|
404 break; |
|
405 |
|
406 $lang_id =& $parms['lang_id']; |
|
407 |
|
408 // Grab a Language object |
|
409 if ( $lang->lang_id == $lang_id ) |
|
410 { |
|
411 $lang_local =& $lang; |
|
412 } |
|
413 else |
|
414 { |
|
415 $lang_local = new Language($lang_id); |
|
416 } |
|
417 |
|
418 $filename = 'enano_lang_' . $lang_local->lang_code . '_' . enano_date('ymd') . '.json'; |
|
419 |
|
420 // Free as much memory as possible |
|
421 $db->close(); |
|
422 unset($GLOBALS['session'], $GLOBALS['paths'], $GLOBALS['template'], $GLOBALS['plugins']); |
|
423 |
|
424 // HTTP headers |
|
425 header('Content-type: application/json'); |
|
426 header('Content-disposition: attachment; filename=' . $filename); |
|
427 |
|
428 // Export to JSON |
|
429 $lang_struct = array( |
|
430 'categories' => array_keys($lang_local->strings), |
|
431 'strings' => $lang_local->strings |
|
432 ); |
|
433 |
|
434 $lang_struct = enano_json_encode($lang_struct); |
|
435 |
|
436 header('Content-length: ' . strlen($lang_struct)); |
|
437 echo $lang_struct; |
|
438 |
|
439 exit; |
|
440 |
|
441 case 'uninstall_language': |
|
442 if ( !is_int(@$parms['lang_id']) ) |
|
443 break; |
|
444 |
|
445 $lang_id =& $parms['lang_id']; |
|
446 |
|
447 if ( isset($parms['confirm']) ) |
|
448 { |
|
449 $lang_default = intval(getConfig('default_language')); |
|
450 if ( $lang_default == $lang_id ) |
|
451 { |
|
452 echo '<div class="error-box">' . $lang->get('acplm_err_cant_uninstall_default') . '</div>'; |
|
453 break; |
|
454 } |
|
455 if ( $lang_id == $lang->lang_id ) |
|
456 { |
|
457 // Unload the current language since it's about to be uninstalled |
|
458 unset($lang, $GLOBALS['lang']); |
|
459 $GLOBALS['lang'] = new Language($lang_default); |
|
460 global $lang; |
|
461 } |
|
462 // We're clear |
|
463 |
|
464 // Remove cache files |
|
465 $cache_file = ENANO_ROOT . "/cache/lang_{$lang_id}.php"; |
|
466 if ( file_exists($cache_file) ) |
|
467 @unlink($cache_file); |
|
468 |
|
469 // Remove strings |
|
470 $q = $db->sql_query('DELETE FROM ' . table_prefix . "language_strings WHERE lang_id = $lang_id;"); |
|
471 if ( !$q ) |
|
472 $db->_die(); |
|
473 |
|
474 // Delete the language |
|
475 $q = $db->sql_query('DELETE FROM ' . table_prefix . "language WHERE lang_id = $lang_id;"); |
|
476 if ( !$q ) |
|
477 $db->_die(); |
|
478 |
|
479 echo '<div class="info-box">' . $lang->get('acplm_msg_uninstall_success') . '</div>'; |
|
480 break; |
|
481 } |
|
482 |
|
483 acp_start_form(); |
|
484 |
|
485 echo '<h3>' . $lang->get('acplm_uninstall_confirm_title') . '</h3>'; |
|
486 echo '<p>' . $lang->get('acplm_uninstall_confirm_body') . '</p>'; |
|
487 |
|
488 echo '<p><button name="action" style="font-weight: bold;" value="uninstall_language;lang_id=' . $lang_id . ';confirm=1">' . $lang->get('acplm_btn_uninstall_confirm') . '</button> '; |
|
489 echo '<button name="action" value="home">' . $lang->get('acplm_btn_uninstall_cancel') . '</button></p>'; |
|
490 |
|
491 echo '</form>'; |
|
492 return true; |
68 } |
493 } |
69 } |
494 } |
|
495 |
|
496 acp_start_form(); |
|
497 |
|
498 // Select current languages |
|
499 $q = $db->sql_query('SELECT lang_code, lang_name_native, lang_name_default, lang_id FROM ' . table_prefix . "language ORDER BY lang_id ASC;"); |
|
500 if ( !$q ) |
|
501 $db->_die(); |
|
502 |
|
503 // Language properties/edit/delete portal table |
|
504 echo '<h3>' . $lang->get('acplm_heading_editor_portal') . '</h3>'; |
|
505 |
|
506 echo '<div class="tblholder">'; |
|
507 echo '<table border="0" cellspacing="1" cellpadding="4">'; |
|
508 echo '<tr> |
|
509 <th>' . $lang->get('acplm_col_lang_id') . '</th> |
|
510 <th>' . $lang->get('acplm_col_lang_code') . '</th> |
|
511 <th>' . $lang->get('acplm_col_lang_name') . '</th> |
|
512 <th>' . $lang->get('acplm_col_lang_name_eng') . '</th> |
|
513 <th></th> |
|
514 </tr>'; |
|
515 |
|
516 $cls = 'row2'; |
|
517 |
|
518 $btn_edit = $lang->get('acplm_portal_btn_edit'); |
|
519 $btn_unin = $lang->get('acplm_portal_btn_unin'); |
|
520 |
|
521 while ( $row = $db->fetchrow($q) ) |
|
522 { |
|
523 $cls = ( $cls == 'row1' ) ? 'row2' : 'row1'; |
|
524 |
|
525 echo '<tr>'; |
|
526 |
|
527 $lang_code = htmlspecialchars($row['lang_code']); |
|
528 $lang_name_native = htmlspecialchars($row['lang_name_native']); |
|
529 $lang_name_english = htmlspecialchars($row['lang_name_default']); |
|
530 |
|
531 echo "<td class=\"$cls\" style=\"text-align: center;\">{$row['lang_id']}</td>"; |
|
532 echo "<td class=\"$cls\" style=\"text-align: center;\">{$lang_code}</td>"; |
|
533 echo "<td class=\"$cls\" style=\"text-align: center;\">{$lang_name_native}</td>"; |
|
534 echo "<td class=\"$cls\" style=\"text-align: center;\">{$lang_name_english}</td>"; |
|
535 echo "<td class=\"$cls\" style=\"text-align: center;\"><button name=\"action\" value=\"modify_language;lang_id={$row['lang_id']}\">$btn_edit</button> <button name=\"action\" value=\"uninstall_language;lang_id={$row['lang_id']}\">$btn_unin</button></td>"; |
|
536 |
|
537 echo '</tr>'; |
|
538 } |
|
539 |
|
540 echo '</table></div>'; |
|
541 |
|
542 // Reset the result pointer to zero so we can fetch that list of languages again |
|
543 $db->sql_data_seek(0, $q); |
70 |
544 |
71 // $lang_list is fetched by the posthandler sometimes |
545 // $lang_list is fetched by the posthandler sometimes |
72 if ( !isset($lang_list) ) |
546 if ( !isset($lang_list) ) |
73 { |
547 { |
74 // Build a list of languages in the languages/ directory, then |
548 // Build a list of languages in the languages/ directory, then |
75 // eliminate the ones that are already installed. |
549 // eliminate the ones that are already installed. |
76 $lang_list = list_available_languages(); |
550 $lang_list = list_available_languages(); |
77 } |
551 } |
78 |
|
79 // Select current languages |
|
80 $q = $db->sql_query('SELECT lang_code FROM ' . table_prefix . "language;"); |
|
81 if ( !$q ) |
|
82 $db->_die(); |
|
83 |
552 |
84 while ( $row = $db->fetchrow() ) |
553 while ( $row = $db->fetchrow() ) |
85 { |
554 { |
86 $lang_code =& $row['lang_code']; |
555 $lang_code =& $row['lang_code']; |
87 if ( isset($lang_list[$lang_code]) ) |
556 if ( isset($lang_list[$lang_code]) ) |