languages = new Languages(); $this->mapping = new Mapping_Repository(); $this->license = new License_Manager( $this->languages ); $this->entitlements = new Entitlements( $this->license ); $this->content_access = new Content_Access( $this->languages, $this->mapping, $this->entitlements ); $this->review_translations = new Review_Translations( $this->languages, $this->mapping ); $this->ai_translator = new OpenAI_Translator( $this->languages, $this->mapping, $this->review_translations, $this->license ); $this->translations = new Translation_Service( $this->languages, $this->mapping ); $this->router = new Router( $this->languages, $this->mapping ); $this->switcher = new Switcher( $this->languages, $this->mapping, $this->router ); $this->elementor = new Elementor_Integration( $this->switcher, $this->languages, $this->mapping, $this->translations, $this->ai_translator ); $this->seo = new SEO( $this->languages, $this->mapping, $this->router ); $this->woocommerce = new WooCommerce( $this->languages, $this->mapping, $this->translations, $this->router ); $this->merchant_feed = new Merchant_Feed( $this->languages, $this->mapping ); $this->sitemap = new Sitemap( $this->languages, $this->mapping ); $this->xliiff = new XLIFF_Exchange( $this->languages, $this->mapping ); $this->internal_links = new Internal_Links( $this->languages, $this->mapping, $this->router, $this->ai_translator ); $this->admin = new Admin( $this->languages, $this->mapping, $this->translations, $this->ai_translator, $this->internal_links, $this->review_translations, $this->xliiff ); $this->manual_editor = new Manual_Translation_Editor( $this->languages, $this->mapping, $this->translations, $this->ai_translator ); } /** * Register hooks. * * @return void */ public function init() { $this->maybe_run_version_update(); $this->languages->init(); $this->license->init(); $this->entitlements->init(); $this->content_access->init(); $this->review_translations->init(); $this->ai_translator->init(); $this->router->init(); $this->switcher->init(); $this->elementor->init(); $this->seo->init(); $this->woocommerce->init(); $this->merchant_feed->init(); $this->sitemap->init(); $this->internal_links->init(); $this->manual_editor->init(); if ( is_admin() ) { $this->admin->init(); } } /** * Run lightweight version updates. * * @return void */ private function maybe_run_version_update() { $stored_version = get_option( 'sitelang_version', '' ); if ( SITELANG_VERSION === $stored_version ) { return; } // Restored or partially upgraded sites can be missing the mapping table even // while the plugin remains active. dbDelta is idempotent and preserves rows. Activator::create_tables(); if ( version_compare( (string) $stored_version, '1.0.15', '<' ) ) { $this->translations->repair_translated_product_skus(); } if ( version_compare( (string) $stored_version, '1.0.22', '<' ) ) { $this->translations->repair_translated_product_skus(); } if ( version_compare( (string) $stored_version, '1.0.23', '<' ) ) { $this->translations->disable_product_data_inheritance_for_existing_translations(); } if ( version_compare( (string) $stored_version, '1.0.47', '<' ) ) { // Managed AI is the only supported provider path; remove historical site-held credentials. delete_option( 'sitelang_openai_api_key' ); delete_option( 'sitelang_openai_available_models' ); } update_option( 'sitelang_version', SITELANG_VERSION, false ); update_option( 'sitelang_rewrite_flush_needed', 1, false ); update_option( 'sitelang_hard_rewrite_flush_needed', 1, false ); } }