Skip to content

Internationalization

Using Revealing Module Pattern (RMP)

i18n.js

js
const i18n = (() => {
  /**
   * Privates Variables
   */
  let _locale = "";
  let _messages = {};

  /**
   * Set (Private) Locale
   * @param {string} locale
   */
  function setLocale(locale) {
    this._locale = locale;
  }

  /**
   * Set All (Private) Messages
   * @param {string[]} messages
   */
  function setMessages(messages) {
    this._messages = messages;
  }

  /**
   * Get Message (From Locale)
   * @param {string} key Message Key
   * @param {*} options
   * @returns {string} (Evaluated) Message
   */
  function getMessage(key, options) {
    const message = this._messages[this._locale][key] || "";
    // Replace All {{value}} With 'options.value'
    return message.replace(/{{(.+?)}}/g, (_, group) => options[group] || group);
  }

  /**
   * Public Methods
   */
  return {
    setLocale,
    setMessages,
    getMessage
  };
})();

i18n.test.js

js
describe("i18n", () => {
  const MESSAGES = {
    en: {
      "Hello.Friend": "Hello Friend!",
      "Hello.Name": "Hello {{name}}!"
    },
    fr: {
      "Hello.Friend": "Salut, l'ami !",
      "Hello.Name": "Salut, {{name}} !"
    }
  };

  beforeEach(() => {
    i18n.setMessages(MESSAGES);
  });

  it("Should Returns Static (EN) Message", () => {
    i18n.setLocale("en");
    expect(i18n.getMessage("Hello.Friend")).toEqual("Hello Friend!");
  });

  it("Should Returns Dynamic (FR) Message", () => {
    i18n.setLocale("fr");
    expect(i18n.getMessage("Hello.Name", { name: "John" })).toEqual("Salut, John !");
  });
});

Released under the MIT License.