Traducir WP con __() y sprintf()

3 minutos de lectura

avatar de usuario
AD

Estoy tratando de traducir el tema de WP. tengo este codigo:

$translation = __( get_color(), 'textdomain' );

Funciona, obtengo el color dinámicamente de la función get_color() y se traduce bien. Pero cuando uso el complemento “Comprobación de tema”, aparece un error para este código.

Necesito usar esto en su lugar:

$translation = sprintf( __( '%s', 'textdomain' ), get_color() );

Pero en ese caso, mi marcador de posición %s no se traduce y obtengo el nombre del color original (no traducido).

¿Qué estoy haciendo mal? Gracias.

  • ¿Encontraste la causa?

    – Pmpr.ir

    4 de junio de 2018 a las 17:59

  • Si me pregunta, simplemente ignore el complemento de verificación de tema en este caso y esté contento con la buena solución que funciona.

    – Andreas

    30 de mayo de 2019 a las 10:43

  • @DA ¿es correcta la respuesta de Lille? ¿Podrías aceptarlo?

    – mickmackusa

    16 de abril a las 3:20

avatar de usuario
Mahdi Bashirpour

echo sprintf(__("text %s", 'your__text_domain'), $data);

  • sprintf() es una función de PHP: php.net/manual/en/function.sprintf.php

    – jazkat

    4 mayo 2018 a las 12:15

  • Esto ya está indicado en la pregunta del OP. ¿Por qué crees que has respondido la pregunta?

    – Pmpr.ir

    04/06/2018 a las 18:00

  • echo sprintf no tiene sentido 😉 uso printf

    – redanimalwar

    20 de agosto de 2019 a las 23:48

  • Estoy de acuerdo. echo sprintf() es un “antipatrón”. No hay absolutamente ninguna razón por la que alguien deba escribir echo sprintf() — debería ser printf() sin que echo cada vez.

    – mickmackusa

    16 de abril a las 3:18

avatar de usuario
lucas bustamante

Me sorprende que nadie haya mencionado el comentario de “traductores”, que le dice al traductor qué es cada variable en el sprintf es. Ejemplos:

sprintf(
    /* translators: %s: Name of a city */
    __( 'Your city is %s.', 'my-plugin' ),
    $city
);

sprintf(
     /* translators: 1: Name of a city 2: ZIP code */
    __( 'Your city is %1$s, and your zip code is %2$s.', 'my-plugin' ),
    $city,
    $zipcode
);

Ver: https://developer.wordpress.org/plugins/internationalization/how-to-internationalize-your-plugin/#variables

A.,

En tu código:

$translation = sprintf( __( '%s', 'textdomain' ), get_color() );

la __() funciones busca una traducción de la cadena ‘%s’, de la cual probablemente no tenga traducción, y luego reemplaza ‘%s’ con el resultado de get_color(). Entonces el valor por get_color() nunca pasa la función de traducción.

No estoy seguro de cuál es la solución correcta aquí, tal vez simplemente olvídese de Theme Check en este caso.

La respuesta ya está dada en las primeras 2 respuestas. Siga eso, pero no olvide agregar una función de escape allí también.

así es como se traducen textos con un valor o función:

sprintf(
    esc_html__( 'Your translatable text goes here and value is %s.', 'textdomain' ),
    $value_or_function
);

Y de la siguiente manera, puede agregar múltiples valores/funciones a sus textos traducibles.

sprintf(
    esc_html__( 'this is how you can add multiple values. value1: %1$s, and value2: %2$s.', 'textdomain' ),
    $value_or_function1,
    $value_or_function2
);

Aquí hay un resumen sobre esta función sprintf:

Los parámetros arg1, arg2, ++ se insertarán en los signos de porcentaje (%) en la cadena principal. Esta función funciona “paso a paso”. En el primer signo de % se inserta arg1, en el segundo signo de % se inserta arg2, etc.

Sintaxis: sprintf(format,arg1,arg2,arg++)

Posibles valores de formato:

%% - Returns a percent sign
%b - Binary number
%c - The character according to the ASCII value
%d - Signed decimal number (negative, zero or positive)
%e - Scientific notation using a lowercase (e.g. 1.2e+2)
%E - Scientific notation using a uppercase (e.g. 1.2E+2)
%u - Unsigned decimal number (equal to or greater than zero)
%f - Floating-point number (local settings aware)
%F - Floating-point number (not local settings aware)
%g - shorter of %e and %f
%G - shorter of %E and %f
%o - Octal number
%s - String
%x - Hexadecimal number (lowercase letters)
%X - Hexadecimal number (uppercase letters)

Pero generalmente usamos %s y asumimos que el valor del argumento será una cadena.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad