Files
doitinpoland.com/wp-content/plugins/wpml-translation-management/inc/translation-proxy/translationproxy-project.class.php
2023-09-12 21:41:04 +02:00

511 lines
13 KiB
PHP

<?php
/**
* @package wpml-core
* @subpackage wpml-core
*/
require_once dirname( __FILE__ ) . '/translationproxy-api.class.php';
require_once dirname( __FILE__ ) . '/translationproxy-service.class.php';
require_once dirname( __FILE__ ) . '/translationproxy-batch.class.php';
/**
* Class TranslationProxy_Project
*/
class TranslationProxy_Project {
public $id;
/**
* @var string
*
* `access_key` used when sending **any request** to TP
*/
public $access_key;
/**
* @var int
*
* `ts_id` (aka `website_id`) is used **exclusively** when sending request directly to ICL
*/
public $ts_id;
/**
* @var string
*
* `ts_access_key` is used **exclusively** when sending request directly to ICL
*/
public $ts_access_key;
/**
* @var object
*/
public $service;
/** @var WPML_TP_Client $tp_client */
public $tp_client;
public $errors = array();
/**
* @param TranslationProxy_Service $service
* @param string $delivery
* @param WPML_TP_Client $tp_client
*/
public function __construct( $service, $delivery, WPML_TP_Client $tp_client ) {
$this->service = $service;
$this->tp_client = $tp_client;
$icl_translation_projects = TranslationProxy::get_translation_projects();
$project_index = self::generate_service_index( $service );
if ( $project_index && $icl_translation_projects && isset( $icl_translation_projects [ $project_index ] ) ) {
$project = $icl_translation_projects[ $project_index ];
$this->id = $project['id'];
$this->access_key = $project['access_key'];
$this->ts_id = $project['ts_id'];
$this->ts_access_key = $project['ts_access_key'];
$this->service->delivery_method = $delivery;
}
}
/**
* @return TranslationProxy_Service
*/
public function service() {
return $this->service;
}
/**
* Returns the index by which a translation service can be found in the array returned by
* \TranslationProxy::get_translation_projects
*
* @param $service object
*
* @return bool|string
*/
public static function generate_service_index( $service ) {
$index = false;
if ( $service ) {
$service->custom_fields_data = isset( $service->custom_fields_data ) ? $service->custom_fields_data : array();
if ( isset( $service->id ) ) {
$index = md5( $service->id . serialize( $service->custom_fields_data ) );
}
}
return $index;
}
/**
* Convert WPML language code to service language
*
* @param $language string
*
* @return bool|string
*/
private function service_language( $language ) {
return TranslationProxy_Service::get_language( $this->service, $language );
}
/*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Get information about the project (Translation Service)
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
public function custom_text( $location, $locale = 'en' ) {
$response = '';
if ( ! $this->ts_id || ! $this->ts_access_key ) {
return '';
}
// Sending Translation Service (ts_) id and access_key, as we are talking directly to the Translation Service
// Todo: use project->id and project->access_key once this call is moved to TP
$params = array(
'project_id' => $this->ts_id,
'accesskey' => $this->ts_access_key,
'location' => $location,
'lc' => $locale,
);
if ( $this->service->custom_text_url ) {
try {
$response = TranslationProxy_Api::service_request(
$this->service->custom_text_url,
$params,
'GET',
true,
true,
true
);
} catch ( Exception $e ) {
throw new RuntimeException(
'error getting custom text from Translation Service: ' . serialize( $params ) . ' url: ' . $this->service->custom_text_url,
0,
$e
);
}
}
return $response;
}
function current_service_name() {
return TranslationProxy::get_current_service_name();
}
function current_service() {
return TranslationProxy::get_current_service();
}
/*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* IFrames to display project info (Translation Service)
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
public function select_translator_iframe_url( $source_language, $target_language ) {
// Sending Translation Service (ts_) id and access_key, as we are talking directly to the Translation Service
$params['project_id'] = $this->ts_id;
$params['accesskey'] = $this->ts_access_key;
$params['source_language'] = $this->service_language( $source_language );
$params['target_language'] = $this->service_language( $target_language );
$params['compact'] = 1;
return $this->_create_iframe_url( $this->service->select_translator_iframe_url, $params );
}
public function translator_contact_iframe_url( $translator_id ) {
// Sending Translation Service (ts_) id and access_key, as we are talking directly to the Translation Service
$params['project_id'] = $this->ts_id;
$params['accesskey'] = $this->ts_access_key;
$params['translator_id'] = $translator_id;
$params['compact'] = 1;
if ( $this->service->translator_contact_iframe_url ) {
return $this->_create_iframe_url( $this->service->translator_contact_iframe_url, $params );
}
return false;
}
private function _create_iframe_url( $url, $params ) {
if ( $params ) {
$url = TranslationProxy_Api::add_parameters_to_url( $url, $params );
$url .= '?' . http_build_query( $params );
}
return $url;
}
/*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Jobs handling (Translation Proxy)
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/**
* @throws WPML_TP_Batch_Exception
*
* @param bool $source_language
* @param bool $target_languages
*
* @internal param bool $name
* @return false|WPML_TP_Batch
*/
function get_batch_job(
$source_language = false,
$target_languages = false
) {
$batch_data = TranslationProxy_Basket::get_batch_data();
if ( ! $batch_data ) {
if ( ! $source_language ) {
$source_language = TranslationProxy_Basket::get_source_language();
}
if ( ! $target_languages ) {
$target_languages = TranslationProxy_Basket::get_remote_target_languages();
}
if ( ! $source_language || ! $target_languages ) {
return false;
}
$batch_data = $this->create_batch_job( $source_language, $target_languages );
if ( $batch_data ) {
TranslationProxy_Basket::set_batch_data( $batch_data );
}
}
return $batch_data;
}
/**
* @throws WPML_TP_Batch_Exception
*
* @return false|int
*/
function get_batch_job_id() {
$ret = false;
$batch_data = $this->get_batch_job();
if ( $batch_data ) {
$ret = $batch_data->get_id();
}
return $ret;
}
/**
* @throws WPML_TP_Batch_Exception
*
* @param bool $source_language
* @param $target_languages
*
* @internal param bool $name
* @return false|WPML_TP_Batch
*/
public function create_batch_job( $source_language, $target_languages ) {
$batch_name = TranslationProxy_Basket::get_basket_name();
$batch_options = TranslationProxy_Basket::get_options();
$extra_fields = TranslationProxy_Basket::get_basket_extra_fields();
$batch_data = array(
'source_language' => $source_language,
'target_languages' => $target_languages,
'name' => $batch_name,
);
if ( ! $batch_data['source_language'] ) {
$batch_data['source_language'] = TranslationProxy_Basket::get_source_language();
}
if ( ! $batch_data['target_languages'] ) {
$batch_data['target_languages'] = TranslationProxy_Basket::get_remote_target_languages();
}
if ( ! $batch_data['source_language'] || ! $batch_data['target_languages'] ) {
return false;
}
if ( ! $batch_data['name'] ) {
$batch_data['name'] = sprintf(
__(
'%s: WPML Translation Jobs',
'wpml-translation-management'
),
get_option( 'blogname' )
);
}
TranslationProxy_Basket::set_basket_name( $batch_data['name'] );
if ( isset( $batch_options['deadline_date'] ) ) {
$batch_data['deadline'] = strtotime( $batch_options['deadline_date'] );
}
return $this->tp_client->batches()->create( $batch_data, $extra_fields );
}
/**
*
* Add Files Batch Job
*
* @throws WPML_TP_Batch_Exception
*
* @param string $file
* @param string $title
* @param string $cms_id
* @param string $url
* @param string $source_language
* @param string $target_language
* @param int $word_count
* @param int $translator_id
* @param string $note
*
* @return bool
*/
public function send_to_translation_batch_mode(
$file,
$title,
$cms_id,
$url,
$source_language,
$target_language,
$word_count,
$translator_id = 0,
$note = '',
$uuid = null
) {
$batch_id = $this->get_batch_job_id();
if ( ! $batch_id ) {
return false;
}
$job_data = array(
'file' => $file,
'word_count' => $word_count,
'title' => $title,
'cms_id' => $cms_id,
'udid' => $uuid,
'url' => $url,
'translator_id' => $translator_id,
'note' => $note,
'source_language' => $source_language,
'target_language' => $target_language,
);
$tp_job = $this->tp_client->batches()->add_job( $batch_id, $job_data );
if ( $tp_job ) {
return $tp_job->get_id();
}
}
/**
* @param bool|int $tp_batch_id
*
* @link http://git.icanlocalize.com/onthego/translation_proxy/wikis/commit_batch_job
*
* @return array|bool|mixed|null|stdClass|string
*/
function commit_batch_job( $tp_batch_id = false ) {
$tp_batch_id = $tp_batch_id ? $tp_batch_id : $this->get_batch_job_id();
if ( ! $tp_batch_id ) {
return true;
}
$params = array(
'api_version' => TranslationProxy_Api::API_VERSION,
'project_id' => $this->id,
'accesskey' => $this->access_key,
'batch_id' => $tp_batch_id,
);
$response = TranslationProxy_Api::proxy_request( '/batches/{batch_id}/commit.json', $params, 'PUT', false );
$basket_name = TranslationProxy_Basket::get_basket_name();
if ( $basket_name ) {
global $wpdb;
$batch_id_sql = "SELECT id FROM {$wpdb->prefix}icl_translation_batches WHERE batch_name=%s";
$batch_id_prepared = $wpdb->prepare(
$batch_id_sql,
array( $basket_name )
);
$batch_id = $wpdb->get_var( $batch_id_prepared );
$batch_data = array(
'batch_name' => $basket_name,
'tp_id' => $tp_batch_id,
'last_update' => date( 'Y-m-d H:i:s' ),
);
if ( isset( $response ) && $response ) {
$batch_data['ts_url'] = serialize( $response );
}
if ( ! $batch_id ) {
$wpdb->insert(
$wpdb->prefix . 'icl_translation_batches',
$batch_data
);
} else {
$wpdb->update(
$wpdb->prefix . 'icl_translation_batches',
$batch_data,
array( 'id' => $batch_id )
);
}
}
return isset( $response ) ? $response : false;
}
/**
*
* @return object[]
*/
public function jobs() {
return $this->get_jobs( 'any' );
}
/**
* @return object[]
*/
public function finished_jobs() {
return $this->get_jobs( 'translation_ready' );
}
public function set_delivery_method( $method ) {
$params = array(
'project_id' => $this->id,
'accesskey' => $this->access_key,
'project' => array( 'delivery_method' => $method ),
);
TranslationProxy_Api::proxy_request( '/projects.json', $params, 'put' );
return true;
}
public function fetch_translation( $job_id ) {
$params = array(
'project_id' => $this->id,
'accesskey' => $this->access_key,
'job_id' => $job_id,
);
return TranslationProxy_Api::proxy_download(
'/jobs/{job_id}/xliff.json',
$params
);
}
public function update_job( $job_id, $url = null, $state = 'delivered' ) {
$params = array(
'job_id' => $job_id,
'project_id' => $this->id,
'accesskey' => $this->access_key,
'job' => array(
'state' => $state,
),
);
if ( $url ) {
$params['job']['url'] = $url;
}
TranslationProxy_Api::proxy_request(
'/jobs/{job_id}.json',
$params,
'PUT'
);
}
/**
* @param string $state
*
* @return mixed
*/
private function get_jobs( $state = 'any' ) {
$batch = TranslationProxy_Basket::get_batch_data();
$params = array(
'project_id' => $this->id,
'accesskey' => $this->access_key,
'state' => $state,
);
if ( $batch ) {
$params['batch_id'] = $batch ? $batch->get_id() : false;
return TranslationProxy_Api::proxy_request(
'/batches/{batch_id}/jobs.json',
$params
);
} else {
// FIXME: remove this once TP will accept the TP Project ID: https://icanlocalize.basecamphq.com/projects/11113143-translation-proxy/todo_items/182251206/comments
$params['project_id'] = $this->id;
}
return TranslationProxy_Api::proxy_request( '/jobs.json', $params );
}
}