|
1 | | -import { createI18nContext, I18nContext as I18nSolidContext } from '@solid-primitives/i18n'; |
| 1 | +import { flatten } from '@solid-primitives/i18n'; |
| 2 | + |
| 3 | +import { createMemo, createSignal } from 'solid-js'; |
| 4 | +import { createStore } from 'solid-js/store'; |
2 | 5 |
|
3 | 6 | import type { ParentComponent } from 'solid-js'; |
| 7 | +import type { Dictionaries, Dictionary, I18nContextModel, Locale } from '~/models'; |
| 8 | + |
| 9 | +import { I18nContext } from '~/services/i18n'; |
4 | 10 |
|
5 | | -type CreateI18nContextInputs = Parameters<typeof createI18nContext>; |
6 | 11 | export type I18nProviderProps = { |
7 | | - initialDictionary?: CreateI18nContextInputs[0]; |
8 | | - initialLocale?: CreateI18nContextInputs[1]; |
| 12 | + initialDictionaries?: Dictionaries; |
| 13 | + initialLocale?: Locale; |
9 | 14 | }; |
10 | | -export const I18nContext: ParentComponent<I18nProviderProps> = props => { |
11 | | - const value = createI18nContext(props.initialDictionary, props.initialLocale); |
12 | | - return <I18nSolidContext.Provider value={value}>{props.children}</I18nSolidContext.Provider>; |
| 15 | +export const I18nContextProvider: ParentComponent<I18nProviderProps> = props => { |
| 16 | + const [locale, setLocale] = createSignal<Locale>(props.initialLocale ?? 'en'); |
| 17 | + const [dictionaries, setDictionaries] = createStore<Dictionaries>(props.initialDictionaries ?? { en: {} }); |
| 18 | + |
| 19 | + const dictionary = createMemo(() => dictionaries[locale()] ?? {}); |
| 20 | + const dictionaryFlat = createMemo(() => flatten(dictionary())); |
| 21 | + |
| 22 | + const setDictionary = (_locale: Locale, _dictionary: Dictionary) => setDictionaries(_was => ({ [_locale]: _dictionary })); |
| 23 | + const context: I18nContextModel = { |
| 24 | + dictionaries, |
| 25 | + dictionary, |
| 26 | + dictionaryFlat, |
| 27 | + locale, |
| 28 | + setLocale, |
| 29 | + setDictionary, |
| 30 | + setDictionaries, |
| 31 | + }; |
| 32 | + |
| 33 | + return <I18nContext.Provider value={context}>{props.children}</I18nContext.Provider>; |
13 | 34 | }; |
14 | 35 |
|
15 | 36 | export default I18nContext; |
0 commit comments