settings = get_option( 'icl_adl_settings' ); if ( empty( $this->settings['wp_version'] ) || version_compare( $wpversion, $this->settings['wp_version'], '>' ) ) { try { $this->updates_check( array( 'trigger' => 'wp-update' ) ); } catch ( Exception $e ) { // do nothing - this is automated request for updates } } if ( get_transient( 'WPML_ST_MO_Downloader_lang_map' ) === false ) { $this->set_lang_map_from_csv(); } $this->lang_map = get_transient( 'WPML_ST_MO_Downloader_lang_map' ); $this->lang_map_rev = array_flip( $this->lang_map ); add_action( 'wp_ajax_icl_adm_updates_check', array( $this, 'show_updates' ) ); add_action( 'wp_ajax_icl_adm_save_preferences', array( $this, 'save_preferences' ) ); } function set_lang_map_from_csv() { $fh = fopen( WPML_ST_PATH . '/inc/lang-map.csv', 'r' ); while ( list($locale, $code) = fgetcsv( $fh ) ) { $this->lang_map[ $locale ] = $code; } if ( isset( $this->lang_map ) && is_array( $this->lang_map ) ) { set_transient( 'WPML_ST_MO_Downloader_lang_map', $this->lang_map ); } } function updates_check( $args = array() ) { global $wp_version, $sitepress; $wpversion = preg_replace( '#-(.+)$#', '', $wp_version ); $trigger = 'manual'; extract( $args, EXTR_OVERWRITE ); $active_languages = $sitepress->get_active_languages(); $default_language = $sitepress->get_default_language(); $this->load_xml(); $this->get_translation_files(); $updates = array(); foreach ( $active_languages as $language ) { if ( $language != $default_language ) { if ( isset( $this->translation_files[ $language['code'] ] ) ) { foreach ( $this->translation_files[ $language['code'] ] as $project => $info ) { $this->settings['translations'][ $language['code'] ][ $project ]['available'] = $info['signature']; if ( empty( $this->settings['translations'][ $language['code'] ][ $project ]['installed'] ) || ( isset( $info['available'] ) && $this->settings['translations'][ $language['code'] ][ $project ]['installed'] != $info['available'] ) ) { $updates['languages'][ $language['code'] ][ $project ] = $this->settings['translations'][ $language['code'] ][ $project ]['available']; } } } } } $this->settings['wp_version'] = $wpversion; $this->settings['last_time_xml_check'] = time(); $this->settings['last_time_xml_check_trigger'] = $trigger; $this->save_settings(); return $updates; } function show_updates() { global $sitepress; $html = ''; try { $updates = $this->updates_check(); // filter only core( & admin) $updates_core = array(); if ( array_key_exists( 'languages', $updates ) && ! empty( $updates['languages'] ) ) { foreach ( $updates['languages'] as $k => $v ) { if ( ! empty( $v['core'] ) ) { $updates_core['languages'][ $k ]['core'] = $v['core']; } if ( ! empty( $v['admin'] ) ) { $updates_core['languages'][ $k ]['admin'] = $v['admin']; } } } $updates = $updates_core; if ( ! empty( $updates ) ) { $html .= ''; foreach ( $updates['languages'] as $language => $projects ) { $l = $sitepress->get_language_details( $language ); if ( ! empty( $projects['core'] ) || ! empty( $projects['admin'] ) ) { $vkeys = array(); foreach ( $projects as $key => $value ) { $vkeys[] = $key . '|' . $value; } $version_key = join( ';', $vkeys ); $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; } } $html .= '
' . sprintf( __( 'Updated %s translation is available', 'wpml-string-translation' ), '' . $l['display_name'] . '' ) . ''; $html .= '' . __( 'Review changes and update', 'wpml-string-translation' ) . ''; $html .= '
'; } else { $html .= __( 'No updates found.', 'wpml-string-translation' ); } } catch ( Exception $error ) { $html .= '' . $error->getMessage() . ''; } echo json_encode( array( 'html' => $html ) ); exit; } function save_preferences() { global $sitepress; $iclsettings['st']['auto_download_mo'] = @intval( $_POST['auto_download_mo'] ); $iclsettings['hide_upgrade_notice'] = implode( '.', array_slice( explode( '.', ICL_SITEPRESS_VERSION ), 0, 3 ) ); $sitepress->save_settings( $iclsettings ); if ( $iclsettings['st']['auto_download_mo'] ) { try { $this->updates_check( array( 'trigger' => 'setting-changed' ) ); } catch ( Exception $e ) { } } wp_send_json_success( array( 'enabled' => $iclsettings['st']['auto_download_mo'] ) ); } function save_settings() { update_option( 'icl_adl_settings', $this->settings ); } function get_option( $name ) { return isset( $this->settings[ $name ] ) ? $this->settings[ $name ] : null; } function load_xml() { if ( ! class_exists( 'WP_Http' ) ) { include_once ABSPATH . WPINC . '/class-http.php'; } $client = new WP_Http(); $response = $client->request( self::LOCALES_XML_FILE, array( 'timeout' => 15, 'decompress' => false, ) ); if ( is_wp_error( $response ) || ! in_array( $response['response']['code'], array( 200, 301, 300 ) ) ) { $load_xml_error_message = ''; if ( isset( $response->errors ) ) { $errors = ''; foreach ( $response->errors as $error => $error_messages ) { $errors .= $error . '
'; foreach ( $error_messages as $error_message ) { $errors .= '- ' . $error_message . '
'; } } $load_xml_error_message .= sprintf( __( 'Failed downloading the language information file.', 'wpml-string-translation' ), $errors ); $load_xml_error_message .= '
' . sprintf( __( 'Errors: %s', 'wpml-string-translation' ), $errors ); } else { $load_xml_error_message .= __( 'Failed downloading the language information file. Please go back and try a little later.', 'wpml-string-translation' ); } if ( ! is_wp_error( $response ) && isset( $response['response'] ) ) { $load_xml_error_message .= '
Response: ' . $response['response']['code'] . ' (' . $response['response']['message'] . ').'; } $this->xml = false; throw new Exception( $load_xml_error_message ); } elseif ( $response['response']['code'] == 200 ) { require_once ICL_PLUGIN_PATH . '/lib/icl_api.php'; $this->xml = new SimpleXMLElement( icl_gzdecode( $response['body'] ) ); } } function get_mo_file_urls( $wplocale ) { if ( ! $this->xml ) { return false; } global $wp_version; $wpversion = preg_replace( '#-(.+)$#', '', $wp_version ); $wpversion = join( '.', array_slice( explode( '.', $wpversion ), 0, 2 ) ) . '.x'; $exp = explode( '-', $wplocale ); $language = $exp[0]; $locale = isset( $exp[1] ) ? $wplocale : $language; $mo_files = array(); $projects = $this->xml->xpath( $language . '/' . $locale ); if ( ! empty( $projects ) ) { $project_names = array(); foreach ( $projects[0] as $project_name => $data ) { // subprojects if ( empty( $data->versions ) ) { $subprojects = $this->xml->xpath( $language . '/' . $locale . '/' . $project_name ); if ( ! empty( $subprojects ) ) { foreach ( $subprojects[0] as $sub_project_name => $sdata ) { $project_names[] = $project_name . '/' . $sub_project_name; } } } else { $project_names[] = $project_name; } } if ( ! empty( $project_names ) ) { foreach ( $project_names as $project_name ) { // try to get the corresponding version $locv_path = $this->xml->xpath( "{$language}/{$locale}/{$project_name}/versions/version[@number=\"" . $wpversion . '"]' ); // try to get the dev recent version if ( empty( $locv_path ) ) { $locv_path = $this->xml->xpath( "{$language}/{$locale}/{$project_name}/versions/version[@number=\"dev\"]" ); } if ( ! empty( $locv_path ) ) { $mo_files[ $project_name ]['url'] = (string) $locv_path[0]->url; $mo_files[ $project_name ]['signature'] = (string) $locv_path[0]['signature']; $mo_files[ $project_name ]['translated'] = (string) $locv_path[0]['translated']; $mo_files[ $project_name ]['untranslated'] = (string) $locv_path[0]['untranslated']; } } } } return $mo_files; } function get_translation_files() { global $sitepress; $active_languages = $sitepress->get_active_languages(); foreach ( $active_languages as $language ) { $locale = $sitepress->get_locale( $language['code'] ); if ( ! isset( $this->lang_map[ $locale ] ) ) { continue; } $wplocale = $this->lang_map[ $locale ]; $urls = $this->get_mo_file_urls( $wplocale ); if ( ! empty( $urls ) ) { $this->translation_files[ $language['code'] ] = $urls; } } return $this->translation_files; } function get_translations( $language, $args = array() ) { global $wpdb; $translations = array(); $types = array( 'core' ); extract( $args, EXTR_OVERWRITE ); if ( ! class_exists( 'WP_Http' ) ) { include_once ABSPATH . WPINC . '/class-http.php'; } $client = new WP_Http(); foreach ( $types as $type ) { if ( isset( $this->translation_files[ $language ][ $type ]['url'] ) ) { $response = $client->request( $this->translation_files[ $language ][ $type ]['url'], array( 'timeout' => 15 ) ); if ( is_wp_error( $response ) ) { $err = __( 'Error getting the translation file. Please go back and try again.', 'wordpress-language' ); if ( isset( $response->errors['http_request_failed'][0] ) ) { $err .= '
' . $response->errors['http_request_failed'][0]; } echo '

' . $err . '

'; return false; } $mo = new MO(); $pomo_reader = new POMO_StringReader( $response['body'] ); $mo->import_from_reader( $pomo_reader ); $data = $wpdb->get_results( $wpdb->prepare( " SELECT st.value, s.name, s.gettext_context FROM {$wpdb->prefix}icl_string_translations st JOIN {$wpdb->prefix}icl_strings s ON st.string_id = s.id WHERE s.context = %s AND st.language = %s ", self::CONTEXT, $language ) ); $string_existing = array(); foreach ( $data as $row ) { $string_existing[ md5( $row->name . $row->gettext_context ) ] = $row->value; } foreach ( $mo->entries as $key => $v ) { $tpairs = array(); $v->singular = str_replace( "\n", '\n', $v->singular ); $tpairs[] = array( 'string' => $v->singular, 'translation' => $v->translations[0], 'name' => md5( $v->singular ), 'gettext_context' => $v->context, ); if ( $v->is_plural ) { $v->plural = str_replace( "\n", '\n', $v->plural ); $tpairs[] = array( 'string' => $v->plural, 'translation' => ! empty( $v->translations[1] ) ? $v->translations[1] : $v->translations[0], 'name' => md5( $v->plural ), 'gettext_context' => $v->context, ); } foreach ( $tpairs as $pair ) { $key = md5( $pair['name'] . $pair['gettext_context'] ); $existing_translation = isset( $string_existing[ $key ] ) ? $string_existing[ $key ] : null; if ( empty( $existing_translation ) ) { $translations['new'][] = array( 'string' => $pair['string'], 'translation' => '', 'new' => $pair['translation'], 'name' => $pair['name'], 'gettext_context' => $pair['gettext_context'], ); } else { if ( strcmp( $existing_translation, $pair['translation'] ) !== 0 ) { $translations['updated'][] = array( 'string' => $pair['string'], 'translation' => $existing_translation, 'new' => $pair['translation'], 'name' => $pair['name'], 'gettext_context' => $pair['gettext_context'], ); } } } } } } return $translations; } function save_translations( $data, $language, $version = false ) { set_time_limit( 0 ); if ( false === $version ) { global $wp_version; $version = preg_replace( '#-(.+)$#', '', $wp_version ); } foreach ( $data as $key => $string ) { if ( $string['gettext_context'] ) { $string_context = array( 'domain' => self::CONTEXT, 'context' => $string['gettext_context'], ); } else { $string_context = self::CONTEXT; } $string_id = icl_register_string( $string_context, $string['name'], $string['string'] ); if ( $string_id ) { icl_add_string_translation( $string_id, $language, $string['translation'], ICL_TM_COMPLETE ); } } $version_projects = explode( ';', $version ); foreach ( $version_projects as $project ) { $exp = explode( '|', $project ); $this->settings['translations'][ $language ][ $exp[0] ]['time'] = time(); $this->settings['translations'][ $language ][ $exp[0] ]['installed'] = $exp[1]; } $this->save_settings(); } }