{"version":3,"file":"uni-manager-locale.mjs","sources":["../../../projects/uni-manager/locale/utilities.ts","../../../projects/uni-manager/locale/manager.ts","../../../projects/uni-manager/locale/uni-manager-locale.ts"],"sourcesContent":["export enum Locale {\r\n  EN = 'en-US',\r\n  ES = 'es-CL',\r\n  IT = 'it-IT',\r\n}\r\n\r\nexport function getNavigatorLanguageFormatted(navigatorLanguage: string): Locale {\r\n  switch (navigatorLanguage) {\r\n    case 'en': {\r\n      return Locale.EN;\r\n    }\r\n\r\n    case 'es': {\r\n      return Locale.ES;\r\n    }\r\n\r\n    case 'it': {\r\n      return Locale.IT;\r\n    }\r\n\r\n    default: {\r\n      return Locale.EN;\r\n    }\r\n  }\r\n}\r\n","/* eslint-disable unicorn/consistent-class-member-order */\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\nimport { Locale, getNavigatorLanguageFormatted } from './utilities';\r\n\r\nexport class UniLocaleManager {\r\n  /* ------------------------------------------------------------------------------- */\r\n  /* ----------------------------------- Config ------------------------------------ */\r\n  /* ------------------------------------------------------------------------------- */\r\n  /** Codice lingua corrente (es. 'it-IT', 'en-US') usato per formattare date e numeri */\r\n  private static _locale: Locale = Locale.EN;\r\n\r\n  /** Elenco dei codici lingua supportati dall'applicazione (es. ['it-IT', 'en-US']) */\r\n  private static _localesSupported: Locale[] = [];\r\n\r\n  /** Prefisso globale applicato a tutte le chiavi di traduzione (es. 'APP_') */\r\n  private static _prefix: string | undefined = undefined;\r\n\r\n  /* ------------------------------------------------------------------------------- */\r\n  /* --------------------------------- Metodi: get --------------------------------- */\r\n  /* ------------------------------------------------------------------------------- */\r\n  /** Restituisce il codice lingua corrente */\r\n  public static get locale(): Locale {\r\n    return this._locale;\r\n  }\r\n\r\n  /** Restituisce l'array contenente tutti i codici locale supportati.*/\r\n  public static get localesSupported(): Locale[] {\r\n    return this._localesSupported;\r\n  }\r\n\r\n  /** Restituisce solo la lingua (es. 'it') */\r\n  public static get language(): string {\r\n    return this._locale.split('-', 1)[0];\r\n  }\r\n\r\n  /** Restituisce solo il paese (es. 'IT') */\r\n  public static get region(): string {\r\n    const parts = this._locale.split('-');\r\n    return parts.length > 1 ? parts[1] : '';\r\n  }\r\n\r\n  /* ------------------------------------------------------------------------------- */\r\n  /* ------------------------------------ Store ------------------------------------ */\r\n  /* ------------------------------------------------------------------------------- */\r\n  /** Store privato (Subject) */\r\n  public static store = new BehaviorSubject<Record<string, string>>({});\r\n\r\n  /** Store pubblico (Observable) */\r\n  public static store$ = this.store.asObservable();\r\n\r\n  /** Ottiene il dizionario attuale senza sottoscrizione */\r\n  public static get currentValue(): Record<string, string> {\r\n    return this.store.getValue();\r\n  }\r\n\r\n  /* ------------------------------------------------------------------------------- */\r\n  /* -------------------------------- Metodi: setup -------------------------------- */\r\n  /* ------------------------------------------------------------------------------- */\r\n  /**\r\n   * Inizializza la configurazione di rete del manager.\r\n   * Deve essere chiamato prima di effettuare qualsiasi richiesta HTTP.\r\n   */\r\n  public static setup(options: { prefix?: string }): void {\r\n    /* Locale */\r\n    const lsLocale = localStorage.getItem('uni-locale') as Locale | null;\r\n    if (lsLocale && Object.values(Locale).includes(lsLocale)) {\r\n      this._locale = lsLocale;\r\n    } else {\r\n      const navigatorLocale = navigator.language || Locale.EN;\r\n      const navigatorLanguage = navigatorLocale.split('-', 1)[0].toLowerCase();\r\n      this._locale = getNavigatorLanguageFormatted(navigatorLanguage);\r\n    }\r\n\r\n    /* Opzione prefisso */\r\n    if (options.prefix) {\r\n      this._prefix = options.prefix;\r\n    }\r\n  }\r\n\r\n  /* ------------------------------------------------------------------------------- */\r\n  /* -------------------------------- Metodi: set -------------------------------- */\r\n  /* ------------------------------------------------------------------------------- */\r\n  /** Imposta l'elenco dei codici lingua supportati dall'applicazione */\r\n  public static setLocalesSupported(locales: string[] | undefined): void {\r\n    const list = locales ?? [];\r\n\r\n    // Controllo: presenza di stringhe che non appartenenti all'enum Locale\r\n    const validLocales = Object.values(Locale) as string[];\r\n    const invalidLocale = list.find((lang) => !validLocales.includes(lang));\r\n\r\n    if (invalidLocale) {\r\n      throw new Error(`Locale '${invalidLocale}' is not supported`);\r\n    }\r\n\r\n    // Assegnazione valori\r\n    this._localesSupported = list as Locale[];\r\n  }\r\n\r\n  /**\r\n   * Aggiorna lo store locale con il dizionario delle traduzioni fornito.\r\n   * Se viene passato undefined, lo store viene inizializzato come oggetto vuoto.\r\n   */\r\n  public static setTranslations(translations: Record<string, string> | undefined): void {\r\n    this.store.next(translations ?? {});\r\n  }\r\n\r\n  /* ------------------------------------------------------------------------------- */\r\n  /* ----------------------------- Metodi: traduzioni ------------------------------ */\r\n  /* ------------------------------------------------------------------------------- */\r\n  /**\r\n   * Traduce una label in base al dizionario caricato.\r\n   * Gestisce la composizione della chiave, i parametri dinamici (interpolazione) e il fallback.\r\n   */\r\n  public static translate(\r\n    key: string,\r\n    prefix = 'lbl',\r\n    params?: Record<string, string | number | Date>,\r\n  ): string {\r\n    if (!key) return '-';\r\n\r\n    // Costruzione chiave: prefissoGlobale + prefissoLocale + LabelConInizialeMaiuscola\r\n    const keyParts = key.trim().split(/(?=[A-Z])/);\r\n    const rootKeyParts = keyParts.filter((p) => p.toLowerCase() !== prefix.toLowerCase());\r\n    const cleanKey = rootKeyParts.length > 0 ? rootKeyParts.join('') : undefined;\r\n    const capitalizedKey = cleanKey ? cleanKey.charAt(0).toUpperCase() + cleanKey.slice(1) : '';\r\n    const finalKey = `${this._prefix ?? ''}${prefix}${capitalizedKey}`;\r\n\r\n    // Cerca la chiave in minuscolo (standardizzazione)\r\n    let translation = this.currentValue?.[finalKey.toLowerCase()];\r\n\r\n    // Log e fallback se la traduzione manca\r\n    if (!translation) {\r\n      console.warn(`Translation missing for key: ${finalKey}`);\r\n      return `🔑 ${finalKey}`;\r\n    }\r\n\r\n    // Interpolazione variabili\r\n    if (params) {\r\n      for (const [key, value] of Object.entries(params)) {\r\n        const displayValue =\r\n          value instanceof Date ? value.toLocaleDateString(this._locale) : String(value);\r\n\r\n        translation = translation.replaceAll(`{{${key}}}`, () => displayValue);\r\n      }\r\n    }\r\n\r\n    return translation;\r\n  }\r\n\r\n  /**\r\n   * Traduce una stringa che contiene parametri separati da un carattere specifico.\r\n   * Supporta ora un numero arbitrario di parametri in formato \"label/param1/param2\"\r\n   * o semplicemente \"label\".\r\n   */\r\n  public static translateInlineParams(keyWithParams: string, splitChar: string): string {\r\n    if (!keyWithParams) return '-';\r\n\r\n    const [label, ...params] = keyWithParams.split(splitChar);\r\n\r\n    // Se non ci sono parametri, esegui una traduzione semplice\r\n    if (params.length === 0) {\r\n      return this.translate(label);\r\n    }\r\n\r\n    // Mappa i parametri in un oggetto di interpolazione: { inlineParam0: val, inlineParam1: val, ... }\r\n    const interpolationParameters: Record<string, string> = {};\r\n    for (const [index, val] of params.entries()) {\r\n      interpolationParameters[`param${index}`] = val;\r\n    }\r\n\r\n    return this.translate(label, 'lbl', interpolationParameters);\r\n  }\r\n\r\n  /* ------------------------------------------------------------------------------- */\r\n  /* ------------------------------- Metodi: numeri -------------------------------- */\r\n  /* ------------------------------------------------------------------------------- */\r\n  /**\r\n   * Converte un valore numerico in una stringa formattata secondo il locale impostato.\r\n   * Disabilita i separatori delle migliaia e forza un numero fisso di decimali.\r\n   */\r\n  public static toStringNumber(value: number, decimal: number): string {\r\n    return new Intl.NumberFormat(this._locale, {\r\n      useGrouping: true,\r\n      minimumFractionDigits: decimal,\r\n      maximumFractionDigits: decimal,\r\n      numberingSystem: 'latn',\r\n    }).format(value);\r\n  }\r\n\r\n  /* ------------------------------------------------------------------------------- */\r\n  /* -------------------------------- Metodi: date --------------------------------- */\r\n  /* ------------------------------------------------------------------------------- */\r\n  /**\r\n   * Formatta una data o una stringa in base al locale corrente.\r\n   * Gestisce tre modalità predefinite (date, time, full) e accetta opzioni personalizzate Intl.\r\n   */\r\n  public static toDate(\r\n    date: Date | string | number,\r\n    mode: 'date' | 'time' | 'full' = 'full',\r\n    force?: { oldLang: string; newLocale: string },\r\n  ): string {\r\n    const dt = new Date(date);\r\n\r\n    // Controllo: validità data\r\n    if (Number.isNaN(dt.getTime())) {\r\n      console.error(`[UniLocaleManager] Data non valida fornita a formatDateTime:`, date);\r\n      return '';\r\n    }\r\n\r\n    // Controllo: locale da forzare\r\n    const locale = force && this._locale.startsWith(force.oldLang) ? force.newLocale : this._locale;\r\n\r\n    switch (mode) {\r\n      case 'date': {\r\n        return dt.toLocaleDateString(locale);\r\n      }\r\n      case 'time': {\r\n        return dt.toLocaleTimeString(locale);\r\n      }\r\n      case 'full': {\r\n        return dt.toLocaleString(locale);\r\n      }\r\n    }\r\n  }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;IAAY;AAAZ,CAAA,UAAY,MAAM,EAAA;AAChB,IAAA,MAAA,CAAA,IAAA,CAAA,GAAA,OAAY;AACZ,IAAA,MAAA,CAAA,IAAA,CAAA,GAAA,OAAY;AACZ,IAAA,MAAA,CAAA,IAAA,CAAA,GAAA,OAAY;AACd,CAAC,EAJW,MAAM,KAAN,MAAM,GAAA,EAAA,CAAA,CAAA;AAMZ,SAAU,6BAA6B,CAAC,iBAAyB,EAAA;IACrE,QAAQ,iBAAiB;QACvB,KAAK,IAAI,EAAE;YACT,OAAO,MAAM,CAAC,EAAE;QAClB;QAEA,KAAK,IAAI,EAAE;YACT,OAAO,MAAM,CAAC,EAAE;QAClB;QAEA,KAAK,IAAI,EAAE;YACT,OAAO,MAAM,CAAC,EAAE;QAClB;QAEA,SAAS;YACP,OAAO,MAAM,CAAC,EAAE;QAClB;;AAEJ;;ACxBA;MAKa,gBAAgB,CAAA;;;;;AAKZ,IAAA,SAAA,IAAA,CAAA,OAAO,GAAW,MAAM,CAAC,EAAE,CAAC;;aAG5B,IAAA,CAAA,iBAAiB,GAAa,EAAE,CAAC;;aAGjC,IAAA,CAAA,OAAO,GAAuB,SAAS,CAAC;;;;;AAMhD,IAAA,WAAW,MAAM,GAAA;QACtB,OAAO,IAAI,CAAC,OAAO;IACrB;;AAGO,IAAA,WAAW,gBAAgB,GAAA;QAChC,OAAO,IAAI,CAAC,iBAAiB;IAC/B;;AAGO,IAAA,WAAW,QAAQ,GAAA;AACxB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC;;AAGO,IAAA,WAAW,MAAM,GAAA;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;AACrC,QAAA,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE;IACzC;;;;;AAMc,IAAA,SAAA,IAAA,CAAA,KAAK,GAAG,IAAI,eAAe,CAAyB,EAAE,CAAC,CAAC;;AAGxD,IAAA,SAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;;AAG1C,IAAA,WAAW,YAAY,GAAA;AAC5B,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;IAC9B;;;;AAKA;;;AAGG;IACI,OAAO,KAAK,CAAC,OAA4B,EAAA;;QAE9C,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,CAAkB;AACpE,QAAA,IAAI,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;AACxD,YAAA,IAAI,CAAC,OAAO,GAAG,QAAQ;QACzB;aAAO;YACL,MAAM,eAAe,GAAG,SAAS,CAAC,QAAQ,IAAI,MAAM,CAAC,EAAE;AACvD,YAAA,MAAM,iBAAiB,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;AACxE,YAAA,IAAI,CAAC,OAAO,GAAG,6BAA6B,CAAC,iBAAiB,CAAC;QACjE;;AAGA,QAAA,IAAI,OAAO,CAAC,MAAM,EAAE;AAClB,YAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM;QAC/B;IACF;;;;;IAMO,OAAO,mBAAmB,CAAC,OAA6B,EAAA;AAC7D,QAAA,MAAM,IAAI,GAAG,OAAO,IAAI,EAAE;;QAG1B,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAa;AACtD,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEvE,IAAI,aAAa,EAAE;AACjB,YAAA,MAAM,IAAI,KAAK,CAAC,WAAW,aAAa,CAAA,kBAAA,CAAoB,CAAC;QAC/D;;AAGA,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAgB;IAC3C;AAEA;;;AAGG;IACI,OAAO,eAAe,CAAC,YAAgD,EAAA;QAC5E,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;IACrC;;;;AAKA;;;AAGG;IACI,OAAO,SAAS,CACrB,GAAW,EACX,MAAM,GAAG,KAAK,EACd,MAA+C,EAAA;AAE/C,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,GAAG;;QAGpB,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC;QAC9C,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC;QACrF,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,SAAS;QAC5E,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE;AAC3F,QAAA,MAAM,QAAQ,GAAG,CAAA,EAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAA,EAAG,MAAM,CAAA,EAAG,cAAc,EAAE;;AAGlE,QAAA,IAAI,WAAW,GAAG,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;;QAG7D,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,OAAO,CAAC,IAAI,CAAC,gCAAgC,QAAQ,CAAA,CAAE,CAAC;YACxD,OAAO,CAAA,GAAA,EAAM,QAAQ,CAAA,CAAE;QACzB;;QAGA,IAAI,MAAM,EAAE;AACV,YAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;gBACjD,MAAM,YAAY,GAChB,KAAK,YAAY,IAAI,GAAG,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;AAEhF,gBAAA,WAAW,GAAG,WAAW,CAAC,UAAU,CAAC,CAAA,EAAA,EAAK,GAAG,CAAA,EAAA,CAAI,EAAE,MAAM,YAAY,CAAC;YACxE;QACF;AAEA,QAAA,OAAO,WAAW;IACpB;AAEA;;;;AAIG;AACI,IAAA,OAAO,qBAAqB,CAAC,aAAqB,EAAE,SAAiB,EAAA;AAC1E,QAAA,IAAI,CAAC,aAAa;AAAE,YAAA,OAAO,GAAG;AAE9B,QAAA,MAAM,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC;;AAGzD,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AACvB,YAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAC9B;;QAGA,MAAM,uBAAuB,GAA2B,EAAE;AAC1D,QAAA,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE;AAC3C,YAAA,uBAAuB,CAAC,CAAA,KAAA,EAAQ,KAAK,EAAE,CAAC,GAAG,GAAG;QAChD;QAEA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,uBAAuB,CAAC;IAC9D;;;;AAKA;;;AAGG;AACI,IAAA,OAAO,cAAc,CAAC,KAAa,EAAE,OAAe,EAAA;QACzD,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE;AACzC,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,qBAAqB,EAAE,OAAO;AAC9B,YAAA,qBAAqB,EAAE,OAAO;AAC9B,YAAA,eAAe,EAAE,MAAM;AACxB,SAAA,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;IAClB;;;;AAKA;;;AAGG;IACI,OAAO,MAAM,CAClB,IAA4B,EAC5B,IAAA,GAAiC,MAAM,EACvC,KAA8C,EAAA;AAE9C,QAAA,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC;;QAGzB,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;AAC9B,YAAA,OAAO,CAAC,KAAK,CAAC,8DAA8D,EAAE,IAAI,CAAC;AACnF,YAAA,OAAO,EAAE;QACX;;QAGA,MAAM,MAAM,GAAG,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO;QAE/F,QAAQ,IAAI;YACV,KAAK,MAAM,EAAE;AACX,gBAAA,OAAO,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC;YACtC;YACA,KAAK,MAAM,EAAE;AACX,gBAAA,OAAO,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC;YACtC;YACA,KAAK,MAAM,EAAE;AACX,gBAAA,OAAO,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC;YAClC;;IAEJ;;;AChOF;;AAEG;;;;"}