*/ class Cf7_Polylang_Admin { /** * The ID of this plugin. * * @since 1.0.0 * @access private * @var string $plugin_name The ID of this plugin. */ private $plugin_name; /** * The version of this plugin. * * @since 1.0.0 * @access private * @var string $version The current version of this plugin. */ private $version; /** * The version of this plugin. * * @since 1.0.0 * @access private * @var boolean $is_lang_column_set be default set to false, true if CF7 calls the function to set the column value. */ private $is_lang_column_set; /** * Initialize the class and set its properties. * * @since 1.0.0 * @param string $plugin_name The name of this plugin. * @param string $version The version of this plugin. */ public function __construct( $plugin_name, $version ) { $this->plugin_name = $plugin_name; $this->version = $version; $this->is_lang_column_set=false; } /** * * Hooked on 'admin_notices' *@since 2.1.0 *@param string $param text_description *@return string text_description */ public function admin_notices(){ //check if we have any notices. global $pagenow; $notices = get_option('cf7-polylang-admin-notices', array()); if(empty($notices)) return; // debug_msg($notices, "pagenow: $pagenow"); if(!isset($notices[$pagenow])) return; foreach($notices[$pagenow] as $key=>$notice){ switch(true){ case strpos($key, 'page=') !== false && isset($_GET['page']) && $_GET['page'] === str_replace('page=','',$key): case strpos($key, 'post_type=') !== false && isset($_GET['post_type']) && $_GET['post_type'] === str_replace('post_type=','',$key): case $key==='any': case $key==='polylang': $dismiss = $notice['nonce'].'-forever'; // debug_msg($notice,"notice -> $key"); if ( ! PAnD::is_admin_notice_active( $dismiss ) ) { unset($notices[$pagenow]); update_option('cf7-polylang-admin-notices', $notices); continue 2; //continue foreach loop. } ?>

Return to Plugins'; wp_die( '

CF7 Polylang Module Extension requires Contact Form 7 & Polylang plugins, and has therefore been deactivated!

'.$button ); return false; } return true; } /** * Register the stylesheets for the admin area. * * @since 1.0.0 */ public function enqueue_styles() { } /** * Register the JavaScript for the admin area. * * @since 1.0.0 */ public function enqueue_scripts() { $screen = get_current_screen(); /** @since 2.4.0 load translation for requested locale on form edit page. */ if ( !empty($screen) and WPCF7_ContactForm::post_type==$screen->post_type and 'post'==$screen->base ){ $locale = get_user_locale(); if(function_exists('pll_current_language')){ $locale= pll_current_language('locale'); } $this->load_l10n_domains($locale); } } /** * Display a warning when the pluign is installed * Warning to save the settings in Polylang, hooks 'admin_notices' * @since 1.1.0 */ public function display_polylang_settings_warning(){ if(defined ("POLYLANG_VERSION") && version_compare(POLYLANG_VERSION, '2.3','>=')){ return ; //taken care programmatically. } //debug_msg(POLYLANG_VERSION); $options = get_option('polylang',false); if( $options && in_array(WPCF7_ContactForm::post_type, $options['post_types']) ){ return; } //check the version // $link = ''.__('settings','cf7_polylang').''; ?>

check_plugin_dependency(); $post_type = WPCF7_ContactForm::post_type; $types = array_merge($types, array($post_type => $post_type)); return $types; } /** * Change the 'Add New' button and introduce the langauge select * Hooks on 'admin_print_footer_scripts' * @since 1.1.3 */ public function add_language_select_to_table_page(){ //check that we are on the right page if(!isset($_GET['post_type']) || $_GET['post_type'] !== WPCF7_ContactForm::post_type) return; $locales = $language_names = array(); if( function_exists('pll_languages_list') ){ $locales = pll_languages_list(array('fields'=>'locale')); $language_names = pll_languages_list(array('fields'=>'name')); //error_log('CF7 Polylang languages '.print_r($language_names,true)); } $default_locale = 'en_US'; if(function_exists('pll_default_language')){ $default_locale = pll_default_language('locale'); } ?> check_plugin_dependency()){ return false; }; //what are the needed locales $pll_languages = array(); if( function_exists('pll_languages_list') ){ $pll_languages = pll_languages_list(array('fields'=>'locale')); }else{ debug_msg("CF7 POLYLANG: Unable to load polylang locales, missing function 'pll_languages_list'"); } /** Allow other plugins to load translation resources. * @param Array $plugin an array with 'plugin slug'=>'version' to load. * @since 2.4.0 */ $plugin_translations = apply_filters('cf7pll_load_plugin_translation_resource', array()); // if(!is_array($plugin_translations)) $plugin_translations = array(); $plugin_translations = array_merge( array('contact-form-7'=>WPCF7_VERSION), $plugin_translations); //load the translation api. require_once( ABSPATH . 'wp-admin/includes/translation-install.php' ); foreach($plugin_translations as $plugin=>$version){ //what locales are already installed $local_locales = $this->scan_local_locales($plugin); //which locales do we need to download, remove default locale en_US $languages = array_diff($pll_languages, $local_locales, array('en_US')); /** @since 2.4.0 */ foreach($languages as $idx=>$locale){ $last_check = get_option("_cf7pll-{$plugin}-v{$version}-{$locale}", date('Y-m-d', strtotime('-2 month')) ); if( $last_check > date('Y-m-d', strtotime('-1 month')) ){ unset($languages[$idx]);//locale did not exists less than a month ago. // debug_msg("CF7 POLYLANG: {$plugin} translation file for locale $locale not available, will check again later"); } } if(empty($languages)) continue; //nothing to be loaded //get available locales for CF7 debug_msg($languages, "CF7 POLYLANG: fetching translation for {$plugin}(v{$version})"); $this->get_translation($plugin, $version, $languages); } } /** * Retrieve translation file for a give plugin and locale. * *@since 2.4.0 *@param String $plugin plugin slug *@param String $version plugin version number *@param Array $languages an array of locales to retrieve. */ protected function get_translation($plugin, $version, $languages){ $plugin_locales = array(); $api = translations_api( 'plugins', array( 'slug' => $plugin, 'version' => $version) ); if ( is_wp_error( $api ) ) { debug_msg("CF7 POLYLANG: Error loading {$plugin} translations, {$api->get_error_message()}"); }else{ foreach($api['translations'] as $translation){ $plugin_locales[$translation['language']] = $translation['package']; } } //load the text domain for the locales found in Polylang. foreach($languages as $locale){ if(isset($plugin_locales[$locale])){ $zipFile = $locale.'.zip'; $zipPath = WP_LANG_DIR . '/plugins/';// Local Zip File Path //get the file stream, not using cURL as may not support https file_put_contents($zipFile, fopen($plugin_locales[$locale], 'r')); /* Open the Zip file */ $zip = new ZipArchive; $extractPath = WP_LANG_DIR . '/plugins/'; if( $zip->open($zipFile) != "true"){ debug_msg( "CF7 POLYLANG: Error, unable to open the Zip File $zipFile"); }else{ /* Extract Zip File */ $zip->extractTo($extractPath); $zip->close(); //delete zip file unlink($zipFile); //copy the .mo file to the CF7 language folder if(! file_exists( "{$extractPath}{$plugin}-{$locale}.mo") ){ debug_msg("CF7 POLYLANG: Unable to retrieve translation file {$plugin}-{$locale}.mo"); }//else debug_msg("CF7 POLYLANG: Added translation file contact-form-7-$locale.mo"); } }else{ //we need to report the missing translation update_option("_cf7pll-{$plugin}-v{$version}-{$locale}", date('Y-m-d') ); debug_msg("CF7 POLYLANG: Missing {$plugin} translation file for locale $locale"); } } } /** * Get installed CF7 locales. * * Returns an array of locales that are already installed. * * @since 1.0.0 * @return array an array of locales */ protected function scan_local_locales($plugin){ $translations = glob(WP_LANG_DIR . "/plugins/{$plugin}-*.mo"); $local_locales = array(); foreach($translations as $translation_file){ $loale = str_replace(WP_LANG_DIR . "/plugins/{$plugin}-",'',$translation_file); $local_locales[]=str_replace( '.mo','', $loale); } return $local_locales; } /** * Called when new language locale added in Polylang. * * Polylang tracks languages in use with a custom taxonomy 'language'. This function * is triggered on the action hook 'created_term'. * * @since 1.0.0 * @param int $term_id the new term ID * @param int $tt_id term_taxonomy_id * @param string $taxonomy the taxonomy to which the new term was added */ public function new_polylang_locale_added( $term_id, $tt_id, $taxonomy ){ //check if this is the polylang language taxonomy if('language' != $taxonomy){ return; } //let's get the new locale cf7 translation $this->get_cf7_translations(); } /** * Stop polylang synchronising form meta fields. * * @since 1.4.3 * @param array $keys meta fields to be synched . * @param boolean $sync if synchorinsation is enabled . * @param string $post_id post id from which to copy meta fields . * @return array filtered meta fields to be synched. **/ public function polylang_meta_fields_sync($keys, $sync, $post_id){ if(!$sync) return $keys; if('wpcf7_contact_form' != get_post_type($post_id)) return $keys; else return array(); //don't sync any cf7 meta fields } /** * Fix for special email tag [_site_url]. * *@since 2.2.0 *@param string $output output to filter. *@param string $name tag name. *@param boolean $html display flag. *@return string proper url. */ public function cf7_tag_site_url($output, $name, $html ) { if ( '_site_url' == $name ) { $filter = $html ? 'display' : 'raw'; $output = site_url(); } return $output; } /** * Introduction of email tag [_home_url]. * *@since 2.3.0 *@param string $output output to filter. *@param string $name tag name. *@param boolean $html display flag. *@return string proper url. */ public function cf7_tag_home_url($output, $name, $html ) { if ( '_home_url' == $name ) { $filter = $html ? 'display' : 'raw'; if(function_exists('pll_home_url')) $output = pll_home_url($_POST['_wpcf7_lang']); else { debuug_msg('WARNING: function pll_home_url() not found, unable to set home url mail tag, useing WP home_url() instead.'); $output = home_url(); } } return $output; } /** * Filter cf7 template craetion arguments to ensure locales are picked up. * Hooked to 'cf7sg_new_cf7_form_template_arguments'. *@since 2.3.4 *@param array $args arument list for cf7 for template. *@return string text_description */ public function new_form_template($args){ if(isset($_GET['locale'])){ $args['locale'] = $_GET['locale']; }else if(isset($_GET['new_lang'])){ //check for polylang $locale = $_GET['new_lang']; if(function_exists('pll_languages_list')){ $langs = pll_languages_list(); $locales = pll_languages_list(array('fields'=>'locale')); foreach($langs as $idx => $lang){ if($lang == $locale){ $locale = $locales[$idx]; } } } $args['locale'] =$locale; }else $args['locale'] = get_locale(); /** @since 2.4.0 make sure the translation files for the plugin domains are loaded */ $this->load_l10n_domains($args['locale']); return $args; } /** * load translation domains for other plugins. *@since 2.4.0 *@param string $param text_description *@return string text_description */ protected function load_l10n_domains($locale){ //if the user locale is is requested, then translation files already loaded. if ( is_admin() && get_user_locale() == $locale) return true; $plugin_translations = apply_filters('cf7pll_load_plugin_translation_resource', array()); foreach($plugin_translations as $plugin=>$version){ //make sure we have at least 1 default locale should Polylang change its API. $available_locales = array('en_US'); if( function_exists('pll_languages_list') ){ $available_locales = pll_languages_list(array('fields'=>'locale')); } //is the requested locale loaded among polylang languages? if ( ! in_array( $locale, $available_locales ) ) { if(function_exists('pll_default_language')){ $locale = pll_default_language('locale'); }else{ $locale = $locales[0]; } } if ( is_textdomain_loaded( $plugin ) ) { unload_textdomain( $plugin ); } $mofile = sprintf( '%s-%s.mo', $plugin, $locale ); //check the installation language path first. $domain_path = path_join( WP_LANG_DIR, 'plugins' ); $loaded = load_textdomain( $plugin, path_join( $domain_path, $mofile ) ); if ( ! $loaded ) { //else, check the plugin language folder. $domain_path = path_join( WP_PLUGIN_DIR, "{$plugin}/languages" ); load_textdomain( $plugin, path_join( $domain_path, $mofile ) ); } } } /** * Save locale and messages. * *@since 2.4.1 *@param string $post_id post id */ public function save_locale($post_id){ $current = sanitize_text_field($_POST['wpcf7-locale']); // $current = get_post_meta($post_id, '_locale', true); $update = $current; if(function_exists('pll_get_post_language')){ $update = pll_get_post_language($post_id, 'locale'); } if($current != $update){ update_post_meta($post_id, '_locale', $update); if(method_exists('WPCF7_ContactFormTemplate','messages')){ $this->load_l10n_domains($update); $msg = WPCF7_ContactFormTemplate::messages(); update_post_meta($post_id, '_messages',$msg); } } } /** * Filter plugins domains to load translation resources. * *@since 2.4.1 *@param Array $plugin_translations plugin-domain=>version-number pairs. *@return Array */ public function include_cf7_plugin($plugin_translations){ $plugin_translations['contact-form-7']=WPCF7_VERSION; return $plugin_translations; } }