11import { get } from 'lodash-es' ;
22
3- import type { Language } from './types/core.d.ts ' ;
3+ import type { Language } from './types/core.js ' ;
44
5- type LanguageChangeHandler = ( this : void , language : Language ) => void ;
5+ /** @alpha */
6+ export type LanguageChangeHandler = ( this : void , language : Language ) => void ;
67
7- type TranslationKey < T extends { [ key : string ] : unknown } , Key = keyof T > = Key extends string
8+ /** @alpha */
9+ export type TranslationKey < T extends { [ key : string ] : unknown } , Key = keyof T > = Key extends string
810 ? T [ Key ] extends { [ key : string ] : unknown }
911 ? T [ Key ] extends { [ K in Language ] : string }
1012 ? Key
1113 : `${Key } .${TranslationKey < T [ Key ] > } `
1214 : `${Key } `
1315 : never ;
1416
15- type I18N < T extends { [ key : string ] : unknown } > = {
17+ /** @alpha */
18+ export type I18N < T extends { [ key : string ] : unknown } > = {
19+ changeLanguage : ( language : Language ) => void ;
1620 readonly resolvedLanguage : Language ;
1721 set onLanguageChange ( value : LanguageChangeHandler ) ;
1822 readonly t : ( key : TranslationKey < T > ) => string ;
1923} ;
2024
21- export function createInstance < const T extends { [ key : string ] : unknown } > ( {
25+ /** @alpha */
26+ export function createI18Next < const T extends { [ key : string ] : unknown } > ( {
2227 fallbackLanguage = 'en' ,
2328 translations
2429} : {
@@ -28,8 +33,12 @@ export function createInstance<const T extends { [key: string]: unknown }>({
2833 let resolvedLanguage : Language ;
2934 let handleLanguageChange : LanguageChangeHandler | null = null ;
3035
36+ if ( ! window ) {
37+ throw new Error ( 'Window is not defined' ) ;
38+ }
39+
3140 const documentElement = window . top ! . document . documentElement ;
32- const extractLanguageProperty = ( element : HTMLElement ) : Language => {
41+ const extractLanguageProperty = ( element : HTMLElement ) => {
3342 if ( element . lang === 'en' || element . lang === 'fr' ) {
3443 return element . lang ;
3544 }
@@ -51,16 +60,21 @@ export function createInstance<const T extends { [key: string]: unknown }>({
5160 languageAttributeObserver . observe ( documentElement , { attributes : true } ) ;
5261
5362 return {
63+ changeLanguage : ( language ) => {
64+ window . top ! . document . dispatchEvent ( new CustomEvent ( 'changeLanguage' , { detail : language } ) ) ;
65+ } ,
5466 set onLanguageChange ( handler : LanguageChangeHandler ) {
5567 handleLanguageChange = handler ;
5668 } ,
57- resolvedLanguage,
69+ get resolvedLanguage ( ) {
70+ return resolvedLanguage ;
71+ } ,
5872 t : ( key ) => {
59- const value = get ( translations , key ) as { [ K in Language ] ? : string } | string ;
73+ const value = get ( translations , key ) as { [ key : string ] : string } | string | undefined ;
6074 if ( typeof value === 'string' ) {
6175 return value ;
6276 }
63- return value [ resolvedLanguage ] ?? value [ fallbackLanguage ] ?? key ;
77+ return value ?. [ resolvedLanguage ] ?? value ?. [ fallbackLanguage ] ?? key ;
6478 }
6579 } ;
6680}
0 commit comments