it-roy-ru.com

Лучшая практика, чтобы сделать таксономические термины переводимыми, не меняя слагов?

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

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

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

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

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

ОБНОВЛЕНИЕ 2: wp_insert_term ()

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

4
unfulvio

Я не совсем в курсе 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 и поле для каждого языка (вам нужно настроить все функции, описанные выше). Это может быть непрактично, если у вас много языков, включенных в WPML, и вы вполне можете загромождать редактор.

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

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

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

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

4
Simon

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

0
Alex Sancho

Я не уверен, как вы планируете работать с этими терминами, но я думаю, что вы все равно можете использовать нативный способ 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
Andrea Sciamanna