1.5.1 • Published 4 months ago

language-observer v1.5.1

Weekly downloads
-
License
MIT
Repository
github
Last release
4 months ago

npm GitHub package version NPM Downloads

1.2kB gzipped

Demo

Install

$ yarn add language-observer

Import

import LanguageObserver from 'language-observer';

Usage

const languageObserver = new LanguageObserver();

languageObserver.init({ lang: 'eu' });

translations.js

globalThis.translations = globalThis.translations || {};

globalThis.translations['en'] = {
  app: {
    title: {
      main: "Application",
      settings: "Settings",
    },
    menu: {
      profile: "Profile",
    },
  },
  buttons: {
    save: "Save",
  },
};

globalThis.translations['es'] = {
  app: {
    title: {
      main: "Aplicación",
      settings: "Configuraciones",
    },
    menu: {
      profile: "Perfil",
    },
  },
  buttons: {
    save: "Guardar",
  },
};

Switching

document.querySelector('#change-lang-to-es')?.addEventListener('click', () => {
  languageObserver.loadLanguage('es');
});

HTML example

<p data-i18n="title.welcome"></p>

<img data-i18n-attr='{"alt": "image.altText"}' src="image.jpg" alt="Default Alt Text">

Options

OptionTypeDefaultDescription
langstring'en'(Optional) The language code to initialize with. If not provided, the language is detected from the <body> element's class.

Methods

MethodParametersReturnsDescription
init(options?)options: { lang?: string }voidInitializes the observer. If a lang is provided in options, it loads and applies that language's translations.
loadLanguage(lang)lang: stringPromiseLoads and applies translations for the specified language. If translations are not found, falls back to the default language.
applyTranslations()nonePromiseApplies the current translations to all elements with data-i18n and data-i18n-attr attributes on the page. Useful for updating translations after dynamic content changes.
updateTranslations()nonevoidManually updates translations on the page. Call this method after adding new translations to globalThis.translations to apply them without changing the language or reloading the page.
loadTranslations(lang, loader)lang: string loader: (lang) => PromisePromiseAsynchronously loads translations for the specified language using the provided loader function, then applies them if the language matches the current language.
getNestedTranslation(obj, path) (static method)obj: object path: stringanyRetrieves a nested translation value from an object using a dot-separated key path. Returns undefined if the key does not exist.

Example of using methods

Using the loadTranslations method

async function fetchTranslations(lang) {
  const response = await fetch(`/locales/${lang}.json`);

  return response.json();
}

languageObserver.loadTranslations('fr', fetchTranslations);

Using the getNestedTranslation method

const nestedValue = LanguageObserver.getNestedTranslation(
  globalThis.translations['en'],
  'app.menu.profile'
);

console.log(nestedValue);

License

language-observer is released under MIT license