Лучшая практика для перевода терминов таксономии без изменения слизней?


У меня есть одна пользовательская таксономия со странами и штатами. Я хотел бы сделать эти термины переводимыми, но я не уверен, что это был бы лучший способ добиться этого. Прежде всего, я не хочу, чтобы слизни менялись, только метка и, возможно, строки описания.

Я подумал о двух способах. Можно было бы использовать WPML. Но WPML, похоже, заставляет вас также менять слаг для каждого языка, чего я не хочу. Другой мог бы быть wp_insert_term() но я не уверен, что это эффективный или правильный способ сделать это. Я бы счел более практичным позволить администраторам/редакторам добавлять свои собственные термины, жесткое кодирование всех терминов не позволило бы мне этого сделать, и, кроме того, у меня такое чувство, что это не очень эффективно (в моей таксономии может быть несколько сотен мест)...

Есть какие-нибудь подсказки?

ОБНОВЛЕНИЕ 1: WPML

Я связался со службой поддержки WPML, они объяснили, что WPML создает новые термины таксономии для каждого языка, и поэтому каждый термин должен иметь уникальный слизень... однако мне интересно, есть ли какой-либо другой вариант для достижения этой цели, например, с псевдонимами терминов, например

ОБНОВЛЕНИЕ 2: wp_insert_терм()

Я нашел это: http://tommcfarlin.com/programmatically-create-categories / и он предлагает запустить wp_insert_term() в пределах действия 'after_theme_setup' или after_switch_theme. Однако это не решит проблему перевода. Поскольку действие крючка срабатывает только после настройки темы, даже если я получу текст со всеми строками меток терминов, он будет учитывать только язык на момент настройки темы.

Author: unfulvio, 2014-02-24

3 answers

Я на самом деле не в курсе WPML и того, как он обрабатывает переводы, но, насколько я понимаю, в большинстве случаев он просто создает дубликаты записей для каждого языка и связывает их вместе с "оригиналом".

Однако недавно у меня возникла аналогичная проблема, когда мне понадобилась возможность добавить "множественную" версию имен терминов (в отличие от поля по умолчанию, в котором я вводил имя в единственном числе). Я решил эту проблему, подключившись к <taxonomy>_add_form_fields, <taxonomy>_edit_form_fields, edited_<taxonomy> и create_<taxonomy>.

Решение №1 - добавить пользовательское поле таксономии

define('TERM_PLURAL_NAME_KEY', 'term_name_plural');

function setup_taxonomies() {
    $taxonomy_name = 'my_tax';

    add_action( $taxonomy_name . '_add_form_fields', 'my_tax_add_plural_name_field', 10, 2 );
    add_action( $taxonomy_name . '_edit_form_fields', 'my_tax_edit_plural_name_field', 10, 2 );

    add_action( 'edited_' . $taxonomy_name, 'save_my_tax_meta', 10, 2 );
    add_action( 'create_' . $taxonomy_name, 'save_my_tax_meta', 10, 2 );
}
add_action('init', 'setup_plural_taxonomies')


function my_tax_add_plural_name_field() {
    ?>
        <div class="form-field">
            <label for="term_meta[<?php echo TERM_PLURAL_NAME_KEY; ?>]"><?php _e( 'Plural name', 'i18n_key' ); ?></label>
            <input type="text" name="term_meta[<?php echo TERM_PLURAL_NAME_KEY; ?>]" id="term_meta[<?php echo TERM_PLURAL_NAME_KEY; ?>]" value="">
            <p class="description"><?php _e( 'A pluralized version of the term title, to be used when multiple objects are referred to.', 'i18n_key' ); ?></p>
        </div>
    <?php
}

function my_tax_edit_plural_name_field($term) {
        $t_id = $term->term_id;
        $term_meta = get_option( "taxonomy_$t_id" ); ?>
        <tr class="form-field">
        <th scope="row" valign="top"><label for="term_meta[<?php echo TERM_PLURAL_NAME_KEY; ?>]"><?php _e( 'Plural name', 'i18n_key' ); ?></label></th>
            <td>
                <input type="text" name="term_meta[<?php echo TERM_PLURAL_NAME_KEY; ?>]" id="term_meta[<?php echo TERM_PLURAL_NAME_KEY; ?>]" value="<?php echo esc_attr( $term_meta[TERM_PLURAL_NAME_KEY] ) ? esc_attr( $term_meta[TERM_PLURAL_NAME_KEY] ) : ''; ?>">
                <p class="description"><?php _e( 'A pluralized version of the term title, to be used when multiple objects are referred to.', 'i18n_key' ); ?></p>
            </td>
        </tr>
    <?php
}

function save_my_tax_meta($term_id) {
    if ( isset( $_POST['term_meta'] ) ) {
        $t_id = $term_id;
        $term_meta = get_option( "taxonomy_$t_id" );
        $cat_keys = array_keys( $_POST['term_meta'] );
        foreach ( $cat_keys as $key ) {
            if ( isset ( $_POST['term_meta'][$key] ) ) {
                $term_meta[$key] = $_POST['term_meta'][$key];
            }
        }
        update_option( "taxonomy_$t_id", $term_meta );
    }
}

Приведенный выше код можно легко изменить, чтобы содержать локализованную строку вместо имени во множественном числе. Затем вы можете просмотреть список активированных языков в WPML и поле a для каждого языка (вам нужно будет настроить все функции выше). Это может быть непрактично, хотя, если у вас в WPML включено много языков, и это может очень сильно загромождать редактор.

Вот почему я также мог представить себе альтернативная реализация...

Решение №2 - Соединить "локализованные" термины с термином "язык по умолчанию"

Не уверен, что WPML сделает это автоматически для вас, но в случае, если это не так, вы можете позволить ему создавать локализованные термины для каждого языка и написать функцию, которая, учитывая термин, возвращает экземпляр локализованного языка этого термина. Затем вы могли бы создать это отношение, используя те же крючки, что и в приведенном выше примере, но вместо этого добавив два поля - первое, содержащее языковая версия термина по умолчанию (с использованием wp_dropdown_categories), а другая содержит язык локализованного термина.

Как я уже сказал, у меня мало опыта работы с WPML, и можно предположить, что этот тип функциональности уже реализован в самом плагине, поэтому я бы предложил изучить это, прежде чем идти по этому пути.

 4
Author: Simon, 2014-03-07 11:02:16

Вы всегда можете добавить пользовательские поля в термины, каждое пользовательское поле будет представлять перевод, я нашел хороший учебник по этой теме, в нем показано, как добавить пользовательское поле на страницу издания таксономии.

 0
Author: Alex Sancho, 2014-03-08 08:01:57

Я не уверен, как вы планируете работать с этими терминами, но я думаю, что вы все еще можете использовать собственный способ WPML для обработки переводов терминов, даже если вы не можете сохранить один и тот же фрагмент.

Когда вам нужно разобраться с термином slug, вы можете положиться на функцию icl_object_id().

Например, предположим, что у вас английский язык по умолчанию, а итальянский - второй язык. Вы определяете термин "Рим" с помощью слова "рим". При переводе его на "Рома", слизняк станет "рома", или "рим-2", если вы попытаетесь использовать ту же самую пулю.

Когда вам нужно работать с текущим термином, вы можете использовать что-то вроде этого:

global $sitepress;

$taxonomy_name = 'cities';
$current_term_slug = 'roma'; //so, that's Italian, for instance;

$current_term = get_term_by( 'slug', $current_term_slug, $taxonomy_name );

//Term exists
if($current_term) {
    $default_language = $sitepress->get_default_language();
    $current_language = $sitepress->get_current_language();

    $term_id = $current_term->term_id;
    if ( $default_language != $current_language ) {
        //Here you get the default language term id
        $term_id = icl_object_id( $term_id, $taxonomy_name, false, $default_language );
    }
}

Это всего лишь пример, но я думаю, что он достаточно ясен, чтобы показать вам, как всегда преобразовывать фрагмент данного термина таксономии в тот, который определен на языке по умолчанию.

 0
Author: Andrea Sciamanna, 2014-04-16 15:23:06