gettext no se traduce cuando se llama en ajax

4

Al cargar contenido en las llamadas de gettext (__ (), _e (), etc.) se traducen bien cuando renderizo la página en el navegador normalmente (PHP envía el contenido al navegador), sin embargo, cuando hago llamadas AJAX, el gettext no se traduce.

Pensé que tal vez era esa palabra específicamente, pero cuando uso la llamada gettext en el contenido que se carga desde el servidor normalmente (no a través de ajax) se traduce. Estoy usando WPML, pero no creo que tenga nada que ver con eso.

¿Hay algo especial que debo hacer o agregar la llamada a la función load_plugin_textdomain a un gancho de acción específico?

Se agregó a la acción "plugins_loaded" en este momento. Utilizo los métodos ajax de WordPress como se describe en sus documentos y obtengo todos los datos, simplemente no obtengo las traducciones de gettext.

Como se recomienda aquí, hay fragmentos del código que tiene el problema. No incluí los archivos gettext .pot y .mo, ya que conozco esos trabajos (bc / otro texto allí se traduce en el resto del complemento). Acabo de indicar cuál es su nombre y dónde residen en relación con la raíz del complemento.

//gettext files
// languages/my-plugin-fr_FR.pot
// languages/my-plugin-fr_FR.mo

//Javascript files
// js/main.js
(function($){

  function getResources() {
        $.ajax({
            type: "POST",
            url: ajax_object.ajaxurl,
            dataType: "json",
            data: {                    
                action: 'get_resources'               
            }
        })
        .done(function(data) {
            if (typeof data == "object" && data.hasOwnProperty("html")) {               
                $(".my-selector").empty().html(data.html);
            } else {
               alert("error on server");              
            }
        })
        .fail(function() {
            alert("error on server");  
        });
    }

  $(document).ready(function() {
     getResources();
  });

})(jQuery);
// end js/main.js


<?php
//MyPlugin class

class MyPlugin {    
  /// This value will be used as a unique identifier for translations
  public static $theme_domain_name = 'my-plugin';

  public function init() {
     if (!is_admin()) {         
      //any scripts and styles needed for the plugin to work in the front end
      add_action( 'wp_enqueue_scripts', array($this,'add_scripts_styles') );     
    }

    add_action('wp_ajax_get_resources', array($this,'ajax_get_resources'));
    add_action('wp_ajax_nopriv_get_resources', array($this,'ajax_get_resources'));
  }

  public function ajax_get_resources() {        
        $html = "";

        //just an example of returning post objects
        $posts = get_posts();

        $html .= $this->get_resources_html($posts);

        echo json_encode(array('html'=>$html));

        die();
  }

  public function add_scripts_styles() {
     wp_register_script('main-js', plugin_dir_url(__FILE__) . 'js/main.js', array('jquery'), '20131023' );
     wp_enqueue_script('main-js' );
     wp_localize_script('main-js', 'ajax_object', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
  }

  public function get_resources_html($resources) {
     $load_more_text = __('Load more',MyPlugin::$theme_domain_name);       

     //$html .= < do some other work on the resource posts provided >

     $html .= <<<LOAD
<a href="#">
    <span class="text-wrapper"><span class="text">
    {$load_more_text}
    </span></span>
</a>
LOAD;

    return $html;
  }
}
?>

<?php
//root plugin file my-plugin.php

require_once dirname( __FILE__ ) .'/MyPlugin.php';

$MyPlugin = new MyPlugin();    

add_action("plugins_loaded",function() {
    load_plugin_textdomain(MyPlugin::$theme_domain_name , false, dirname( plugin_basename(__FILE__) ) . '/languages/');
});

$MyPlugin->init();
?>
    
pregunta ako977 08.11.2013 - 22:57

1 respuesta

1

es demasiado tarde pero para uso público:

/* if qTranslate is installed */
/* set front locale for ajax calls requested from front-end */

function set_locale_for_frontend_ajax_calls() {

    if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX
        && substr( $_SERVER['HTTP_REFERER'], 0, strlen( admin_url() ) ) != admin_url() ) {

        load_theme_textdomain( 'your-theme-domain-name', get_template_directory() . '/languages’ );
    }
}

add_action( 'admin_init', 'set_locale_for_frontend_ajax_calls' );

add_action('wp_head','jsURLs');

function jsURLs(){

    global $q_config;

    ?><script type="text/javascript">
        /* <![CDATA[ */
        var ajaxurl      = "<?php echo admin_url('admin-ajax.php?lang='.$q_config['language']); ?>";
        /* ]]> */
    </script><?php

}

funciona para mí si qTranslate está instalado pero si no sigue tal vez funcione:

/* if qTranslate is not installed */
/* set front locale for ajax calls requested from front-end */

function set_locale_for_frontend_ajax_calls() {

    if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX
        && substr( $_SERVER['HTTP_REFERER'], 0, strlen( admin_url() ) ) != admin_url() ) {
        setlocale(LC_ALL, $_GET['lang']);
        load_theme_textdomain( 'your-theme-domain-name', get_template_directory() . '/languages’ );
    }
}

add_action( 'admin_init', 'set_locale_for_frontend_ajax_calls' );

add_action('wp_head','jsURLs');

function jsURLs(){

    global $q_config;

    ?><script type="text/javascript">
        /* <![CDATA[ */
        var ajaxurl      = "<?php echo admin_url('admin-ajax.php?lang='.get_locale()); ?>";
        /* ]]> */
    </script><?php

}
    
respondido por el alibabaei 18.11.2014 - 14:43

Lea otras preguntas en las etiquetas