When loading content in gettext calls (__(), _e(), etc.) they translate fine when I render the page in the browser normally (PHP delivers the content to the browser), however when I make AJAX calls, the gettext does not translate.
I thought maybe it was that word specifically, but when I use the gettext call in content that is loaded from the server normally (not through ajax) it translates.
I’m using WPML, but I don’t think that has anything to do with it?
Is there anything special I have to do or add the load_plugin_textdomain function call to a specific action hook?
It’s added to the “plugins_loaded” action right now.
I use WordPress ajax methods as described in their docs and I get all the data, just don’t get gettext translations.
As advised here are snippets of the code that has the problem. I did not incldue the gettext .pot and .mo files, as I know those work (bc/ other text in there gets translated in the rest of the plugin itself). I just state what their name is and where they reside relevant to the plugin root.
//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();
?>
it is too late but for public use:
it works for me if qTranslate is installed
but if not following maybe work:
Since you’re using WPML, you can get the current language and then pass it using the
lang
parameter in your ajax request: