project = $project;
$this->sitepress = $sitepress;
$this->cms_id_helper = $cms_id_helper;
}
/**
* @return array containing strings displayed in the translation service polling status box
*
* @throws Exception in case communication with Translation Proxy fails
*/
public function get_status_array() {
try {
$data = $this->filter_obsolete( $this->project->jobs() );
} catch ( Exception $e ) {
throw new WPMLTranslationProxyApiException( 'Got the following error when trying to load status data from Translation Proxy via polling: '
. $e->getMessage(), 0, $e );
}
$button_text = esc_html__( 'Check status and get translations', 'wpml-translation-management' );
if ( ( $job_in_progress = $this->in_progress_count( $data ) ) == 1 ) {
$jobs_in_progress_text = sprintf( esc_html__( '%s1 translation job%s has been sent to remote translators',
'wpml-translation-management' ), '', '' );
} else {
$jobs_in_progress_text = sprintf( esc_html__( '%s%d translation jobs%s have been sent to remote translators',
'wpml-translation-management' ), '', $job_in_progress, '' );
}
$last_picked_up = $this->sitepress->get_setting( 'last_picked_up' );
$last_time_picked_up = ! empty( $last_picked_up ) ? date_i18n( 'Y, F jS @g:i a',
$last_picked_up ) : esc_html__( 'never', 'wpml-translation-management' );
$last_pickup_text = sprintf( esc_html__( 'Last check: %s', 'wpml-translation-management' ), $last_time_picked_up );
return array(
'jobs_in_progress_text' => $jobs_in_progress_text,
'button_text' => $button_text,
'last_pickup_text' => $last_pickup_text,
'polling_data' => $this->filter_known_pending( $data ),
);
}
/**
* @param array $data
*
* @return int number of jobs that are in progress with the translation service
*/
private function in_progress_count( array $data ) {
$count = 0;
foreach ( $data as $job ) {
$count += in_array( $job->job_state, array(
'waiting_translation',
'translation_ready',
'received'
), true )
|| ( $job->job_state === 'cancelled'
&& $job->cms_id
&& $this->cms_id_helper->get_translation_id( $job->cms_id ) )
|| apply_filters( 'wpml_st_job_state_pending', false, $job )
? 1 : 0;
}
return $count;
}
/**
* Removes pending translation jobs from the list of jobs to be synchronized
* with Translation Proxy
*
* @param array $jobs
*
* @return array jobs array, from which all pending jobs correctly tracked in the wpml database were removed
*/
private function filter_known_pending( array $jobs ) {
foreach ( $jobs as &$job ) {
if ( $job->cms_id
&& in_array( $job->job_state, array(
'waiting_translation',
'delivered'
) )
&& $this->cms_id_helper->get_translation_id( $job->cms_id )
) {
$job = null;
} elseif ( $job->job_state === 'delivered'
&& ! $job->cms_id
&& apply_filters( 'wpml_st_job_state_pending', false, $job )
) {
$job->job_state = 'translation_ready';
}
}
return array_values( array_filter( $jobs ) );
}
/**
* Filters those jobs who are obsolete on a account of a newer job
* existing for the given content from the TP returned data.
*
* @param array $jobs
*
* @return array
*/
private function filter_obsolete( array $jobs ) {
foreach ( $jobs as &$job ) {
if ( $job->cms_id ) {
$compared_jobs = array_filter( $jobs );
foreach ( $compared_jobs as $compared_job ) {
if ( $compared_job->cms_id === $job->cms_id && $compared_job->id > $job->id ) {
$job = null;
break;
}
}
}
}
return array_filter( $jobs );
}
}