Pregunta:
Al cargar contenido en llamadas gettext (__ (), _e (), etc.) se traducen bien cuando renderizo la página en el navegador normalmente (PHP entrega el contenido al navegador), sin embargo, cuando hago llamadas AJAX, gettext sí no traducir.
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 eso tenga nada que ver.
¿Hay algo especial que deba hacer o agregar la llamada a la función load_plugin_textdomain a un gancho de acción específico?
Se agrega a la acción "plugins_loaded" en este momento. Utilizo métodos ajax de WordPress como se describe en sus documentos y obtengo todos los datos, pero no obtengo traducciones de gettext.
Como se aconseja aquí, hay fragmentos del código que tiene el problema. No incluí los archivos gettext .pot y .mo, ya que sé que funcionan (bc / otro texto allí se traduce en el resto del complemento). Solo digo cuál es su nombre y dónde residen relevantes para 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();
?>
Respuesta:
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 lo 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
}