Я бы реализовал что-то вроде этого.
$.fn.setLanguage = function (options) {
options = $.extend({
language: 'ru',
text: this.attr('data-text')
}, options);
var make = function () {
var el = $(this);
$.ajax({
url: options.language + '.json',
dataType: 'json',
success: function (data) {
var html = data[options.text];
if ($.isFunction(options.callback)) {
options.callback(html);
} else {
el.html(html);
}
}
});
};
return this.each(make);
};
var wrapper = $('<div><i>Blah</i> <span>replaced</span> <b>Blah</b></div>');
wrapper.setLanguage({
text: 'login_error',
callback: $.proxy(function (html) {
$(this).find('span').html(html);
}, wrapper),
});
$('body').append(wrapper);
А еще лучше, конечно, сделать свое событие и слушать его.
Ну а вообще можно и не делать ajax-запрос делать. Проще получить объект переводов при старте страницы один раз и работать дальше с ним. Тогда и проблемы асинхронности не станет.