Linux server.jmdstrack.com 3.10.0-1160.119.1.el7.tuxcare.els10.x86_64 #1 SMP Fri Oct 11 21:40:41 UTC 2024 x86_64
/ home/ jmdstrac/ public_html/ wp-content/ plugins/ gtranslate/ |
|
<?php /* Plugin Name: GTranslate Plugin URI: https://gtranslate.io/?xyz=998 Description: Translate your website and make it multilingual. For support visit <a href="https://wordpress.org/support/plugin/gtranslate">GTranslate Support Forum</a>. Version: 3.0.7 Author: Translate AI Multilingual Solutions Author URI: https://gtranslate.io Text Domain: gtranslate */ /* Copyright 2010 - 2022 GTranslate Inc. ( website: https://gtranslate.com ) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ add_action('widgets_init', array('GTranslate', 'register')); register_activation_hook(__FILE__, array('GTranslate', 'activate')); register_deactivation_hook(__FILE__, array('GTranslate', 'deactivate')); add_filter('plugin_action_links_' . plugin_basename(__FILE__), array('GTranslate', 'settings_link')); add_action('admin_menu', array('GTranslate', 'admin_menu')); add_action('init', array('GTranslate', 'enqueue_scripts')); add_action('plugins_loaded', array('GTranslate', 'load_textdomain')); add_action('send_headers', array('GTranslate', 'set_dns_prefetch_header')); add_filter('script_loader_tag', array('GTranslate', 'add_script_attributes'), 10, 3); add_filter('walker_nav_menu_start_el', array('GTranslate', 'render_menu_items') , 10 , 4); add_shortcode('GTranslate', array('GTranslate', 'render_shortcode')); add_shortcode('gtranslate', array('GTranslate', 'render_shortcode')); add_shortcode('gt-link', array('GTranslate', 'render_single_item')); class GTranslate extends WP_Widget { public static $lang_array = array('en'=>'English','ar'=>'Arabic','bg'=>'Bulgarian','zh-CN'=>'Chinese (Simplified)','zh-TW'=>'Chinese (Traditional)','hr'=>'Croatian','cs'=>'Czech','da'=>'Danish','nl'=>'Dutch','fi'=>'Finnish','fr'=>'French','de'=>'German','el'=>'Greek','hi'=>'Hindi','it'=>'Italian','ja'=>'Japanese','ko'=>'Korean','no'=>'Norwegian','pl'=>'Polish','pt'=>'Portuguese','ro'=>'Romanian','ru'=>'Russian','es'=>'Spanish','sv'=>'Swedish','ca'=>'Catalan','tl'=>'Filipino','iw'=>'Hebrew','id'=>'Indonesian','lv'=>'Latvian','lt'=>'Lithuanian','sr'=>'Serbian','sk'=>'Slovak','sl'=>'Slovenian','uk'=>'Ukrainian','vi'=>'Vietnamese','sq'=>'Albanian','et'=>'Estonian','gl'=>'Galician','hu'=>'Hungarian','mt'=>'Maltese','th'=>'Thai','tr'=>'Turkish','fa'=>'Persian','af'=>'Afrikaans','ms'=>'Malay','sw'=>'Swahili','ga'=>'Irish','cy'=>'Welsh','be'=>'Belarusian','is'=>'Icelandic','mk'=>'Macedonian','yi'=>'Yiddish','hy'=>'Armenian','az'=>'Azerbaijani','eu'=>'Basque','ka'=>'Georgian','ht'=>'Haitian Creole','ur'=>'Urdu','bn' => 'Bengali','bs' => 'Bosnian','ceb' => 'Cebuano','eo' => 'Esperanto','gu' => 'Gujarati','ha' => 'Hausa','hmn' => 'Hmong','ig' => 'Igbo','jw' => 'Javanese','kn' => 'Kannada','km' => 'Khmer','lo' => 'Lao','la' => 'Latin','mi' => 'Maori','mr' => 'Marathi','mn' => 'Mongolian','ne' => 'Nepali','pa' => 'Punjabi','so' => 'Somali','ta' => 'Tamil','te' => 'Telugu','yo' => 'Yoruba','zu' => 'Zulu','my' => 'Myanmar (Burmese)','ny' => 'Chichewa','kk' => 'Kazakh','mg' => 'Malagasy','ml' => 'Malayalam','si' => 'Sinhala','st' => 'Sesotho','su' => 'Sudanese','tg' => 'Tajik','uz' => 'Uzbek','am' => 'Amharic','co' => 'Corsican','haw' => 'Hawaiian','ku' => 'Kurdish (Kurmanji)','ky' => 'Kyrgyz','lb' => 'Luxembourgish','ps' => 'Pashto','sm' => 'Samoan','gd' => 'Scottish Gaelic','sn' => 'Shona','sd' => 'Sindhi','fy' => 'Frisian','xh' => 'Xhosa'); public static $lang_array_native_json = '{"af":"Afrikaans","sq":"Shqip","am":"\u12a0\u121b\u122d\u129b","ar":"\u0627\u0644\u0639\u0631\u0628\u064a\u0629","hy":"\u0540\u0561\u0575\u0565\u0580\u0565\u0576","az":"Az\u0259rbaycan dili","eu":"Euskara","be":"\u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f \u043c\u043e\u0432\u0430","bn":"\u09ac\u09be\u0982\u09b2\u09be","bs":"Bosanski","bg":"\u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438","ca":"Catal\u00e0","ceb":"Cebuano","ny":"Chichewa","zh-CN":"\u7b80\u4f53\u4e2d\u6587","zh-TW":"\u7e41\u9ad4\u4e2d\u6587","co":"Corsu","hr":"Hrvatski","cs":"\u010ce\u0161tina\u200e","da":"Dansk","nl":"Nederlands","en":"English","eo":"Esperanto","et":"Eesti","tl":"Filipino","fi":"Suomi","fr":"Fran\u00e7ais","fy":"Frysk","gl":"Galego","ka":"\u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8","de":"Deutsch","el":"\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac","gu":"\u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0","ht":"Kreyol ayisyen","ha":"Harshen Hausa","haw":"\u014clelo Hawai\u02bbi","iw":"\u05e2\u05b4\u05d1\u05b0\u05e8\u05b4\u05d9\u05ea","hi":"\u0939\u093f\u0928\u094d\u0926\u0940","hmn":"Hmong","hu":"Magyar","is":"\u00cdslenska","ig":"Igbo","id":"Bahasa Indonesia","ga":"Gaeilge","it":"Italiano","ja":"\u65e5\u672c\u8a9e","jw":"Basa Jawa","kn":"\u0c95\u0ca8\u0ccd\u0ca8\u0ca1","kk":"\u049a\u0430\u0437\u0430\u049b \u0442\u0456\u043b\u0456","km":"\u1797\u17b6\u179f\u17b6\u1781\u17d2\u1798\u17c2\u179a","ko":"\ud55c\uad6d\uc5b4","ku":"\u0643\u0648\u0631\u062f\u06cc\u200e","ky":"\u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430","lo":"\u0e9e\u0eb2\u0eaa\u0eb2\u0ea5\u0eb2\u0ea7","la":"Latin","lv":"Latvie\u0161u valoda","lt":"Lietuvi\u0173 kalba","lb":"L\u00ebtzebuergesch","mk":"\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438 \u0458\u0430\u0437\u0438\u043a","mg":"Malagasy","ms":"Bahasa Melayu","ml":"\u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02","mt":"Maltese","mi":"Te Reo M\u0101ori","mr":"\u092e\u0930\u093e\u0920\u0940","mn":"\u041c\u043e\u043d\u0433\u043e\u043b","my":"\u1017\u1019\u102c\u1005\u102c","ne":"\u0928\u0947\u092a\u093e\u0932\u0940","no":"Norsk bokm\u00e5l","ps":"\u067e\u069a\u062a\u0648","fa":"\u0641\u0627\u0631\u0633\u06cc","pl":"Polski","pt":"Portugu\u00eas","pa":"\u0a2a\u0a70\u0a1c\u0a3e\u0a2c\u0a40","ro":"Rom\u00e2n\u0103","ru":"\u0420\u0443\u0441\u0441\u043a\u0438\u0439","sm":"Samoan","gd":"G\u00e0idhlig","sr":"\u0421\u0440\u043f\u0441\u043a\u0438 \u0458\u0435\u0437\u0438\u043a","st":"Sesotho","sn":"Shona","sd":"\u0633\u0646\u068c\u064a","si":"\u0dc3\u0dd2\u0d82\u0dc4\u0dbd","sk":"Sloven\u010dina","sl":"Sloven\u0161\u010dina","so":"Afsoomaali","es":"Espa\u00f1ol","su":"Basa Sunda","sw":"Kiswahili","sv":"Svenska","tg":"\u0422\u043e\u04b7\u0438\u043a\u04e3","ta":"\u0ba4\u0bae\u0bbf\u0bb4\u0bcd","te":"\u0c24\u0c46\u0c32\u0c41\u0c17\u0c41","th":"\u0e44\u0e17\u0e22","tr":"T\u00fcrk\u00e7e","uk":"\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430","ur":"\u0627\u0631\u062f\u0648","uz":"O\u2018zbekcha","vi":"Ti\u1ebfng Vi\u1ec7t","cy":"Cymraeg","xh":"isiXhosa","yi":"\u05d9\u05d9\u05d3\u05d9\u05e9","yo":"Yor\u00f9b\u00e1","zu":"Zulu"}'; public static function activate() { $data = array( 'gtranslate_title' => __('Website Translator', 'gtranslate'), ); $data = get_option('GTranslate'); self::load_defaults($data); add_option('GTranslate', $data); } public static function deactivate() { // delete_option('GTranslate'); } public static function settings_link($links) { $settings_link = array('<a href="' . admin_url('options-general.php?page=gtranslate_options') . '">'.__('Settings', 'gtranslate').'</a>'); return array_merge($links, $settings_link); } public static function control() { $data = get_option('GTranslate'); ?> <p><label><?php _e('Title', 'gtranslate'); ?>: <input name="gtranslate_title" type="text" class="widefat" value="<?php echo $data['gtranslate_title']; ?>"/></label></p> <p><?php _e('Please go to <a href="' . admin_url('options-general.php?page=gtranslate_options') . '">'.__('GTranslate Settings', 'gtranslate').'</a> for configuration.', 'gtranslate'); ?></p> <?php if (isset($_POST['gtranslate_title'])){ $data['gtranslate_title'] = esc_attr($_POST['gtranslate_title']); update_option('GTranslate', $data); } } public static function set_dns_prefetch_header() { $data = get_option('GTranslate'); self::load_defaults($data); if($data['enable_cdn']) header('Link: <https://cdn.gtranslate.net/>; rel=dns-prefetch', false); } public static function enqueue_scripts() { $data = get_option('GTranslate'); self::load_defaults($data); if(is_admin()) wp_enqueue_script('jquery'); // make sure main_lang is set correctly in config.php file if($data['pro_version'] or $data['enterprise_version']) { include dirname(__FILE__) . '/url_addon/config.php'; if($main_lang != $data['default_language']) { // update main_lang in config.php $config_file = dirname(__FILE__) . '/url_addon/config.php'; if(is_readable($config_file) and is_writable($config_file)) { $config = file_get_contents($config_file); if(strpos($config, 'main_lang') !== false) { $config = preg_replace('/\$main_lang = \'[a-z-]{2,5}\'/i', '$main_lang = \''.$data['default_language'].'\'', $config); if(is_string($config) and strlen($config) > 10) file_put_contents($config_file, $config); } } } } } public static function load_textdomain() { load_plugin_textdomain('gtranslate'); // set correct language direction global $text_direction; if(isset($_SERVER['HTTP_X_GT_LANG']) and in_array($_SERVER['HTTP_X_GT_LANG'], array('ar', 'iw', 'fa'))) $text_direction = 'rtl'; elseif(isset($_SERVER['HTTP_X_GT_LANG'])) $text_direction = 'ltr'; } public static function add_script_attributes($tag, $handle, $src) { if(!empty($src) and strpos($handle, 'gt_widget_script_') === 0) { $orig_url = strtok($_SERVER['REQUEST_URI'], '?'); $orig_domain = parse_url(site_url(), PHP_URL_HOST); $widget_id = str_replace('gt_widget_script_', '', $handle); $tag = strstr($tag, '</script>', true) . '</script><script src="' . esc_attr($src) . '" data-no-optimize="1" data-no-minify="1" data-gt-orig-url="' . esc_attr($orig_url) . '" data-gt-orig-domain="' . esc_attr($orig_domain) . '" data-gt-widget-id="' . esc_attr($widget_id) .'" defer></script>'; } return $tag; } public static function render_shortcode($atts) { if(!is_array($atts)) $atts = array(); $atts['position'] = 'inline'; $atts['wrapper_selector'] = '.gtranslate_wrapper'; return self::get_widget_code($atts); } public static function render_single_item($atts) { if(!is_array($atts) or !isset($atts['lang'])) return; $data = get_option('GTranslate'); self::load_defaults($data); $lang_code = $atts['lang']; if(!isset($atts['label'])) { $lang_array = $data['native_language_names'] ? json_decode(GTranslate::$lang_array_native_json, true) : GTranslate::$lang_array; $label = $lang_array[$lang_code]; } else { $label = $atts['label']; } $widget_look = isset($atts['widget_look']) ? $atts['widget_look'] : $data['widget_look']; if(!in_array($widget_look, array('flags', 'flags_code', 'flags_name', 'lang_codes', 'lang_names'))) $widget_look = 'flags_name'; $flag_size = $data['flag_size']; $flag_src = self::get_flag_src($lang_code); if(isset($atts['current_wrapper'])) $add_class = $lang_code == $data['default_language'] ? ' class="gt-current-wrapper notranslate"' : ' class="notranslate"'; else $add_class = $lang_code == $data['default_language'] ? ' class="gt-current-lang notranslate"' : ' class="notranslate"'; switch($widget_look) { case 'lang_names': $el_code = '<a href="#" data-gt-lang="' . esc_attr($lang_code) . '"' . $add_class . '>' . esc_html($label) . '</a>'; break; case 'lang_codes': $el_code = '<a href="#" data-gt-lang="' . esc_attr($lang_code) . '"' . $add_class . '>' . esc_html(strtoupper($lang_code)) . '</a>'; break; case 'flags': $el_code = '<a href="#" data-gt-lang="' . esc_attr($lang_code) . '"' . $add_class . '><img src="' . esc_attr($flag_src) . '" width="' . esc_attr($flag_size) . '" height="' . esc_attr($flag_size) . '" alt="' . esc_attr($lang_code) . '" loading="lazy"></a>'; break; case 'flags_name': $el_code = '<a href="#" data-gt-lang="' . esc_attr($lang_code) . '"' . $add_class . '><img src="' . esc_attr($flag_src) . '" width="' . esc_attr($flag_size) . '" height="' . esc_attr($flag_size) . '" alt="' . esc_attr($lang_code) . '" loading="lazy"> <span>' . esc_html($label) . '</span></a>'; break; case 'flags_code': $el_code = '<a href="#" data-gt-lang="' . esc_attr($lang_code) . '"' . $add_class . '><img src="' . esc_attr($flag_src) . '" width="' . esc_attr($flag_size) . '" height="' . esc_attr($flag_size) . '" alt="' . esc_attr($lang_code) . '" loading="lazy"> <span>' . esc_html(strtoupper($lang_code)) . '</span></a>'; break; } global $gt_base_loaded; if(!$gt_base_loaded) { $gt_base_loaded = true; $gt_settings = self::load_settings($data); $unique_id = wp_rand(10000000, 88888888); // remove excess settings based on widget_look to keep front-end code small $old_settings = $gt_settings; $gt_settings = array(); $keep_keys = array('default_language', 'languages', 'url_structure', 'native_language_names', 'detect_browser_language', 'flag_style', 'flag_size', 'alt_flags', 'custom_domains', 'custom_css'); foreach($keep_keys as $key) if(isset($old_settings[$key]) and $old_settings[$key] !== '') $gt_settings[$key] = $old_settings[$key]; if($data['enable_cdn']) { wp_enqueue_script('gt_widget_script_' . $unique_id, 'https://cdn.gtranslate.net/widgets/latest/base.js', array(), '', true); } else { $base_path = plugins_url('', __FILE__); if($data['enterprise_version']) $gt_settings['flags_location'] = $base_path . '/flags/'; else $gt_settings['flags_location'] = wp_make_link_relative($base_path) . '/flags/'; wp_enqueue_script('gt_widget_script_' . $unique_id, $base_path . '/js/base.js', array(), '', true); } wp_add_inline_script('gt_widget_script_' . $unique_id, "window.gtranslateSettings = /* document.write */ window.gtranslateSettings || {};window.gtranslateSettings['" . $unique_id . "'] = " . json_encode($gt_settings) . ";", 'before'); } return $el_code; } public static function render_menu_items($item_output, $item, $depth, $args) { if(!empty($item->post_title) and strpos($item->post_title, '[gtranslate') !== false) return do_shortcode($item->post_title); if(empty($item->description) or strpos($item->description, '[gt-link') === false) return $item_output; $output = do_shortcode($item->description); if(!empty($output)) return $output; return $item_output; } public static function get_flag_src($lang) { $data = get_option('GTranslate'); self::load_defaults($data); if($data['enable_cdn']) $base_src = 'https://cdn.gtranslate.net/flags/'; else $base_src = plugins_url('', __FILE__) . '/flags/'; if($data['flag_style'] == '2d') $base_src .= 'svg/'; else $base_src .= $data['flag_size'] . '/'; $flag_ext = $data['flag_style'] == '3d' ? '.png' : '.svg'; $alt_flags = array(); $raw_alt_flags = $data['alt_flags']; // example raw_alt_flags: ['us', 'br', 'ar'] foreach($raw_alt_flags as $country_code) { switch($country_code) { case 'us': $alt_flags['en'] = 'en-us'; break; case 'ca': $alt_flags['en'] = 'en-ca'; break; case 'br': $alt_flags['pt'] = 'pt-br'; break; case 'mx': $alt_flags['es'] = 'es-mx'; break; case 'ar': $alt_flags['es'] = 'es-ar'; break; case 'co': $alt_flags['es'] = 'es-co'; break; case 'qc': $alt_flags['fr'] = 'fr-qc'; break; default: break; } } $flag = isset($alt_flags[$lang]) ? $alt_flags[$lang] : $lang; return $base_src . $flag . $flag_ext; } public static function get_widget_code($atts) { $unique_id = wp_rand(10000000, 88888888); $data = get_option('GTranslate'); self::load_defaults($data); if(isset($atts['widget_look']) and in_array($atts['widget_look'], array('float', 'dropdown_with_flags', 'dropdown', 'flags_dropdown', 'popup', 'flags', 'globe', 'flags_code', 'flags_name', 'lang_names', 'lang_codes'))) { $data['widget_look'] = $atts['widget_look']; } if(isset($atts['wrapper_selector'])) { $data['wrapper_selector'] = $atts['wrapper_selector']; } $gt_settings = self::load_settings($data); if(isset($atts['position'])) { $position = $float_position = $atts['position']; } else { if($data['floating_language_selector'] == 'no') $position = $float_position = 'inline'; else $position = $float_position = $data['floating_language_selector']; } if($float_position == 'inline') { $switcher_horizontal_position = 'inline'; $switcher_vertical_position = ''; } else list($switcher_vertical_position, $switcher_horizontal_position) = explode('_', $float_position); $gt_settings['switcher_horizontal_position'] = $switcher_horizontal_position; $gt_settings['switcher_vertical_position'] = $switcher_vertical_position; if($position == 'inline') { $horizontal_position = 'inline'; $vertical_position = ''; } else list($vertical_position, $horizontal_position) = explode('_', $position); $gt_settings['horizontal_position'] = $horizontal_position; $gt_settings['vertical_position'] = $vertical_position; $widget_code = ''; if($gt_settings['wrapper_selector'] == '.gtranslate_wrapper' or empty(trim($gt_settings['wrapper_selector']))) { $gt_settings['wrapper_selector'] = '#gt-wrapper-' . $unique_id; $widget_code .= '<div class="gtranslate_wrapper" id="gt-wrapper-' . $unique_id . '"></div>'; } if(strpos($data['widget_look'], '_') !== false) { $widget_short_name = explode('_', $data['widget_look']); foreach($widget_short_name as $i => $segment) $widget_short_name[$i] = substr($segment, 0, 1); $widget_short_name = implode('', $widget_short_name); } else { $widget_short_name = $data['widget_look']; } // remove excess settings based on widget_look to keep front-end code small $old_settings = $gt_settings; $gt_settings = array(); switch($data['widget_look']) { case 'float': $keep_keys = array('default_language', 'languages', 'url_structure', 'native_language_names', 'detect_browser_language', 'flag_style', 'wrapper_selector', 'alt_flags', 'custom_domains', 'float_switcher_open_direction', 'switcher_horizontal_position', 'switcher_vertical_position', 'custom_css'); break; case 'dropdown_with_flags': $keep_keys = array('default_language', 'languages', 'url_structure', 'native_language_names', 'detect_browser_language', 'flag_style', 'flag_size', 'wrapper_selector', 'alt_flags', 'custom_domains', 'switcher_open_direction', 'switcher_horizontal_position', 'switcher_vertical_position', 'switcher_text_color', 'switcher_arrow_color', 'switcher_border_color', 'switcher_background_color', 'switcher_background_shadow_color', 'switcher_background_hover_color', 'dropdown_text_color', 'dropdown_hover_color', 'dropdown_background_color', 'custom_css'); break; case 'dropdown': $keep_keys = array('default_language', 'languages', 'url_structure', 'native_language_names', 'detect_browser_language', 'wrapper_selector', 'custom_domains', 'select_language_label', 'custom_css', 'horizontal_position', 'vertical_position'); break; case 'flags_dropdown': $keep_keys = array('default_language', 'languages', 'dropdown_languages', 'url_structure', 'native_language_names', 'detect_browser_language', 'add_new_line', 'flag_style', 'flag_size', 'wrapper_selector', 'alt_flags', 'custom_domains', 'custom_css', 'horizontal_position', 'vertical_position'); break; case 'popup': case 'flags': case 'flags_name': case 'flags_code': $keep_keys = array('default_language', 'languages', 'url_structure', 'native_language_names', 'detect_browser_language', 'flag_style', 'flag_size', 'wrapper_selector', 'alt_flags', 'custom_domains', 'custom_css', 'horizontal_position', 'vertical_position'); break; case 'globe': $keep_keys = array('default_language', 'languages', 'url_structure', 'native_language_names', 'detect_browser_language', 'wrapper_selector', 'flag_size', 'globe_size', 'alt_flags', 'globe_color', 'custom_domains', 'custom_css', 'horizontal_position', 'vertical_position'); break; case 'lang_codes': case 'lang_names': $keep_keys = array('default_language', 'languages', 'url_structure', 'native_language_names', 'detect_browser_language', 'wrapper_selector', 'custom_domains', 'custom_css', 'horizontal_position', 'vertical_position'); break; default: $keep_keys = array_keys($old_settings); break; } foreach($keep_keys as $key) if(isset($old_settings[$key]) and $old_settings[$key] !== '') $gt_settings[$key] = $old_settings[$key]; // overwrite settings from shortcode attributes /* todo: sanitize input if(is_array($atts)) { foreach($keep_keys as $key) if(isset($atts[$key]) and $atts[$key] !== '') $gt_settings[$key] = $atts[$key]; } */ // add necessary js if($data['enable_cdn']) { wp_enqueue_script('gt_widget_script_' . $unique_id, 'https://cdn.gtranslate.net/widgets/latest/' . $widget_short_name . '.js', array(), '', true); } else { $base_path = plugins_url('', __FILE__); if($data['widget_look'] == 'globe') { if($data['enterprise_version']) $gt_settings['flags_location'] = $base_path . '/flags/svg/'; else $gt_settings['flags_location'] = wp_make_link_relative($base_path) . '/flags/svg/'; } else { if($data['enterprise_version']) $gt_settings['flags_location'] = $base_path . '/flags/'; else $gt_settings['flags_location'] = wp_make_link_relative($base_path) . '/flags/'; } wp_enqueue_script('gt_widget_script_' . $unique_id, $base_path . '/js/' . $widget_short_name . '.js', array(), '', true); } wp_add_inline_script('gt_widget_script_' . $unique_id, "window.gtranslateSettings = /* document.write */ window.gtranslateSettings || {};window.gtranslateSettings['" . $unique_id . "'] = " . json_encode($gt_settings) . ";", 'before'); return $widget_code; } public static function register() { register_widget('GTranslateWidget'); } public static function admin_menu() { add_options_page(__('GTranslate Options', 'gtranslate'), 'GTranslate', 'administrator', 'gtranslate_options', array('GTranslate', 'options')); } public static function options() { ?> <div class="wrap"> <div id="icon-options-general" class="icon32"><br/></div> <h2><img src="<?php echo plugins_url('gt_logo.svg', __FILE__); ?>" border="0" title="<?php _e('GTranslate - your window to the world', 'gtranslate'); ?>" alt="G|translate" height="70"></h2> <?php if(isset($_POST['save']) and $_POST['save']) self::control_options(); $data = get_option('GTranslate'); self::load_defaults($data); wp_enqueue_script('jquery-ui-sortable'); wp_enqueue_script('jquery-effects-core'); wp_enqueue_script('wp-color-picker'); wp_enqueue_style( 'wp-color-picker'); wp_add_inline_script('wp-color-picker', 'jQuery(document).ready(function($) {$(".color-field").wpColorPicker({change:function(e,c){$("#"+e.target.getAttribute("id")+"_hidden").val(c.color.toString());e.target.value = c.color.toString();RefreshDoWidgetCode();}});});'); add_thickbox(); $site_url = site_url(); $wp_plugin_url = preg_replace('/^https?:/i', '', plugins_url() . '/gtranslate'); extract($data); $gt_lang_array_json = json_encode(self::$lang_array); $gt_lang_array = self::$lang_array; if(!empty($language_codes)) $gt_lang_codes_json = json_encode(explode(',', $language_codes)); else $gt_lang_codes_json = '[]'; if(!empty($language_codes2)) $gt_lang_codes2_json = json_encode(explode(',', $language_codes2)); else $gt_lang_codes2_json = '[]'; $script = <<<EOT jQuery(document).ready(function($){ jQuery('input[name="alt_flags2[]"]').change(function() { if($(this).prop('checked')) { var lang_group = $(this).attr('data-lang-group'); // uncheck other items from lang group $('input[name="alt_flags2[]"][data-lang-group="'+lang_group+'"]').prop('checked', false); $(this).prop('checked', true); } $('#alt_us_hidden').prop('checked', $('#alt_us').prop('checked')); $('#alt_ca_hidden').prop('checked', $('#alt_ca').prop('checked')); $('#alt_br_hidden').prop('checked', $('#alt_br').prop('checked')); $('#alt_mx_hidden').prop('checked', $('#alt_mx').prop('checked')); $('#alt_ar_hidden').prop('checked', $('#alt_ar').prop('checked')); $('#alt_co_hidden').prop('checked', $('#alt_co').prop('checked')); $('#alt_qc_hidden').prop('checked', $('#alt_qc').prop('checked')); RefreshDoWidgetCode(); }); }); var gt_lang_array = $gt_lang_array_json; var languages = [], language_codes = $gt_lang_codes_json, language_codes2 = $gt_lang_codes2_json; if(language_codes.length == 0) for(var key in gt_lang_array) language_codes.push(key); if(language_codes2.length == 0) for(var key in gt_lang_array) language_codes2.push(key); function SyncCustomDomains() { jQuery('#custom_domains_status_sync').show(); jQuery.ajax({ url: 'https://tdns.gtranslate.net/tdn-bin/load-custom-domains', type: 'GET', dataType: 'json', headers: {"X-GT-Domain": window.gt_debug_main_domain||location.hostname}, success: function(data) { jQuery('#custom_domains_status_sync').hide(); if(data.err) { // todo: nice alert box if(data.err == 'no license') alert('No subscription found for "' + (window.gt_debug_main_domain||location.hostname) + '". Please subscribe at https://gtranslate.io/'); else if(data.err == 'no settings') alert('Make sure your subscription for "' + (window.gt_debug_main_domain||location.hostname) + '" has Language Hosting feature and Custom domains are configured in your GTranslate dashboard: https://my.gtranslate.io/settings#advanced'); else alert(data.err); jQuery('#custom_domains').prop('checked', false); RefreshDoWidgetCode(); return; } jQuery('#custom_domains_data').val(JSON.stringify(data)); jQuery('#custom_domains_list_tbl tr.lang_domain_row').remove(); for(l in data) jQuery('#custom_domains_list_tbl tr:last').after('<tr class="lang_domain_row"><td>'+l+'</td><td>'+data[l]+'</td></tr>'); jQuery('.custom_domains_list').show(); }, error: function(e) { alert('Something strange happened, please try again later.'); jQuery('#custom_domains').prop('checked', false); RefreshDoWidgetCode(); jQuery('#custom_domains_status_sync').hide(); jQuery('.custom_domains_list').hide(); } }); } function RefreshDoWidgetCode() { var widget_look = jQuery('#widget_look').val(); var switcher_horizontal_position = jQuery('#floating_language_selector').val().split('_').pop(); var switcher_vertical_position = jQuery('#floating_language_selector').val().split('_').shift(); var horizontal_position = jQuery('#floating_language_selector').val().split('_').pop(); var vertical_position = jQuery('#floating_language_selector').val().split('_').shift(); var float_switcher_open_direction = jQuery('#float_switcher_open_direction').val(); var switcher_open_direction = jQuery('#switcher_open_direction').val(); var default_language = jQuery('#default_language').val(); var native_language_names = jQuery('#native_language_names').prop('checked'); var detect_browser_language = jQuery('#detect_browser_language').prop('checked'); var add_new_line = jQuery('#add_new_line').prop('checked'); var select_language_label = jQuery('#select_language_label').val(); var flag_size = parseInt(jQuery('#flag_size').val()); var flag_style = jQuery('#flag_style').val(); var globe_size = parseInt(jQuery('#globe_size').val()); var globe_color = jQuery('#globe_color').val(); var pro_version = jQuery('#pro_version').prop('checked'); var enterprise_version = jQuery('#enterprise_version').prop('checked'); var url_structure = 'none'; if(pro_version) url_structure = 'sub_directory'; else if(enterprise_version) url_structure = 'sub_domain'; var wrapper_selector = jQuery('#wrapper_selector').val(); var dropdown_languages = jQuery('input[name="incl_langs[]"]:checked').map(function(){return jQuery(this).val()}).get(); var languages = jQuery('input[name="fincl_langs[]"]:checked').map(function(){return jQuery(this).val()}).get(); if(widget_look == 'dropdown' || widget_look == 'globe' || widget_look == 'lang_names' || widget_look == 'lang_codes') languages = dropdown_languages; var custom_domains = jQuery('#custom_domains:checked').length > 0 ? true : false; var custom_domains_data = JSON.parse(jQuery('#custom_domains_data').val()||'{}'); var enable_cdn = jQuery('#enable_cdn:checked').length > 0 ? true : false; var show_in_menu = jQuery('#show_in_menu').val(); var floating_language_selector = jQuery('#floating_language_selector').val(); var email_translation = jQuery('#email_translation').prop('checked'); var switcher_text_color = jQuery('#switcher_text_color').val(); var switcher_arrow_color = jQuery('#switcher_arrow_color').val(); var switcher_border_color = jQuery('#switcher_border_color').val(); var switcher_background_color = jQuery('#switcher_background_color').val(); var switcher_background_shadow_color = jQuery('#switcher_background_shadow_color').val(); var switcher_background_hover_color = jQuery('#switcher_background_hover_color').val(); var dropdown_text_color = jQuery('#dropdown_text_color').val(); var dropdown_hover_color = jQuery('#dropdown_hover_color').val(); var dropdown_background_color = jQuery('#dropdown_background_color').val(); var alt_flags = {}; jQuery('input[name="alt_flags[]"]:checked').map(function(){return jQuery(this).val()}).get().forEach(function(country_code) { switch(country_code) { case 'us': alt_flags['en'] = 'usa'; break; case 'ca': alt_flags['en'] = 'canada'; break; case 'br': alt_flags['pt'] = 'brazil'; break; case 'mx': alt_flags['es'] = 'mexico'; break; case 'ar': alt_flags['es'] = 'argentina'; break; case 'co': alt_flags['es'] = 'colombia'; break; case 'qc': alt_flags['fr'] = 'quebec'; break; default: break; } }); var custom_css = jQuery('#custom_css').val(); var gt_settings = { default_language: default_language, url_structure: url_structure, switcher_horizontal_position: 'inline', horizontal_position: 'inline', float_switcher_open_direction: float_switcher_open_direction, switcher_open_direction: switcher_open_direction, native_language_names: native_language_names, add_new_line: add_new_line, select_language_label: select_language_label, flag_size: flag_size, flag_style: flag_style, globe_size: globe_size, globe_color: globe_color, languages: languages, dropdown_languages: dropdown_languages, custom_domains: custom_domains ? custom_domains_data : null, alt_flags: alt_flags, switcher_text_color: switcher_text_color, switcher_arrow_color: switcher_arrow_color, switcher_border_color: switcher_border_color, switcher_background_color: switcher_background_color, switcher_background_shadow_color: switcher_background_shadow_color, switcher_background_hover_color: switcher_background_hover_color, dropdown_text_color: dropdown_text_color, dropdown_hover_color: dropdown_hover_color, dropdown_background_color: dropdown_background_color, custom_css: custom_css, }; // disable loading on hover window.gt_translate_script = true; // make sure default language is on if(widget_look == 'flags_dropdown' || widget_look == 'float' || widget_look == 'dropdown_with_flags' || widget_look == 'flags' || widget_look == 'flags_name' || widget_look == 'flags_code' || widget_look == 'popup') jQuery('#fincl_langs'+default_language).prop('checked', true); if(widget_look == 'dropdown' || widget_look == 'globe' || widget_look == 'lang_names' || widget_look == 'lang_codes') jQuery('#incl_langs'+default_language).prop('checked', true); if(pro_version || enterprise_version) { if(enterprise_version) { jQuery('#custom_domains_option').show(); if(custom_domains) jQuery('.custom_domains_list').show(); else jQuery('.custom_domains_list').hide(); } else { jQuery('#custom_domains_option').hide(); jQuery('.custom_domains_list').hide(); } jQuery('#url_translation_option').show(); jQuery('#hreflang_tags_option').show(); jQuery('#email_translation_option').show(); if(email_translation) jQuery('#email_translation_debug_option').show(); else jQuery('#email_translation_debug_option').hide(); } else { jQuery('#custom_domains_option').hide(); jQuery('#url_translation_option').hide(); jQuery('#hreflang_tags_option').hide(); jQuery('#email_translation_option').hide(); jQuery('#email_translation_debug_option').hide(); } if(widget_look == 'dropdown' || widget_look == 'flags_dropdown' || widget_look == 'globe' || widget_look == 'lang_names' || widget_look == 'lang_codes') { jQuery('#dropdown_languages_option').show(); } else { jQuery('#dropdown_languages_option').hide(); } if(widget_look == 'globe') { jQuery('#alternative_flags_option').show(); } else { jQuery('#alternative_flags_option').hide(); } if(widget_look == 'flags' || widget_look == 'flags_dropdown' || widget_look == 'float' || widget_look == 'dropdown_with_flags' || widget_look == 'flags_name' || widget_look == 'flags_code' || widget_look == 'popup') { jQuery('#flag_languages_option').show(); jQuery('#alternative_flags_option').show(); } else { jQuery('#flag_languages_option').hide(); if(widget_look != 'globe') jQuery('#alternative_flags_option').hide(); } if(widget_look == 'flags_dropdown') { jQuery('#line_break_option').show(); } else { jQuery('#line_break_option').hide(); } if(widget_look == 'dropdown' || widget_look == 'lang_names' || widget_look == 'lang_codes' || widget_look == 'globe') { jQuery('#flag_style_option').hide(); if(widget_look == 'globe') jQuery('#flag_size_option').show(); else jQuery('#flag_size_option').hide(); } else { jQuery('#flag_style_option').show(); if(widget_look == 'float') jQuery('#flag_size_option').hide(); else jQuery('#flag_size_option').show(); } if(widget_look == 'dropdown_with_flags') { jQuery('.switcher_color_options').show(); jQuery('#switcher_open_direction_option').show(); } else { jQuery('.switcher_color_options').hide(); jQuery('#switcher_open_direction_option').hide(); } if(widget_look == 'globe') { jQuery('#globe_size_option').show(); jQuery('.globe_color_options').show(); } else { jQuery('#globe_size_option').hide(); jQuery('.globe_color_options').hide(); } if(widget_look == 'dropdown') { jQuery('#select_language_label_option').show(); } else { jQuery('#select_language_label_option').hide(); } if(widget_look == 'float') { jQuery('#float_switcher_open_direction_option').show(); } else { jQuery('#float_switcher_open_direction_option').hide(); } var init_widget_code = '<div class="gtranslate_wrapper"></div>'; init_widget_code += '<script>window.gtranslateSettings = ' + JSON.stringify(gt_settings) + '<\/script>'; var widget_short_name = widget_look.split('_').map(function(el){return el.charAt(0)}).join(''); var widgets_location = '$wp_plugin_url/js/'; if(widget_short_name.length == 1) widget_short_name = widget_look; init_widget_code += '<script src="'+widgets_location+widget_short_name+'.js" defer><\/script>'; jQuery('html').attr('lang', gt_settings.default_language); ShowWidgetPreview(init_widget_code); } function ShowWidgetPreview(widget_preview) { jQuery('#widget_preview').html(''); jQuery('style.gtranslate_css').remove(); jQuery('#widget_preview').html(widget_preview); setTimeout(function(){ jQuery('a[data-gt-lang]').attr('onclick', 'return false;'); jQuery('select.gt_selector option').removeAttr('data-gt-href'); }, 1000); } jQuery('#pro_version').attr('checked', '$pro_version'.length > 0); jQuery('#enterprise_version').attr('checked', '$enterprise_version'.length > 0); jQuery('#custom_domains').attr('checked', '$custom_domains'.length > 0); jQuery('#url_translation').attr('checked', '$url_translation'.length > 0); jQuery('#add_hreflang_tags').attr('checked', '$add_hreflang_tags'.length > 0); jQuery('#email_translation').attr('checked', '$email_translation'.length > 0); jQuery('#email_translation_debug').attr('checked', '$email_translation_debug'.length > 0); jQuery('#enable_cdn').attr('checked', '$enable_cdn'.length > 0); jQuery('#select_language_label').val('$select_language_label'); jQuery('#wrapper_selector').val('$wrapper_selector'); jQuery('#show_in_menu').val('$show_in_menu'); jQuery('#floating_language_selector').val('$floating_language_selector'); jQuery('#float_switcher_open_direction').val('$float_switcher_open_direction'); jQuery('#switcher_open_direction').val('$switcher_open_direction'); jQuery('#native_language_names').attr('checked', '$native_language_names'.length > 0); jQuery('#detect_browser_language').attr('checked', '$detect_browser_language'.length > 0); jQuery('#add_new_line').attr('checked', '$add_new_line'.length > 0); jQuery('#default_language').val('$default_language'); jQuery('#widget_look').val('$widget_look'); jQuery('#flag_size').val('$flag_size'); jQuery('#flag_style').val('$flag_style'); jQuery('#switcher_text_color').val('$switcher_text_color'); jQuery('#switcher_arrow_color').val('$switcher_arrow_color'); jQuery('#switcher_border_color').val('$switcher_border_color'); jQuery('#switcher_background_color').val('$switcher_background_color'); jQuery('#switcher_background_shadow_color').val('$switcher_background_shadow_color'); jQuery('#switcher_background_hover_color').val('$switcher_background_hover_color'); jQuery('#dropdown_text_color').val('$dropdown_text_color'); jQuery('#dropdown_hover_color').val('$dropdown_hover_color'); jQuery('#dropdown_background_color').val('$dropdown_background_color'); jQuery('#globe_size').val('$globe_size'); jQuery('#globe_color').val('$globe_color'); if(jQuery('#pro_version:checked').length || jQuery('#enterprise_version:checked').length) { if(jQuery('#enterprise_version:checked').length) { jQuery('#custom_domains_option').show(); if(jQuery('#custom_domains:checked').length) jQuery('.custom_domains_list').show(); else jQuery('.custom_domains_list').hide(); } else { jQuery('#custom_domains_option').hide(); jQuery('.custom_domains_list').hide(); } jQuery('#url_translation_option').show(); jQuery('#hreflang_tags_option').show(); jQuery('#email_translation_option').show(); if(jQuery('#email_translation:checked').length) jQuery('#email_translation_debug_option').show(); else jQuery('#email_translation_debug_option').hide(); } if('$widget_look' == 'dropdown' || '$widget_look' == 'flags_dropdown' || '$widget_look' == 'globe' || '$widget_look' == 'lang_names' || '$widget_look' == 'lang_codes') { jQuery('#dropdown_languages_option').show(); } else { jQuery('#dropdown_languages_option').hide(); } if('$widget_look' == 'dropdown_with_flags') { jQuery('.switcher_color_options').show(); jQuery('#switcher_open_direction_option').show(); } else { jQuery('.switcher_color_options').hide(); jQuery('#switcher_open_direction_option').hide(); } if('$widget_look' == 'float') { jQuery('#float_switcher_open_direction_option').show(); } else { jQuery('#float_switcher_open_direction_option').hide(); } if('$widget_look' == 'globe') { jQuery('#alternative_flags_option').show(); jQuery('#globe_size_option').show(); jQuery('.globe_color_options').show(); } else { jQuery('#alternative_flags_option').hide(); jQuery('#globe_size_option').hide(); jQuery('.globe_color_options').hide(); } if('$widget_look' == 'flags' || '$widget_look' == 'flags_dropdown' || '$widget_look' == 'float' || '$widget_look' == 'dropdown_with_flags' || '$widget_look' == 'flags_name' || '$widget_look' == 'flags_code' || '$widget_look' == 'popup') { jQuery('#flag_languages_option').show(); jQuery('#alternative_flags_option').show(); } else { jQuery('#flag_languages_option').hide(); if('$widget_look' != 'globe') jQuery('#alternative_flags_option').hide(); } if('$widget_look' == 'flags_dropdown') { jQuery('#line_break_option').show(); } else { jQuery('#line_break_option').hide(); } if('$widget_look' == 'dropdown' || '$widget_look' == 'lang_names' || '$widget_look' == 'lang_codes' || '$widget_look' == 'globe') { jQuery('#flag_size_option,#flag_style_option').hide(); } else { jQuery('#flag_style_option').show(); if('$widget_look' == 'float') jQuery('#flag_size_option').hide(); else jQuery('#flag_size_option').show(); } if('$widget_look' == 'dropdown') { jQuery('#select_language_label_option').show(); } else { jQuery('#select_language_label_option').hide(); } jQuery(function(){ jQuery(".connectedSortable1").sortable({connectWith: ".connectedSortable1"}).disableSelection(); jQuery(".connectedSortable2").sortable({connectWith: ".connectedSortable2"}).disableSelection(); jQuery(".connectedSortable1").on("sortstop", function(event, ui) { language_codes = jQuery(".connectedSortable1 li input").map(function() {return jQuery(this).val();}).toArray(); jQuery('#language_codes_order').val(language_codes.join(',')); RefreshDoWidgetCode(); }); jQuery(".connectedSortable2").on("sortstop", function(event, ui) { language_codes2 = jQuery(".connectedSortable2 li input").map(function() {return jQuery(this).val();}).toArray(); jQuery('#language_codes_order2').val(language_codes2.join(',')); RefreshDoWidgetCode(); }); }); function light_color_scheme() { jQuery('#switcher_text_color').iris('color', '#666'); jQuery('#switcher_arrow_color').iris('color', '#666'); jQuery('#switcher_border_color').iris('color', '#ccc'); jQuery('#switcher_background_color').iris('color', '#fff'); jQuery('#switcher_background_shadow_color').iris('color', '#efefef'); jQuery('#switcher_background_hover_color').iris('color', '#f0f0f0'); jQuery('#dropdown_text_color').iris('color', '#000'); jQuery('#dropdown_hover_color').iris('color', '#fff'); jQuery('#dropdown_background_color').iris('color', '#eee'); return false; } function dark_color_scheme() { jQuery('#switcher_text_color').iris('color', '#f7f7f7'); jQuery('#switcher_arrow_color').iris('color', '#f2f2f2'); jQuery('#switcher_border_color').iris('color', '#161616'); jQuery('#switcher_background_color').iris('color', '#303030'); jQuery('#switcher_background_shadow_color').iris('color', '#474747'); jQuery('#switcher_background_hover_color').iris('color', '#3a3a3a'); jQuery('#dropdown_text_color').iris('color', '#eaeaea'); jQuery('#dropdown_hover_color').iris('color', '#748393'); jQuery('#dropdown_background_color').iris('color', '#474747'); return false; } EOT; // selected languages if(count($fincl_langs) > 0) $script .= "jQuery.each(languages, function(i, val) {jQuery('#fincl_langs'+language_codes[i]).attr('checked', false);});\n"; if(count($incl_langs) > 0) $script .= "jQuery.each(languages, function(i, val) {jQuery('#incl_langs'+language_codes2[i]).attr('checked', false);});\n"; foreach($fincl_langs as $lang) $script .= "jQuery('#fincl_langs$lang').attr('checked', true);\n"; foreach($incl_langs as $lang) $script .= "jQuery('#incl_langs$lang').attr('checked', true);\n"; // alt flags foreach($alt_flags as $flag) $script .= "jQuery('#alt_$flag').attr('checked', true);\n"; $script .= <<<EOT RefreshDoWidgetCode(); EOT; ?> <form id="gtranslate" name="form1" method="post" class="notranslate" action="<?php echo admin_url('options-general.php?page=gtranslate_options'); ?>"> <div class="postbox-container og_left_col"> <div id="poststuff"> <div class="postbox"> <h3 id="settings"><?php _e('Widget options', 'gtranslate'); ?></h3> <div class="inside"> <table style="width:100%;" cellpadding="4"> <tr> <td class="option_name"><?php _e('Widget look', 'gtranslate'); ?>:</td> <td> <select id="widget_look" name="widget_look" onChange="RefreshDoWidgetCode()"> <option value="float"><?php _e('Float', 'gtranslate'); ?></option> <option value="dropdown_with_flags"><?php _e('Nice dropdown with flags', 'gtranslate'); ?></option> <option value="popup"><?php _e('Popup', 'gtranslate'); ?></option> <option value="dropdown"><?php _e('Dropdown', 'gtranslate'); ?></option> <option value="flags"><?php _e('Flags', 'gtranslate'); ?></option> <option value="flags_dropdown"><?php _e('Flags and dropdown', 'gtranslate'); ?></option> <option value="flags_name"><?php _e('Flags with language name', 'gtranslate'); ?></option> <option value="flags_code"><?php _e('Flags with language code', 'gtranslate'); ?></option> <option value="lang_names"><?php _e('Language names', 'gtranslate'); ?></option> <option value="lang_codes"><?php _e('Language codes', 'gtranslate'); ?></option> <option value="globe"><?php _e('Globe', 'gtranslate'); ?></option> </select> </td> </tr> <tr> <td class="option_name"><?php _e('Translate from', 'gtranslate'); ?>:</td> <td> <select id="default_language" name="default_language" onChange="RefreshDoWidgetCode()"> <option value="af"><?php _e('Afrikaans', 'gtranslate'); ?></option> <option value="sq"><?php _e('Albanian', 'gtranslate'); ?></option> <option value="am"><?php _e('Amharic', 'gtranslate'); ?></option> <option value="ar"><?php _e('Arabic', 'gtranslate'); ?></option> <option value="hy"><?php _e('Armenian', 'gtranslate'); ?></option> <option value="az"><?php _e('Azerbaijani', 'gtranslate'); ?></option> <option value="eu"><?php _e('Basque', 'gtranslate'); ?></option> <option value="be"><?php _e('Belarusian', 'gtranslate'); ?></option> <option value="bn"><?php _e('Bengali', 'gtranslate'); ?></option> <option value="bs"><?php _e('Bosnian', 'gtranslate'); ?></option> <option value="bg"><?php _e('Bulgarian', 'gtranslate'); ?></option> <option value="ca"><?php _e('Catalan', 'gtranslate'); ?></option> <option value="ceb"><?php _e('Cebuano', 'gtranslate'); ?></option> <option value="ny"><?php _e('Chichewa', 'gtranslate'); ?></option> <option value="zh-CN"><?php _e('Chinese (Simplified)', 'gtranslate'); ?></option> <option value="zh-TW"><?php _e('Chinese (Traditional)', 'gtranslate'); ?></option> <option value="co"><?php _e('Corsican', 'gtranslate'); ?></option> <option value="hr"><?php _e('Croatian', 'gtranslate'); ?></option> <option value="cs"><?php _e('Czech', 'gtranslate'); ?></option> <option value="da"><?php _e('Danish', 'gtranslate'); ?></option> <option value="nl"><?php _e('Dutch', 'gtranslate'); ?></option> <option value="en" selected="selected"><?php _e('English', 'gtranslate'); ?></option> <option value="eo"><?php _e('Esperanto', 'gtranslate'); ?></option> <option value="et"><?php _e('Estonian', 'gtranslate'); ?></option> <option value="tl"><?php _e('Filipino', 'gtranslate'); ?></option> <option value="fi"><?php _e('Finnish', 'gtranslate'); ?></option> <option value="fr"><?php _e('French', 'gtranslate'); ?></option> <option value="fy"><?php _e('Frisian', 'gtranslate'); ?></option> <option value="gl"><?php _e('Galician', 'gtranslate'); ?></option> <option value="ka"><?php _e('Georgian', 'gtranslate'); ?></option> <option value="de"><?php _e('German', 'gtranslate'); ?></option> <option value="el"><?php _e('Greek', 'gtranslate'); ?></option> <option value="gu"><?php _e('Gujarati', 'gtranslate'); ?></option> <option value="ht"><?php _e('Haitian Creole', 'gtranslate'); ?></option> <option value="ha"><?php _e('Hausa', 'gtranslate'); ?></option> <option value="haw"><?php _e('Hawaiian', 'gtranslate'); ?></option> <option value="iw"><?php _e('Hebrew', 'gtranslate'); ?></option> <option value="hi"><?php _e('Hindi', 'gtranslate'); ?></option> <option value="hmn"><?php _e('Hmong', 'gtranslate'); ?></option> <option value="hu"><?php _e('Hungarian', 'gtranslate'); ?></option> <option value="is"><?php _e('Icelandic', 'gtranslate'); ?></option> <option value="ig"><?php _e('Igbo', 'gtranslate'); ?></option> <option value="id"><?php _e('Indonesian', 'gtranslate'); ?></option> <option value="ga"><?php _e('Irish', 'gtranslate'); ?></option> <option value="it"><?php _e('Italian', 'gtranslate'); ?></option> <option value="ja"><?php _e('Japanese', 'gtranslate'); ?></option> <option value="jw"><?php _e('Javanese', 'gtranslate'); ?></option> <option value="kn"><?php _e('Kannada', 'gtranslate'); ?></option> <option value="kk"><?php _e('Kazakh', 'gtranslate'); ?></option> <option value="km"><?php _e('Khmer', 'gtranslate'); ?></option> <option value="ko"><?php _e('Korean', 'gtranslate'); ?></option> <option value="ku"><?php _e('Kurdish (Kurmanji)', 'gtranslate'); ?></option> <option value="ky"><?php _e('Kyrgyz', 'gtranslate'); ?></option> <option value="lo"><?php _e('Lao', 'gtranslate'); ?></option> <option value="la"><?php _e('Latin', 'gtranslate'); ?></option> <option value="lv"><?php _e('Latvian', 'gtranslate'); ?></option> <option value="lt"><?php _e('Lithuanian', 'gtranslate'); ?></option> <option value="lb"><?php _e('Luxembourgish', 'gtranslate'); ?></option> <option value="mk"><?php _e('Macedonian', 'gtranslate'); ?></option> <option value="mg"><?php _e('Malagasy', 'gtranslate'); ?></option> <option value="ms"><?php _e('Malay', 'gtranslate'); ?></option> <option value="ml"><?php _e('Malayalam', 'gtranslate'); ?></option> <option value="mt"><?php _e('Maltese', 'gtranslate'); ?></option> <option value="mi"><?php _e('Maori', 'gtranslate'); ?></option> <option value="mr"><?php _e('Marathi', 'gtranslate'); ?></option> <option value="mn"><?php _e('Mongolian', 'gtranslate'); ?></option> <option value="my"><?php _e('Myanmar (Burmese)', 'gtranslate'); ?></option> <option value="ne"><?php _e('Nepali', 'gtranslate'); ?></option> <option value="no"><?php _e('Norwegian', 'gtranslate'); ?></option> <option value="ps"><?php _e('Pashto', 'gtranslate'); ?></option> <option value="fa"><?php _e('Persian', 'gtranslate'); ?></option> <option value="pl"><?php _e('Polish', 'gtranslate'); ?></option> <option value="pt"><?php _e('Portuguese', 'gtranslate'); ?></option> <option value="pa"><?php _e('Punjabi', 'gtranslate'); ?></option> <option value="ro"><?php _e('Romanian', 'gtranslate'); ?></option> <option value="ru"><?php _e('Russian', 'gtranslate'); ?></option> <option value="sm"><?php _e('Samoan', 'gtranslate'); ?></option> <option value="gd"><?php _e('Scottish Gaelic', 'gtranslate'); ?></option> <option value="sr"><?php _e('Serbian', 'gtranslate'); ?></option> <option value="st"><?php _e('Sesotho', 'gtranslate'); ?></option> <option value="sn"><?php _e('Shona', 'gtranslate'); ?></option> <option value="sd"><?php _e('Sindhi', 'gtranslate'); ?></option> <option value="si"><?php _e('Sinhala', 'gtranslate'); ?></option> <option value="sk"><?php _e('Slovak', 'gtranslate'); ?></option> <option value="sl"><?php _e('Slovenian', 'gtranslate'); ?></option> <option value="so"><?php _e('Somali', 'gtranslate'); ?></option> <option value="es"><?php _e('Spanish', 'gtranslate'); ?></option> <option value="su"><?php _e('Sundanese', 'gtranslate'); ?></option> <option value="sw"><?php _e('Swahili', 'gtranslate'); ?></option> <option value="sv"><?php _e('Swedish', 'gtranslate'); ?></option> <option value="tg"><?php _e('Tajik', 'gtranslate'); ?></option> <option value="ta"><?php _e('Tamil', 'gtranslate'); ?></option> <option value="te"><?php _e('Telugu', 'gtranslate'); ?></option> <option value="th"><?php _e('Thai', 'gtranslate'); ?></option> <option value="tr"><?php _e('Turkish', 'gtranslate'); ?></option> <option value="uk"><?php _e('Ukrainian', 'gtranslate'); ?></option> <option value="ur"><?php _e('Urdu', 'gtranslate'); ?></option> <option value="uz"><?php _e('Uzbek', 'gtranslate'); ?></option> <option value="vi"><?php _e('Vietnamese', 'gtranslate'); ?></option> <option value="cy"><?php _e('Welsh', 'gtranslate'); ?></option> <option value="xh"><?php _e('Xhosa', 'gtranslate'); ?></option> <option value="yi"><?php _e('Yiddish', 'gtranslate'); ?></option> <option value="yo"><?php _e('Yoruba', 'gtranslate'); ?></option> <option value="zu"><?php _e('Zulu', 'gtranslate'); ?></option> </select> </td> </tr> <tr> <td class="option_name">* <?php _e('Sub-directory URL structure', 'gtranslate'); ?>:<br><code><small>http://example.com/<b>ru</b>/</small></code></td> <td><input id="pro_version" name="pro_version" value="1" type="checkbox" onclick="if(jQuery('#pro_version').is(':checked') && jQuery('#enterprise_version').is(':checked'))jQuery('#enterprise_version').prop('checked', false);RefreshDoWidgetCode()" onchange="RefreshDoWidgetCode()"/> <a href="https://gtranslate.io/?xyz=998#pricing" target="_blank" title="If you already have a subscription, you can enable this." rel="noreferrer">* <?php _e('for paid plans only', 'gtranslate'); ?></a></td> </tr> <tr> <td class="option_name">* <?php _e('Sub-domain URL structure', 'gtranslate'); ?>:<br><code><small>http://<b>es</b>.example.com/</small></code></td> <td><input id="enterprise_version" name="enterprise_version" value="1" type="checkbox" onclick="if(jQuery('#pro_version').is(':checked') && jQuery('#enterprise_version').is(':checked'))jQuery('#pro_version').prop('checked', false);RefreshDoWidgetCode()" onchange="RefreshDoWidgetCode()"/> <a href="https://gtranslate.io/?xyz=998#pricing" target="_blank" title="If you already have a subscription, you can enable this." rel="noreferrer">* <?php _e('for paid plans only', 'gtranslate'); ?></a></td> </tr> <tr id="custom_domains_option" style="display:none;"> <td class="option_name"><?php _e('Custom domains', 'gtranslate'); ?>:<br><code><small>http://example.<b>es</b>/</small></code></td> <td><input id="custom_domains" name="custom_domains" value="1" type="checkbox" onclick="if(jQuery('#custom_domains').is(':checked'))SyncCustomDomains();RefreshDoWidgetCode()" onchange="RefreshDoWidgetCode()"/> <span id="custom_domains_status_sync" style="display:none;"><span class="dashicons dashicons-update gt-icon-spin"></span> <?php _e('Synchronizing...', 'gtranslate'); ?></span> <input type="hidden" id="custom_domains_data" name="custom_domains_data" value="<?php echo esc_attr(stripslashes($data['custom_domains_data'])); ?>"></td> </tr> <tr id="url_translation_option" style="display:none;"> <td class="option_name"><?php _e('Enable URL Translation', 'gtranslate'); ?>:</td> <td><input id="url_translation" name="url_translation" value="1" type="checkbox"/></td> </tr> <tr id="hreflang_tags_option" style="display:none;"> <td class="option_name"><?php _e('Add hreflang tags', 'gtranslate'); ?>:</td> <td><input id="add_hreflang_tags" name="add_hreflang_tags" value="1" type="checkbox"/></td> </tr> <tr id="email_translation_option" style="display:none;"> <td class="option_name"><?php _e('Enable WooCommerce Email Translation', 'gtranslate'); ?>:</td> <td><input id="email_translation" name="email_translation" value="1" type="checkbox"/></td> </tr> <tr id="email_translation_debug_option" style="display:none;"> <td class="option_name"><?php _e('Debug Email Translation', 'gtranslate'); ?>:</td> <td><input id="email_translation_debug" name="email_translation_debug" value="1" type="checkbox"/></td> </tr> <tr> <td class="option_name"><?php _e('Native language names', 'gtranslate'); ?>:</td> <td><input id="native_language_names" name="native_language_names" value="1" type="checkbox" onclick="RefreshDoWidgetCode()" onchange="RefreshDoWidgetCode()"/></td> </tr> <tr> <td class="option_name"><?php _e('Auto switch to browser language', 'gtranslate'); ?>:</td> <td><input id="detect_browser_language" name="detect_browser_language" value="1" type="checkbox"/></td> </tr> <tr> <td class="option_name"><?php _e('Enable CDN', 'gtranslate'); ?>:</td> <td><input id="enable_cdn" name="enable_cdn" value="1" type="checkbox" onclick="RefreshDoWidgetCode()" onchange="RefreshDoWidgetCode()"/></td> </tr> <tr id="select_language_label_option" style="display:none"> <td class="option_name"><?php _e('Select language label', 'gtranslate'); ?>:</td> <td><input id="select_language_label" name="select_language_label" type="text" onchange="RefreshDoWidgetCode()"/></td> </tr> <tr> <td class="option_name"><?php _e('Show in menu', 'gtranslate'); ?>: <a href="#TB_inline?width=700&height=150&inlineId=show-in-menu-option-description" title="<?php echo esc_attr(translate('Learn more', 'gtranslate')); ?>" class="thickbox" style="text-decoration:none"><span class="dashicons dashicons-editor-help"></span></a><div id="show-in-menu-option-description" style="display:none"><p><?php _e('Show in menu option is best for <b>Flags</b>, <b>Flags with language name</b>, <b>Flags with language code</b>, <b>Language names</b>, <b>Language codes</b> widget looks.', 'gtranslate'); ?></p><p><?php _e('Other looks most likely will require additional CSS rules to match your theme design.', 'gtranslate'); ?></p></div></td> <td> <select id="show_in_menu" name="show_in_menu"> <option value="" selected> - <?php _e('None', 'gtranslate'); ?> - </option> <?php $menus = get_registered_nav_menus(); ?> <?php foreach($menus as $location => $description): ?> <option value="<?php echo $location; ?>"><?php echo $description; ?></option> <?php endforeach; ?> </select> </td> </tr> <tr> <td class="option_name"><?php _e('Show floating language selector', 'gtranslate'); ?>: <a href="#TB_inline?width=700&height=150&inlineId=show-floating-language-selector-option-description" title="<?php echo esc_attr(translate('Learn more', 'gtranslate')); ?>" class="thickbox" style="text-decoration:none"><span class="dashicons dashicons-editor-help"></span></a><div id="show-floating-language-selector-option-description" style="display:none"><p><?php _e('Show floating language selector option is the easiest and suitable for most websites. It is best for <b>Float</b>, <b>Nice dropdown with flags</b>, <b>Popup</b>, <b>Globe</b> widget looks.', 'gtranslate'); ?></p></div></td> <td> <select id="floating_language_selector" name="floating_language_selector"> <option value="no"><?php _e('No', 'gtranslate'); ?></option> <option value="bottom_left"><?php _e('Bottom left', 'gtranslate'); ?></option> <option value="bottom_right"><?php _e('Bottom right', 'gtranslate'); ?></option> <option value="top_left"><?php _e('Top left', 'gtranslate'); ?></option> <option value="top_right"><?php _e('Top right', 'gtranslate'); ?></option> </select> </td> </tr> <tr> <td class="option_name"><?php _e('Wrapper selector CSS', 'gtranslate'); ?>: <a href="#TB_inline?width=700&height=170&inlineId=wrapper-selector-option-description" title="<?php echo esc_attr(translate('Learn more', 'gtranslate')); ?>" class="thickbox" style="text-decoration:none"><span class="dashicons dashicons-editor-help"></span></a><div id="wrapper-selector-option-description" style="display:none"><p><?php _e('If you want the language selector to appear inside a particular HTML element on your page then this option is for you. You simply need to write a CSS selector to point to that HTML element and GTranslate will appear inside of it.', 'gtranslate'); ?></p><p><?php _e('If you are not using this option make sure it is empty or has the default value to not have additional unused code on your front-end. Default value for Wrapper Selector is <code>.gtranslate_wrapper</code>', 'gtranslate'); ?></p></div></td> <td><input id="wrapper_selector" name="wrapper_selector" type="text" placeholder=".gtranslate_wrapper" onchange="RefreshDoWidgetCode()"/></td> </tr> <tr id="float_switcher_open_direction_option" style="display:none"> <td class="option_name"><?php _e('Open direction', 'gtranslate'); ?>:</td> <td> <select id="float_switcher_open_direction" name="float_switcher_open_direction" onchange="RefreshDoWidgetCode()"> <option value="left"><?php _e('Left', 'gtranslate'); ?></option> <option value="right"><?php _e('Right', 'gtranslate'); ?></option> <option value="top"><?php _e('Top', 'gtranslate'); ?></option> <option value="bottom"><?php _e('Bottom', 'gtranslate'); ?></option> </select> </td> </tr> <tr id="switcher_open_direction_option" style="display:none"> <td class="option_name"><?php _e('Open direction', 'gtranslate'); ?>:</td> <td> <select id="switcher_open_direction" name="switcher_open_direction" onchange="RefreshDoWidgetCode()"> <option value="top"><?php _e('Top', 'gtranslate'); ?></option> <option value="bottom"><?php _e('Bottom', 'gtranslate'); ?></option> </select> </td> </tr> <tr id="flag_size_option"> <td class="option_name"><?php _e('Flag size', 'gtranslate'); ?>:</td> <td> <select id="flag_size" name="flag_size" onchange="RefreshDoWidgetCode()"> <option value="16" selected>16px</option> <option value="24">24px</option> <option value="32">32px</option> <option value="48">48px</option> </select> </td> </tr> <tr id="flag_style_option"> <td class="option_name"><?php _e('Flag style', 'gtranslate'); ?>:</td> <td> <select id="flag_style" name="flag_style" onchange="RefreshDoWidgetCode()"> <option value="3d">3D (.png)</option> <option value="2d">2D (.svg)</option> </select> </td> </tr> <tr id="globe_size_option"> <td class="option_name"><?php _e('Globe size', 'gtranslate'); ?>:</td> <td> <select id="globe_size" name="globe_size" onchange="RefreshDoWidgetCode()"> <option value="20">20px</option> <option value="40">40px</option> <option value="60">60px</option> </select> </td> </tr> <tr id="flag_languages_option" style="display:none;"> <td class="option_name" colspan="2"><div><?php _e('Flag languages', 'gtranslate'); ?>: <a onclick="jQuery('.connectedSortable1 input').attr('checked', true);RefreshDoWidgetCode()" style="cursor:pointer;text-decoration:underline;"><?php _e('Check All', 'gtranslate'); ?></a> | <a onclick="jQuery('.connectedSortable1 input').attr('checked', false);RefreshDoWidgetCode()" style="cursor:pointer;text-decoration:underline;"><?php _e('Uncheck All', 'gtranslate'); ?></a> <span style="float:right;"><b>HINT</b>: To reorder the languages simply drag and drop them in the list below.</span></div><br /> <div> <?php $gt_lang_codes = explode(',', $language_codes); ?> <?php for($i = 0; $i < count($gt_lang_array) / 26; $i++): ?> <ul style="list-style-type:none;width:25%;float:left;" class="connectedSortable1"> <?php for($j = $i * 26; $j < 26 * ($i+1); $j++): ?> <?php if(isset($gt_lang_codes[$j])): ?> <li><input type="checkbox" onclick="RefreshDoWidgetCode()" onchange="RefreshDoWidgetCode()" id="fincl_langs<?php echo $gt_lang_codes[$j]; ?>" name="fincl_langs[]" value="<?php echo $gt_lang_codes[$j]; ?>"><label for="fincl_langs<?php echo $gt_lang_codes[$j]; ?>"><span class="en_names"><?php _e($gt_lang_array[$gt_lang_codes[$j]], 'gtranslate'); ?></span></label></li> <?php endif; ?> <?php endfor; ?> </ul> <?php endfor; ?> </div> </td> </tr> <tr id="line_break_option" style="display:none;"> <td class="option_name"><?php _e('Line break after flags', 'gtranslate'); ?>:</td> <td><input id="add_new_line" name="add_new_line" value="1" type="checkbox" checked="checked" onclick="RefreshDoWidgetCode()" onchange="RefreshDoWidgetCode()"/></td> </tr> <tr id="dropdown_languages_option" style="display:none;"> <td class="option_name" colspan="2"><div><?php _e('Languages', 'gtranslate'); ?>: <a onclick="jQuery('.connectedSortable2 input').attr('checked', true);RefreshDoWidgetCode()" style="cursor:pointer;text-decoration:underline;"><?php _e('Check All', 'gtranslate'); ?></a> | <a onclick="jQuery('.connectedSortable2 input').attr('checked', false);RefreshDoWidgetCode()" style="cursor:pointer;text-decoration:underline;"><?php _e('Uncheck All', 'gtranslate'); ?></a> <span style="float:right;"><b>HINT</b>: To reorder the languages simply drag and drop them in the list below.</span></div><br /> <div> <?php $gt_lang_codes = explode(',', $language_codes2); ?> <?php for($i = 0; $i < count($gt_lang_array) / 26; $i++): ?> <ul style="list-style-type:none;width:25%;float:left;" class="connectedSortable2"> <?php for($j = $i * 26; $j < 26 * ($i+1); $j++): ?> <?php if(isset($gt_lang_codes[$j])): ?> <li><input type="checkbox" onclick="RefreshDoWidgetCode()" onchange="RefreshDoWidgetCode()" id="incl_langs<?php echo $gt_lang_codes[$j]; ?>" name="incl_langs[]" value="<?php echo $gt_lang_codes[$j]; ?>"><label for="incl_langs<?php echo $gt_lang_codes[$j]; ?>"><span class="en_names"><?php _e($gt_lang_array[$gt_lang_codes[$j]], 'gtranslate'); ?></span></label></li> <?php endif; ?> <?php endfor; ?> </ul> <?php endfor; ?> </div> </td> </tr> </table> </div> </div> </div> <div id="poststuff"> <div class="postbox"> <h3 id="settings"><?php _e('Custom CSS', 'gtranslate'); ?> <a href="#TB_inline?width=700&height=170&inlineId=common-customization-tips-description" title="<?php echo esc_attr(translate('Common customizations tips')); ?>" class="thickbox" style="text-decoration:none"><span class="dashicons dashicons-editor-help"></span></a></h3> <div class="inside"> <textarea id="custom_css" name="custom_css" onchange="RefreshDoWidgetCode()" style="font-family:Monospace;font-size:11px;height:150px;width:565px;"><?php echo htmlspecialchars($custom_css, ENT_QUOTES, get_option('blog_charset')); ?></textarea><br /> <div id="common-customization-tips-description" style="display:none"> <p><?php _e('Hide current language:'); ?> <code>a.gt-current-lang{display:none}</code></p> <p><?php _e('Monochrome flags:'); ?> <code>a[data-gt-lang] img{filter:grayscale(1)}</code></p> </div> </div> </div> </div> <input type="hidden" name="switcher_text_color" id="switcher_text_color_hidden" value="<?php echo $switcher_text_color; ?>" /> <input type="hidden" name="switcher_arrow_color" id="switcher_arrow_color_hidden" value="<?php echo $switcher_arrow_color; ?>" /> <input type="hidden" name="switcher_border_color" id="switcher_border_color_hidden" value="<?php echo $switcher_border_color; ?>" /> <input type="hidden" name="switcher_background_color" id="switcher_background_color_hidden" value="<?php echo $switcher_background_color; ?>" /> <input type="hidden" name="switcher_background_shadow_color" id="switcher_background_shadow_color_hidden" value="<?php echo $switcher_background_shadow_color; ?>" /> <input type="hidden" name="switcher_background_hover_color" id="switcher_background_hover_color_hidden" value="<?php echo $switcher_background_hover_color; ?>" /> <input type="hidden" name="dropdown_text_color" id="dropdown_text_color_hidden" value="<?php echo $dropdown_text_color; ?>" /> <input type="hidden" name="dropdown_hover_color" id="dropdown_hover_color_hidden" value="<?php echo $dropdown_hover_color; ?>" /> <input type="hidden" name="dropdown_background_color" id="dropdown_background_color_hidden" value="<?php echo $dropdown_background_color; ?>" /> <input type="hidden" name="globe_color" id="globe_color_hidden" value="<?php echo $globe_color; ?>" /> <div style="display:none"> <input type="checkbox" name="alt_flags[]" id="alt_us_hidden" value="us" <?php if(in_array('us', $alt_flags)) echo 'checked'; ?> /> <input type="checkbox" name="alt_flags[]" id="alt_ca_hidden" value="ca" <?php if(in_array('ca', $alt_flags)) echo 'checked'; ?> /> <input type="checkbox" name="alt_flags[]" id="alt_br_hidden" value="br" <?php if(in_array('br', $alt_flags)) echo 'checked'; ?> /> <input type="checkbox" name="alt_flags[]" id="alt_mx_hidden" value="mx" <?php if(in_array('mx', $alt_flags)) echo 'checked'; ?> /> <input type="checkbox" name="alt_flags[]" id="alt_ar_hidden" value="ar" <?php if(in_array('ar', $alt_flags)) echo 'checked'; ?> /> <input type="checkbox" name="alt_flags[]" id="alt_co_hidden" value="co" <?php if(in_array('co', $alt_flags)) echo 'checked'; ?> /> <input type="checkbox" name="alt_flags[]" id="alt_qc_hidden" value="qc" <?php if(in_array('qc', $alt_flags)) echo 'checked'; ?> /> </div> <input type="hidden" id="language_codes_order" name="language_codes" value="<?php echo $language_codes; ?>" /> <input type="hidden" id="language_codes_order2" name="language_codes2" value="<?php echo $language_codes2; ?>" /> <?php wp_nonce_field('gtranslate-save'); ?> <p class="submit"><input type="submit" class="button-primary" name="save" value="<?php _e('Save Changes'); ?>" /></p> <p style="margin-top:-10px;"><a target="_blank" href="https://wordpress.org/support/plugin/gtranslate/reviews/?filter=5" rel="noreferrer"><?php _e('Love GTranslate? Give us 5 stars on WordPress.org :)', 'gtranslate'); ?></a></p> </div> </form> <div class="postbox-container og_right_col"> <div id="poststuff"> <div class="postbox"> <h3 id="settings"><?php _e('Widget preview', 'gtranslate'); ?></h3> <div class="inside"> <div id="widget_preview"></div> </div> </div> </div> <div id="poststuff" class="custom_domains_list" style="display:none;"> <div class="postbox"> <h3 id="settings"><?php _e('Language hosting', 'gtranslate'); ?></h3> <div class="inside"> <table id="custom_domains_list_tbl" style="width:100%;" cellpadding="0"> <tr> <th><?php _e('Language', 'gtranslate'); ?></th> <th><?php _e('Domain', 'gtranslate'); ?></th> </tr> <?php if(isset($data['custom_domains_data']) and !empty($data['custom_domains_data'])) { $custom_domains_data = json_decode(stripslashes($data['custom_domains_data']), true); if(is_array($custom_domains_data)) foreach($custom_domains_data as $k => $v) echo '<tr class="lang_domain_row"><td>'.esc_html($k).'</td><td>'.esc_html($v).'</td></tr>'; } ?> </table> <br> <input type="button" class="button-secondary" value="Synchronize" onclick="SyncCustomDomains();RefreshDoWidgetCode();" title="<?php esc_attr_e('Synchronize custom domains with GTranslate dashboard: https://my.gtranslate.io', 'gtranslate'); ?>"> </div> </div> </div> <div id="poststuff" class="switcher_color_options" style="display:none"> <div class="postbox"> <h3 id="settings"><?php _e('Color options', 'gtranslate'); ?> ( <a href="#" onclick="return light_color_scheme()">light</a> | <a href="#" onclick="return dark_color_scheme()">dark</a> )</h3> <div class="inside"> <table style="width:100%;" cellpadding="0"> <tr> <td class="option_name"><?php _e('Switcher text color', 'gtranslate'); ?>:</td> <td><input type="text" name="switcher_text_color" id="switcher_text_color" class="color-field" value="#666" data-default-color="#666" /></td> </tr> <tr> <td class="option_name"><?php _e('Switcher arrow color', 'gtranslate'); ?>:</td> <td><input type="text" name="switcher_arrow_color" id="switcher_arrow_color" class="color-field" value="#666" data-default-color="#666" /></td> </tr> <tr> <td class="option_name"><?php _e('Switcher border color', 'gtranslate'); ?>:</td> <td><input type="text" name="switcher_border_color" id="switcher_border_color" class="color-field" value="#ccc" data-default-color="#ccc" /></td> </tr> <tr> <td class="option_name"><?php _e('Switcher background color', 'gtranslate'); ?>:</td> <td><input type="text" name="switcher_background_color" id="switcher_background_color" class="color-field" value="#fff" data-default-color="#fff" /></td> </tr> <tr> <td class="option_name"><?php _e('Switcher background shadow color', 'gtranslate'); ?>:</td> <td><input type="text" name="switcher_background_shadow_color" id="switcher_background_shadow_color" class="color-field" value="#fff" data-default-color="#efefef" /></td> </tr> <tr> <td class="option_name"><?php _e('Switcher background hover color', 'gtranslate'); ?>:</td> <td><input type="text" name="switcher_background_hover_color" id="switcher_background_hover_color" class="color-field" value="#f0f0f0" data-default-color="#f0f0f0" /></td> </tr> <tr> <td class="option_name"><?php _e('Dropdown text color', 'gtranslate'); ?>:</td> <td><input type="text" name="dropdown_text_color" id="dropdown_text_color" class="color-field" value="#000" data-default-color="#000" /></td> </tr> <tr> <td class="option_name"><?php _e('Dropdown hover color', 'gtranslate'); ?>:</td> <td><input type="text" name="dropdown_hover_color" id="dropdown_hover_color" class="color-field" value="#fff" data-default-color="#fff" /></td> </tr> <tr> <td class="option_name"><?php _e('Dropdown background color', 'gtranslate'); ?>:</td> <td><input type="text" name="dropdown_background_color" id="dropdown_background_color" class="color-field" value="#eee" data-default-color="#eee" /></td> </tr> </table> </div> </div> </div> <div id="poststuff" class="globe_color_options" style="display:none"> <div class="postbox"> <h3 id="settings"><?php _e('Color options', 'gtranslate'); ?></h3> <div class="inside"> <table style="width:100%;" cellpadding="0"> <tr> <td class="option_name"><?php _e('Globe color', 'gtranslate'); ?>:</td> <td><input type="text" name="globe_color" id="globe_color" class="color-field" value="#66aaff" data-default-color="#66aaff" /></td> </tr> </table> </div> </div> </div> <div id="poststuff" class="alternative_flags_option"> <div class="postbox"> <h3 id="settings"><?php _e('Alternative flags', 'gtranslate'); ?></h3> <div class="inside"> <input type="checkbox" id="alt_us" name="alt_flags2[]" value="us" data-lang-group="en"><label for="alt_us"><?php _e('USA flag', 'gtranslate'); ?> (<?php _e('English', 'gtranslate'); ?>)</label><br /> <input type="checkbox" id="alt_ca" name="alt_flags2[]" value="ca" data-lang-group="en"><label for="alt_ca"><?php _e('Canada flag', 'gtranslate'); ?> (<?php _e('English', 'gtranslate'); ?>)</label><br /> <input type="checkbox" id="alt_br" name="alt_flags2[]" value="br" data-lang-group="pt"><label for="alt_br"><?php _e('Brazil flag', 'gtranslate'); ?> (<?php _e('Portuguese', 'gtranslate'); ?>)</label><br /> <input type="checkbox" id="alt_mx" name="alt_flags2[]" value="mx" data-lang-group="es"><label for="alt_mx"><?php _e('Mexico flag', 'gtranslate'); ?> (<?php _e('Spanish', 'gtranslate'); ?>)</label><br /> <input type="checkbox" id="alt_ar" name="alt_flags2[]" value="ar" data-lang-group="es"><label for="alt_ar"><?php _e('Argentina flag', 'gtranslate'); ?> (<?php _e('Spanish', 'gtranslate'); ?>)</label><br /> <input type="checkbox" id="alt_co" name="alt_flags2[]" value="co" data-lang-group="es"><label for="alt_co"><?php _e('Colombia flag', 'gtranslate'); ?> (<?php _e('Spanish', 'gtranslate'); ?>)</label><br /> <input type="checkbox" id="alt_qc" name="alt_flags2[]" value="qc" data-lang-group="fr"><label for="alt_qc"><?php _e('Quebec flag', 'gtranslate'); ?> (<?php _e('French', 'gtranslate'); ?>)</label><br /> </div> </div> </div> <div id="poststuff"> <div class="postbox"> <h3 id="settings"><?php _e('Language selector positioning tips', 'gtranslate'); ?></h3> <div class="inside"> <ul style="list-style-type:square;padding-left:20px;"> <li style="margin:0;"><?php _e('Show floating language selector option is the easiest and suitable for most websites.', 'gtranslate'); ?></li> <li style="margin:0;"><?php _e('Show in menu option is best for <b>Flags</b>, <b>Flags with language name</b>, <b>Flags with language code</b>, <b>Language names</b>, <b>Language codes</b> widget looks.', 'gtranslate'); ?></li> <li style="margin:0;"><?php _e('You can use GTranslate Widget in any pre-defined widget locations.', 'gtranslate'); ?></li> <li style="margin:0;"><?php _e('<code>[gtranslate]</code> shortcode can be used anywhere on your website.', 'gtranslate'); ?> <a href="#TB_inline?width=700&height=170&inlineId=gtranslate-shortcode-description" title="<?php echo esc_attr(translate('Learn more', 'gtranslate')); ?>" class="thickbox" style="text-decoration:none"><span class="dashicons dashicons-welcome-learn-more"></span></a><div id="gtranslate-shortcode-description" style="display:none"><p><?php _e('You can use <code>[gtranslate]</code> inside posts, menu items or anywhere else.', 'gtranslate'); ?> <?php _e('In theme files you can call <code>echo do_shortcode(\'[gtranslate]\');</code> in PHP context.', 'gtranslate'); ?></p><p><?php _e('You can use additional widget_look attribute to place a specific selector, for example <code>[gtranslate widget_look="popup"]</code>. Valid values are <b>float</b>, <b>dropdown_with_flags</b>, <b>popup</b>, <b>dropdown</b>, <b>flags</b>, <b>flags_dropdown</b>, <b>flags_name</b>, <b>flags_code</b>, <b>lang_names</b>, <b>lang_codes</b>, <b>globe</b>.', 'gtranslate'); ?></p></div></li> <li style="margin:0;"><?php _e('<code>[gt-link lang="en" label="English" widget_look="flags_name"]</code> shortcode can be used to render individual language links.', 'gtranslate'); ?> <a href="#TB_inline?width=700&height=240&inlineId=gt-link-shortcode-description" title="<?php echo esc_attr(translate('Learn more', 'gtranslate')); ?>" class="thickbox" style="text-decoration:none"><span class="dashicons dashicons-welcome-learn-more"></span></a><div id="gt-link-shortcode-description" style="display:none"><p><?php _e('It is mainly used to easily place individual language links inside menu items. For example you can create a menu item with URL = #, Navigation Label = Spanish and Description = <code>[gt-link lang="es" label="Spanish" widget_look="flags_name"]</code> and a single menu item will appear to change the language to Spanish.', 'gtranslate'); ?></p><p><?php _e('Valid values for widget_look attribute are <b>flags</b>, <b>flags_code</b>, <b>flags_name</b>, <b>lang_codes</b>, <b>lang_names</b>.', 'gtranslate'); ?></p><p><?php _e('Language codes for lang attribute are case sensitive. The full list can be found on <a href="https://gtranslate.io/supported-languages" target="_blank" rel="noreferrer">https://gtranslate.io/supported-languages</a>', 'gtranslate'); ?></p></div></li> <li style="margin:0;"><?php _e('Wrapper selector CSS can be used to render the language selector inside matching elements.', 'gtranslate'); ?></li> </ul> </div> </div> </div> <div id="poststuff"> <div class="postbox"> <h3 id="settings"><?php _e('Paid version advantages', 'gtranslate'); ?></h3> <div class="inside"> <ul style="list-style-type:square;padding-left:20px;"> <li style="margin:0;"><?php _e('Search engine indexing', 'gtranslate'); ?></li> <li style="margin:0;"><?php _e('Search engine friendly (SEF) URLs', 'gtranslate'); ?></li> <li style="margin:0;"><?php _e('Human level neural translations', 'gtranslate'); ?></li> <li style="margin:0;"><?php _e('Edit translations manually', 'gtranslate'); ?></li> <li style="margin:0;"><a href="https://gtranslate.io/website-translation-quote" title="Website Translation Price Calculator" target="_blank" rel="noreferrer"><?php _e('Automatic translation post-editing service and professional translations', 'gtranslate'); ?></a></li> <li style="margin:0;"><?php _e('Meta data translation (keywords, page description, etc...)', 'gtranslate'); ?></li> <li style="margin:0;"><?php _e('URL/slug translation', 'gtranslate'); ?></li> <li style="margin:0;"><?php _e('Language hosting (custom domain like example.fr, example.es)', 'gtranslate'); ?></li> <li style="margin:0;"><?php _e('Seamless updates', 'gtranslate'); ?></li> <li style="margin:0;"><?php _e('Increased international traffic and AdSense revenue', 'gtranslate'); ?></li> <li style="margin:0;"><?php _e('Works in China', 'gtranslate'); ?></li> <li style="margin:0;"><?php _e('Priority Live Chat support', 'gtranslate'); ?></li> </ul> <a href="https://gtranslate.io/?xyz=998#pricing" target="_blank" class="button-primary" rel="noreferrer"><?php _e('Try Now (15 days free)', 'gtranslate'); ?></a> <a href="https://gtranslate.io/?xyz=998#faq" target="_blank" class="button-primary" rel="noreferrer"><?php _e('FAQ', 'gtranslate'); ?></a> <a href="https://gtranslate.io/website-translation-quote" target="_blank" class="button-primary" rel="noreferrer"><?php _e('Website Translation Quote', 'gtranslate'); ?></a> <a href="https://gtranslate.io/?xyz=998#contact" target="_blank" class="button-primary" rel="noreferrer"><?php _e('Live Chat', 'gtranslate'); ?></a> </div> </div> </div> <div id="poststuff"> <div class="postbox"> <h3 id="settings"><?php _e('Useful links', 'gtranslate'); ?></h3> <div class="inside"> <style> ul.useful_links_list {list-style-type:square;padding-left:20px;margin:0;} ul.useful_links_list li {margin:0;} ul.useful_links_list li a {text-decoration:none;} </style> <table style="width:100%;" cellpadding="4"> <tr> <td> <ul class="useful_links_list"> <li><a href="https://gtranslate.io/videos" target="_blank" rel="noreferrer"><?php _e('Videos', 'gtranslate'); ?></a></li> <li><a href="https://docs.gtranslate.io/how-tos" target="_blank" rel="noreferrer"><?php _e('How-tos', 'gtranslate'); ?></a></li> <li><a href="https://gtranslate.io/blog" target="_blank" rel="noreferrer"><?php _e('Blog', 'gtranslate'); ?></a></li> <li><a href="https://gtranslate.io/about-us" target="_blank" rel="noreferrer"><?php _e('About GTranslate team', 'gtranslate'); ?></a></li> <li><a href="https://gtranslate.io/?xyz=998#faq" target="_blank" rel="noreferrer"><?php _e('FAQ', 'gtranslate'); ?></a></li> </ul> </td> <td> <ul class="useful_links_list"> <li><a href="https://my.gtranslate.io/" target="_blank" rel="noreferrer"><?php _e('User dashboard', 'gtranslate'); ?></a></li> <li><a href="https://gtranslate.io/?xyz=998#pricing" target="_blank" rel="noreferrer"><?php _e('Compare plans', 'gtranslate'); ?></a></li> <li><a href="https://gtranslate.io/website-translation-quote" target="_blank" rel="noreferrer"><?php _e('Website Translation Quote', 'gtranslate'); ?></a></li> <li><a href="https://gtranslate.io/detect-browser-language" target="_blank" rel="noreferrer"><?php _e('Detect browser language', 'gtranslate'); ?></a></li> <li><a href="https://wordpress.org/support/plugin/gtranslate/reviews/" target="_blank" rel="noreferrer"><?php _e('Reviews', 'gtranslate'); ?></a></li> </ul> </td> </tr> </table> </div> </div> </div> <div id="poststuff"> <div class="postbox"> <h3 id="settings"><?php _e('Live Chat (for paid plans and pre-sales questions)', 'gtranslate'); ?></h3> <div class="inside"> <p>2am - 6pm (Mon - Fri) UTC-4</p> <p><?php _e('We are here to make your experience with GTranslate more convenient.'); ?></p> </div> <h3 id="settings"><?php _e('Forum Support (free)', 'gtranslate'); ?></h3> <div class="inside"> <p><a href="https://wordpress.org/support/plugin/gtranslate/" target="_blank" rel="noreferrer"><?php _e('WordPress Forum Support', 'gtranslate'); ?></a></p> <p><?php _e('We try to help everyone as time permits.'); ?></p> </div> </div> </div> </div> <script><?php echo $script; ?></script> <style> #widget_preview a:focus {box-shadow:none;outline:none;} #custom_domains_list_tbl th {text-align:left;} #custom_domains_list_tbl td {padding:5px 0;} .switcher_color_options button {box-shadow:none !important;border:1px solid #b4b9be !important;border-radius:0 !important;} .switcher_color_options h3 a {text-decoration:none;font-weight:400;} .switcher_color_options h3 a:hover {text-decoration:underline;} .postbox #settings {padding-left:12px;} .og_left_col { width: 59%; } .og_right_col { width: 39%; float: right; } .og_left_col #poststuff, .og_right_col #poststuff { min-width: 0; } table.form-table tr th, table.form-table tr td { line-height: 1.5; } table.form-table tr th { font-weight: bold; } table.form-table tr th[scope=row] { min-width: 300px; } table.form-table tr td hr { height: 1px; margin: 0px; background-color: #DFDFDF; border: none; } table.form-table .dashicons-before { margin-right: 10px; font-size: 12px; opacity: 0.5; } table.form-table .dashicons-facebook-alt { color: #3B5998; } table.form-table .dashicons-googleplus { color: #D34836; } table.form-table .dashicons-twitter { color: #55ACEE; } table.form-table .dashicons-rss { color: #FF6600; } table.form-table .dashicons-admin-site, table.form-table .dashicons-admin-generic { color: #666; } .connectedSortable1, .connectedSortable1 li, .connectedSortable2, .connectedSortable2 li {margin:0;padding:0;} .connectedSortable1 li label, .connectedSortable2 li label {cursor:move;} @keyframes gt-icon-spin-animation { 0% {transform:rotate(0deg);} 100% {transform:rotate(359deg);} } .gt-icon-spin {animation:gt-icon-spin-animation 2s infinite linear;} </style> <script>window.intercomSettings = {app_id: "r70azrgx", 'platform': 'wordpress', 'translate_from': '<?php echo $default_language; ?>', 'is_sub_directory': <?php echo (empty($pro_version) ? '0' : '1'); ?>, 'is_sub_domain': <?php echo (empty($enterprise_version) ? '0' : '1'); ?>};(function(){var w=window;var ic=w.Intercom;if(typeof ic==="function"){ic('reattach_activator');ic('update',intercomSettings);}else{var d=document;var i=function(){i.c(arguments)};i.q=[];i.c=function(args){i.q.push(args)};w.Intercom=i;function l(){var s=d.createElement('script');s.type='text/javascript';s.async=true;s.src='https://widget.intercom.io/widget/r70azrgx';var x=d.getElementsByTagName('script')[0];x.parentNode.insertBefore(s,x);}if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}}})()</script> <?php } public static function control_options() { check_admin_referer('gtranslate-save'); $data = get_option('GTranslate'); if(!is_array($data)) self::load_defaults($data); $data['pro_version'] = isset($_POST['pro_version']) ? intval($_POST['pro_version']) : ''; $data['enterprise_version'] = isset($_POST['enterprise_version']) ? intval($_POST['enterprise_version']) : ''; $data['wrapper_selector'] = isset($_POST['wrapper_selector']) ? sanitize_text_field($_POST['wrapper_selector']) : '.gtranslate_wrapper'; $data['custom_domains'] = isset($_POST['custom_domains']) ? intval($_POST['custom_domains']) : ''; $data['custom_domains_data'] = isset($_POST['custom_domains_data']) ? sanitize_text_field($_POST['custom_domains_data']) : ''; $data['url_translation'] = isset($_POST['url_translation']) ? intval($_POST['url_translation']) : ''; $data['add_hreflang_tags'] = isset($_POST['add_hreflang_tags']) ? intval($_POST['add_hreflang_tags']) : ''; $data['email_translation'] = isset($_POST['email_translation']) ? intval($_POST['email_translation']) : ''; $data['email_translation_debug'] = isset($_POST['email_translation_debug']) ? intval($_POST['email_translation_debug']) : ''; $data['enable_cdn'] = isset($_POST['enable_cdn']) ? intval($_POST['enable_cdn']) : ''; $data['show_in_menu'] = isset($_POST['show_in_menu']) ? sanitize_text_field($_POST['show_in_menu']) : ''; $data['floating_language_selector'] = isset($_POST['floating_language_selector']) ? sanitize_text_field($_POST['floating_language_selector']) : 'no'; $data['native_language_names'] = isset($_POST['native_language_names']) ? intval($_POST['native_language_names']) : ''; $data['detect_browser_language'] = isset($_POST['detect_browser_language']) ? intval($_POST['detect_browser_language']) : ''; $data['add_new_line'] = isset($_POST['add_new_line']) ? intval($_POST['add_new_line']) : ''; $data['default_language'] = isset($_POST['default_language']) ? sanitize_text_field($_POST['default_language']) : 'en'; $data['widget_look'] = isset($_POST['widget_look']) ? sanitize_text_field($_POST['widget_look']) : 'float'; $data['flag_size'] = isset($_POST['flag_size']) ? intval($_POST['flag_size']) : 24; $data['flag_style'] = isset($_POST['flag_style']) ? sanitize_text_field($_POST['flag_style']) : '2d'; $data['globe_size'] = isset($_POST['globe_size']) ? intval($_POST['globe_size']) : 60; $data['globe_color'] = isset($_POST['globe_color']) ? sanitize_hex_color($_POST['globe_color']) : '#66aaff'; $data['incl_langs'] = (isset($_POST['incl_langs']) and is_array($_POST['incl_langs'])) ? array_map('sanitize_text_field', $_POST['incl_langs']) : array($data['default_language']); $data['fincl_langs'] = (isset($_POST['fincl_langs']) and is_array($_POST['fincl_langs'])) ? array_map('sanitize_text_field', $_POST['fincl_langs']) : array($data['default_language']); $data['alt_flags'] = (isset($_POST['alt_flags']) and is_array($_POST['alt_flags'])) ? array_map('sanitize_text_field', $_POST['alt_flags']) : array(); $data['select_language_label'] = isset($_POST['select_language_label']) ? sanitize_text_field($_POST['select_language_label']) : 'Select Language'; $data['custom_css'] = isset($_POST['custom_css']) ? wp_kses_post($_POST['custom_css']) : ''; $data['switcher_text_color'] = isset($_POST['switcher_text_color']) ? sanitize_hex_color($_POST['switcher_text_color']) : '#666'; $data['switcher_arrow_color'] = isset($_POST['switcher_arrow_color']) ? sanitize_hex_color($_POST['switcher_arrow_color']) : '#666'; $data['switcher_border_color'] = isset($_POST['switcher_border_color']) ? sanitize_hex_color($_POST['switcher_border_color']) : '#ccc'; $data['switcher_background_color'] = isset($_POST['switcher_background_color']) ? sanitize_hex_color($_POST['switcher_background_color']) : '#fff'; $data['switcher_background_shadow_color'] = isset($_POST['switcher_background_shadow_color']) ? sanitize_hex_color($_POST['switcher_background_shadow_color']) : '#efefef'; $data['switcher_background_hover_color'] = isset($_POST['switcher_background_color']) ? sanitize_hex_color($_POST['switcher_background_hover_color']) : '#f0f0f0'; $data['dropdown_text_color'] = isset($_POST['dropdown_text_color']) ? sanitize_hex_color($_POST['dropdown_text_color']) : '#000'; $data['dropdown_hover_color'] = isset($_POST['dropdown_hover_color']) ? sanitize_hex_color($_POST['dropdown_hover_color']) : '#fff'; $data['dropdown_background_color'] = isset($_POST['dropdown_background_color']) ? sanitize_hex_color($_POST['dropdown_background_color']) : '#eee'; $data['float_switcher_open_direction'] = isset($_POST['float_switcher_open_direction']) ? sanitize_text_field($_POST['float_switcher_open_direction']) : 'top'; $data['switcher_open_direction'] = isset($_POST['switcher_open_direction']) ? sanitize_text_field($_POST['switcher_open_direction']) : 'top'; $data['language_codes'] = (isset($_POST['language_codes']) and !empty($_POST['language_codes'])) ? sanitize_text_field($_POST['language_codes']) : 'af,sq,ar,hy,az,eu,be,bg,ca,zh-CN,zh-TW,hr,cs,da,nl,en,et,tl,fi,fr,gl,ka,de,el,ht,iw,hi,hu,is,id,ga,it,ja,ko,lv,lt,mk,ms,mt,no,fa,pl,pt,ro,ru,sr,sk,sl,es,sw,sv,th,tr,uk,ur,vi,cy,yi'; $data['language_codes2'] = (isset($_POST['language_codes2']) and !empty($_POST['language_codes2'])) ? sanitize_text_field($_POST['language_codes2']) : 'af,sq,am,ar,hy,az,eu,be,bn,bs,bg,ca,ceb,ny,zh-CN,zh-TW,co,hr,cs,da,nl,en,eo,et,tl,fi,fr,fy,gl,ka,de,el,gu,ht,ha,haw,iw,hi,hmn,hu,is,ig,id,ga,it,ja,jw,kn,kk,km,ko,ku,ky,lo,la,lv,lt,lb,mk,mg,ms,ml,mt,mi,mr,mn,my,ne,no,ps,fa,pl,pt,pa,ro,ru,sm,gd,sr,st,sn,sd,si,sk,sl,so,es,su,sw,sv,tg,ta,te,th,tr,uk,ur,uz,vi,cy,xh,yi,yo,zu'; echo '<p style="color:red;">' . __('Changes Saved', 'gtranslate') . '</p>'; update_option('GTranslate', $data); if($data['pro_version']) { // check if rewrite rules are in place $htaccess_file = get_home_path() . '.htaccess'; // todo: use insert_with_markers functions instead if(is_writeable($htaccess_file)) { $htaccess = file_get_contents($htaccess_file); if(strpos($htaccess, 'gtranslate.php') === false) { // no config rules $rewrite_rules = file_get_contents(dirname(__FILE__) . '/url_addon/rewrite.txt'); $rewrite_rules = str_replace('GTRANSLATE_PLUGIN_PATH', str_replace(str_replace(array('https:', 'http:'), array(':', ':'), home_url()), '', str_replace(array('https:', 'http:'), array(':', ':'), plugins_url())) . '/gtranslate', $rewrite_rules); $htaccess = $rewrite_rules . "\r\n\r\n" . $htaccess; if(!empty($htaccess)) { // going to update .htaccess file_put_contents($htaccess_file, $htaccess); echo '<p style="color:red;">' . __('.htaccess file updated', 'gtranslate') . '</p>'; } } } else { $rewrite_rules = file_get_contents(dirname(__FILE__) . '/url_addon/rewrite.txt'); $rewrite_rules = str_replace('GTRANSLATE_PLUGIN_PATH', str_replace(home_url(), '', plugins_url()) . '/gtranslate', $rewrite_rules); echo '<p style="color:red;">' . __('Please add the following rules to the top of your .htaccess file', 'gtranslate') . '</p>'; echo '<pre style="background-color:#eaeaea;">' . $rewrite_rules . '</pre>'; } // update main_lang in config.php $config_file = dirname(__FILE__) . '/url_addon/config.php'; if(is_readable($config_file) and is_writable($config_file)) { $config = file_get_contents($config_file); $config = preg_replace('/\$main_lang = \'[a-z-]{2,5}\'/i', '$main_lang = \''.$data['default_language'].'\'', $config); file_put_contents($config_file, $config); } else { echo '<p style="color:red;">' . __('Cannot update gtranslate/url_addon/config.php file. Make sure to update it manually and set correct $main_lang.', 'gtranslate') . '</p>'; } } else { // todo: remove rewrite rules // do nothing } } public static function load_settings($data) { $languages = $data['fincl_langs']; $dropdown_languages = $data['incl_langs']; if($data['widget_look'] == 'dropdown' or $data['widget_look'] == 'globe' or $data['widget_look'] == 'lang_names' or $data['widget_look'] == 'lang_codes') $languages = $dropdown_languages; $url_structure = 'none'; if($data['pro_version']) $url_structure = 'sub_directory'; elseif($data['enterprise_version']) $url_structure = 'sub_domain'; $gt_settings = array( 'default_language' => $data['default_language'], 'languages' => $languages, 'dropdown_languages' => $dropdown_languages, 'url_structure' => $url_structure, 'wrapper_selector' => $data['wrapper_selector'], 'globe_size' => $data['globe_size'], 'globe_color' => $data['globe_color'], 'flag_size' => $data['flag_size'], 'flag_style' => $data['flag_style'], 'custom_domains' => $data['custom_domains'] ? $data['custom_domains_data'] : null, 'float_switcher_open_direction' => $data['float_switcher_open_direction'], 'switcher_open_direction' => $data['switcher_open_direction'], 'native_language_names' => $data['native_language_names'], 'add_new_line' => $data['add_new_line'], 'select_language_label' => $data['select_language_label'], 'detect_browser_language' => $data['detect_browser_language'], 'custom_css' => $data['custom_css'], 'switcher_text_color' => $data['switcher_text_color'], 'switcher_arrow_color' => $data['switcher_arrow_color'], 'switcher_border_color' => $data['switcher_border_color'], 'switcher_background_color' => $data['switcher_background_color'], 'switcher_background_shadow_color' => $data['switcher_background_shadow_color'], 'switcher_background_hover_color' => $data['switcher_background_hover_color'], 'dropdown_text_color' => $data['dropdown_text_color'], 'dropdown_hover_color' => $data['dropdown_hover_color'], 'dropdown_background_color' => $data['dropdown_background_color'], ); $alt_flags = array(); $raw_alt_flags = $data['alt_flags']; // example raw_alt_flags: ['us', 'br', 'ar'] foreach($raw_alt_flags as $country_code) { switch($country_code) { case 'us': $alt_flags['en'] = 'usa'; break; case 'ca': $alt_flags['en'] = 'canada'; break; case 'br': $alt_flags['pt'] = 'brazil'; break; case 'mx': $alt_flags['es'] = 'mexico'; break; case 'ar': $alt_flags['es'] = 'argentina'; break; case 'co': $alt_flags['es'] = 'colombia'; break; case 'qc': $alt_flags['fr'] = 'quebec'; break; default: break; } } $gt_settings['alt_flags'] = $alt_flags; if(!empty($gt_settings['custom_domains'])) $gt_settings['custom_domains'] = json_decode(stripslashes($gt_settings['custom_domains'])); return $gt_settings; } public static function load_defaults(& $data) { if(!is_array($data)) $data = array(); $data['pro_version'] = isset($data['pro_version']) ? $data['pro_version'] : ''; $data['enterprise_version'] = isset($data['enterprise_version']) ? $data['enterprise_version'] : ''; $data['wrapper_selector'] = isset($data['wrapper_selector']) ? $data['wrapper_selector'] : '.gtranslate_wrapper'; $data['custom_domains'] = isset($data['custom_domains']) ? $data['custom_domains'] : ''; $data['custom_domains_data'] = isset($data['custom_domains_data']) ? $data['custom_domains_data'] : ''; $data['url_translation'] = isset($data['url_translation']) ? $data['url_translation'] : ''; $data['add_hreflang_tags'] = isset($data['add_hreflang_tags']) ? $data['add_hreflang_tags'] : ''; $data['email_translation'] = isset($data['email_translation']) ? $data['email_translation'] : ''; $data['email_translation_debug'] = isset($data['email_translation_debug']) ? $data['email_translation_debug'] : ''; $data['show_in_menu'] = isset($data['show_in_menu']) ? $data['show_in_menu'] : ((isset($data['show_in_primary_menu']) and $data['show_in_primary_menu'] == 1) ? 'primary' : ''); $data['floating_language_selector'] = isset($data['floating_language_selector']) ? $data['floating_language_selector'] : 'no'; $data['floating_language_selector'] = str_replace('_sticky', '', $data['floating_language_selector']); $data['native_language_names'] = isset($data['native_language_names']) ? $data['native_language_names'] : ''; $data['enable_cdn'] = isset($data['enable_cdn']) ? $data['enable_cdn'] : ''; $data['detect_browser_language'] = isset($data['detect_browser_language']) ? $data['detect_browser_language'] : ''; $data['add_new_line'] = isset($data['add_new_line']) ? $data['add_new_line'] : 1; $data['select_language_label'] = isset($data['select_language_label']) ? $data['select_language_label'] : 'Select Language'; $data['custom_css'] = isset($data['custom_css']) ? $data['custom_css'] : ''; if(!isset($data['default_language'])) { $locale_map = array('af'=>'af','am'=>'am','arq'=>'ar','ar'=>'ar','ary'=>'ar','az'=>'az','az_TR'=>'az','azb'=>'az','bel'=>'be','bg_BG'=>'bg','bn_BD'=>'bn','bs_BA'=>'bs','ca'=>'ca','bal'=>'ca','ceb'=>'ceb','co'=>'co','cs_CZ'=>'cs','cy'=>'cy','da_DK'=>'da','de_DE'=>'de','de_CH'=>'de','gsw'=>'de','el'=>'el','en_AU'=>'en','en_CA'=>'en','en_NZ'=>'en','en_ZA'=>'en','en_GB'=>'en','eo'=>'eo','es_AR'=>'es','es_CL'=>'es','es_CO'=>'es','es_GT'=>'es','es_MX'=>'es','es_PE'=>'es','es_PR'=>'es','es_ES'=>'es','es_VE'=>'es','et'=>'et','eu'=>'eu','fa_IR'=>'fa','fa_AF'=>'fa','fi'=>'fi','fr_BE'=>'fr','fr_CA'=>'fr','fr_FR'=>'fr','fy'=>'fy','ga'=>'ga','gd'=>'gd','gl_ES'=>'gl','gu'=>'gu','hau'=>'ha','haw_US'=>'haw','hi_IN'=>'hi','hr'=>'hr','hat'=>'ht','hu_HU'=>'hu','hy'=>'hy','id_ID'=>'id','is_IS'=>'is','it_IT'=>'it','he_IL'=>'iw','ja'=>'ja','jv_ID'=>'jw','ka_GE'=>'ka','kk'=>'kk','km'=>'km','kn'=>'kn','ko_KR'=>'ko','ckb'=>'ku','kir'=>'ky','lb_LU'=>'lb','lo'=>'lo','lt_LT'=>'lt','lv'=>'lv','mg_MG'=>'mg','mri'=>'mi','mk_MK'=>'mk','ml_IN'=>'ml','mn'=>'mn','mr'=>'mr','ms_MY'=>'ms','my_MM'=>'my','ne_NP'=>'ne','nl_NL'=>'nl','nl_BE'=>'nl','nb_NO'=>'no','nn_NO'=>'no','pa_IN'=>'pa','pl_PL'=>'pl','ps'=>'ps','pt_BR'=>'pt','pt_PT'=>'pt','ro_RO'=>'ro','ru_RU'=>'ru','snd'=>'sd','si_LK'=>'si','sk_SK'=>'sk','sl_SI'=>'sl','so_SO'=>'so','sq'=>'sq','sr_RS'=>'sr','su_ID'=>'su','sv_SE'=>'sv','sw'=>'sw','ta_IN'=>'ta','ta_LK'=>'ta','te'=>'te','tg'=>'tg','th'=>'th','tr_TR'=>'tr','uk'=>'uk','ur'=>'ur','uz_UZ'=>'uz','vi'=>'vi','xho'=>'xh','yor'=>'yo','zh_CN'=>'zh-CN','zh_HK'=>'zh-CN','zh_TW'=>'zh-TW'); $locale = get_locale(); $data['default_language'] = isset($locale_map[$locale]) ? $locale_map[$locale] : 'en'; } $data['widget_look'] = isset($data['widget_look']) ? $data['widget_look'] : 'float'; $data['flag_size'] = isset($data['flag_size']) ? $data['flag_size'] : 24; $data['flag_style'] = isset($data['flag_style']) ? $data['flag_style'] : '2d'; $data['globe_size'] = isset($data['globe_size']) ? intval($data['globe_size']) : 60; $data['globe_color'] = isset($data['globe_color']) ? sanitize_hex_color($data['globe_color']) : '#66aaff'; $data['incl_langs'] = isset($data['incl_langs']) ? $data['incl_langs'] : array('en', 'es', 'it', 'pt', 'de', 'fr', 'ru', 'nl', 'ar', 'zh-CN'); $data['fincl_langs'] = isset($data['fincl_langs']) ? $data['fincl_langs'] : array('en', 'es', 'it', 'pt', 'de', 'fr', 'ru', 'nl', 'ar', 'zh-CN'); $data['alt_flags'] = isset($data['alt_flags']) ? $data['alt_flags'] : array(); $data['switcher_text_color'] = isset($data['switcher_text_color']) ? $data['switcher_text_color'] : '#666'; $data['switcher_arrow_color'] = isset($data['switcher_arrow_color']) ? $data['switcher_arrow_color'] : '#666'; $data['switcher_border_color'] = isset($data['switcher_border_color']) ? $data['switcher_border_color'] : '#ccc'; $data['switcher_background_color'] = isset($data['switcher_background_color']) ? $data['switcher_background_color'] : '#fff'; $data['switcher_background_shadow_color'] = isset($data['switcher_background_shadow_color']) ? $data['switcher_background_shadow_color'] : '#efefef'; $data['switcher_background_hover_color'] = isset($data['switcher_background_hover_color']) ? $data['switcher_background_hover_color'] : '#fff'; $data['dropdown_text_color'] = isset($data['dropdown_text_color']) ? $data['dropdown_text_color'] : '#000'; $data['dropdown_hover_color'] = isset($data['dropdown_hover_color']) ? $data['dropdown_hover_color'] : '#fff'; // #ffc $data['dropdown_background_color'] = isset($data['dropdown_background_color']) ? $data['dropdown_background_color'] : '#eee'; $data['float_switcher_open_direction'] = isset($data['float_switcher_open_direction']) ? $data['float_switcher_open_direction'] : 'top'; $data['switcher_open_direction'] = isset($data['switcher_open_direction']) ? $data['switcher_open_direction'] : 'top'; $data['language_codes'] = (isset($data['language_codes']) and !empty($data['language_codes'])) ? $data['language_codes'] : 'af,sq,am,ar,hy,az,eu,be,bn,bs,bg,ca,ceb,ny,zh-CN,zh-TW,co,hr,cs,da,nl,en,eo,et,tl,fi,fr,fy,gl,ka,de,el,gu,ht,ha,haw,iw,hi,hmn,hu,is,ig,id,ga,it,ja,jw,kn,kk,km,ko,ku,ky,lo,la,lv,lt,lb,mk,mg,ms,ml,mt,mi,mr,mn,my,ne,no,ps,fa,pl,pt,pa,ro,ru,sm,gd,sr,st,sn,sd,si,sk,sl,so,es,su,sw,sv,tg,ta,te,th,tr,uk,ur,uz,vi,cy,xh,yi,yo,zu'; $data['language_codes2'] = (isset($data['language_codes2']) and !empty($data['language_codes2'])) ? $data['language_codes2'] : 'af,sq,am,ar,hy,az,eu,be,bn,bs,bg,ca,ceb,ny,zh-CN,zh-TW,co,hr,cs,da,nl,en,eo,et,tl,fi,fr,fy,gl,ka,de,el,gu,ht,ha,haw,iw,hi,hmn,hu,is,ig,id,ga,it,ja,jw,kn,kk,km,ko,ku,ky,lo,la,lv,lt,lb,mk,mg,ms,ml,mt,mi,mr,mn,my,ne,no,ps,fa,pl,pt,pa,ro,ru,sm,gd,sr,st,sn,sd,si,sk,sl,so,es,su,sw,sv,tg,ta,te,th,tr,uk,ur,uz,vi,cy,xh,yi,yo,zu'; // add missing languages once if(strlen($data['language_codes']) < strlen($data['language_codes2'])) $data['language_codes'] = $data['language_codes2']; } } class GTranslateWidget extends WP_Widget { function __construct() { parent::__construct('gtranslate', esc_html__('GTranslate', 'gtranslate'), array('description' => esc_html__('GTranslate language switcher', 'gtranslate'))); } public function widget($args, $instance) { echo $args['before_widget']; if(!empty($instance['title'])) { echo $args['before_title'] . apply_filters('widget_title', $instance['title']) . $args['after_title']; } echo GTranslate::get_widget_code(array('position' => 'inline', 'wrapper_selector' => '.gtranslate_wrapper')); echo $args['after_widget']; } public function form($instance) { $title = !empty($instance['title']) ? $instance['title'] : ''; ?> <p> <label for="<?php echo esc_attr($this->get_field_id('title')); ?>"><?php esc_attr_e('Title:', 'gtranslate'); ?></label> <input class="widefat" id="<?php echo esc_attr($this->get_field_id('title')); ?>" name="<?php echo esc_attr($this->get_field_name('title')); ?>" type="text" value="<?php echo esc_attr($title); ?>"> </p> <?php } public function update($new_instance, $old_instance) { $instance = array(); $instance['title'] = (!empty($new_instance['title'])) ? strip_tags($new_instance['title']) : ''; return $instance; } } class GTranslate_Notices { protected $prefix = 'gtranslate'; public $notice_spam = 0; public $notice_spam_max = 3; // Basic actions to run public function __construct() { // Runs the admin notice ignore function incase a dismiss button has been clicked add_action('admin_init', array($this, 'admin_notice_ignore')); // Runs the admin notice temp ignore function incase a temp dismiss link has been clicked add_action('admin_init', array($this, 'admin_notice_temp_ignore')); // Adding notices add_action('admin_notices', array($this, 'gt_admin_notices')); } // Checks to ensure notices aren't disabled and the user has the correct permissions. public function gt_admin_notice() { $gt_settings = get_option($this->prefix . '_admin_notice'); if (!isset($gt_settings['disable_admin_notices']) || (isset($gt_settings['disable_admin_notices']) && $gt_settings['disable_admin_notices'] == 0)) { if (current_user_can('manage_options')) { return true; } } return false; } // Primary notice function that can be called from an outside function sending necessary variables public function admin_notice($admin_notices) { // Check options if (!$this->gt_admin_notice()) { return false; } foreach ($admin_notices as $slug => $admin_notice) { // Call for spam protection if ($this->anti_notice_spam()) { return false; } // Check for proper page to display on if (isset( $admin_notices[$slug]['pages']) and is_array( $admin_notices[$slug]['pages'])) { if (!$this->admin_notice_pages($admin_notices[$slug]['pages'])) { return false; } } // Check for required fields if (!$this->required_fields($admin_notices[$slug])) { // Get the current date then set start date to either passed value or current date value and add interval $current_date = current_time("n/j/Y"); $start = (isset($admin_notices[$slug]['start']) ? $admin_notices[$slug]['start'] : $current_date); $start = date("n/j/Y", strtotime($start)); $end = ( isset( $admin_notices[ $slug ]['end'] ) ? $admin_notices[ $slug ]['end'] : $start ); $end = date( "n/j/Y", strtotime( $end ) ); $date_array = explode('/', $start); $interval = (isset($admin_notices[$slug]['int']) ? $admin_notices[$slug]['int'] : 0); $date_array[1] += $interval; $start = date("n/j/Y", mktime(0, 0, 0, $date_array[0], $date_array[1], $date_array[2])); // This is the main notices storage option $admin_notices_option = get_option($this->prefix . '_admin_notice', array()); // Check if the message is already stored and if so just grab the key otherwise store the message and its associated date information if (!array_key_exists( $slug, $admin_notices_option)) { $admin_notices_option[$slug]['start'] = $start; $admin_notices_option[$slug]['int'] = $interval; update_option($this->prefix . '_admin_notice', $admin_notices_option); } // Sanity check to ensure we have accurate information // New date information will not overwrite old date information $admin_display_check = (isset($admin_notices_option[$slug]['dismissed']) ? $admin_notices_option[$slug]['dismissed'] : 0); $admin_display_start = (isset($admin_notices_option[$slug]['start']) ? $admin_notices_option[$slug]['start'] : $start); $admin_display_interval = (isset($admin_notices_option[$slug]['int']) ? $admin_notices_option[$slug]['int'] : $interval); $admin_display_msg = (isset($admin_notices[$slug]['msg']) ? $admin_notices[$slug]['msg'] : ''); $admin_display_title = (isset($admin_notices[$slug]['title']) ? $admin_notices[$slug]['title'] : ''); $admin_display_link = (isset($admin_notices[$slug]['link']) ? $admin_notices[$slug]['link'] : ''); $admin_display_dismissible= (isset($admin_notices[$slug]['dismissible']) ? $admin_notices[$slug]['dismissible'] : true); $output_css = false; // Ensure the notice hasn't been hidden and that the current date is after the start date if ($admin_display_check == 0 and strtotime($admin_display_start) <= strtotime($current_date)) { // Get remaining query string $query_str = esc_url(add_query_arg($this->prefix . '_admin_notice_ignore', $slug)); // Admin notice display output echo '<div class="update-nag gt-admin-notice">'; echo '<div class="gt-notice-logo"></div>'; echo ' <p class="gt-notice-title">'; echo $admin_display_title; echo ' </p>'; echo ' <p class="gt-notice-body">'; echo $admin_display_msg; echo ' </p>'; echo '<ul class="gt-notice-body gt-red"> ' . $admin_display_link . ' </ul>'; if($admin_display_dismissible) echo '<a href="' . $query_str . '" class="dashicons dashicons-dismiss"></a>'; echo '</div>'; $this->notice_spam += 1; $output_css = true; } if ($output_css) { wp_enqueue_style($this->prefix . '-admin-notices', plugins_url(plugin_basename(dirname(__FILE__))) . '/gtranslate-notices.css', array()); } } } } // Spam protection check public function anti_notice_spam() { if ($this->notice_spam >= $this->notice_spam_max) { return true; } return false; } // Ignore function that gets ran at admin init to ensure any messages that were dismissed get marked public function admin_notice_ignore() { // If user clicks to ignore the notice, update the option to not show it again if (isset($_GET[$this->prefix . '_admin_notice_ignore'])) { $admin_notices_option = get_option($this->prefix . '_admin_notice', array()); $key = $_GET[$this->prefix . '_admin_notice_ignore']; if(!preg_match('/^[a-z_0-9]+$/i', $key)) return; $admin_notices_option[$key]['dismissed'] = 1; update_option($this->prefix . '_admin_notice', $admin_notices_option); $query_str = remove_query_arg($this->prefix . '_admin_notice_ignore'); wp_redirect($query_str); exit; } } // Temp Ignore function that gets ran at admin init to ensure any messages that were temp dismissed get their start date changed public function admin_notice_temp_ignore() { // If user clicks to temp ignore the notice, update the option to change the start date - default interval of 14 days if (isset($_GET[$this->prefix . '_admin_notice_temp_ignore'])) { $admin_notices_option = get_option($this->prefix . '_admin_notice', array()); $current_date = current_time("n/j/Y"); $date_array = explode('/', $current_date); $interval = (isset($_GET['gt_int']) ? intval($_GET['gt_int']) : 14); $date_array[1] += $interval; $new_start = date("n/j/Y", mktime(0, 0, 0, $date_array[0], $date_array[1], $date_array[2])); $key = $_GET[$this->prefix . '_admin_notice_temp_ignore']; if(!preg_match('/^[a-z_0-9]+$/i', $key)) return; $admin_notices_option[$key]['start'] = $new_start; $admin_notices_option[$key]['dismissed'] = 0; update_option($this->prefix . '_admin_notice', $admin_notices_option); $query_str = remove_query_arg(array($this->prefix . '_admin_notice_temp_ignore', 'gt_int')); wp_redirect( $query_str ); exit; } } public function admin_notice_pages($pages) { foreach ($pages as $key => $page) { if (is_array($page)) { if (isset($_GET['page']) and $_GET['page'] == $page[0] and isset($_GET['tab']) and $_GET['tab'] == $page[1]) { return true; } } else { if ($page == 'all') { return true; } if (get_current_screen()->id === $page) { return true; } if (isset($_GET['page']) and $_GET['page'] == $page) { return true; } } } return false; } // Required fields check public function required_fields( $fields ) { if (!isset( $fields['msg']) or (isset($fields['msg']) and empty($fields['msg']))) { return true; } if (!isset( $fields['title']) or (isset($fields['title']) and empty($fields['title']))) { return true; } return false; } // Special parameters function that is to be used in any extension of this class public function special_parameters($admin_notices) { // Intentionally left blank } public function gt_admin_notices() { $deactivate_plugins= array('WP Translator' => 'wptranslator/WPTranslator.php', 'TranslatePress' => 'translatepress-multilingual/index.php', 'Google Language Translator' => 'google-language-translator/google-language-translator.php', 'Google Website Translator' => 'google-website-translator/google-website-translator.php', 'Weglot' => 'weglot/weglot.php', 'TransPosh' => 'transposh-translation-filter-for-wordpress/transposh.php', 'Advanced Google Translate' => 'advanced-google-translate/advanced-google-translate.php', 'My WP Translate' => 'my-wp-translate/my-wp-translate.php', 'WPML Multilingual CMS' => 'sitepress-multilingual-cms/sitepress.php'); foreach($deactivate_plugins as $name => $plugin_file) { if(is_plugin_active($plugin_file)) { $deactivate_link = wp_nonce_url('plugins.php?action=deactivate&plugin='.urlencode($plugin_file ).'&plugin_status=all&paged=1&s=', 'deactivate-plugin_' . $plugin_file); $notices['deactivate_plugin_'.strtolower(str_replace(' ', '', $name))] = array( 'title' => sprintf(__('Please deactivate %s plugin', 'gtranslate'), $name), 'msg' => sprintf(__('%s plugin causes conflicts with GTranslate.', 'gtranslate'), $name), 'link' => '<li><span class="dashicons dashicons-dismiss"></span><a href="'.$deactivate_link.'">' . sprintf(__('Deactivate %s plugin', 'gtranslate'), $name) . '</a></li>', 'dismissible' => false, 'int' => 0 ); } } /* $one_week_support = esc_url(add_query_arg(array($this->prefix . '_admin_notice_ignore' => 'one_week_support'))); $notices['one_week_support'] = array( 'title' => __('Hey! How is it going?', 'gtranslate'), 'msg' => __('Thank you for using GTranslate! We hope that you have found everything you need, but if you have any questions you can use our Live Chat or Forum:', 'gtranslate'), 'link' => '<li><span class="dashicons dashicons-admin-comments"></span><a target="_blank" href="https://gtranslate.io/#contact" rel="noreferrer">' . __('Get help', 'gtranslate') . '</a></li>' . '<li><span class="dashicons dashicons-format-video"></span><a target="_blank" href="https://gtranslate.io/videos" rel="noreferrer">'.__('Check videos', 'gtranslate') . '</a></li>' . '<li><span class="dashicons dashicons-dismiss"></span><a href="' . $one_week_support . '">' . __('Never show again', 'gtranslate') . '</a></li>', 'int' => 1 ); */ $two_week_review_ignore = esc_url(add_query_arg(array($this->prefix . '_admin_notice_ignore' => 'two_week_review'))); $two_week_review_temp = esc_url(add_query_arg(array($this->prefix . '_admin_notice_temp_ignore' => 'two_week_review', 'gt_int' => 6))); $notices['two_week_review'] = array( 'title' => __('Please Leave a Review', 'gtranslate'), 'msg' => __("We hope you have enjoyed using GTranslate! Would you mind taking a few minutes to write a review on WordPress.org? <br>Just writing a simple <b>'thank you'</b> will make us happy!", 'gtranslate'), 'link' => '<li><span class="dashicons dashicons-external"></span><a href="https://wordpress.org/support/plugin/gtranslate/reviews/?filter=5" target="_blank" rel="noreferrer">' . __('Sure! I would love to!', 'gtranslate') . '</a></li>' . '<li><span class="dashicons dashicons-smiley"></span><a href="' . $two_week_review_ignore . '">' . __('I have already left a review', 'gtranslate') . '</a></li>' . '<li><span class="dashicons dashicons-calendar-alt"></span><a href="' . $two_week_review_temp . '">' . __('Maybe later', 'gtranslate') . '</a></li>' . '<li><span class="dashicons dashicons-dismiss"></span><a href="' . $two_week_review_ignore . '">' . __('Never show again', 'gtranslate') . '</a></li>', 'later_link' => $two_week_review_temp, 'int' => 5 ); $data = get_option('GTranslate'); GTranslate::load_defaults($data); // check if email debug is on and add a notice if($data['email_translation_debug']) { $settings_link = admin_url('options-general.php?page=gtranslate_options'); $view_debug_link = admin_url('plugin-editor.php?file=gtranslate%2Furl_addon%2Fdebug.txt&plugin=gtranslate%2Fgtranslate.php'); $notices['gt_debug_notice'] = array( 'title' => __('Email translation debug mode is ON.', 'gtranslate'), 'msg' => __('Please note that sensitive information can be written into gtranslate/url_addon/debug.txt file, which can be accessed publicly. It is your responsibility to deny public access to it and clean debug information after you are done.', 'gtranslate'), 'link' => '<li><span class="dashicons dashicons-admin-settings"></span><a href="'.$settings_link.'">' . __('GTranslate Settings', 'gtranslate') . '</a></li>' . '<li><span class="dashicons dashicons-visibility"></span><a href="'.$view_debug_link.'">' . __('View debug.txt', 'gtranslate') . '</a></li>', 'dismissible' => false, 'int' => 0 ); } // check if translation debug is on and add a notice include dirname(__FILE__) . '/url_addon/config.php'; if($debug) { $edit_file_link = admin_url('plugin-editor.php?file=gtranslate%2Furl_addon%2Fconfig.php&plugin=gtranslate%2Fgtranslate.php'); $view_debug_link = admin_url('plugin-editor.php?file=gtranslate%2Furl_addon%2Fdebug.txt&plugin=gtranslate%2Fgtranslate.php'); $notices['gt_debug_notice'] = array( 'title' => __('Translation debug mode is ON.', 'gtranslate'), 'msg' => __('Please note that sensitive information can be written into gtranslate/url_addon/debug.txt file, which can be accessed publicly. It is your responsibility to deny public access to it and clean debug information after you are done.', 'gtranslate'), 'link' => '<li><span class="dashicons dashicons-edit"></span><a href="'.$edit_file_link.'">' . __('Edit config.php', 'gtranslate') . '</a></li>' . '<li><span class="dashicons dashicons-visibility"></span><a href="'.$view_debug_link.'">' . __('View debug.txt', 'gtranslate') . '</a></li>', 'dismissible' => false, 'int' => 0 ); } $upgrade_tips_ignore = esc_url(add_query_arg(array($this->prefix . '_admin_notice_ignore' => 'upgrade_tips'))); $upgrade_tips_temp = esc_url(add_query_arg(array($this->prefix . '_admin_notice_temp_ignore' => 'upgrade_tips', 'gt_int' => 7))); if($data['pro_version'] != '1' and $data['enterprise_version'] != '1') { $notices['upgrade_tips'][] = array( 'title' => __('Did you know?', 'gtranslate'), 'msg' => __('You can have <b>neural machine translations</b> which are human level by upgrading your GTranslate.', 'gtranslate'), 'link' => '<li><span class="dashicons dashicons-external"></span><a href="https://gtranslate.io/?xyz=998#pricing" target="_blank" rel="noreferrer">' . __('Learn more', 'gtranslate') . '</a></li>' . '<li><span class="dashicons dashicons-calendar-alt"></span><a href="' . $upgrade_tips_temp . '">' . __('Maybe later', 'gtranslate') . '</a></li>' . '<li><span class="dashicons dashicons-dismiss"></span><a href="' . $upgrade_tips_ignore . '">' . __('Never show again', 'gtranslate') . '</a></li>', 'later_link' => $upgrade_tips_temp, 'int' => 2 ); $notices['upgrade_tips'][] = array( 'title' => __('Did you know?', 'gtranslate'), 'msg' => __('You can <b>increase</b> your international <b>traffic</b> by upgrading your GTranslate.', 'gtranslate'), 'link' => '<li><span class="dashicons dashicons-external"></span><a href="https://gtranslate.io/?xyz=998#pricing" target="_blank" rel="noreferrer">' . __('Learn more', 'gtranslate') . '</a></li>' . '<li><span class="dashicons dashicons-calendar-alt"></span><a href="' . $upgrade_tips_temp . '">' . __('Maybe later', 'gtranslate') . '</a></li>' . '<li><span class="dashicons dashicons-dismiss"></span><a href="' . $upgrade_tips_ignore . '">' . __('Never show again', 'gtranslate') . '</a></li>', 'later_link' => $upgrade_tips_temp, 'int' => 2 ); $notices['upgrade_tips'][] = array( 'title' => __('Did you know?', 'gtranslate'), 'msg' => __('You can have your <b>translated pages indexed</b> in search engines by upgrading your GTranslate.', 'gtranslate'), 'link' => '<li><span class="dashicons dashicons-external"></span><a href="https://gtranslate.io/?xyz=998#pricing" target="_blank" rel="noreferrer">' . __('Learn more', 'gtranslate') . '</a></li>' . '<li><span class="dashicons dashicons-calendar-alt"></span><a href="' . $upgrade_tips_temp . '">' . __('Maybe later', 'gtranslate') . '</a></li>' . '<li><span class="dashicons dashicons-dismiss"></span><a href="' . $upgrade_tips_ignore . '">' . __('Never show again', 'gtranslate') . '</a></li>', 'later_link' => $upgrade_tips_temp, 'int' => 2 ); $notices['upgrade_tips'][] = array( 'title' => __('Did you know?', 'gtranslate'), 'msg' => __('You can <b>increase</b> your <b>AdSense revenue</b> by upgrading your GTranslate.', 'gtranslate'), 'link' => '<li><span class="dashicons dashicons-external"></span><a href="https://gtranslate.io/?xyz=998#pricing" target="_blank" rel="noreferrer">' . __('Learn more', 'gtranslate') . '</a></li>' . '<li><span class="dashicons dashicons-calendar-alt"></span><a href="' . $upgrade_tips_temp . '">' . __('Maybe later', 'gtranslate') . '</a></li>' . '<li><span class="dashicons dashicons-dismiss"></span><a href="' . $upgrade_tips_ignore . '">' . __('Never show again', 'gtranslate') . '</a></li>', 'later_link' => $upgrade_tips_temp, 'int' => 2 ); $notices['upgrade_tips'][] = array( 'title' => __('Did you know?', 'gtranslate'), 'msg' => __('You can <b>edit translations</b> by upgrading your GTranslate.', 'gtranslate'), 'link' => '<li><span class="dashicons dashicons-external"></span><a href="https://gtranslate.io/?xyz=998#pricing" target="_blank" rel="noreferrer">' . __('Learn more', 'gtranslate') . '</a></li>' . '<li><span class="dashicons dashicons-calendar-alt"></span><a href="' . $upgrade_tips_temp . '">' . __('Maybe later', 'gtranslate') . '</a></li>' . '<li><span class="dashicons dashicons-dismiss"></span><a href="' . $upgrade_tips_ignore . '">' . __('Never show again', 'gtranslate') . '</a></li>', 'later_link' => $upgrade_tips_temp, 'int' => 2 ); shuffle($notices['upgrade_tips']); $notices['upgrade_tips'] = $notices['upgrade_tips'][0]; } $this->admin_notice($notices); } } if(is_admin()) { if(!defined('DOING_AJAX') or !DOING_AJAX) new GTranslate_Notices(); } $data = get_option('GTranslate'); GTranslate::load_defaults($data); if($data['pro_version']) { // gtranslate redirect rules with PHP (for environments with no .htaccess support (pantheon, flywheel, etc.), usually .htaccess rules override this) $url_params = explode('?', $_SERVER['REQUEST_URI']); $request_uri = $url_params[0]; if(isset($url_params[1])) $query_params = $url_params[1]; else $query_params = ''; if(preg_match('/^\/(af|sq|am|ar|hy|az|eu|be|bn|bs|bg|ca|ceb|ny|zh-CN|zh-TW|co|hr|cs|da|nl|en|eo|et|tl|fi|fr|fy|gl|ka|de|el|gu|ht|ha|haw|iw|hi|hmn|hu|is|ig|id|ga|it|ja|jw|kn|kk|km|ko|ku|ky|lo|la|lv|lt|lb|mk|mg|ms|ml|mt|mi|mr|mn|my|ne|no|ps|fa|pl|pt|pa|ro|ru|sm|gd|sr|st|sn|sd|si|sk|sl|so|es|su|sw|sv|tg|ta|te|th|tr|uk|ur|uz|vi|cy|xh|yi|yo|zu)\/(af|sq|am|ar|hy|az|eu|be|bn|bs|bg|ca|ceb|ny|zh-CN|zh-TW|co|hr|cs|da|nl|en|eo|et|tl|fi|fr|fy|gl|ka|de|el|gu|ht|ha|haw|iw|hi|hmn|hu|is|ig|id|ga|it|ja|jw|kn|kk|km|ko|ku|ky|lo|la|lv|lt|lb|mk|mg|ms|ml|mt|mi|mr|mn|my|ne|no|ps|fa|pl|pt|pa|ro|ru|sm|gd|sr|st|sn|sd|si|sk|sl|so|es|su|sw|sv|tg|ta|te|th|tr|uk|ur|uz|vi|cy|xh|yi|yo|zu)\/(.*)$/', $request_uri, $matches)) { header('Location: ' . '/' . $matches[1] . '/' . $matches[3] . (empty($query_params) ? '' : '?'.$query_params), true, 301); exit; } // #1 redirect double language codes /es/en/... if(preg_match('/^\/(af|sq|am|ar|hy|az|eu|be|bn|bs|bg|ca|ceb|ny|zh-CN|zh-TW|co|hr|cs|da|nl|en|eo|et|tl|fi|fr|fy|gl|ka|de|el|gu|ht|ha|haw|iw|hi|hmn|hu|is|ig|id|ga|it|ja|jw|kn|kk|km|ko|ku|ky|lo|la|lv|lt|lb|mk|mg|ms|ml|mt|mi|mr|mn|my|ne|no|ps|fa|pl|pt|pa|ro|ru|sm|gd|sr|st|sn|sd|si|sk|sl|so|es|su|sw|sv|tg|ta|te|th|tr|uk|ur|uz|vi|cy|xh|yi|yo|zu)$/', $request_uri)) { header('Location: ' . $request_uri . '/' . (empty($query_params) ? '' : '?'.$query_params), true, 301); exit; } // #2 add trailing slash if($data['widget_look'] == 'float' or $data['widget_look'] == 'flags' or $data['widget_look'] == 'float' or $data['widget_look'] == 'dropdown_with_flags' or $data['widget_look'] == 'flags_name' or $data['widget_look'] == 'flags_code' or $data['widget_look'] == 'popup') $allowed_languages = $data['fincl_langs']; elseif($data['widget_look'] == 'flags_dropdown') $allowed_languages = array_values(array_unique(array_merge($data['fincl_langs'], $data['incl_langs']))); else $allowed_languages = $data['incl_langs']; $allowed_languages = implode('|', $allowed_languages); // ex: en|ru|it|de if(preg_match('/^\/('.$allowed_languages.')\/(.*)/', $request_uri, $matches)) { $_GET['glang'] = $matches[1]; $_GET['gurl'] = rawurldecode($matches[2]); require_once dirname(__FILE__) . '/url_addon/gtranslate.php'; exit; } // #3 proxy translation } if(!empty($data['show_in_menu'])) { function gtranslate_menu_item($items, $args) { $data = get_option('GTranslate'); GTranslate::load_defaults($data); if($args->theme_location == $data['show_in_menu']) { if($data['widget_look'] == 'dropdown_with_flags' or $data['widget_look'] == 'float') { $unique_wrapper_id = wp_rand(10000, 88888); $items .= '<li style="position:relative;" class="menu-item menu-item-gtranslate">'; $items .= '<div style="position:absolute;white-space:nowrap;" id="gtranslate_menu_wrapper_' . $unique_wrapper_id . '">'; $items .= GTranslate::get_widget_code(array('wrapper_selector' => '#gtranslate_menu_wrapper_' . $unique_wrapper_id, 'position' => 'inline')); $items .= '</div>'; $items .= '</li>'; } elseif($data['widget_look'] == 'flags' or $data['widget_look'] == 'flags_code' or $data['widget_look'] == 'flags_name' or $data['widget_look'] == 'lang_codes' or $data['widget_look'] == 'lang_names') { $lang_array = $data['native_language_names'] ? json_decode(GTranslate::$lang_array_native_json, true) : GTranslate::$lang_array; $items .= '<li class="menu-item menu-item-gtranslate menu-item-has-children notranslate">'; $items .= GTranslate::render_single_item(array('lang' => $data['default_language'], 'widget_look' => $data['widget_look'], 'label' => $lang_array[$data['default_language']], 'current_wrapper' => 1)); if($data['widget_look'] == 'lang_names' or $data['widget_look'] == 'lang_codes') $languages = $data['incl_langs']; else $languages = $data['fincl_langs']; $items .= '<ul class="dropdown-menu sub-menu">'; foreach($languages as $lang) { $items .= '<li class="menu-item menu-item-gtranslate-child">'; $items .= GTranslate::render_single_item(array('lang' => $lang, 'widget_look' => $data['widget_look'], 'label' => $lang_array[$lang])); $items .= '</li>'; } $items .= '</ul>'; $items .= '</li>'; } else { $unique_menu_class = 'gt-menu-' . wp_rand(10000, 88888); $items .= '<li style="position:relative;" class="menu-item menu-item-gtranslate ' . $unique_menu_class . '">'; $items .= GTranslate::get_widget_code(array('wrapper_selector' => 'li.menu-item-gtranslate.' . $unique_menu_class, 'position' => 'inline')); $items .= '</li>'; } } return $items; } add_filter('wp_nav_menu_items', 'gtranslate_menu_item', 10, 2); } if($data['floating_language_selector'] != 'no' and !is_admin()) { function gtranslate_display_floating() { echo GTranslate::get_widget_code(false); } add_action('wp_footer', 'gtranslate_display_floating'); } if($data['wrapper_selector'] != '.gtranslate_wrapper' and !empty(trim($data['wrapper_selector']))) { function gtranslate_add_inline_selector() { echo GTranslate::get_widget_code(array('position' => 'inline')); } add_action('wp_footer', 'gtranslate_add_inline_selector'); } if($data['url_translation'] and ($data['pro_version'] or $data['enterprise_version'])) { function gtranslate_url_translation_meta() { echo '<meta name="uri-translation" content="on" />'; } add_action('wp_head', 'gtranslate_url_translation_meta', 1); } if($data['add_hreflang_tags'] and ($data['pro_version'] or $data['enterprise_version'])) { function gtranslate_add_hreflang_tags() { $data = get_option('GTranslate'); GTranslate::load_defaults($data); $enabled_languages = array(); if($data['widget_look'] == 'flags' or $data['widget_look'] == 'float' or $data['widget_look'] == 'dropdown_with_flags' or $data['widget_look'] == 'flags_name' or $data['widget_look'] == 'flags_code' or $data['widget_look'] == 'popup') $enabled_languages = $data['fincl_langs']; elseif($data['widget_look'] == 'flags_dropdown') $enabled_languages = array_values(array_unique(array_merge($data['fincl_langs'], $data['incl_langs']))); else $enabled_languages = $data['incl_langs']; //$current_url = wp_get_canonical_url(); $current_url = network_home_url(add_query_arg(null, null)); if($current_url !== false) { // adding default language if($data['default_language'] === 'iw') echo '<link rel="alternate" hreflang="he" href="'.esc_url($current_url).'" />'."\n"; elseif($data['default_language'] === 'jw') echo '<link rel="alternate" hreflang="jv" href="'.esc_url($current_url).'" />'."\n"; else echo '<link rel="alternate" hreflang="'.$data['default_language'].'" href="'.esc_url($current_url).'" />'."\n"; // adding enabled languages foreach($enabled_languages as $lang) { $href = ''; $domain = str_replace('www.', '', $_SERVER['HTTP_HOST']); if($data['enterprise_version']) { if($data['custom_domains'] and !empty($data['custom_domains_data'])) { $custom_domains_data = json_decode(stripslashes($data['custom_domains_data']), true); if(isset($custom_domains_data[$lang])) $href = str_ireplace('://' . $_SERVER['HTTP_HOST'], '://' . $custom_domains_data[$lang], $current_url); else $href = str_ireplace('://' . $_SERVER['HTTP_HOST'], '://' . $lang . '.' . $domain, $current_url); } else $href = str_ireplace('://' . $_SERVER['HTTP_HOST'], '://' . $lang . '.' . $domain, $current_url); } elseif($data['pro_version']) $href = str_ireplace('://' . $_SERVER['HTTP_HOST'], '://' . $_SERVER['HTTP_HOST'] . '/' . $lang, $current_url); if(!empty($href) and $lang != $data['default_language']) { if($lang === 'iw') echo '<link rel="alternate" hreflang="he" href="'.esc_url($href).'" />'."\n"; elseif($lang === 'jw') echo '<link rel="alternate" hreflang="jv" href="'.esc_url($href).'" />'."\n"; else echo '<link rel="alternate" hreflang="'.$lang.'" href="'.esc_url($href).'" />'."\n"; } } } } add_action('wp_head', 'gtranslate_add_hreflang_tags', 1); } // translate WP REST API posts and categories data in JSON response if($data['pro_version'] or $data['enterprise_version']) { function gtranslate_rest_post($response, $post, $request) { if(isset($response->data['content']) and is_array($response->data['content'])) $response->data['content']['gt_translate_keys'] = array(array('key' => 'rendered', 'format' => 'html')); if(isset($response->data['excerpt']) and is_array($response->data['excerpt'])) $response->data['excerpt']['gt_translate_keys'] = array(array('key' => 'rendered', 'format' => 'html')); if(isset($response->data['title']) and is_array($response->data['title'])) $response->data['title']['gt_translate_keys'] = array(array('key' => 'rendered', 'format' => 'text')); if(isset($response->data['link'])) $response->data['gt_translate_keys'] = array(array('key' => 'link', 'format' => 'url')); // more fields can be added here return $response; } function gtranslate_rest_category($response, $category, $request) { if(isset($response->data['description'])) $response->data['gt_translate_keys'][] = array('key' => 'description', 'format' => 'html'); if(isset($response->data['name'])) $response->data['gt_translate_keys'][] = array('key' => 'name', 'format' => 'text'); if(isset($response->data['link'])) $response->data['gt_translate_keys'][] = array('key' => 'link', 'format' => 'url'); // more fields can be added here return $response; } add_filter('rest_prepare_post', 'gtranslate_rest_post', 10, 3); add_filter('rest_prepare_category', 'gtranslate_rest_category', 10, 3); } // auto redirect to browser language if(($data['pro_version'] or $data['enterprise_version']) and $data['detect_browser_language'] and parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) == parse_url(site_url(), PHP_URL_PATH) . '/' and isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) and isset($_SERVER['HTTP_USER_AGENT']) and !isset($_SERVER['HTTP_X_GT_LANG']) and preg_match('/bot|spider|slurp|facebook/i', $_SERVER['HTTP_USER_AGENT']) == 0) { if($data['widget_look'] == 'flags' or $data['widget_look'] == 'float' or $data['widget_look'] == 'dropdown_with_flags' or $data['widget_look'] == 'flags_name' or $data['widget_look'] == 'flags_code' or $data['widget_look'] == 'popup') $allowed_languages = $data['fincl_langs']; elseif($data['widget_look'] == 'flags_dropdown') $allowed_languages = array_values(array_unique(array_merge($data['fincl_langs'], $data['incl_langs']))); else $allowed_languages = $data['incl_langs']; $accept_language = strtolower(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2)); // for debug purposes only if(isset($_GET['gt_auto_switch_to'])) $accept_language = $_GET['gt_auto_switch_to']; if($accept_language == 'zh') $accept_language = 'zh-CN'; elseif($accept_language == 'he') $accept_language = 'iw'; if($accept_language != $data['default_language'] and in_array($accept_language, $allowed_languages) and !isset($_COOKIE['gt_auto_switch'])) { // set cookie for 30 days and redirect setcookie('gt_auto_switch', 1, time() + 2592000); if($data['pro_version']) header('Location: ' . home_url() . '/' . $accept_language . '/'); if($data['enterprise_version'] and isset($_SERVER['HTTP_HOST'])) { if($data['custom_domains'] and !empty($data['custom_domains_data'])) { $custom_domains_data = json_decode(stripslashes($data['custom_domains_data']), true); if(isset($custom_domains_data[$accept_language])) $href = str_ireplace('://' . $_SERVER['HTTP_HOST'], '://' . $custom_domains_data[$accept_language], site_url()); else $href = str_ireplace('://' . $_SERVER['HTTP_HOST'], '://' . $accept_language . '.' . preg_replace('/^www\./', '', $_SERVER['HTTP_HOST']), site_url()); } else $href = str_ireplace('://' . $_SERVER['HTTP_HOST'], '://' . $accept_language . '.' . preg_replace('/^www\./', '', $_SERVER['HTTP_HOST']), site_url()); header('Location: ' . $href); } header('Vary: Accept-Language'); exit; } } if($data['pro_version'] or $data['enterprise_version']) { // filter for woocommerce script params function gt_filter_woocommerce_scripts_data($data, $handle) { switch($handle) { case 'wc-address-i18n': { $data['gt_translate_keys'] = array( array('key' => 'locale', 'format' => 'json'), array('key' => 'i18n_required_text', 'format' => 'text'), array('key' => 'i18n_optional_text', 'format' => 'html'), ); $locale = json_decode($data['locale']); if(isset($locale->default->address_1)) $locale->default->address_1->gt_translate_keys = array('label', 'placeholder'); if(isset($locale->default->address_2)) $locale->default->address_2->gt_translate_keys = array('label', 'placeholder'); if(isset($locale->default->city)) $locale->default->city->gt_translate_keys = array('label', 'placeholder'); if(isset($locale->default->postcode)) $locale->default->postcode->gt_translate_keys = array('label', 'placeholder'); if(isset($locale->default->state)) $locale->default->state->gt_translate_keys = array('label', 'placeholder'); if(isset($locale->default->shipping->address_1)) $locale->default->shipping->address_1->gt_translate_keys = array('label', 'placeholder'); if(isset($locale->default->shipping->address_2)) $locale->default->shipping->address_2->gt_translate_keys = array('label', 'placeholder'); if(isset($locale->default->shipping->city)) $locale->default->shipping->city->gt_translate_keys = array('label', 'placeholder'); if(isset($locale->default->shipping->postcode)) $locale->default->shipping->postcode->gt_translate_keys = array('label', 'placeholder'); if(isset($locale->default->shipping->state)) $locale->default->shipping->state->gt_translate_keys = array('label', 'placeholder'); if(isset($locale->default->billing->address_1)) $locale->default->billing->address_1->gt_translate_keys = array('label', 'placeholder'); if(isset($locale->default->billing->address_2)) $locale->default->billing->address_2->gt_translate_keys = array('label', 'placeholder'); if(isset($locale->default->billing->city)) $locale->default->billing->city->gt_translate_keys = array('label', 'placeholder'); if(isset($locale->default->billing->postcode)) $locale->default->billing->postcode->gt_translate_keys = array('label', 'placeholder'); if(isset($locale->default->billing->state)) $locale->default->billing->state->gt_translate_keys = array('label', 'placeholder'); $data['locale'] = json_encode($locale); } break; case 'wc-single-product': { $data['gt_translate_keys'] = array('i18n_required_rating_text'); } break; case 'wc-checkout': { $data['gt_translate_keys'] = array('i18n_checkout_error'); } break; case 'wc-country-select': { $data['gt_translate_keys'] = array('i18n_ajax_error', 'i18n_input_too_long_1', 'i18n_input_too_long_n', 'i18n_input_too_short_1', 'i18n_input_too_short_n', 'i18n_load_more', 'i18n_no_matches', 'i18n_searching', 'i18n_select_state_text', 'i18n_selection_too_long_1', 'i18n_selection_too_long_n'); } break; case 'wc-add-to-cart': { $data['gt_translate_keys'] = array('i18n_view_cart', array('key' => 'cart_url', 'format' => 'url')); } break; case 'wc-add-to-cart-variation': { $data['gt_translate_keys'] = array('i18n_no_matching_variations_text', 'i18n_make_a_selection_text', 'i18n_unavailable_text'); } break; case 'wc-password-strength-meter': { $data['gt_translate_keys'] = array('i18n_password_error', 'i18n_password_hint', ''); } break; default: break; } return $data; } function gt_woocommerce_geolocate_ip($false) { if(isset($_SERVER['HTTP_X_GT_VIEWER_IP'])) $_SERVER['HTTP_X_REAL_IP'] = $_SERVER['HTTP_X_GT_VIEWER_IP']; elseif(isset($_SERVER['HTTP_X_GT_CLIENTIP'])) $_SERVER['HTTP_X_REAL_IP'] = $_SERVER['HTTP_X_GT_CLIENTIP']; if(isset($_SERVER['HTTP_X_REAL_IP'])) $_SERVER['HTTP_X_REAL_IP'] = trim(current(explode(',', sanitize_text_field(wp_unslash($_SERVER['HTTP_X_REAL_IP']))))); if(isset($_SERVER['HTTP_X_GT_CLIENTIP'], $_SERVER['HTTP_CF_IPCOUNTRY'])) unset($_SERVER['HTTP_CF_IPCOUNTRY']); return $false; } add_filter('woocommerce_get_script_data', 'gt_filter_woocommerce_scripts_data', 10, 2 ); add_filter('woocommerce_geolocate_ip', 'gt_woocommerce_geolocate_ip', 10, 4); // translate emails if($data['email_translation']) { function gt_translate_emails($args) { if(!is_array($args) or !isset($args['subject']) or !isset($args['message'])) return $args; $subject = $args['subject']; $message = $args['message']; if(function_exists('curl_init') and isset($_SERVER['HTTP_X_GT_LANG'])) { //file_put_contents(dirname(__FILE__) . '/url_addon/debug.txt', date('Y-m-d H:i:s') . " - <subject>$subject</subject><message>$message</message>\n", FILE_APPEND); // translate woocommerce if(strpos($message, 'woocommerce') !== false) { $data = get_option('GTranslate'); GTranslate::load_defaults($data); include dirname(__FILE__) . '/url_addon/config.php'; $server_id = intval(substr(md5(preg_replace('/^www\./', '', $_SERVER['HTTP_HOST'])), 0, 5), 16) % count($servers); $server = $servers[$server_id]; $host = $_SERVER['HTTP_X_GT_LANG'] . '.' . preg_replace('/^www\./', '', $_SERVER['HTTP_HOST']); if($data['custom_domains'] and !empty($data['custom_domains_data'])) { $custom_domains_data = json_decode(stripslashes($data['custom_domains_data']), true); if(isset($custom_domains_data[$_SERVER['HTTP_X_GT_LANG']])) $host = $custom_domains_data[$_SERVER['HTTP_X_GT_LANG']]; } $protocol = ((isset($_SERVER['HTTPS']) and ($_SERVER['HTTPS'] == 'on' or $_SERVER['HTTPS'] == 1)) or (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) and $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https' : 'http'; $headers = array(); $headers[] = 'Host: ' . $host; // add real visitor IP header if(isset($_SERVER['HTTP_CLIENT_IP']) and !empty($_SERVER['HTTP_CLIENT_IP'])) $viewer_ip_address = $_SERVER['HTTP_CLIENT_IP']; if(isset($_SERVER['HTTP_CF_CONNECTING_IP']) and !empty($_SERVER['HTTP_CF_CONNECTING_IP'])) $viewer_ip_address = $_SERVER['HTTP_CF_CONNECTING_IP']; if(isset($_SERVER['HTTP_X_SUCURI_CLIENTIP']) and !empty($_SERVER['HTTP_X_SUCURI_CLIENTIP'])) $viewer_ip_address = $_SERVER['HTTP_X_SUCURI_CLIENTIP']; if(!isset($viewer_ip_address)) $viewer_ip_address = $_SERVER['REMOTE_ADDR']; $headers[] = 'X-GT-Viewer-IP: ' . $viewer_ip_address; $headers[] = 'User-Agent: GTranslate-Email-Translate'; // add X-Forwarded-For if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) and !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) $headers[] = 'X-GT-Forwarded-For: ' . $_SERVER['HTTP_X_FORWARDED_FOR']; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $protocol.'://'.$server.'.tdn.gtranslate.net'.wp_make_link_relative(plugins_url('gtranslate/url_addon/gtranslate-email.php').'?glang='.$_SERVER['HTTP_X_GT_LANG'])); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); if(defined('CURL_IPRESOLVE_V4')) curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/url_addon/cacert.pem'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, array('body' => base64_encode(do_shortcode("<subject>$subject</subject><message>$message</message>")), 'access_key' => md5(substr(NONCE_SALT, 0, 10) . substr(NONCE_KEY, 0, 5)))); if($data['email_translation_debug']) { $fh = fopen(dirname(__FILE__) . '/url_addon/debug.txt', 'a'); curl_setopt($ch, CURLOPT_VERBOSE, true); curl_setopt($ch, CURLOPT_STDERR, $fh); } $response = curl_exec($ch); $response_info = curl_getinfo($ch); curl_close($ch); if($data['email_translation_debug']) { file_put_contents(dirname(__FILE__) . '/url_addon/debug.txt', 'Response: ' . $response . "\n", FILE_APPEND); file_put_contents(dirname(__FILE__) . '/url_addon/debug.txt', 'Response_info: ' . print_r($response_info, true) . "\n", FILE_APPEND); } if(isset($response_info['http_code']) and $response_info['http_code'] == 200) { $response = json_decode($response, true); if(empty($response)) return $args; $response = base64_decode($response['email-body']); if($response === false) return $args; if($data['pro_version']) $response = str_ireplace($host, $_SERVER['HTTP_HOST'] . '/' . $_SERVER['HTTP_X_GT_LANG'], $response); preg_match_all('/<subject>(.*?)<\/subject><message>(.*?)<\/message>/s', $response, $matches); //file_put_contents(dirname(__FILE__) . '/url_addon/debug.txt', 'Matches: ' . print_r($matches, true) . "\n", FILE_APPEND); if(isset($matches[1][0], $matches[2][0])) { $subject = $matches[1][0]; $message = $matches[2][0]; if($data['email_translation_debug']) { file_put_contents(dirname(__FILE__) . '/url_addon/debug.txt', 'Translated Subject: ' . $subject . "\n", FILE_APPEND); file_put_contents(dirname(__FILE__) . '/url_addon/debug.txt', 'Translated Message: ' . $message . "\n", FILE_APPEND); } $args['subject'] = $subject; $args['message'] = $message; } } } } return $args; } // woocommerce pdf invoice translation function gt_translate_invoice_pdf($html) { if(function_exists('curl_init') and isset($_SERVER['HTTP_X_GT_LANG'])) { $data = get_option('GTranslate'); GTranslate::load_defaults($data); // add notranslate for addresses $html = str_replace('-address"', '-address notranslate"', $html); include dirname(__FILE__) . '/url_addon/config.php'; $server_id = intval(substr(md5(preg_replace('/^www\./', '', $_SERVER['HTTP_HOST'])), 0, 5), 16) % count($servers); $server = $servers[$server_id]; $host = $_SERVER['HTTP_X_GT_LANG'] . '.' . preg_replace('/^www\./', '', $_SERVER['HTTP_HOST']); if($data['custom_domains'] and !empty($data['custom_domains_data'])) { $custom_domains_data = json_decode(stripslashes($data['custom_domains_data']), true); if(isset($custom_domains_data[$_SERVER['HTTP_X_GT_LANG']])) $host = $custom_domains_data[$_SERVER['HTTP_X_GT_LANG']]; } $protocol = ((isset($_SERVER['HTTPS']) and ($_SERVER['HTTPS'] == 'on' or $_SERVER['HTTPS'] == 1)) or (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) and $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https' : 'http'; $headers = array(); $headers[] = 'Host: ' . $host; // add real visitor IP header if(isset($_SERVER['HTTP_CLIENT_IP']) and !empty($_SERVER['HTTP_CLIENT_IP'])) $viewer_ip_address = $_SERVER['HTTP_CLIENT_IP']; if(isset($_SERVER['HTTP_CF_CONNECTING_IP']) and !empty($_SERVER['HTTP_CF_CONNECTING_IP'])) $viewer_ip_address = $_SERVER['HTTP_CF_CONNECTING_IP']; if(isset($_SERVER['HTTP_X_SUCURI_CLIENTIP']) and !empty($_SERVER['HTTP_X_SUCURI_CLIENTIP'])) $viewer_ip_address = $_SERVER['HTTP_X_SUCURI_CLIENTIP']; if(!isset($viewer_ip_address)) $viewer_ip_address = $_SERVER['REMOTE_ADDR']; $headers[] = 'X-GT-Viewer-IP: ' . $viewer_ip_address; $headers[] = 'User-Agent: GTranslate-Email-Translate'; // add X-Forwarded-For if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) and !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) $headers[] = 'X-GT-Forwarded-For: ' . $_SERVER['HTTP_X_FORWARDED_FOR']; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $protocol.'://'.$server.'.tdn.gtranslate.net'.wp_make_link_relative(plugins_url('gtranslate/url_addon/gtranslate-email.php').'?format=pdf_html&glang='.$_SERVER['HTTP_X_GT_LANG'])); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); if(defined('CURL_IPRESOLVE_V4')) curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/url_addon/cacert.pem'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, array('body' => base64_encode(do_shortcode("<subject>PDF Invoice</subject><message>$html</message>")), 'access_key' => md5(substr(NONCE_SALT, 0, 10) . substr(NONCE_KEY, 0, 5)))); if($data['email_translation_debug']) { $fh = fopen(dirname(__FILE__) . '/url_addon/debug.txt', 'a'); curl_setopt($ch, CURLOPT_VERBOSE, true); curl_setopt($ch, CURLOPT_STDERR, $fh); } $response = curl_exec($ch); $response_info = curl_getinfo($ch); curl_close($ch); if($data['email_translation_debug']) { file_put_contents(dirname(__FILE__) . '/url_addon/debug.txt', 'Response PDF: ' . $response . "\n", FILE_APPEND); file_put_contents(dirname(__FILE__) . '/url_addon/debug.txt', 'Response_info PDF: ' . print_r($response_info, true) . "\n", FILE_APPEND); } if(isset($response_info['http_code']) and $response_info['http_code'] == 200) { $response = json_decode($response, true); if(empty($response)) return $html; $response = base64_decode($response['email-body']); if($response === false) return $html; if($data['pro_version']) $response = str_ireplace($host, $_SERVER['HTTP_HOST'] . '/' . $_SERVER['HTTP_X_GT_LANG'], $response); preg_match_all('/<subject>(.*?)<\/subject><message>(.*?)<\/message>/s', $response, $matches); //file_put_contents(dirname(__FILE__) . '/url_addon/debug.txt', 'Matches: ' . print_r($matches, true) . "\n", FILE_APPEND); if(isset($matches[1][0], $matches[2][0])) { $html = $matches[2][0]; // fix image $html = str_replace(' src="https://' . $_SERVER['HTTP_HOST'], ' src="', $html); if($data['email_translation_debug']) { file_put_contents(dirname(__FILE__) . '/url_addon/debug.txt', 'Translated PDF HTML: ' . $html . "\n", FILE_APPEND); } } } } return $html; } function gt_translate_wp_smtp_email($args) { //file_put_contents(dirname(__FILE__) . '/url_addon/debug.txt', date('Y-m-d H:i:s') . " - gt_translate_wp_smtp_email args: " . print_r($args, true) . "\n", FILE_APPEND); if(!is_object($args) or !isset($args->Subject) or !isset($args->Body)) return; $result = gt_translate_emails(array('subject' => $args->Subject, 'message' => $args->Body)); $args->Subject = $result['subject']; $args->Body = $result['message']; } add_filter('wpo_wcpdf_get_html', 'gt_translate_invoice_pdf', 10000, 1); add_filter('wp_mail', 'gt_translate_emails', 10000, 1); add_filter('wp_mail_smtp_mailcatcher_smtp_pre_send_before', 'gt_translate_wp_smtp_email', 10000, 1); } } if($data['enterprise_version']) { // solve wp_get_referer issue function gt_allowed_redirect_hosts($hosts) { $data = get_option('GTranslate'); GTranslate::load_defaults($data); if($data['custom_domains'] and !empty($data['custom_domains_data'])) { $custom_domains_data = json_decode(stripslashes($data['custom_domains_data']), true); $gt_hosts = array_values($custom_domains_data); } else { $gt_hosts = array(); } if(isset($_SERVER['HTTP_X_GT_LANG'])) $gt_hosts[] = $_SERVER['HTTP_X_GT_LANG'] . '.' . preg_replace('/^www\./', '', $_SERVER['HTTP_HOST']); return array_merge($hosts, $gt_hosts); } add_filter('allowed_redirect_hosts', 'gt_allowed_redirect_hosts'); } // exclude Autoptimize minification function ao_cache_exclude_js_gtranslate($exclude_js) { if(is_string($exclude_js)) $exclude_js .= ', gtranslate'; return $exclude_js; } add_filter('autoptimize_filter_js_exclude', 'ao_cache_exclude_js_gtranslate', 10, 1); // exclude javascript minification by cache plugins function cache_exclude_js_gtranslate($excluded_js) { if(is_array($excluded_js) or empty($excluded_js)) { $excluded_js[] = '/gtranslate/js/.+\.js'; $excluded_js[] = 'cdn.gtranslate.net'; $excluded_js[] = 'gtranslate'; } return $excluded_js; } // LiteSpeed Cache add_filter('litespeed_optimize_js_excludes', 'cache_exclude_js_gtranslate'); add_filter('litespeed_optm_js_defer_exc', 'cache_exclude_js_gtranslate'); // WP Rocket add_filter('rocket_exclude_js', 'cache_exclude_js_gtranslate'); add_filter('rocket_minify_excluded_external_js', 'cache_exclude_js_gtranslate'); // WP Rocket inline script exclusions function rocket_exclude_inline_gt_scripts($excluded_patterns) { if(is_array($excluded_patterns)) { $excluded_patterns[] = 'gtranslate'; return $excluded_patterns; } return array('gtranslate'); } add_filter('rocket_defer_inline_exclusions', 'rocket_exclude_inline_gt_scripts', 1000, 1); // W3 Total Cache function w3tc_cache_exclude_js_gtranslate($do_tag_minification, $script_tag, $file) { if(strpos($file, 'gtranslate') !== false) return false; return $do_tag_minification; } add_filter('w3tc_minify_js_do_tag_minification', 'w3tc_cache_exclude_js_gtranslate', 10, 3); // WP Optimize function wpo_cache_exclude_js_gtranslate($excluded_js) { if(is_array($excluded_js) or empty($excluded_js)) $excluded_js[] = 'gtranslate'; return $excluded_js; } add_filter('wp-optimize-minify-default-exclusions', 'wpo_cache_exclude_js_gtranslate', 10, 1); // Siteground SG Optimize function sg_cache_exclude_js_gtranslate($excluded_js) { if(!is_array($excluded_js)) return $excluded_js; global $wp_scripts; $registered_handles = array_keys($wp_scripts->registered); foreach($registered_handles as $handle) { if(strpos($handle, 'gt_widget_script') !== false) $excluded_js[] = $handle; } return $excluded_js; } add_filter('sgo_js_minify_exclude', 'sg_cache_exclude_js_gtranslate', 10, 1); add_filter('sgo_javascript_combine_exclude', 'sg_cache_exclude_js_gtranslate', 10, 1); add_filter('sgo_javascript_combine_excluded_external_paths', 'cache_exclude_js_gtranslate', 10, 1);