wake-up-neo.net

Wie werden benutzerdefinierte Benutzerrollen automatisch übersetzt?

Ich habe ein kleines Plugin entwickelt, das einige benutzerdefinierte Benutzerrollen hinzufügt (oder genauer gesagt: erst löscht, dann fügt es wieder hinzu). Jede dieser Rollen ist folgendermaßen eingerichtet:

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

Das Problem ist nun, dass diese benutzerdefinierten Benutzerrollen überhaupt nicht übersetzt werden.

Die Übersetzungen der Standardbenutzerrollen (Autor, Mitarbeiter usw.) sind in der Standardtextdomäne von WordPress enthalten. Wie und wo kann ich diese benutzerdefinierten Rollennamen eingeben und übersetzen?

Wenn ich die Rolle mit einem gettext-Aufruf für ihren Namen __( 'Someone', 'plugin-text-domain' ) hinzufüge, wird die Zeichenfolge, die in die Datenbank geschrieben wird, entsprechend der aktuellen Sprache übersetzt. Was ich jedoch haben möchte, ist eine Lösung, mit der ich die Sprache nach Belieben wechseln und die Rollen entsprechend anzeigen lassen kann - ohne das Plugin deaktivieren und dann reaktivieren zu müssen (dh die Rolle löschen und hinzufügen) , nochmal).


Ich werde meine aktuelle Lösung dazu posten, aber ich bin immer noch sehr interessiert an einem anderen (möglicherweise effizienteren) Ansatz .

5
tfrommen

Die Funktion translate_user_role ist nur ein Wrapper für translate_with_gettext_context , der den Kontext 'Benutzerrolle' definiert.

In dieser letzten Funktion gibt es den Filter-Hook gettext_with_context, der den Kontext sowie die aktuell verwendete Domain bereitstellt.

Also könnten wir das machen:

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

Damit dies funktioniert, müssen wir einen Dummy-Aufruf von gettext ausführen, wie folgt:

_x( 'Someone', 'User role', 'plugin-text-domain' );

Wir könnten dies einfach nach add_role korrigieren.

Dies funktioniert, aber es scheint kein effizienter Ansatz zu sein, da jeder gettext-Aufruf mit einem Kontext unsere Funktion (en) bestehen muss.

2
tfrommen