services_LanguageService.js

import i18n from "@/plugins/vue-i18n";
import router from "@/router";
import ERROR_CODES from "@/utils/error_codes";
import { debug, error } from "@/utils/logging";

/**
 * Service for managing application language and locale settings.
 * @class LanguageService
 */
const localStorageKey = "cp-locale";

class LanguageService {
  /**
   * Set the application language.
   * @param {string} language - Language code
   * @param {Object} [options] - Options for language change
   * @param {boolean} [options.routeAfterChange=true] - Whether to route after change
   * @param {boolean} [options.storeInLocalStorage=true] - Whether to store in localStorage
   * @returns {void}
   */
  setLanguage(
    language,
    { routeAfterChange = true, storeInLocalStorage = true } = {}
  ) {
    const options = {
      routeAfterChange,
      storeInLocalStorage,
    };

    debug("Setting language", language, options);

    if (options.storeInLocalStorage)
      localStorage.setItem(localStorageKey, language);
    document.documentElement.lang = language;

    i18n.locale = language;
    if (options.routeAfterChange)
      router
        .replace({
          params: { locale: language },
        })
        .catch(() => {
          error(
            "Redundant navigation with locale",
            ERROR_CODES.REDUNDANT_ROUTING
          );
        });
    debug("Successfully changed the language");
  }

  /**
   * Load the preferred language from localStorage or browser settings.
   * @param {Array} availableLocales - Array of available locale codes
   * @returns {string} The selected locale
   */
  loadLanguage(availableLocales) {
    let locale = "de";

    const usersLanguage = window.navigator.language.split("-")[0];
    const storedLanguage = localStorage.getItem(localStorageKey);

    if (storedLanguage) {
      locale = storedLanguage;
    } else if (availableLocales.includes(usersLanguage)) {
      locale = usersLanguage;
    }

    return locale;
  }
}

export default new LanguageService();