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 .= '' . sprintf( __( "Updated %s translation is available", 'wpml-string-translation' ),
'' . $l['display_name'] . '' ) . ' | ';
$html .= '';
$html .= '' . __( 'Review changes and update', 'wpml-string-translation' ) . '';
$html .= ' | ';
$html .= '
';
$html .= '
';
}
}
$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(isset($response) && !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 '';
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();
}
}