PageRenderTime 49ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/textpattern/include/txp_prefs.php

https://bitbucket.org/dragondz/adminlog
PHP | 955 lines | 721 code | 176 blank | 58 comment | 92 complexity | cfee7df267a4030ebc7e2ceb9fd0da8d MD5 | raw file
Possible License(s): AGPL-1.0
  1. <?php
  2. /*
  3. This is Textpattern
  4. Copyright 2005 by Dean Allen
  5. www.textpattern.com
  6. All rights reserved
  7. Use of this software indicates acceptance of the Textpattern license agreement
  8. $HeadURL: http://textpattern.googlecode.com/svn/development/4.0/textpattern/include/txp_prefs.php $
  9. $LastChangedRevision: 2812 $
  10. */
  11. if (!defined('txpinterface')) die('txpinterface is undefined.');
  12. //-------------------------------------------------------------
  13. include_once txpath.'/lib/txplib_update.php';
  14. if ($event == 'prefs') {
  15. require_privs('prefs');
  16. if(!$step or !in_array($step, array('advanced_prefs','prefs_save','advanced_prefs_save','get_language','list_languages','prefs_list','delete_lang','export_lang'))){
  17. prefs_list();
  18. } else $step();
  19. }
  20. // -------------------------------------------------------------
  21. function prefs_save()
  22. {
  23. $prefnames = safe_column("name", "txp_prefs", "prefs_id = 1");
  24. $post = doSlash(stripPost());
  25. foreach($prefnames as $prefname) {
  26. if (isset($post[$prefname])) {
  27. if ($prefname == 'siteurl')
  28. {
  29. $post[$prefname] = str_replace("http://",'',$post[$prefname]);
  30. $post[$prefname] = rtrim($post[$prefname],"/ ");
  31. }
  32. safe_update(
  33. "txp_prefs",
  34. "val = '".$post[$prefname]."'",
  35. "name = '".doSlash($prefname)."' and prefs_id = 1"
  36. );
  37. }
  38. }
  39. update_lastmod();
  40. prefs_list(gTxt('preferences_saved'));
  41. }
  42. // -------------------------------------------------------------
  43. function prefs_list($message = '')
  44. {
  45. global $textarray;
  46. echo pagetop(gTxt('edit_preferences'), $message);
  47. extract(get_prefs());
  48. $locale = setlocale(LC_ALL, $locale);
  49. $textarray = load_lang($language);
  50. echo n.n.'<form method="post" action="index.php">'.
  51. n.n.startTable('list').
  52. n.n.tr(
  53. tdcs(
  54. hed(gTxt('site_prefs'), 1)
  55. , 3)
  56. ).
  57. n.n.tr(
  58. tdcs(
  59. sLink('prefs', 'prefs_list', gTxt('site_prefs'), 'navlink-active').sp.
  60. sLink('prefs', 'advanced_prefs', gTxt('advanced_preferences'), 'navlink').sp.
  61. sLink('prefs', 'list_languages', gTxt('manage_languages'), 'navlink')
  62. , '3')
  63. );
  64. $evt_list = safe_column('event', 'txp_prefs', "type = 0 and prefs_id = 1 group by event order by event desc");
  65. foreach ($evt_list as $event)
  66. {
  67. $rs = safe_rows_start('*', 'txp_prefs', "type = 0 and prefs_id = 1 and event = '".doSlash($event)."' order by position");
  68. $cur_evt = '';
  69. while ($a = nextRow($rs))
  70. {
  71. if ($a['event'] != $cur_evt)
  72. {
  73. $cur_evt = $a['event'];
  74. if ($cur_evt == 'comments' && !$use_comments)
  75. {
  76. continue;
  77. }
  78. echo n.n.tr(
  79. tdcs(
  80. hed(gTxt($a['event']), 2, ' class="pref-heading"')
  81. , 3)
  82. );
  83. }
  84. if ($cur_evt == 'comments' && !$use_comments)
  85. {
  86. continue;
  87. }
  88. // Skip old settings that don't have an input type
  89. if (!is_callable($a['html']))
  90. {
  91. continue;
  92. }
  93. $label = ($a['html'] != 'yesnoradio') ?
  94. '<label for="'.$a['name'].'">'.gTxt($a['name']).'</label>' :
  95. gTxt($a['name']);
  96. $out = tda($label, ' style="text-align: right; vertical-align: middle;"');
  97. if ($a['html'] == 'text_input')
  98. {
  99. $out.= td(
  100. pref_func('text_input', $a['name'], $a['val'], 20)
  101. );
  102. }
  103. else
  104. {
  105. $out.= td(pref_func($a['html'], $a['name'], $a['val']));
  106. }
  107. $out.= tda(popHelp($a['name']), ' style="vertical-align: middle;"');
  108. echo tr($out);
  109. }
  110. }
  111. echo n.n.tr(
  112. tda(
  113. fInput('submit', 'Submit', gTxt('save_button'), 'publish').
  114. n.sInput('prefs_save').
  115. n.eInput('prefs').
  116. n.hInput('prefs_id', '1')
  117. , ' colspan="3" class="noline"')
  118. ).
  119. n.n.endTable().
  120. n.n.'</form>';
  121. $check_updates = gps('check_updates');
  122. if ($check_updates)
  123. {
  124. $updates = checkUpdates();
  125. if (is_array($updates))
  126. {
  127. $out = join(br, $updates);
  128. }
  129. else{
  130. $out = $updates;
  131. }
  132. echo n.n.startTable('edit').
  133. n.n.tr(
  134. tda($out)
  135. ).
  136. n.n.endTable();
  137. }
  138. else
  139. {
  140. echo form(
  141. graf(
  142. '<strong>'.gTxt('check_for_txp_updates').'</strong>'.sp.
  143. n.'<input type="submit" name="check_updates" value="'.gTxt('go').'" class="publish" />'.
  144. n.eInput('prefs').
  145. n.sInput('prefs_list')
  146. )
  147. , 'text-align: center;');
  148. }
  149. }
  150. //-------------------------------------------------------------
  151. function pref_func($func, $name, $val, $size = '')
  152. {
  153. $func = (is_callable('pref_'.$func) ? 'pref_'.$func : $func);
  154. return call_user_func($func, $name, $val, $size);
  155. }
  156. //-------------------------------------------------------------
  157. function text_input($name, $val, $size = '')
  158. {
  159. return fInput('text', $name, $val, 'edit', '', '', $size, '', $name);
  160. }
  161. // -------------------------------------------------------------
  162. function hash_picker($name,$val)
  163. {
  164. $valkeys = hash_algos();
  165. $vals = array_combine($valkeys , $valkeys);
  166. return selectInput($name, $vals, $val, '', '', $name);
  167. }
  168. // -------------------------------------------------------------
  169. function get_admin_styles()
  170. {
  171. global $txpcfg, $adminstyle;
  172. $css_dir = txpath.DS.'styles'.DS.'cp'.DS;
  173. if (!is_dir($css_dir))
  174. {
  175. trigger_error('Styles directory is not a directory: '.$css_dir, E_USER_WARNING);
  176. }
  177. if (chdir($css_dir)) {
  178. if (function_exists('glob')){
  179. $css_file_array = glob("*.css");
  180. }else {
  181. $dh = opendir($css_dir);
  182. $css_file_array = array();
  183. while (false !== ($filename = readdir($dh))) {
  184. if (strstr($filename, '.css'))
  185. if(is_file($filename)) {
  186. $css_file_array[] = $filename;
  187. }
  188. }
  189. closedir($dh);
  190. }
  191. $styles = array();
  192. if ($css_file_array) {
  193. foreach ($css_file_array as $css_name) {
  194. if (is_file($css_name)) {
  195. $styles[] = $css_name;
  196. }
  197. }
  198. }
  199. }
  200. $stylearray = array_combine($styles, $styles);
  201. return selectInput('adminstyle', $stylearray, $adminstyle,'','onchange="styleSwitcher(this.value)"');
  202. }
  203. //-------------------------------------------------------------
  204. function gmtoffset_select($name, $val)
  205. {
  206. // Standard time zones as compiled by H.M. Nautical Almanac Office, June 2004
  207. // http://aa.usno.navy.mil/faq/docs/world_tzones.html
  208. $tz = array(
  209. -12, -11, -10, -9.5, -9, -8.5, -8, -7, -6, -5, -4, -3.5, -3, -2, -1,
  210. 0,
  211. +1, +2, +3, +3.5, +4, +4.5, +5, +5.5, +6, +6.5, +7, +8, +9, +9.5, +10, +10.5, +11, +11.5, +12, +13, +14,
  212. );
  213. $vals = array();
  214. foreach ($tz as $z)
  215. {
  216. $sign = ($z >= 0 ? '+' : '');
  217. $label = sprintf("GMT %s%02d:%02d", $sign, $z, abs($z - (int)$z) * 60);
  218. $vals[sprintf("%s%d", $sign, $z * 3600)] = $label;
  219. }
  220. return selectInput($name, $vals, $val, '', '', $name);
  221. }
  222. //-------------------------------------------------------------
  223. function logging($name, $val)
  224. {
  225. $vals = array(
  226. 'all' => gTxt('all_hits'),
  227. 'refer' => gTxt('referrers_only'),
  228. 'none' => gTxt('none')
  229. );
  230. return selectInput($name, $vals, $val, '', '', $name);
  231. }
  232. //-------------------------------------------------------------
  233. function permlinkmodes($name, $val)
  234. {
  235. $vals = array(
  236. 'messy' => gTxt('messy'),
  237. 'id_title' => gTxt('id_title'),
  238. 'section_id_title' => gTxt('section_id_title'),
  239. 'year_month_day_title' => gTxt('year_month_day_title'),
  240. 'section_title' => gTxt('section_title'),
  241. 'title_only' => gTxt('title_only'),
  242. // 'category_subcategory' => gTxt('category_subcategory')
  243. );
  244. return selectInput($name, $vals, $val, '', '', $name);
  245. }
  246. //-------------------------------------------------------------
  247. function urlmodes($name, $val)
  248. {
  249. $vals = array(
  250. '0' => gTxt('messy'),
  251. '1' => gTxt('clean')
  252. );
  253. return selectInput($name, $vals, $val, '', '', $name);
  254. }
  255. //-------------------------------------------------------------
  256. function commentmode($name, $val)
  257. {
  258. $vals = array(
  259. '0' => gTxt('nopopup'),
  260. '1' => gTxt('popup')
  261. );
  262. return selectInput($name, $vals, $val, '', '', $name);
  263. }
  264. //-------------------------------------------------------------
  265. function weeks($name, $val)
  266. {
  267. $weeks = gTxt('weeks');
  268. $vals = array(
  269. '0' => gTxt('never'),
  270. 7 => '1 '.gTxt('week'),
  271. 14 => '2 '.$weeks,
  272. 21 => '3 '.$weeks,
  273. 28 => '4 '.$weeks,
  274. 35 => '5 '.$weeks,
  275. 42 => '6 '.$weeks
  276. );
  277. return selectInput($name, $vals, $val, '', '', $name);
  278. }
  279. //-------------------------------------------------------------
  280. function languages($name, $val)
  281. {
  282. $installed_langs = safe_column('lang', 'txp_lang', "1 = 1 group by lang");
  283. $vals = array();
  284. foreach ($installed_langs as $lang)
  285. {
  286. $vals[$lang] = safe_field('data', 'txp_lang', "name = '".doSlash($lang)."' AND lang = '".doSlash($lang)."'");
  287. if (trim($vals[$lang]) == '')
  288. {
  289. $vals[$lang] = $lang;
  290. }
  291. }
  292. asort($vals);
  293. reset($vals);
  294. $out = n.'<select id="'.$name.'" name="'.$name.'" class="list">';
  295. foreach ($vals as $avalue => $alabel)
  296. {
  297. $selected = ($avalue == $val || $alabel == $val) ?
  298. ' selected="selected"' :
  299. '';
  300. $out .= n.t.'<option value="'.htmlspecialchars($avalue).'"'.$selected.'>'.htmlspecialchars($alabel).'</option>'.n;
  301. }
  302. $out .= n.'</select>';
  303. return $out;
  304. }
  305. // -------------------------------------------------------------
  306. function dateformats($name, $val)
  307. {
  308. $dayname = '%A';
  309. $dayshort = '%a';
  310. $daynum = is_numeric(strftime('%e')) ? '%e' : '%d';
  311. $daynumlead = '%d';
  312. $daynumord = is_numeric(substr(trim(strftime('%Oe')), 0, 1)) ? '%Oe' : $daynum;
  313. $monthname = '%B';
  314. $monthshort = '%b';
  315. $monthnum = '%m';
  316. $year = '%Y';
  317. $yearshort = '%y';
  318. $time24 = '%H:%M';
  319. $time12 = strftime('%p') ? '%I:%M %p' : $time24;
  320. $date = strftime('%x') ? '%x' : '%Y-%m-%d';
  321. $formats = array(
  322. "$monthshort $daynumord, $time12",
  323. "$daynum.$monthnum.$yearshort",
  324. "$daynumord $monthname, $time12",
  325. "$yearshort.$monthnum.$daynumlead, $time12",
  326. "$dayshort $monthshort $daynumord, $time12",
  327. "$dayname $monthname $daynumord, $year",
  328. "$monthshort $daynumord",
  329. "$daynumord $monthname $yearshort",
  330. "$daynumord $monthnum $year - $time24",
  331. "$daynumord $monthname $year",
  332. "$daynumord $monthname $year, $time24",
  333. "$daynumord. $monthname $year",
  334. "$daynumord. $monthname $year, $time24",
  335. "$year-$monthnum-$daynumlead",
  336. "$year-$daynumlead-$monthnum",
  337. "$date $time12",
  338. "$date",
  339. "$time24",
  340. "$time12",
  341. "$year-$monthnum-$daynumlead $time24",
  342. );
  343. $ts = time();
  344. $vals = array();
  345. foreach ($formats as $f)
  346. {
  347. if ($d = safe_strftime($f, $ts))
  348. {
  349. $vals[$f] = $d;
  350. }
  351. }
  352. $vals['since'] = gTxt('hours_days_ago');
  353. return selectInput($name, array_unique($vals), $val, '', '', $name);
  354. }
  355. //-------------------------------------------------------------
  356. function prod_levels($name, $val)
  357. {
  358. $vals = array(
  359. 'debug' => gTxt('production_debug'),
  360. 'testing' => gTxt('production_test'),
  361. 'live' => gTxt('production_live'),
  362. );
  363. return selectInput($name, $vals, $val, '', '', $name);
  364. }
  365. //-------------------------------------------------------------
  366. function advanced_prefs($message = '')
  367. {
  368. global $textarray;
  369. // this means new language strings and new help entries
  370. echo pagetop(gTxt('advanced_preferences'), $message).
  371. n.n.'<form method="post" action="index.php">'.
  372. n.n.startTable('list').
  373. n.n.tr(
  374. tdcs(
  375. hed(gTxt('advanced_preferences'), 1)
  376. , 3)
  377. ).
  378. n.n.tr(
  379. tdcs(
  380. sLink('prefs', 'prefs_list', gTxt('site_prefs'), 'navlink').sp.
  381. sLink('prefs', 'advanced_prefs', gTxt('advanced_preferences'), 'navlink-active').sp.
  382. sLink('prefs', 'list_languages', gTxt('manage_languages'), 'navlink')
  383. , '3')
  384. );
  385. $rs = safe_rows_start('*', 'txp_prefs', "type = 1 and prefs_id = 1 order by event, position");
  386. $cur_evt = '';
  387. while ($a = nextRow($rs))
  388. {
  389. if ($a['event']!= $cur_evt)
  390. {
  391. $cur_evt = $a['event'];
  392. echo n.n.tr(
  393. tdcs(
  394. hed(gTxt($a['event']), 2, ' class="pref-heading"')
  395. , 3)
  396. );
  397. }
  398. $label = ($a['html'] != 'yesnoradio') ?
  399. '<label for="'.$a['name'].'">'.gTxt($a['name']).'</label>' :
  400. gTxt($a['name']);
  401. $out = tda($label, ' style="text-align: right; vertical-align: middle;"');
  402. if ($a['html'] == 'text_input')
  403. {
  404. $look_for = array('expire_logs_after', 'expire_adminlogs_after', 'max_url_len', 'time_offset', 'rss_how_many', 'logs_expire');
  405. $size = in_array($a['name'], $look_for) ? 3 : 20;
  406. $out.= td(
  407. pref_func('text_input', $a['name'], $a['val'], $size)
  408. );
  409. }
  410. else
  411. {
  412. if (is_callable($a['html']))
  413. {
  414. $out.= td(
  415. pref_func($a['html'], $a['name'], $a['val'])
  416. );
  417. }
  418. else
  419. {
  420. $out.= td($a['val']);
  421. }
  422. }
  423. $out .= tda(
  424. popHelp($a['name'])
  425. , ' style="vertical-align: middle;"');
  426. echo n.n.tr($out);
  427. }
  428. echo n.n.tr(
  429. tda(
  430. fInput('submit', 'Submit', gTxt('save_button'), 'publish').
  431. sInput('advanced_prefs_save').
  432. eInput('prefs').
  433. hInput('prefs_id', '1')
  434. , ' colspan="3" class="noline"')
  435. ).
  436. n.n.endTable().
  437. n.n.'</form>';
  438. }
  439. //-------------------------------------------------------------
  440. function real_max_upload_size($user_max)
  441. {
  442. // The minimum of the candidates, is the real max. possible size
  443. $candidates = array($user_max,
  444. ini_get('post_max_size'),
  445. ini_get('upload_max_filesize'));
  446. $real_max = null;
  447. foreach ($candidates as $item)
  448. {
  449. $val = trim($item);
  450. $modifier = strtolower( substr($val, -1) );
  451. switch($modifier) {
  452. // The 'G' modifier is available since PHP 5.1.0
  453. case 'g': $val *= 1024;
  454. case 'm': $val *= 1024;
  455. case 'k': $val *= 1024;
  456. }
  457. if ($val > 1) {
  458. if (is_null($real_max))
  459. $real_max = $val;
  460. elseif ($val < $real_max)
  461. $real_max = $val;
  462. }
  463. }
  464. return $real_max;
  465. }
  466. //-------------------------------------------------------------
  467. function advanced_prefs_save()
  468. {
  469. $prefnames = safe_column("name", "txp_prefs", "prefs_id = 1 AND type = 1");
  470. $post = doSlash(stripPost());
  471. if (empty($post['tempdir']))
  472. $post['tempdir'] = doSlash(find_temp_dir());
  473. if (!empty($post['file_max_upload_size']))
  474. $post['file_max_upload_size'] = real_max_upload_size($post['file_max_upload_size']);
  475. foreach($prefnames as $prefname) {
  476. if (isset($post[$prefname])) {
  477. safe_update(
  478. "txp_prefs",
  479. "val = '".$post[$prefname]."'",
  480. "name = '".doSlash($prefname)."' and prefs_id = 1"
  481. );
  482. }
  483. }
  484. update_lastmod();
  485. advanced_prefs(gTxt('preferences_saved'));
  486. }
  487. //-------------------------------------------------------------
  488. function delete_lang()
  489. {
  490. $lang = ps('lang');
  491. $msg = 'Cannot delete the current admin language ('.$lang.').';
  492. if( $lang != LANG )
  493. {
  494. include_once txpath.'/lib/lib_lang.php';
  495. $langs = get_installation_langs();
  496. if( in_array( $lang , $langs ) )
  497. {
  498. $lang = doSlash($lang);
  499. safe_delete( 'txp_lang' , "`lang`='$lang'" );
  500. $msg = 'Deleted all '.gTxt($lang).' '.gTxt('strings');
  501. }
  502. else
  503. {
  504. $msg = gTxt('lang_file_no_del' , array( '{lang}'=>$lang ) );
  505. }
  506. }
  507. list_languages($msg);
  508. }
  509. function export_lang()
  510. {
  511. $msg = gTxt('Export failed.');
  512. $lang = gps('lang');
  513. if( $lang )
  514. {
  515. include_once txpath.'/lib/lib_lang.php';
  516. $langs = get_installation_langs();
  517. if( in_array( $lang , $langs ) )
  518. {
  519. $file = build_langfile( $lang );
  520. $title = $lang.'.txt';
  521. $desc = gTxt('lang_file_desc',array('{lang}'=>$lang) );
  522. serveFile( $file , $title , $desc , 'text/plain; charset=utf-8' );
  523. }
  524. else
  525. {
  526. $msg = gTxt('lang_file_no_exp' , array( '{lang}'=>$lang ) );
  527. }
  528. }
  529. list_languages($msg);
  530. }
  531. //-------------------------------------------------------------
  532. # RPC install/update languages
  533. function list_languages($message='')
  534. {
  535. global $prefs, $locale, $txpcfg, $textarray;
  536. require_once txpath.'/lib/IXRClass.php';
  537. // Select and save active language
  538. $new_lang = ps('language');
  539. if (!$message && ps('step')=='list_languages' && $new_lang )
  540. {
  541. $locale = doSlash(getlocale($new_lang));
  542. safe_update("txp_prefs","val='".doSlash($new_lang)."'", "name='language'");
  543. safe_update("txp_prefs","val='". $locale ."'", "name='locale'");
  544. $textarray = load_lang(doSlash($new_lang));
  545. $locale = setlocale(LC_ALL, $locale);
  546. $message = gTxt('preferences_saved');
  547. }
  548. $active_lang = safe_field('val','txp_prefs',"name='language'");
  549. $lang_form = tda( form(gTxt('active_language').'&nbsp;&nbsp;'.
  550. languages('language',$active_lang).'&nbsp;&nbsp;'.
  551. fInput('submit','Submit',gTxt('save_button'),'').
  552. eInput('prefs').sInput('list_languages')
  553. ,'display:inline;')
  554. ,' style="text-align:center" colspan="3"');
  555. $lang_server = !empty($prefs['lang_server']) ? $prefs['lang_server'] : RPC_SERVER;
  556. $client = new IXR_Client($lang_server);
  557. #$client->debug = true;
  558. $available_lang = array();
  559. $rpc_connect = false;$show_files = false;
  560. # Get items from RPC
  561. @set_time_limit(90);
  562. if (gps('force')!='file' && $client->query('tups.listLanguages',$prefs['blog_uid']))
  563. {
  564. $rpc_connect = true;
  565. $response = $client->getResponse();
  566. foreach ($response as $language)
  567. $available_lang[$language['language']]['rpc_lastmod'] = gmmktime($language['lastmodified']->hour,$language['lastmodified']->minute,$language['lastmodified']->second,$language['lastmodified']->month,$language['lastmodified']->day,$language['lastmodified']->year);
  568. } elseif (gps('force')!='file')
  569. {
  570. $msg = gTxt('rpc_connect_error')."<!--".$client->getErrorCode().' '.$client->getErrorMessage()."-->";
  571. }
  572. # Get items from Filesystem
  573. $files = get_lang_files();
  574. if (gps('force')=='file' || !$rpc_connect)
  575. $show_files = true;
  576. if ( $show_files && is_array($files) && !empty($files) )
  577. {
  578. foreach ($files as $file)
  579. {
  580. if ($fp = @fopen(txpath.DS.'lang'.DS.$file,'r'))
  581. {
  582. $name = str_replace('.txt','',$file);
  583. $firstline = fgets($fp, 4069);
  584. fclose($fp);
  585. if (strpos($firstline,'#@version') !== false)
  586. @list($fversion,$ftime) = explode(';',trim(substr($firstline,strpos($firstline,' ',1))));
  587. else
  588. $fversion = $ftime = NULL;
  589. $available_lang[$name]['file_note'] = (isset($fversion)) ? $fversion : 0;
  590. $available_lang[$name]['file_lastmod'] = (isset($ftime)) ? $ftime : 0;
  591. }
  592. }
  593. }
  594. # Get installed items from the database
  595. # I'm affraid we need a value here for the language itself, not for each one of the rows
  596. $rows = safe_rows('lang, UNIX_TIMESTAMP(MAX(lastmod)) as lastmod','txp_lang',"1 GROUP BY lang ORDER BY lastmod DESC");
  597. foreach ($rows as $language)
  598. {
  599. $available_lang[$language['lang']]['db_lastmod'] = $language['lastmod'];
  600. }
  601. $list = '';
  602. # Show the language table
  603. foreach ($available_lang as $langname => $langdat)
  604. {
  605. $file_updated = ( isset($langdat['db_lastmod']) && @$langdat['file_lastmod'] > $langdat['db_lastmod']);
  606. $rpc_updated = ( @$langdat['rpc_lastmod'] > @$langdat['db_lastmod']);
  607. $rpc_install = tda( strong(eLink('prefs','get_language','lang_code',$langname,(isset($langdat['db_lastmod']))
  608. ? gTxt('update') : gTxt('install'),'updating',isset($langdat['db_lastmod']) )).
  609. br.safe_strftime('%d %b %Y %X',@$langdat['rpc_lastmod'])
  610. ,(isset($langdat['db_lastmod']))
  611. ? ' style="color:red;text-align:center;background-color:#FFFFCC;"'
  612. : ' style="color:#667;vertical-align:middle;text-align:center"');
  613. $list.= tr (
  614. # Lang-Name & Date
  615. tda(gTxt($langname).
  616. ((isset($langdat['db_lastmod']) )
  617. ? br . tag('&nbsp;'.safe_strftime('%d %b %Y %X',$langdat['db_lastmod']), 'span',' style="color:#aaa;font-style:italic"') .
  618. form( fInput('submit', '', gTxt('export'), '').eInput('prefs') . sInput('export_lang') . hInput('lang',$langname), '', '', 'post', 'lang_options') .
  619. ( ($langname != $active_lang) ? form( fInput('submit', '', gTxt('delete'), '').eInput('prefs') . sInput('delete_lang') . hInput('lang',$langname), '',
  620. "verify('" . doSlash(gTxt('lang_remove_warning' , array('{langcode}'=>$langname, '{lang}'=>gTxt($langname) )) ) .' \\n'.
  621. doSlash(gTxt('are_you_sure')) . "')", 'post', 'lang_options' ) : '' )
  622. : '' )
  623. , (isset($langdat['db_lastmod']) && $rpc_updated) #tda attribute
  624. ? ' nowrap="nowrap" style="color:red;background-color:#FFFFCC;"'
  625. : ' nowrap="nowrap" style="vertical-align:middle"' ).n.
  626. # RPC - Info
  627. ( ($rpc_updated)
  628. ? $rpc_install
  629. : tda( (isset($langdat['rpc_lastmod'])) ? gTxt('updated') : '-'
  630. ,' style="vertical-align:middle;text-align:center"')
  631. ).n.
  632. # File - Info
  633. ( ($show_files)
  634. ? tda( tag( ( isset($langdat['file_lastmod']) )
  635. ? eLink('prefs','get_language','lang_code',$langname,($file_updated) ? gTxt('update') : gTxt('install'),'force','file').
  636. br.'&nbsp;'.safe_strftime($prefs['archive_dateformat'],$langdat['file_lastmod'])
  637. : ' &nbsp; ' # No File available
  638. , 'span', ($file_updated) ? ' style="color:#667;"' : ' style="color:#aaa;font-style:italic"' )
  639. , ' class="langfile" style="text-align:center;vertical-align:middle"').n
  640. : '')
  641. ).n.n;
  642. }
  643. // Output Table + Content
  644. pagetop(gTxt('update_languages'),$message);
  645. if (isset($msg) && $msg)
  646. echo tag ($msg,'p',' style="text-align:center;color:red;width:50%;margin: 2em auto"' );
  647. echo startTable('list'),
  648. tr(
  649. tdcs(
  650. hed(gTxt('manage_languages'), 1)
  651. , 3)
  652. ),
  653. tr(
  654. tdcs(
  655. sLink('prefs', 'prefs_list', gTxt('site_prefs'), 'navlink').sp.
  656. sLink('prefs','advanced_prefs',gTxt('advanced_preferences'),'navlink').sp.
  657. sLink('prefs', 'list_languages', gTxt('manage_languages'), 'navlink-active')
  658. , '3')
  659. ),
  660. tr(tda('&nbsp;',' colspan="3" style="font-size:0.25em"')),
  661. tr( $lang_form ),
  662. tr(tda('&nbsp;',' colspan="3" style="font-size:0.25em"')),
  663. tr(tda(gTxt('language')).tda(gTxt('from_server')).( ($show_files) ? tda(gTxt('from_file')) : '' ), ' style="font-weight:bold"');
  664. echo $list;
  665. if (!$show_files)
  666. {
  667. $linktext = gTxt('from_file').' ('.gTxt('experts_only').')';
  668. echo tr(tda('&nbsp;',' colspan="3" style="font-size:0.25em"')).
  669. tr(tda(strong(eLink('prefs','list_languages','force','file',$linktext)),' colspan="3" style="text-align:center"') );
  670. } elseif (gps('force')=='file') {
  671. echo tr(tda('&nbsp;',' colspan="3" style="font-size:0.25em"')).
  672. tr(tda(sLink('prefs','list_languages',strong(gTxt('from_server'))),' colspan="3" style="text-align:center"') );
  673. }
  674. echo endTable();
  675. $install_langfile = gTxt('install_langfile', array(
  676. '{url}' => strong('<a href="'.RPC_SERVER.'/lang/">'.RPC_SERVER.'/lang/</a>')
  677. ));
  678. if ( $install_langfile == 'install_langfile')
  679. $install_langfile = 'To install new languages from file you can download them from <b><a href="'.RPC_SERVER.'/lang/">'.RPC_SERVER.'/lang/</a></b> and place them inside your ./textpattern/lang/ directory.';
  680. echo tag( $install_langfile ,'p',' style="text-align:center;width:50%;margin: 2em auto"' );
  681. }
  682. //-------------------------------------------------------------
  683. function get_language()
  684. {
  685. global $prefs, $txpcfg, $textarray;
  686. require_once txpath.'/lib/IXRClass.php';
  687. $lang_code = gps('lang_code');
  688. $lang_server = !empty($prefs['lang_server']) ? $prefs['lang_server'] : RPC_SERVER;
  689. $client = new IXR_Client($lang_server);
  690. // $client->debug = true;
  691. @set_time_limit(90);
  692. if (gps('force')=='file' || !$client->query('tups.getLanguage',$prefs['blog_uid'],$lang_code))
  693. {
  694. if ( (gps('force')=='file' || gps('updating')!=='1') && install_language_from_file($lang_code) )
  695. {
  696. if (defined('LANG'))
  697. $textarray = load_lang(LANG);
  698. return list_languages(gTxt($lang_code).sp.gTxt('updated'));
  699. }else{
  700. $install_langfile = gTxt('install_langfile', array(
  701. '{url}' => strong('<a href="'.RPC_SERVER.'/lang/">'.RPC_SERVER.'/lang/</a>')
  702. ));
  703. if ( $install_langfile == 'install_langfile')
  704. $install_langfile = 'To install new languages from file you can download them from <b><a href="'.RPC_SERVER.'/lang/">'.RPC_SERVER.'/lang/</a></b> and place them inside your ./textpattern/lang/ directory.';
  705. pagetop(gTxt('installing_language'));
  706. echo tag( gTxt('rpc_connect_error')."<!--".$client->getErrorCode().' '.$client->getErrorMessage()."-->"
  707. ,'p',' style="text-align:center;color:red;width:50%;margin: 2em auto"' );
  708. echo tag( $install_langfile ,'p',' style="text-align:center;width:50%;margin: 2em auto"' );
  709. }
  710. }else {
  711. $response = $client->getResponse();
  712. $lang_struct = unserialize($response);
  713. function install_lang_key(&$value, $key)
  714. {
  715. extract(gpsa(array('lang_code','updating')));
  716. $exists = safe_field('name','txp_lang',"name='".doSlash($value['name'])."' AND lang='".doSlash($lang_code)."'");
  717. $q = "name='".doSlash($value['name'])."', event='".doSlash($value['event'])."', data='".doSlash($value['data'])."', lastmod='".doSlash(strftime('%Y%m%d%H%M%S',$value['uLastmod']))."'";
  718. if ($exists)
  719. {
  720. $value['ok'] = safe_update('txp_lang',$q,"lang='".doSlash($lang_code)."' AND name='".doSlash($value['name'])."'");
  721. }else{
  722. $value['ok'] = safe_insert('txp_lang',$q.", lang='".doSlash($lang_code)."'");
  723. }
  724. }
  725. array_walk($lang_struct,'install_lang_key');
  726. $size = count($lang_struct);
  727. $errors = 0;
  728. for($i=0; $i < $size ; $i++)
  729. {
  730. $errors += ( !$lang_struct[$i]['ok'] );
  731. }
  732. if (defined('LANG'))
  733. $textarray = load_lang(LANG);
  734. $msg = gTxt($lang_code).sp.gTxt('updated');
  735. if ($errors > 0)
  736. $msg .= sprintf(" (%s errors, %s ok)",$errors, ($size-$errors));
  737. return list_languages($msg);
  738. }
  739. }
  740. // ----------------------------------------------------------------------
  741. function get_lang_files()
  742. {
  743. global $txpcfg;
  744. $dirlist = array();
  745. $lang_dir = txpath.DS.'lang'.DS;
  746. if (!is_dir($lang_dir))
  747. {
  748. trigger_error('Lang directory is not a directory: '.$lang_dir, E_USER_WARNING);
  749. return $dirlist;
  750. }
  751. if (chdir($lang_dir)) {
  752. if (function_exists('glob')){
  753. $g_array = glob("*.txt");
  754. }else {
  755. # filter .txt only files here?
  756. $dh = opendir($lang_dir);
  757. $g_array = array();
  758. while (false !== ($filename = readdir($dh))) {
  759. if (strstr($filename, '.txt'))
  760. $g_array[] = $filename;
  761. }
  762. closedir($dh);
  763. }
  764. # build an array of lang-codes => filemtimes
  765. if ($g_array) {
  766. foreach ($g_array as $lang_name) {
  767. if (is_file($lang_name)) {
  768. $dirlist[substr($lang_name,0,5)] = @filemtime($lang_name);
  769. }
  770. }
  771. }
  772. }
  773. return $g_array;
  774. }
  775. ?>