multilingual and available to the world using Google Translate. For support visit GTranslate Support. Version: 2.8.58 Author: Translate AI Multilingual Solutions Author URI: https://gtranslate.io Text Domain: gtranslate */ /* Copyright 2010 - 2020 Edvard Ananyan (email : edo888@gmail.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_shortcode('GTranslate', array('GTranslate', 'get_widget_code')); add_shortcode('gtranslate', array('GTranslate', 'get_widget_code')); class GTranslate extends WP_Widget { public static function activate() { $data = array( 'gtranslate_title' => __('Website Translator', 'gtranslate'), ); $data = get_option('GTranslate'); GTranslate::load_defaults($data); add_option('GTranslate', $data); } public static function deactivate() { // delete_option('GTranslate'); } public static function settings_link($links) { $settings_link = array(''.__('Settings', 'gtranslate').''); return array_merge($links, $settings_link); } public static function control() { $data = get_option('GTranslate'); ?>

'.__('GTranslate Settings', 'gtranslate').' for configuration.', 'gtranslate'); ?>

Notice: Please configure GTranslate from WP-Admin -> Settings -> GTranslate to see it in action.', 'gtranslate'); else echo $data['widget_code']; // avoid caching issues if($data['widget_look'] == 'dropdown_with_flags' and ($data['pro_version'] or $data['enterprise_version'])) { echo ''; } elseif($data['widget_look'] == 'popup' and ($data['pro_version'] or $data['enterprise_version'])) { echo ''; } // detect browser language if(!($data['pro_version'] or $data['enterprise_version']) and $data['detect_browser_language']) { if($data['widget_look'] == 'flags' 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 = json_encode($allowed_languages); echo ""; } echo $args['after_widget']; } public static function widget2($args) { $data = get_option('GTranslate'); GTranslate::load_defaults($data); echo $args['before_widget']; echo $args['before_title'] . $data['gtranslate_title'] . $args['after_title']; if(empty($data['widget_code'])) _e('Notice: Please configure GTranslate from WP-Admin -> Settings -> GTranslate to see it in action.', 'gtranslate'); else echo $data['widget_code']; // avoid caching issues if($data['widget_look'] == 'dropdown_with_flags' and ($data['pro_version'] or $data['enterprise_version'])) { echo ''; } elseif($data['widget_look'] == 'popup' and ($data['pro_version'] or $data['enterprise_version'])) { echo ''; } // detect browser language if(!($data['pro_version'] or $data['enterprise_version']) and $data['detect_browser_language']) { if($data['widget_look'] == 'flags' 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 = json_encode($allowed_languages); echo ""; } echo $args['after_widget']; } public static function get_widget_code($atts) { $data = get_option('GTranslate'); GTranslate::load_defaults($data); if(empty($data['widget_code'])) return __('Notice: Please configure GTranslate from WP-Admin -> Settings -> GTranslate to see it in action.', 'gtranslate'); else { // avoid caching issues if($data['widget_look'] == 'dropdown_with_flags' and ($data['pro_version'] or $data['enterprise_version'])) { $data['widget_code'] .= ''; } elseif($data['widget_look'] == 'popup' and ($data['pro_version'] or $data['enterprise_version'])) { $data['widget_code'] .= ''; } //$_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'ru-Ru'; // debug // detect browser language if(!($data['pro_version'] or $data['enterprise_version']) and $data['detect_browser_language']) { if($data['widget_look'] == 'flags' 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 = json_encode($allowed_languages); $data['widget_code'] .= ""; } return $data['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() { ?>

G|translate

'text/html')); if($editor_settings !== false) wp_add_inline_script('code-editor', sprintf('jQuery(function() {wp.codeEditor.initialize("widget_code", %s);});', wp_json_encode($editor_settings))); } */ $site_url = site_url(); $wp_plugin_url = preg_replace('/^https?:/i', '', plugins_url() . '/gtranslate'); extract($data); $gt_lang_array_json = '{"af":"Afrikaans","sq":"Albanian","am":"Amharic","ar":"Arabic","hy":"Armenian","az":"Azerbaijani","eu":"Basque","be":"Belarusian","bn":"Bengali","bs":"Bosnian","bg":"Bulgarian","ca":"Catalan","ceb":"Cebuano","ny":"Chichewa","zh-CN":"Chinese (Simplified)","zh-TW":"Chinese (Traditional)","co":"Corsican","hr":"Croatian","cs":"Czech","da":"Danish","nl":"Dutch","en":"English","eo":"Esperanto","et":"Estonian","tl":"Filipino","fi":"Finnish","fr":"French","fy":"Frisian","gl":"Galician","ka":"Georgian","de":"German","el":"Greek","gu":"Gujarati","ht":"Haitian Creole","ha":"Hausa","haw":"Hawaiian","iw":"Hebrew","hi":"Hindi","hmn":"Hmong","hu":"Hungarian","is":"Icelandic","ig":"Igbo","id":"Indonesian","ga":"Irish","it":"Italian","ja":"Japanese","jw":"Javanese","kn":"Kannada","kk":"Kazakh","km":"Khmer","ko":"Korean","ku":"Kurdish (Kurmanji)","ky":"Kyrgyz","lo":"Lao","la":"Latin","lv":"Latvian","lt":"Lithuanian","lb":"Luxembourgish","mk":"Macedonian","mg":"Malagasy","ms":"Malay","ml":"Malayalam","mt":"Maltese","mi":"Maori","mr":"Marathi","mn":"Mongolian","my":"Myanmar (Burmese)","ne":"Nepali","no":"Norwegian","ps":"Pashto","fa":"Persian","pl":"Polish","pt":"Portuguese","pa":"Punjabi","ro":"Romanian","ru":"Russian","sm":"Samoan","gd":"Scottish Gaelic","sr":"Serbian","st":"Sesotho","sn":"Shona","sd":"Sindhi","si":"Sinhala","sk":"Slovak","sl":"Slovenian","so":"Somali","es":"Spanish","su":"Sudanese","sw":"Swahili","sv":"Swedish","tg":"Tajik","ta":"Tamil","te":"Telugu","th":"Thai","tr":"Turkish","uk":"Ukrainian","ur":"Urdu","uz":"Uzbek","vi":"Vietnamese","cy":"Welsh","xh":"Xhosa","yi":"Yiddish","yo":"Yoruba","zu":"Zulu"}'; $gt_lang_array = get_object_vars(json_decode($gt_lang_array_json)); include dirname(__FILE__) . '/native_names_map.php'; // defines $native_names_map array //echo '
' . print_r($native_names_map, true) . '
'; $gt_lang_array_native_json = json_encode($native_names_map); 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 = << 0 ? true : false; var pro_version = jQuery('#pro_version:checked').length > 0 ? true : false; var enterprise_version = jQuery('#enterprise_version:checked').length > 0 ? true : false; var new_window = jQuery('#new_window:checked').length > 0 ? true : false; var show_in_menu = jQuery('#show_in_menu').val(); var floating_language_selector = jQuery('#floating_language_selector').val(); var native_language_names = jQuery('#native_language_names:checked').length > 0 ? true : false; var analytics = jQuery('#analytics:checked').length > 0 ? true : false; var detect_browser_language = jQuery('#detect_browser_language:checked').length > 0 ? true : false; 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(); // make sure default language is on if(widget_look == 'flags_dropdown' || widget_look == 'dropdown_with_flags' || widget_look == 'flags' || widget_look == 'flags_name' || widget_code == '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) { translation_method = 'redirect'; jQuery('#new_window_option').show(); jQuery('#url_translation_option').show(); jQuery('#hreflang_tags_option').show(); jQuery('#email_translation_option').show(); //jQuery('#auto_switch_option').hide(); } else { jQuery('#new_window_option').hide(); jQuery('#url_translation_option').hide(); jQuery('#hreflang_tags_option').hide(); jQuery('#email_translation_option').hide(); //jQuery('#auto_switch_option').show(); } 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 == '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_monochrome_option').hide(); } else { jQuery('#flag_size_option,#flag_monochrome_option').show(); } if(widget_look == 'dropdown_with_flags') { jQuery('.switcher_color_options').show(); } else { jQuery('.switcher_color_options').hide(); } if(native_language_names) { gt_lang_array = gt_lang_array_native; jQuery('.en_names').hide(); jQuery('.native_names').show(); } else { gt_lang_array = gt_lang_array_english; jQuery('.native_names').hide(); jQuery('.en_names').show(); } if(pro_version && enterprise_version) pro_version = false; if(translation_method == 'on_fly' || translation_method == 'redirect' || translation_method == 'onfly') { // Adding flags and names if(widget_look == 'flags' || widget_look == 'flags_dropdown' || widget_look == 'flags_name' || widget_look == 'flags_code' || widget_look == 'lang_names' || widget_look == 'lang_codes') { jQuery.each(((widget_look == 'flags' || widget_look == 'flags_dropdown' || widget_look == 'flags_name' || widget_look == 'flags_code') ? language_codes : language_codes2), function(i, val) { lang = (widget_look == 'flags' || widget_look == 'flags_dropdown' || widget_look == 'flags_name' || widget_look == 'flags_code') ? language_codes[i] : language_codes2[i]; if(widget_look == 'lang_names' || widget_look == 'lang_codes') chklist = '#incl_langs'; else chklist = '#fincl_langs'; if(jQuery(chklist+lang+':checked').length) { lang_name = gt_lang_array[lang]; var href = '#'; if(pro_version) { href = (lang == default_language) ? '$site_url' : '$site_url'.replace('$site_url'.split('/').slice(0, 3).join('/'), '$site_url'.split('/').slice(0, 3).join('/')+'/'+lang); if(lang != default_language && href.endsWith('/'+lang)) href += '/'; } else if(enterprise_version) href = (lang == default_language) ? '$site_url' : '$site_url'.replace('$site_url'.split('/').slice(2, 3)[0].replace('www.', ''), lang + '.' + '$site_url'.split('/').slice(2, 3)[0].replace('www.', '')).replace('://www.', '://'); widget_preview += ''; //adding language flag if(widget_look == 'flags' || widget_look == 'flags_dropdown' || widget_look == 'flags_name' || widget_look == 'flags_code') { if(lang == 'en' && jQuery('#alt_us:checked').length) widget_preview += ''+lang_name+''; else if(lang == 'en' && jQuery('#alt_ca:checked').length) widget_preview += ''+lang_name+''; else if(lang == 'pt' && jQuery('#alt_br:checked').length) widget_preview += ''+lang_name+''; else if(lang == 'es' && jQuery('#alt_mx:checked').length) widget_preview += ''+lang_name+''; else if(lang == 'es' && jQuery('#alt_ar:checked').length) widget_preview += ''+lang_name+''; else if(lang == 'es' && jQuery('#alt_co:checked').length) widget_preview += ''+lang_name+''; else if(lang == 'fr' && jQuery('#alt_qc:checked').length) widget_preview += ''+lang_name+''; else widget_preview += ''+lang_name+''; } // adding language name/code if(widget_look == 'flags_name') widget_preview += ' '+lang_name+' '; else if(widget_look == 'lang_names') widget_preview += lang_name+' '; else if(widget_look == 'flags_code') widget_preview += ' '+lang.toUpperCase()+' '; else if(widget_look == 'lang_codes') widget_preview += lang.toUpperCase()+' '; else if(widget_look == 'flags') widget_preview += ''; else if(widget_look == 'flags_dropdown') widget_preview += ''; } }); } // Adding dropdown if(widget_look == 'dropdown' || widget_look == 'flags_dropdown') { if((widget_look == 'flags' || widget_look == 'flags_dropdown') && jQuery('#add_new_line:checked').length) widget_preview += '
'; else widget_preview += ' '; widget_preview += ''; } // Adding onfly html and css if(translation_method == 'onfly') { widget_code += ''+new_line+new_line; widget_code += '
'+new_line; widget_code += '

( light | dark )

:
:
:
:
:
:
:
:
:

$7.99/month!', 'gtranslate'); ?>

WordPress.org :)

9am - 6pm (Mon - Fri) New York Time

' . __('Changes Saved', 'gtranslate') . '

'; 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 '

' . __('.htaccess file updated', 'gtranslate') . '

'; } } } 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 '

' . __('Please add the following rules to the top of your .htaccess file', 'gtranslate') . '

'; echo '
' . $rewrite_rules . '
'; } // update main_lang in config.php $config_file = dirname(__FILE__) . '/url_addon/config.php'; if(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 '

' . __('Cannot update gtranslate/url_addon/config.php file. Make sure to update it manually and set correct $main_lang.', 'gtranslate') . '

'; } } else { // todo: remove rewrite rules // do nothing } } 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['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['new_window'] = isset($data['new_window']) ? $data['new_window'] : ''; $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['native_language_names'] = isset($data['native_language_names']) ? $data['native_language_names'] : ''; $data['analytics'] = isset($data['analytics']) ? $data['analytics'] : ''; $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'; 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['translation_method'] = isset($data['translation_method']) ? $data['translation_method'] : 'onfly'; if($data['translation_method'] == 'on_fly') $data['translation_method'] = 'redirect'; $data['widget_look'] = isset($data['widget_look']) ? $data['widget_look'] : 'dropdown_with_flags'; $data['flag_size'] = isset($data['flag_size']) ? $data['flag_size'] : '24'; $data['monochrome_flags'] = isset($data['monochrome_flags']) ? $data['monochrome_flags'] : ''; $data['widget_code'] = isset($data['widget_code']) ? $data['widget_code'] : ''; $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['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']; } $data = get_option('GTranslate'); GTranslate::load_defaults($data); if(empty($data['widget_code'])) _e('Notice: Please configure GTranslate from WP-Admin -> Settings -> GTranslate to see it in action.', 'gtranslate'); else echo $data['widget_code']; // avoid caching issues if($data['widget_look'] == 'dropdown_with_flags' and ($data['pro_version'] or $data['enterprise_version'])) { echo ''; } elseif($data['widget_look'] == 'popup' and ($data['pro_version'] or $data['enterprise_version'])) { echo ''; } // detect browser language if(!($data['pro_version'] or $data['enterprise_version']) and $data['detect_browser_language']) { if($data['widget_look'] == 'flags' 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 = json_encode($allowed_languages); echo ""; } echo $args['after_widget']; } public function form($instance) { $title = !empty($instance['title']) ? $instance['title'] : ''; ?>

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 '
'; echo ''; echo '

'; echo $admin_display_title; echo '

'; echo '

'; echo $admin_display_msg; echo '

'; echo '
    ' . $admin_display_link . '
'; if($admin_display_dismissible) echo ''; echo '
'; $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'); 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' => '
  • ' . sprintf(__('Deactivate %s plugin', 'gtranslate'), $name) . '
  • ', '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' => '
  • ' . __('Get help', 'gtranslate') . '
  • ' . '
  • '.__('Check videos', 'gtranslate') . '
  • ' . '
  • ' . __('Never show again', 'gtranslate') . '
  • ', '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?
    Just writing a simple 'thank you' will make us happy!", 'gtranslate'), 'link' => '
  • ' . __('Sure! I would love to!', 'gtranslate') . '
  • ' . '
  • ' . __('I have already left a review', 'gtranslate') . '
  • ' . '
  • ' . __('Maybe later', 'gtranslate') . '
  • ' . '
  • ' . __('Never show again', 'gtranslate') . '
  • ', 'later_link' => $two_week_review_temp, 'int' => 5 ); $data = get_option('GTranslate'); GTranslate::load_defaults($data); $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 neural machine translations which are human level by upgrading your GTranslate.', 'gtranslate'), 'link' => '
  • ' . __('Learn more', 'gtranslate') . '
  • ' . '
  • ' . __('Maybe later', 'gtranslate') . '
  • ' . '
  • ' . __('Never show again', 'gtranslate') . '
  • ', 'later_link' => $upgrade_tips_temp, 'int' => 2 ); $notices['upgrade_tips'][] = array( 'title' => __('Did you know?', 'gtranslate'), 'msg' => __('You can increase your international traffic by upgrading your GTranslate.', 'gtranslate'), 'link' => '
  • ' . __('Learn more', 'gtranslate') . '
  • ' . '
  • ' . __('Maybe later', 'gtranslate') . '
  • ' . '
  • ' . __('Never show again', 'gtranslate') . '
  • ', 'later_link' => $upgrade_tips_temp, 'int' => 2 ); $notices['upgrade_tips'][] = array( 'title' => __('Did you know?', 'gtranslate'), 'msg' => __('You can have your translated pages indexed in search engines by upgrading your GTranslate.', 'gtranslate'), 'link' => '
  • ' . __('Learn more', 'gtranslate') . '
  • ' . '
  • ' . __('Maybe later', 'gtranslate') . '
  • ' . '
  • ' . __('Never show again', 'gtranslate') . '
  • ', 'later_link' => $upgrade_tips_temp, 'int' => 2 ); $notices['upgrade_tips'][] = array( 'title' => __('Did you know?', 'gtranslate'), 'msg' => __('You can increase your AdSense revenue by upgrading your GTranslate.', 'gtranslate'), 'link' => '
  • ' . __('Learn more', 'gtranslate') . '
  • ' . '
  • ' . __('Maybe later', 'gtranslate') . '
  • ' . '
  • ' . __('Never show again', 'gtranslate') . '
  • ', 'later_link' => $upgrade_tips_temp, 'int' => 2 ); $notices['upgrade_tips'][] = array( 'title' => __('Did you know?', 'gtranslate'), 'msg' => __('You can edit translations by upgrading your GTranslate.', 'gtranslate'), 'link' => '
  • ' . __('Learn more', 'gtranslate') . '
  • ' . '
  • ' . __('Maybe later', 'gtranslate') . '
  • ' . '
  • ' . __('Never show again', 'gtranslate') . '
  • ', '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()) { global $pagenow; 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) @list($request_uri, $query_params) = explode('?', $_SERVER['REQUEST_URI']); 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'] == 'flags' 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'])) { add_filter('wp_nav_menu_items', 'gtranslate_menu_item', 10, 2); 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') { $items .= ''; } else if($data['widget_look'] == 'globe' or $data['widget_look'] == 'dropdown' or $data['widget_look'] == 'flags_dropdown') { $items .= ''; if($data['widget_look'] == 'flags_dropdown') { $items .= ''; } } else { // optimize menu look $html = GTranslate::get_widget_code(false); $html = str_replace('', '', $html); $items = str_replace('gtranslate-parent', 'gtranslate-parent menu-item-has-children', $items); $parent_item_position = strpos($items, 'gtranslate-parent'); if($parent_item_position !== false) { $parent_link_position = strpos($items, '', $parent_item_position); $items = substr_replace($items, '', $parent_link_position, 4); } else { $items .= $html; } } } return $items; } } if($data['floating_language_selector'] != 'no' and !is_admin()) { add_action('wp_footer', 'gtranslate_display_floating'); function gtranslate_display_floating() { $data = get_option('GTranslate'); GTranslate::load_defaults($data); if($data['widget_look'] == 'dropdown_with_flags') $vertical_location = 0; else $vertical_location = 10; if(is_admin_bar_showing() and ($data['floating_language_selector'] == 'top_left' or $data['floating_language_selector'] == 'top_right' or $data['floating_language_selector'] == 'top_left_sticky' or $data['floating_language_selector'] == 'top_right_sticky')) $vertical_location += 32; $vertical_location = $vertical_location . 'px'; switch($data['floating_language_selector']) { case 'top_left': $html = '
    '.GTranslate::get_widget_code(false).'
    '; break; case 'top_left_sticky': $html = '
    '.GTranslate::get_widget_code(false).'
    '; break; case 'top_right': $html = '
    '.GTranslate::get_widget_code(false).'
    '; break; case 'top_right_sticky': $html = '
    '.GTranslate::get_widget_code(false).'
    '; break; case 'bottom_left': $html = '
    '.GTranslate::get_widget_code(false).'
    '; break; case 'bottom_left_sticky': $html = '
    '.GTranslate::get_widget_code(false).'
    '; break; case 'bottom_right': $html = '
    '.GTranslate::get_widget_code(false).'
    '; break; case 'bottom_right_sticky': $html = '
    '.GTranslate::get_widget_code(false).'
    '; break; default: $html = ''; break; } echo $html; } } if($data['pro_version'] or $data['enterprise_version']) { add_action('wp_head', 'gtranslate_request_uri_var'); if(isset($_GET['page']) and $_GET['page'] == 'gtranslate_options') add_action('admin_head', 'gtranslate_request_uri_var'); function gtranslate_request_uri_var() { echo ""; } } if($data['url_translation'] and ($data['pro_version'] or $data['enterprise_version'])) { add_action('wp_head', 'gtranslate_url_translation_meta', 1); function gtranslate_url_translation_meta() { echo ''; } } if($data['add_hreflang_tags'] and ($data['pro_version'] or $data['enterprise_version'])) { add_action('wp_head', 'gtranslate_add_hreflang_tags', 1); 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'] == '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 ''."\n"; elseif($data['default_language'] === 'jw') echo ''."\n"; else echo ''."\n"; // adding enabled languages foreach($enabled_languages as $lang) { $href = ''; $domain = str_replace('www.', '', $_SERVER['HTTP_HOST']); if($data['enterprise_version']) $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 ''."\n"; elseif($lang === 'jw') echo ''."\n"; else echo ''."\n"; } } } } } // 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'] == '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'; 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'])) header('Location: ' . str_replace('://'.$_SERVER['HTTP_HOST'], '://'.$accept_language.'.'.preg_replace('/^www\./', '', $_SERVER['HTTP_HOST']), site_url())); // todo: special redirect for language hosting exit; } } // convert wp_localize_script format into JSON + JS parser if($data['pro_version'] or $data['enterprise_version']) { function gtranslate_filter_l10n_scripts() { global $wp_scripts; $translate_handles = array( 'agile-store-locator-script', 'wmc-wizard', 'wc-address-i18n', 'wc-checkout', 'wc-country-select', 'wc-add-to-cart', 'wc-password-strength-meter', 'googlecode_regular', 'googlecode_property', 'googlecode_contact', 'mapfunctions', 'myhome-min', ); //echo ''; //return; foreach($wp_scripts->registered as $handle => $script) { if(isset($script->extra['data']) and in_array($handle, $translate_handles)) { $l10n = $script->extra['data']; preg_match_all('/var (.+) = ({(.*)});/', $l10n, $matches); //echo ''; if(isset($matches[1]) and isset($matches[2])) { $vars = $matches[1]; $scripts = $matches[2]; } else continue; foreach($vars as $i => $var_name) { $attribute_ids = $wp_scripts->get_data($handle, 'attribute-ids'); $attribute_ids[] = $var_name . '-gt-l10n-'.$i; $jsons = $wp_scripts->get_data($handle, 'jsons'); $jsons[] = $scripts[$i]; $jss = $wp_scripts->get_data($handle, 'jss'); $jss[] = "var $var_name = JSON.parse(document.getElementById('$var_name-gt-l10n-$i').innerHTML);"; $wp_scripts->add_data($handle, 'attribute-ids', $attribute_ids); $wp_scripts->add_data($handle, 'jsons', $jsons); $wp_scripts->add_data($handle, 'jss', $jss); } unset($wp_scripts->registered[$handle]->extra['data']); } } //echo ''; } function gtranslate_add_script_attributes($tag, $handle) { global $wp_scripts; gtranslate_filter_l10n_scripts(); if(isset($wp_scripts->registered[$handle]->extra['attribute-ids'])) { $attribute_ids = $wp_scripts->get_data($handle, 'attribute-ids'); $jsons = $wp_scripts->get_data($handle, 'jsons'); $jss = $wp_scripts->get_data($handle, 'jss'); $return = ''; foreach($attribute_ids as $i => $attribute_id) { $json = $jsons[$i]; $js = $jss[$i]; $return .= "\n\n"; } return $return . $tag; } return $tag; } // 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'), 'i18n_required_text', 'i18n_optional_text', ); $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-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-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']; return $false; } //add_action('wp_print_scripts', 'gtranslate_filter_l10n_scripts', 1); //add_action('wp_print_header_scripts', 'gtranslate_filter_l10n_scripts', 1); //add_action('wp_print_footer_scripts', 'gtranslate_filter_l10n_scripts', 1); add_filter('script_loader_tag', 'gtranslate_add_script_attributes', 100, 2); 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) { $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$message\n", FILE_APPEND); // translate woocommerce if(strpos($message, 'woocommerce') !== false) { 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']); $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); curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/url_addon/cacert.pem'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, array('body' => do_shortcode("$subject$message"), 'access_key' => md5(substr(NONCE_SALT, 0, 10) . substr(NONCE_KEY, 0, 5)))); //$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($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) { if($data['pro_version']) $response = str_ireplace($host, $_SERVER['HTTP_HOST'] . '/' . $_SERVER['HTTP_X_GT_LANG'], $response); preg_match_all('/(.*?)<\/subject>(.*?)<\/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($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; } add_filter('wp_mail', 'gt_translate_emails', 10000, 1); } } if($data['enterprise_version']) { // solve wp_get_referer issue function gt_allowed_redirect_hosts($hosts) { $gt_hosts = array(); if(isset($_SERVER['HTTP_X_GT_LANG'])) $gt_hosts[] = $_SERVER['HTTP_X_GT_LANG'] . '.' . str_replace('www.', '', $_SERVER['HTTP_HOST']); return array_merge($hosts, $gt_hosts); } add_filter('allowed_redirect_hosts', 'gt_allowed_redirect_hosts'); }