A melhor prática para tornar os termos da taxonomia traduzíveis sem alterar as lesmas?

4

Eu tenho uma taxonomia personalizada com países e estados. Eu gostaria de tornar esses termos traduzíveis, mas não tenho certeza qual seria a melhor maneira de conseguir isso. Primeiro de tudo, eu não quero que as lesmas mudem, apenas o rótulo, e talvez as strings da descrição.

Eu pensei em duas maneiras. Um poderia estar usando o WPML. Mas o WPML parece forçá-lo a mudar o slug para cada idioma também, o que eu não quero. Outro pode ser wp_insert_term() , mas não tenho certeza se isso é eficiente ou a maneira correta de fazê-lo. Eu acharia mais prático deixar que os administradores / editores adicionassem seus próprios termos, codificar todos os termos não me permitiria fazer isso e, além disso, tenho a sensação de que não é muito eficiente (pode haver algumas centenas de locais em meu taxonomia) ...

Alguma pista?

UPDATE 1: WPML

Entrei em contato com o suporte do WPML, eles explicaram que o WPML cria novos termos de taxonomia para cada idioma e, portanto, cada termo deve ter um slug exclusivo ... no entanto, estou me perguntando se há outra opção para isso, por exemplo. com aliases de termo, por exemplo

UPDATE 2: wp_insert_term ()

Eu encontrei isto: enlace e ele sugere para executar wp_insert_term() dentro de um gancho de 'after_theme_setup' ou after_switch_theme action. No entanto, isso não resolverá o problema da tradução. Como a ação do gancho é acionada somente após a configuração do tema, mesmo se eu obtiver o texto todos os termos, ela considerará apenas o idioma no momento da configuração do tema.

    
por unfulvio 24.02.2014 / 13:15

3 respostas

4

Não estou muito atualizado sobre o WPML e como ele lida com as traduções, mas meu entendimento geral é que na maioria dos casos ele simplesmente cria entradas duplicadas para cada idioma e as vincula com o "original".

No entanto, recentemente tive um problema semelhante em que precisei adicionar uma versão "pluralizada" dos nomes dos termos (em oposição ao campo padrão onde eu digito o nome no singular). Eu resolvi isso conectando <taxonomy>_add_form_fields , <taxonomy>_edit_form_fields , edited_<taxonomy> e create_<taxonomy> .

Solução 1 - adicione um campo de taxonomia personalizado

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 );
    }
}

O código acima pode ser facilmente modificado para conter uma string localizada em vez do nome no plural. Você poderia então percorrer a lista de idiomas ativados no WPML e um campo para cada idioma (você precisaria ajustar todas as funções acima). Isso pode ser impraticável, se você tiver muitos idiomas habilitados no WPML e pode muito bem confundir o editor.

É por isso que eu também posso imaginar uma implementação alternativa ...

Solução # 2 - Conecte termos "localizados" ao termo "idioma padrão"

Não tenho certeza se o WPML faria isso automaticamente para você, mas caso você não queira, crie termos localizados para cada idioma e escreva uma função que, dado um termo, retorne a instância de idioma localizada daquele termo. . Você poderia criar essa relação usando os mesmos ganchos do exemplo acima, mas adicionando dois campos - o primeiro contendo a versão do idioma padrão do termo (usando wp_dropdown_categories ) e o outro contendo o idioma do termo localizado.

Como eu disse, eu tenho pouca experiência com o WPML e pode-se imaginar que esse tipo de funcionalidade já esteja implementado no próprio plugin, então sugiro investigar isso antes de seguir esse caminho.

    
por Simon 07.03.2014 / 12:02
0

Você sempre poderia adicionar campos personalizados a termos, cada campo personalizado representaria uma tradução, eu encontrei um sobre esse assunto, mostra como adicionar um campo personalizado à página de edição de taxonomia.

    
por Alex Sancho 08.03.2014 / 09:01
0

Não sei ao certo como você planeja lidar com esses termos, mas acho que você ainda pode usar o modo nativo do WPML para lidar com traduções de termos, mesmo que não seja possível manter o mesmo slug.

Quando você precisa lidar com um slug de termos, você pode confiar na função icl_object_id ().

Por exemplo, suponha que você tenha inglês como idioma padrão e italiano como segundo idioma. Você define um termo "Roma", com slug "roma". Ao traduzir para "Roma", a lesma se tornará "roma" ou "rome-2" se você tentar usar a mesma lesma.

Quando você precisa trabalhar com o termo atual, pode usar algo assim:

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 );
    }
}

Isso é apenas um exemplo, mas eu acho que está claro o suficiente para mostrar a você como converter sempre o slug de um determinado termo de taxonomia, para aquele definido no idioma padrão.

    
por Andrea Sciamanna 16.04.2014 / 17:23