]> _ Git - physioassist-wordpress.git/blob
378131307a88261b275b8ddc8f0b31c9f27a46e5
[physioassist-wordpress.git] /
1 <?php
2
3 class TranslationProxy_Translator {
4         /**
5          * Get information about translators from current project. Works only for ICL as a Translation Service
6          *
7          * @param bool $force
8          *
9          * @return array|bool
10          */
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;
15
16                 if ( ! $ICL_Pro_Translation ) {
17                         $job_factory         = wpml_tm_load_job_factory();
18                         $ICL_Pro_Translation = new WPML_Pro_Translation( $job_factory );
19                 }
20
21                 if ( ! TranslationProxy::translator_selection_available() ) {
22                         return array();
23                 }
24
25                 $project = TranslationProxy::get_current_project();
26
27                 if ( ! $project ) {
28                         return array();
29                 }
30
31                 $cache_key   = md5( serialize( $project ) );
32                 $cache_group = 'get_icl_translator_status';
33
34                 $found  = false;
35                 $result = wp_cache_get( $cache_key, $cache_group, false, $found );
36
37                 if ( $found ) {
38                         return $result;
39                 }
40
41                 $translator_status = array();
42                 $website_details   = self::get_website_details(
43                         new TranslationProxy_Project( TranslationProxy::get_current_service(), 'xmlrpc', TranslationProxy::get_tp_client() ),
44                         $force
45                 );
46
47                 if ( false === (bool) $website_details ) {
48                         return array();
49                 }
50
51                 $language_pairs = array();
52                 if ( isset( $website_details['translation_languages']['translation_language'] ) ) {
53
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 );
58                         }
59
60                         foreach ( $translation_languages as $lang ) {
61                                 $translators = $_tr = array();
62                                 $max_rate    = false;
63                                 if ( isset( $lang['translators'], $lang['translators']['translator'] ) && ! empty( $lang['translators'] ) ) {
64                                         if ( ! isset( $lang['translators']['translator'][0] ) ) {
65                                                 $_tr[0] = $lang['translators']['translator'];
66                                         } else {
67                                                 $_tr = $lang['translators']['translator'];
68                                         }
69                                         foreach ( $_tr as $t ) {
70                                                 if ( false === $max_rate || $t['attr']['amount'] > $max_rate ) {
71                                                         $max_rate = $t['attr']['amount'];
72                                                 }
73                                                 $translators[] = array(
74                                                         'id'          => $t['attr']['id'],
75                                                         'nickname'    => $t['attr']['nickname'],
76                                                         'contract_id' => $t['attr']['contract_id'],
77                                                 );
78                                         }
79                                 }
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,
90                                 );
91                         }
92                 }
93
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'];
98                 }
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']
105                         );
106                 }
107
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']
114                         );
115                 }
116
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'];
120                 }
121                 wp_cache_set( $cache_key, $translator_status, $cache_group );
122
123                 return $translator_status;
124         }
125
126         private static function get_popup_link( $matches ) {
127                 global $sitepress;
128
129                 return TranslationProxy_Popup::get_link( $matches[2] );
130         }
131
132         /**
133          *
134          * Get information about language pairs (including translators). Works only for ICL as a Translation Service
135          *
136          * @return array
137          */
138         public static function get_language_pairs() {
139                 global $sitepress;
140
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;
147                                         break;
148                                 }
149                         }
150                         if ( ! $missing_translators ) {
151                                 $icl_lang_sub_status = $icl_lang_status;
152                         }
153                 }
154
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();
159                 }
160                 foreach ( $icl_lang_sub_status as $key => $status ) {
161                         if ( ! isset( $status['from'] ) ) {
162                                 unset( $icl_lang_sub_status[ $key ] );
163                         }
164                 }
165                 array_filter( $icl_lang_sub_status );
166
167                 return $icl_lang_sub_status;
168         }
169
170         /**
171          * Sends request to ICL to get website details (including language pairs)
172          *
173          * @param TranslationProxy_Project $project
174          * @param bool                     $force
175          *
176          * @return array
177          */
178         private static function get_website_details( $project, $force = false ) {
179
180                 require_once ICL_PLUGIN_PATH . '/inc/utilities/xml2array.php';
181                 require_once ICL_PLUGIN_PATH . '/lib/icl_api.php';
182
183                 $site_id    = $project->ts_id;
184                 $access_key = $project->ts_access_key;
185
186                 $default = array();
187
188                 if ( ! $site_id ) {
189                         return $default;
190                 }
191
192                 $icl_query = new ICanLocalizeQuery( $site_id, $access_key );
193
194                 return $icl_query->get_website_details( $force );
195         }
196
197
198         /**
199          * @param $translator_id
200          *
201          * @return string|false
202          */
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'];
211                                         }
212                                 }
213                         }
214                 }
215
216                 return isset( $translators[ $translator_id ] ) ? $translators[ $translator_id ] : false;
217         }
218
219         /**
220          * Synchronizes language pairs with ICL
221          *
222          * @global object $sitepress
223          *
224          * @param $project
225          * @param $language_pairs
226          */
227         public static function update_language_pairs( $project, $language_pairs ) {
228                 /** @var WPML_Pro_Translation $ICL_Pro_Translation */
229                 global $sitepress, $ICL_Pro_Translation;
230
231                 $params = array(
232                         'site_id'        => $project->ts_id,
233                         'accesskey'      => $project->ts_access_key,
234                         'create_account' => 0,
235                 );
236
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'] );
240                 }
241
242                 // update account - add language pair
243                 $incr = 0;
244                 foreach ( $language_pairs as $k => $v ) {
245                         if ( ! array_key_exists( $k, $lang_server ) ) {
246                                 unset( $language_pairs[ $k ] );
247                                 continue;
248                         }
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 ] );
254                                         }
255                                         continue;
256                                 }
257                                 $incr ++;
258                                 $params[ 'from_language' . $incr ] = $lang_server[ $k ];
259                                 $params[ 'to_language' . $incr ]   = $lang_server[ $k2 ];
260                         }
261                 }
262
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 );
267         }
268
269         public static function flush_website_details_cache() {
270                 delete_transient( WEBSITE_DETAILS_TRANSIENT_KEY );
271         }
272
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 );
277
278                 if ( $nonce_is_valid ) {
279                         self::flush_website_details_cache();
280                         $query_args = array(
281                                 'page' => urlencode( WPML_TM_FOLDER . '/menu/main.php' ),
282                                 'sm'   => urlencode( 'translators' ),
283                         );
284                         $link_url   = add_query_arg( $query_args, get_admin_url( null, 'admin.php' ) );
285                         wp_send_json_success( array( 'redirectTo' => $link_url ) );
286                 } else {
287                         wp_send_json_error( 'Nonce is not valid.' );
288                 }
289         }
290 }