babel.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /*
  2. * String supplant
  3. * By Douglas Crockford
  4. * http://javascript.crockford.com/remedial.html
  5. */
  6. if (!String.prototype.supplant) {
  7. String.prototype.supplant = function (o) {
  8. return this.replace(/{([^{}]*)}/g,
  9. function (a, b) {
  10. var r = o[b];
  11. return typeof r === 'string' || typeof r === 'number' ? r : a;
  12. }
  13. );
  14. };
  15. }
  16. var babel = (function (window, document) {
  17. var config = {
  18. lang: "en",
  19. dir: "lang",
  20. extension: "json"
  21. };
  22. var next;
  23. var loaded = {};
  24. var loadLanguage = function(lang) {
  25. var xhr = new XMLHttpRequest();
  26. xhr.open("GET", config.dir + "/" + lang + "." + config.extension, true);
  27. xhr.addEventListener("load", function(e) {
  28. loaded[lang] = JSON.parse(xhr.responseText);
  29. if (next == lang) {
  30. replace(lang);
  31. }
  32. }, false);
  33. xhr.addEventListener("error", function(e) {
  34. loaded[lang] = {};
  35. }, false);
  36. xhr.send();
  37. };
  38. var replace = function(lang) {
  39. Object.keys(loaded[lang]).forEach(function (key) {
  40. var node = document.getElementById(key);
  41. if (node) {
  42. node.innerHTML = loaded[lang][key].supplant(loaded[lang]);
  43. }
  44. });
  45. };
  46. var babel = {
  47. config : function(options) {
  48. Object.keys(options).forEach(function (key) {
  49. config[key] = options[key];
  50. });
  51. },
  52. activate: function(lang) {
  53. if (!loaded[lang]) {
  54. loadLanguage(lang);
  55. next = lang;
  56. } else {
  57. replace(lang);
  58. }
  59. }
  60. };
  61. // bootstrap
  62. document.addEventListener("DOMContentLoaded", function (e) {
  63. babel.activate(config.lang);
  64. });
  65. return babel;
  66. })(window, document);