web-dev-qa-db-ja.com

カスタムユーザーロールを自動翻訳する方法

私はいくつかのカスタムユーザロールを追加する(またはより正確には最初に削除してから再度追加する)小さなプラグインを開発しました。これらの各役割は、次のように設定されています。

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のデフォルトのテキストドメインに含まれています。では、これらのカスタムロール名をどのように/どこで入力して変換する必要がありますか?

__( 'Someone', 'plugin-text-domain' )という名前のgettext呼び出しでロールを追加すると、データベースに書き込まれる文字列は現在の言語に従って翻訳されます。しかしながら、私が欲しいのは私が望むように言語を切り替え、それに応じて役割が表示されるようにすることができる解決法です - without _プラグインを無効にしてから再び有効にするその役割も.


私はこれに対する私の現在の解決策を掲載するつもりですが、私はまだ他のものに非常に興味がある(おそらくもっと効率的)approachです。

5
tfrommen

translate_user_role 関数は translate_with_gettext_context の単なるラッパーであり、コンテキスト 'User role'を定義します。

この最後の関数には、コンテキストと現在使用されているドメインを提供するフィルタフック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呼び出しが私たちの関数を渡さなければならないため、効率的な方法ではないようです。

2
tfrommen