@readium/shared 2.1.2 → 2.1.4

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.
@@ -0,0 +1,7 @@
1
+ const i = /* @__PURE__ */ JSON.parse(`{"format":{"audiobook":"Audiolibro","audiobookJSON":"Audiobook Manifest","cbz":"Comic book archive","divina":"Divina Publication","divinaJSON":"Divina Publication Manifest","epub":"EPUB","lcpa":"Audiolibro protetto con LCP","lcpdf":"PDF protetto con LCP","lcpl":"Licenza LCP","pdf":"PDF","rwp":"Readium Web Publication","rwpm":"Readium Web Publication Manifest","zab":"Audiobook Archive","zip":"ZIP Archive"},"kind":{"audiobook_many":"audiolibri","audiobook_one":"audiolibro","audiobook_other":"audiolibri","book_many":"libri","book_one":"libro","book_other":"libri","comic_many":"fumetti","comic_one":"fumetto","comic_other":"fumetti","document_many":"documenti","document_one":"documento","document_other":"documenti"},"metadata":{"accessibility":{"display-guide":{"accessibility-summary":{"no-metadata":"Nessuna informazione disponibile","publisher-contact":"Per ulteriori informazioni sull'accessibilità di questa risorsa, contattare l'editore: ","title":"Informazioni aggiuntive sull'accessibilità fornite dall'editore"},"additional-accessibility-information":{"aria":{"compact":"Ruoli ARIA inclusi","descriptive":"Il contenuto è semanticamente arricchito con ruoli ARIA per ottimizzare l'organizzazione e facilitare la navigazione"},"audio-descriptions":"Descrizioni audio","braille":"Braille","color-not-sole-means-of-conveying-information":"Il colore non è l'unico mezzo per trasmettere informazioni","dyslexia-readability":"Leggibilità adatta alla dislessia","full-ruby-annotations":"Annotazioni complete in Ruby","high-contrast-between-foreground-and-background-audio":"Elevato contrasto tra audio principale e sottofondo","high-contrast-between-text-and-background":"Contrasto elevato tra testo in primo piano e sfondo","large-print":"Stampa a caratteri ingranditi","page-breaks":{"compact":"Interruzioni di pagina incluse","descriptive":"Interruzioni di pagina identiche alla versione originale a stampa"},"ruby-annotations":"Alcune annotazioni in Ruby","sign-language":"Lingua dei segni","tactile-graphics":{"compact":"Grafica tattile inclusa","descriptive":"La grafica tattile è stata integrata per facilitare l'accesso agli elementi visivi alle persone non vedenti"},"tactile-objects":"Oggetti 3D tattili","text-to-speech-hinting":"Pronuncia migliorata per la sintesi vocale","title":"Ulteriori informazioni sull'accessibilità","ultra-high-contrast-between-text-and-background":"Contrasto molto elevato tra testo e sfondo","visible-page-numbering":"Numerazione delle pagine visibile","without-background-sounds":"Nessun suono in sottofondo"},"conformance":{"a":{"compact":"Questa pubblicazione soddisfa gli standard minimi di accessibilità","descriptive":"La pubblicazione contiene una dichiarazione di conformità che attesta il rispetto degli standard EPUB Accessibility e WCAG 2 Livello A"},"aa":{"compact":"Questa pubblicazione soddisfa gli standard di accessibilità accettati","descriptive":"La pubblicazione contiene una dichiarazione di conformità che attesta il rispetto degli standard EPUB Accessibility e WCAG 2 Livello AAA"},"aaa":{"compact":"Questa pubblicazione supera gli standard di accessibilità","descriptive":"La pubblicazione contiene una dichiarazione di conformità che attesta il rispetto degli standard EPUB Accessibility e WCAG 2 Livello AAA"},"certifier":"La pubblicazione è stata certificata da ","certifier-credentials":"Le credenziali del certificatore sono ","details":{"certification-info":"La pubblicazione è stata certificata il ","certifier-report":"Per ulteriori informazioni, consultare il report di accessibilità del certificatore","claim":"Questa pubblicazione è conforme ai requisiti di","epub-accessibility-1-0":"EPUB Accessibility 1.0","epub-accessibility-1-1":"EPUB Accessibility 1.1","level-a":"Livello A","level-aa":"Livello AA","level-aaa":"Livello AAA","wcag-2-0":{"compact":"WCAG 2.0","descriptive":"Linee guida per l'accessibilità dei contenuti web (WCAG) 2.0"},"wcag-2-1":{"compact":"WCAG 2.1","descriptive":"Linee guida per l'accessibilità dei contenuti web (WCAG) 2.1"},"wcag-2-2":{"compact":"WCAG 2.2","descriptive":"Linee guida per l'accessibilità dei contenuti web (WCAG) 2.2"}},"details-title":"Informazioni dettagliate sulla conformità","no":"Nessuna informazione disponibile","title":"Conformità","unknown-standard":"Nessuna indicazione sugli standard d'accessibilità"},"hazards":{"flashing":{"compact":"Contenuto lampeggiante","descriptive":"La pubblicazione contiene contenuti lampeggianti che possono causare crisi d'epilessia fotosensibile"},"flashing-none":{"compact":"Nessun contenuto lampeggiante","descriptive":"La pubblicazione non presenta contenuti lampeggianti che possono causare crisi d'epilessia fotosensibile"},"flashing-unknown":{"compact":"Nessuna informazione sulla presenza di contenuti lampeggianti","descriptive":"Non è stato possibile determinare la presenza di contenuti lampeggianti che possono causare crisi d'epilessia fotosensibile"},"motion":{"compact":"Simulazione del movimento","descriptive":"La pubblicazione contiene simulazioni di movimento che possono provocare cinetosi"},"motion-none":{"compact":"Nessun rischio di simulazione del movimento","descriptive":"La pubblicazione non contiene simulazioni di movimento che possono causare la malattia di movimento"},"motion-unknown":{"compact":"Nessuna informazione relativa alla presenza di simulazioni di movimento","descriptive":"Non è stato possibile determinare la presenza di contenuti che possono provocare cinetosi"},"no-metadata":"Nessuna informazione disponibile","none":{"compact":"Nessuna problematica","descriptive":"La pubblicazione non presenta contenuti a rischio di simulazione di movimento, di suoni, o di contenuti lampeggianti"},"sound":{"compact":"Suoni","descriptive":"La pubblicazione contiene suoni che possono causare problemi di sensibilità"},"sound-none":{"compact":"Nessun rischio acustico","descriptive":"La pubblicazione non contiene suoni che possono causare problemi di sensibilità"},"sound-unknown":{"compact":"Nessuna informazione sulla presenza di suoni","descriptive":"Non è stato possibile determinare la presenza di suoni che potrebbero causare problemi di sensibilità"},"title":"Problematiche","unknown":"La presenza di rischi è sconosciuta"},"legal-considerations":{"exempt":{"compact":"Dichiara di godere dell'esenzione d'accessibilità in alcune giurisdizioni","descriptive":"Questa risorsa gode dell'esenzione d'accessibilità in alcune giurisdizioni"},"no-metadata":"Nessuna informazione disponibile","title":"Note legali"},"navigation":{"index":{"compact":"Indice analitico interattivo","descriptive":"Indice analitico con link alle voci di riferimento"},"no-metadata":"Nessuna informazione disponibile","page-navigation":{"compact":"Vai alla pagina","descriptive":"Sono presenti i riferimenti ai numeri di pagina della versione a stampa corrispondente"},"structural":{"compact":"Intestazioni","descriptive":"Contiene elementi come titoli, elenchi e tabelle per permettere una navigazione strutturata"},"title":"Navigazione","toc":{"compact":"Indice interattivo","descriptive":"L’indice permette l’accesso diretto a tutti i capitoli tramite link"}},"rich-content":{"accessible-chemistry-as-latex":{"compact":"Formule chimiche in LaTeX","descriptive":"Formule chimiche in formato accessibile (LaTeX)"},"accessible-chemistry-as-mathml":{"compact":"Formule chimiche in MathML","descriptive":"Formule chimiche in formato accessibile (MathML)"},"accessible-math-as-latex":{"compact":"Matematica in LaTeX","descriptive":"Formule matematiche in formato accessibile (LaTeX)"},"accessible-math-described":"Sono disponibili descrizioni testuali per le formule matematiche","closed-captions":{"compact":"Sottotitoli disponibili per i video","descriptive":"Per i video sono disponibili dei sottotitoli"},"extended-descriptions":"Le immagini complesse presentano descrizioni estese","math-as-mathml":{"compact":"Matematica in MathML","descriptive":"Formule matematiche in formato accessibile (MathML)"},"open-captions":{"compact":"I video hanno i sottotitoli","descriptive":"I video inclusi nella pubblicazione hanno i sottotitoli"},"title":"Contenuti arricchiti","transcript":"Trascrizioni fornite","unknown":"Nessuna informazione disponibile"},"ways-of-reading":{"nonvisual-reading":{"alt-text":{"compact":"Immagini descritte","descriptive":"Le immagini sono descritte da un testo"},"no-metadata":"Nessuna informazione sulla lettura non visiva","none":{"compact":"Non leggibile con lettura ad alta voce o in braille","descriptive":"Il contenuto non è leggibile con la lettura ad alta voce o in braille"},"not-fully":{"compact":"Non è interamente leggibile con lettura ad alta voce o in braille","descriptive":"Non tutti i contenuti potranno essere letti con lettura ad alta voce o in braille"},"readable":{"compact":"Interamente leggibile con lettura ad alta voce o in braille","descriptive":"Tutti i contenuti possono essere letti con la lettura ad alta voce o con il display braille"}},"prerecorded-audio":{"complementary":{"compact":"Clip audio preregistrate","descriptive":"Le clip audio preregistrate sono integrate nel contenuto"},"no-metadata":"Non sono disponibili informazioni sull'audio preregistrato","only":{"compact":"Solo audio preregistrato","descriptive":"Audiolibro senza testi alternativi"},"synchronized":{"compact":"Audio preregistrato sincronizzato con il testo","descriptive":"Tutti i contenuti sono disponibili come audio preregistrato sincronizzato con il testo"}},"title":"Leggibilità","visual-adjustments":{"modifiable":{"compact":"La formattazione del testo e il layout della pagina possono essere modificati","descriptive":"La formattazione del testo e il layout della pagina possono essere modificati in base alle funzionalità presenti nella soluzione di lettura (ingrandimento dei caratteri del testo, modifica dei colori e dei contrasti per il testo e lo sfondo, modifica degli spazi tra lettere, parole, frasi e paragrafi)"},"unknown":"Non sono disponibili informazioni sulla possibilità di formattare il testo","unmodifiable":{"compact":"La formattazione del testo e il display della pagina non possono essere modificati","descriptive":"Il layout di testo e pagina non può essere modificato poiché l'esperienza di lettura è vicina a una versione di stampa, ma i sistemi di lettura possono ancora fornire opzioni di zoom"}}}}},"altIdentifier_many":"identificatori alternativi","altIdentifier_one":"identificatore alternativo","altIdentifier_other":"identificatori alternativi","artist_many":"","artist_one":"artista","artist_other":"artisti","author_many":"","author_one":"autore","author_other":"autori","collection_many":"","collection_one":"collana","collection_other":"collane","colorist_many":"","colorist_one":"colorista","colorist_other":"coloristi","contributor_many":"","contributor_one":"contributore","contributor_other":"contributori","description":"descrizione","duration":"durata","editor_many":"","editor_one":"editor","editor_other":"editori","identifier_many":"identificatori","identifier_one":"identificatore","identifier_other":"identificatori","illustrator_many":"","illustrator_one":"illustratore","illustrator_other":"illustratori","imprint_many":"","imprint_one":"marca editoriale","imprint_other":"marche editoriali","inker_many":"","inker_one":"inchiostratore","inker_other":"inchiostratori","language_many":"","language_one":"lingua","language_other":"lingue","letterer_many":"letteristi","letterer_one":"letterista","letterer_other":"letteristi","modified":"Data di modifica","narrator_many":"","narrator_one":"narratore","narrator_other":"narratori","numberOfPages":"impaginazione versione cartacea","penciler_many":"","penciler_one":"disegnatore","penciler_other":"disegnatori","published":"Data di pubblicazione","publisher_many":"","publisher_one":"editore","publisher_other":"editori","series_many":"","series_one":"serie","series_other":"serie","subject_many":"","subject_one":"categoria","subject_other":"categorie","subtitle":"sottotitolo","title":"titolo","translator_many":"","translator_one":"traduttore","translator_other":"traduttori"}}`), e = {
2
+ publication: i
3
+ };
4
+ export {
5
+ e as default,
6
+ i as publication
7
+ };
@@ -0,0 +1,7 @@
1
+ const e = { metadata: { accessibility: { "display-guide": { "accessibility-summary": { "no-metadata": "Sem informação disponível", "publisher-contact": "Para mais informações sobre a acessibilidade deste produto, contacte a editora: ", title: "Resumo de acessibilidade" }, "additional-accessibility-information": { aria: { compact: "Inclui funções ARIA", descriptive: "O conteúdo foi otimizado com funções ARIA para melhorar a organização e facilitar a navegação" }, "audio-descriptions": "Descrições em áudio", braille: "Braille", "color-not-sole-means-of-conveying-information": "A cor não é o único meio de transmitir informação", "dyslexia-readability": "Otimizado para dislexia", "full-ruby-annotations": "Anotações Ruby completas", "high-contrast-between-foreground-and-background-audio": "Alto contraste entre som principal e fundo", "high-contrast-between-text-and-background": "Alto contraste entre texto e fundo", "large-print": "Impressão ampliada", "page-breaks": { compact: "Inclui quebras de página", descriptive: "Inclui quebras de página da fonte impressa original" }, "ruby-annotations": "Algumas anotações Ruby", "sign-language": "Língua gestual", "tactile-graphics": { compact: "Inclui gráficos táteis", descriptive: "Inclui gráficos táteis que facilitam o acesso a elementos visuais para pessoas cegas" }, "tactile-objects": "Objetos táteis 3D", "text-to-speech-hinting": "Sugestões para leitura em voz alta", title: "Informação adicional de acessibilidade", "ultra-high-contrast-between-text-and-background": "Contraste muito elevado entre texto e fundo", "visible-page-numbering": "Numeração de páginas visível", "without-background-sounds": "Sem sons de fundo" }, conformance: { a: { compact: "Cumpre as normas mínimas de acessibilidade", descriptive: "A publicação contém uma declaração de conformidade que indica que cumpre o padrão EPUB Accessibility e WCAG 2 nível A" }, aa: { compact: "Cumpre as normas aceites de acessibilidade", descriptive: "A publicação contém uma declaração de conformidade que indica que cumpre o padrão EPUB Accessibility e WCAG 2 nível AA" }, aaa: { compact: "Excede as normas aceites de acessibilidade", descriptive: "A publicação contém uma declaração de conformidade que indica que cumpre o padrão EPUB Accessibility e WCAG 2 nível AAA" }, certifier: "A publicação foi certificada por ", "certifier-credentials": "As credenciais do certificador são ", details: { "certification-info": "A publicação foi certificada em ", "certifier-report": "Para mais informações, consulte o relatório do certificador", claim: "Esta publicação declara conformidade com", "epub-accessibility-1-0": "EPUB Accessibility 1.0", "epub-accessibility-1-1": "EPUB Accessibility 1.1", "level-a": "Nível A", "level-aa": "Nível AA", "level-aaa": "Nível AAA", "wcag-2-0": { compact: "WCAG 2.0", descriptive: "Diretrizes de Acessibilidade para Conteúdo Web (WCAG) 2.0" }, "wcag-2-1": { compact: "WCAG 2.1", descriptive: "Diretrizes de Acessibilidade para Conteúdo Web (WCAG) 2.1" }, "wcag-2-2": { compact: "WCAG 2.2", descriptive: "Diretrizes de Acessibilidade para Conteúdo Web (WCAG) 2.2" } }, "details-title": "Detalhes de conformidade", no: "Sem informação disponível", title: "Conformidade", "unknown-standard": "Não foi possível determinar a conformidade com as normas de acessibilidade aceites para esta publicação" }, hazards: { flashing: { compact: "Conteúdo intermitente", descriptive: "A publicação contém conteúdo intermitente que pode causar crises fotossensíveis" }, "flashing-none": { compact: "Sem perigos de intermitência", descriptive: "A publicação não contém conteúdo intermitente que possa causar crises fotossensíveis" }, "flashing-unknown": { compact: "Risco de intermitência desconhecido", descriptive: "Não foi possível determinar se existe conteúdo intermitente que possa causar crises fotossensíveis" }, motion: { compact: "Simulação de movimento", descriptive: "A publicação contém simulações de movimento que podem causar enjoo" }, "motion-none": { compact: "Sem simulação de movimento", descriptive: "A publicação não contém simulações de movimento que possam causar enjoo" }, "motion-unknown": { compact: "Risco de movimento desconhecido", descriptive: "Não foi possível determinar se existem simulações de movimento que possam causar enjoo" }, "no-metadata": "Sem informação disponível", none: { compact: "Sem perigos", descriptive: "A publicação não contém perigos conhecidos" }, sound: { compact: "Sons sensíveis", descriptive: "A publicação contém sons que podem causar sensibilidade auditiva" }, "sound-none": { compact: "Sem perigos sonoros", descriptive: "A publicação não contém sons que possam causar sensibilidade auditiva" }, "sound-unknown": { compact: "Risco sonoro desconhecido", descriptive: "Não foi possível determinar se a publicação contém sons que possam causar sensibilidade auditiva" }, title: "Perigos", unknown: "Presença de perigos não determinada" }, "legal-considerations": { exempt: { compact: "Declara isenção de conformidade em algumas jurisdições", descriptive: "Esta publicação declara isenção de conformidade em algumas jurisdições" }, "no-metadata": "Sem informação disponível", title: "Considerações legais" }, navigation: { index: { compact: "Índice remissivo", descriptive: "Índice com ligações para entradas referenciadas" }, "no-metadata": "Sem informação disponível", "page-navigation": { compact: "Ir para página", descriptive: "Lista de páginas que permite aceder às páginas da versão impressa original" }, structural: { compact: "Títulos e estrutura", descriptive: "Elementos como títulos, tabelas, etc., para navegação estruturada" }, title: "Navegação", toc: { compact: "Índice", descriptive: "Índice de conteúdos com ligações para todos os capítulos do texto" } }, "rich-content": { "accessible-chemistry-as-latex": { compact: "Fórmulas químicas em LaTeX", descriptive: "Fórmulas químicas em formato acessível (LaTeX)" }, "accessible-chemistry-as-mathml": { compact: "Fórmulas químicas em MathML", descriptive: "Fórmulas químicas em formato acessível (MathML)" }, "accessible-math-as-latex": { compact: "Matemática em LaTeX", descriptive: "Fórmulas matemáticas em formato acessível (LaTeX)" }, "accessible-math-described": "Descrição textual das fórmulas matemáticas", "closed-captions": { compact: "Vídeos com legendas ocultas", descriptive: "Os vídeos incluídos na publicação têm legendas ocultas" }, "extended-descriptions": "Imagens complexas com descrições detalhadas", "math-as-mathml": { compact: "Matemática em MathML", descriptive: "Fórmulas matemáticas em formato acessível (MathML)" }, "open-captions": { compact: "Vídeos com legendas abertas", descriptive: "Os vídeos incluídos na publicação têm legendas abertas" }, title: "Conteúdo rico", transcript: "Transcrição fornecida", unknown: "Sem informação disponível" }, "ways-of-reading": { "nonvisual-reading": { "alt-text": { compact: "Contém texto alternativo", descriptive: "Inclui descrições alternativas de texto para imagens" }, "no-metadata": "Sem informação sobre leitura não visual", none: { compact: "Não legível em leitura em voz alta ou braille dinâmico", descriptive: "O conteúdo não é legível em voz alta ou através de braille dinâmico" }, "not-fully": { compact: "Parcialmente legível em leitura em voz alta ou braille dinâmico", descriptive: "Nem todo o conteúdo é legível em voz alta ou através de braille dinâmico" }, readable: { compact: "Totalmente legível em leitura em voz alta ou braille dinâmico", descriptive: "Todo o conteúdo pode ser lido em voz alta ou através de braille dinâmico" } }, "prerecorded-audio": { complementary: { compact: "Contém clipes de áudio pré-gravados", descriptive: "O conteúdo contém clipes de áudio pré-gravados incorporados" }, "no-metadata": "Sem informação sobre áudio pré-gravado", only: { compact: "Apenas áudio pré-gravado", descriptive: "A publicação é apenas áudio e não possui alternativa em texto" }, synchronized: { compact: "Áudio pré-gravado sincronizado com texto", descriptive: "Todo o conteúdo está disponível como áudio pré-gravado sincronizado com texto" } }, title: "Formas de leitura", "visual-adjustments": { modifiable: { compact: "Aspeto personalizável", descriptive: "O aspeto do texto e o layout da página podem ser modificados de acordo com as capacidades do sistema de leitura (tipo e tamanho de letra, espaçamento entre parágrafos, frases, palavras e letras, bem como a cor de fundo e do texto)" }, unknown: "Sem informação sobre personalização do aspeto", unmodifiable: { compact: "Aspeto não ajustável", descriptive: "O texto e o layout da página não podem ser modificados, uma vez que a experiência de leitura é semelhante à versão impressa, mas os sistemas de leitura ainda podem oferecer opções de ampliação" } } } } }, altIdentifier_one: "identificador alternativo", altIdentifier_other: "identificadores alternativos", artist_one: "artista", artist_other: "artistas", author_one: "autor", author_other: "autores", collection_one: "coleção", collection_other: "coleções", colorist_one: "colorista", colorist_other: "coloristas", contributor_one: "colaborador", contributor_other: "colaboradores", description: "descrição", duration: "duração", editor_one: "editor", editor_other: "editores", identifier_one: "identificador", identifier_other: "identificadores", illustrator_one: "ilustrador", illustrator_other: "ilustradores", imprint_one: "selo editorial", imprint_other: "selos editoriais", inker_one: "arte-finalista", inker_other: "arte-finalistas", language_one: "idioma", language_other: "idiomas", letterer_one: "letrista", letterer_other: "letristas", modified: "data de modificação", narrator_one: "narrador", narrator_other: "narradores", numberOfPages: "número de páginas", penciler_one: "desenhador", penciler_other: "desenhadores", published: "data de publicação", publisher_one: "editora", publisher_other: "editoras", series_one: "série", series_other: "séries", subject_one: "tema", subject_other: "temas", subtitle: "subtítulo", title: "título", translator_one: "tradutor", translator_other: "tradutores" } }, a = {
2
+ publication: e
3
+ };
4
+ export {
5
+ a as default,
6
+ e as publication
7
+ };
@@ -0,0 +1,7 @@
1
+ const e = { metadata: { accessibility: { "display-guide": { "accessibility-summary": { "no-metadata": "Information saknas", "publisher-contact": "För mer information om den här publikationens tillgänglighet, kontakta utgivaren: ", title: "Kompletterande information om tillgänglighet" }, "additional-accessibility-information": { aria: { compact: "Innehåller ARIA-roller", descriptive: "Innehållet har försetts med ARIA-roller för att tydliggöra strukturen och underlätta navigering" }, "audio-descriptions": "Syntolkning", braille: "Punktskrift", "color-not-sole-means-of-conveying-information": "Betydelse uttrycks aldrig enbart med färg", "dyslexia-readability": "Förbättrad läsbarhet för personer med dyslexi", "full-ruby-annotations": "Fullständig ruby-annotering", "high-contrast-between-foreground-and-background-audio": "Hög kontrast mellan förgrundsljud och bakgrundsljud", "high-contrast-between-text-and-background": "Hög kontrast mellan text och bakgrund", "large-print": "Storstil", "page-breaks": { compact: "Innehåller sidnummer", descriptive: "Innehåller sidnummer från tryckt förlaga" }, "ruby-annotations": "Viss ruby-annotering", "sign-language": "Teckenspråk", "tactile-graphics": { compact: "Innehåller taktila bilder", descriptive: "Taktila bilder har lagts till för att tillgängliggöra visuella element för personer med synnedsättning" }, "tactile-objects": "Taktila 3D-objekt", "text-to-speech-hinting": "Innehåller uttalsinstruktioner för talsyntes", title: "Ytterligare tillgänglighetsinformation", "ultra-high-contrast-between-text-and-background": "Extra hög kontrast mellan text och bakgrund", "visible-page-numbering": "Synlig sidnumrering", "without-background-sounds": "Utan bakgrundsljud" }, conformance: { a: { compact: "Publikationen uppfyller tillgänglighetskrav på en grundläggande nivå", descriptive: "Publikationen anger att den uppfyller standarderna EPUB Accessibility och WCAG 2 nivå A" }, aa: { compact: "Publikationen uppfyller tillgänglighetskrav på en vedertagen nivå", descriptive: "Publikationen anger att den uppfyller standarderna EPUB Accessibility och WCAG 2 nivå AA" }, aaa: { compact: "Publikationen uppfyller tillgänglighetskrav utöver en vedertagen nivå", descriptive: "Publikationen anger att den uppfyller standarderna EPUB Accessibility och WCAG 2 nivå AAA" }, certifier: "Publikationen är certifierad av ", "certifier-credentials": "Certifierarens märkning är ", details: { "certification-info": "Publikationen certifierades ", "certifier-report": "Se certifieringsrapporten för mer information", claim: "Publikationen anger att den uppfyller kraven enligt", "epub-accessibility-1-0": "EPUB Accessibility 1.0", "epub-accessibility-1-1": "EPUB Accessibility 1.1", "level-a": "nivå A", "level-aa": "nivå AA", "level-aaa": "nivå AAA", "wcag-2-0": { compact: "WCAG 2.0", descriptive: "Web Content Accessibility Guidelines (WCAG) 2.0" }, "wcag-2-1": { compact: "WCAG 2.1", descriptive: "Web Content Accessibility Guidelines (WCAG) 2.1" }, "wcag-2-2": { compact: "WCAG 2.2", descriptive: "Web Content Accessibility Guidelines (WCAG) 2.2" } }, "details-title": "Detaljerad information om tillgänglighetskrav", no: "Information saknas", title: "Tillgänglighetskrav", "unknown-standard": "Det går inte att avgöra om publikationen uppfyller vedertagna tillgänglighetskrav" }, hazards: { flashing: { compact: "Blinkande innehåll", descriptive: "Publikationen har blinkande innehåll som kan vara skadligt för ljuskänsliga personer" }, "flashing-none": { compact: "Inget blinkande innehåll", descriptive: "Publikationen har inget blinkande innehåll" }, "flashing-unknown": { compact: "Förekomst av blinkande innehåll är okänd", descriptive: "Förekomst av blinkande innehåll är okänd" }, motion: { compact: "Rörelsesimulering", descriptive: "Publikationen innehåller rörelsesimulering som skulle kunna orsaka illamående" }, "motion-none": { compact: "Ingen rörelsesimulering", descriptive: "Publikationen innehåller ingen rörelsesimulering" }, "motion-unknown": { compact: "Förekomst av rörelsesimulering är okänd", descriptive: "Förekomst av rörelsesimulering är okänd" }, "no-metadata": "Information saknas", none: { compact: "Inga risker", descriptive: "Publikationen innehåller inga risker" }, sound: { compact: "Ljud", descriptive: "Publikationen innehåller ljud som kan orsaka obehag" }, "sound-none": { compact: "Inget ljud som kan orsaka obehag", descriptive: "Publikationen innehåller inget ljud som kan orsaka obehag" }, "sound-unknown": { compact: "Förekomst av ljud som kan orsaka obehag är okänd", descriptive: "Förekomst av ljud som kan orsaka obehag är okänd" }, title: "Risker", unknown: "Förekomst av risker är okänd" }, "legal-considerations": { exempt: { compact: "Åberopar ett undantag från vissa lagstadgade tillgänglighetskrav", descriptive: "Publikationen åberopar ett undantag från vissa lagstadgade tillgänglighetskrav" }, "no-metadata": "Information saknas", title: "Juridiska aspekter" }, navigation: { index: { compact: "Register", descriptive: "Register med länkar till innehållet" }, "no-metadata": "Information saknas", "page-navigation": { compact: "Gå till sida", descriptive: "Sidindelning för navigering enligt sidnummer i tryckt förlaga" }, structural: { compact: "Rubriker", descriptive: "Navigerbara element såsom rubriker eller tabeller" }, title: "Navigering", toc: { compact: "Innehållsförteckning", descriptive: "Innehållsförteckning med länkar till alla kapitel" } }, "rich-content": { "accessible-chemistry-as-latex": { compact: "Kemiska formler i LaTeX", descriptive: "Kemiska formler i tillgängligt format (LaTeX)" }, "accessible-chemistry-as-mathml": { compact: "Kemiska formler i MathML", descriptive: "Kemiska formler i tillgängligt format (MathML)" }, "accessible-math-as-latex": { compact: "Matematik som LaTeX", descriptive: "Matematiska formler i tillgängligt format (LaTeX)" }, "accessible-math-described": "Innehåller textbeskrivningar av matematik", "closed-captions": { compact: "Videoklipp har undertext som kan sättas på/stängas av", descriptive: "Videoklipp som ingår i publikationen har undertext som kan sättas på och stängas av (stängda undertexter)" }, "extended-descriptions": "Informationsrika bilder har utökade bildbeskrivningar", "math-as-mathml": { compact: "Matematik som MathML", descriptive: "Matematiska formler i tillgängligt format (MathML)" }, "open-captions": { compact: "Videoklipp har undertext som inte kan stängas av", descriptive: "Videoklipp som ingår i publikationen har undertext som inte kan stängas av (öppna undertexter)" }, title: "Berikat innehåll", transcript: "Innehåller transkriptioner", unknown: "Information saknas" }, "ways-of-reading": { "nonvisual-reading": { "alt-text": { compact: "Har textalternativ (alt-texter)", descriptive: "Har textalternativ (alt-texter) till bilder" }, "no-metadata": "Information om icke-visuell läsbarhet saknas", none: { compact: "Kan inte läsas med uppläsningsfunktion eller punktskriftsskärm", descriptive: "Innehållet går inte att läsa med uppläsningsfunktion eller punktskriftsskärm" }, "not-fully": { compact: "Inte läsbart i sin helhet med uppläsningsfunktion eller punktskriftsskärm", descriptive: "Allt innehåll går inte att läsa med uppläsningsfunktion eller punktskriftsskärm" }, readable: { compact: "Kan läsas med uppläsningsfunktion eller punktskriftsskärm", descriptive: "Hela innehållet går att läsa med uppläsningsfunktion eller punktskriftsskärm" } }, "prerecorded-audio": { complementary: { compact: "Förinspelade ljudklipp", descriptive: "Innehåller förinspelade ljudklipp" }, "no-metadata": "Information om förinspelat ljud saknas", only: { compact: "Endast förinspelat ljud", descriptive: "Bok med ljud utan textalternativ" }, synchronized: { compact: "Förinspelat ljud synkroniserat med texten", descriptive: "Hela innehållet finns tillgängligt som förinspelat ljud synkroniserat med texten" } }, title: "Olika sätt att läsa", "visual-adjustments": { modifiable: { compact: "Utseendet kan justeras", descriptive: "Det går att justera text och layout i den utsträckning som läsprogrammet tillåter, till exempel typsnitt, storlek på text, avstånd mellan rader och stycken samt färg på text och bakgrund" }, unknown: "Information om möjlighet att justera utseende saknas", unmodifiable: { compact: "Utseendet kan inte justeras", descriptive: "Text- och sidlayout kan inte justeras eftersom presentationen liknar en tryckt version, men läsprogram kan ha funktioner för att zooma in" } } } } }, altIdentifier_one: "alternativ identifierare", altIdentifier_other: "alternativa identifierare", artist_one: "konstnär", artist_other: "konstnärer", author_one: "författare", author_other: "författare", collection_one: "samling", collection_other: "samlingar", colorist_one: "kolorist", colorist_other: "kolorister", contributor_one: "medverkande", contributor_other: "medverkande", description: "beskrivning", duration: "speltid", editor_one: "redaktör", editor_other: "redaktörer", identifier_one: "identifierare", identifier_other: "identifierare", illustrator_one: "illustratör", illustrator_other: "illustratörer", imprint_one: "imprint", imprint_other: "imprint", inker_one: "tuschare", inker_other: "tuschare", language_one: "språk", language_other: "språk", letterer_one: "textare", letterer_other: "textare", modified: "ändringsdatum", narrator_one: "berättarröst", narrator_other: "berättarröster", numberOfPages: "sidantal", penciler_one: "tecknare", penciler_other: "tecknare", published: "publikationsdatum", publisher_one: "förlag", publisher_other: "förlag", series_one: "serie", series_other: "serier", subject_one: "ämne", subject_other: "ämnen", subtitle: "undertitel", title: "titel", translator_one: "översättare", translator_other: "översättare" } }, t = {
2
+ publication: e
3
+ };
4
+ export {
5
+ t as default,
6
+ e as publication
7
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@readium/shared",
3
- "version": "2.1.2",
3
+ "version": "2.1.4",
4
4
  "type": "module",
5
5
  "description": "Shared models to be used across other Readium projects and implementations in Typescript",
6
6
  "author": "readium",
@@ -47,9 +47,10 @@
47
47
  "scripts": {
48
48
  "dev": "vite",
49
49
  "build": "tsc && vite build",
50
- "update-accessibility-locales": "node update-accessibility-locales.mjs",
51
50
  "test": "jest",
52
- "size": "size-limit"
51
+ "size": "size-limit",
52
+ "check-locales": "node scripts/check-locales.mjs",
53
+ "update-locales": "pnpm remove @edrlab/thorium-locales && pnpm add @edrlab/thorium-locales@github:edrlab/thorium-locales && pnpm check-locales"
53
54
  },
54
55
  "size-limit": [
55
56
  {
@@ -57,19 +58,22 @@
57
58
  "limit": "50 KB"
58
59
  }
59
60
  ],
61
+ "dependencies": {
62
+ "@edrlab/thorium-locales": "github:edrlab/thorium-locales"
63
+ },
60
64
  "devDependencies": {
61
- "@babel/core": "^7.28.3",
62
- "@babel/preset-env": "^7.28.3",
63
- "@babel/preset-typescript": "^7.27.1",
64
- "@size-limit/file": "^11.2.0",
65
+ "@babel/core": "^7.28.6",
66
+ "@babel/preset-env": "^7.28.6",
67
+ "@babel/preset-typescript": "^7.28.5",
68
+ "@size-limit/file": "^12.0.0",
65
69
  "@types/jest": "^30.0.0",
66
- "babel-jest": "^30.1.1",
67
- "css-selector-generator": "^3.6.9",
68
- "jest": "^30.1.1",
69
- "size-limit": "^11.2.0",
70
- "ts-jest": "^29.4.1",
70
+ "babel-jest": "^30.2.0",
71
+ "css-selector-generator": "^3.8.0",
72
+ "jest": "^30.2.0",
73
+ "size-limit": "^12.0.0",
74
+ "ts-jest": "^29.4.6",
71
75
  "tslib": "^2.8.1",
72
76
  "typescript": "^5.9.3",
73
- "vite": "^7.2.4"
77
+ "vite": "^7.3.1"
74
78
  }
75
79
  }
@@ -9,7 +9,7 @@
9
9
  export class LocalizedString {
10
10
  public readonly translations: { [key: string]: string };
11
11
 
12
- public static readonly UNDEFINED_LANGUAGE = 'undefined';
12
+ public static readonly UNDEFINED_LANGUAGE = 'und';
13
13
  public static readonly LANGUAGE_EN = 'en';
14
14
 
15
15
  /**
@@ -8,7 +8,15 @@ The localization system allows consumers to provide their own translations for a
8
8
 
9
9
  ## Default Behavior
10
10
 
11
- By default, the system uses English (`en`) locale strings that are bundled with the package. These strings are included in the package and cover all accessibility metadata display needs.
11
+ By default, the system uses English (`en`) locale strings that are bundled with the package. These strings are included in the package and cover all accessibility metadata display needs. The system supports the following locales out of the box:
12
+
13
+ - `en` - English
14
+ - `fr` - French
15
+ - `ar` - Arabic
16
+ - `da` - Danish
17
+ - `it` - Italian
18
+ - `pt_PT` - Portuguese (Portugal)
19
+ - `sv` - Swedish
12
20
 
13
21
  ## Using the Localization System
14
22
 
@@ -41,17 +49,22 @@ Localization.registerLocale('en', {
41
49
  ### Setting the Current Locale
42
50
 
43
51
  ```typescript
44
- // Set the current locale by language code
45
- Localization.setLocale('es');
46
-
47
- // Check if the locale was set successfully
48
- if (Localization.setLocale('es')) {
49
- console.log('Locale set successfully');
50
- } else {
51
- console.log('Locale not available');
52
- }
52
+ // Set the current locale by language code (returns a Promise<boolean>)
53
+ const success = await Localization.setLocale('es');
54
+
55
+ // Or using promises
56
+ Localization.setLocale('es')
57
+ .then(success => {
58
+ if (success) {
59
+ console.log('Locale set successfully');
60
+ } else {
61
+ console.log('Locale not available');
62
+ }
63
+ });
53
64
  ```
54
65
 
66
+ > **Note:** `setLocale` is an async operation as it may need to load the locale data. Make sure to `await` the result or handle the Promise accordingly.
67
+
55
68
  ### Getting Localized Strings
56
69
 
57
70
  ```typescript
@@ -98,6 +111,22 @@ const locale = {
98
111
 
99
112
  ## Fallback Behavior
100
113
 
114
+ When a string is not found in the current locale, the system will automatically fall back to the English (`en`) version if available. If the string is not found in either locale, an empty string will be returned and a warning will be logged to the console.
115
+
116
+ ## Preloading Locales
117
+
118
+ For better performance, you can preload locales that will be needed later:
119
+
120
+ ```typescript
121
+ // Preload a specific locale
122
+ await Localization.loadLocale('fr');
123
+
124
+ // Check if a locale is already loaded
125
+ if (Localization.getCurrentLocale() === 'fr') {
126
+ // Locale is loaded and ready to use
127
+ }
128
+ ```
129
+
101
130
  If a key is not found in the custom locale, the system will fall back to the English locale. If the key is not found in either locale, a warning will be logged to the console and an empty string will be returned.
102
131
 
103
132
  ## Available Locale Keys
@@ -1,24 +1,46 @@
1
1
  // Localization.ts
2
- import enUS from './locales/en.json';
3
- import frFR from './locales/fr.json';
2
+
3
+ import { SUPPORTED_LANGUAGES } from './SupportedLanguages';
4
+ // Static import for English (default locale)
5
+ import enLocale from '@edrlab/thorium-locales/publication-metadata/en.json';
4
6
 
5
7
  export interface L10nString {
6
8
  compact: string;
7
9
  descriptive: string;
8
10
  }
9
11
 
10
- type LocaleData = Record<string, any>;
12
+ type LocaleValue = string | L10nString | LocaleData;
13
+ interface LocaleData {
14
+ [key: string]: LocaleValue | LocaleValue[];
15
+ }
16
+
17
+ // Dynamic imports for non-English locales
18
+ const jsonLoaders: Record<string, () => Promise<{ default: any }>> = {
19
+ 'fr': () => import('@edrlab/thorium-locales/publication-metadata/fr.json'),
20
+ 'ar': () => import('@edrlab/thorium-locales/publication-metadata/ar.json'),
21
+ 'da': () => import('@edrlab/thorium-locales/publication-metadata/da.json'),
22
+ // 'el': () => import('@edrlab/thorium-locales/publication-metadata/el.json'),
23
+ // 'et': () => import('@edrlab/thorium-locales/publication-metadata/et.json'),
24
+ 'it': () => import('@edrlab/thorium-locales/publication-metadata/it.json'),
25
+ 'pt_PT': () => import('@edrlab/thorium-locales/publication-metadata/pt_PT.json'),
26
+ 'sv': () => import('@edrlab/thorium-locales/publication-metadata/sv.json'),
27
+ // 'tr': () => import('@edrlab/thorium-locales/publication-metadata/tr.json'),
28
+ // 'uk': () => import('@edrlab/thorium-locales/publication-metadata/uk.json')
29
+ };
30
+
31
+ // Extract English accessibility data
32
+ const englishAccessibilityData = enLocale?.publication?.metadata?.accessibility?.['display-guide'] || {};
11
33
 
12
34
  class LocalizationImpl {
13
35
  private static instance: LocalizationImpl;
14
36
  private currentLocaleCode: string = 'en';
15
- private locale: LocaleData = enUS;
16
- private availableLocales: Record<string, LocaleData> = {
17
- 'en': enUS,
18
- 'fr': frFR
19
- };
37
+ private locale: LocaleData = englishAccessibilityData;
38
+ private loadedLocales: Record<string, LocaleData> = {};
20
39
 
21
- private constructor() {}
40
+ private constructor() {
41
+ // Load English into loaded locales since it's our default
42
+ this.loadedLocales['en'] = englishAccessibilityData;
43
+ }
22
44
 
23
45
  public static getInstance(): LocalizationImpl {
24
46
  if (!LocalizationImpl.instance) {
@@ -27,6 +49,49 @@ class LocalizationImpl {
27
49
  return LocalizationImpl.instance;
28
50
  }
29
51
 
52
+ /**
53
+ * Loads a locale dynamically
54
+ * @param localeCode BCP 47 language code (e.g., 'en', 'fr')
55
+ * @returns Promise indicating if the locale was loaded successfully
56
+ */
57
+ public async loadLocale(localeCode: string): Promise<boolean> {
58
+ // Check if locale is enabled
59
+ if (!SUPPORTED_LANGUAGES.includes(localeCode)) {
60
+ console.warn(`Locale '${localeCode}' is not enabled`);
61
+ return false;
62
+ }
63
+
64
+ // Skip if already loaded
65
+ if (localeCode in this.loadedLocales) {
66
+ return true;
67
+ }
68
+
69
+ try {
70
+ // Check if we have a loader for this locale
71
+ if (!(localeCode in jsonLoaders)) {
72
+ console.warn(`Locale file not found for: ${localeCode}`);
73
+ return false;
74
+ }
75
+
76
+ const localeModule = await jsonLoaders[localeCode]();
77
+ const data = localeModule.default;
78
+
79
+ // Extract the accessibility.display-guide part
80
+ const accessibilityData = data?.publication?.metadata?.accessibility?.['display-guide'];
81
+
82
+ if (accessibilityData) {
83
+ this.loadedLocales[localeCode] = accessibilityData;
84
+ return true;
85
+ } else {
86
+ console.warn(`No accessibility strings found in locale ${localeCode}`);
87
+ return false;
88
+ }
89
+ } catch (error) {
90
+ console.warn(`Failed to load locale ${localeCode}:`, error);
91
+ return false;
92
+ }
93
+ }
94
+
30
95
  /**
31
96
  * Registers a new locale or updates an existing one
32
97
  * @param localeCode BCP 47 language code (e.g., 'en', 'fr-FR')
@@ -36,20 +101,25 @@ class LocalizationImpl {
36
101
  if (!localeCode || typeof localeCode !== 'string') {
37
102
  throw new Error('Locale code must be a non-empty string');
38
103
  }
39
- this.availableLocales[localeCode] = localeData;
104
+ this.loadedLocales[localeCode] = localeData;
40
105
  }
41
106
 
42
107
  /**
43
- * Sets the current locale by language code
44
- * @param localeCode BCP 47 language code (e.g., 'en', 'fr-FR')
45
- * @returns boolean indicating if the locale was set successfully
108
+ * Sets the current locale by language code, loading it dynamically if needed
109
+ * @param localeCode BCP 47 language code (e.g., 'en', 'fr')
110
+ * @returns Promise indicating if the locale was set successfully
46
111
  */
47
- public setLocale(localeCode: string): boolean {
48
- if (!(localeCode in this.availableLocales)) {
112
+ public async setLocale(localeCode: string): Promise<boolean> {
113
+ if (!(localeCode in this.loadedLocales)) {
114
+ await this.loadLocale(localeCode);
115
+ }
116
+
117
+ if (!(localeCode in this.loadedLocales)) {
49
118
  console.warn(`Locale '${localeCode}' is not available`);
50
119
  return false;
51
120
  }
52
- this.locale = this.availableLocales[localeCode];
121
+
122
+ this.locale = this.loadedLocales[localeCode];
53
123
  this.currentLocaleCode = localeCode;
54
124
  return true;
55
125
  }
@@ -65,7 +135,7 @@ class LocalizationImpl {
65
135
  * Gets a list of available locale codes
66
136
  */
67
137
  public getAvailableLocales(): string[] {
68
- return Object.keys(this.availableLocales);
138
+ return SUPPORTED_LANGUAGES;
69
139
  }
70
140
 
71
141
  private getNestedValue(obj: any, path: string): string | L10nString | undefined {
@@ -93,7 +163,7 @@ class LocalizationImpl {
93
163
 
94
164
  // If not found and current locale is not English, try falling back to English
95
165
  if (value === undefined && this.currentLocaleCode !== 'en') {
96
- value = this.getNestedValue(this.availableLocales['en'], key);
166
+ value = this.getNestedValue(this.loadedLocales['en'], key);
97
167
  }
98
168
 
99
169
  // If we have a value, return it with proper formatting
@@ -0,0 +1 @@
1
+ export const SUPPORTED_LANGUAGES = ['en', 'ar', 'da', 'fr', 'it', 'pt_PT', 'sv'];
@@ -5,7 +5,7 @@ export declare class LocalizedString {
5
5
  readonly translations: {
6
6
  [key: string]: string;
7
7
  };
8
- static readonly UNDEFINED_LANGUAGE = "undefined";
8
+ static readonly UNDEFINED_LANGUAGE = "und";
9
9
  static readonly LANGUAGE_EN = "en";
10
10
  /**
11
11
  * translations can be a string or a collection of language/translation pairs,
@@ -2,14 +2,23 @@ export interface L10nString {
2
2
  compact: string;
3
3
  descriptive: string;
4
4
  }
5
- type LocaleData = Record<string, any>;
5
+ type LocaleValue = string | L10nString | LocaleData;
6
+ interface LocaleData {
7
+ [key: string]: LocaleValue | LocaleValue[];
8
+ }
6
9
  declare class LocalizationImpl {
7
10
  private static instance;
8
11
  private currentLocaleCode;
9
12
  private locale;
10
- private availableLocales;
13
+ private loadedLocales;
11
14
  private constructor();
12
15
  static getInstance(): LocalizationImpl;
16
+ /**
17
+ * Loads a locale dynamically
18
+ * @param localeCode BCP 47 language code (e.g., 'en', 'fr')
19
+ * @returns Promise indicating if the locale was loaded successfully
20
+ */
21
+ loadLocale(localeCode: string): Promise<boolean>;
13
22
  /**
14
23
  * Registers a new locale or updates an existing one
15
24
  * @param localeCode BCP 47 language code (e.g., 'en', 'fr-FR')
@@ -17,11 +26,11 @@ declare class LocalizationImpl {
17
26
  */
18
27
  registerLocale(localeCode: string, localeData: LocaleData): void;
19
28
  /**
20
- * Sets the current locale by language code
21
- * @param localeCode BCP 47 language code (e.g., 'en', 'fr-FR')
22
- * @returns boolean indicating if the locale was set successfully
29
+ * Sets the current locale by language code, loading it dynamically if needed
30
+ * @param localeCode BCP 47 language code (e.g., 'en', 'fr')
31
+ * @returns Promise indicating if the locale was set successfully
23
32
  */
24
- setLocale(localeCode: string): boolean;
33
+ setLocale(localeCode: string): Promise<boolean>;
25
34
  /**
26
35
  * Gets the current locale code (BCP 47)
27
36
  */
@@ -0,0 +1 @@
1
+ export declare const SUPPORTED_LANGUAGES: string[];