Localización de temas de "babosas" (tipos de publicaciones personalizadas, taxonomías)

13

en mi tema, quiero definir una serie de tipos de correos personalizados y taxonomías personalizadas, cada una con su propia babosa personalizada; el idioma base de mi tema es el inglés, por lo tanto, las babosas estarán en idioma inglés

por ejemplo, al definir la barra de mensajes personalizados tipo "producto" args:

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

¿hay alguna manera de traducir el "slug" a través de archivos po / mo? puedo ponerlo como:

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

o no funcionará? ¿Cuál es la práctica actual para localizar babosas?

    
pregunta unfulvio 02.10.2011 - 13:02

5 respuestas

18

No intentaría localizar tus babosas. En su lugar, ¿por qué no les da a los usuarios la opción de cambiarlos agregando otro campo a la página de configuración de enlace permanente?

Enganche en load-options-permalink.php y configura algunas cosas para capturar los datos de $_POST para salvar a tu babosa. También agrega un campo de configuración a la página.

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

Luego, la función de devolución de llamada para el campo de configuración:

<?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" />';
}

Luego, cuando registres tu tipo de publicación, toma el slug con get_option . Si no está allí, usa tu valor predeterminado.

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

Aquí está la parte del campo de configuración como un complemento enlace

EDITAR: Otra opción

También puede cambiar el slug en función de lo que está definido en la constante WPLANG .

Simplemente escriba una función rápida que contenga datos ...

<?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];
}

Luego, obtén la barra donde registras tu tipo de publicación personalizada.

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

La mejor opción, IMO, sería ofrecerle al usuario una opción y proporcionar valores predeterminados sólidos:

<?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 );
}
    
respondido por el chrisguitarguy 10.10.2011 - 19:27
2

Si eso no funciona, ¿por qué no simplemente lo haces?

$post_slug=  __('product', 'mytextdomain');
'rewrite' => array( 'slug' => $post_slug );
    
respondido por el chifliiiii 10.10.2011 - 16:53
2

Estoy haciendo exactamente eso en un tema que estamos desarrollando. Está disponible en 5 idiomas distintos, y cada idioma tiene un conjunto de categorías traducidas. El primer componente de la URL en el tema se analiza para determinar qué idioma se usa, en el formato de país-idioma:

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

Y luego las categorías traducidas se analizan como componentes adicionales de la URL.

La URL se analiza en la fase parse_request :

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

Este ejemplo carece de los controles necesarios, pero está pensado solo como un ejemplo.

Por supuesto, este enfoque presenta inconvenientes, pero permite URL naturales en todos los idiomas. Los principales inconvenientes que veo son:

1) No hace uso del mecanismo de enlace permanente. Esto probablemente podría extenderse para que se generen las reglas de enlace permanente adecuadas para todos los idiomas y parse_request no será necesario, pero hacerlo para todos los idiomas implicaría cargar un archivo MO tras otro en un bucle, y no lo hago. saber lo bien apoyado que es.

2) Si un traductor cambia una bala, los enlaces se invalidan.

    
respondido por el Bendoh 13.10.2011 - 21:46
0

Puedes probar esto en tu functions.php

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

como se ve aquí

    
respondido por el Junior M 25.03.2015 - 23:43
-1

Recomendaría no hacer que las babosas sean traducibles .

La traducción es para el contenido del sitio orientado al usuario. Las babosas se usan internamente , y solo tienen un carácter "público" mediante reescrituras de URL, y las URL tampoco deben ser traducibles .

Entonces: deja tus babosas en paz, como las definas. Solo haga cadenas traducibles destinadas al consumo público .

    
respondido por el Chip Bennett 12.10.2011 - 19:06

Lea otras preguntas en las etiquetas