使分类术语在不更改插件的情况下可翻译的最佳实践?

时间:2014-02-24 作者:unfulvio

我有一个国家和州的自定义分类法。我想让这些术语可以翻译,但我不确定实现这一点的最佳方式是什么。首先,我不想改变slug,只想改变标签,也许还有描述字符串。

我想到了两种方法。可以使用WPML。但是WPML似乎也会迫使您更改每种语言的slug,这是我不想要的。另一个可能是wp_insert_term() 但我不确定这是有效的还是正确的做法。我发现让管理员/编辑添加他们自己的术语更实用,硬编码所有术语都不允许我这样做,而且我觉得这不是很有效(在我的分类法中可能有几百个位置)。。。

有什么线索吗?

UPDATE 1 : WPML

我联系了WPML支持人员,他们解释说WPML为每种语言创建了新的分类术语,因此每个术语必须有唯一的slug。。。然而,我想知道是否有任何其他选项可以实现这一点,例如使用术语别名

UPDATE 2 : wp_insert_term()

我发现了这个:http://tommcfarlin.com/programmatically-create-categories/ 建议你跑步wp_insert_term() 在一个钩子内\'after_theme_setup\'after_switch_theme 行动然而,这并不能解决翻译问题。由于钩子操作仅在主题设置后触发,即使我获取了所有术语标签字符串,它也只会在主题设置时考虑语言。

3 个回复
最合适的回答,由SO网友:Simon 整理而成

我并不真正了解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没有什么经验,可以想象这种类型的功能已经在插件本身中实现了,所以我建议在走这条路之前进行调查。

SO网友:Alex Sancho

您总是可以向术语中添加自定义字段,每个自定义字段将代表一个翻译,我发现good tutorial 关于这个主题,它展示了如何向taxonomy edition页面添加自定义字段。

SO网友:Andrea Sciamanna

我不确定您打算如何处理这些术语,但我认为您仍然可以使用WPML native方式来处理术语翻译,即使您无法保持相同的slug。

当需要处理术语slug时,可以依赖icl\\u object\\u id()函数。

例如,假设您将英语作为默认语言,将意大利语作为第二语言。你用slug“Rome”定义了一个术语“罗马”。将其翻译为“Roma”时,如果您尝试使用相同的slug,则slug将变成“Roma”,或“rome-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 );
    }
}
这只是一个示例,但我认为这足够清楚地向您展示如何始终将给定分类术语的slug转换为默认语言中定义的slug。

结束