Cómo manejar la traducción de textos dentro de un .js de un tema de WP

7 minutos de lectura

avatar de usuario
tikimti-mvrht

Tengo una aplicación de wordpress y generalmente uso la función PHP <?php _e('foo', 'bar') ?> cuando necesito hacer eco de algo que necesita ser traducido. Pero, ahora mismo estoy implementando una nueva característica y en mi .js archivo tengo algo como

var confirmation = confirm("Are you sure you want to quit"); 
if(confirmation){
 ... 
}

El problema con el código anterior es que no puedo usar la función PHP _e() para traducirlo ya que este es un script JS.

¿Hay alguna forma de habilitar la traducción de textos repetidos en JS?

Después de RECOMPENSA

Estoy poniendo una recompensa ya que las preguntas dadas son genéricas, mientras que estoy buscando una solución que pueda resolver mi problema.

Estoy trabajando en un proyecto WP que fue creado por alguien antes. Se supone que solo debo agregar una traducción a los códigos que existen en el archivo js llamado functions.js sendero: C:\Users\meskerem\foo.com\wp-content\themes\foo\assets\scripts\functions.js supongamos que el siguiente código existe dentro de la función.

var confirmation = confirm("Are you sure you want to quit"); 
if(confirmation){
 ... 
}

Ahora el objetivo es hacer que esa oración en inglés sea traducible. El código js anterior se ejecuta cuando se hace clic en un botón dentro de este archivo.
C:\Users\meskerem\foo.com\wp-content\plugins\wp-jobhunt\templates\dashboards\candidate\templates_ajax_functions.php

El código html que desencadena la traducción es tan simple como:

<h1> <?= _e('good morning', 'jobhunt') ?> </h1>
<div> <i class="icon-trash" onclick="askConfirmation()"> x </i> </div>

Entonces, el guión es simple, pero la traducción es donde tengo algunos problemas.

  • Su confirm("text") probablemente debería estar dentro de la declaración if (if(confirm("text")) { /*code*/ }). No puedo ayudar con el resto, ya que tengo poco o ningún conocimiento de wordpress.

    – Piromonje

    24 de abril de 2017 a las 13:40


  • @Pyromonk No, de lo contrario, la instrucción if nunca se activaría.

    – Phil Healey

    24 de abril de 2017 a las 13:41

  • @Pyromonk Ah, su mensaje se lee como “dentro de la declaración if”, lo que significa que si se cumple la condición “si”. Mientras que quisiste decir que sea parte de la cláusula misma. p.ej if(confirm){var confirmation = confirm("Are you sure you want to quit"); }

    – Phil Healey

    24 de abril de 2017 a las 13:47


  • lo siento, quise decir if(confirmation){}

    – tikimti-mvrht

    24 de abril de 2017 a las 13:49

  • no hay problema @Pyromonk, un violín siempre es bueno para aclarar las cosas.

    – Phil Healey

    24 de abril de 2017 a las 13:52

avatar de usuario
fresno patel

En Word Press, debe pasar la matriz de traducción al script java respectivo.

por ejemplo,

si está en la secuencia de comandos de la cola como se muestra a continuación desde el archivo function.php,

wp_enqueue_script( $handle, $src, $deps,$ver,$in_footer );

debe agregar la traducción del archivo de función a js particular usando su identificador dentro de wp_localize_script ();

  e.g. wp_enqueue_script( 'your-handle', $src, $deps,$ver,$in_footer );

  $translation_array = array('messagekey' => __('Are you sure you want to quit', foo');                             );
  wp_localize_script('your-handle', 'langvars', $translation_array);

En tu caso

wp_enqueue_script( 'cs_functions_js', plugins_url('/assets/scripts/functions.js', __FILE__ ), '', '', true );

just add below code after above code.

$translation_array = array('messagekey' => __('Are you sure you want to quit', foo');                                );
  wp_localize_script('cs_functions_js', 'langvars', $translation_array);

Luego puede acceder a la traducción en js como,

var confirmboxmessage = langvars.messagekey;
var confirmation = confirm(langvars.messagekey);

  • Los comentarios no son para una discusión extensa; esta conversación se ha movido al chat.

    – Bhargav Rao

    5 de mayo de 2017 a las 7:05

avatar de usuario
phill healey

Deberías usar el wp_localize_script función, que se agregó a WordPress por esta misma razón.

Prueba con algo como esto:

wp_localize_script( $handle, $name, $data );

Ejemplo

<?php

// Register the script
wp_register_script( 'some_handle', '<ENTER YOUR SCRIPT PATH HERE>' );

// Localize the script with new data
$translation_array = array(
    'some_string' => __( 'Some string to translate', 'plugin-domain' ),
    'a_value' => '10'
);
wp_localize_script( 'some_handle', 'object_name', $translation_array );

// Enqueued script with localized data.
wp_enqueue_script( 'some_handle' );

Puede acceder a las variables en JavaScript de la siguiente manera:

<script>
// alerts 'Some string to translate'
alert( object_name.some_string);
</script> 

Nota: Los datos de la llamada de JavaScript resultante se pasarán como texto. Si está tratando de pasar números enteros, deberá llamar a la función parseInt() de JavaScript.

<script>
// Call a function that needs an int.
FinalZoom = map.getBoundsZoomLevel( bounds ) - parseInt( object_name.a_value, 10 ); 
</script>

  • ¿Necesito agregar path/to/myscript.js archivo en mi aplicación, o puedo usar el que ya tengo para ello?

    – tikimti-mvrht

    24 de abril de 2017 a las 13:59

  • No, usas la ruta a tu archivo. El dado es solo un ejemplo para mostrar que necesita usar su propio camino. Acepte mi respuesta, ya que esta es la forma correcta de hacer lo que necesita. Vea el enlace que publiqué en el códice de WordPress para confirmarlo.

    – Phil Healey

    24 de abril de 2017 a las 14:48

  • ¿Puedes actualizar tu respuesta para que pueda aceptar y votar? Actualmente no me funciona

    – tikimti-mvrht

    24 de abril de 2017 a las 14:57

  • por cierto: por la parte que dices "// Register the script wp_register_script( 'some_handle', 'path/to/myscript.js' );" estoy seguro myscript.js ya esta registrado. Es parte de un complemento de búsqueda de trabajo, ya hay toneladas de scripts que funcionaban antes de que decidiera agregarle una pequeña función. Entonces, ¿todavía necesito agregar esto?

    – tikimti-mvrht

    24 de abril de 2017 a las 15:01

  • PD Mi respuesta es la correcta, no es necesario que yo explique exactamente cómo debe hacer algo en su conjunto específico de circunstancias. Eso es para que lo descubras, sin embargo, estoy haciendo lo mejor que puedo y continuaré haciéndolo dentro de lo razonable.

    – Phil Healey

    24/04/2017 a las 18:31

Si entendí el problema correctamente, tiene un script que está en cola por un complemento o tema de terceros, y desea localizar el window.confirm cuadro sin modificar los guiones originales.

/wp-content/plugins/jobhunt-client-translations/jobhunt-client-translations.php

<?php
/*
Plugin Name: Jobhunt Translations
Author: John Doe
*/

add_action( 'wp_enqueue_scripts', function() {

    wp_enqueue_script( 'translations', plugins_url( '/translations.js', __FILE__ ) );

    // change the translations domain from 'default' to match yours
    // you can also add other translations here in format "message" => "translated message"
    wp_localize_script( 'translations', 'DialogMessages', [ 'Are you sure you want to quit' => __( 'Are you sure you want to quit', 'default' ) ] );

});

/wp-content/plugins/jobhunt-client-translations/translations.js

(function( original ) {
    window.confirm = function( message ) {
        message = DialogMessages[message] || message;
        return original.call( this, message );
    };
})(window.confirm);

Crear nueva carpeta jobhunt-client-translations en /wp-content/plugins/ directorio, coloque dentro de estos dos archivos y active el complemento. Simplemente anulará el valor predeterminado window.confirm cuadro de diálogo sin cambiar ninguno de los archivos originales de terceros y sin modificar el comportamiento predeterminado del cuadro de diálogo, excepto que se traducirá el mensaje.

El código fue probado y funciona correctamente.

avatar de usuario
aprendiz

tal vez esto podría ayudar

function addScript() {
    wp_enqueue_script( 'functions', get_template_directory_uri() . 'foo\assets\scripts\functions.js', array(), '1.0.0', true );
}
add_action( 'wp_enqueue_scripts', 'addScript' );

Cree un script PHP simple que su JS pueda llamar a través de AJAX, que no hace más que traducir una cadena (o varias cadenas) enviadas a través de HTTP GET y repetirla como el cuerpo de la respuesta (probablemente con json_encode()).

Luego puede crear una función JS para hacer esa llamada AJAX, por lo que llamarla podría ser tan simple como llamar a una función JS

var confirmTxt = jstranslate('Are you sure you want to quit?');

Y usando JQuery por ejemplo:

function jstranslate(string)
{
    translations = $.get('/my-ajax-translate-url',{string: string}, function(e){
        return e.text; // console.log e to double check what to return, this is from memory
    });
}

y en php

// require_once() your _e() function.
$text = _e($_GET['string'], 'jobhunt');
header('Content-Type: application/json');
echo json_encode(array('text' => $text));
exit;

¿Ha sido útil esta solución?