3 class TranslationProxy_Translator {
5 * Get information about translators from current project. Works only for ICL as a Translation Service
11 public static function get_icl_translator_status( $force = false ) {
12 /** @var SitePress $sitepress */
13 /** @var WPML_Pro_Translation $ICL_Pro_Translation */
14 global $sitepress, $ICL_Pro_Translation;
16 if ( ! $ICL_Pro_Translation ) {
17 $job_factory = wpml_tm_load_job_factory();
18 $ICL_Pro_Translation = new WPML_Pro_Translation( $job_factory );
21 if ( ! TranslationProxy::translator_selection_available() ) {
25 $project = TranslationProxy::get_current_project();
31 $cache_key = md5( serialize( $project ) );
32 $cache_group = 'get_icl_translator_status';
35 $result = wp_cache_get( $cache_key, $cache_group, false, $found );
41 $translator_status = array();
42 $website_details = self::get_website_details(
43 new TranslationProxy_Project( TranslationProxy::get_current_service(), 'xmlrpc', TranslationProxy::get_tp_client() ),
47 if ( false === (bool) $website_details ) {
51 $language_pairs = array();
52 if ( isset( $website_details['translation_languages']['translation_language'] ) ) {
54 $translation_languages = $website_details['translation_languages']['translation_language'];
55 if ( ! isset( $translation_languages[0] ) ) {
56 $buf = $translation_languages;
57 $translation_languages = array( 0 => $buf );
60 foreach ( $translation_languages as $lang ) {
61 $translators = $_tr = array();
63 if ( isset( $lang['translators'], $lang['translators']['translator'] ) && ! empty( $lang['translators'] ) ) {
64 if ( ! isset( $lang['translators']['translator'][0] ) ) {
65 $_tr[0] = $lang['translators']['translator'];
67 $_tr = $lang['translators']['translator'];
69 foreach ( $_tr as $t ) {
70 if ( false === $max_rate || $t['attr']['amount'] > $max_rate ) {
71 $max_rate = $t['attr']['amount'];
73 $translators[] = array(
74 'id' => $t['attr']['id'],
75 'nickname' => $t['attr']['nickname'],
76 'contract_id' => $t['attr']['contract_id'],
80 $language_pairs[] = array(
81 'from' => $sitepress->get_language_code( $ICL_Pro_Translation->server_languages_map( $lang['attr']['from_language_name'], true ) ),
82 'to' => $sitepress->get_language_code( $ICL_Pro_Translation->server_languages_map( $lang['attr']['to_language_name'], true ) ),
83 'have_translators' => $lang['attr']['have_translators'],
84 'available_translators' => $lang['attr']['available_translators'],
85 'applications' => $lang['attr']['applications'],
86 'contract_id' => $lang['attr']['contract_id'],
87 'id' => $lang['attr']['id'],
88 'translators' => $translators,
89 'max_rate' => $max_rate,
94 $translator_status['icl_lang_status'] = $language_pairs;
95 if ( isset( $res['client']['attr'] ) ) {
96 $translator_status['icl_balance'] = $res['client']['attr']['balance'];
97 $translator_status['icl_anonymous_user'] = $res['client']['attr']['anon'];
99 if ( isset( $res['html_status']['value'] ) ) {
100 $translator_status['icl_html_status'] = html_entity_decode( $res['html_status']['value'] );
101 $translator_status['icl_html_status'] = preg_replace_callback(
102 '#<a([^>]*)href="([^"]+)"([^>]*)>#i',
103 'self::get_popup_link',
104 $translator_status['icl_html_status']
108 if ( isset( $res['translators_management_info']['value'] ) ) {
109 $translator_status['translators_management_info'] = html_entity_decode( $res['translators_management_info']['value'] );
110 $translator_status['translators_management_info'] = preg_replace_callback(
111 '#<a([^>]*)href="([^"]+)"([^>]*)>#i',
112 'self::get_popup_link',
113 $translator_status['translators_management_info']
117 $translator_status['icl_support_ticket_id'] = null;
118 if ( isset( $res['attr']['support_ticket_id'] ) ) {
119 $translator_status['icl_support_ticket_id'] = (int) $res['attr']['support_ticket_id'];
121 wp_cache_set( $cache_key, $translator_status, $cache_group );
123 return $translator_status;
126 private static function get_popup_link( $matches ) {
129 return TranslationProxy_Popup::get_link( $matches[2] );
134 * Get information about language pairs (including translators). Works only for ICL as a Translation Service
138 public static function get_language_pairs() {
141 $icl_lang_status = $sitepress->get_setting( 'icl_lang_status', array() );
142 if ( ! empty( $icl_lang_status ) ) {
143 $missing_translators = false;
144 foreach ( $icl_lang_status as $lang ) {
145 if ( empty( $lang['translators'] ) ) {
146 $missing_translators = true;
150 if ( ! $missing_translators ) {
151 $icl_lang_sub_status = $icl_lang_status;
155 if ( ! isset( $icl_lang_sub_status ) ) {
156 $translator_status = self::get_icl_translator_status();
157 $icl_lang_sub_status = isset( $translator_status['icl_lang_status'] )
158 ? $translator_status['icl_lang_status'] : array();
160 foreach ( $icl_lang_sub_status as $key => $status ) {
161 if ( ! isset( $status['from'] ) ) {
162 unset( $icl_lang_sub_status[ $key ] );
165 array_filter( $icl_lang_sub_status );
167 return $icl_lang_sub_status;
171 * Sends request to ICL to get website details (including language pairs)
173 * @param TranslationProxy_Project $project
178 private static function get_website_details( $project, $force = false ) {
180 require_once ICL_PLUGIN_PATH . '/inc/utilities/xml2array.php';
181 require_once ICL_PLUGIN_PATH . '/lib/icl_api.php';
183 $site_id = $project->ts_id;
184 $access_key = $project->ts_access_key;
192 $icl_query = new ICanLocalizeQuery( $site_id, $access_key );
194 return $icl_query->get_website_details( $force );
199 * @param $translator_id
201 * @return string|false
203 public static function get_translator_name( $translator_id ) {
204 if ( TranslationProxy::translator_selection_available() ) {
205 $lang_status = self::get_language_pairs();
206 if ( $lang_status ) {
207 foreach ( $lang_status as $lp ) {
208 $lp_trans = ! empty( $lp['translators'] ) ? $lp['translators'] : array();
209 foreach ( $lp_trans as $tr ) {
210 $translators[ $tr['id'] ] = $tr['nickname'];
216 return isset( $translators[ $translator_id ] ) ? $translators[ $translator_id ] : false;
220 * Synchronizes language pairs with ICL
222 * @global object $sitepress
225 * @param $language_pairs
227 public static function update_language_pairs( $project, $language_pairs ) {
228 /** @var WPML_Pro_Translation $ICL_Pro_Translation */
229 global $sitepress, $ICL_Pro_Translation;
232 'site_id' => $project->ts_id,
233 'accesskey' => $project->ts_access_key,
234 'create_account' => 0,
237 $lang_server = array();
238 foreach ( $sitepress->get_active_languages() as $lang ) {
239 $lang_server[ $lang['code'] ] = $ICL_Pro_Translation->server_languages_map( $lang['english_name'] );
242 // update account - add language pair
244 foreach ( $language_pairs as $k => $v ) {
245 if ( ! array_key_exists( $k, $lang_server ) ) {
246 unset( $language_pairs[ $k ] );
249 foreach ( $v as $k2 => $v2 ) {
250 if ( ! array_key_exists( $k2, $lang_server ) ) {
251 unset( $language_pairs[ $k ][ $k2 ] );
252 if ( (bool) $language_pairs[ $k ] === false ) {
253 unset( $language_pairs[ $k ] );
258 $params[ 'from_language' . $incr ] = $lang_server[ $k ];
259 $params[ 'to_language' . $incr ] = $lang_server[ $k2 ];
263 require_once ICL_PLUGIN_PATH . '/inc/utilities/xml2array.php';
264 require_once ICL_PLUGIN_PATH . '/lib/icl_api.php';
265 $icl_query = new ICanLocalizeQuery();
266 $icl_query->updateAccount( $params );
269 public static function flush_website_details_cache() {
270 delete_transient( WEBSITE_DETAILS_TRANSIENT_KEY );
273 public static function flush_website_details_cache_action() {
274 $nonce = array_key_exists( 'nonce', $_POST ) ? $_POST['nonce'] : null;
275 $action = array_key_exists( 'action', $_POST ) ? $_POST['action'] : null;
276 $nonce_is_valid = wp_verify_nonce( $nonce, $action );
278 if ( $nonce_is_valid ) {
279 self::flush_website_details_cache();
281 'page' => urlencode( WPML_TM_FOLDER . '/menu/main.php' ),
282 'sm' => urlencode( 'translators' ),
284 $link_url = add_query_arg( $query_args, get_admin_url( null, 'admin.php' ) );
285 wp_send_json_success( array( 'redirectTo' => $link_url ) );
287 wp_send_json_error( 'Nonce is not valid.' );