/htdocs/wp-content/plugins/sitepress-multilingual-cms/inc/translation-management/pro-translation.class.php
PHP | 2138 lines | 1829 code | 222 blank | 87 comment | 202 complexity | 41e364292868e7ffbbffc54924dfffc1 MD5 | raw file
Possible License(s): GPL-2.0
Large files files are truncated, but you can click here to view the full file
- <?php
- // deprecated - used for string translations
- define ( 'CMS_TARGET_LANGUAGE_CREATED', 0);
- define ( 'CMS_TARGET_LANGUAGE_ASSIGNED', 1);
- define ( 'CMS_TARGET_LANGUAGE_TRANSLATED', 2);
- define ( 'CMS_TARGET_LANGUAGE_DONE', 3);
- define ( 'CMS_REQUEST_DONE', 6);
- define ( 'CMS_REQUEST_FAILED', 7);
- class ICL_Pro_Translation{
-
- private $tmg;
- protected static $__asian_languages = array('ja', 'ko', 'zh-hans', 'zh-hant', 'mn', 'ne', 'hi', 'pa', 'ta', 'th');
-
- function __construct(){
- global $iclTranslationManagement;
- $this->tmg =& $iclTranslationManagement;
-
- add_filter('xmlrpc_methods',array($this, 'custom_xmlrpc_methods'));
- add_action('post_submitbox_start', array($this, 'post_submitbox_start'));
-
- add_action('icl_ajx_custom_call', array($this, 'ajax_calls'), 10, 2);
-
- add_action('icl_hourly_translation_pickup', array($this, 'poll_for_translations'));
-
- }
-
- function ajax_calls($call, $data){
- global $sitepress_settings, $sitepress;
- switch($call){
- case 'set_pickup_mode':
- $method = intval($data['icl_translation_pickup_method']);
- $iclsettings['translation_pickup_method'] = $method;
- $iclsettings['icl_disable_reminders'] = isset($_POST['icl_disable_reminders']) ? 1 : 0;
-
- $sitepress->save_settings($iclsettings);
-
- if(!empty($sitepress_settings) && !empty($sitepress_settings['site_id']) && !empty($sitepress_settings['access_key'])){
- $data['site_id'] = $sitepress_settings['site_id'];
- $data['accesskey'] = $sitepress_settings['access_key'];
- $data['create_account'] = 0;
- $data['pickup_type'] = $method;
-
- $icl_query = new ICanLocalizeQuery();
- $res = $icl_query->updateAccount($data);
- }
-
- if($method == ICL_PRO_TRANSLATION_PICKUP_XMLRPC){
- wp_clear_scheduled_hook('icl_hourly_translation_pickup');
- }else{
- wp_schedule_event(time(), 'hourly', 'icl_hourly_translation_pickup');
- }
-
- echo json_encode(array('message'=>'OK'));
- break;
- case 'pickup_translations':
- if($sitepress_settings['translation_pickup_method']==ICL_PRO_TRANSLATION_PICKUP_POLLING){
- $fetched = $this->poll_for_translations(true);
- echo json_encode(array('message'=>'OK', 'fetched'=> urlencode(' ' . sprintf(__('Fetched %d translations.', 'sitepress'), $fetched))));
- }else{
- echo json_encode(array('error'=>__('Manual pick up is disabled.', 'sitepress')));
- }
- break;
- }
- }
-
- function send_post($post, $target_languages, $translator_id = 0){
- global $sitepress, $sitepress_settings, $wpdb, $iclTranslationManagement;
-
- // don't wait for init
- if(empty($this->tmg->settings)){
- $iclTranslationManagement->init();
- }
-
- if(is_numeric($post)){
- $post = get_post($post);
- }
- $post_id = $post->ID;
-
- $err = false;
-
- if(!$post){
- return false;
- }
-
- $orig_lang = $sitepress->get_language_for_element($post_id, 'post_' . $post->post_type);
- $__ld = $sitepress->get_language_details($orig_lang);
- $orig_lang_for_server = $this->server_languages_map($__ld['english_name']);
-
- if(empty($target_languages)) return false;
-
- // Make sure the previous request is complete.
- // Only send if it needs update
- foreach($target_languages as $target_lang){
-
- if($target_lang == $orig_lang) continue;
-
- $translation = $this->tmg->get_element_translation($post_id, $target_lang, 'post_' . $post->post_type);
-
- if(empty($translation)){ // translated the first time
- $tdata = array(
- 'translate_from' => array($orig_lang),
- 'translate_to' => array($target_lang=>1),
- 'post' => array($post_id),
- 'translator' => $translator_id,
- 'service' => 'icanlocalize'
- );
- $this->tmg->send_jobs($tdata);
- $translation = $this->tmg->get_element_translation($post_id, $target_lang, 'post_' . $post->post_type);
- }
-
- if($translation->needs_update || $translation->status == ICL_TM_NOT_TRANSLATED || $translation->status == ICL_TM_WAITING_FOR_TRANSLATOR){
-
- $iclq = new ICanLocalizeQuery($sitepress_settings['site_id'], $sitepress_settings['access_key']);
- if($post->post_type=='page'){
- $post_url = get_option('home') . '?page_id=' . ($post_id);
- }else{
- $post_url = get_option('home') . '?p=' . ($post_id);
- }
- $__ld = $sitepress->get_language_details($target_lang);
- $target_for_server = $this->server_languages_map($__ld['english_name']);
- if (isset($post->external_type) && $post->external_type) {
-
- $data['url'] = htmlentities($post_url);
- $data['target_languages'] = array($target_for_server);
-
- foreach ($post->string_data as $key => $value) {
- $data['contents'][$key] = array(
- 'translate' => 1,
- 'data' => base64_encode($value),
- 'format' => 'base64'
- );
- }
-
- $data['contents']['original_id'] = array(
- 'translate' => 0,
- 'data' => $post->post_id,
- );
- } else {
-
- // TAGS
- // ***************************************************************************
- foreach(wp_get_object_terms($post_id, 'post_tag') as $tag){
- $post_tags[$tag->term_taxonomy_id] = $tag->name;
- }
-
- if(@is_array($post_tags)){
- //only send tags that don't have a translation
- foreach($post_tags as $term_taxonomy_id=>$pc){
- $trid = $wpdb->get_var("SELECT trid FROM {$wpdb->prefix}icl_translations WHERE element_id='{$term_taxonomy_id}' AND element_type='tax_post_tag'");
- foreach($target_languages as $lang){
- $not_translated = false;
- if($trid != $wpdb->get_var("SELECT trid FROM {$wpdb->prefix}icl_translations WHERE language_code='{$lang}' AND trid='{$trid}' AND element_id IS NOT NULL")){
- $not_translated = true;
- break;
- }
- }
- if($not_translated){
- $tags_to_translate[$term_taxonomy_id] = $pc;
- }
- }
- sort($post_tags, SORT_STRING);
- }
-
- // CATEGORIES
- // ***************************************************************************
- foreach(wp_get_object_terms($post_id, 'category') as $cat){
- $post_categories[$cat->term_taxonomy_id] = $cat->name;
- }
-
- if(@is_array($post_categories)){
- //only send categories that don't have a translation
- foreach($post_categories as $term_taxonomy_id=>$pc){
- $trid = $wpdb->get_var("SELECT trid FROM {$wpdb->prefix}icl_translations WHERE element_id='{$term_taxonomy_id}' AND element_type='tax_category'");
- foreach($target_languages as $lang){
- $not_translated = false;
- if($trid != $wpdb->get_var("SELECT trid FROM {$wpdb->prefix}icl_translations WHERE language_code='{$lang}' AND trid='{$trid}' AND element_id IS NOT NULL")){
- $not_translated = true;
- break;
- }
- }
- if($not_translated){
- $categories_to_translate[$term_taxonomy_id] = $pc;
- }
- }
- sort($post_categories, SORT_STRING);
- }
-
- // CUSTOM TAXONOMIES
- // ***************************************************************************
- $taxonomies = $wpdb->get_col("
- SELECT DISTINCT tx.taxonomy
- FROM {$wpdb->term_taxonomy} tx JOIN {$wpdb->term_relationships} tr ON tx.term_taxonomy_id = tr.term_taxonomy_id
- WHERE tr.object_id = {$post_id}
- ");
- foreach($taxonomies as $t){
- if(@intval($sitepress_settings['taxonomies_sync_option'][$t]) == 1){
- $object_terms = $wpdb->get_results("
- SELECT x.term_taxonomy_id, t.name
- FROM {$wpdb->terms} t
- JOIN {$wpdb->term_taxonomy} x ON t.term_id=x.term_id
- JOIN {$wpdb->term_relationships} r ON x.term_taxonomy_id = r.term_taxonomy_id
- WHERE x.taxonomy = '{$t}' AND r.object_id = $post_id
- ");
- foreach($object_terms as $trm){
- $trid = $wpdb->get_var("SELECT trid FROM {$wpdb->prefix}icl_translations
- WHERE element_id='{$trm->term_taxonomy_id}' AND element_type='tax_{$t}'");
- foreach($target_languages as $lang){
- $not_translated = false;
- if($trid != $wpdb->get_var("
- SELECT trid FROM {$wpdb->prefix}icl_translations WHERE l.english_name='{$lang}' AND trid='{$trid}' AND element_id IS NOT NULL
- ")){
- $not_translated = true;
- break;
- }
- }
- if($not_translated){
- $taxonomies_to_translate[$t][$trm->term_taxonomy_id] = $trm->name;
- }
- }
- }
- }
-
-
- $data['url'] = htmlentities($post_url);
- $data['contents']['title'] = array(
- 'translate'=>1,
- 'data'=>base64_encode($post->post_title),
- 'format'=>'base64'
- );
- if($sitepress_settings['translated_document_page_url'] == 'translate'){
- $data['contents']['URL'] = array(
- 'translate'=>1,
- 'data'=>base64_encode($post->post_name),
- 'format'=>'base64'
- );
- }
-
- if(!empty($post->post_excerpt))
- $data['contents']['excerpt'] = array(
- 'translate'=>1,
- 'data'=>base64_encode($post->post_excerpt),
- 'format'=>'base64'
- );
- $data['contents']['body'] = array(
- 'translate'=>1,
- 'data'=>base64_encode($post->post_content),
- 'format'=>'base64'
- );
- $data['contents']['original_id'] = array(
- 'translate'=>0,
- 'data'=>$post_id
- );
- $data['target_languages'] = array($target_for_server);
-
- $custom_fields = array();
- foreach((array)$iclTranslationManagement->settings['custom_fields_translation'] as $cf => $op){
- if ($op == 2) {
- $custom_fields[] = $cf;
- }
- }
-
- foreach($custom_fields as $cf){
- $custom_fields_value = get_post_meta($post_id, $cf, true);
- if ($custom_fields_value != '') {
- $data['contents']['field-'.$cf] = array(
- 'translate' => 1,
- 'data' => base64_encode($custom_fields_value),
- 'format' => 'base64',
- );
- $data['contents']['field-'.$cf.'-name'] = array(
- 'translate' => 0,
- 'data' => $cf,
- );
- $data['contents']['field-'.$cf.'-type'] = array(
- 'translate' => 0,
- 'data' => 'custom_field',
- );
- }
- }
-
-
- if(@is_array($categories_to_translate)){
- $data['contents']['categories'] = array(
- 'translate'=>1,
- 'data'=> implode(',', array_map(create_function('$e', 'return \'"\'.base64_encode($e).\'"\';'), $categories_to_translate)),
- 'format'=>'csv_base64'
- );
- $data['contents']['category_ids'] = array(
- 'translate'=>0,
- 'data'=> implode(',', array_keys($categories_to_translate)),
- 'format'=>''
- );
- }
-
- if(@is_array($tags_to_translate)){
- $data['contents']['tags'] = array(
- 'translate'=>1,
- 'data'=> implode(',', array_map(create_function('$e', 'return \'"\'.base64_encode($e).\'"\';'), $tags_to_translate)),
- 'format'=>'csv_base64'
- );
- $data['contents']['tag_ids'] = array(
- 'translate'=>0,
- 'data'=> implode(',', array_keys($tags_to_translate)),
- 'format'=>''
- );
- }
-
- if(@is_array($taxonomies_to_translate)){
- foreach($taxonomies_to_translate as $k=>$v){
- $data['contents'][$k] = array(
- 'translate'=>1,
- 'data'=> implode(',', array_map(create_function('$e', 'return \'"\'.base64_encode($e).\'"\';'), $v)),
- 'format'=>'csv_base64'
- );
- $data['contents'][$k.'_ids'] = array(
- 'translate'=>0,
- 'data'=> implode(',', array_keys($v)),
- 'format'=>''
- );
- }
- }
-
- if($post->post_status=='publish'){
- $permlink = $post_url;
- }else{
- $permlink = false;
- }
-
- $note = get_post_meta($post_id, '_icl_translator_note', true);
-
- // if this is an old request having a old request_id, include that
- if($wpdb->prefix.'icl_content_status' == $wpdb->get_var("SHOW TABLES LIKE '{$wpdb->prefix}icl_content_status'")){
- $prev_rid = $wpdb->get_var($wpdb->prepare("SELECT MAX(rid) FROM {$wpdb->prefix}icl_content_status WHERE nid=%d", $post_id));
- if(!empty($prev_rid)){
- $data['previous_cms_request_id'] = $prev_rid;
- }
- }
- }
-
- $data = apply_filters('icl_data_for_pro_translation', $data);
-
- $xml = $iclq->build_cms_request_xml($data, $orig_lang_for_server);
- $cms_id = sprintf('%s_%d_%s_%s', $post->post_type, $post->ID, $orig_lang, $target_lang);
- $args = array(
- 'cms_id' => $cms_id,
- 'xml' => $xml,
- 'title' => $post->post_title,
- 'to_languages' => array($target_for_server),
- 'orig_language' => $orig_lang_for_server,
- 'permlink' => isset($permlink) ? $permlink : false,
- 'translator_id' => $translator_id,
- 'note' => isset($note) ? $note : '',
- );
-
- $res = $iclq->send_request($args);
- if($res > 0){
- $this->tmg->update_translation_status(array(
- 'translation_id'=>$translation->translation_id,
- 'status' => ICL_TM_IN_PROGRESS,
- 'needs_update' => 0
- ));
- }else{
- $_prevstate = $wpdb->get_var($wpdb->prepare("SELECT _prevstate FROM {$wpdb->prefix}icl_translation_status WHERE translation_id=%d", $translation->translation_id));
- if(!empty($_prevstate)){
- $_prevstate = unserialize($_prevstate);
- $wpdb->update($wpdb->prefix . 'icl_translation_status',
- array(
- 'status' => $_prevstate['status'],
- 'translator_id' => $_prevstate['translator_id'],
- 'status' => $_prevstate['status'],
- 'needs_update' => $_prevstate['needs_update'],
- 'md5' => $_prevstate['md5'],
- 'translation_service' => $_prevstate['translation_service'],
- 'translation_package' => $_prevstate['translation_package'],
- 'timestamp' => $_prevstate['timestamp'],
- 'links_fixed' => $_prevstate['links_fixed']
- ),
- array('translation_id'=>$translation->translation_id)
- );
- }else{
- $wpdb->update($wpdb->prefix . 'icl_translation_status',
- array('status'=>ICL_TM_NOT_TRANSLATED, 'needs_update'=>0), array('translation_id'=>$translation->translation_id));
- }
- $err = true;
- }
- } // if needs translation
- } // foreach target lang
- return $err ? false : $res; //last $ret
- }
-
- public function server_languages_map($language_name, $server2plugin = false){
- if(is_array($language_name)){
- return array_map(array($this, 'icl_server_languages_map'), $language_name);
- }
- $map = array(
- 'Norwegian Bokmål' => 'Norwegian',
- 'Portuguese, Brazil' => 'Portuguese',
- 'Portuguese, Portugal' => 'Portugal Portuguese'
- );
- if($server2plugin){
- $map = array_flip($map);
- }
- if(isset($map[$language_name])){
- return $map[$language_name];
- }else{
- return $language_name;
- }
- }
-
- function custom_xmlrpc_methods($methods){
-
- $icl_methods['icanlocalize.update_status_by_cms_id'] = array($this, 'get_translated_document');
-
- // for migration to 2.0.0
- $icl_methods['icanlocalize.set_translation_status'] = array($this,'_legacy_set_translation_status');
-
- //$icl_methods['icanlocalize.set_translation_status'] = array($this,'get_translated_string'); // use for strings - old method
-
- //$icl_methods['icanlocalize.list_posts'] = array($this, '_list_posts');
- //$icl_methods['icanlocalize.translate_post'] = array($this, '_remote_control_translate_post');
-
- $icl_methods['icanlocalize.test_xmlrpc'] = array($this, '_test_xmlrpc');
- $icl_methods['icanlocalize.cancel_translation_by_cms_id'] = array($this, '_xmlrpc_cancel_translation');
-
- // for migration to 2.0.0
- $icl_methods['icanlocalize.cancel_translation'] = array($this, '_legacy_xmlrpc_cancel_translation');
-
- $icl_methods['icanlocalize.notify_comment_translation'] = array($this, '_xmlrpc_add_message_translation');
-
-
- $methods = $methods + $icl_methods;
- if(defined('XMLRPC_REQUEST') && XMLRPC_REQUEST){
- preg_match('#<methodName>([^<]+)</methodName>#i', $GLOBALS['HTTP_RAW_POST_DATA'], $matches);
- $method = $matches[1];
- if(in_array($method, array_keys($icl_methods))){
- //error_reporting(E_NONE);
- //ini_set('display_errors', '0');
- $old_error_handler = set_error_handler(array($this, "_translation_error_handler"),E_ERROR|E_USER_ERROR);
- }
- }
- return $methods;
-
- }
-
- function _legacy_set_translation_status($args){
- global $sitepress_settings, $sitepress, $wpdb;
- try{
-
- $signature = $args[0];
- $site_id = $args[1];
- $request_id = $args[2];
- $original_language = $args[3];
- $language = $args[4];
- $status = $args[5];
- $message = $args[6];
- if ($site_id != $sitepress_settings['site_id']) {
- return 3;
- }
-
- //check signature
- $signature_chk = sha1($sitepress_settings['access_key'].$sitepress_settings['site_id'].$request_id.$language.$status.$message);
- if($signature_chk != $signature){
- return 2;
- }
-
- $lang_code = $sitepress->get_language_code($this->server_languages_map($language, true));//the 'reverse' language filter
- $cms_request_info = $wpdb->get_row("SELECT * FROM {$wpdb->prefix}icl_core_status WHERE rid={$request_id} AND target='{$lang_code}'");
-
- if (empty($cms_request_info)){
- $this->_throw_exception_for_mysql_errors();
- return 4;
- }
-
- if ($this->_legacy_process_translated_document($request_id, $language, $args)){
- $this->_throw_exception_for_mysql_errors();
- return 1;
- } else {
- $this->_throw_exception_for_mysql_errors();
- return 6;
- }
-
- }catch(Exception $e) {
- return $e->getMessage();
- }
- }
-
- function _legacy_process_translated_document($request_id, $language, $args){
-
- global $sitepress_settings, $wpdb, $sitepress, $iclTranslationManagement;
- $ret = false;
- $iclq = new ICanLocalizeQuery($sitepress_settings['site_id'], $sitepress_settings['access_key']);
- $post_type = $wpdb->get_var($wpdb->prepare("SELECT p.post_type FROM {$wpdb->posts} p JOIN {$wpdb->prefix}icl_content_status c ON p.ID = c.nid WHERE c.rid=%d", $request_id));
- $trid = $wpdb->get_var($wpdb->prepare("
- SELECT trid
- FROM {$wpdb->prefix}icl_translations t
- JOIN {$wpdb->prefix}icl_content_status c ON t.element_id = c.nid AND t.element_type='post_{$post_type}' AND c.rid=%d",$request_id));
- $translation = $iclq->cms_do_download($request_id, $language);
-
- if($translation){
- if (icl_is_string_translation($translation)){
- $ret = $this->get_translated_string($args);
- } else {
- // we need to create a cms_id for this
- list($lang_from, $lang_to) = $wpdb->get_row($wpdb->prepare("
- SELECT origin, target FROM {$wpdb->prefix}icl_core_status WHERE rid=%d ORDER BY id DESC LIMIT 1
- ", $request_id), ARRAY_N);
- $translation_id = $wpdb->get_var($wpdb->prepare("
- SELECT translation_id FROM {$wpdb->prefix}icl_translations WHERE trid=%d and language_code='%s'
- ", $trid, $lang_to));
-
- if(!$translation_id){
- $wpdb->insert($wpdb->prefix.'icl_translations', array(
- 'element_type' => 'post_' . $post_type,
- 'trid' => $trid,
- 'language_code' => $lang_to,
- 'source_language_code' => $lang_from
- ));
- $translation_id = $wpdb->insert_id;
- }
-
- $original_post_id = $wpdb->get_var($wpdb->prepare("SELECT element_id FROM {$wpdb->prefix}icl_translations WHERE trid=%d AND source_language_code IS NULL", $trid));
-
- $translation_package = $iclTranslationManagement->create_translation_package($original_post_id);
- $md5 = $iclTranslationManagement->post_md5($original_post_id);
-
-
- $translator_id = $wpdb->get_var($wpdb->prepare("SELECT post_author FROM {$wpdb->posts} WHERE ID=%d", $original_post_id));
- // add translation_status record
-
- list($rid, $update) = $iclTranslationManagement->update_translation_status(array(
- 'translation_id' => $translation_id,
- 'status' => 2,
- 'translator_id' => $translator_id,
- 'needs_update' => 0,
- 'md5' => $md5,
- 'translation_service' => 'icanlocalize',
- 'translation_package' => serialize($translation_package)
- ));
- $job_ids[] = $iclTranslationManagement->add_translation_job($rid, $translator_id, $translation_package);
-
-
- $ret = $this->add_translated_document($translation_id, $request_id);
-
- }
- if($ret){
- $iclq->cms_update_request_status($request_id, CMS_TARGET_LANGUAGE_DONE, $language);
- }
-
- }
- return $ret;
- }
-
- /*
- * 0 - unknown error
- * 1 - success
- * 2 - signature mismatch
- * 3 - website_id incorrect
- * 4 - cms_id not found
- * 5 - icl translation not enabled
- * 6 - unknown error processing translation
- */
- function get_translated_document($args){
- global $sitepress_settings, $sitepress, $wpdb;
- try{
-
- $signature = $args[0];
- $site_id = $args[1];
- $request_id = $args[2];
- $cms_id = $args[3];
- $status = $args[4];
- $message = $args[5];
-
-
- if ($site_id != $sitepress_settings['site_id']) {
- return 3;
- }
-
- //check signature
- $signature_chk = sha1($sitepress_settings['access_key'].$sitepress_settings['site_id'].$cms_id.$status.$message);
- if($signature_chk != $signature){
- return 2;
- }
-
- // decode cms_id
- $int = preg_match('#(.+)_([0-9]+)_([^_]+)_([^_]+)#', $cms_id, $matches);
-
- $_element_type = $matches[1];
- $_element_id = $matches[2];
- $_original_lang = $matches[3];
- $_lang = $matches[4];
-
- $trid = $sitepress->get_element_trid($_element_id, 'post_'. $_element_type);
- if(!$trid){
- return 4;
- }
-
- $translation = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}icl_translations WHERE trid=%d AND language_code=%s", $trid, $_lang));
-
- if (empty($translation)){ // if the translation was deleted re-create it
-
- $wpdb->insert($wpdb->prefix.'icl_translations', array(
- 'element_type' => 'post_' . $_element_type,
- 'trid' => $trid,
- 'language_code' => $_lang,
- 'source_language_code' => $_original_lang
- ));
- $translation_id = $wpdb->insert_id;
-
- $md5 = $this->tmg->post_md5($_element_id);
-
- $translation_package = $this->tmg->create_translation_package($_element_id);
-
- $translator_id = 0; //TO FIX!
- list($rid, $update) = $this->tmg->update_translation_status(array(
- 'translation_id' => $translation_id,
- 'status' => ICL_TM_IN_PROGRESS,
- 'translator_id' => $translator_id,
- 'needs_update' => 0,
- 'md5' => $md5,
- 'translation_service' => 'icanlocalize',
- 'translation_package' => serialize($translation_package)
- ));
- $this->tmg->add_translation_job($rid, $translator_id, $translation_package);
-
- }else{
-
- $translation_id = $translation->translation_id;
-
- // if the post is trashed set the element_id to null
- if('trash' == $wpdb->get_var($wpdb->prepare("SELECT post_status FROM {$wpdb->posts} WHERE ID=%d", $translation->element_id))){
- $wpdb->query("UPDATE {$wpdb->prefix}icl_translations SET element_id = NULL WHERE translation_id={$translation->translation_id}");
- }
-
- }
-
- if ($this->add_translated_document($translation_id, $request_id) === true){
- $this->_throw_exception_for_mysql_errors();
- return 1;
- } else {
- $this->_throw_exception_for_mysql_errors();
- return 6;
- }
-
- }catch(Exception $e) {
- return $e->getMessage();
- }
- }
-
- function add_translated_document($translation_id, $request_id){
- global $sitepress_settings, $wpdb, $sitepress;
-
- $iclq = new ICanLocalizeQuery($sitepress_settings['site_id'], $sitepress_settings['access_key']);
- $tinfo = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}icl_translations WHERE translation_id=%d", $translation_id));
- $_lang = $sitepress->get_language_details($tinfo->language_code);
- $translation = $iclq->cms_do_download($request_id, $this->server_languages_map($_lang['english_name']));
-
- $translation = apply_filters('icl_data_from_pro_translation', $translation);
-
- $ret = false;
-
- if(!empty($translation)){
- $language_code = $wpdb->get_var($wpdb->prepare("
- SELECT language_code FROM {$wpdb->prefix}icl_translations WHERE translation_id=%d", $translation_id
- ));
- $parts = explode('_', $translation['original_id']);
- if ($parts[0] == 'external') {
-
- // Translations are saved in the string table for 'external' types
-
- $id = array_pop($parts);
- unset($parts[0]);
- $type = implode('_', $parts);
- unset($translation['original_id']);
- foreach($translation as $field => $value){
- if (function_exists('icl_st_is_registered_string')) {
- $value = str_replace('�A;', "\n", $value);
- $string_id = icl_st_is_registered_string($type, $id . '_' . $field);
- if (!$string_id) {
- icl_register_string($type, $id . '_' . $field, $value);
- $string_id = icl_st_is_registered_string($type, $id . '_' . $field);
- }
- if ($string_id) {
- icl_add_string_translation($string_id, $language_code, $value, ICL_STRING_TRANSLATION_COMPLETE);
- }
- }
- }
- $ret = true;
- } else {
- $ret = $this->save_post_translation($translation_id, $translation);
- }
- if($ret){
- $lang_details = $sitepress->get_language_details($language_code);
- $language_server = $this->server_languages_map($lang_details['english_name']);
- $iclq->cms_update_request_status($request_id, CMS_TARGET_LANGUAGE_DONE, $language_server);
-
- $translations = $sitepress->get_element_translations($tinfo->trid, $tinfo->element_type);
-
- if(isset($translations[$tinfo->language_code])){
- $iclq->report_back_permalink($request_id, $language_server, $translations[$tinfo->language_code]);
- }
-
- }
- }
-
- return $ret;
- }
-
- function save_post_translation($translation_id, $translation){
- global $wpdb, $sitepress_settings, $sitepress, $wp_taxonomies, $icl_adjust_id_url_filter_off;
- $icl_adjust_id_url_filter_off = true;
-
- $taxonomies = array_diff(array_keys((array)$wp_taxonomies), array('post_tag','category'));
-
- $tinfo = $wpdb->get_row($wpdb->prepare("
- SELECT * FROM {$wpdb->prefix}icl_translations tr
- JOIN {$wpdb->prefix}icl_translation_status ts ON ts.translation_id = tr.translation_id
- WHERE tr.translation_id=%d", $translation_id));
- $lang_code = $tinfo->language_code;
- $trid = $tinfo->trid;
- $original_post_details = $wpdb->get_row("
- SELECT p.post_author, p.post_type, p.post_status, p.comment_status, p.ping_status, p.post_parent, p.menu_order, p.post_date, t.language_code
- FROM {$wpdb->prefix}icl_translations t
- JOIN {$wpdb->posts} p ON t.element_id = p.ID AND CONCAT('post_',p.post_type) = t.element_type
- WHERE trid='{$trid}' AND p.ID = '{$translation['original_id']}'
- ");
-
- //is the original post a sticky post?
- remove_filter('option_sticky_posts', array($sitepress,'option_sticky_posts')); // remove filter used to get language relevant stickies. get them all
- $sticky_posts = get_option('sticky_posts');
- $is_original_sticky = $original_post_details->post_type=='post' && in_array($translation['original_id'], $sticky_posts);
-
-
- $this->_content_fix_image_paths_in_body($translation);
- $this->_content_fix_relative_link_paths_in_body($translation);
- $this->_content_decode_shortcodes($translation);
-
-
- // deal with tags
- if(isset($translation['tags'])){
- $translated_tags = $translation['tags'];
- $translated_tag_ids = explode(',', $translation['tag_ids']);
- foreach($translated_tags as $k=>$v){
- $tag_trid = $wpdb->get_var("SELECT trid FROM {$wpdb->prefix}icl_translations WHERE element_id='{$translated_tag_ids[$k]}' AND element_type='tax_post_tag'");
-
- // before adding the new term make sure that another tag with the same name doesn't exist. If it does append @lang
- // same term name exists in a different language?
- $term_different_language = $wpdb->get_var("
- SELECT tm.term_id
- FROM {$wpdb->term_taxonomy} tx
- JOIN {$wpdb->terms} tm ON tx.term_id = tm.term_id
- JOIN {$wpdb->prefix}icl_translations tr ON tx.term_taxonomy_id = tr.element_id
- WHERE tm.name='".$wpdb->escape($v)."' AND tr.element_type LIKE 'tax\\_%' AND tr.language_code <> '{$lang_code}'
- ");
- if($term_different_language){
- $v .= ' @'.$lang_code;
- }
-
- //tag exists? (in the current language)
- $etag = get_term_by('name', htmlspecialchars($v), 'post_tag');
- if(!$etag){
- $etag = get_term_by('name', htmlspecialchars($v) . ' @'.$lang_code, 'post_tag');
- }
- if(!$etag){
- $tmp = wp_insert_term($v, 'post_tag');
- if(!is_wp_error($tmp) && isset($tmp['term_taxonomy_id'])){
- $wpdb->update($wpdb->prefix.'icl_translations',
- array('language_code'=>$lang_code, 'trid'=>$tag_trid, 'source_language_code'=>$original_post_details->language_code),
- array('element_type'=>'tax_post_tag','element_id'=>$tmp['term_taxonomy_id']));
- }
- }else{
- $term_taxonomy_id = $etag->term_taxonomy_id;
- // check whether we have an orphan translation - the same trid and language but a different element id
- $__translation_id = $wpdb->get_var("
- SELECT translation_id FROM {$wpdb->prefix}icl_translations
- WHERE trid = '{$tag_trid}'
- AND language_code = '{$lang_code}'
- AND element_id <> '{$term_taxonomy_id}'
- ");
- if($__translation_id){
- $wpdb->query("DELETE FROM {$wpdb->prefix}icl_translations WHERE translation_id={$__translation_id}");
- }
-
- $tag_translation_id = $wpdb->get_var("SELECT translation_id FROM {$wpdb->prefix}icl_translations WHERE element_id={$term_taxonomy_id} AND element_type='tax_post_tag'");
- if($tag_translation_id){
- $wpdb->update($wpdb->prefix.'icl_translations',
- array('language_code'=>$lang_code, 'trid'=>$tag_trid, 'source_language_code'=>$original_post_details->language_code),
- array('element_type'=>'tax_post_tag','translation_id'=>$tag_translation_id));
- }else{
- $wpdb->insert($wpdb->prefix.'icl_translations',
- array('language_code'=>$lang_code, 'trid'=>$tag_trid, 'element_type'=>'tax_post_tag', 'element_id'=>$term_taxonomy_id, 'source_language_code'=>$original_post_details->language_code));
- }
- }
- }
- }
-
- $original_post_tags = array();
- foreach(wp_get_object_terms($translation['original_id'] , 'post_tag') as $t){
- $original_post_tags[] = $t->term_taxonomy_id;
- }
- if($original_post_tags){
- $tag_trids = $wpdb->get_col("SELECT trid FROM {$wpdb->prefix}icl_translations WHERE element_type='tax_post_tag' AND element_id IN (".join(',',$original_post_tags).")");
- if(!empty($tag_trids))
- $tag_tr_tts = $wpdb->get_col("SELECT element_id FROM {$wpdb->prefix}icl_translations WHERE element_type='tax_post_tag' AND language_code='{$lang_code}' AND trid IN (".join(',',$tag_trids).")");
- if(!empty($tag_tr_tts))
- $translated_tags = $wpdb->get_col("SELECT t.name FROM {$wpdb->terms} t JOIN {$wpdb->term_taxonomy} tx ON tx.term_id = t.term_id WHERE tx.taxonomy='post_tag' AND tx.term_taxonomy_id IN (".join(',',$tag_tr_tts).")");
- }
-
- // deal with categories
- if(isset($translation['categories'])){
- $translated_cats = $translation['categories'];
- $translated_cats_ids = explode(',', $translation['category_ids']);
- foreach($translated_cats as $k=>$v){
- //$v = trim(str_replace('<p>', '', $v));
- $cat_trid = $wpdb->get_var("SELECT trid FROM {$wpdb->prefix}icl_translations WHERE element_id='{$translated_cats_ids[$k]}' AND element_type='tax_category'");
-
- // before adding the new term make sure that another tag with the same name doesn't exist. If it does append @lang
- // same term name exists in a different language?
- $term_different_language = $wpdb->get_var("
- SELECT tm.term_id
- FROM {$wpdb->term_taxonomy} tx
- JOIN {$wpdb->terms} tm ON tx.term_id = tm.term_id
- JOIN {$wpdb->prefix}icl_translations tr ON tx.term_taxonomy_id = tr.element_id
- WHERE tm.name='".$wpdb->escape($v)."' AND tr.element_type LIKE 'tax\\_%' AND tr.language_code <> '{$lang_code}'
- ");
- if($term_different_language){
- $v .= ' @'.$lang_code;
- }
-
- //cat exists?
- $ecat = get_term_by('name', htmlspecialchars($v), 'category');
- if(!$ecat){
- $ecat = get_term_by('name', htmlspecialchars($v) . ' @'.$lang_code, 'category');
- }
-
- if(!$ecat){
- // get original category parent id
- $original_category_parent_id = $wpdb->get_var($wpdb->prepare("SELECT parent FROM {$wpdb->term_taxonomy} WHERE term_taxonomy_id=%d",$translated_cats_ids[$k]));
- if($original_category_parent_id){
- $_op_tax_id = $wpdb->get_var($wpdb->prepare("SELECT term_taxonomy_id FROM {$wpdb->term_taxonomy} WHERE taxonomy='category' AND term_id=%d",$original_category_parent_id));
- $_op_trid = $wpdb->get_var($wpdb->prepare("SELECT trid FROM {$wpdb->prefix}icl_translations WHERE element_type='tax_category' AND element_id=%d",$_op_tax_id));
- // get id of the translated category parent
- $_tp_tax_id = $wpdb->get_var($wpdb->prepare("SELECT element_id FROM {$wpdb->prefix}icl_translations WHERE language_code='{$lang_code}' AND trid=%d",$_op_trid));
- if($_tp_tax_id){
- $category_parent_id = $wpdb->get_var($wpdb->prepare("SELECT term_id FROM {$wpdb->term_taxonomy} WHERE taxonomy='category' AND term_taxonomy_id=%d",$_tp_tax_id));
- }else{
- $category_parent_id = 0;
- }
- }else{
- $category_parent_id = 0;
- }
- $tmp = wp_insert_term($v, 'category', array('parent'=>$category_parent_id));
- if(!is_wp_error($tmp) && isset($tmp['term_taxonomy_id'])){
- $wpdb->update($wpdb->prefix.'icl_translations',
- array('language_code'=>$lang_code, 'trid'=>$cat_trid, 'source_language_code'=>$original_post_details->language_code),
- array('element_type'=>'tax_category','element_id'=>$tmp['term_taxonomy_id']));
-
- // if this is a parent category, make sure that nesting is correct for all translations
- $orig_cat_tax_id = $wpdb->get_var($wpdb->prepare("SELECT element_id FROM {$wpdb->prefix}icl_translations WHERE trid=%d AND source_language_code IS NULL", $cat_trid));
- $orig_cat_term_id = $wpdb->get_var($wpdb->prepare("SELECT term_id FROM {$wpdb->term_taxonomy} WHERE term_taxonomy_id=%d AND taxonomy='category'",$orig_cat_tax_id));
- $orig_cat_children = $wpdb->get_col($wpdb->prepare("SELECT term_id FROM {$wpdb->term_taxonomy} WHERE parent=%d",$orig_cat_term_id));
- if(!empty($orig_cat_children)) foreach($orig_cat_children as $ch){
- $_tr_child = icl_object_id($ch, 'category', false, $lang_code);
- if($_tr_child){
- $wpdb->update($wpdb->term_taxonomy, array('parent'=>$tmp['term_id']), array(
- 'taxonomy'=>'category', 'term_id' => $_tr_child
- ));
- }
- }
- delete_option('category_children');
- }
- }else{
- $term_taxonomy_id = $ecat->term_taxonomy_id;
- // check whether we have an orphan translation - the same trid and language but a different element id
- $__translation_id = $wpdb->get_var("
- SELECT translation_id FROM {$wpdb->prefix}icl_translations
- WHERE trid = '{$cat_trid}'
- AND language_code = '{$lang_code}'
- AND element_id <> '{$term_taxonomy_id}'
- ");
- if($__translation_id){
- $wpdb->query("DELETE FROM {$wpdb->prefix}icl_translations WHERE translation_id={$__translation_id}");
- }
-
- $cat_translation_id = $wpdb->get_var("SELECT translation_id FROM {$wpdb->prefix}icl_translations WHERE element_id={$term_taxonomy_id} AND element_type='tax_category'");
- …
Large files files are truncated, but you can click here to view the full file