$(document).ready(function(){ var i18n_regexp = new RegExp(/--([a-z0-9_\.]+)--/i); var i18n_regexp_global = new RegExp(/--([a-z0-9_\.]+)--/gi); // i18n tooltip $("body") .append('
...
') .click(function() { $("#i18n-viz-tooltip").hide() }) $.fn.textNodes = function() { return $(this).contents().filter(function(){ return this.nodeType == 3 }); }; // add i18n attributes, classes, events $.fn.addI18n = function(keys) { $(this) .addClass("i18n-viz") .data("i18n-keys", keys) .mouseenter(function(){ $tooltip = $("#i18n-viz-tooltip"); var top = $(this).offset().top - 40; var left = $(this).offset().left; if (top < 0) top = $(this).offset().top + $(this).height() + 10; $tooltip.html(''); keys.forEach(function(value) { if (i18n_viz_key_url) { $tooltip.append(''+value+'') } else { $tooltip.append(""+value+"") } }); $tooltip .css({top: top, left: left}) .show() }) .mouseleave(function() { setTimeout(function() { $("#i18n-viz-tooltip").fadeOut('fast'); }, 1500); }); }; function getI18nKeys(text) { var keys = text.match(i18n_regexp_global); keys.forEach(function(value, index) { keys[index] = value.replace(/--/g, "") }); return keys; } // build custom :i18n selectors $.extend($.expr[':'], { 'i18n-el': function (el) { return i18n_regexp.test( $(el).textNodes().text() ); }, 'i18n-value': function (el) { return (i18n_regexp.test($(el).val()) || i18n_regexp.test($(el).attr('placeholder'))) } }); $(":i18n-el").each(function(){ var text = $(this).text(); var keys = getI18nKeys(text); $(this).addI18n(keys); $(this).textNodes().each(function() { $(this).replaceWith( $(this).text().replace(i18n_regexp_global, "") ); }) }); $("input:i18n-value").each(function(){ var value = $(this).val(); var placeholder = $(this).attr('placeholder'); var text = value + placeholder; var keys = getI18nKeys(text); $(this).addI18n(keys); $(this).val(value.replace(i18n_regexp_global, "")); if (placeholder) $(this).attr('placeholder', placeholder.replace(i18n_regexp_global, "")); }); })