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("\n                        SELECT DISTINCT tx.taxonomy \n                        FROM {$wpdb->term_taxonomy} tx JOIN {$wpdb->term_relationships} tr ON tx.term_taxonomy_id = tr.term_taxonomy_id\n                        WHERE tr.object_id = {$post_id}\n                    ");
                 foreach ($taxonomies as $t) {
                     if (@intval($sitepress_settings['taxonomies_sync_option'][$t]) == 1) {
                         $object_terms = $wpdb->get_results("\n                                SELECT x.term_taxonomy_id, t.name \n                                FROM {$wpdb->terms} t \n                                    JOIN {$wpdb->term_taxonomy} x ON t.term_id=x.term_id\n                                    JOIN {$wpdb->term_relationships} r ON x.term_taxonomy_id = r.term_taxonomy_id\n                                WHERE x.taxonomy = '{$t}' AND r.object_id = {$post_id}\n                                ");
                         foreach ($object_terms as $trm) {
                             $trid = $wpdb->get_var("SELECT trid FROM {$wpdb->prefix}icl_translations \n                                    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("\n                                            SELECT trid FROM {$wpdb->prefix}icl_translations WHERE l.english_name='{$lang}' AND trid='{$trid} AND element_id IS NOT NULL'\n                                    ")) {
                                     $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 (!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' => $permlink, 'translator_id' => $translator_id, '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
 }
Example #2
0
function _icl_translation_send_strings_icanlocalize($string_ids, $target)
{
    global $wpdb, $sitepress, $sitepress_settings;
    if (!$sitepress_settings['st']['strings_language']) {
        $sitepress_settings['st']['strings_language'] = $sitepress->get_default_language();
    }
    $target_details = $sitepress->get_language_details($target);
    // get all the untranslated strings
    $untranslated = array();
    foreach ($string_ids as $st_id) {
        $status = $wpdb->get_var($wpdb->prepare("SELECT status FROM {$wpdb->prefix}icl_string_translations WHERE string_id=%d and language=%s", $st_id, $target));
        if ($status != ICL_STRING_TRANSLATION_COMPLETE) {
            $untranslated[] = $st_id;
        }
    }
    if (sizeof($untranslated) > 0) {
        // Something to translate.
        $target_for_server = array(ICL_Pro_Translation::server_languages_map($target_details['english_name']));
        //filter some language names to match the names on the server
        $data = array('url' => '', 'target_languages' => $target_for_server);
        $string_values = array();
        foreach ($untranslated as $st_id) {
            $string = $wpdb->get_row($wpdb->prepare("SELECT context, name, value FROM {$wpdb->prefix}icl_strings WHERE id=%d", $st_id));
            $string_values[$st_id] = $string->value;
            $data['contents']['string-' . $st_id . '-context'] = array('translate' => 0, 'data' => base64_encode(htmlspecialchars($string->context)), 'format' => 'base64');
            $data['contents']['string-' . $st_id . '-name'] = array('translate' => 0, 'data' => base64_encode(htmlspecialchars($string->name)), 'format' => 'base64');
            $data['contents']['string-' . $st_id . '-value'] = array('translate' => 1, 'data' => base64_encode(htmlspecialchars($string->value)), 'format' => 'base64');
        }
        $iclq = new ICanLocalizeQuery($sitepress_settings['site_id'], $sitepress_settings['access_key']);
        $orig_lang = $sitepress->get_language_details($sitepress_settings['st']['strings_language']);
        $orig_lang_for_server = ICL_Pro_Translation::server_languages_map($orig_lang['english_name']);
        $timestamp = date('Y-m-d H:i:s');
        $xml = $iclq->build_cms_request_xml($data, $orig_lang_for_server);
        $args = array('xml' => $xml, 'title' => "String translations", 'to_languages' => $target_for_server, 'orig_language' => $orig_lang_for_server);
        $res = $iclq->send_request($args);
        if ($res > 0) {
            foreach ($string_values as $st_id => $value) {
                $wpdb->insert($wpdb->prefix . 'icl_string_status', array('rid' => $res, 'string_translation_id' => $st_id, 'timestamp' => $timestamp, 'md5' => md5($value)));
                //insert rid
            }
            $wpdb->insert($wpdb->prefix . 'icl_core_status', array('rid' => $res, 'origin' => $orig_lang['code'], 'target' => $target, 'status' => CMS_REQUEST_WAITING_FOR_PROJECT_CREATION));
            return $res;
        } else {
            return 0;
        }
    }
}