实现条件GetText翻译

时间:2017-05-10 作者:kosmicbird

我在我的网站上添加了一个消息按钮(我正在使用一个插件,该插件支持私人消息),方法是将插件的短代码添加到我的页脚。php:

<div class="msgshort"><?php echo do_shortcode(\'[ultimatemember_message_button user_id=1]\'); ?></div>
以下是我的网站上的屏幕截图:https://ibb.co/hLTkmQ

以下是此短代码背后的代码:

/***
*** @shortcode
***/
function ultimatemember_message_button( $args = array() ) {
    global $ultimatemember, $um_messaging;

    $defaults = array(
        \'user_id\' => 0
    );
    $args = wp_parse_args( $args, $defaults );
    extract( $args );

    $current_url = $ultimatemember->permalinks->get_current_url();

    if( um_get_core_page(\'user\') ){
        do_action("um_messaging_button_in_profile", $current_url, $user_id );
    }

    if ( !is_user_logged_in() ) {
        $redirect = um_get_core_page(\'login\');
        $redirect = add_query_arg(\'redirect_to\', $current_url, $redirect );
        $btn = \'<a href="\' . $redirect . \'" class="um-login-to-msg-btn um-message-btn um-button" data-message_to="\'.$user_id.\'">\'. __(\'Message\',\'um-messaging\'). \'</a>\';
        return $btn;
    } else if ( $user_id != get_current_user_id() ) {

        if ( $um_messaging->api->can_message( $user_id ) ) {
            $btn = \'<a href="#" class="um-message-btn um-button" data-message_to="\'.$user_id.\'"><span>\'. __(\'Message\',\'um-messaging\'). \'</span></a>\';
            return $btn;
        }

    }

}
此按钮已编码,因此按钮文本为“消息”。此按钮已出现在我的用户配置文件页面上,但现在我也将其添加到了页脚中,我想更改页脚中显示“消息”的文本,但不想更改用户配置文件模板区域中的文本。

因此,我使用此代码重命名我网站上消息按钮的文本:

//rename messagetxt
function um_rename_messagetxt( $translated_text, $text, $text_domain ) {
if ( \'Message\' === $text ) {
       $translated_text = \'Contact Us\';
}
return $translated_text;
}

add_filter ( \'gettext\', \'um_rename_messagetxt\', 10, 3);
当然,这会更改所有最初显示“Message”的按钮的按钮文本(因此,我添加的带有短代码的footer.php消息按钮和用户配置文件模板中的消息按钮都会更改)。

我只需要更改通过快捷码添加到页脚的按钮的文本。php文件。如何隔离文本翻译,以便只翻译特定元素的文本?例如,有没有一种方法我只能在页脚中找到“消息”时翻译它。如果是php,我将如何编写它?我真的很感激在这方面的任何帮助!

旁注:我是这个插件的高级成员,已经联系了他们的付费支持,他们说他们不确定如何做到这一点,并指示我使用Poedit。。。我认为Poedit不是一个合适的解决方案。非常感谢Dave Romsey,尽管我的php技能不足,但他还是试图帮助我:)

2 个回复
最合适的回答,由SO网友:Dave Romsey 整理而成

WordPress提供_x() 函数,就像__(), 但它增加了$context 用于区分相同字符串的参数。

在下面的示例中,在页脚中生成了一些输出。可翻译字符串为Message 在这两种情况下都使用,但在第一种情况下,Message 给出了上下文for use in footer text.

接下来,我们使用gettext_with_contextgettext 分别筛选以独立地翻译每个字符串。

// Generate output for our example.
add_action( \'wp_footer\', \'wpse_example_strings\' );
function wpse_example_strings() {
    // Note that concatenating strings is not translation friendly. It\'s done here for simplicity.
    echo \'Message string with context: \' . _x( \'Message\', \'for use in footer text\', \'text_domain\' ) . \'<br>\';
    echo \'Message string without context: \' . __( \'Message\', \'text_domain\' ) . \'<br>\';
}

/**
 * Translate text with context.
 *
 * https://codex.wordpress.org/Plugin_API/Filter_Reference/gettext_with_context
 *
 * @param string $translation  Translated text.
 * @param string $text         Text to translate.
 * @param string $context      Context information for the translators.
 * @param string $domain       Text domain. Unique identifier for retrieving translated strings.
 *
 * @return string
 */
add_filter( \'gettext_with_context\', \'wpse_gettext_with_context\', 10, 4 );
function wpse_gettext_with_context( $translation, $text, $context, $domain ) {
    if ( \'text_domain\' === $domain ) {
        if ( \'Message\' === $text && \'for use in footer text\' === $context ) {
            $translation = \'Message Us\';
        }
    }

    return $translation;
}

/**
 * Translate text without context.
 *
 * @param string $translation  Translated text.
 * @param string $text         Text to translate.
 * @param string $domain       Text domain. Unique identifier for retrieving translated strings.
 *
 * @return string
 */
add_filter( \'gettext\', \'um_rename_messagetxt\', 10, 3);
function um_rename_messagetxt( $translation, $text, $domain ) {
    if ( \'text_domain\' === $domain ) {
        if ( \'Message\' === $text ) {
            $translation = \'Contact Us\';
        }
    }

    return $translation;
}
编辑:终极会员消息按钮定制我仔细研究了这一点,不幸的是插件作者并没有让更改按钮文本变得非常容易。

这里有一个解决方案,它将用我们自己的分叉版本替换默认的最终成员消息按钮的短代码。请注意,我们可以回收ultimatemember_message_button 名称我建议用这段代码制作一个插件:

<?php
/*
Plugin Name: Ulimate Member Custom Message Button Shortcode
Plugin URI: 
Description: 
Version: 0.0.1
Author:
Author URI:
License: GPL2/Creative Commons
*/

/**
 * Remove the default UM Message shortcode and wire up our forked version.
 */ 
add_action( \'init\', \'wpse_ultimatemember_message_button_custom\' );
function wpse_ultimatemember_message_button_custom() {
    global $um_messaging;
    remove_shortcode( \'ultimatemember_message_button\', [ $um_messaging->shortcode, \'ultimatemember_message_button\' ] );
    add_shortcode( \'ultimatemember_message_button\', \'wpse_ultimatemember_message_button\' );
}

/**
 * Customized version of ultimatemember_message_button shortcode, which allows
 * for the button\'s label to be specified using the \'label\' parameter.
 */
function wpse_ultimatemember_message_button( $args = array() ) {
    global $ultimatemember, $um_messaging;

        $defaults = array(
            \'user_id\' => 0,
            \'label\' => __( \'Message\',\'um-messaging\' ),
        );
    $args = wp_parse_args( $args, $defaults );
    extract( $args );

    $current_url = $ultimatemember->permalinks->get_current_url();

    if( um_get_core_page(\'user\') ){
        do_action("um_messaging_button_in_profile", $current_url, $user_id );
    }

    if ( !is_user_logged_in() ) {
        $redirect = um_get_core_page(\'login\');
        $redirect = add_query_arg(\'redirect_to\', $current_url, $redirect );
        $btn = \'<a href="\' . $redirect . \'" class="um-login-to-msg-btn um-message-btn um-button" data-message_to="\'.$user_id.\'">\'. $label .\'</a>\';
        return $btn;
    } else if ( $user_id != get_current_user_id() ) {

        if ( $um_messaging->api->can_message( $user_id ) ) {
            $btn = \'<a href="#" class="um-message-btn um-button" data-message_to="\'.$user_id.\'"><span>\'. $label .\'</span></a>\';
            return $btn;
        }

    }

}
更新模板以调用ultimatemember_message_button 使用我们的新label 参数如下:

<div class="msgshort">
    <?php echo do_shortcode(\'[ultimatemember_message_button user_id=2 label="Contact US"]\'); ?>
</div>
这并不是最好的解决方案,但我们的选择受到插件实现方式的限制。我建议为label 要添加的参数。

SO网友:kosmicbird

嗯,我已经绝望了,所以我用另一种方法解决了这个问题(这种方法并不理想,但至少它能完成任务)

我刚刚在插件的短代码中添加了第二个短代码函数。php文件,并将新函数中的“消息”更改为“联系我们”:

/***
*** @shortcode
***/
function ultimatemember_message_button2( $args = array() ) {
    global $ultimatemember, $um_messaging;

    $defaults = array(
        \'user_id\' => 0
    );
    $args = wp_parse_args( $args, $defaults );
    extract( $args );

    $current_url = $ultimatemember->permalinks->get_current_url();

    if( um_get_core_page(\'user\') ){
        do_action("um_messaging_button_in_profile", $current_url, $user_id );
    }

    if ( !is_user_logged_in() ) {
        $redirect = um_get_core_page(\'login\');
        $redirect = add_query_arg(\'redirect_to\', $current_url, $redirect );
        $btn = \'<a href="\' . $redirect . \'" class="um-login-to-msg-btn um-message-btn um-button" data-message_to="\'.$user_id.\'">\'. __(\'Contact Us\',\'um-messaging\'). \'</a>\';
        return $btn;
    } else if ( $user_id != get_current_user_id() ) {

        if ( $um_messaging->api->can_message( $user_id ) ) {
            $btn = \'<a href="#" class="um-message-btn um-button" data-message_to="\'.$user_id.\'"><span>\'. __(\'Contact Us\',\'um-messaging\'). \'</span></a>\';
            return $btn;
        }

    }

}
然后我在页脚中调用了“new”快捷码。php文件:

<div class="msgshort"><?php echo do_shortcode(\'[ultimatemember_message_button2 user_id=1]\'); ?></div>
这并不太好,因为我想使用翻译并添加到我的孩子主题的功能中。php文件,以便在更新时不会丢失修改。。。因此,如果有人有更好的解决方案,我仍然会很感激。再次感谢您的帮助!

结束

相关推荐

Custom metabox translation

我已经创建了一个自定义的帖子类型,并添加了一些自定义的元数据库,现在我想知道我在我的网站上使用了什么样的翻译插件?我对它们都没有经验,所以我不知道谁会支持我的自定义元数据库,谁不会。