language_names = $language_names; if ( ! $translators ) { global $wpdb; $translators = new WPML_TM_Jobs_List_Translators( new WPML_Translator_Records( $wpdb, new WPML_WP_User_Query_Factory(), wp_roles() ) ); } if ( ! $services ) { $services = new WPML_TM_Jobs_List_Services( WPML_TM_Rest_Jobs_Translation_Service::create() ); } if ( ! $translated_by_filters ) { $translated_by_filters = new WPML_TM_Jobs_List_Translated_By_Filters( $services, $translators ); } $this->translated_by_filter = $translated_by_filters; $this->translators = $translators; $this->services = $services; } /** * @return array */ public function get() { $translation_service = TranslationProxy::get_current_service(); if ( $translation_service ) { $translation_service = [ 'id' => $translation_service->id, 'name' => $translation_service->name, ]; } $isATEEnabled = \WPML_TM_ATE_Status::is_enabled_and_activated(); $data = [ 'isATEEnabled' => $isATEEnabled, 'ateJobsToSync' => $isATEEnabled ? Jobs::getJobsToSync() : [], 'languages' => $this->language_names->get_active_languages(), 'translatedByFilters' => $this->translated_by_filter->get(), 'localTranslators' => $this->translators->get(), 'translationServices' => $this->services->get(), 'isBasketUsed' => Basket::shouldUse(), 'translationService' => $translation_service, 'siteKey' => WP_Installer::instance()->get_site_key( 'wpml' ), 'batchUrl' => OTG_TRANSLATION_PROXY_URL . '/projects/%d/external', 'endpoints' => [ 'syncLock' => SyncLock::class, 'approveTranslationsReviews' => ApproveTranslations::class, 'cancelTranslationReviews' => Cancel::class, 'resign' => Resign::class, ], 'types' => $this->getTypesForFilter(), 'queryFilters' => $this->getFiltersFromUrl(), 'page' => UIPage::isTMJobs( $_GET ) ? self::TM_JOBS_PAGE : self::TRANSLATION_QUEUE_PAGE, 'reviewMode' => \WPML\Setup\Option::getReviewMode(), ]; if ( UIPage::isTranslationQueue( $_GET ) ) { global $sitepress; $tmXliffVersion = $sitepress->get_setting( 'tm_xliff_version' ); $data['xliffExport'] = [ 'nonce' => wp_create_nonce( 'xliff-export' ), 'translationQueueURL' => UIPage::getTranslationQueue(), 'xliffDefaultVersion' => $tmXliffVersion > 0 ? $tmXliffVersion : 12, ]; $data['hasTranslationServiceJobs'] = $this->hasTranslationServiceJobs(); $data['languagePairs'] = $this->buildLanguagePairs( Translators::getCurrent()->language_pairs ); } else { $data['languagePairs'] = $this->getAllPossibleLanguagePairs(); } return $data; } private function getAllPossibleLanguagePairs() { $languages = Languages::getActive(); $createPair = function ( $currentLanguage ) use ( $languages ) { $targets = Fns::reject( Relation::propEq( 'code', Obj::prop( 'code', $currentLanguage ) ), $languages ); return [ 'source' => $currentLanguage, 'targets' => $targets ]; }; $buildEntity = Obj::evolve( [ 'source' => $this->extractDesiredPropertiesFromLanguage(), 'targets' => Fns::map( $this->extractDesiredPropertiesFromLanguage() ), ] ); return \wpml_collect( $languages ) ->map( $createPair ) ->map( $buildEntity ) ->values() ->all(); } private function buildLanguagePairs( $pairs ) { $getLanguageDetails = Fns::memorize( pipe( Languages::getLanguageDetails(), $this->extractDesiredPropertiesFromLanguage() ) ); $buildPair = function ( $targetCodes, $sourceCode ) use ( $getLanguageDetails ) { $source = $getLanguageDetails( $sourceCode ); $targets = Fns::map( $getLanguageDetails, $targetCodes ); return [ 'source' => $source, 'targets' => $targets ]; }; return \wpml_collect( $pairs )->map( $buildPair )->values()->toArray(); } /** * @return Closure */ private function extractDesiredPropertiesFromLanguage() { return function ( $language ) { return [ 'code' => Obj::prop( 'code', $language ), 'name' => Obj::prop( 'display_name', $language ), ]; }; } private function getTypesForFilter() { $postTypeFilters = new PostTypeFilters( wpml_tm_get_jobs_repository( true, false ) ); return \wpml_collect( $postTypeFilters->get( [ 'include_unassigned' => true ] ) ) ->map( function ( $label, $name ) { return [ 'name' => $name, 'label' => $label ]; } ) ->values(); } private function getFiltersFromUrl() { $filters = []; if ( Obj::propOr( false, 'status', $_GET ) ) { $filters['status'] = [ Obj::prop( 'status', $_GET ) ]; } return $filters; } /** * @return bool */ private function hasTranslationServiceJobs() { $searchParams = new WPML_TM_Jobs_Search_Params(); $searchParams->set_scope( WPML_TM_Jobs_Search_Params::SCOPE_REMOTE ); $repository = wpml_tm_get_jobs_repository(); return $repository->get_count( $searchParams ) > 0; } }