Ejemplo n.º 1
0
 function test_export_mo_file()
 {
     $entries = array();
     $entries[] = new Translation_Entry(array('singular' => 'pink', 'translations' => array('розов')));
     $no_translation_entry = new Translation_Entry(array('singular' => 'grey'));
     $entries[] = new Translation_Entry(array('singular' => 'green', 'plural' => 'greens', 'translations' => array('зелен', 'зелени')));
     $entries[] = new Translation_Entry(array('singular' => 'red', 'context' => 'color', 'translations' => array('червен')));
     $entries[] = new Translation_Entry(array('singular' => 'red', 'context' => 'bull', 'translations' => array('бик')));
     $entries[] = new Translation_Entry(array('singular' => 'maroon', 'plural' => 'maroons', 'context' => 'context', 'translations' => array('пурпурен', 'пурпурни')));
     $mo = new MO();
     $mo->set_header('Project-Id-Version', 'Baba Project 1.0');
     foreach ($entries as $entry) {
         $mo->add_entry($entry);
     }
     $mo->add_entry($no_translation_entry);
     $temp_fn = $this->temp_filename();
     $mo->export_to_file($temp_fn);
     $again = new MO();
     $again->import_from_file($temp_fn);
     $this->assertEquals(count($entries), count($again->entries));
     foreach ($entries as $entry) {
         $this->assertEquals($entry, $again->entries[$entry->key()]);
     }
 }
Ejemplo n.º 2
0
 /**
  * update language translate, catch request from ajax update translate string to po and mo file
  * @since 1.0
  */
 function save_language()
 {
     $selected_lang = $_POST['lang_name'];
     $langArr = $this->get_language_list();
     //file name invalid
     if ($selected_lang == '' || $selected_lang == null || $selected_lang == 'null' || !in_array($selected_lang, $langArr)) {
         wp_send_json(array('success' => false, 'msg' => __("Invalid file name!", ET_DOMAIN)));
         exit;
     }
     $singular = isset($_POST['singular']) ? $_POST['singular'] : array();
     $translation = isset($_POST['translations']) ? $_POST['translations'] : array();
     $context = isset($_POST['context']) ? $_POST['context'] : array();
     if (empty($singular) || empty($translation) || empty($context)) {
         wp_send_json(array('success' => true, 'msg' => __("There was no changes in your translation.", ET_DOMAIN)));
     }
     $mo = new MO();
     $po = new PO();
     $language_files = array('mo' => $mo, 'po' => $po);
     foreach ($language_files as $type => $mo) {
         $mo->set_header('Project-Id-Version', THEME_NAME . 'v' . ET_VERSION);
         $mo->set_header('Report-Msgid-Bugs-To', ET_URL);
         $mo->set_header('MO-Creation-Date', gmdate('Y-m-d H:i:s+00:00'));
         $mo->set_header('MIME-Version', '1.0');
         $mo->set_header('Content-Type', 'text/plain; charset=UTF-8');
         $mo->set_header('Content-Transfer-Encoding', '8bit');
         $mo->set_header('MO-Revision-Date', '2010-MO-DA HO:MI+ZONE');
         $mo->set_header('Last-Translator', 'JOB <EMAIL@ADDRESS>');
         $mo->set_header('Language-Team', 'ENGINETHEMES.COM <*****@*****.**>');
         // import language file from et_content/lang if exist
         if ($type == 'mo') {
             // mo file
             if (in_array($selected_lang, get_available_languages(THEME_LANGUAGE_PATH))) {
                 $mo->import_from_file(THEME_LANGUAGE_PATH . '/' . $selected_lang . '.mo');
             } else {
                 $mo->import_from_file(DEFAULT_LANGUAGE_PATH . '/' . $selected_lang . '.mo');
             }
         } else {
             // po file
             if (file_exists(THEME_LANGUAGE_PATH . '/' . $selected_lang . '.po')) {
                 $mo->import_from_file(THEME_LANGUAGE_PATH . '/' . $selected_lang . '.po');
             } elseif (file_exists(DEFAULT_LANGUAGE_PATH . '/' . $selected_lang . '.mo')) {
                 $temp = new MO();
                 $temp->import_from_file(DEFAULT_LANGUAGE_PATH . '/' . $selected_lang . '.mo');
                 $mo->entries = $temp->entries;
             } else {
                 $mo->import_from_file(DEFAULT_LANGUAGE_PATH . '/engine.po');
             }
         }
         foreach ($singular as $key => $value) {
             // if( $translation[$key] == "" && $type == 'mo' ) {
             // 	if(isset( $mo->entries[$value] ))
             // 		unset($mo->entries[$value]);
             // 	continue;
             // }
             if ($context[$key] != '') {
                 $mo->add_entry(new Translation_Entry(array('singular' => trim(stripcslashes($value), ''), 'context' => trim(stripcslashes($context[$key]), ''), 'translations' => array('0' => trim(stripcslashes($translation[$key]), '')))));
             } else {
                 $mo->add_entry(new Translation_Entry(array('singular' => trim(stripcslashes($value), ''), 'translations' => array('0' => trim(stripcslashes($translation[$key]), '')))));
             }
         }
         $mo->export_to_file(THEME_LANGUAGE_PATH . '/' . $selected_lang . '.' . $type);
     }
     wp_send_json(array('success' => true, 'msg' => __("Translation saved! ", ET_DOMAIN)));
 }
Ejemplo n.º 3
0
 function test_export_should_not_include_empty_translations()
 {
     $entries = array();
     $mo = new MO();
     $mo->add_entry(array('singular' => 'baba', 'translations' => array('', '')));
     $temp_fn = $this->temp_filename();
     $mo->export_to_file($temp_fn);
     $again = new MO();
     $again->import_from_file($temp_fn);
     $this->assertEquals(0, count($again->entries));
 }
Ejemplo n.º 4
0
/**
 * Replaces a string in the internationalisation table with a custom value.
 *
 * @global object $l10n List of domain translated string (gettext_reader) objects
 * @param string $find Text to find in the table
 * @param string $replace Replacement text
 * @since 2.0
 */
function dpa_override_i18n($find, $replace)
{
    global $l10n;
    if (isset($l10n['buddypress']) && isset($l10n['buddypress']->entries[$find])) {
        $l10n['buddypress']->entries[$find]->translations[0] = $replace;
    } else {
        $mo = new MO();
        $mo->add_entry(array('singular' => $find, 'translations' => array($replace)));
        if (isset($l10n['buddypress'])) {
            $mo->merge_with($l10n['buddypress']);
        }
        $l10n['buddypress'] = $mo;
    }
}
Ejemplo n.º 5
0
Archivo: base.php Proyecto: uoyknaht/kc
 function mo_import($lang)
 {
     $mo = new MO();
     if ($strings = get_option('polylang_mo' . $lang->term_id)) {
         foreach ($strings as $msg) {
             $mo->add_entry($mo->make_entry($msg[0], $msg[1]));
         }
     }
     return $mo;
 }
Ejemplo n.º 6
0
 function languages_page()
 {
     $options = get_option('polylang');
     // for nav menus form
     $locations = get_registered_nav_menus();
     $menus = wp_get_nav_menus();
     $menu_lang = get_option('polylang_nav_menus');
     // for widgets
     $widget_lang = get_option('polylang_widgets', array());
     // returns empty array if not set yet
     $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : '';
     switch ($action) {
         case 'add':
             check_admin_referer('add-lang', '_wpnonce_add-lang');
             $error = $this->validate_lang();
             if ($error == 0) {
                 $r = wp_insert_term($_POST['name'], 'language', array('slug' => $_POST['slug'], 'description' => $_POST['description']));
                 wp_update_term($r['term_id'], 'language', array('term_group' => $_POST['term_group']));
                 // can't set the term group directly in wp_insert_term
                 update_metadata('term', $r['term_id'], '_rtl', $_POST['rtl']);
                 if (!isset($options['default_lang'])) {
                     // if this is the first language created, set it as default language
                     $options['default_lang'] = $_POST['slug'];
                     update_option('polylang', $options);
                 }
                 flush_rewrite_rules();
                 // refresh rewrite rules
                 if (!$this->download_mo($_POST['description'])) {
                     $error = 5;
                 }
             }
             wp_redirect('admin.php?page=mlang' . ($error ? '&error=' . $error : ''));
             // to refresh the page (possible thanks to the $_GET['noheader']=true)
             exit;
             break;
         case 'delete':
             check_admin_referer('delete-lang');
             if (isset($_GET['lang']) && $_GET['lang']) {
                 $lang_id = (int) $_GET['lang'];
                 $lang = $this->get_language($lang_id);
                 $lang_slug = $lang->slug;
                 // update the language slug in posts meta
                 $posts = get_posts(array('numberposts' => -1, 'fields' => 'ids', 'meta_key' => '_translations', 'post_type' => 'any', 'post_status' => 'any'));
                 $this->delete_translations('post', $posts, $lang_slug);
                 // update the language slug in categories & post tags meta
                 $terms = get_terms($this->taxonomies, array('get' => 'all', 'fields' => 'ids'));
                 $this->delete_translations('term', $terms, $lang_slug);
                 // FIXME should find something more efficient (with a sql query ?)
                 foreach ($terms as $id) {
                     if (($lg = $this->get_term_language($id)) && $lg->term_id == $lang_id) {
                         $this->delete_term_language($id);
                     }
                     // delete language of this term
                 }
                 // delete menus locations
                 foreach ($locations as $location => $description) {
                     if (isset($menu_lang[$location][$lang_slug])) {
                         unset($menu_lang[$location][$lang_slug]);
                     }
                 }
                 update_option('polylang_nav_menus', $menu_lang);
                 // delete language option in widgets
                 foreach ($widget_lang as $key => $slug) {
                     if ($slug == $lang_slug) {
                         unset($widget_lang[$key]);
                     }
                 }
                 update_option('polylang_widgets', $widget_lang);
                 // delete users options
                 foreach (get_users(array('fields' => 'ID')) as $user_id) {
                     delete_user_meta($user_id, 'user_lang', $lang->description);
                     delete_user_meta($user_id, 'pll_filter_content', $lang_slug);
                     delete_user_meta($user_id, 'description_' . $lang_slug);
                 }
                 // delete the string translations
                 delete_option('polylang_mo' . $lang_id);
                 // delete the language itself
                 delete_metadata('term', $lang_id, '_rtl');
                 wp_delete_term($lang_id, 'language');
                 // oops ! we deleted the default language...
                 if ($options['default_lang'] == $lang_slug) {
                     if ($listlanguages = $this->get_languages_list()) {
                         $options['default_lang'] = $listlanguages[0]->slug;
                     } else {
                         unset($options['default_lang']);
                     }
                     update_option('polylang', $options);
                 }
                 flush_rewrite_rules();
                 // refresh rewrite rules
             }
             wp_redirect('admin.php?page=mlang');
             // to refresh the page (possible thanks to the $_GET['noheader']=true)
             exit;
             break;
         case 'edit':
             if (isset($_GET['lang']) && $_GET['lang']) {
                 $edit_lang = $this->get_language((int) $_GET['lang']);
                 $rtl = get_metadata('term', $edit_lang->term_id, '_rtl', true);
             }
             break;
         case 'update':
             check_admin_referer('add-lang', '_wpnonce_add-lang');
             $lang_id = (int) $_POST['lang_id'];
             $lang = $this->get_language($lang_id);
             $error = $this->validate_lang($lang);
             if ($error == 0) {
                 // Update links to this language in posts and terms in case the slug has been modified
                 $old_slug = $lang->slug;
                 if ($old_slug != $_POST['slug']) {
                     // update the language slug in posts meta
                     $posts = get_posts(array('numberposts' => -1, 'fields' => 'ids', 'meta_key' => '_translations', 'post_type' => 'any', 'post_status' => 'any'));
                     $this->update_translations('post', $posts, $old_slug);
                     // update the language slug in categories & post tags meta
                     $terms = get_terms($this->taxonomies, array('get' => 'all', 'fields' => 'ids'));
                     $this->update_translations('term', $terms, $old_slug);
                     // update menus locations
                     foreach ($locations as $location => $description) {
                         if (isset($menu_lang[$location][$old_slug])) {
                             $menu_lang[$location][$_POST['slug']] = $menu_lang[$location][$old_slug];
                             unset($menu_lang[$location][$old_slug]);
                         }
                     }
                     update_option('polylang_nav_menus', $menu_lang);
                     // update language option in widgets
                     foreach ($widget_lang as $key => $lang) {
                         if ($lang == $old_slug) {
                             $widget_lang[$key] = $_POST['slug'];
                         }
                     }
                     update_option('polylang_widgets', $widget_lang);
                     // update the default language option if necessary
                     if ($options['default_lang'] == $old_slug) {
                         $options['default_lang'] = $_POST['slug'];
                         update_option('polylang', $options);
                     }
                 }
                 // and finally update the language itself
                 $args = array('name' => $_POST['name'], 'slug' => $_POST['slug'], 'description' => $_POST['description'], 'term_group' => $_POST['term_group']);
                 wp_update_term($lang_id, 'language', $args);
                 update_metadata('term', $lang_id, '_rtl', $_POST['rtl']);
                 flush_rewrite_rules();
                 // refresh rewrite rules
             }
             wp_redirect('admin.php?page=mlang' . ($error ? '&error=' . $error : ''));
             // to refresh the page (possible thanks to the $_GET['noheader']=true)
             exit;
             break;
         case 'nav-menus':
             check_admin_referer('nav-menus-lang', '_wpnonce_nav-menus-lang');
             $menu_lang = $_POST['menu-lang'];
             foreach ($locations as $location => $description) {
                 foreach ($this->get_switcher_options('menu') as $key => $str) {
                     $menu_lang[$location][$key] = isset($menu_lang[$location][$key]) ? 1 : 0;
                 }
             }
             update_option('polylang_nav_menus', $menu_lang);
             break;
         case 'string-translation':
             check_admin_referer('string-translation', '_wpnonce_string-translation');
             $strings = $this->get_strings();
             foreach ($this->get_languages_list() as $language) {
                 $mo = $this->mo_import($language);
                 foreach ($_POST['translation'][$language->name] as $key => $translation) {
                     $mo->add_entry($mo->make_entry($strings[$key]['string'], stripslashes($translation)));
                 }
                 $mo->add_entry($mo->make_entry('', ''));
                 // empty string translation, just in case
                 // clean database
                 if (isset($_POST['clean']) && $_POST['clean']) {
                     $new_mo = new MO();
                     foreach ($strings as $string) {
                         $new_mo->add_entry($mo->make_entry($string['string'], $mo->translate($string['string'])));
                     }
                 }
                 $this->mo_export(isset($new_mo) ? $new_mo : $mo, $language);
             }
             // to refresh the page (possible thanks to the $_GET['noheader']=true)
             wp_redirect('admin.php?page=mlang&tab=strings' . (isset($_GET['paged']) ? '&paged=' . $_GET['paged'] : ''));
             exit;
             break;
         case 'options':
             check_admin_referer('options-lang', '_wpnonce_options-lang');
             $options['default_lang'] = $_POST['default_lang'];
             if (isset($_POST['force_lang'])) {
                 $options['force_lang'] = $_POST['force_lang'];
             }
             if (isset($_POST['rewrite'])) {
                 $options['rewrite'] = $_POST['rewrite'];
             }
             foreach (array('browser', 'hide_default', 'redirect_lang', 'sync') as $key) {
                 $options[$key] = isset($_POST[$key]) ? 1 : 0;
             }
             update_option('polylang', $options);
             // refresh rewrite rules in case rewrite or hide_default options have been modified
             // it seems useless to refresh permastruct here
             flush_rewrite_rules();
             // fills existing posts & terms with default language
             if (isset($_POST['fill_languages']) && ($nolang = $this->get_objects_with_no_lang())) {
                 global $wpdb;
                 $lang = $this->get_language($options['default_lang']);
                 $values = array();
                 foreach ($nolang['posts'] as $post_id) {
                     $values[] = $wpdb->prepare("(%d, %d)", $post_id, $lang->term_taxonomy_id);
                 }
                 if ($values) {
                     $wpdb->query("INSERT INTO {$wpdb->term_relationships} (object_id, term_taxonomy_id) VALUES " . implode(',', $values));
                     wp_update_term_count($lang->term_taxonomy_id, 'language');
                     // updating term count is mandatory (thanks to AndyDeGroo)
                 }
                 $values = array();
                 foreach ($nolang['terms'] as $term_id) {
                     $values[] = $wpdb->prepare("(%d, %s, %d)", $term_id, '_language', $lang->term_id);
                 }
                 if ($values) {
                     $wpdb->query("INSERT INTO {$wpdb->termmeta} (term_id, meta_key, meta_value) VALUES " . implode(',', $values));
                 }
             }
             wp_redirect('admin.php?page=mlang&tab=settings');
             exit;
             break;
         default:
             break;
     }
     // prepare the list of tabs
     $tabs = array('lang' => __('Languages', 'polylang'));
     // only if at least one language has been created
     if ($listlanguages = $this->get_languages_list()) {
         if (current_theme_supports('menus')) {
             $tabs['menus'] = __('Menus', 'polylang');
         }
         // don't display the menu tab if the active theme does not support nav menus
         $tabs['strings'] = __('Strings translation', 'polylang');
         $tabs['settings'] = __('Settings', 'polylang');
     }
     $active_tab = isset($_GET['tab']) && $_GET['tab'] ? $_GET['tab'] : 'lang';
     switch ($active_tab) {
         case 'lang':
             // prepare the list table of languages
             $data = array();
             foreach ($listlanguages as $lang) {
                 $data[] = array_merge((array) $lang, array('flag' => $this->get_flag($lang)));
             }
             $list_table = new Polylang_List_Table();
             $list_table->prepare_items($data);
             if (!$action) {
                 $rtl = 0;
             }
             // error messages for data validation
             $errors[1] = __('Enter a valid WorPress locale', 'polylang');
             $errors[2] = __('The language code must be 2 characters long', 'polylang');
             $errors[3] = __('The language code must be unique', 'polylang');
             $errors[4] = __('The language must have a name', 'polylang');
             $errors[5] = __('The language was created, but the WordPress language file was not downloaded. Please install it manually.', 'polylang');
             break;
         case 'menus':
             // default values
             foreach ($locations as $key => $location) {
                 if (isset($menu_lang[$key])) {
                     $menu_lang[$key] = wp_parse_args($menu_lang[$key], $this->get_switcher_options('menu', 'default'));
                 }
             }
             break;
         case 'strings':
             // get the strings to translate
             $data = $this->get_strings();
             // load translations
             foreach ($listlanguages as $language) {
                 // filters by language if requested
                 if (($lg = get_user_meta(get_current_user_id(), 'pll_filter_content', true)) && $language->slug != $lg) {
                     continue;
                 }
                 $mo = $this->mo_import($language);
                 foreach ($data as $key => $row) {
                     $data[$key]['translations'][$language->name] = $mo->translate($data[$key]['string']);
                     $data[$key]['row'] = $key;
                     // store the row number for convenience
                 }
             }
             $string_table = new Polylang_String_Table();
             $string_table->prepare_items($data);
             break;
         default:
             break;
     }
     // displays the page
     include PLL_INC . '/languages-form.php';
 }