it-swarm.com.de

Themenlokalisierung von "Schnecken" (benutzerdefinierte Beitragstypen, Taxonomien)

in meinem Thema möchte ich eine Reihe von benutzerdefinierten Beitragstypen und Taxonomien definieren, von denen jeder seinen eigenen benutzerdefinierten Slug hat. Die Basissprache meines Themas ist Englisch, daher werden die Slugs in englischer Sprache sein

zum Beispiel beim Definieren des Slugs von benutzerdefinierten Artikeln vom Typ "Produkt":

'rewrite' => array( 'slug' => 'product' ),

gibt es eine Möglichkeit, die "Schnecke" durch PO/MO-Dateien zu übersetzen? kann ich sagen:

'rewrite' => array( 'slug' => __('product', 'mytextdomain') )

oder klappt es nicht Was ist die derzeitige Praxis, um Schnecken zu lokalisieren?

15
unfulvio

Ich würde nicht versuchen, Ihre Schnecken zu lokalisieren. Geben Sie Ihren Benutzern stattdessen die Möglichkeit, diese zu ändern, indem Sie der Seite mit den Permalink-Einstellungen ein weiteres Feld hinzufügen.

Hängen Sie sich in load-options-permalink.php ein und richten Sie einige Dinge ein, um die $_POST-Daten abzufangen und Ihren Slug zu retten. Fügen Sie der Seite auch ein Einstellungsfeld hinzu.

<?php
add_action( 'load-options-permalink.php', 'wpse30021_load_permalinks' );
function wpse30021_load_permalinks()
{
    if( isset( $_POST['wpse30021_cpt_base'] ) )
    {
        update_option( 'wpse30021_cpt_base', sanitize_title_with_dashes( $_POST['wpse30021_cpt_base'] ) );
    }

    // Add a settings field to the permalink page
    add_settings_field( 'wpse30021_cpt_base', __( 'CPT Base' ), 'wpse30021_field_callback', 'permalink', 'optional' );
}

Dann die Rückruffunktion für das Einstellungsfeld:

<?php
function wpse30021_field_callback()
{
    $value = get_option( 'wpse30021_cpt_base' );    
    echo '<input type="text" value="' . esc_attr( $value ) . '" name="wpse30021_cpt_base" id="wpse30021_cpt_base" class="regular-text" />';
}

Wenn Sie dann Ihren Beitragstyp registrieren, greifen Sie mit get_option zum Slug. Wenn es nicht vorhanden ist, verwenden Sie Ihre Standardeinstellung.

<?php
add_action( 'init', 'wpse30021_register_post_type' );
function wpse30021_register_post_type()
{
    $slug = get_option( 'wpse30021_cpt_base' );
    if( ! $slug ) $slug = 'your-default-slug';

    // register your post type, reference $slug for the rewrite
    $args['rewrite'] = array( 'slug' => $slug );

    // Obviously you probably need more $args than one....
    register_post_type( 'wpse30021_pt', $args );
}

Hier ist der Einstellungsfeldteil als Plugin https://Gist.github.com/1275867

BEARBEITEN: Eine weitere Option

Sie können den Slug auch basierend auf der Definition in der Konstante WPLANG ändern.

Schreiben Sie einfach eine schnelle Funktion, die Daten enthält ...

<?php
function wpse30021_get_slug()
{
    // return a default slug
    if( ! defined( 'WPLANG' ) || ! WPLANG || 'en_US' == WPLANG ) return 'press';

    // array of slug data
    $slugs = array( 
        'fr_FR' => 'presse',
        'es_ES' => 'prensa'
        // etc.
    );

    return $slugs[WPLANG];
}

Holen Sie sich dann den Slug, auf dem Sie Ihren benutzerdefinierten Beitragstyp registrieren.

<?php
add_action( 'init', 'wpse30021_register_post_type' );
function wpse30021_register_post_type()
{
    $slug = wpse30021_get_slug();

    // register your post type, reference $slug for the rewrite
    $args['rewrite'] = array( 'slug' => $slug );

    // Obviously you probably need more $args than one....
    register_post_type( 'wpse30021_pt', $args );
}

Die beste Option, IMO, wäre, dem Benutzer eine Option zu geben und solide Standardeinstellungen bereitzustellen:

<?php
add_action( 'init', 'wpse30021_register_post_type' );
function wpse30021_register_post_type()
{
    $slug = get_option( 'wpse30021_cpt_base' );
    // They didn't set up an option, get the default
    if( ! $slug ) $slug = wpse30021_get_slug();

    // register your post type, reference $slug for the rewrite
    $args['rewrite'] = array( 'slug' => $slug );

    // Obviously you probably need more $args than one....
    register_post_type( 'wpse30021_pt', $args );
}
18
chrisguitarguy

Ich mache genau das in einem Thema, das wir entwickeln. Es ist in 5 verschiedenen Sprachen verfügbar, und jede Sprache verfügt über einen übersetzten Satz von Kategorien. Die erste Komponente der URL in dem Thema wird analysiert, um zu bestimmen, welche Sprache im Landessprachenformat verwendet wird:

/uk-en
/fr-fr
/it-it

Und dann werden übersetzte Kategorien als weitere Bestandteile der URL analysiert.

Die URL wird in der parse_request-Phase analysiert:

function my_parse_request( $wp ) {
    $path = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );

    $components = preg_split('|/|', $path, null, PREG_SPLIT_NO_EMPTY );

    // Determine language from $components[0]
    $language = array_shift( $components );
    ...

    // Load translations file...
    $mofile = get_stylesheet_directory()."/$language.mo";

    load_textdomain( 'mydomain', $mofile );

    ...

    // Determine category from $components[0]
    if( __( 'some-category', 'mydomain' ) == $components[0] )
      $wp->query_vars['category'] = 'some-category';

    ...
}
add_action( 'parse_request', 'my_parse_request' );

Dieses Beispiel enthält keine erforderlichen Überprüfungen, sondern dient nur als Beispiel.

Dieser Ansatz hat natürlich auch Nachteile, lässt jedoch natürliche URLs in allen Sprachen zu. Die Hauptnachteile, die ich sehe, sind:

1) Der Permalink-Mechanismus wird nicht verwendet. Dies könnte wahrscheinlich so erweitert werden, dass die richtigen Permalink-Regeln für alle Sprachen generiert werden und parse_request nicht erforderlich ist. Um dies jedoch für alle Sprachen zu tun, müsste eine MO-Datei nach der anderen in einer Schleife geladen werden, und ich nicht weiß wie gut das unterstützt wird.

2) Wenn ein Übersetzer einen Slug ändert, werden die Links ungültig.

2
Bendoh

Wenn das nicht funktioniert Warum nicht einfach machen:

$post_slug=  __('product', 'mytextdomain');
'rewrite' => array( 'slug' => $post_slug );
2
chifliiiii

Sie könnten dies in Ihrem functions.php versuchen

<?php
add_filter('rewrite_slugs', function($translated_slugs) {
    // the possible translations for your slug 'product'
    $translated_slugs = array(
        'product' => array(
            'pt' => array(
                'has_archive' => true,'rewrite' => array('slug' => 'produto'),
            ),
            'es' => array(
                'has_archive' => true,'rewrite' => array('slug' => 'producto'),
            ),
        ),
    );
    return $translated_slugs;
});
?>

wie gesehen hier

0
Junior M