如何自动转换自定义用户角色?

时间:2014-04-17 作者:tfrommen

我开发了一个小插件,可以添加(或者更准确地说:先删除,然后再添加)一些自定义用户角色。每个角色的设置方式如下:

function wpdev_141551_add_role_someone() {

    $role = \'someone\';

    remove_role( $role );

    $capabilities = array(
        \'read\'          => TRUE,
        \'publish_posts\' => TRUE,
        \'edit_posts\'    => TRUE,
        \'delete_posts\'  => FALSE,
        // ...
    );

    add_role( $role, \'Someone\', $capabilities );
}
现在的问题是,这些自定义用户角色根本无法转换。

默认用户角色(作者、贡献者等)的翻译包含在WordPress的默认文本域中。那么,我应该如何/在哪里介入并翻译这些自定义角色名称呢?

如果我添加了一个名为gettext的角色__( \'Someone\', \'plugin-text-domain\' ) 然后,写入数据库的字符串将根据当前语言进行翻译。然而,我希望有一个解决方案,让我可以根据需要切换语言,并相应地显示角色—without 必须取消激活插件,然后重新激活插件(即,再次删除并添加角色)。

我将发布我当前的解决方案,但我仍然very interested in any other (可能效率更高)approach.

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

这个translate_user_role 函数只是translate_with_gettext_context, 定义上下文“用户角色”。

在最后一个函数中,有一个过滤器挂钩gettext_with_context, 它提供了上下文以及当前使用的域。

所以我们可以这样做:

function wpdev_141551_translate_user_roles( $translations, $text, $context, $domain ) {

    $plugin_domain = \'plugin-text-domain\';

    $roles = array(
        \'Someone\',
        \'Nobody\',
        // ...
    );

    if (
        $context === \'User role\'
        && in_array( $text, $roles )
        && $domain !== $plugin_domain
    ) {
        return translate_with_gettext_context( $text, $context, $plugin_domain );
    }

    return $translations;
}
add_filter( \'gettext_with_context\', \'wpdev_141551_translate_user_roles\', 10, 4 );
为了实现这一点,我们必须执行一个伪gettext调用,如下所示:

_x( \'Someone\', \'User role\', \'plugin-text-domain\' );
我们可以把这个放在后面add_role.

这是可行的,但它似乎不是一种有效的方法,因为每个具有上下文的gettext调用都必须传递我们的函数。

SO网友:Mahdi Ebrahimi

您应该使用:

translate_user_role( __(\'some\',\'textdomains \') );
示例:

add_role( 
    \'wdcp_developer_role\', 
    translate_user_role( __(\'Developer\',$this->textdomains ) ), 
    array( \'read\' => true, \'level_12\' => true ) 
);
https://developer.wordpress.org/reference/functions/remove_role/https://developer.wordpress.org/reference/functions/translate_user_role/

SO网友:marciofao

我面临着一个类似的问题,我使用User Role editor设置了一些自定义角色,但在我的插件中,我需要在User\\u new中转换默认的wordpress前端角色选择器。php和user\\u编辑。php页面。

在调整了@tfrommen答案后,我终于找到了如下解决方案:

function ni_languages_extra_strings(){
    //set some translation strings to be set in loco translate plugin or similar

    $extra_strings = array(
      __(\'Vendedor\', \'plugin-text-domain\'),
      __(\'Empresa\', \'plugin-text-domain\')
    );
}

function ni_translate_user_roles( $translations, $text, $context, $domain ) {

    $plugin_domain = \'plugin-text-domain\';

    $roles = array(
        \'Vendedor\',
        \'Empresa\',
    );

    if (
        $context === \'User role\'
        && in_array( $text, $roles )
        && $domain !== $plugin_domain
    ) {
        return translate( $text, $plugin_domain );
        
    }

    return $translations;
}
add_filter( \'gettext_with_context\', \'ni_translate_user_roles\', 10, 4 );

结束

相关推荐

Usage of filters

在下面的示例中(从WordPress.org)获取提要后,为什么要删除过滤器<?php function return_7200( $seconds ) { // change the default feed cache recreation period to 2 hours return 7200; } add_filter( \'wp_feed_cache_transient_lifetime\' , \'return_720