PageRenderTime 48ms CodeModel.GetById 12ms RepoModel.GetById 1ms app.codeStats 0ms

/wp-content/plugins/qtranslate/qtranslate_core.php

https://gitlab.com/Blueprint-Marketing/interoccupy.net
PHP | 826 lines | 632 code | 78 blank | 116 comment | 191 complexity | bf50c39c746b0b8d021ef262a94a01da MD5 | raw file
  1. <?php // encoding: utf-8
  2. /* Copyright 2008 Qian Qin (email : mail@qianqin.de)
  3. This program is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation; either version 2 of the License, or
  6. (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. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program; if not, write to the Free Software
  13. Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  14. */
  15. /* qTranslate Core Functions */
  16. function qtrans_init() {
  17. global $q_config;
  18. // check if it isn't already initialized
  19. if(defined('QTRANS_INIT')) return;
  20. define('QTRANS_INIT',true);
  21. // load configuration if not beeing reseted
  22. if(isset($_POST['qtranslate_reset']) && isset($_POST['qtranslate_reset2']) && defined('WP_ADMIN') && current_user_can('manage_options')) {
  23. // reset all settings
  24. delete_option('qtranslate_language_names');
  25. delete_option('qtranslate_enabled_languages');
  26. delete_option('qtranslate_default_language');
  27. delete_option('qtranslate_flag_location');
  28. delete_option('qtranslate_flags');
  29. delete_option('qtranslate_locales');
  30. delete_option('qtranslate_na_messages');
  31. delete_option('qtranslate_date_formats');
  32. delete_option('qtranslate_time_formats');
  33. delete_option('qtranslate_use_strftime');
  34. delete_option('qtranslate_ignore_file_types');
  35. delete_option('qtranslate_url_mode');
  36. delete_option('qtranslate_detect_browser_language');
  37. delete_option('qtranslate_hide_untranslated');
  38. delete_option('qtranslate_auto_update_mo');
  39. delete_option('qtranslate_next_update_mo');
  40. delete_option('qtranslate_hide_default_language');
  41. if(isset($_POST['qtranslate_reset3'])) {
  42. delete_option('qtranslate_term_name');
  43. }
  44. }
  45. qtrans_loadConfig();
  46. if(isset($_COOKIE['qtrans_cookie_test'])) {
  47. $q_config['cookie_enabled'] = true;
  48. } else {
  49. $q_config['cookie_enabled'] = false;
  50. }
  51. // init Javascript functions
  52. qtrans_initJS();
  53. // update Gettext Databases if on Backend
  54. if(defined('WP_ADMIN') && $q_config['auto_update_mo']) qtrans_updateGettextDatabases();
  55. // update definitions if neccesary
  56. if(defined('WP_ADMIN') && current_user_can('manage_categories')) qtrans_updateTermLibrary();
  57. // extract url information
  58. $q_config['url_info'] = qtrans_extractURL($_SERVER['REQUEST_URI'], $_SERVER["HTTP_HOST"], isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '');
  59. // set test cookie
  60. setcookie('qtrans_cookie_test', 'qTranslate Cookie Test', 0, $q_config['url_info']['home'], $q_config['url_info']['host']);
  61. // check cookies for admin
  62. if(defined('WP_ADMIN')) {
  63. if(isset($_GET['lang']) && qtrans_isEnabled($_GET['lang'])) {
  64. $q_config['language'] = $q_config['url_info']['language'];
  65. setcookie('qtrans_admin_language', $q_config['language'], time()+60*60*24*30);
  66. } elseif(isset($_COOKIE['qtrans_admin_language']) && qtrans_isEnabled($_COOKIE['qtrans_admin_language'])) {
  67. $q_config['language'] = $_COOKIE['qtrans_admin_language'];
  68. } else {
  69. $q_config['language'] = $q_config['default_language'];
  70. }
  71. } else {
  72. $q_config['language'] = $q_config['url_info']['language'];
  73. }
  74. $q_config['language'] = apply_filters('qtranslate_language', $q_config['language']);
  75. // detect language and forward if needed
  76. if($q_config['detect_browser_language'] && $q_config['url_info']['redirect'] && !isset($_COOKIE['qtrans_cookie_test']) && $q_config['url_info']['language'] == $q_config['default_language']) {
  77. $target = false;
  78. $prefered_languages = array();
  79. if(isset($_SERVER["HTTP_ACCEPT_LANGUAGE"]) && preg_match_all("#([^;,]+)(;[^,0-9]*([0-9\.]+)[^,]*)?#i",$_SERVER["HTTP_ACCEPT_LANGUAGE"], $matches, PREG_SET_ORDER)) {
  80. $priority = 1.0;
  81. foreach($matches as $match) {
  82. if(!isset($match[3])) {
  83. $pr = $priority;
  84. $priority -= 0.001;
  85. } else {
  86. $pr = floatval($match[3]);
  87. }
  88. $prefered_languages[$match[1]] = $pr;
  89. }
  90. arsort($prefered_languages, SORT_NUMERIC);
  91. foreach($prefered_languages as $language => $priority) {
  92. if(strlen($language)>2) $language = substr($language,0,2);
  93. if(qtrans_isEnabled($language)) {
  94. if($q_config['hide_default_language'] && $language == $q_config['default_language']) break;
  95. $target = qtrans_convertURL(get_option('home'),$language);
  96. break;
  97. }
  98. }
  99. }
  100. $target = apply_filters("qtranslate_language_detect_redirect", $target);
  101. if($target !== false) {
  102. wp_redirect($target);
  103. exit();
  104. }
  105. }
  106. /*
  107. // Check for WP Secret Key Missmatch
  108. global $wp_default_secret_key;
  109. if(strpos($q_config['url_info']['url'],'wp-login.php')!==false && defined('AUTH_KEY') && isset($wp_default_secret_key) && $wp_default_secret_key != AUTH_KEY) {
  110. global $error;
  111. $error = __('Your $wp_default_secret_key is mismatchting with your AUTH_KEY. This might cause you not to be able to login anymore.','qtranslate');
  112. }
  113. */
  114. // Filter all options for language tags
  115. if(!defined('WP_ADMIN')) {
  116. $alloptions = wp_load_alloptions();
  117. foreach($alloptions as $option => $value) {
  118. add_filter('option_'.$option, 'qtrans_useCurrentLanguageIfNotFoundUseDefaultLanguage',0);
  119. }
  120. }
  121. // load plugin translations
  122. load_plugin_textdomain('qtranslate', false, dirname(plugin_basename( __FILE__ )).'/lang');
  123. // remove traces of language (or better not?)
  124. //unset($_GET['lang']);
  125. $_SERVER['REQUEST_URI'] = $q_config['url_info']['url'];
  126. $_SERVER['HTTP_HOST'] = $q_config['url_info']['host'];
  127. // fix url to prevent xss
  128. $q_config['url_info']['url'] = qtrans_convertURL(add_query_arg('lang',$q_config['default_language'],$q_config['url_info']['url']));
  129. }
  130. // returns cleaned string and language information
  131. function qtrans_extractURL($url, $host = '', $referer = '') {
  132. global $q_config;
  133. $home = qtrans_parseURL(get_option('home'));
  134. $home['path'] = trailingslashit($home['path']);
  135. $referer = qtrans_parseURL($referer);
  136. $result = array();
  137. $result['language'] = $q_config['default_language'];
  138. $result['url'] = $url;
  139. $result['original_url'] = $url;
  140. $result['host'] = $host;
  141. $result['redirect'] = false;
  142. $result['internal_referer'] = false;
  143. $result['home'] = $home['path'];
  144. switch($q_config['url_mode']) {
  145. case QT_URL_PATH:
  146. // pre url
  147. $url = substr($url, strlen($home['path']));
  148. if($url) {
  149. // might have language information
  150. if(preg_match("#^([a-z]{2})(/.*)?$#i",$url,$match)) {
  151. if(qtrans_isEnabled($match[1])) {
  152. // found language information
  153. $result['language'] = $match[1];
  154. $result['url'] = $home['path'].substr($url, 3);
  155. }
  156. }
  157. }
  158. break;
  159. case QT_URL_DOMAIN:
  160. // pre domain
  161. if($host) {
  162. if(preg_match("#^([a-z]{2}).#i",$host,$match)) {
  163. if(qtrans_isEnabled($match[1])) {
  164. // found language information
  165. $result['language'] = $match[1];
  166. $result['host'] = substr($host, 3);
  167. }
  168. }
  169. }
  170. break;
  171. }
  172. // check if referer is internal
  173. if($referer['host']==$result['host'] && qtrans_startsWith($referer['path'], $home['path'])) {
  174. // user coming from internal link
  175. $result['internal_referer'] = true;
  176. }
  177. if(isset($_GET['lang']) && qtrans_isEnabled($_GET['lang'])) {
  178. // language override given
  179. $result['language'] = $_GET['lang'];
  180. $result['url'] = preg_replace("#(&|\?)lang=".$result['language']."&?#i","$1",$result['url']);
  181. $result['url'] = preg_replace("#[\?\&]+$#i","",$result['url']);
  182. } elseif($home['host'] == $result['host'] && $home['path'] == $result['url']) {
  183. if(empty($referer['host'])||!$q_config['hide_default_language']) {
  184. $result['redirect'] = true;
  185. } else {
  186. // check if activating language detection is possible
  187. if(preg_match("#^([a-z]{2}).#i",$referer['host'],$match)) {
  188. if(qtrans_isEnabled($match[1])) {
  189. // found language information
  190. $referer['host'] = substr($referer['host'], 3);
  191. }
  192. }
  193. if(!$result['internal_referer']) {
  194. // user coming from external link
  195. $result['redirect'] = true;
  196. }
  197. }
  198. }
  199. return $result;
  200. }
  201. function qtrans_validateBool($var, $default) {
  202. if($var==='0') return false; elseif($var==='1') return true; else return $default;
  203. }
  204. // loads config via get_option and defaults to values set on top
  205. function qtrans_loadConfig() {
  206. global $q_config;
  207. // Load everything
  208. $language_names = get_option('qtranslate_language_names');
  209. $enabled_languages = get_option('qtranslate_enabled_languages');
  210. $default_language = get_option('qtranslate_default_language');
  211. $flag_location = get_option('qtranslate_flag_location');
  212. $flags = get_option('qtranslate_flags');
  213. $locales = get_option('qtranslate_locales');
  214. $na_messages = get_option('qtranslate_na_messages');
  215. $date_formats = get_option('qtranslate_date_formats');
  216. $time_formats = get_option('qtranslate_time_formats');
  217. $use_strftime = get_option('qtranslate_use_strftime');
  218. $ignore_file_types = get_option('qtranslate_ignore_file_types');
  219. $url_mode = get_option('qtranslate_url_mode');
  220. $detect_browser_language = get_option('qtranslate_detect_browser_language');
  221. $hide_untranslated = get_option('qtranslate_hide_untranslated');
  222. $auto_update_mo = get_option('qtranslate_auto_update_mo');
  223. $term_name = get_option('qtranslate_term_name');
  224. $hide_default_language = get_option('qtranslate_hide_default_language');
  225. // default if not set
  226. if(!is_array($date_formats)) $date_formats = $q_config['date_format'];
  227. if(!is_array($time_formats)) $time_formats = $q_config['time_format'];
  228. if(!is_array($na_messages)) $na_messages = $q_config['not_available'];
  229. if(!is_array($locales)) $locales = $q_config['locale'];
  230. if(!is_array($flags)) $flags = $q_config['flag'];
  231. if(!is_array($language_names)) $language_names = $q_config['language_name'];
  232. if(!is_array($enabled_languages)) $enabled_languages = $q_config['enabled_languages'];
  233. if(!is_array($term_name)) $term_name = $q_config['term_name'];
  234. if(empty($ignore_file_types)) $ignore_file_types = $q_config['ignore_file_types'];
  235. if(empty($default_language)) $default_language = $q_config['default_language'];
  236. if(empty($use_strftime)) $use_strftime = $q_config['use_strftime'];
  237. if(empty($url_mode)) $url_mode = $q_config['url_mode'];
  238. if(!is_string($flag_location) || $flag_location==='') $flag_location = $q_config['flag_location'];
  239. $detect_browser_language = qtrans_validateBool($detect_browser_language, $q_config['detect_browser_language']);
  240. $hide_untranslated = qtrans_validateBool($hide_untranslated, $q_config['hide_untranslated']);
  241. $auto_update_mo = qtrans_validateBool($auto_update_mo, $q_config['auto_update_mo']);
  242. $hide_default_language = qtrans_validateBool($hide_default_language, $q_config['hide_default_language']);
  243. // url fix for upgrading users
  244. $flag_location = trailingslashit(preg_replace('#^wp-content/#','',$flag_location));
  245. // check for invalid permalink/url mode combinations
  246. $permalink_structure = get_option('permalink_structure');
  247. if($permalink_structure===""||strpos($permalink_structure,'?')!==false||strpos($permalink_structure,'index.php')!==false) $url_mode = QT_URL_QUERY;
  248. // overwrite default values with loaded values
  249. $q_config['date_format'] = $date_formats;
  250. $q_config['time_format'] = $time_formats;
  251. $q_config['not_available'] = $na_messages;
  252. $q_config['locale'] = $locales;
  253. $q_config['flag'] = $flags;
  254. $q_config['language_name'] = $language_names;
  255. $q_config['enabled_languages'] = $enabled_languages;
  256. $q_config['default_language'] = $default_language;
  257. $q_config['flag_location'] = $flag_location;
  258. $q_config['use_strftime'] = $use_strftime;
  259. $q_config['ignore_file_types'] = $ignore_file_types;
  260. $q_config['url_mode'] = $url_mode;
  261. $q_config['detect_browser_language'] = $detect_browser_language;
  262. $q_config['hide_untranslated'] = $hide_untranslated;
  263. $q_config['auto_update_mo'] = $auto_update_mo;
  264. $q_config['hide_default_language'] = $hide_default_language;
  265. $q_config['term_name'] = $term_name;
  266. do_action('qtranslate_loadConfig');
  267. }
  268. // saves entire configuration
  269. function qtrans_saveConfig() {
  270. global $q_config;
  271. // save everything
  272. update_option('qtranslate_language_names', $q_config['language_name']);
  273. update_option('qtranslate_enabled_languages', $q_config['enabled_languages']);
  274. update_option('qtranslate_default_language', $q_config['default_language']);
  275. update_option('qtranslate_flag_location', $q_config['flag_location']);
  276. update_option('qtranslate_flags', $q_config['flag']);
  277. update_option('qtranslate_locales', $q_config['locale']);
  278. update_option('qtranslate_na_messages', $q_config['not_available']);
  279. update_option('qtranslate_date_formats', $q_config['date_format']);
  280. update_option('qtranslate_time_formats', $q_config['time_format']);
  281. update_option('qtranslate_ignore_file_types', $q_config['ignore_file_types']);
  282. update_option('qtranslate_url_mode', $q_config['url_mode']);
  283. update_option('qtranslate_term_name', $q_config['term_name']);
  284. update_option('qtranslate_use_strftime', $q_config['use_strftime']);
  285. if($q_config['detect_browser_language'])
  286. update_option('qtranslate_detect_browser_language', '1');
  287. else
  288. update_option('qtranslate_detect_browser_language', '0');
  289. if($q_config['hide_untranslated'])
  290. update_option('qtranslate_hide_untranslated', '1');
  291. else
  292. update_option('qtranslate_hide_untranslated', '0');
  293. if($q_config['auto_update_mo'])
  294. update_option('qtranslate_auto_update_mo', '1');
  295. else
  296. update_option('qtranslate_auto_update_mo', '0');
  297. if($q_config['hide_default_language'])
  298. update_option('qtranslate_hide_default_language', '1');
  299. else
  300. update_option('qtranslate_hide_default_language', '0');
  301. do_action('qtranslate_saveConfig');
  302. }
  303. function qtrans_updateGettextDatabases($force = false, $only_for_language = '') {
  304. global $q_config;
  305. if(!is_dir(WP_LANG_DIR)) {
  306. if(!@mkdir(WP_LANG_DIR))
  307. return false;
  308. }
  309. $next_update = get_option('qtranslate_next_update_mo');
  310. if(time() < $next_update && !$force) return true;
  311. update_option('qtranslate_next_update_mo', time() + 7*24*60*60);
  312. foreach($q_config['locale'] as $lang => $locale) {
  313. if(qtrans_isEnabled($only_for_language) && $lang != $only_for_language) continue;
  314. if(!qtrans_isEnabled($lang)) continue;
  315. if($ll = @fopen(trailingslashit(WP_LANG_DIR).$locale.'.mo.filepart','a')) {
  316. // can access .mo file
  317. fclose($ll);
  318. // try to find a .mo file
  319. if(!($locale == 'en_US' && $lcr = @fopen('http://www.qianqin.de/wp-content/languages/'.$locale.'.mo','r')))
  320. if(!$lcr = @fopen('http://svn.automattic.com/wordpress-i18n/'.$locale.'/tags/'.$GLOBALS['wp_version'].'/messages/'.$locale.'.mo','r'))
  321. if(!$lcr = @fopen('http://svn.automattic.com/wordpress-i18n/'.substr($locale,0,2).'/tags/'.$GLOBALS['wp_version'].'/messages/'.$locale.'.mo','r'))
  322. if(!$lcr = @fopen('http://svn.automattic.com/wordpress-i18n/'.$locale.'/branches/'.$GLOBALS['wp_version'].'/messages/'.$locale.'.mo','r'))
  323. if(!$lcr = @fopen('http://svn.automattic.com/wordpress-i18n/'.substr($locale,0,2).'/branches/'.$GLOBALS['wp_version'].'/messages/'.$locale.'.mo','r'))
  324. if(!$lcr = @fopen('http://svn.automattic.com/wordpress-i18n/'.$locale.'/branches/'.$GLOBALS['wp_version'].'/'.$locale.'.mo','r'))
  325. if(!$lcr = @fopen('http://svn.automattic.com/wordpress-i18n/'.substr($locale,0,2).'/branches/'.$GLOBALS['wp_version'].'/'.$locale.'.mo','r'))
  326. if(!$lcr = @fopen('http://svn.automattic.com/wordpress-i18n/'.$locale.'/trunk/messages/'.$locale.'.mo','r'))
  327. if(!$lcr = @fopen('http://svn.automattic.com/wordpress-i18n/'.substr($locale,0,2).'/trunk/messages/'.$locale.'.mo','r')) {
  328. // couldn't find a .mo file
  329. if(filesize(trailingslashit(WP_LANG_DIR).$locale.'.mo.filepart')==0) unlink(trailingslashit(WP_LANG_DIR).$locale.'.mo.filepart');
  330. continue;
  331. }
  332. // found a .mo file, update local .mo
  333. $ll = fopen(trailingslashit(WP_LANG_DIR).$locale.'.mo.filepart','w');
  334. while(!feof($lcr)) {
  335. // try to get some more time
  336. @set_time_limit(30);
  337. $lc = fread($lcr, 8192);
  338. fwrite($ll,$lc);
  339. }
  340. fclose($lcr);
  341. fclose($ll);
  342. // only use completely download .mo files
  343. rename(trailingslashit(WP_LANG_DIR).$locale.'.mo.filepart',trailingslashit(WP_LANG_DIR).$locale.'.mo');
  344. }
  345. }
  346. return true;
  347. }
  348. function qtrans_updateTermLibrary() {
  349. global $q_config;
  350. if(!isset($_POST['action'])) return;
  351. switch($_POST['action']) {
  352. case 'editedtag':
  353. case 'addtag':
  354. case 'editedcat':
  355. case 'addcat':
  356. case 'add-cat':
  357. case 'add-tag':
  358. case 'add-link-cat':
  359. if(isset($_POST['qtrans_term_'.$q_config['default_language']]) && $_POST['qtrans_term_'.$q_config['default_language']]!='') {
  360. $default = htmlspecialchars(qtrans_stripSlashesIfNecessary($_POST['qtrans_term_'.$q_config['default_language']]), ENT_NOQUOTES);
  361. if(!isset($q_config['term_name'][$default]) || !is_array($q_config['term_name'][$default])) $q_config['term_name'][$default] = array();
  362. foreach($q_config['enabled_languages'] as $lang) {
  363. $_POST['qtrans_term_'.$lang] = qtrans_stripSlashesIfNecessary($_POST['qtrans_term_'.$lang]);
  364. if($_POST['qtrans_term_'.$lang]!='') {
  365. $q_config['term_name'][$default][$lang] = htmlspecialchars($_POST['qtrans_term_'.$lang], ENT_NOQUOTES);
  366. } else {
  367. $q_config['term_name'][$default][$lang] = $default;
  368. }
  369. }
  370. update_option('qtranslate_term_name',$q_config['term_name']);
  371. }
  372. break;
  373. }
  374. }
  375. /* BEGIN DATE TIME FUNCTIONS */
  376. function qtrans_strftime($format, $date, $default = '', $before = '', $after = '') {
  377. // don't do anything if format is not given
  378. if($format=='') return $default;
  379. // add date suffix ability (%q) to strftime
  380. $day = intval(ltrim(strftime("%d",$date),'0'));
  381. $search = array();
  382. $replace = array();
  383. // date S
  384. $search[] = '/(([^%])%q|^%q)/';
  385. if($day==1||$day==21||$day==31) {
  386. $replace[] = '$2st';
  387. } elseif($day==2||$day==22) {
  388. $replace[] = '$2nd';
  389. } elseif($day==3||$day==23) {
  390. $replace[] = '$2rd';
  391. } else {
  392. $replace[] = '$2th';
  393. }
  394. $search[] = '/(([^%])%E|^%E)/'; $replace[] = '${2}'.$day; // date j
  395. $search[] = '/(([^%])%f|^%f)/'; $replace[] = '${2}'.date('w',$date); // date w
  396. $search[] = '/(([^%])%F|^%F)/'; $replace[] = '${2}'.date('z',$date); // date z
  397. $search[] = '/(([^%])%i|^%i)/'; $replace[] = '${2}'.date('n',$date); // date i
  398. $search[] = '/(([^%])%J|^%J)/'; $replace[] = '${2}'.date('t',$date); // date t
  399. $search[] = '/(([^%])%k|^%k)/'; $replace[] = '${2}'.date('L',$date); // date L
  400. $search[] = '/(([^%])%K|^%K)/'; $replace[] = '${2}'.date('B',$date); // date B
  401. $search[] = '/(([^%])%l|^%l)/'; $replace[] = '${2}'.date('g',$date); // date g
  402. $search[] = '/(([^%])%L|^%L)/'; $replace[] = '${2}'.date('G',$date); // date G
  403. $search[] = '/(([^%])%N|^%N)/'; $replace[] = '${2}'.date('u',$date); // date u
  404. $search[] = '/(([^%])%Q|^%Q)/'; $replace[] = '${2}'.date('e',$date); // date e
  405. $search[] = '/(([^%])%o|^%o)/'; $replace[] = '${2}'.date('I',$date); // date I
  406. $search[] = '/(([^%])%O|^%O)/'; $replace[] = '${2}'.date('O',$date); // date O
  407. $search[] = '/(([^%])%s|^%s)/'; $replace[] = '${2}'.date('P',$date); // date P
  408. $search[] = '/(([^%])%v|^%v)/'; $replace[] = '${2}'.date('T',$date); // date T
  409. $search[] = '/(([^%])%1|^%1)/'; $replace[] = '${2}'.date('Z',$date); // date Z
  410. $search[] = '/(([^%])%2|^%2)/'; $replace[] = '${2}'.date('c',$date); // date c
  411. $search[] = '/(([^%])%3|^%3)/'; $replace[] = '${2}'.date('r',$date); // date r
  412. $search[] = '/(([^%])%4|^%4)/'; $replace[] = '${2}'.$date; // date U
  413. $format = preg_replace($search,$replace,$format);
  414. return $before.strftime($format, $date).$after;
  415. }
  416. function qtrans_dateFromPostForCurrentLanguage($old_date, $format ='', $before = '', $after = '') {
  417. global $post;
  418. return qtrans_strftime(qtrans_convertDateFormat($format), mysql2date('U',$post->post_date), $old_date, $before, $after);
  419. }
  420. function qtrans_dateModifiedFromPostForCurrentLanguage($old_date, $format ='') {
  421. global $post;
  422. return qtrans_strftime(qtrans_convertDateFormat($format), mysql2date('U',$post->post_modified), $old_date);
  423. }
  424. function qtrans_timeFromPostForCurrentLanguage($old_date, $format = '', $post = null, $gmt = false) {
  425. $post = get_post($post);
  426. $post_date = $gmt? $post->post_date_gmt : $post->post_date;
  427. return qtrans_strftime(qtrans_convertTimeFormat($format), mysql2date('U',$post_date), $old_date);
  428. }
  429. function qtrans_timeModifiedFromPostForCurrentLanguage($old_date, $format = '', $gmt = false) {
  430. global $post;
  431. $post_date = $gmt? $post->post_modified_gmt : $post->post_modified;
  432. return qtrans_strftime(qtrans_convertTimeFormat($format), mysql2date('U',$post_date), $old_date);
  433. }
  434. function qtrans_dateFromCommentForCurrentLanguage($old_date, $format ='') {
  435. global $comment;
  436. return qtrans_strftime(qtrans_convertDateFormat($format), mysql2date('U',$comment->comment_date), $old_date);
  437. }
  438. function qtrans_timeFromCommentForCurrentLanguage($old_date, $format = '', $gmt = false, $translate = true) {
  439. if(!$translate) return $old_date;
  440. global $comment;
  441. $comment_date = $gmt? $comment->comment_date_gmt : $comment->comment_date;
  442. return qtrans_strftime(qtrans_convertTimeFormat($format), mysql2date('U',$comment_date), $old_date);
  443. }
  444. /* END DATE TIME FUNCTIONS */
  445. function qtrans_useTermLib($obj) {
  446. global $q_config;
  447. if(is_array($obj)) {
  448. // handle arrays recursively
  449. foreach($obj as $key => $t) {
  450. $obj[$key] = qtrans_useTermLib($obj[$key]);
  451. }
  452. return $obj;
  453. }
  454. if(is_object($obj)) {
  455. // object conversion
  456. if(isset($q_config['term_name'][$obj->name][$q_config['language']])) {
  457. $obj->name = $q_config['term_name'][$obj->name][$q_config['language']];
  458. }
  459. } elseif(isset($q_config['term_name'][$obj][$q_config['language']])) {
  460. $obj = $q_config['term_name'][$obj][$q_config['language']];
  461. }
  462. return $obj;
  463. }
  464. function qtrans_convertBlogInfoURL($url, $what) {
  465. if($what=='stylesheet_url') return $url;
  466. if($what=='template_url') return $url;
  467. if($what=='template_directory') return $url;
  468. if($what=='stylesheet_directory') return $url;
  469. return qtrans_convertURL($url);
  470. }
  471. function qtrans_convertURL($url='', $lang='', $forceadmin = false) {
  472. global $q_config;
  473. // invalid language
  474. if($url=='') $url = esc_url($q_config['url_info']['url']);
  475. if($lang=='') $lang = $q_config['language'];
  476. if(defined('WP_ADMIN')&&!$forceadmin) return $url;
  477. if(!qtrans_isEnabled($lang)) return "";
  478. // & workaround
  479. $url = str_replace('&amp;','&',$url);
  480. $url = str_replace('&#038;','&',$url);
  481. // check for trailing slash
  482. $nottrailing = (strpos($url,'?')===false && strpos($url,'#')===false && substr($url,-1,1)!='/');
  483. // check if it's an external link
  484. $urlinfo = qtrans_parseURL($url);
  485. $home = rtrim(get_option('home'),"/");
  486. if($urlinfo['host']!='') {
  487. // check for already existing pre-domain language information
  488. if($q_config['url_mode'] == QT_URL_DOMAIN && preg_match("#^([a-z]{2}).#i",$urlinfo['host'],$match)) {
  489. if(qtrans_isEnabled($match[1])) {
  490. // found language information, remove it
  491. $url = preg_replace("/".$match[1]."\./i","",$url, 1);
  492. // reparse url
  493. $urlinfo = qtrans_parseURL($url);
  494. }
  495. }
  496. if(substr($url,0,strlen($home))!=$home) {
  497. return $url;
  498. }
  499. // strip home path
  500. $url = substr($url,strlen($home));
  501. } else {
  502. // relative url, strip home path
  503. $homeinfo = qtrans_parseURL($home);
  504. if($homeinfo['path']==substr($url,0,strlen($homeinfo['path']))) {
  505. $url = substr($url,strlen($homeinfo['path']));
  506. }
  507. }
  508. // check for query language information and remove if found
  509. if(preg_match("#(&|\?)lang=([^&\#]+)#i",$url,$match) && qtrans_isEnabled($match[2])) {
  510. $url = preg_replace("#(&|\?)lang=".$match[2]."&?#i","$1",$url);
  511. }
  512. // remove any slashes out front
  513. $url = ltrim($url,"/");
  514. // remove any useless trailing characters
  515. $url = rtrim($url,"?&");
  516. // reparse url without home path
  517. $urlinfo = qtrans_parseURL($url);
  518. // check if its a link to an ignored file type
  519. $ignore_file_types = preg_split('/\s*,\s*/', strtolower($q_config['ignore_file_types']));
  520. $pathinfo = pathinfo($urlinfo['path']);
  521. if(isset($pathinfo['extension']) && in_array(strtolower($pathinfo['extension']), $ignore_file_types)) {
  522. return $home."/".$url;
  523. }
  524. // ignore wp internal links
  525. if(preg_match("#^(wp-login.php|wp-signup.php|wp-register.php|wp-admin/)#", $url)) {
  526. return $home."/".$url;
  527. }
  528. switch($q_config['url_mode']) {
  529. case QT_URL_PATH: // pre url
  530. // might already have language information
  531. if(preg_match("#^([a-z]{2})/#i",$url,$match)) {
  532. if(qtrans_isEnabled($match[1])) {
  533. // found language information, remove it
  534. $url = substr($url, 3);
  535. }
  536. }
  537. if(!$q_config['hide_default_language']||$lang!=$q_config['default_language']) $url = $lang."/".$url;
  538. break;
  539. case QT_URL_DOMAIN: // pre domain
  540. if(!$q_config['hide_default_language']||$lang!=$q_config['default_language']) $home = preg_replace("#//#","//".$lang.".",$home,1);
  541. break;
  542. default: // query
  543. if(!$q_config['hide_default_language']||$lang!=$q_config['default_language']){
  544. if(strpos($url,'?')===false) {
  545. $url .= '?';
  546. } else {
  547. $url .= '&';
  548. }
  549. $url .= "lang=".$lang;
  550. }
  551. }
  552. // see if cookies are activated
  553. if(!$q_config['cookie_enabled'] && !$q_config['url_info']['internal_referer'] && $urlinfo['path'] == '' && $lang == $q_config['default_language'] && $q_config['language'] != $q_config['default_language'] && $q_config['hide_default_language']) {
  554. // :( now we have to make unpretty URLs
  555. $url = preg_replace("#(&|\?)lang=".$match[2]."&?#i","$1",$url);
  556. if(strpos($url,'?')===false) {
  557. $url .= '?';
  558. } else {
  559. $url .= '&';
  560. }
  561. $url .= "lang=".$lang;
  562. }
  563. // &amp; workaround
  564. $complete = str_replace('&','&amp;',$home."/".$url);
  565. // remove trailing slash if there wasn't one to begin with
  566. if($nottrailing && strpos($complete,'?')===false && strpos($complete,'#')===false && substr($complete,-1,1)=='/')
  567. $complete = substr($complete,0,-1);
  568. return $complete;
  569. }
  570. // splits text with language tags into array
  571. function qtrans_split($text, $quicktags = true) {
  572. global $q_config;
  573. //init vars
  574. $split_regex = "#(<!--[^-]*-->|\[:[a-z]{2}\])#ism";
  575. $current_language = "";
  576. $result = array();
  577. foreach($q_config['enabled_languages'] as $language) {
  578. $result[$language] = "";
  579. }
  580. // split text at all xml comments
  581. $blocks = preg_split($split_regex, $text, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
  582. foreach($blocks as $block) {
  583. # detect language tags
  584. if(preg_match("#^<!--:([a-z]{2})-->$#ism", $block, $matches)) {
  585. if(qtrans_isEnabled($matches[1])) {
  586. $current_language = $matches[1];
  587. } else {
  588. $current_language = "invalid";
  589. }
  590. continue;
  591. // detect quicktags
  592. } elseif($quicktags && preg_match("#^\[:([a-z]{2})\]$#ism", $block, $matches)) {
  593. if(qtrans_isEnabled($matches[1])) {
  594. $current_language = $matches[1];
  595. } else {
  596. $current_language = "invalid";
  597. }
  598. continue;
  599. // detect ending tags
  600. } elseif(preg_match("#^<!--:-->$#ism", $block, $matches)) {
  601. $current_language = "";
  602. continue;
  603. // detect defective more tag
  604. } elseif(preg_match("#^<!--more-->$#ism", $block, $matches)) {
  605. foreach($q_config['enabled_languages'] as $language) {
  606. $result[$language] .= $block;
  607. }
  608. continue;
  609. }
  610. // correctly categorize text block
  611. if($current_language == "") {
  612. // general block, add to all languages
  613. foreach($q_config['enabled_languages'] as $language) {
  614. $result[$language] .= $block;
  615. }
  616. } elseif($current_language != "invalid") {
  617. // specific block, only add to active language
  618. $result[$current_language] .= $block;
  619. }
  620. }
  621. foreach($result as $lang => $lang_content) {
  622. $result[$lang] = preg_replace("#(<!--more-->|<!--nextpage-->)+$#ism","",$lang_content);
  623. }
  624. return $result;
  625. }
  626. function qtrans_join($texts) {
  627. global $q_config;
  628. if(!is_array($texts)) $texts = qtrans_split($texts, false);
  629. $split_regex = "#<!--more-->#ism";
  630. $max = 0;
  631. $text = "";
  632. foreach($q_config['enabled_languages'] as $language) {
  633. $texts[$language] = preg_split($split_regex, $texts[$language]);
  634. if(sizeof($texts[$language]) > $max) $max = sizeof($texts[$language]);
  635. }
  636. for($i=0;$i<$max;$i++) {
  637. if($i>=1) {
  638. $text .= '<!--more-->';
  639. }
  640. foreach($q_config['enabled_languages'] as $language) {
  641. if(isset($texts[$language][$i]) && $texts[$language][$i] !== '') {
  642. $text .= '<!--:'.$language.'-->'.$texts[$language][$i].'<!--:-->';
  643. }
  644. }
  645. }
  646. return $text;
  647. }
  648. function qtrans_disableLanguage($lang) {
  649. global $q_config;
  650. if(qtrans_isEnabled($lang)) {
  651. $new_enabled = array();
  652. for($i = 0; $i < sizeof($q_config['enabled_languages']); $i++) {
  653. if($q_config['enabled_languages'][$i] != $lang) {
  654. $new_enabled[] = $q_config['enabled_languages'][$i];
  655. }
  656. }
  657. $q_config['enabled_languages'] = $new_enabled;
  658. return true;
  659. }
  660. return false;
  661. }
  662. function qtrans_enableLanguage($lang) {
  663. global $q_config;
  664. if(qtrans_isEnabled($lang) || !isset($q_config['language_name'][$lang])) {
  665. return false;
  666. }
  667. $q_config['enabled_languages'][] = $lang;
  668. // force update of .mo files
  669. if ($q_config['auto_update_mo']) qtrans_updateGettextDatabases(true, $lang);
  670. return true;
  671. }
  672. function qtrans_use($lang, $text, $show_available=false) {
  673. global $q_config;
  674. // return full string if language is not enabled
  675. if(!qtrans_isEnabled($lang)) return $text;
  676. if(is_array($text)) {
  677. // handle arrays recursively
  678. foreach($text as $key => $t) {
  679. $text[$key] = qtrans_use($lang,$text[$key],$show_available);
  680. }
  681. return $text;
  682. }
  683. if(is_object($text)||@get_class($text) == '__PHP_Incomplete_Class') {
  684. foreach(get_object_vars($text) as $key => $t) {
  685. $text->$key = qtrans_use($lang,$text->$key,$show_available);
  686. }
  687. return $text;
  688. }
  689. // prevent filtering weird data types and save some resources
  690. if(!is_string($text) || $text == '') {
  691. return $text;
  692. }
  693. // get content
  694. $content = qtrans_split($text);
  695. // find available languages
  696. $available_languages = array();
  697. foreach($content as $language => $lang_text) {
  698. $lang_text = trim($lang_text);
  699. if(!empty($lang_text)) $available_languages[] = $language;
  700. }
  701. // if no languages available show full text
  702. if(sizeof($available_languages)==0) return $text;
  703. // if content is available show the content in the requested language
  704. if(!empty($content[$lang])) {
  705. return $content[$lang];
  706. }
  707. // content not available in requested language (bad!!) what now?
  708. if(!$show_available){
  709. // check if content is available in default language, if not return first language found. (prevent empty result)
  710. if($lang!=$q_config['default_language'])
  711. return "(".$q_config['language_name'][$q_config['default_language']].") ".qtrans_use($q_config['default_language'], $text, $show_available);
  712. foreach($content as $language => $lang_text) {
  713. $lang_text = trim($lang_text);
  714. if(!empty($lang_text)) {
  715. return "(".$q_config['language_name'][$language].") ".$lang_text;
  716. }
  717. }
  718. }
  719. // display selection for available languages
  720. $available_languages = array_unique($available_languages);
  721. $language_list = "";
  722. if(preg_match('/%LANG:([^:]*):([^%]*)%/',$q_config['not_available'][$lang],$match)) {
  723. $normal_seperator = $match[1];
  724. $end_seperator = $match[2];
  725. // build available languages string backward
  726. $i = 0;
  727. foreach($available_languages as $language) {
  728. if($i==1) $language_list = $end_seperator.$language_list;
  729. if($i>1) $language_list = $normal_seperator.$language_list;
  730. $language_list = "<a href=\"".qtrans_convertURL('', $language)."\">".$q_config['language_name'][$language]."</a>".$language_list;
  731. $i++;
  732. }
  733. }
  734. return "<p>".preg_replace('/%LANG:([^:]*):([^%]*)%/', $language_list, $q_config['not_available'][$lang])."</p>";
  735. }
  736. function qtrans_showAllSeperated($text) {
  737. if(empty($text)) return $text;
  738. global $q_config;
  739. $result = "";
  740. foreach(qtrans_getSortedLanguages() as $language) {
  741. $result .= $q_config['language_name'][$language].":\n".qtrans_use($language, $text)."\n\n";
  742. }
  743. return $result;
  744. }
  745. ?>