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()]); } }
/** * 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))); }
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)); }
/** * 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; } }
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; }
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'; }