Skip to content

Commit 6584328

Browse files
committed
chore(i18n): bump @solid-primitives/i18n and fix HMR
1 parent 9d76769 commit 6584328

25 files changed

+824
-52
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
"@emailjs/browser": "^3.11.0",
3939
"@lottiefiles/lottie-player": "^2.0.2",
4040
"@motionone/solid": "^10.16.2",
41-
"@solid-primitives/i18n": "^1.4.0",
41+
"@solid-primitives/i18n": "^2.0.0",
4242
"@solidjs/meta": "^0.28.5",
4343
"@solidjs/router": "^0.8.2",
4444
"@suid/icons-material": "^0.6.9",

pnpm-lock.yaml

Lines changed: 4 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,36 @@
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';
25

36
import type { ParentComponent } from 'solid-js';
7+
import type { Dictionaries, Dictionary, I18nContextModel, Locale } from '~/models';
8+
9+
import { I18nContext } from '~/services/i18n';
410

5-
type CreateI18nContextInputs = Parameters<typeof createI18nContext>;
611
export type I18nProviderProps = {
7-
initialDictionary?: CreateI18nContextInputs[0];
8-
initialLocale?: CreateI18nContextInputs[1];
12+
initialDictionaries?: Dictionaries;
13+
initialLocale?: Locale;
914
};
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>;
1334
};
1435

1536
export default I18nContext;

src/components/common/i18n/i18n-hmr.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
import { useI18n } from '@solid-primitives/i18n';
2-
31
import type { Component } from 'solid-js';
42

3+
import { useI18n } from '~/services/i18n';
4+
55
export const I18nHmr: Component = () => {
6-
const [, { add }] = useI18n();
6+
const [, { setDictionaries }] = useI18n();
77

88
if (import.meta.hot) {
99
import.meta.hot.on('virtual:vite-plugin-i18n', ({ data }) => {
10-
if (data) Object.keys(data).forEach(lang => add(lang, data[lang]));
10+
if (data) setDictionaries(data);
1111
});
1212
}
1313

src/components/common/i18n/i18n-provider.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
// @ts-expect-error -- TODO: fix typing
22
import { locales } from 'virtual:vite-plugin-i18n';
33

4-
import { I18nContext } from './i18n-context';
4+
import { I18nContextProvider } from './i18n-context';
55

66
import I18nHmr from './i18n-hmr';
77

88
import type { ParentComponent } from 'solid-js';
99

10-
export const I18nProvider: ParentComponent<{ initialLocale?: string }> = props => {
10+
import type { Locale } from '~/models';
11+
12+
export const I18nProvider: ParentComponent<{ initialLocale?: Locale }> = props => {
1113
const user = navigator.language;
1214
const fallback = user === 'fr' ? 'fr' : 'en';
1315
return (
14-
<I18nContext initialDictionary={locales} initialLocale={props.initialLocale ?? fallback}>
16+
<I18nContextProvider initialDictionaries={locales} initialLocale={props.initialLocale ?? fallback}>
1517
<I18nHmr />
1618
{props.children}
17-
</I18nContext>
19+
</I18nContextProvider>
1820
);
1921
};
2022

src/components/common/navbar/navbar-header.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { useI18n } from '@solid-primitives/i18n';
21
import { useNavigate } from '@solidjs/router';
32
import { Button, Stack, useMediaQuery } from '@suid/material';
43

@@ -9,6 +8,7 @@ import StackSvg from 'line-md/svg/text-box-multiple.svg?component-solid';
98
import type { Component } from 'solid-js';
109

1110
import { Routes, useNavbar } from '~/services';
11+
import { useI18n } from '~/services/i18n';
1212
import { BreakPoints, BreakPointsStop } from '~/themes';
1313

1414
export const NavbarHeader: Component = () => {

src/components/common/navbar/navbar.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { useI18n } from '@solid-primitives/i18n';
21
import { Link } from '@solidjs/router';
32

43
import { Box } from '@suid/material';
@@ -18,6 +17,7 @@ import { GithubLoop } from '~/components/common/svg';
1817

1918
import { AppLink } from '~/models';
2019
import { RoutesMeta, useNavbar, useRouteData } from '~/services';
20+
import { useI18n } from '~/services/i18n';
2121
import { BreakPointsStop } from '~/themes';
2222
import { camelToSnakeCase } from '~/utils';
2323

src/components/common/router/route-data.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
import { useI18n } from '@solid-primitives/i18n';
2-
31
import { createEffect } from 'solid-js';
42

53
import type { Component } from 'solid-js';
64

75
import { useRouteData } from '~/services';
6+
import { useI18n } from '~/services/i18n';
87

98
export const RouteData: Component = () => {
109
const [t] = useI18n();

src/components/common/stack/stack.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { useI18n } from '@solid-primitives/i18n';
21
import { useNavigate } from '@solidjs/router';
32

43
import { Box } from '@suid/material';
@@ -12,6 +11,7 @@ import type { JSX, ParentComponent } from 'solid-js';
1211

1312
import { StackPageTransition } from '~/components/common/stack/stack-page-transition';
1413
import { RoutesMetas, useNavbar, useRouteData } from '~/services';
14+
import { useI18n } from '~/services/i18n';
1515
import { Colors } from '~/themes';
1616

1717
type TransformOptions = { offset?: number; brightness?: number } & Omit<JSX.CSSProperties, 'offset' | 'filter' | 'transform'>;

src/components/common/sw/reload.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
import { useI18n } from '@solid-primitives/i18n';
21
import DownloadSvg from 'line-md/svg/downloading-loop.svg?component-solid';
32

43
import { toast } from 'solid-toast';
54
import { useRegisterSW } from 'virtual:pwa-register/solid';
65

76
import type { Component } from 'solid-js';
87

8+
import { useI18n } from '~/services/i18n';
9+
910
export const Reload: Component = () => {
1011
const [t] = useI18n();
1112

0 commit comments

Comments
 (0)