@embedpdf/plugin-i18n 2.0.0-next.1 → 2.0.0-next.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@embedpdf/core"),a={code:"en",name:"English",translations:{commands:{zoom:{in:"Zoom In",out:"Zoom Out",fitWidth:"Fit to Width",fitPage:"Fit to Page",automatic:"Automatic",level:"Zoom Level ({level}%)",inArea:"Zoom In Area"},fullscreen:{enter:"Enter Full Screen",exit:"Exit Full Screen"},rotate:{clockwise:"Rotate Clockwise",counterclockwise:"Rotate Counter-Clockwise"},menu:"Menu",sidebar:"Sidebar",search:"Search",comment:"Comment",download:"Download",print:"Print",openFile:"Open PDF",save:"Save",settings:"Settings",view:"View",annotate:"Annotate",shapes:"Shapes",redact:"Redact",fillAndSign:"Fill and Sign",form:"Form",pan:"Pan",pointer:"Pointer",undo:"Undo",redo:"Redo",copy:"Copy",screenshot:"Screenshot",nextPage:"Next Page",previousPage:"Previous Page"}}},t={code:"es",name:"Español",translations:{commands:{zoom:{in:"Acercar",out:"Alejar",fitWidth:"Ajustar al ancho",fitPage:"Ajustar a la página",automatic:"Automático",level:"Nivel de zoom ({level}%)",inArea:"Acercar área"},fullscreen:{enter:"Pantalla completa",exit:"Salir de pantalla completa"},rotate:{clockwise:"Girar a la derecha",counterclockwise:"Girar a la izquierda"},menu:"Menú",sidebar:"Barra lateral",search:"Buscar",comment:"Comentario",download:"Descargar",print:"Imprimir",openFile:"Abrir PDF",save:"Guardar",settings:"Configuración",view:"Ver",annotate:"Anotar",shapes:"Formas",redact:"Redactar",fillAndSign:"Rellenar y firmar",form:"Formulario",pan:"Desplazar",pointer:"Puntero",undo:"Deshacer",redo:"Rehacer",copy:"Copiar",screenshot:"Captura de pantalla",nextPage:"Página siguiente",previousPage:"Página anterior"}}},r="i18n",s={id:r,name:"I18n Plugin",version:"1.0.0",provides:["i18n"],requires:[],optional:[],defaultConfig:{enabled:!0,defaultLocale:"en",locales:[a,t]}},o="I18N/SET_LOCALE",n="I18N/REGISTER_LOCALE",i=e=>({type:o,payload:e}),l=e=>({type:n,payload:e}),c=class extends e.BasePlugin{constructor(a,t,r){super(a,t),this.locales=new Map,this.paramResolvers=new Map,this.paramsCache=new Map,this.localeChange$=e.createEmitter(),this.paramsChanged$=e.createScopedEmitter((e,a)=>({documentId:e,...a}),{cache:!1}),this.config=r,r.locales.forEach(e=>{this.locales.set(e.code,e),this.dispatch(l(e.code))}),r.paramResolvers&&Object.entries(r.paramResolvers).forEach(([e,a])=>{this.paramResolvers.set(e,a)}),this.dispatch(i(r.defaultLocale)),this.registry.getStore().subscribe((e,a)=>{this.detectParamChanges(a)})}async initialize(){this.logger.info("I18nPlugin","Initialize","I18n plugin initialized")}async destroy(){this.localeChange$.clear(),this.paramsChanged$.clear(),this.paramResolvers.clear(),this.paramsCache.clear(),super.destroy()}onDocumentClosed(e){this.paramsCache.delete(e),this.paramsChanged$.clearScope(e),this.logger.debug("I18nPlugin","DocumentClosed",`Cleaned up params cache for document: ${e}`)}buildCapability(){return{t:(e,a)=>this.translate(e,a),forDocument:e=>this.createI18nScope(e),registerParamResolver:(e,a)=>this.registerParamResolver(e,a),unregisterParamResolver:e=>this.unregisterParamResolver(e),setLocale:e=>this.setLocale(e),getLocale:()=>this.state.currentLocale,getAvailableLocales:()=>[...this.state.availableLocales],getLocaleInfo:e=>this.locales.get(e)??null,registerLocale:e=>this.registerLocale(e),hasLocale:e=>this.locales.has(e),onLocaleChange:this.localeChange$.on,onParamsChanged:this.paramsChanged$.onGlobal}}createI18nScope(e){return{t:(a,t)=>this.translate(a,{documentId:e,...t}),onParamsChanged:this.paramsChanged$.forScope(e)}}translate(e,a){const t=this.locales.get(this.state.currentLocale),r=this.config.fallbackLocale?this.locales.get(this.config.fallbackLocale):null;let s=this.getNestedValue(null==t?void 0:t.translations,e);if(!s&&r&&(s=this.getNestedValue(r.translations,e)),!s){if(!(null==a?void 0:a.fallback))return this.logger.warn("I18nPlugin","MissingTranslation",`Translation not found for key: ${e}`),e;s=a.fallback}let o=null==a?void 0:a.params;return!o&&this.paramResolvers.has(e)&&(o=this.resolveParams(e,null==a?void 0:a.documentId)),this.interpolate(s,o)}resolveParams(e,a){const t=this.paramResolvers.get(e);if(!t)return;const r=this.registry.getStore().getState();try{return t({state:r,documentId:a})}catch(s){return void this.logger.error("I18nPlugin","ParamResolverError",`Error resolving params for key "${e}":`,s)}}getNestedValue(e,a){if(!e)return;const t=a.split(".");let r=e;for(const s of t){if(null==r)return;r=r[s]}return"string"==typeof r?r:void 0}interpolate(e,a){return a?e.replace(/\{(\w+)\}/g,(e,t)=>{const r=a[t];return void 0!==r?String(r):e}):e}detectParamChanges(e){Object.keys(e.core.documents).forEach(a=>{this.detectDocumentParamChanges(a,e)})}detectDocumentParamChanges(a,t){const r=this.paramsCache.get(a),s=[];this.paramResolvers.forEach((o,n)=>{try{const i=o({state:t,documentId:a}),l=null==r?void 0:r.get(n);e.arePropsEqual(l,i)||(s.push(n),this.paramsCache.has(a)||this.paramsCache.set(a,new Map),this.paramsCache.get(a).set(n,i))}catch(i){this.logger.error("I18nPlugin","ParamDetectionError",`Error detecting param changes for key "${n}":`,i)}}),s.length>0&&(this.paramsChanged$.emit(a,{changedKeys:s}),this.logger.debug("I18nPlugin","ParamsChanged",`Translation params changed for document ${a}:`,s))}registerParamResolver(e,a){this.paramResolvers.has(e)&&this.logger.warn("I18nPlugin","ResolverOverwrite",`Param resolver for "${e}" already exists and will be overwritten`),this.paramResolvers.set(e,a),this.paramsCache.forEach(a=>{a.delete(e)}),this.logger.debug("I18nPlugin","ResolverRegistered",`Param resolver registered for: ${e}`)}unregisterParamResolver(e){this.paramResolvers.delete(e)&&(this.paramsCache.forEach(a=>{a.delete(e)}),this.logger.debug("I18nPlugin","ResolverUnregistered",`Param resolver unregistered for: ${e}`))}setLocale(e){if(!this.locales.has(e))return void this.logger.warn("I18nPlugin","LocaleNotFound",`Locale '${e}' is not registered`);const a=this.state.currentLocale;a!==e&&(this.dispatch(i(e)),this.localeChange$.emit({previousLocale:a,currentLocale:e}),this.logger.info("I18nPlugin","LocaleChanged",`Locale changed to: ${e}`))}registerLocale(e){this.locales.has(e.code)?this.logger.warn("I18nPlugin","LocaleAlreadyRegistered",`Locale '${e.code}' is already registered`):(this.locales.set(e.code,e),this.dispatch(l(e.code)),this.logger.info("I18nPlugin","LocaleRegistered",`Locale registered: ${e.code}`))}};c.id="i18n";let h=c;const g={currentLocale:"en",availableLocales:[]},d={manifest:s,create:(e,a)=>new h(r,e,a),reducer:(e=g,a)=>{switch(a.type){case o:{const t=a.payload;return e.availableLocales.includes(t)?{...e,currentLocale:t}:(console.warn(`I18nPlugin: Locale '${t}' not available`),e)}case n:{const t=a.payload;return e.availableLocales.includes(t)?e:{...e,availableLocales:[...e.availableLocales,t]}}default:return e}},initialState:g};exports.I18N_PLUGIN_ID=r,exports.I18nPlugin=h,exports.I18nPluginPackage=d,exports.enUS=a,exports.esES=t,exports.manifest=s;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@embedpdf/core"),a={code:"en",name:"English",translations:{commands:{zoom:{in:"Zoom In",out:"Zoom Out",fitWidth:"Fit to Width",fitPage:"Fit to Page",automatic:"Automatic",level:"Zoom Level ({level}%)",inArea:"Zoom In Area"},fullscreen:{enter:"Enter Full Screen",exit:"Exit Full Screen"},rotate:{clockwise:"Rotate Clockwise",counterclockwise:"Rotate Counter-Clockwise"},menu:"Menu",sidebar:"Sidebar",search:"Search",comment:"Comment",download:"Download",print:"Print",openFile:"Open PDF",save:"Save",settings:"Settings",view:"View",annotate:"Annotate",shapes:"Shapes",redact:"Redact",fillAndSign:"Fill and Sign",form:"Form",pan:"Pan",pointer:"Pointer",undo:"Undo",redo:"Redo",copy:"Copy",screenshot:"Screenshot",nextPage:"Next Page",previousPage:"Previous Page"}}},t={code:"es",name:"Español",translations:{commands:{zoom:{in:"Acercar",out:"Alejar",fitWidth:"Ajustar al ancho",fitPage:"Ajustar a la página",automatic:"Automático",level:"Nivel de zoom ({level}%)",inArea:"Acercar área"},fullscreen:{enter:"Pantalla completa",exit:"Salir de pantalla completa"},rotate:{clockwise:"Girar a la derecha",counterclockwise:"Girar a la izquierda"},menu:"Menú",sidebar:"Barra lateral",search:"Buscar",comment:"Comentario",download:"Descargar",print:"Imprimir",openFile:"Abrir PDF",save:"Guardar",settings:"Configuración",view:"Ver",annotate:"Anotar",shapes:"Formas",redact:"Redactar",fillAndSign:"Rellenar y firmar",form:"Formulario",pan:"Desplazar",pointer:"Puntero",undo:"Deshacer",redo:"Rehacer",copy:"Copiar",screenshot:"Captura de pantalla",nextPage:"Página siguiente",previousPage:"Página anterior"}}},r="i18n",s={id:r,name:"I18n Plugin",version:"1.0.0",provides:["i18n"],requires:[],optional:[],defaultConfig:{defaultLocale:"en",locales:[a,t]}},o="I18N/SET_LOCALE",i="I18N/REGISTER_LOCALE",n=e=>({type:o,payload:e}),l=e=>({type:i,payload:e}),c=class extends e.BasePlugin{constructor(a,t,r){super(a,t),this.locales=new Map,this.paramResolvers=new Map,this.paramsCache=new Map,this.localeChange$=e.createEmitter(),this.paramsChanged$=e.createScopedEmitter((e,a)=>({documentId:e,...a}),{cache:!1}),this.config=r,r.locales.forEach(e=>{this.locales.set(e.code,e),this.dispatch(l(e.code))}),r.paramResolvers&&Object.entries(r.paramResolvers).forEach(([e,a])=>{this.paramResolvers.set(e,a)}),this.dispatch(n(r.defaultLocale)),this.registry.getStore().subscribe((e,a)=>{this.detectParamChanges(a)})}async initialize(){this.logger.info("I18nPlugin","Initialize","I18n plugin initialized")}async destroy(){this.localeChange$.clear(),this.paramsChanged$.clear(),this.paramResolvers.clear(),this.paramsCache.clear(),super.destroy()}onDocumentClosed(e){this.paramsCache.delete(e),this.paramsChanged$.clearScope(e),this.logger.debug("I18nPlugin","DocumentClosed",`Cleaned up params cache for document: ${e}`)}buildCapability(){return{t:(e,a)=>this.translate(e,a),forDocument:e=>this.createI18nScope(e),registerParamResolver:(e,a)=>this.registerParamResolver(e,a),unregisterParamResolver:e=>this.unregisterParamResolver(e),setLocale:e=>this.setLocale(e),getLocale:()=>this.state.currentLocale,getAvailableLocales:()=>[...this.state.availableLocales],getLocaleInfo:e=>this.locales.get(e)??null,registerLocale:e=>this.registerLocale(e),hasLocale:e=>this.locales.has(e),onLocaleChange:this.localeChange$.on,onParamsChanged:this.paramsChanged$.onGlobal}}createI18nScope(e){return{t:(a,t)=>this.translate(a,{documentId:e,...t}),onParamsChanged:this.paramsChanged$.forScope(e)}}translate(e,a){const t=this.locales.get(this.state.currentLocale),r=this.config.fallbackLocale?this.locales.get(this.config.fallbackLocale):null;let s=this.getNestedValue(null==t?void 0:t.translations,e);if(!s&&r&&(s=this.getNestedValue(r.translations,e)),!s){if(!(null==a?void 0:a.fallback))return this.logger.warn("I18nPlugin","MissingTranslation",`Translation not found for key: ${e}`),e;s=a.fallback}let o=null==a?void 0:a.params;return!o&&this.paramResolvers.has(e)&&(o=this.resolveParams(e,null==a?void 0:a.documentId)),this.interpolate(s,o)}resolveParams(e,a){const t=this.paramResolvers.get(e);if(!t)return;const r=this.registry.getStore().getState();try{return t({state:r,documentId:a})}catch(s){return void this.logger.error("I18nPlugin","ParamResolverError",`Error resolving params for key "${e}":`,s)}}getNestedValue(e,a){if(!e)return;const t=a.split(".");let r=e;for(const s of t){if(null==r)return;r=r[s]}return"string"==typeof r?r:void 0}interpolate(e,a){return a?e.replace(/\{(\w+)\}/g,(e,t)=>{const r=a[t];return void 0!==r?String(r):e}):e}detectParamChanges(e){Object.keys(e.core.documents).forEach(a=>{this.detectDocumentParamChanges(a,e)})}detectDocumentParamChanges(a,t){const r=this.paramsCache.get(a),s=[];this.paramResolvers.forEach((o,i)=>{try{const n=o({state:t,documentId:a}),l=null==r?void 0:r.get(i);e.arePropsEqual(l,n)||(s.push(i),this.paramsCache.has(a)||this.paramsCache.set(a,new Map),this.paramsCache.get(a).set(i,n))}catch(n){this.logger.error("I18nPlugin","ParamDetectionError",`Error detecting param changes for key "${i}":`,n)}}),s.length>0&&(this.paramsChanged$.emit(a,{changedKeys:s}),this.logger.debug("I18nPlugin","ParamsChanged",`Translation params changed for document ${a}:`,s))}registerParamResolver(e,a){this.paramResolvers.has(e)&&this.logger.warn("I18nPlugin","ResolverOverwrite",`Param resolver for "${e}" already exists and will be overwritten`),this.paramResolvers.set(e,a),this.paramsCache.forEach(a=>{a.delete(e)}),this.logger.debug("I18nPlugin","ResolverRegistered",`Param resolver registered for: ${e}`)}unregisterParamResolver(e){this.paramResolvers.delete(e)&&(this.paramsCache.forEach(a=>{a.delete(e)}),this.logger.debug("I18nPlugin","ResolverUnregistered",`Param resolver unregistered for: ${e}`))}setLocale(e){if(!this.locales.has(e))return void this.logger.warn("I18nPlugin","LocaleNotFound",`Locale '${e}' is not registered`);const a=this.state.currentLocale;a!==e&&(this.dispatch(n(e)),this.localeChange$.emit({previousLocale:a,currentLocale:e}),this.logger.info("I18nPlugin","LocaleChanged",`Locale changed to: ${e}`))}registerLocale(e){this.locales.has(e.code)?this.logger.warn("I18nPlugin","LocaleAlreadyRegistered",`Locale '${e.code}' is already registered`):(this.locales.set(e.code,e),this.dispatch(l(e.code)),this.logger.info("I18nPlugin","LocaleRegistered",`Locale registered: ${e.code}`))}};c.id="i18n";let h=c;const g={currentLocale:"en",availableLocales:[]},d={manifest:s,create:(e,a)=>new h(r,e,a),reducer:(e=g,a)=>{switch(a.type){case o:{const t=a.payload;return e.availableLocales.includes(t)?{...e,currentLocale:t}:(console.warn(`I18nPlugin: Locale '${t}' not available`),e)}case i:{const t=a.payload;return e.availableLocales.includes(t)?e:{...e,availableLocales:[...e.availableLocales,t]}}default:return e}},initialState:g};exports.I18N_PLUGIN_ID=r,exports.I18nPlugin=h,exports.I18nPluginPackage=d,exports.enUS=a,exports.esES=t,exports.manifest=s;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/lib/locales/en.ts","../src/lib/locales/es.ts","../src/lib/manifest.ts","../src/lib/actions.ts","../src/lib/i18n-plugin.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["import { Locale } from '../types';\n\nexport const enUS: Locale = {\n code: 'en',\n name: 'English',\n translations: {\n commands: {\n zoom: {\n in: 'Zoom In',\n out: 'Zoom Out',\n fitWidth: 'Fit to Width',\n fitPage: 'Fit to Page',\n automatic: 'Automatic',\n level: 'Zoom Level ({level}%)',\n inArea: 'Zoom In Area',\n },\n fullscreen: {\n enter: 'Enter Full Screen',\n exit: 'Exit Full Screen',\n },\n rotate: {\n clockwise: 'Rotate Clockwise',\n counterclockwise: 'Rotate Counter-Clockwise',\n },\n menu: 'Menu',\n sidebar: 'Sidebar',\n search: 'Search',\n comment: 'Comment',\n download: 'Download',\n print: 'Print',\n openFile: 'Open PDF',\n save: 'Save',\n settings: 'Settings',\n view: 'View',\n annotate: 'Annotate',\n shapes: 'Shapes',\n redact: 'Redact',\n fillAndSign: 'Fill and Sign',\n form: 'Form',\n pan: 'Pan',\n pointer: 'Pointer',\n undo: 'Undo',\n redo: 'Redo',\n copy: 'Copy',\n screenshot: 'Screenshot',\n nextPage: 'Next Page',\n previousPage: 'Previous Page',\n },\n },\n};\n","import { Locale } from '../types';\n\nexport const esES: Locale = {\n code: 'es',\n name: 'Español',\n translations: {\n commands: {\n zoom: {\n in: 'Acercar',\n out: 'Alejar',\n fitWidth: 'Ajustar al ancho',\n fitPage: 'Ajustar a la página',\n automatic: 'Automático',\n level: 'Nivel de zoom ({level}%)',\n inArea: 'Acercar área',\n },\n fullscreen: {\n enter: 'Pantalla completa',\n exit: 'Salir de pantalla completa',\n },\n rotate: {\n clockwise: 'Girar a la derecha',\n counterclockwise: 'Girar a la izquierda',\n },\n menu: 'Menú',\n sidebar: 'Barra lateral',\n search: 'Buscar',\n comment: 'Comentario',\n download: 'Descargar',\n print: 'Imprimir',\n openFile: 'Abrir PDF',\n save: 'Guardar',\n settings: 'Configuración',\n view: 'Ver',\n annotate: 'Anotar',\n shapes: 'Formas',\n redact: 'Redactar',\n fillAndSign: 'Rellenar y firmar',\n form: 'Formulario',\n pan: 'Desplazar',\n pointer: 'Puntero',\n undo: 'Deshacer',\n redo: 'Rehacer',\n copy: 'Copiar',\n screenshot: 'Captura de pantalla',\n nextPage: 'Página siguiente',\n previousPage: 'Página anterior',\n },\n },\n};\n","import { PluginManifest } from '@embedpdf/core';\nimport { I18nPluginConfig } from './types';\nimport { enUS, esES } from './locales';\n\nexport const I18N_PLUGIN_ID = 'i18n';\n\nexport const manifest: PluginManifest<I18nPluginConfig> = {\n id: I18N_PLUGIN_ID,\n name: 'I18n Plugin',\n version: '1.0.0',\n provides: ['i18n'],\n requires: [],\n optional: [],\n defaultConfig: {\n enabled: true,\n defaultLocale: 'en',\n locales: [enUS, esES],\n },\n};\n","import { Action } from '@embedpdf/core';\nimport { Locale, LocaleCode } from './types';\n\nexport const SET_LOCALE = 'I18N/SET_LOCALE';\nexport const REGISTER_LOCALE = 'I18N/REGISTER_LOCALE';\n\nexport interface SetLocaleAction extends Action {\n type: typeof SET_LOCALE;\n payload: LocaleCode;\n}\n\nexport interface RegisterLocaleAction extends Action {\n type: typeof REGISTER_LOCALE;\n payload: LocaleCode;\n}\n\nexport type I18nAction = SetLocaleAction | RegisterLocaleAction;\n\nexport const setLocale = (locale: LocaleCode): SetLocaleAction => ({\n type: SET_LOCALE,\n payload: locale,\n});\n\nexport const registerLocale = (locale: LocaleCode): RegisterLocaleAction => ({\n type: REGISTER_LOCALE,\n payload: locale,\n});\n","import {\n BasePlugin,\n PluginRegistry,\n StoreState,\n arePropsEqual,\n createEmitter,\n createScopedEmitter,\n} from '@embedpdf/core';\nimport {\n I18nCapability,\n I18nPluginConfig,\n I18nState,\n I18nScope,\n Locale,\n LocaleCode,\n LocaleChangeEvent,\n TranslationKey,\n TranslateOptions,\n ParamResolver,\n TranslationParamsChangedData,\n TranslationParamsChangedEvent,\n} from './types';\nimport {\n I18nAction,\n setLocale as setLocaleAction,\n registerLocale as registerLocaleAction,\n} from './actions';\n\nexport class I18nPlugin extends BasePlugin<\n I18nPluginConfig,\n I18nCapability,\n I18nState,\n I18nAction\n> {\n static readonly id = 'i18n' as const;\n\n private config: I18nPluginConfig;\n private locales = new Map<LocaleCode, Locale>();\n private paramResolvers = new Map<TranslationKey, ParamResolver>();\n\n // Cache resolved params per document per key\n // Map<documentId, Map<translationKey, resolvedParams>>\n private paramsCache = new Map<string, Map<TranslationKey, Record<string, string | number>>>();\n\n // Events\n private readonly localeChange$ = createEmitter<LocaleChangeEvent>();\n private readonly paramsChanged$ = createScopedEmitter<\n TranslationParamsChangedData,\n TranslationParamsChangedEvent,\n string\n >((documentId, data) => ({ documentId, ...data }), { cache: false });\n\n constructor(id: string, registry: PluginRegistry, config: I18nPluginConfig) {\n super(id, registry);\n\n this.config = config;\n\n // Register all provided locales\n config.locales.forEach((locale) => {\n this.locales.set(locale.code, locale);\n this.dispatch(registerLocaleAction(locale.code));\n });\n\n // Register param resolvers\n if (config.paramResolvers) {\n Object.entries(config.paramResolvers).forEach(([key, resolver]) => {\n this.paramResolvers.set(key, resolver);\n });\n }\n\n // Set initial locale\n this.dispatch(setLocaleAction(config.defaultLocale));\n\n // Subscribe to global store changes for param change detection\n this.registry.getStore().subscribe((_action, newState) => {\n this.detectParamChanges(newState);\n });\n }\n\n async initialize(): Promise<void> {\n this.logger.info('I18nPlugin', 'Initialize', 'I18n plugin initialized');\n }\n\n async destroy(): Promise<void> {\n this.localeChange$.clear();\n this.paramsChanged$.clear();\n this.paramResolvers.clear();\n this.paramsCache.clear();\n super.destroy();\n }\n\n protected override onDocumentClosed(documentId: string): void {\n // Clean up cache for closed document\n this.paramsCache.delete(documentId);\n this.paramsChanged$.clearScope(documentId);\n\n this.logger.debug(\n 'I18nPlugin',\n 'DocumentClosed',\n `Cleaned up params cache for document: ${documentId}`,\n );\n }\n\n protected buildCapability(): I18nCapability {\n return {\n t: (key, options) => this.translate(key, options),\n forDocument: (documentId) => this.createI18nScope(documentId),\n registerParamResolver: (key, resolver) => this.registerParamResolver(key, resolver),\n unregisterParamResolver: (key) => this.unregisterParamResolver(key),\n setLocale: (locale) => this.setLocale(locale),\n getLocale: () => this.state.currentLocale,\n getAvailableLocales: () => [...this.state.availableLocales],\n getLocaleInfo: (code) => this.locales.get(code) ?? null,\n registerLocale: (locale) => this.registerLocale(locale),\n hasLocale: (code) => this.locales.has(code),\n onLocaleChange: this.localeChange$.on,\n onParamsChanged: this.paramsChanged$.onGlobal,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Scoping\n // ─────────────────────────────────────────────────────────\n\n private createI18nScope(documentId: string): I18nScope {\n return {\n t: (key, options) => this.translate(key, { documentId, ...options }),\n onParamsChanged: this.paramsChanged$.forScope(documentId),\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Translation Logic\n // ─────────────────────────────────────────────────────────\n\n private translate(key: TranslationKey, options?: TranslateOptions): string {\n const locale = this.locales.get(this.state.currentLocale);\n const fallbackLocale = this.config.fallbackLocale\n ? this.locales.get(this.config.fallbackLocale)\n : null;\n\n // Try current locale\n let value = this.getNestedValue(locale?.translations, key);\n\n // Try fallback locale\n if (!value && fallbackLocale) {\n value = this.getNestedValue(fallbackLocale.translations, key);\n }\n\n // If still not found, use fallback or return key\n if (!value) {\n if (options?.fallback) {\n // Use provided fallback string\n value = options.fallback;\n } else {\n this.logger.warn(\n 'I18nPlugin',\n 'MissingTranslation',\n `Translation not found for key: ${key}`,\n );\n return key;\n }\n }\n\n // Resolve params: explicit params take precedence over registered resolvers\n let params = options?.params;\n\n // If no explicit params and we have a resolver, try to resolve\n if (!params && this.paramResolvers.has(key)) {\n params = this.resolveParams(key, options?.documentId);\n }\n\n // Interpolate parameters (works for both found translations and fallback)\n return this.interpolate(value, params);\n }\n\n private resolveParams(\n key: TranslationKey,\n documentId?: string,\n ): Record<string, string | number> | undefined {\n const resolver = this.paramResolvers.get(key);\n if (!resolver) return undefined;\n\n const state = this.registry.getStore().getState();\n\n try {\n // Pass documentId (which may be undefined) to resolver\n return resolver({ state, documentId });\n } catch (error) {\n this.logger.error(\n 'I18nPlugin',\n 'ParamResolverError',\n `Error resolving params for key \"${key}\":`,\n error,\n );\n return undefined;\n }\n }\n\n private getNestedValue(obj: any, path: string): string | undefined {\n if (!obj) return undefined;\n\n const parts = path.split('.');\n let current = obj;\n\n for (const part of parts) {\n if (current === undefined || current === null) return undefined;\n current = current[part];\n }\n\n return typeof current === 'string' ? current : undefined;\n }\n\n private interpolate(str: string, params?: Record<string, string | number>): string {\n if (!params) return str;\n\n // Replace {key} with params[key]\n return str.replace(/\\{(\\w+)\\}/g, (match, key) => {\n const value = params[key];\n return value !== undefined ? String(value) : match;\n });\n }\n\n // ─────────────────────────────────────────────────────────\n // Smart Param Change Detection\n // ─────────────────────────────────────────────────────────\n\n private detectParamChanges(newState: StoreState<any>): void {\n // Get all documents from core state\n const documentIds = Object.keys(newState.core.documents);\n\n documentIds.forEach((documentId) => {\n this.detectDocumentParamChanges(documentId, newState);\n });\n }\n\n private detectDocumentParamChanges(documentId: string, newState: StoreState<any>): void {\n const previousCache = this.paramsCache.get(documentId);\n const changedKeys: TranslationKey[] = [];\n\n // Re-resolve all params that have resolvers\n this.paramResolvers.forEach((resolver, key) => {\n try {\n const newParams = resolver({ state: newState, documentId });\n const prevParams = previousCache?.get(key);\n\n // Compare params (deep equality for simplicity)\n if (!arePropsEqual(prevParams, newParams)) {\n changedKeys.push(key);\n\n // Update cache\n if (!this.paramsCache.has(documentId)) {\n this.paramsCache.set(documentId, new Map());\n }\n this.paramsCache.get(documentId)!.set(key, newParams);\n }\n } catch (error) {\n this.logger.error(\n 'I18nPlugin',\n 'ParamDetectionError',\n `Error detecting param changes for key \"${key}\":`,\n error,\n );\n }\n });\n\n // Emit event if any params changed\n if (changedKeys.length > 0) {\n this.paramsChanged$.emit(documentId, { changedKeys });\n\n this.logger.debug(\n 'I18nPlugin',\n 'ParamsChanged',\n `Translation params changed for document ${documentId}:`,\n changedKeys,\n );\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Param Resolver Management\n // ─────────────────────────────────────────────────────────\n\n private registerParamResolver(key: TranslationKey, resolver: ParamResolver): void {\n if (this.paramResolvers.has(key)) {\n this.logger.warn(\n 'I18nPlugin',\n 'ResolverOverwrite',\n `Param resolver for \"${key}\" already exists and will be overwritten`,\n );\n }\n\n this.paramResolvers.set(key, resolver);\n\n // Clear cache for this key in all documents\n this.paramsCache.forEach((docCache) => {\n docCache.delete(key);\n });\n\n this.logger.debug('I18nPlugin', 'ResolverRegistered', `Param resolver registered for: ${key}`);\n }\n\n private unregisterParamResolver(key: TranslationKey): void {\n if (this.paramResolvers.delete(key)) {\n // Clear cache for this key in all documents\n this.paramsCache.forEach((docCache) => {\n docCache.delete(key);\n });\n\n this.logger.debug(\n 'I18nPlugin',\n 'ResolverUnregistered',\n `Param resolver unregistered for: ${key}`,\n );\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Locale Management\n // ─────────────────────────────────────────────────────────\n\n private setLocale(locale: LocaleCode): void {\n if (!this.locales.has(locale)) {\n this.logger.warn('I18nPlugin', 'LocaleNotFound', `Locale '${locale}' is not registered`);\n return;\n }\n\n const previousLocale = this.state.currentLocale;\n if (previousLocale === locale) return;\n\n this.dispatch(setLocaleAction(locale));\n\n this.localeChange$.emit({\n previousLocale,\n currentLocale: locale,\n });\n\n this.logger.info('I18nPlugin', 'LocaleChanged', `Locale changed to: ${locale}`);\n }\n\n private registerLocale(locale: Locale): void {\n if (this.locales.has(locale.code)) {\n this.logger.warn(\n 'I18nPlugin',\n 'LocaleAlreadyRegistered',\n `Locale '${locale.code}' is already registered`,\n );\n return;\n }\n\n this.locales.set(locale.code, locale);\n this.dispatch(registerLocaleAction(locale.code));\n\n this.logger.info('I18nPlugin', 'LocaleRegistered', `Locale registered: ${locale.code}`);\n }\n}\n","import { Reducer } from '@embedpdf/core';\nimport { I18nState } from './types';\nimport { I18nAction, SET_LOCALE, REGISTER_LOCALE } from './actions';\n\nexport const initialState: I18nState = {\n currentLocale: 'en',\n availableLocales: [],\n};\n\nexport const i18nReducer: Reducer<I18nState, I18nAction> = (state = initialState, action) => {\n switch (action.type) {\n case SET_LOCALE: {\n const locale = action.payload;\n if (!state.availableLocales.includes(locale)) {\n console.warn(`I18nPlugin: Locale '${locale}' not available`);\n return state;\n }\n return {\n ...state,\n currentLocale: locale,\n };\n }\n\n case REGISTER_LOCALE: {\n const locale = action.payload;\n if (state.availableLocales.includes(locale)) {\n return state; // Already registered\n }\n return {\n ...state,\n availableLocales: [...state.availableLocales, locale],\n };\n }\n\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\nimport { manifest, I18N_PLUGIN_ID } from './manifest';\nimport { I18nPluginConfig, I18nState } from './types';\nimport { I18nPlugin } from './i18n-plugin';\nimport { I18nAction } from './actions';\nimport { i18nReducer, initialState } from './reducer';\n\nexport const I18nPluginPackage: PluginPackage<I18nPlugin, I18nPluginConfig, I18nState, I18nAction> =\n {\n manifest,\n create: (registry, config) => new I18nPlugin(I18N_PLUGIN_ID, registry, config),\n reducer: i18nReducer,\n initialState,\n };\n\nexport * from './i18n-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './locales';\n"],"names":["enUS","code","name","translations","commands","zoom","in","out","fitWidth","fitPage","automatic","level","inArea","fullscreen","enter","exit","rotate","clockwise","counterclockwise","menu","sidebar","search","comment","download","print","openFile","save","settings","view","annotate","shapes","redact","fillAndSign","form","pan","pointer","undo","redo","copy","screenshot","nextPage","previousPage","esES","I18N_PLUGIN_ID","manifest","id","version","provides","requires","optional","defaultConfig","enabled","defaultLocale","locales","SET_LOCALE","REGISTER_LOCALE","setLocale","locale","type","payload","registerLocale","_I18nPlugin","BasePlugin","constructor","registry","config","super","this","Map","paramResolvers","paramsCache","localeChange$","createEmitter","paramsChanged$","createScopedEmitter","documentId","data","cache","forEach","set","dispatch","registerLocaleAction","Object","entries","key","resolver","setLocaleAction","getStore","subscribe","_action","newState","detectParamChanges","initialize","logger","info","destroy","clear","onDocumentClosed","delete","clearScope","debug","buildCapability","t","options","translate","forDocument","createI18nScope","registerParamResolver","unregisterParamResolver","getLocale","state","currentLocale","getAvailableLocales","availableLocales","getLocaleInfo","get","hasLocale","has","onLocaleChange","on","onParamsChanged","onGlobal","forScope","fallbackLocale","value","getNestedValue","fallback","warn","params","resolveParams","interpolate","getState","error","obj","path","parts","split","current","part","str","replace","match","String","keys","core","documents","detectDocumentParamChanges","previousCache","changedKeys","newParams","prevParams","arePropsEqual","push","length","emit","docCache","previousLocale","I18nPlugin","initialState","I18nPluginPackage","create","reducer","action","includes","console"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/lib/locales/en.ts","../src/lib/locales/es.ts","../src/lib/manifest.ts","../src/lib/actions.ts","../src/lib/i18n-plugin.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["import { Locale } from '../types';\n\nexport const enUS: Locale = {\n code: 'en',\n name: 'English',\n translations: {\n commands: {\n zoom: {\n in: 'Zoom In',\n out: 'Zoom Out',\n fitWidth: 'Fit to Width',\n fitPage: 'Fit to Page',\n automatic: 'Automatic',\n level: 'Zoom Level ({level}%)',\n inArea: 'Zoom In Area',\n },\n fullscreen: {\n enter: 'Enter Full Screen',\n exit: 'Exit Full Screen',\n },\n rotate: {\n clockwise: 'Rotate Clockwise',\n counterclockwise: 'Rotate Counter-Clockwise',\n },\n menu: 'Menu',\n sidebar: 'Sidebar',\n search: 'Search',\n comment: 'Comment',\n download: 'Download',\n print: 'Print',\n openFile: 'Open PDF',\n save: 'Save',\n settings: 'Settings',\n view: 'View',\n annotate: 'Annotate',\n shapes: 'Shapes',\n redact: 'Redact',\n fillAndSign: 'Fill and Sign',\n form: 'Form',\n pan: 'Pan',\n pointer: 'Pointer',\n undo: 'Undo',\n redo: 'Redo',\n copy: 'Copy',\n screenshot: 'Screenshot',\n nextPage: 'Next Page',\n previousPage: 'Previous Page',\n },\n },\n};\n","import { Locale } from '../types';\n\nexport const esES: Locale = {\n code: 'es',\n name: 'Español',\n translations: {\n commands: {\n zoom: {\n in: 'Acercar',\n out: 'Alejar',\n fitWidth: 'Ajustar al ancho',\n fitPage: 'Ajustar a la página',\n automatic: 'Automático',\n level: 'Nivel de zoom ({level}%)',\n inArea: 'Acercar área',\n },\n fullscreen: {\n enter: 'Pantalla completa',\n exit: 'Salir de pantalla completa',\n },\n rotate: {\n clockwise: 'Girar a la derecha',\n counterclockwise: 'Girar a la izquierda',\n },\n menu: 'Menú',\n sidebar: 'Barra lateral',\n search: 'Buscar',\n comment: 'Comentario',\n download: 'Descargar',\n print: 'Imprimir',\n openFile: 'Abrir PDF',\n save: 'Guardar',\n settings: 'Configuración',\n view: 'Ver',\n annotate: 'Anotar',\n shapes: 'Formas',\n redact: 'Redactar',\n fillAndSign: 'Rellenar y firmar',\n form: 'Formulario',\n pan: 'Desplazar',\n pointer: 'Puntero',\n undo: 'Deshacer',\n redo: 'Rehacer',\n copy: 'Copiar',\n screenshot: 'Captura de pantalla',\n nextPage: 'Página siguiente',\n previousPage: 'Página anterior',\n },\n },\n};\n","import { PluginManifest } from '@embedpdf/core';\nimport { I18nPluginConfig } from './types';\nimport { enUS, esES } from './locales';\n\nexport const I18N_PLUGIN_ID = 'i18n';\n\nexport const manifest: PluginManifest<I18nPluginConfig> = {\n id: I18N_PLUGIN_ID,\n name: 'I18n Plugin',\n version: '1.0.0',\n provides: ['i18n'],\n requires: [],\n optional: [],\n defaultConfig: {\n defaultLocale: 'en',\n locales: [enUS, esES],\n },\n};\n","import { Action } from '@embedpdf/core';\nimport { Locale, LocaleCode } from './types';\n\nexport const SET_LOCALE = 'I18N/SET_LOCALE';\nexport const REGISTER_LOCALE = 'I18N/REGISTER_LOCALE';\n\nexport interface SetLocaleAction extends Action {\n type: typeof SET_LOCALE;\n payload: LocaleCode;\n}\n\nexport interface RegisterLocaleAction extends Action {\n type: typeof REGISTER_LOCALE;\n payload: LocaleCode;\n}\n\nexport type I18nAction = SetLocaleAction | RegisterLocaleAction;\n\nexport const setLocale = (locale: LocaleCode): SetLocaleAction => ({\n type: SET_LOCALE,\n payload: locale,\n});\n\nexport const registerLocale = (locale: LocaleCode): RegisterLocaleAction => ({\n type: REGISTER_LOCALE,\n payload: locale,\n});\n","import {\n BasePlugin,\n PluginRegistry,\n StoreState,\n arePropsEqual,\n createEmitter,\n createScopedEmitter,\n} from '@embedpdf/core';\nimport {\n I18nCapability,\n I18nPluginConfig,\n I18nState,\n I18nScope,\n Locale,\n LocaleCode,\n LocaleChangeEvent,\n TranslationKey,\n TranslateOptions,\n ParamResolver,\n TranslationParamsChangedData,\n TranslationParamsChangedEvent,\n} from './types';\nimport {\n I18nAction,\n setLocale as setLocaleAction,\n registerLocale as registerLocaleAction,\n} from './actions';\n\nexport class I18nPlugin extends BasePlugin<\n I18nPluginConfig,\n I18nCapability,\n I18nState,\n I18nAction\n> {\n static readonly id = 'i18n' as const;\n\n private config: I18nPluginConfig;\n private locales = new Map<LocaleCode, Locale>();\n private paramResolvers = new Map<TranslationKey, ParamResolver>();\n\n // Cache resolved params per document per key\n // Map<documentId, Map<translationKey, resolvedParams>>\n private paramsCache = new Map<string, Map<TranslationKey, Record<string, string | number>>>();\n\n // Events\n private readonly localeChange$ = createEmitter<LocaleChangeEvent>();\n private readonly paramsChanged$ = createScopedEmitter<\n TranslationParamsChangedData,\n TranslationParamsChangedEvent,\n string\n >((documentId, data) => ({ documentId, ...data }), { cache: false });\n\n constructor(id: string, registry: PluginRegistry, config: I18nPluginConfig) {\n super(id, registry);\n\n this.config = config;\n\n // Register all provided locales\n config.locales.forEach((locale) => {\n this.locales.set(locale.code, locale);\n this.dispatch(registerLocaleAction(locale.code));\n });\n\n // Register param resolvers\n if (config.paramResolvers) {\n Object.entries(config.paramResolvers).forEach(([key, resolver]) => {\n this.paramResolvers.set(key, resolver);\n });\n }\n\n // Set initial locale\n this.dispatch(setLocaleAction(config.defaultLocale));\n\n // Subscribe to global store changes for param change detection\n this.registry.getStore().subscribe((_action, newState) => {\n this.detectParamChanges(newState);\n });\n }\n\n async initialize(): Promise<void> {\n this.logger.info('I18nPlugin', 'Initialize', 'I18n plugin initialized');\n }\n\n async destroy(): Promise<void> {\n this.localeChange$.clear();\n this.paramsChanged$.clear();\n this.paramResolvers.clear();\n this.paramsCache.clear();\n super.destroy();\n }\n\n protected override onDocumentClosed(documentId: string): void {\n // Clean up cache for closed document\n this.paramsCache.delete(documentId);\n this.paramsChanged$.clearScope(documentId);\n\n this.logger.debug(\n 'I18nPlugin',\n 'DocumentClosed',\n `Cleaned up params cache for document: ${documentId}`,\n );\n }\n\n protected buildCapability(): I18nCapability {\n return {\n t: (key, options) => this.translate(key, options),\n forDocument: (documentId) => this.createI18nScope(documentId),\n registerParamResolver: (key, resolver) => this.registerParamResolver(key, resolver),\n unregisterParamResolver: (key) => this.unregisterParamResolver(key),\n setLocale: (locale) => this.setLocale(locale),\n getLocale: () => this.state.currentLocale,\n getAvailableLocales: () => [...this.state.availableLocales],\n getLocaleInfo: (code) => this.locales.get(code) ?? null,\n registerLocale: (locale) => this.registerLocale(locale),\n hasLocale: (code) => this.locales.has(code),\n onLocaleChange: this.localeChange$.on,\n onParamsChanged: this.paramsChanged$.onGlobal,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Scoping\n // ─────────────────────────────────────────────────────────\n\n private createI18nScope(documentId: string): I18nScope {\n return {\n t: (key, options) => this.translate(key, { documentId, ...options }),\n onParamsChanged: this.paramsChanged$.forScope(documentId),\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Translation Logic\n // ─────────────────────────────────────────────────────────\n\n private translate(key: TranslationKey, options?: TranslateOptions): string {\n const locale = this.locales.get(this.state.currentLocale);\n const fallbackLocale = this.config.fallbackLocale\n ? this.locales.get(this.config.fallbackLocale)\n : null;\n\n // Try current locale\n let value = this.getNestedValue(locale?.translations, key);\n\n // Try fallback locale\n if (!value && fallbackLocale) {\n value = this.getNestedValue(fallbackLocale.translations, key);\n }\n\n // If still not found, use fallback or return key\n if (!value) {\n if (options?.fallback) {\n // Use provided fallback string\n value = options.fallback;\n } else {\n this.logger.warn(\n 'I18nPlugin',\n 'MissingTranslation',\n `Translation not found for key: ${key}`,\n );\n return key;\n }\n }\n\n // Resolve params: explicit params take precedence over registered resolvers\n let params = options?.params;\n\n // If no explicit params and we have a resolver, try to resolve\n if (!params && this.paramResolvers.has(key)) {\n params = this.resolveParams(key, options?.documentId);\n }\n\n // Interpolate parameters (works for both found translations and fallback)\n return this.interpolate(value, params);\n }\n\n private resolveParams(\n key: TranslationKey,\n documentId?: string,\n ): Record<string, string | number> | undefined {\n const resolver = this.paramResolvers.get(key);\n if (!resolver) return undefined;\n\n const state = this.registry.getStore().getState();\n\n try {\n // Pass documentId (which may be undefined) to resolver\n return resolver({ state, documentId });\n } catch (error) {\n this.logger.error(\n 'I18nPlugin',\n 'ParamResolverError',\n `Error resolving params for key \"${key}\":`,\n error,\n );\n return undefined;\n }\n }\n\n private getNestedValue(obj: any, path: string): string | undefined {\n if (!obj) return undefined;\n\n const parts = path.split('.');\n let current = obj;\n\n for (const part of parts) {\n if (current === undefined || current === null) return undefined;\n current = current[part];\n }\n\n return typeof current === 'string' ? current : undefined;\n }\n\n private interpolate(str: string, params?: Record<string, string | number>): string {\n if (!params) return str;\n\n // Replace {key} with params[key]\n return str.replace(/\\{(\\w+)\\}/g, (match, key) => {\n const value = params[key];\n return value !== undefined ? String(value) : match;\n });\n }\n\n // ─────────────────────────────────────────────────────────\n // Smart Param Change Detection\n // ─────────────────────────────────────────────────────────\n\n private detectParamChanges(newState: StoreState<any>): void {\n // Get all documents from core state\n const documentIds = Object.keys(newState.core.documents);\n\n documentIds.forEach((documentId) => {\n this.detectDocumentParamChanges(documentId, newState);\n });\n }\n\n private detectDocumentParamChanges(documentId: string, newState: StoreState<any>): void {\n const previousCache = this.paramsCache.get(documentId);\n const changedKeys: TranslationKey[] = [];\n\n // Re-resolve all params that have resolvers\n this.paramResolvers.forEach((resolver, key) => {\n try {\n const newParams = resolver({ state: newState, documentId });\n const prevParams = previousCache?.get(key);\n\n // Compare params (deep equality for simplicity)\n if (!arePropsEqual(prevParams, newParams)) {\n changedKeys.push(key);\n\n // Update cache\n if (!this.paramsCache.has(documentId)) {\n this.paramsCache.set(documentId, new Map());\n }\n this.paramsCache.get(documentId)!.set(key, newParams);\n }\n } catch (error) {\n this.logger.error(\n 'I18nPlugin',\n 'ParamDetectionError',\n `Error detecting param changes for key \"${key}\":`,\n error,\n );\n }\n });\n\n // Emit event if any params changed\n if (changedKeys.length > 0) {\n this.paramsChanged$.emit(documentId, { changedKeys });\n\n this.logger.debug(\n 'I18nPlugin',\n 'ParamsChanged',\n `Translation params changed for document ${documentId}:`,\n changedKeys,\n );\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Param Resolver Management\n // ─────────────────────────────────────────────────────────\n\n private registerParamResolver(key: TranslationKey, resolver: ParamResolver): void {\n if (this.paramResolvers.has(key)) {\n this.logger.warn(\n 'I18nPlugin',\n 'ResolverOverwrite',\n `Param resolver for \"${key}\" already exists and will be overwritten`,\n );\n }\n\n this.paramResolvers.set(key, resolver);\n\n // Clear cache for this key in all documents\n this.paramsCache.forEach((docCache) => {\n docCache.delete(key);\n });\n\n this.logger.debug('I18nPlugin', 'ResolverRegistered', `Param resolver registered for: ${key}`);\n }\n\n private unregisterParamResolver(key: TranslationKey): void {\n if (this.paramResolvers.delete(key)) {\n // Clear cache for this key in all documents\n this.paramsCache.forEach((docCache) => {\n docCache.delete(key);\n });\n\n this.logger.debug(\n 'I18nPlugin',\n 'ResolverUnregistered',\n `Param resolver unregistered for: ${key}`,\n );\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Locale Management\n // ─────────────────────────────────────────────────────────\n\n private setLocale(locale: LocaleCode): void {\n if (!this.locales.has(locale)) {\n this.logger.warn('I18nPlugin', 'LocaleNotFound', `Locale '${locale}' is not registered`);\n return;\n }\n\n const previousLocale = this.state.currentLocale;\n if (previousLocale === locale) return;\n\n this.dispatch(setLocaleAction(locale));\n\n this.localeChange$.emit({\n previousLocale,\n currentLocale: locale,\n });\n\n this.logger.info('I18nPlugin', 'LocaleChanged', `Locale changed to: ${locale}`);\n }\n\n private registerLocale(locale: Locale): void {\n if (this.locales.has(locale.code)) {\n this.logger.warn(\n 'I18nPlugin',\n 'LocaleAlreadyRegistered',\n `Locale '${locale.code}' is already registered`,\n );\n return;\n }\n\n this.locales.set(locale.code, locale);\n this.dispatch(registerLocaleAction(locale.code));\n\n this.logger.info('I18nPlugin', 'LocaleRegistered', `Locale registered: ${locale.code}`);\n }\n}\n","import { Reducer } from '@embedpdf/core';\nimport { I18nState } from './types';\nimport { I18nAction, SET_LOCALE, REGISTER_LOCALE } from './actions';\n\nexport const initialState: I18nState = {\n currentLocale: 'en',\n availableLocales: [],\n};\n\nexport const i18nReducer: Reducer<I18nState, I18nAction> = (state = initialState, action) => {\n switch (action.type) {\n case SET_LOCALE: {\n const locale = action.payload;\n if (!state.availableLocales.includes(locale)) {\n console.warn(`I18nPlugin: Locale '${locale}' not available`);\n return state;\n }\n return {\n ...state,\n currentLocale: locale,\n };\n }\n\n case REGISTER_LOCALE: {\n const locale = action.payload;\n if (state.availableLocales.includes(locale)) {\n return state; // Already registered\n }\n return {\n ...state,\n availableLocales: [...state.availableLocales, locale],\n };\n }\n\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\nimport { manifest, I18N_PLUGIN_ID } from './manifest';\nimport { I18nPluginConfig, I18nState } from './types';\nimport { I18nPlugin } from './i18n-plugin';\nimport { I18nAction } from './actions';\nimport { i18nReducer, initialState } from './reducer';\n\nexport const I18nPluginPackage: PluginPackage<I18nPlugin, I18nPluginConfig, I18nState, I18nAction> =\n {\n manifest,\n create: (registry, config) => new I18nPlugin(I18N_PLUGIN_ID, registry, config),\n reducer: i18nReducer,\n initialState,\n };\n\nexport * from './i18n-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './locales';\n"],"names":["enUS","code","name","translations","commands","zoom","in","out","fitWidth","fitPage","automatic","level","inArea","fullscreen","enter","exit","rotate","clockwise","counterclockwise","menu","sidebar","search","comment","download","print","openFile","save","settings","view","annotate","shapes","redact","fillAndSign","form","pan","pointer","undo","redo","copy","screenshot","nextPage","previousPage","esES","I18N_PLUGIN_ID","manifest","id","version","provides","requires","optional","defaultConfig","defaultLocale","locales","SET_LOCALE","REGISTER_LOCALE","setLocale","locale","type","payload","registerLocale","_I18nPlugin","BasePlugin","constructor","registry","config","super","this","Map","paramResolvers","paramsCache","localeChange$","createEmitter","paramsChanged$","createScopedEmitter","documentId","data","cache","forEach","set","dispatch","registerLocaleAction","Object","entries","key","resolver","setLocaleAction","getStore","subscribe","_action","newState","detectParamChanges","initialize","logger","info","destroy","clear","onDocumentClosed","delete","clearScope","debug","buildCapability","t","options","translate","forDocument","createI18nScope","registerParamResolver","unregisterParamResolver","getLocale","state","currentLocale","getAvailableLocales","availableLocales","getLocaleInfo","get","hasLocale","has","onLocaleChange","on","onParamsChanged","onGlobal","forScope","fallbackLocale","value","getNestedValue","fallback","warn","params","resolveParams","interpolate","getState","error","obj","path","parts","split","current","part","str","replace","match","String","keys","core","documents","detectDocumentParamChanges","previousCache","changedKeys","newParams","prevParams","arePropsEqual","push","length","emit","docCache","previousLocale","I18nPlugin","initialState","I18nPluginPackage","create","reducer","action","includes","console"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -104,7 +104,6 @@ const manifest = {
104
104
  requires: [],
105
105
  optional: [],
106
106
  defaultConfig: {
107
- enabled: true,
108
107
  defaultLocale: "en",
109
108
  locales: [enUS, esES]
110
109
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/lib/locales/en.ts","../src/lib/locales/es.ts","../src/lib/manifest.ts","../src/lib/actions.ts","../src/lib/i18n-plugin.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["import { Locale } from '../types';\n\nexport const enUS: Locale = {\n code: 'en',\n name: 'English',\n translations: {\n commands: {\n zoom: {\n in: 'Zoom In',\n out: 'Zoom Out',\n fitWidth: 'Fit to Width',\n fitPage: 'Fit to Page',\n automatic: 'Automatic',\n level: 'Zoom Level ({level}%)',\n inArea: 'Zoom In Area',\n },\n fullscreen: {\n enter: 'Enter Full Screen',\n exit: 'Exit Full Screen',\n },\n rotate: {\n clockwise: 'Rotate Clockwise',\n counterclockwise: 'Rotate Counter-Clockwise',\n },\n menu: 'Menu',\n sidebar: 'Sidebar',\n search: 'Search',\n comment: 'Comment',\n download: 'Download',\n print: 'Print',\n openFile: 'Open PDF',\n save: 'Save',\n settings: 'Settings',\n view: 'View',\n annotate: 'Annotate',\n shapes: 'Shapes',\n redact: 'Redact',\n fillAndSign: 'Fill and Sign',\n form: 'Form',\n pan: 'Pan',\n pointer: 'Pointer',\n undo: 'Undo',\n redo: 'Redo',\n copy: 'Copy',\n screenshot: 'Screenshot',\n nextPage: 'Next Page',\n previousPage: 'Previous Page',\n },\n },\n};\n","import { Locale } from '../types';\n\nexport const esES: Locale = {\n code: 'es',\n name: 'Español',\n translations: {\n commands: {\n zoom: {\n in: 'Acercar',\n out: 'Alejar',\n fitWidth: 'Ajustar al ancho',\n fitPage: 'Ajustar a la página',\n automatic: 'Automático',\n level: 'Nivel de zoom ({level}%)',\n inArea: 'Acercar área',\n },\n fullscreen: {\n enter: 'Pantalla completa',\n exit: 'Salir de pantalla completa',\n },\n rotate: {\n clockwise: 'Girar a la derecha',\n counterclockwise: 'Girar a la izquierda',\n },\n menu: 'Menú',\n sidebar: 'Barra lateral',\n search: 'Buscar',\n comment: 'Comentario',\n download: 'Descargar',\n print: 'Imprimir',\n openFile: 'Abrir PDF',\n save: 'Guardar',\n settings: 'Configuración',\n view: 'Ver',\n annotate: 'Anotar',\n shapes: 'Formas',\n redact: 'Redactar',\n fillAndSign: 'Rellenar y firmar',\n form: 'Formulario',\n pan: 'Desplazar',\n pointer: 'Puntero',\n undo: 'Deshacer',\n redo: 'Rehacer',\n copy: 'Copiar',\n screenshot: 'Captura de pantalla',\n nextPage: 'Página siguiente',\n previousPage: 'Página anterior',\n },\n },\n};\n","import { PluginManifest } from '@embedpdf/core';\nimport { I18nPluginConfig } from './types';\nimport { enUS, esES } from './locales';\n\nexport const I18N_PLUGIN_ID = 'i18n';\n\nexport const manifest: PluginManifest<I18nPluginConfig> = {\n id: I18N_PLUGIN_ID,\n name: 'I18n Plugin',\n version: '1.0.0',\n provides: ['i18n'],\n requires: [],\n optional: [],\n defaultConfig: {\n enabled: true,\n defaultLocale: 'en',\n locales: [enUS, esES],\n },\n};\n","import { Action } from '@embedpdf/core';\nimport { Locale, LocaleCode } from './types';\n\nexport const SET_LOCALE = 'I18N/SET_LOCALE';\nexport const REGISTER_LOCALE = 'I18N/REGISTER_LOCALE';\n\nexport interface SetLocaleAction extends Action {\n type: typeof SET_LOCALE;\n payload: LocaleCode;\n}\n\nexport interface RegisterLocaleAction extends Action {\n type: typeof REGISTER_LOCALE;\n payload: LocaleCode;\n}\n\nexport type I18nAction = SetLocaleAction | RegisterLocaleAction;\n\nexport const setLocale = (locale: LocaleCode): SetLocaleAction => ({\n type: SET_LOCALE,\n payload: locale,\n});\n\nexport const registerLocale = (locale: LocaleCode): RegisterLocaleAction => ({\n type: REGISTER_LOCALE,\n payload: locale,\n});\n","import {\n BasePlugin,\n PluginRegistry,\n StoreState,\n arePropsEqual,\n createEmitter,\n createScopedEmitter,\n} from '@embedpdf/core';\nimport {\n I18nCapability,\n I18nPluginConfig,\n I18nState,\n I18nScope,\n Locale,\n LocaleCode,\n LocaleChangeEvent,\n TranslationKey,\n TranslateOptions,\n ParamResolver,\n TranslationParamsChangedData,\n TranslationParamsChangedEvent,\n} from './types';\nimport {\n I18nAction,\n setLocale as setLocaleAction,\n registerLocale as registerLocaleAction,\n} from './actions';\n\nexport class I18nPlugin extends BasePlugin<\n I18nPluginConfig,\n I18nCapability,\n I18nState,\n I18nAction\n> {\n static readonly id = 'i18n' as const;\n\n private config: I18nPluginConfig;\n private locales = new Map<LocaleCode, Locale>();\n private paramResolvers = new Map<TranslationKey, ParamResolver>();\n\n // Cache resolved params per document per key\n // Map<documentId, Map<translationKey, resolvedParams>>\n private paramsCache = new Map<string, Map<TranslationKey, Record<string, string | number>>>();\n\n // Events\n private readonly localeChange$ = createEmitter<LocaleChangeEvent>();\n private readonly paramsChanged$ = createScopedEmitter<\n TranslationParamsChangedData,\n TranslationParamsChangedEvent,\n string\n >((documentId, data) => ({ documentId, ...data }), { cache: false });\n\n constructor(id: string, registry: PluginRegistry, config: I18nPluginConfig) {\n super(id, registry);\n\n this.config = config;\n\n // Register all provided locales\n config.locales.forEach((locale) => {\n this.locales.set(locale.code, locale);\n this.dispatch(registerLocaleAction(locale.code));\n });\n\n // Register param resolvers\n if (config.paramResolvers) {\n Object.entries(config.paramResolvers).forEach(([key, resolver]) => {\n this.paramResolvers.set(key, resolver);\n });\n }\n\n // Set initial locale\n this.dispatch(setLocaleAction(config.defaultLocale));\n\n // Subscribe to global store changes for param change detection\n this.registry.getStore().subscribe((_action, newState) => {\n this.detectParamChanges(newState);\n });\n }\n\n async initialize(): Promise<void> {\n this.logger.info('I18nPlugin', 'Initialize', 'I18n plugin initialized');\n }\n\n async destroy(): Promise<void> {\n this.localeChange$.clear();\n this.paramsChanged$.clear();\n this.paramResolvers.clear();\n this.paramsCache.clear();\n super.destroy();\n }\n\n protected override onDocumentClosed(documentId: string): void {\n // Clean up cache for closed document\n this.paramsCache.delete(documentId);\n this.paramsChanged$.clearScope(documentId);\n\n this.logger.debug(\n 'I18nPlugin',\n 'DocumentClosed',\n `Cleaned up params cache for document: ${documentId}`,\n );\n }\n\n protected buildCapability(): I18nCapability {\n return {\n t: (key, options) => this.translate(key, options),\n forDocument: (documentId) => this.createI18nScope(documentId),\n registerParamResolver: (key, resolver) => this.registerParamResolver(key, resolver),\n unregisterParamResolver: (key) => this.unregisterParamResolver(key),\n setLocale: (locale) => this.setLocale(locale),\n getLocale: () => this.state.currentLocale,\n getAvailableLocales: () => [...this.state.availableLocales],\n getLocaleInfo: (code) => this.locales.get(code) ?? null,\n registerLocale: (locale) => this.registerLocale(locale),\n hasLocale: (code) => this.locales.has(code),\n onLocaleChange: this.localeChange$.on,\n onParamsChanged: this.paramsChanged$.onGlobal,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Scoping\n // ─────────────────────────────────────────────────────────\n\n private createI18nScope(documentId: string): I18nScope {\n return {\n t: (key, options) => this.translate(key, { documentId, ...options }),\n onParamsChanged: this.paramsChanged$.forScope(documentId),\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Translation Logic\n // ─────────────────────────────────────────────────────────\n\n private translate(key: TranslationKey, options?: TranslateOptions): string {\n const locale = this.locales.get(this.state.currentLocale);\n const fallbackLocale = this.config.fallbackLocale\n ? this.locales.get(this.config.fallbackLocale)\n : null;\n\n // Try current locale\n let value = this.getNestedValue(locale?.translations, key);\n\n // Try fallback locale\n if (!value && fallbackLocale) {\n value = this.getNestedValue(fallbackLocale.translations, key);\n }\n\n // If still not found, use fallback or return key\n if (!value) {\n if (options?.fallback) {\n // Use provided fallback string\n value = options.fallback;\n } else {\n this.logger.warn(\n 'I18nPlugin',\n 'MissingTranslation',\n `Translation not found for key: ${key}`,\n );\n return key;\n }\n }\n\n // Resolve params: explicit params take precedence over registered resolvers\n let params = options?.params;\n\n // If no explicit params and we have a resolver, try to resolve\n if (!params && this.paramResolvers.has(key)) {\n params = this.resolveParams(key, options?.documentId);\n }\n\n // Interpolate parameters (works for both found translations and fallback)\n return this.interpolate(value, params);\n }\n\n private resolveParams(\n key: TranslationKey,\n documentId?: string,\n ): Record<string, string | number> | undefined {\n const resolver = this.paramResolvers.get(key);\n if (!resolver) return undefined;\n\n const state = this.registry.getStore().getState();\n\n try {\n // Pass documentId (which may be undefined) to resolver\n return resolver({ state, documentId });\n } catch (error) {\n this.logger.error(\n 'I18nPlugin',\n 'ParamResolverError',\n `Error resolving params for key \"${key}\":`,\n error,\n );\n return undefined;\n }\n }\n\n private getNestedValue(obj: any, path: string): string | undefined {\n if (!obj) return undefined;\n\n const parts = path.split('.');\n let current = obj;\n\n for (const part of parts) {\n if (current === undefined || current === null) return undefined;\n current = current[part];\n }\n\n return typeof current === 'string' ? current : undefined;\n }\n\n private interpolate(str: string, params?: Record<string, string | number>): string {\n if (!params) return str;\n\n // Replace {key} with params[key]\n return str.replace(/\\{(\\w+)\\}/g, (match, key) => {\n const value = params[key];\n return value !== undefined ? String(value) : match;\n });\n }\n\n // ─────────────────────────────────────────────────────────\n // Smart Param Change Detection\n // ─────────────────────────────────────────────────────────\n\n private detectParamChanges(newState: StoreState<any>): void {\n // Get all documents from core state\n const documentIds = Object.keys(newState.core.documents);\n\n documentIds.forEach((documentId) => {\n this.detectDocumentParamChanges(documentId, newState);\n });\n }\n\n private detectDocumentParamChanges(documentId: string, newState: StoreState<any>): void {\n const previousCache = this.paramsCache.get(documentId);\n const changedKeys: TranslationKey[] = [];\n\n // Re-resolve all params that have resolvers\n this.paramResolvers.forEach((resolver, key) => {\n try {\n const newParams = resolver({ state: newState, documentId });\n const prevParams = previousCache?.get(key);\n\n // Compare params (deep equality for simplicity)\n if (!arePropsEqual(prevParams, newParams)) {\n changedKeys.push(key);\n\n // Update cache\n if (!this.paramsCache.has(documentId)) {\n this.paramsCache.set(documentId, new Map());\n }\n this.paramsCache.get(documentId)!.set(key, newParams);\n }\n } catch (error) {\n this.logger.error(\n 'I18nPlugin',\n 'ParamDetectionError',\n `Error detecting param changes for key \"${key}\":`,\n error,\n );\n }\n });\n\n // Emit event if any params changed\n if (changedKeys.length > 0) {\n this.paramsChanged$.emit(documentId, { changedKeys });\n\n this.logger.debug(\n 'I18nPlugin',\n 'ParamsChanged',\n `Translation params changed for document ${documentId}:`,\n changedKeys,\n );\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Param Resolver Management\n // ─────────────────────────────────────────────────────────\n\n private registerParamResolver(key: TranslationKey, resolver: ParamResolver): void {\n if (this.paramResolvers.has(key)) {\n this.logger.warn(\n 'I18nPlugin',\n 'ResolverOverwrite',\n `Param resolver for \"${key}\" already exists and will be overwritten`,\n );\n }\n\n this.paramResolvers.set(key, resolver);\n\n // Clear cache for this key in all documents\n this.paramsCache.forEach((docCache) => {\n docCache.delete(key);\n });\n\n this.logger.debug('I18nPlugin', 'ResolverRegistered', `Param resolver registered for: ${key}`);\n }\n\n private unregisterParamResolver(key: TranslationKey): void {\n if (this.paramResolvers.delete(key)) {\n // Clear cache for this key in all documents\n this.paramsCache.forEach((docCache) => {\n docCache.delete(key);\n });\n\n this.logger.debug(\n 'I18nPlugin',\n 'ResolverUnregistered',\n `Param resolver unregistered for: ${key}`,\n );\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Locale Management\n // ─────────────────────────────────────────────────────────\n\n private setLocale(locale: LocaleCode): void {\n if (!this.locales.has(locale)) {\n this.logger.warn('I18nPlugin', 'LocaleNotFound', `Locale '${locale}' is not registered`);\n return;\n }\n\n const previousLocale = this.state.currentLocale;\n if (previousLocale === locale) return;\n\n this.dispatch(setLocaleAction(locale));\n\n this.localeChange$.emit({\n previousLocale,\n currentLocale: locale,\n });\n\n this.logger.info('I18nPlugin', 'LocaleChanged', `Locale changed to: ${locale}`);\n }\n\n private registerLocale(locale: Locale): void {\n if (this.locales.has(locale.code)) {\n this.logger.warn(\n 'I18nPlugin',\n 'LocaleAlreadyRegistered',\n `Locale '${locale.code}' is already registered`,\n );\n return;\n }\n\n this.locales.set(locale.code, locale);\n this.dispatch(registerLocaleAction(locale.code));\n\n this.logger.info('I18nPlugin', 'LocaleRegistered', `Locale registered: ${locale.code}`);\n }\n}\n","import { Reducer } from '@embedpdf/core';\nimport { I18nState } from './types';\nimport { I18nAction, SET_LOCALE, REGISTER_LOCALE } from './actions';\n\nexport const initialState: I18nState = {\n currentLocale: 'en',\n availableLocales: [],\n};\n\nexport const i18nReducer: Reducer<I18nState, I18nAction> = (state = initialState, action) => {\n switch (action.type) {\n case SET_LOCALE: {\n const locale = action.payload;\n if (!state.availableLocales.includes(locale)) {\n console.warn(`I18nPlugin: Locale '${locale}' not available`);\n return state;\n }\n return {\n ...state,\n currentLocale: locale,\n };\n }\n\n case REGISTER_LOCALE: {\n const locale = action.payload;\n if (state.availableLocales.includes(locale)) {\n return state; // Already registered\n }\n return {\n ...state,\n availableLocales: [...state.availableLocales, locale],\n };\n }\n\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\nimport { manifest, I18N_PLUGIN_ID } from './manifest';\nimport { I18nPluginConfig, I18nState } from './types';\nimport { I18nPlugin } from './i18n-plugin';\nimport { I18nAction } from './actions';\nimport { i18nReducer, initialState } from './reducer';\n\nexport const I18nPluginPackage: PluginPackage<I18nPlugin, I18nPluginConfig, I18nState, I18nAction> =\n {\n manifest,\n create: (registry, config) => new I18nPlugin(I18N_PLUGIN_ID, registry, config),\n reducer: i18nReducer,\n initialState,\n };\n\nexport * from './i18n-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './locales';\n"],"names":["registerLocaleAction","setLocaleAction"],"mappings":";AAEO,MAAM,OAAe;AAAA,EAC1B,MAAM;AAAA,EACN,MAAM;AAAA,EACN,cAAc;AAAA,IACZ,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,KAAK;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA,MAAA;AAAA,MAEV,YAAY;AAAA,QACV,OAAO;AAAA,QACP,MAAM;AAAA,MAAA;AAAA,MAER,QAAQ;AAAA,QACN,WAAW;AAAA,QACX,kBAAkB;AAAA,MAAA;AAAA,MAEpB,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,MAAM;AAAA,MACN,KAAK;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAc;AAAA,IAAA;AAAA,EAChB;AAEJ;AC/CO,MAAM,OAAe;AAAA,EAC1B,MAAM;AAAA,EACN,MAAM;AAAA,EACN,cAAc;AAAA,IACZ,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,KAAK;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA,MAAA;AAAA,MAEV,YAAY;AAAA,QACV,OAAO;AAAA,QACP,MAAM;AAAA,MAAA;AAAA,MAER,QAAQ;AAAA,QACN,WAAW;AAAA,QACX,kBAAkB;AAAA,MAAA;AAAA,MAEpB,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,MAAM;AAAA,MACN,KAAK;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAc;AAAA,IAAA;AAAA,EAChB;AAEJ;AC7CO,MAAM,iBAAiB;AAEvB,MAAM,WAA6C;AAAA,EACxD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU,CAAC,MAAM;AAAA,EACjB,UAAU,CAAA;AAAA,EACV,UAAU,CAAA;AAAA,EACV,eAAe;AAAA,IACb,SAAS;AAAA,IACT,eAAe;AAAA,IACf,SAAS,CAAC,MAAM,IAAI;AAAA,EAAA;AAExB;ACfO,MAAM,aAAa;AACnB,MAAM,kBAAkB;AAcxB,MAAM,YAAY,CAAC,YAAyC;AAAA,EACjE,MAAM;AAAA,EACN,SAAS;AACX;AAEO,MAAM,iBAAiB,CAAC,YAA8C;AAAA,EAC3E,MAAM;AAAA,EACN,SAAS;AACX;ACEO,MAAM,cAAN,MAAM,oBAAmB,WAK9B;AAAA,EAmBA,YAAY,IAAY,UAA0B,QAA0B;AAC1E,UAAM,IAAI,QAAQ;AAhBpB,SAAQ,8BAAc,IAAA;AACtB,SAAQ,qCAAqB,IAAA;AAI7B,SAAQ,kCAAkB,IAAA;AAG1B,SAAiB,gBAAgB,cAAA;AACjC,SAAiB,iBAAiB,oBAIhC,CAAC,YAAY,UAAU,EAAE,YAAY,GAAG,KAAA,IAAS,EAAE,OAAO,OAAO;AAKjE,SAAK,SAAS;AAGd,WAAO,QAAQ,QAAQ,CAAC,WAAW;AACjC,WAAK,QAAQ,IAAI,OAAO,MAAM,MAAM;AACpC,WAAK,SAASA,eAAqB,OAAO,IAAI,CAAC;AAAA,IACjD,CAAC;AAGD,QAAI,OAAO,gBAAgB;AACzB,aAAO,QAAQ,OAAO,cAAc,EAAE,QAAQ,CAAC,CAAC,KAAK,QAAQ,MAAM;AACjE,aAAK,eAAe,IAAI,KAAK,QAAQ;AAAA,MACvC,CAAC;AAAA,IACH;AAGA,SAAK,SAASC,UAAgB,OAAO,aAAa,CAAC;AAGnD,SAAK,SAAS,SAAA,EAAW,UAAU,CAAC,SAAS,aAAa;AACxD,WAAK,mBAAmB,QAAQ;AAAA,IAClC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAA4B;AAChC,SAAK,OAAO,KAAK,cAAc,cAAc,yBAAyB;AAAA,EACxE;AAAA,EAEA,MAAM,UAAyB;AAC7B,SAAK,cAAc,MAAA;AACnB,SAAK,eAAe,MAAA;AACpB,SAAK,eAAe,MAAA;AACpB,SAAK,YAAY,MAAA;AACjB,UAAM,QAAA;AAAA,EACR;AAAA,EAEmB,iBAAiB,YAA0B;AAE5D,SAAK,YAAY,OAAO,UAAU;AAClC,SAAK,eAAe,WAAW,UAAU;AAEzC,SAAK,OAAO;AAAA,MACV;AAAA,MACA;AAAA,MACA,yCAAyC,UAAU;AAAA,IAAA;AAAA,EAEvD;AAAA,EAEU,kBAAkC;AAC1C,WAAO;AAAA,MACL,GAAG,CAAC,KAAK,YAAY,KAAK,UAAU,KAAK,OAAO;AAAA,MAChD,aAAa,CAAC,eAAe,KAAK,gBAAgB,UAAU;AAAA,MAC5D,uBAAuB,CAAC,KAAK,aAAa,KAAK,sBAAsB,KAAK,QAAQ;AAAA,MAClF,yBAAyB,CAAC,QAAQ,KAAK,wBAAwB,GAAG;AAAA,MAClE,WAAW,CAAC,WAAW,KAAK,UAAU,MAAM;AAAA,MAC5C,WAAW,MAAM,KAAK,MAAM;AAAA,MAC5B,qBAAqB,MAAM,CAAC,GAAG,KAAK,MAAM,gBAAgB;AAAA,MAC1D,eAAe,CAAC,SAAS,KAAK,QAAQ,IAAI,IAAI,KAAK;AAAA,MACnD,gBAAgB,CAAC,WAAW,KAAK,eAAe,MAAM;AAAA,MACtD,WAAW,CAAC,SAAS,KAAK,QAAQ,IAAI,IAAI;AAAA,MAC1C,gBAAgB,KAAK,cAAc;AAAA,MACnC,iBAAiB,KAAK,eAAe;AAAA,IAAA;AAAA,EAEzC;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAgB,YAA+B;AACrD,WAAO;AAAA,MACL,GAAG,CAAC,KAAK,YAAY,KAAK,UAAU,KAAK,EAAE,YAAY,GAAG,SAAS;AAAA,MACnE,iBAAiB,KAAK,eAAe,SAAS,UAAU;AAAA,IAAA;AAAA,EAE5D;AAAA;AAAA;AAAA;AAAA,EAMQ,UAAU,KAAqB,SAAoC;AACzE,UAAM,SAAS,KAAK,QAAQ,IAAI,KAAK,MAAM,aAAa;AACxD,UAAM,iBAAiB,KAAK,OAAO,iBAC/B,KAAK,QAAQ,IAAI,KAAK,OAAO,cAAc,IAC3C;AAGJ,QAAI,QAAQ,KAAK,eAAe,iCAAQ,cAAc,GAAG;AAGzD,QAAI,CAAC,SAAS,gBAAgB;AAC5B,cAAQ,KAAK,eAAe,eAAe,cAAc,GAAG;AAAA,IAC9D;AAGA,QAAI,CAAC,OAAO;AACV,UAAI,mCAAS,UAAU;AAErB,gBAAQ,QAAQ;AAAA,MAClB,OAAO;AACL,aAAK,OAAO;AAAA,UACV;AAAA,UACA;AAAA,UACA,kCAAkC,GAAG;AAAA,QAAA;AAEvC,eAAO;AAAA,MACT;AAAA,IACF;AAGA,QAAI,SAAS,mCAAS;AAGtB,QAAI,CAAC,UAAU,KAAK,eAAe,IAAI,GAAG,GAAG;AAC3C,eAAS,KAAK,cAAc,KAAK,mCAAS,UAAU;AAAA,IACtD;AAGA,WAAO,KAAK,YAAY,OAAO,MAAM;AAAA,EACvC;AAAA,EAEQ,cACN,KACA,YAC6C;AAC7C,UAAM,WAAW,KAAK,eAAe,IAAI,GAAG;AAC5C,QAAI,CAAC,SAAU,QAAO;AAEtB,UAAM,QAAQ,KAAK,SAAS,SAAA,EAAW,SAAA;AAEvC,QAAI;AAEF,aAAO,SAAS,EAAE,OAAO,YAAY;AAAA,IACvC,SAAS,OAAO;AACd,WAAK,OAAO;AAAA,QACV;AAAA,QACA;AAAA,QACA,mCAAmC,GAAG;AAAA,QACtC;AAAA,MAAA;AAEF,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,eAAe,KAAU,MAAkC;AACjE,QAAI,CAAC,IAAK,QAAO;AAEjB,UAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,QAAI,UAAU;AAEd,eAAW,QAAQ,OAAO;AACxB,UAAI,YAAY,UAAa,YAAY,KAAM,QAAO;AACtD,gBAAU,QAAQ,IAAI;AAAA,IACxB;AAEA,WAAO,OAAO,YAAY,WAAW,UAAU;AAAA,EACjD;AAAA,EAEQ,YAAY,KAAa,QAAkD;AACjF,QAAI,CAAC,OAAQ,QAAO;AAGpB,WAAO,IAAI,QAAQ,cAAc,CAAC,OAAO,QAAQ;AAC/C,YAAM,QAAQ,OAAO,GAAG;AACxB,aAAO,UAAU,SAAY,OAAO,KAAK,IAAI;AAAA,IAC/C,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAmB,UAAiC;AAE1D,UAAM,cAAc,OAAO,KAAK,SAAS,KAAK,SAAS;AAEvD,gBAAY,QAAQ,CAAC,eAAe;AAClC,WAAK,2BAA2B,YAAY,QAAQ;AAAA,IACtD,CAAC;AAAA,EACH;AAAA,EAEQ,2BAA2B,YAAoB,UAAiC;AACtF,UAAM,gBAAgB,KAAK,YAAY,IAAI,UAAU;AACrD,UAAM,cAAgC,CAAA;AAGtC,SAAK,eAAe,QAAQ,CAAC,UAAU,QAAQ;AAC7C,UAAI;AACF,cAAM,YAAY,SAAS,EAAE,OAAO,UAAU,YAAY;AAC1D,cAAM,aAAa,+CAAe,IAAI;AAGtC,YAAI,CAAC,cAAc,YAAY,SAAS,GAAG;AACzC,sBAAY,KAAK,GAAG;AAGpB,cAAI,CAAC,KAAK,YAAY,IAAI,UAAU,GAAG;AACrC,iBAAK,YAAY,IAAI,YAAY,oBAAI,KAAK;AAAA,UAC5C;AACA,eAAK,YAAY,IAAI,UAAU,EAAG,IAAI,KAAK,SAAS;AAAA,QACtD;AAAA,MACF,SAAS,OAAO;AACd,aAAK,OAAO;AAAA,UACV;AAAA,UACA;AAAA,UACA,0CAA0C,GAAG;AAAA,UAC7C;AAAA,QAAA;AAAA,MAEJ;AAAA,IACF,CAAC;AAGD,QAAI,YAAY,SAAS,GAAG;AAC1B,WAAK,eAAe,KAAK,YAAY,EAAE,aAAa;AAEpD,WAAK,OAAO;AAAA,QACV;AAAA,QACA;AAAA,QACA,2CAA2C,UAAU;AAAA,QACrD;AAAA,MAAA;AAAA,IAEJ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,sBAAsB,KAAqB,UAA+B;AAChF,QAAI,KAAK,eAAe,IAAI,GAAG,GAAG;AAChC,WAAK,OAAO;AAAA,QACV;AAAA,QACA;AAAA,QACA,uBAAuB,GAAG;AAAA,MAAA;AAAA,IAE9B;AAEA,SAAK,eAAe,IAAI,KAAK,QAAQ;AAGrC,SAAK,YAAY,QAAQ,CAAC,aAAa;AACrC,eAAS,OAAO,GAAG;AAAA,IACrB,CAAC;AAED,SAAK,OAAO,MAAM,cAAc,sBAAsB,kCAAkC,GAAG,EAAE;AAAA,EAC/F;AAAA,EAEQ,wBAAwB,KAA2B;AACzD,QAAI,KAAK,eAAe,OAAO,GAAG,GAAG;AAEnC,WAAK,YAAY,QAAQ,CAAC,aAAa;AACrC,iBAAS,OAAO,GAAG;AAAA,MACrB,CAAC;AAED,WAAK,OAAO;AAAA,QACV;AAAA,QACA;AAAA,QACA,oCAAoC,GAAG;AAAA,MAAA;AAAA,IAE3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,UAAU,QAA0B;AAC1C,QAAI,CAAC,KAAK,QAAQ,IAAI,MAAM,GAAG;AAC7B,WAAK,OAAO,KAAK,cAAc,kBAAkB,WAAW,MAAM,qBAAqB;AACvF;AAAA,IACF;AAEA,UAAM,iBAAiB,KAAK,MAAM;AAClC,QAAI,mBAAmB,OAAQ;AAE/B,SAAK,SAASA,UAAgB,MAAM,CAAC;AAErC,SAAK,cAAc,KAAK;AAAA,MACtB;AAAA,MACA,eAAe;AAAA,IAAA,CAChB;AAED,SAAK,OAAO,KAAK,cAAc,iBAAiB,sBAAsB,MAAM,EAAE;AAAA,EAChF;AAAA,EAEQ,eAAe,QAAsB;AAC3C,QAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,GAAG;AACjC,WAAK,OAAO;AAAA,QACV;AAAA,QACA;AAAA,QACA,WAAW,OAAO,IAAI;AAAA,MAAA;AAExB;AAAA,IACF;AAEA,SAAK,QAAQ,IAAI,OAAO,MAAM,MAAM;AACpC,SAAK,SAASD,eAAqB,OAAO,IAAI,CAAC;AAE/C,SAAK,OAAO,KAAK,cAAc,oBAAoB,sBAAsB,OAAO,IAAI,EAAE;AAAA,EACxF;AACF;AAjUE,YAAgB,KAAK;AANhB,IAAM,aAAN;ACxBA,MAAM,eAA0B;AAAA,EACrC,eAAe;AAAA,EACf,kBAAkB,CAAA;AACpB;AAEO,MAAM,cAA8C,CAAC,QAAQ,cAAc,WAAW;AAC3F,UAAQ,OAAO,MAAA;AAAA,IACb,KAAK,YAAY;AACf,YAAM,SAAS,OAAO;AACtB,UAAI,CAAC,MAAM,iBAAiB,SAAS,MAAM,GAAG;AAC5C,gBAAQ,KAAK,uBAAuB,MAAM,iBAAiB;AAC3D,eAAO;AAAA,MACT;AACA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,eAAe;AAAA,MAAA;AAAA,IAEnB;AAAA,IAEA,KAAK,iBAAiB;AACpB,YAAM,SAAS,OAAO;AACtB,UAAI,MAAM,iBAAiB,SAAS,MAAM,GAAG;AAC3C,eAAO;AAAA,MACT;AACA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,kBAAkB,CAAC,GAAG,MAAM,kBAAkB,MAAM;AAAA,MAAA;AAAA,IAExD;AAAA,IAEA;AACE,aAAO;AAAA,EAAA;AAEb;AC9BO,MAAM,oBACX;AAAA,EACE;AAAA,EACA,QAAQ,CAAC,UAAU,WAAW,IAAI,WAAW,gBAAgB,UAAU,MAAM;AAAA,EAC7E,SAAS;AAAA,EACT;AACF;"}
1
+ {"version":3,"file":"index.js","sources":["../src/lib/locales/en.ts","../src/lib/locales/es.ts","../src/lib/manifest.ts","../src/lib/actions.ts","../src/lib/i18n-plugin.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["import { Locale } from '../types';\n\nexport const enUS: Locale = {\n code: 'en',\n name: 'English',\n translations: {\n commands: {\n zoom: {\n in: 'Zoom In',\n out: 'Zoom Out',\n fitWidth: 'Fit to Width',\n fitPage: 'Fit to Page',\n automatic: 'Automatic',\n level: 'Zoom Level ({level}%)',\n inArea: 'Zoom In Area',\n },\n fullscreen: {\n enter: 'Enter Full Screen',\n exit: 'Exit Full Screen',\n },\n rotate: {\n clockwise: 'Rotate Clockwise',\n counterclockwise: 'Rotate Counter-Clockwise',\n },\n menu: 'Menu',\n sidebar: 'Sidebar',\n search: 'Search',\n comment: 'Comment',\n download: 'Download',\n print: 'Print',\n openFile: 'Open PDF',\n save: 'Save',\n settings: 'Settings',\n view: 'View',\n annotate: 'Annotate',\n shapes: 'Shapes',\n redact: 'Redact',\n fillAndSign: 'Fill and Sign',\n form: 'Form',\n pan: 'Pan',\n pointer: 'Pointer',\n undo: 'Undo',\n redo: 'Redo',\n copy: 'Copy',\n screenshot: 'Screenshot',\n nextPage: 'Next Page',\n previousPage: 'Previous Page',\n },\n },\n};\n","import { Locale } from '../types';\n\nexport const esES: Locale = {\n code: 'es',\n name: 'Español',\n translations: {\n commands: {\n zoom: {\n in: 'Acercar',\n out: 'Alejar',\n fitWidth: 'Ajustar al ancho',\n fitPage: 'Ajustar a la página',\n automatic: 'Automático',\n level: 'Nivel de zoom ({level}%)',\n inArea: 'Acercar área',\n },\n fullscreen: {\n enter: 'Pantalla completa',\n exit: 'Salir de pantalla completa',\n },\n rotate: {\n clockwise: 'Girar a la derecha',\n counterclockwise: 'Girar a la izquierda',\n },\n menu: 'Menú',\n sidebar: 'Barra lateral',\n search: 'Buscar',\n comment: 'Comentario',\n download: 'Descargar',\n print: 'Imprimir',\n openFile: 'Abrir PDF',\n save: 'Guardar',\n settings: 'Configuración',\n view: 'Ver',\n annotate: 'Anotar',\n shapes: 'Formas',\n redact: 'Redactar',\n fillAndSign: 'Rellenar y firmar',\n form: 'Formulario',\n pan: 'Desplazar',\n pointer: 'Puntero',\n undo: 'Deshacer',\n redo: 'Rehacer',\n copy: 'Copiar',\n screenshot: 'Captura de pantalla',\n nextPage: 'Página siguiente',\n previousPage: 'Página anterior',\n },\n },\n};\n","import { PluginManifest } from '@embedpdf/core';\nimport { I18nPluginConfig } from './types';\nimport { enUS, esES } from './locales';\n\nexport const I18N_PLUGIN_ID = 'i18n';\n\nexport const manifest: PluginManifest<I18nPluginConfig> = {\n id: I18N_PLUGIN_ID,\n name: 'I18n Plugin',\n version: '1.0.0',\n provides: ['i18n'],\n requires: [],\n optional: [],\n defaultConfig: {\n defaultLocale: 'en',\n locales: [enUS, esES],\n },\n};\n","import { Action } from '@embedpdf/core';\nimport { Locale, LocaleCode } from './types';\n\nexport const SET_LOCALE = 'I18N/SET_LOCALE';\nexport const REGISTER_LOCALE = 'I18N/REGISTER_LOCALE';\n\nexport interface SetLocaleAction extends Action {\n type: typeof SET_LOCALE;\n payload: LocaleCode;\n}\n\nexport interface RegisterLocaleAction extends Action {\n type: typeof REGISTER_LOCALE;\n payload: LocaleCode;\n}\n\nexport type I18nAction = SetLocaleAction | RegisterLocaleAction;\n\nexport const setLocale = (locale: LocaleCode): SetLocaleAction => ({\n type: SET_LOCALE,\n payload: locale,\n});\n\nexport const registerLocale = (locale: LocaleCode): RegisterLocaleAction => ({\n type: REGISTER_LOCALE,\n payload: locale,\n});\n","import {\n BasePlugin,\n PluginRegistry,\n StoreState,\n arePropsEqual,\n createEmitter,\n createScopedEmitter,\n} from '@embedpdf/core';\nimport {\n I18nCapability,\n I18nPluginConfig,\n I18nState,\n I18nScope,\n Locale,\n LocaleCode,\n LocaleChangeEvent,\n TranslationKey,\n TranslateOptions,\n ParamResolver,\n TranslationParamsChangedData,\n TranslationParamsChangedEvent,\n} from './types';\nimport {\n I18nAction,\n setLocale as setLocaleAction,\n registerLocale as registerLocaleAction,\n} from './actions';\n\nexport class I18nPlugin extends BasePlugin<\n I18nPluginConfig,\n I18nCapability,\n I18nState,\n I18nAction\n> {\n static readonly id = 'i18n' as const;\n\n private config: I18nPluginConfig;\n private locales = new Map<LocaleCode, Locale>();\n private paramResolvers = new Map<TranslationKey, ParamResolver>();\n\n // Cache resolved params per document per key\n // Map<documentId, Map<translationKey, resolvedParams>>\n private paramsCache = new Map<string, Map<TranslationKey, Record<string, string | number>>>();\n\n // Events\n private readonly localeChange$ = createEmitter<LocaleChangeEvent>();\n private readonly paramsChanged$ = createScopedEmitter<\n TranslationParamsChangedData,\n TranslationParamsChangedEvent,\n string\n >((documentId, data) => ({ documentId, ...data }), { cache: false });\n\n constructor(id: string, registry: PluginRegistry, config: I18nPluginConfig) {\n super(id, registry);\n\n this.config = config;\n\n // Register all provided locales\n config.locales.forEach((locale) => {\n this.locales.set(locale.code, locale);\n this.dispatch(registerLocaleAction(locale.code));\n });\n\n // Register param resolvers\n if (config.paramResolvers) {\n Object.entries(config.paramResolvers).forEach(([key, resolver]) => {\n this.paramResolvers.set(key, resolver);\n });\n }\n\n // Set initial locale\n this.dispatch(setLocaleAction(config.defaultLocale));\n\n // Subscribe to global store changes for param change detection\n this.registry.getStore().subscribe((_action, newState) => {\n this.detectParamChanges(newState);\n });\n }\n\n async initialize(): Promise<void> {\n this.logger.info('I18nPlugin', 'Initialize', 'I18n plugin initialized');\n }\n\n async destroy(): Promise<void> {\n this.localeChange$.clear();\n this.paramsChanged$.clear();\n this.paramResolvers.clear();\n this.paramsCache.clear();\n super.destroy();\n }\n\n protected override onDocumentClosed(documentId: string): void {\n // Clean up cache for closed document\n this.paramsCache.delete(documentId);\n this.paramsChanged$.clearScope(documentId);\n\n this.logger.debug(\n 'I18nPlugin',\n 'DocumentClosed',\n `Cleaned up params cache for document: ${documentId}`,\n );\n }\n\n protected buildCapability(): I18nCapability {\n return {\n t: (key, options) => this.translate(key, options),\n forDocument: (documentId) => this.createI18nScope(documentId),\n registerParamResolver: (key, resolver) => this.registerParamResolver(key, resolver),\n unregisterParamResolver: (key) => this.unregisterParamResolver(key),\n setLocale: (locale) => this.setLocale(locale),\n getLocale: () => this.state.currentLocale,\n getAvailableLocales: () => [...this.state.availableLocales],\n getLocaleInfo: (code) => this.locales.get(code) ?? null,\n registerLocale: (locale) => this.registerLocale(locale),\n hasLocale: (code) => this.locales.has(code),\n onLocaleChange: this.localeChange$.on,\n onParamsChanged: this.paramsChanged$.onGlobal,\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Document Scoping\n // ─────────────────────────────────────────────────────────\n\n private createI18nScope(documentId: string): I18nScope {\n return {\n t: (key, options) => this.translate(key, { documentId, ...options }),\n onParamsChanged: this.paramsChanged$.forScope(documentId),\n };\n }\n\n // ─────────────────────────────────────────────────────────\n // Translation Logic\n // ─────────────────────────────────────────────────────────\n\n private translate(key: TranslationKey, options?: TranslateOptions): string {\n const locale = this.locales.get(this.state.currentLocale);\n const fallbackLocale = this.config.fallbackLocale\n ? this.locales.get(this.config.fallbackLocale)\n : null;\n\n // Try current locale\n let value = this.getNestedValue(locale?.translations, key);\n\n // Try fallback locale\n if (!value && fallbackLocale) {\n value = this.getNestedValue(fallbackLocale.translations, key);\n }\n\n // If still not found, use fallback or return key\n if (!value) {\n if (options?.fallback) {\n // Use provided fallback string\n value = options.fallback;\n } else {\n this.logger.warn(\n 'I18nPlugin',\n 'MissingTranslation',\n `Translation not found for key: ${key}`,\n );\n return key;\n }\n }\n\n // Resolve params: explicit params take precedence over registered resolvers\n let params = options?.params;\n\n // If no explicit params and we have a resolver, try to resolve\n if (!params && this.paramResolvers.has(key)) {\n params = this.resolveParams(key, options?.documentId);\n }\n\n // Interpolate parameters (works for both found translations and fallback)\n return this.interpolate(value, params);\n }\n\n private resolveParams(\n key: TranslationKey,\n documentId?: string,\n ): Record<string, string | number> | undefined {\n const resolver = this.paramResolvers.get(key);\n if (!resolver) return undefined;\n\n const state = this.registry.getStore().getState();\n\n try {\n // Pass documentId (which may be undefined) to resolver\n return resolver({ state, documentId });\n } catch (error) {\n this.logger.error(\n 'I18nPlugin',\n 'ParamResolverError',\n `Error resolving params for key \"${key}\":`,\n error,\n );\n return undefined;\n }\n }\n\n private getNestedValue(obj: any, path: string): string | undefined {\n if (!obj) return undefined;\n\n const parts = path.split('.');\n let current = obj;\n\n for (const part of parts) {\n if (current === undefined || current === null) return undefined;\n current = current[part];\n }\n\n return typeof current === 'string' ? current : undefined;\n }\n\n private interpolate(str: string, params?: Record<string, string | number>): string {\n if (!params) return str;\n\n // Replace {key} with params[key]\n return str.replace(/\\{(\\w+)\\}/g, (match, key) => {\n const value = params[key];\n return value !== undefined ? String(value) : match;\n });\n }\n\n // ─────────────────────────────────────────────────────────\n // Smart Param Change Detection\n // ─────────────────────────────────────────────────────────\n\n private detectParamChanges(newState: StoreState<any>): void {\n // Get all documents from core state\n const documentIds = Object.keys(newState.core.documents);\n\n documentIds.forEach((documentId) => {\n this.detectDocumentParamChanges(documentId, newState);\n });\n }\n\n private detectDocumentParamChanges(documentId: string, newState: StoreState<any>): void {\n const previousCache = this.paramsCache.get(documentId);\n const changedKeys: TranslationKey[] = [];\n\n // Re-resolve all params that have resolvers\n this.paramResolvers.forEach((resolver, key) => {\n try {\n const newParams = resolver({ state: newState, documentId });\n const prevParams = previousCache?.get(key);\n\n // Compare params (deep equality for simplicity)\n if (!arePropsEqual(prevParams, newParams)) {\n changedKeys.push(key);\n\n // Update cache\n if (!this.paramsCache.has(documentId)) {\n this.paramsCache.set(documentId, new Map());\n }\n this.paramsCache.get(documentId)!.set(key, newParams);\n }\n } catch (error) {\n this.logger.error(\n 'I18nPlugin',\n 'ParamDetectionError',\n `Error detecting param changes for key \"${key}\":`,\n error,\n );\n }\n });\n\n // Emit event if any params changed\n if (changedKeys.length > 0) {\n this.paramsChanged$.emit(documentId, { changedKeys });\n\n this.logger.debug(\n 'I18nPlugin',\n 'ParamsChanged',\n `Translation params changed for document ${documentId}:`,\n changedKeys,\n );\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Param Resolver Management\n // ─────────────────────────────────────────────────────────\n\n private registerParamResolver(key: TranslationKey, resolver: ParamResolver): void {\n if (this.paramResolvers.has(key)) {\n this.logger.warn(\n 'I18nPlugin',\n 'ResolverOverwrite',\n `Param resolver for \"${key}\" already exists and will be overwritten`,\n );\n }\n\n this.paramResolvers.set(key, resolver);\n\n // Clear cache for this key in all documents\n this.paramsCache.forEach((docCache) => {\n docCache.delete(key);\n });\n\n this.logger.debug('I18nPlugin', 'ResolverRegistered', `Param resolver registered for: ${key}`);\n }\n\n private unregisterParamResolver(key: TranslationKey): void {\n if (this.paramResolvers.delete(key)) {\n // Clear cache for this key in all documents\n this.paramsCache.forEach((docCache) => {\n docCache.delete(key);\n });\n\n this.logger.debug(\n 'I18nPlugin',\n 'ResolverUnregistered',\n `Param resolver unregistered for: ${key}`,\n );\n }\n }\n\n // ─────────────────────────────────────────────────────────\n // Locale Management\n // ─────────────────────────────────────────────────────────\n\n private setLocale(locale: LocaleCode): void {\n if (!this.locales.has(locale)) {\n this.logger.warn('I18nPlugin', 'LocaleNotFound', `Locale '${locale}' is not registered`);\n return;\n }\n\n const previousLocale = this.state.currentLocale;\n if (previousLocale === locale) return;\n\n this.dispatch(setLocaleAction(locale));\n\n this.localeChange$.emit({\n previousLocale,\n currentLocale: locale,\n });\n\n this.logger.info('I18nPlugin', 'LocaleChanged', `Locale changed to: ${locale}`);\n }\n\n private registerLocale(locale: Locale): void {\n if (this.locales.has(locale.code)) {\n this.logger.warn(\n 'I18nPlugin',\n 'LocaleAlreadyRegistered',\n `Locale '${locale.code}' is already registered`,\n );\n return;\n }\n\n this.locales.set(locale.code, locale);\n this.dispatch(registerLocaleAction(locale.code));\n\n this.logger.info('I18nPlugin', 'LocaleRegistered', `Locale registered: ${locale.code}`);\n }\n}\n","import { Reducer } from '@embedpdf/core';\nimport { I18nState } from './types';\nimport { I18nAction, SET_LOCALE, REGISTER_LOCALE } from './actions';\n\nexport const initialState: I18nState = {\n currentLocale: 'en',\n availableLocales: [],\n};\n\nexport const i18nReducer: Reducer<I18nState, I18nAction> = (state = initialState, action) => {\n switch (action.type) {\n case SET_LOCALE: {\n const locale = action.payload;\n if (!state.availableLocales.includes(locale)) {\n console.warn(`I18nPlugin: Locale '${locale}' not available`);\n return state;\n }\n return {\n ...state,\n currentLocale: locale,\n };\n }\n\n case REGISTER_LOCALE: {\n const locale = action.payload;\n if (state.availableLocales.includes(locale)) {\n return state; // Already registered\n }\n return {\n ...state,\n availableLocales: [...state.availableLocales, locale],\n };\n }\n\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\nimport { manifest, I18N_PLUGIN_ID } from './manifest';\nimport { I18nPluginConfig, I18nState } from './types';\nimport { I18nPlugin } from './i18n-plugin';\nimport { I18nAction } from './actions';\nimport { i18nReducer, initialState } from './reducer';\n\nexport const I18nPluginPackage: PluginPackage<I18nPlugin, I18nPluginConfig, I18nState, I18nAction> =\n {\n manifest,\n create: (registry, config) => new I18nPlugin(I18N_PLUGIN_ID, registry, config),\n reducer: i18nReducer,\n initialState,\n };\n\nexport * from './i18n-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './locales';\n"],"names":["registerLocaleAction","setLocaleAction"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@embedpdf/plugin-i18n",
3
- "version": "2.0.0-next.1",
3
+ "version": "2.0.0-next.3",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.cjs",
@@ -35,13 +35,13 @@
35
35
  }
36
36
  },
37
37
  "dependencies": {
38
- "@embedpdf/models": "2.0.0-next.1"
38
+ "@embedpdf/models": "2.0.0-next.3"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@types/react": "^18.2.0",
42
42
  "typescript": "^5.0.0",
43
- "@embedpdf/build": "1.1.0",
44
- "@embedpdf/core": "2.0.0-next.1"
43
+ "@embedpdf/core": "2.0.0-next.3",
44
+ "@embedpdf/build": "1.1.0"
45
45
  },
46
46
  "peerDependencies": {
47
47
  "react": ">=16.8.0",
@@ -49,7 +49,7 @@
49
49
  "preact": "^10.26.4",
50
50
  "vue": ">=3.2.0",
51
51
  "svelte": ">=5 <6",
52
- "@embedpdf/core": "2.0.0-next.1"
52
+ "@embedpdf/core": "2.0.0-next.3"
53
53
  },
54
54
  "files": [
55
55
  "dist",