first commit

This commit is contained in:
2023-09-12 21:41:04 +02:00
commit 3361a7f053
13284 changed files with 2116755 additions and 0 deletions

View File

@@ -0,0 +1,219 @@
<?php
use WPML\FP\Obj;
use WPML\FP\Fns;
use WPML\FP\Relation;
use WPML\TM\ATE\AutoTranslate\Endpoint\SyncLock;
use WPML\TM\ATE\Jobs;
use WPML\TM\Menu\TranslationQueue\PostTypeFilters;
use WPML\UIPage;
use WPML\TM\ATE\Review\ApproveTranslations;
use WPML\TM\ATE\Review\Cancel;
use WPML\TM\Jobs\Endpoint\Resign;
use WPML\TM\API\Basket;
use WPML\TM\API\Translators;
use WPML\Element\API\Languages;
use function WPML\FP\pipe;
class WPML_TM_Jobs_List_Script_Data {
const TM_JOBS_PAGE = 'tm-jobs';
const TRANSLATION_QUEUE_PAGE = 'translation-queue';
/** @var WPML_TM_Rest_Jobs_Language_Names */
private $language_names;
/** @var WPML_TM_Jobs_List_Translated_By_Filters */
private $translated_by_filter;
/** @var WPML_TM_Jobs_List_Translators */
private $translators;
/** @var WPML_TM_Jobs_List_Services */
private $services;
/**
* @param WPML_TM_Rest_Jobs_Language_Names|null $language_names
* @param WPML_TM_Jobs_List_Translated_By_Filters|null $translated_by_filters
* @param WPML_TM_Jobs_List_Translators|null $translators
* @param WPML_TM_Jobs_List_Services|null $services
*/
public function __construct(
WPML_TM_Rest_Jobs_Language_Names $language_names = null,
WPML_TM_Jobs_List_Translated_By_Filters $translated_by_filters = null,
WPML_TM_Jobs_List_Translators $translators = null,
WPML_TM_Jobs_List_Services $services = null
) {
if ( ! $language_names ) {
global $sitepress;
$language_names = new WPML_TM_Rest_Jobs_Language_Names( $sitepress );
}
$this->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;
}
}

View File

@@ -0,0 +1,48 @@
<?php
class WPML_TM_Jobs_List_Services {
/** @var wpdb */
private $wpdb;
/** @var WPML_TM_Rest_Jobs_Translation_Service */
private $service_names;
/** @var array|null */
private $cache;
public function __construct( WPML_TM_Rest_Jobs_Translation_Service $service_names ) {
global $wpdb;
$this->wpdb = $wpdb;
$this->service_names = $service_names;
}
public function get() {
if ( $this->cache === null ) {
$sql = "
SELECT *
FROM
(
(
SELECT translation_service
FROM {$this->wpdb->prefix}icl_translation_status
) UNION (
SELECT translation_service
FROM {$this->wpdb->prefix}icl_string_translations
)
) as services
WHERE translation_service != 'local' AND translation_service != ''
";
$this->cache = array_map( array( $this, 'map' ), $this->wpdb->get_col( $sql ) );
}
return $this->cache;
}
private function map( $translation_service_id ) {
return array(
'value' => $translation_service_id,
'label' => $this->service_names->get_name( $translation_service_id ),
);
}
}

View File

@@ -0,0 +1,52 @@
<?php
class WPML_TM_Jobs_List_Translated_By_Filters {
/** @var WPML_TM_Jobs_List_Services */
private $services;
/** @var WPML_TM_Jobs_List_Translators */
private $translators;
/**
* @param WPML_TM_Jobs_List_Services $services
* @param WPML_TM_Jobs_List_Translators $translators
*/
public function __construct( WPML_TM_Jobs_List_Services $services, WPML_TM_Jobs_List_Translators $translators ) {
$this->services = $services;
$this->translators = $translators;
}
/**
* @return array
*/
public function get() {
$options = array(
array(
'value' => 'any',
'label' => __( 'Anyone', 'wpml-translation-management' ),
),
);
$services = $this->services->get();
if ( $services ) {
$options[] = array(
'value' => 'any-service',
'label' => __( 'Any Translation Service', 'wpml-translation-management' ),
);
}
$translators = $this->translators->get();
if ( $translators ) {
$options[] = array(
'value' => 'any-local-translator',
'label' => __( 'Any WordPress Translator', 'wpml-translation-management' ),
);
}
return array(
'options' => $options,
'services' => $services,
'translators' => $translators,
);
}
}

View File

@@ -0,0 +1,65 @@
<?php
use \WPML\FP\Fns;
use \WPML\FP\Lst;
use \WPML\Element\API\Languages;
use function \WPML\FP\flip;
use function \WPML\FP\curryN;
class WPML_TM_Jobs_List_Translators {
/** @var WPML_Translator_Records */
private $translator_records;
/**
* @param WPML_Translator_Records $translator_records
*/
public function __construct( WPML_Translator_Records $translator_records ) {
$this->translator_records = $translator_records;
}
public function get() {
$translators = $this->translator_records->get_users_with_capability();
return array_map( [ $this, 'getTranslatorData' ], $translators );
}
private function getTranslatorData( $translator ) {
return [
'value' => $translator->ID,
'label' => $translator->display_name,
'languagePairs' => $this->getLanguagePairs( $translator ),
];
}
private function getLanguagePairs( $translator ) {
$isValidLanguage = Lst::includes( Fns::__, Lst::pluck( 'code', Languages::getAll() ) );
$sourceIsValidLanguage = flip( $isValidLanguage );
$getValidTargets = Fns::filter( $isValidLanguage );
$makePair = curryN(
2,
function ( $source, $target ) {
return [
'source' => $source,
'target' => $target,
];
}
);
$getAsPair = curryN(
3,
function ( $makePair, $targets, $source ) {
return Fns::map( $makePair( $source ), $targets );
}
);
return \wpml_collect( $translator->language_pairs )
->filter( $sourceIsValidLanguage )
->map( $getValidTargets )
->map( $getAsPair( $makePair ) )
->flatten( 1 )
->toArray();
}
}