load_dependencies(); $this->initialize_components(); $this->set_tp_product_name(); $this->define_admin_hooks(); $this->define_frontend_hooks(); } /** * Returns particular component by name. * * @param string $component 'loader' | 'settings' | 'translation_render' | * 'machine_translator' | 'query' | 'language_switcher' | * 'translation_manager' | 'url_converter' | 'languages' * @return mixed */ public function get_component( $component ){ return $this->$component; } /** * Includes necessary files. */ protected function load_dependencies() { require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-settings.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-translation-manager.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-editor-api-regular-strings.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-editor-api-gettext-strings.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-hooks-loader.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-languages.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-translation-render.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-language-switcher-v2.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-machine-translator.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-machine-translator-logger.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/glossary/class-glossary.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/glossary/class-glossary-queries.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/queries/class-query.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/queries/class-gettext-normalization.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/queries/class-gettext-table-creation.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/queries/class-gettext-insert-update.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/queries/class-regular-delete.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/queries/class-gettext-delete.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-url-converter.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-uri.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-upgrade.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/upgrade/class-upgrade-tasks-registry.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/upgrade/class-batch-processor.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-plugin-notices.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-advanced-tab.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-translation-memory.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-error-manager.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/external-functions.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/compatibility-functions.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/functions.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/custom-language.php'; if ( ! class_exists( 'Translangated\simple_html_dom' ) ) { // bundled copy, namespaced to Translangated\ so it cannot clash with other copies require_once TRANSLANGATED_PLUGIN_DIR . 'assets/lib/simplehtmldom/simple_html_dom.php'; } require_once TRANSLANGATED_PLUGIN_DIR . 'includes/shortcodes.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-machine-translation-tab.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/string-translation/class-string-translation.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/string-translation/class-string-translation-helper.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/string-translation/class-gettext-scan.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-search.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/gettext/class-gettext-manager.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/gettext/class-process-gettext.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/gettext/class-plural-forms.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-rewrite-rules.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-check-invalid-text.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-woocommerce-emails.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/string-translation/class-string-translation-api-gettext.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/string-translation/class-string-translation-api-regular.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-preferred-user-language.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/gutenberg-blocks/class-gutenberg-blocks.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-onboarding.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-abilities.php'; require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-language-switcher-tab.php'; if ( did_action( 'elementor/loaded' ) ) require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-elementor-language-for-blocks.php'; if ( defined( 'WPB_VC_VERSION' ) ) { require_once TRANSLANGATED_PLUGIN_DIR . 'includes/class-wp-bakery-language-for-blocks.php'; } } /** * Instantiates components. */ protected function initialize_components() { $this->loader = new Translangated_Hooks_Loader(); $this->languages = new Translangated_Languages(); $this->settings = new Translangated_Settings(); $this->advanced_tab = new Translangated_Advanced_Tab($this->settings->get_settings()); $this->advanced_tab->include_custom_codes(); $this->machine_translation_tab = new Translangated_Machine_Translation_Tab( $this->settings->get_settings() ); $this->machine_translation_tab->load_engines(); $this->language_switcher_tab = new Translangated_Language_Switcher_Tab( $this->settings->get_settings() ); $this->translation_render = new Translangated_Translation_Render( $this->settings->get_settings() ); $this->url_converter = new Translangated_Url_Converter( $this->settings->get_settings() ); $this->query = new Translangated_Query( $this->settings->get_settings() ); $this->machine_translator_logger = new Translangated_Machine_Translator_Logger( $this->settings->get_settings() ); $this->machine_translator = new Translangated_Machine_Translator( $this->settings->get_settings() ); // Will be overwritten in init_machine_translation with the actual machine translator class. Use this as replacement until then. $this->glossary = new Translangated_Glossary( $this->settings->get_settings() ); $this->glossary_queries = new Translangated_Glossary_Queries( $this->settings->get_settings() ); $this->translation_manager = new Translangated_Translation_Manager( $this->settings->get_settings() ); $this->editor_api_regular_strings = new Translangated_Editor_Api_Regular_Strings( $this->settings->get_settings() ); $this->editor_api_gettext_strings = new Translangated_Editor_Api_Gettext_Strings( $this->settings->get_settings() ); $this->notifications = new Translangated_Trigger_Plugin_Notifications( $this->settings->get_settings() ); $this->upgrade = new Translangated_Upgrade( $this->settings->get_settings() ); $this->translation_memory = new Translangated_Translation_Memory( $this->settings->get_settings() ); $this->error_manager = new Translangated_Error_Manager( $this->settings->get_settings() ); $this->string_translation = new Translangated_String_Translation( $this->settings->get_settings(), $this->loader ); $this->gettext_scan = new Translangated_Gettext_Scan( $this->settings->get_settings() ); $this->search = new Translangated_Search( $this->settings->get_settings() ); $this->gettext_manager = new Translangated_Gettext_Manager( $this->settings->get_settings() ); $this->rewrite_rules = new Translangated_Rewrite_Rules( $this->settings->get_settings() ); $this->check_invalid_text = new Translangated_Check_Invalid_Text( ); $this->woocommerce_emails = new Translangated_Woocommerce_Emails(); $this->preferred_user_language = new Translangated_Preferred_User_Language(); $this->onboarding_setup = new Translangated_Onboarding( $this->settings->get_settings() ); $this->abilities = new Translangated_Abilities(); $this->batch_processor = new Translangated_Batch_Processor(); //Gutenberg Blocks global $wp_version; if ( version_compare( $wp_version, "5.0.0", ">=" ) && apply_filters( 'translangated_initialize_gutenberg_blocks', true ) ) { $this->gutenberg_blocks = new Translangated_Gutenberg_Blocks( $this->settings->get_settings() ); } } /**Made this function static so it can be called without initializing this class * * We use this function to detect if we have any addons that require a license * Used throughout the plugin to detect the version for notifications, license checks, different messages. * Sets $this->tp_product_name that is different from TRANSLANGATED_EDITION constant. */ public static function set_tp_product_name_static(){ // by default, set tp_product_name is not set. // will be overwritten by active plugin names OR based on TRANSLANGATED_EDITION constant $tp_product_name = array(); // the names of your product should match the download names in EDD exactly // The order is important because we only match the last one. $translangated_all_tp_product_names = array( "translangated" => "Translangated", "translangated-business" => "Translangated Business", "translangated-developer" => "Translangated Developer", "translangated-personal" => "Translangated Personal", ); $active_plugins = get_option('active_plugins'); $last_found_product_name = array(); foreach ( $translangated_all_tp_product_names as $translangated_tp_product_folder => $translangated_tp_product_name ){ foreach( $active_plugins as $active_plugin ){ if( strpos( $active_plugin, $translangated_tp_product_folder.'/' ) === 0 ){ $last_found_product_name = array($translangated_tp_product_folder => $translangated_tp_product_name); break; } } } $tp_product_name = $last_found_product_name; /* * For the dev version simulate the business version * * TRANSLANGATED_EDITION possible values: * Translangated * Translangated - Dev * Translangated - Personal * Translangated - Business * Translangated - Developer */ if (defined('TRANSLANGATED_EDITION') && TRANSLANGATED_EDITION === 'Translangated - Dev') { $tp_product_name = array("translangated-business" => "Translangated Business"); } elseif (defined('TRANSLANGATED_EDITION') && TRANSLANGATED_EDITION === 'Translangated') { $tp_product_name = array("translangated" => "Translangated"); } elseif (defined('TRANSLANGATED_EDITION') && TRANSLANGATED_EDITION === 'Translangated - Personal') { $tp_product_name = array("translangated-personal" => "Translangated Personal"); } elseif (defined('TRANSLANGATED_EDITION') && TRANSLANGATED_EDITION === 'Translangated - Business') { $tp_product_name = array("translangated-business" => "Translangated Business"); } elseif (defined('TRANSLANGATED_EDITION') && TRANSLANGATED_EDITION === 'Translangated - Developer') { $tp_product_name = array("translangated-developer" => "Translangated Developer"); } // default fallback, if tp_product_name not yet set, force set it to Translangated business if (!$tp_product_name) { $tp_product_name = array("translangated-business" => "Translangated Business"); } return $tp_product_name; } // duplicate wrapper for the static function set_tp_product_name_static public function set_tp_product_name(){ $this->tp_product_name = self::set_tp_product_name_static(); } /** * Hooks methods used in admin area. */ protected function define_admin_hooks() { $this->loader->add_action( 'admin_menu', $this->settings, 'register_menu_page' ); $this->loader->add_action( 'admin_init', $this->settings, 'register_setting' ); $this->loader->add_action( 'admin_notices', $this->settings, 'admin_notices' ); $this->loader->add_action( 'admin_enqueue_scripts', $this->settings, 'enqueue_scripts_and_styles', 10, 1 ); $this->loader->add_filter( 'plugin_action_links_' . TRANSLANGATED_PLUGIN_BASE , $this->settings, 'plugin_action_links', 10, 1 ); $this->loader->add_action( 'translangated_settings_navigation_tabs', $this->settings, 'add_navigation_tabs' ); $this->loader->add_action( 'translangated_settings_navigation_tabs', $this->settings, 'add_svg_icons' ); $this->loader->add_action( 'translangated_language_selector', $this->settings, 'languages_selector', 10, 1 ); $this->loader->add_action( 'translangated_settings_tabs', $this->advanced_tab, 'add_advanced_tab_to_settings', 10, 1 ); $this->loader->add_action( 'admin_menu', $this->advanced_tab, 'add_submenu_page_advanced' ); $this->loader->add_action( 'translangated_output_advanced_settings_options', $this->advanced_tab, 'output_advanced_options' ); $this->loader->add_action( 'translangated_before_output_advanced_settings_options', $this->advanced_tab, 'translangated_advanced_settings_content_table' ); $this->loader->add_action( 'admin_init', $this->advanced_tab, 'register_setting' ); $this->loader->add_action( 'admin_notices', $this->advanced_tab, 'admin_notices' ); //Machine Translation tab $this->loader->add_action( 'translangated_settings_tabs', $this->machine_translation_tab, 'add_tab_to_navigation', 10, 1 ); $this->loader->add_action( 'admin_menu', $this->machine_translation_tab, 'add_submenu_page' ); $this->loader->add_action( 'admin_init', $this->machine_translation_tab, 'register_setting' ); $this->loader->add_action( 'admin_notices', $this->machine_translation_tab, 'admin_notices' ); $this->loader->add_action( 'translangated_machine_translation_extra_settings_bottom', $this->machine_translation_tab, 'display_unsupported_languages' ); $this->loader->add_action( 'translangated_before_output_machine_translation_settings_options', $this->machine_translation_tab, 'translangated_machine_translation_content_table' ); //Machine Translation Logger defaults $this->loader->add_action( 'translangated_machine_translation_sanitize_settings', $this->machine_translator_logger, 'sanitize_settings', 10, 1 ); //Glossary substitutions during machine translation $this->loader->add_filter( 'translangated_exclude_words_from_automatic_translation', $this->glossary, 'add_excluded_words', 10, 3 ); $this->loader->add_filter( 'translangated_replace_placeholders_with', $this->glossary, 'apply_replacements', 10, 7 ); //Glossary settings page $this->loader->add_action( 'admin_menu', $this->glossary, 'add_submenu_page' ); $this->loader->add_action( 'admin_init', $this->glossary, 'register_setting' ); $this->loader->add_action( 'admin_notices', $this->glossary, 'admin_notices' ); $this->loader->add_action( 'admin_menu', $this->glossary_queries, 'add_replace_submenu_page' ); $this->loader->add_action( 'admin_enqueue_scripts', $this->glossary_queries, 'enqueue_scripts' ); $this->loader->add_action( 'wp_ajax_translangated_glossary_get_terms', $this->glossary_queries, 'ajax_get_terms' ); $this->loader->add_action( 'wp_ajax_translangated_glossary_add_term', $this->glossary_queries, 'add_term' ); $this->loader->add_action( 'wp_ajax_translangated_glossary_edit_term', $this->glossary_queries, 'edit_term' ); $this->loader->add_action( 'wp_ajax_translangated_glossary_delete_term', $this->glossary_queries, 'delete_term' ); $this->loader->add_action( 'wp_ajax_translangated_glossary_replace_in_dictionary', $this->glossary_queries, 'replace_in_dictionary' ); $this->loader->add_action( 'wp_ajax_translangated_glossary_search_dictionary', $this->glossary_queries, 'search_dictionary' ); //Error manager hooks $this->loader->add_action( 'admin_init', $this->error_manager, 'show_notification_about_errors', 10 ); $this->loader->add_action( 'admin_menu', $this->error_manager, 'register_submenu_errors_page', 10 ); $this->loader->add_action( 'translangated_dismiss_notification', $this->error_manager, 'clear_notification_from_db', 10, 2 ); $this->loader->add_filter( 'translangated_machine_translation_sanitize_settings', $this->error_manager, 'clear_disable_machine_translation_notification_from_db', 10, 1 ); $this->loader->add_filter( 'translangated_error_manager_page_output', $this->error_manager, 'show_instructions_on_how_to_fix', 7, 1 ); $this->loader->add_filter( 'translangated_error_manager_page_output', $this->error_manager, 'output_db_errors', 10, 1 ); $this->loader->add_action('load-admin_page_translangated_error_manager', $this->error_manager, 'disable_error_after_click_link', 10); // Front-end dynamic translation (DOM changes). Safe for logged-out visitors $this->loader->add_action( 'wp_ajax_nopriv_translangated_get_translations_domchanges', $this->editor_api_regular_strings, 'get_translations_domchanges' ); $this->loader->add_action( 'wp_ajax_translangated_get_translations_domchanges', $this->editor_api_regular_strings, 'get_translations_domchanges' ); // Editor-only (authenticated + capability-gated inside get_translations). $this->loader->add_action( 'wp_ajax_translangated_get_translations_regular', $this->editor_api_regular_strings, 'get_translations' ); $this->loader->add_action( 'wp_ajax_translangated_save_translations_regular', $this->editor_api_regular_strings, 'save_translations' ); $this->loader->add_action( 'wp_ajax_translangated_split_translation_block', $this->editor_api_regular_strings, 'split_translation_block' ); $this->loader->add_action( 'wp_ajax_translangated_create_translation_block', $this->editor_api_regular_strings, 'create_translation_block' ); $this->loader->add_action( 'wp_ajax_translangated_get_translations_gettext', $this->editor_api_gettext_strings, 'gettext_get_translations' ); $this->loader->add_action( 'wp_ajax_translangated_save_translations_gettext', $this->editor_api_gettext_strings, 'gettext_save_translations' ); $this->loader->add_action( 'wp_ajax_translangated_get_similar_string_translation', $this->translation_memory, 'ajax_get_similar_string_translation' ); $this->loader->add_action( 'wp_ajax_translangated_scan_gettext', $this->gettext_scan, 'scan_gettext' ); $this->loader->add_filter( 'translangated_get_existing_translations', $this->translation_manager, 'display_possible_db_errors', 20, 3 ); $this->loader->add_action( 'wp_ajax_translangated_save_editor_user_meta', $this->translation_manager, 'save_editor_user_meta', 10 ); $this->loader->add_action( 'translangated_editor_notices', $this->translation_manager, 'display_notice_to_upgrade_gettext_in_editor', 10, 1 ); $this->loader->add_action( 'translangated_editor_notices', $this->translation_manager, 'display_notice_to_upgrade_slugs_in_editor', 10, 1 ); $this->loader->add_filter( 'translangated_skip_selectors_from_dynamic_translation', $this->translation_render, 'skip_base_attributes_from_dynamic_translation', 10, 1 ); $this->loader->add_action( 'admin_menu', $this->upgrade, 'register_menu_page' ); $this->loader->add_action( 'admin_init', $this->upgrade, 'show_admin_error_message' ); $this->loader->add_action( 'admin_init', $this->upgrade, 'maybe_start_gettext_tables_optimization_from_notice' ); $this->loader->add_action( 'admin_init', $this->upgrade, 'show_admin_notice' ); $this->loader->add_action( 'admin_init', $this->upgrade, 'show_notification_about_add_ons_removal' ); $this->loader->add_action( 'admin_init', $this->upgrade, 'translangated_prepare_options_for_database_optimization' ); $this->loader->add_action( 'admin_enqueue_scripts', $this->upgrade, 'enqueue_update_script', 10, 1 ); $this->loader->add_action( 'wp_ajax_translangated_update_database', $this->upgrade, 'translangated_update_database' ); // Filter rewrite rules for .htaccess $this->loader->add_filter( 'mod_rewrite_rules', $this->rewrite_rules, 'translangated_remove_language_param', 100 ); // Add hooks for translating WooCommerce emails $this->loader->add_action( 'init', $this->woocommerce_emails, 'initialize_hooks' ); $this->loader->add_action( 'show_user_profile', $this->preferred_user_language, 'always_use_this_language', 99, 1 ); $this->loader->add_action( 'edit_user_profile', $this->preferred_user_language, 'always_use_this_language', 99, 1 ); $this->loader->add_action( 'personal_options_update', $this->preferred_user_language, 'update_profile_fields', 99, 1 ); $this->loader->add_action( 'edit_user_profile_update', $this->preferred_user_language, 'update_profile_fields', 99, 1 ); $this->loader->add_filter( 'translangated_wp_languages', $this->languages, 'add_extra_languages', 10, 1 ); } /** * Hooks methods used in front-end */ protected function define_frontend_hooks(){ //we do not need the plugin in cron requests ? if( wp_doing_cron() ) return; $this->loader->add_action( 'init', $this->translation_render, 'start_output_buffer', apply_filters( 'translangated_start_output_buffer_priority', 0 ) ); $this->loader->add_action( 'wp_enqueue_scripts', $this->translation_render, 'enqueue_scripts', 10 ); $this->loader->add_action( 'wp_enqueue_scripts', $this->translation_render, 'enqueue_dynamic_translation', 1 ); $this->loader->add_filter( 'wp_redirect', $this->translation_render, 'force_preview_on_url_redirect', 99, 2 ); $this->loader->add_filter( 'wp_redirect', $this->translation_render, 'force_language_on_form_url_redirect', 99, 2 ); $this->loader->add_filter( 'translangated_before_translate_content', $this->translation_render, 'force_preview_on_url_in_ajax', 10 ); $this->loader->add_filter( 'translangated_before_translate_content', $this->translation_render, 'force_form_language_on_url_in_ajax', 20 ); /* handle CDATA str replacement from the content as it is messing up the renderer */ $this->loader->add_filter( "translangated_before_translate_content", $this->translation_render, 'handle_cdata', 1000 ); $this->loader->add_action( "translangated_set_translation_for_attribute", $this->translation_render, 'translate_image_srcset_attributes', 10, 3 ); $this->loader->add_filter( "translangated_translateable_strings", $this->translation_render, 'antispambot_infinite_detection_fix', 10, 6 ); $this->loader->add_filter( "translangated_allow_machine_translation_for_string", $this->translation_render, 'allow_machine_translation_for_string', 10, 4 ); $this->loader->add_filter( "translangated_allow_machine_translation_for_string", $this->translation_render, 'skip_automatic_translation_for_no_auto_translation_selector', 10, 5 ); $this->loader->add_filter( "translangated_allow_machine_translation_for_string", $this->translation_render, 'skip_strings_that_cannot_be_auto_translated', 10, 5 ); $this->loader->add_filter( "rest_pre_echo_response", $this->translation_render, 'handle_generic_rest_api_translations', 10, 3 ); $this->loader->add_filter( "oembed_response_data", $this->translation_render, 'oembed_response_data', 10, 4 ); $this->loader->add_filter( "translangated_translated_html", $this->translation_render, 'restore_feed_camelcase_tags', 10, 4 ); /* add custom containers for post content and pots title so we can identify string that are part of them */ $this->loader->add_filter( "the_content", $this->translation_render, 'wrap_with_post_id', 1000 ); $this->loader->add_filter( "the_title", $this->translation_render, 'wrap_with_post_id', 1000, 2 ); // Language switcher $this->language_switcher = Translangated_Language_Switcher_V2::instance( $this->settings->get_settings(), $this ); $this->loader->add_action( 'init', $this->language_switcher, 'init', 1 ); $this->loader->add_action( 'translangated_translation_manager_footer', $this->translation_manager, 'enqueue_scripts_and_styles' ); $this->loader->add_filter( 'template_include', $this->translation_manager, 'translation_editor', 99999 ); $this->loader->add_filter( 'option_date_format', $this->translation_manager, 'filter_the_date' ); $this->loader->add_action( 'wp_enqueue_scripts', $this->translation_manager, 'enqueue_preview_scripts_and_styles' ); $this->loader->add_action( 'admin_init', $this->translation_manager, 'maybe_dismiss_admin_bar_notification' ); $this->loader->add_action( 'admin_bar_menu', $this->translation_manager, 'add_shortcut_to_translation_editor', 90, 1 ); $this->loader->add_action( 'admin_enqueue_scripts', $this->translation_manager, 'add_styling_to_admin_bar_button', 10 ); $this->loader->add_action( 'wp_enqueue_scripts', $this->translation_manager, 'add_styling_to_admin_bar_button', 10 ); $this->loader->add_filter( 'show_admin_bar', $this->translation_manager, 'hide_admin_bar_when_in_editor', 90 ); $this->loader->add_action( 'enqueue_block_editor_assets', $this->translation_manager, 'translangated_add_shortcut_to_translangated_editor_gutenberg', 90); $this->loader->add_filter( 'template_include', $this->string_translation, 'string_translation_editor', 99999 ); $this->loader->add_filter( 'translangated_string_types', $this->string_translation, 'register_string_types', 10, 1 ); $this->loader->add_filter( 'translangated_editor_nonces', $this->string_translation, 'add_nonces_for_saving_translation', 10, 1 ); $this->loader->add_action( 'translangated_string_translation_editor_footer', $this->string_translation, 'enqueue_scripts_and_styles' ); $this->loader->add_action( 'init', $this->string_translation, 'register_ajax_hooks' ); $this->loader->add_filter( 'home_url', $this->url_converter, 'add_language_to_home_url', 1, 4 ); $this->loader->add_action( 'wp_head', $this->url_converter, 'add_hreflang_to_head' ); $this->loader->add_filter( 'language_attributes', $this->url_converter, 'change_lang_attr_in_html_tag', 10, 1 ); $this->loader->add_filter('translangated_is_file', $this->url_converter, 'does_url_contains_array', 10, 2); $this->loader->add_filter('translangated_hreflang', $this->url_converter, 'replace_iso_2_with_iso_3_for_hreflang', 10, 2); $this->loader->add_filter('wp_footer', $this->url_converter, 'add_tp_language_lang_attribute', 1); $this->loader->add_filter( 'widget_text', null, 'do_shortcode', 11 ); $this->loader->add_filter( 'widget_text', null, 'shortcode_unautop', 11 ); /* handle dynamic texts with gettext */ $this->loader->add_filter( 'locale', $this->languages, 'change_locale', 99999 ); $this->loader->add_filter( 'plugin_locale', $this->languages, 'change_locale', 99999 ); // determine_locale() picks which .mo files load; align it with the TP language so // frontend AJAX/REST does not load the user's profile-locale catalog. $this->loader->add_filter( 'determine_locale', $this->languages, 'change_determine_locale', 99999 ); $this->loader->add_action( 'init', $this->gettext_manager, 'create_gettext_translated_global' ); $this->loader->add_action( 'init', $this->gettext_manager, 'initialize_gettext_processing' ); $this->loader->add_action( 'translangated_call_gettext_filters', $this->gettext_manager, 'verify_locale_of_loaded_textdomain' ); $this->loader->add_action( 'shutdown', $this->gettext_manager, 'machine_translate_gettext', 100 ); /* we need to treat the date_i18n function differently so we remove the gettext wraps */ $this->loader->add_filter( 'date_i18n', $this->gettext_manager, 'handle_date_i18n_function_for_gettext', 1, 4 ); /* strip esc_url() from gettext wraps */ $this->loader->add_filter( 'clean_url', $this->gettext_manager, 'translangated_strip_gettext_tags_from_esc_url', 1, 3 ); /* strip gettext wraps before sanitize_title(); default-language accent rules for slugs saved on translated pages */ $this->loader->add_filter( 'sanitize_title', $this->gettext_manager, 'translangated_sanitize_title', 1, 3 ); /* define an update hook here */ $this->loader->add_action( 'plugins_loaded', $this->upgrade, 'check_for_necessary_updates', 10 ); $this->loader->add_filter( 'translangated_language_name', $this->languages, 'beautify_language_name', 10, 4 ); $this->loader->add_filter( 'translangated_languages', $this->languages, 'reorder_languages', 10, 2 ); /* set up wp_mail hooks */ $this->loader->add_filter( 'wp_mail', $this->translation_render, 'wp_mail_filter', 1 ); /* fix wptexturize to always replace with the default translated strings */ $this->loader->add_action( 'gettext_with_context', $this->translation_render, 'fix_wptexturize_characters', 999, 4 ); /* ?or init ? hook here where you can change the $current_user global */ $this->loader->add_action( 'init', $this->translation_manager, 'translangated_view_as_user' ); /** * we need to modify the permalinks structure for woocommerce when we switch languages * when woo registers post_types and taxonomies in the rewrite parameter of the function they change the slugs of the items (they are localized with _x ) * we can't flush the permalinks on every page load so we filter the rewrite_rules option */ $this->loader->add_filter( "option_rewrite_rules", $this->url_converter, 'woocommerce_filter_permalinks_on_other_languages' ); $this->loader->add_filter( "option_woocommerce_permalinks", $this->url_converter, 'woocommerce_filter_permalink_option' ); $this->loader->add_filter( "pre_update_option_woocommerce_permalinks", $this->url_converter, 'prevent_permalink_update_on_other_languages', 10, 2 ); $this->loader->add_filter( "pre_update_option_rewrite_rules", $this->url_converter, 'delete_woocommerce_transient_permalink' ); $this->loader->add_filter( "pre_update_option_rewrite_rules", $this->url_converter, 'prevent_permalink_update_on_other_languages', 10, 2 ); /* add to the body class the current language */ $this->loader->add_filter( "body_class", $this->translation_manager, 'add_language_to_body_class' ); // machine translation $this->loader->add_action( 'plugins_loaded', $this, 'init_machine_translation', 2 ); //search $this->loader->add_filter( 'pre_get_posts', $this->search, 'translangated_search_filter', 99999999 ); $this->loader->add_filter( 'get_search_query', $this->search, 'translangated_search_query', 10 ); /* prevent indexing edit translation preview pages */ $this->loader->add_action( 'translangated_head', $this->translation_manager, 'output_noindex_tag', 100 ); $this->loader->add_action( 'wp_head', $this->translation_manager, 'output_noindex_tag', 100 ); } /** * Register hooks to WP. */ public function run() { /* * Hook that prevents running the hooks. Caution: some TP code like constructors of classes still run! */ $run_tp = apply_filters( 'translangated_allow_tp_to_run', true, $this->loader ); if ( $run_tp ) { $this->loader->run(); } } public function init_machine_translation(){ $this->machine_translator = $this->machine_translation_tab->get_active_engine(); } }