first commit
This commit is contained in:
@@ -0,0 +1,207 @@
|
||||
<?php
|
||||
|
||||
class WPML_TM_Jobs_List_Script_Data {
|
||||
/** @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,
|
||||
];
|
||||
} else {
|
||||
$translation_service = [
|
||||
'id' => 0,
|
||||
'name' => '?',
|
||||
];
|
||||
}
|
||||
|
||||
return [
|
||||
'strings' => [
|
||||
'bulkActions' => __( 'Bulk actions', 'wpml-translation-management' ),
|
||||
'cancelJobs' => __( 'Cancel jobs', 'wpml-translation-management' ),
|
||||
'getTranslations' => __( 'Get translations', 'wpml-translation-management' ),
|
||||
'apply' => __( 'Apply', 'wpml-translation-management' ),
|
||||
'firstPage' => __( 'First page', 'wpml-translation-management' ),
|
||||
'previousPage' => __( 'Previous page', 'wpml-translation-management' ),
|
||||
'nextPage' => __( 'Next page', 'wpml-translation-management' ),
|
||||
'lastPage' => __( 'Last page', 'wpml-translation-management' ),
|
||||
'listNavigation' => __( 'Navigation', 'wpml-translation-management' ),
|
||||
'totalItemsText' => __( '0 items', 'wpml-translation-management' ),
|
||||
'of' => __( 'of', 'wpml-translation-management' ),
|
||||
'selectTranslator' => __( 'Select translator', 'wpml-translation-management' ),
|
||||
'assignTranslator' => __( 'Assign', 'wpml-translation-management' ),
|
||||
'externalActions' => __( 'External Actions', 'wpml-translation-management' ),
|
||||
'actions' => __( 'Actions', 'wpml-translation-management' ),
|
||||
'externalActionsTooltip' => __(
|
||||
'Actions that will happen on the translation service',
|
||||
'wpml-translation-management'
|
||||
),
|
||||
'selectAll' => __( 'Select all', 'wpml-translation-management' ),
|
||||
'filters' => [
|
||||
'title' => __( 'Title', 'wpml-translation-management' ),
|
||||
'batch_name' => __( 'Batch name', 'wpml-translation-management' ),
|
||||
'anyLanguage' => __( 'Any language', 'wpml-translation-management' ),
|
||||
'languageFrom' => __( 'from', 'wpml-translation-management' ),
|
||||
'languageTo' => __( 'to', 'wpml-translation-management' ),
|
||||
'filter' => __( 'Filter', 'wpml-translation-management' ),
|
||||
'asc' => __( 'Ascending', 'wpml-translation-management' ),
|
||||
'desc' => __( 'Descending', 'wpml-translation-management' ),
|
||||
'sort' => __( 'Sort', 'wpml-translation-management' ),
|
||||
'direction' => __( 'Direction', 'wpml-translation-management' ),
|
||||
'firstSort' => __( 'sort by', 'wpml-translation-management' ),
|
||||
'secondSort' => __( 'then sort by', 'wpml-translation-management' ),
|
||||
'translatedBy' => __( 'translated by', 'wpml-translation-management' ),
|
||||
'with' => __( 'with', 'wpml-translation-management' ),
|
||||
'sentBetween' => __( 'sent between', 'wpml-translation-management' ),
|
||||
'deadline' => __( 'with deadline between', 'wpml-translation-management' ),
|
||||
'reset' => __( 'Reset filters', 'wpml-translation-management' ),
|
||||
'selectStatus' => __( 'Select status', 'wpml-translation-management' ),
|
||||
],
|
||||
'progressMessages' => [
|
||||
'loadingJobs' => __( 'Loading jobs...', 'wpml-translation-management' ),
|
||||
'applyingTranslations' => __( 'Downloading translations...', 'wpml-translation-management' ),
|
||||
'syncBatch' => __( 'Synchronizing batch...', 'wpml-translation-management' ),
|
||||
'cancelJobs' => __( 'Canceling jobs...', 'wpml-translation-management' ),
|
||||
'assignTranslator' => __( 'Assigning translator...', 'wpml-translation-management' ),
|
||||
'downloadingXliff' => __( 'Downloading XLIFF file...', 'wpml-translation-management' ),
|
||||
],
|
||||
'confirmations' => [
|
||||
'applyingTranslations' => __( 'Translations downloaded', 'wpml-translation-management' ),
|
||||
'syncBatch' => __(
|
||||
'Batch synchronization has been sent',
|
||||
'wpml-translation-management'
|
||||
),
|
||||
'cancelJobs' => __( 'Jobs canceled', 'wpml-translation-management' ),
|
||||
'assignTranslator' => __( 'Translator assigned', 'wpml-translation-management' ),
|
||||
'downloadingXliff' => __( 'XLIFF file downloaded', 'wpml-translation-management' ),
|
||||
],
|
||||
'jobActions' => [
|
||||
'checkStatus' => [
|
||||
'active' => __( 'Check status', 'wpml-translation-management' ),
|
||||
'completed' => __( 'Translation is ready, no need to check its status', 'wpml-translation-management' ),
|
||||
'cancelled' => __( 'Translation is cancelled, no need to check its status', 'wpml-translation-management' ),
|
||||
'readyToDownload' => __( 'Translation is ready to download, no need to check its status', 'wpml-translation-management' ),
|
||||
'alreadySynced' => __( 'Translation has already been synchronized, no need to check its status', 'wpml-translation-management' ),
|
||||
'local' => __( 'This is a local job, no need to check its status', 'wpml-translation-management' ),
|
||||
],
|
||||
|
||||
'downloadXLIFF' => [
|
||||
'activeIconText' => __( 'Download the translated XLIFF file', 'wpml-translation-management' ),
|
||||
'localJob' => __(
|
||||
'This is a local job so it does not have an XLIFF file to download',
|
||||
'wpml-translation-management'
|
||||
),
|
||||
'notReady' => __(
|
||||
'You cannot download the translation as it has not been completed',
|
||||
'wpml-translation-management'
|
||||
),
|
||||
'canceled' => __(
|
||||
'You cannot download the XLIFF file because TS_NAME has canceled the job',
|
||||
'wpml-translation-management'
|
||||
),
|
||||
],
|
||||
|
||||
'cancel' => [
|
||||
'activeIconText' => __( 'Cancel job', 'wpml-translation-management' ),
|
||||
// translators: "%s" is replaced with the name of the translation service associated with the job.
|
||||
'notLocalJob' => sprintf( __( 'Contact %s for cancellation', 'wpml-translation-management' ), $translation_service['name'] ),
|
||||
'alreadyFinished' => __( 'The job is already finished', 'wpml-translation-management' ),
|
||||
'alreadyCanceled' => __( 'The job is already canceled', 'wpml-translation-management' ),
|
||||
],
|
||||
|
||||
'getTranslations' => [
|
||||
'activeIconText' => __( 'Get translations', 'wpml-translation-management' ),
|
||||
'localJob' => __(
|
||||
'You cannot download the translation for a local job',
|
||||
'wpml-translation-management'
|
||||
),
|
||||
'notReady' => __(
|
||||
'You cannot download the translation as it has not been completed',
|
||||
'wpml-translation-management'
|
||||
),
|
||||
'completed' => __(
|
||||
'You have already downloaded this job',
|
||||
'wpml-translation-management'
|
||||
),
|
||||
'canceled' => __(
|
||||
'You cannot download this job because TS_NAME has canceled it',
|
||||
'wpml-translation-management'
|
||||
),
|
||||
],
|
||||
],
|
||||
'tpJobId' => 'TP ID: %d',
|
||||
],
|
||||
'settings' => [
|
||||
'columns' => WPML_TM_Rest_Jobs_Columns::get_columns(),
|
||||
'sortable' => WPML_TM_Rest_Jobs_Columns::get_sortable(),
|
||||
'pageSize' => 10,
|
||||
],
|
||||
'jobStatuses' => WPML_TM_Jobs_List_Status_Names::get_statuses(),
|
||||
'languages' => $this->language_names->get_active_languages(),
|
||||
'translatedByFilters' => $this->translated_by_filter->get(),
|
||||
'localTranslators' => $this->translators->get(),
|
||||
'translationService' => $translation_service,
|
||||
'siteKey' => WP_Installer::instance()->get_site_key( 'wpml' ),
|
||||
'batchUrl' => OTG_TRANSLATION_PROXY_URL . '/projects/%d/external',
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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 ),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
class WPML_TM_Jobs_List_Status_Names {
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public static function get_statuses() {
|
||||
return array(
|
||||
ICL_TM_NOT_TRANSLATED => __( 'Cancelled', 'wpml-translation-management' ),
|
||||
ICL_TM_WAITING_FOR_TRANSLATOR => __( 'Waiting for translator', 'wpml-translation-management' ),
|
||||
ICL_TM_IN_PROGRESS => __( 'In progress', 'wpml-translation-management' ),
|
||||
ICL_TM_NEEDS_UPDATE => __( 'Needs update', 'wpml-translation-management' ),
|
||||
ICL_TM_TRANSLATION_READY_TO_DOWNLOAD => __(
|
||||
'Translation ready to download',
|
||||
'wpml-translation-management'
|
||||
),
|
||||
ICL_TM_COMPLETE => __( 'Completed', 'wpml-translation-management' ),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
use \WPML\FP\Fns;
|
||||
use \WPML\FP\Lst;
|
||||
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::__, array_values( icl_get_languages_codes() ) );
|
||||
$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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user