From 1bb19f65a2437ffce94ca291bb293e41363956e9 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Thu, 8 Apr 2021 17:06:09 +0200 Subject: [PATCH] Allow to lazily load therms --- src/bin/generate-i18n-messages.ts | 4 +-- src/lib/i18n/KcLanguageTag.ts | 6 ++-- .../account.ts | 2 +- .../admin.ts | 2 +- .../email.ts | 2 +- .../login.ts | 2 +- src/lib/i18n/kcMessages/login.ts | 33 +++++++++++++++++++ src/lib/i18n/useKcMessage.tsx | 17 ++++++---- src/lib/index.ts | 2 ++ 9 files changed, 55 insertions(+), 15 deletions(-) rename src/lib/i18n/{generated_messages => generated_kcMessages}/account.ts (99%) rename src/lib/i18n/{generated_messages => generated_kcMessages}/admin.ts (99%) rename src/lib/i18n/{generated_messages => generated_kcMessages}/email.ts (99%) rename src/lib/i18n/{generated_messages => generated_kcMessages}/login.ts (99%) create mode 100644 src/lib/i18n/kcMessages/login.ts diff --git a/src/bin/generate-i18n-messages.ts b/src/bin/generate-i18n-messages.ts index 51c76ceb..539163be 100644 --- a/src/bin/generate-i18n-messages.ts +++ b/src/bin/generate-i18n-messages.ts @@ -49,7 +49,7 @@ crawl(".").forEach(filePath => { child_process.execSync(`rm -r ${tmpDirPath}`); -const targetDirPath = pathJoin(getProjectRoot(), "src", "lib", "i18n", "generated_messages"); +const targetDirPath = pathJoin(getProjectRoot(), "src", "lib", "i18n", "generated_kcMessages"); fs.mkdirSync(targetDirPath, { "recursive": true }); @@ -65,7 +65,7 @@ Object.keys(record).forEach(pageType => { '//PLEASE DO NOT EDIT MANUALLY', '', '/* spell-checker: disable */', - `export const messages= ${JSON.stringify(record[pageType], null, 2)};`, + `export const kcMessages= ${JSON.stringify(record[pageType], null, 2)};`, '/* spell-checker: enable */' ].join("\n"), "utf8") ); diff --git a/src/lib/i18n/KcLanguageTag.ts b/src/lib/i18n/KcLanguageTag.ts index 38d3775d..21559547 100644 --- a/src/lib/i18n/KcLanguageTag.ts +++ b/src/lib/i18n/KcLanguageTag.ts @@ -1,8 +1,8 @@ import { objectKeys } from "evt/tools/typeSafety/objectKeys"; -import { messages } from "./generated_messages/login"; +import { kcMessages } from "./kcMessages/login"; -export type KcLanguageTag = keyof typeof messages; +export type KcLanguageTag = keyof typeof kcMessages; export type LanguageLabel = /* spell-checker: disable */ @@ -40,7 +40,7 @@ export function getKcLanguageTagLabel(language: KcLanguageTag): LanguageLabel { } -const availableLanguages = objectKeys(messages); +const availableLanguages = objectKeys(kcMessages); /** * Pass in "fr-FR" or "français" for example, it will return the AvailableLanguage diff --git a/src/lib/i18n/generated_messages/account.ts b/src/lib/i18n/generated_kcMessages/account.ts similarity index 99% rename from src/lib/i18n/generated_messages/account.ts rename to src/lib/i18n/generated_kcMessages/account.ts index fd5bf3a2..b7f27c16 100644 --- a/src/lib/i18n/generated_messages/account.ts +++ b/src/lib/i18n/generated_kcMessages/account.ts @@ -2,7 +2,7 @@ //PLEASE DO NOT EDIT MANUALLY /* spell-checker: disable */ -export const messages= { +export const kcMessages= { "ca": { "doSave": "Desa", "doCancel": "Cancel·la", diff --git a/src/lib/i18n/generated_messages/admin.ts b/src/lib/i18n/generated_kcMessages/admin.ts similarity index 99% rename from src/lib/i18n/generated_messages/admin.ts rename to src/lib/i18n/generated_kcMessages/admin.ts index c43ad309..2271423b 100644 --- a/src/lib/i18n/generated_messages/admin.ts +++ b/src/lib/i18n/generated_kcMessages/admin.ts @@ -2,7 +2,7 @@ //PLEASE DO NOT EDIT MANUALLY /* spell-checker: disable */ -export const messages= { +export const kcMessages= { "ca": { "invalidPasswordHistoryMessage": "Contrasenya incorrecta: no pot ser igual a cap de les últimes {0} contrasenyes.", "invalidPasswordMinDigitsMessage": "Contraseña incorrecta: debe contener al menos {0} caracteres numéricos.", diff --git a/src/lib/i18n/generated_messages/email.ts b/src/lib/i18n/generated_kcMessages/email.ts similarity index 99% rename from src/lib/i18n/generated_messages/email.ts rename to src/lib/i18n/generated_kcMessages/email.ts index 2d94b032..715c5397 100644 --- a/src/lib/i18n/generated_messages/email.ts +++ b/src/lib/i18n/generated_kcMessages/email.ts @@ -2,7 +2,7 @@ //PLEASE DO NOT EDIT MANUALLY /* spell-checker: disable */ -export const messages= { +export const kcMessages= { "ca": { "emailVerificationSubject": "Verificació d'email", "emailVerificationBody": "Algú ha creat un compte de {2} amb aquesta adreça de correu electrònic. Si has estat tu, fes clic a l'enllaç següent per verificar la teva adreça de correu electrònic.\n\n{0}\n\nAquest enllaç expirarà en {1} minuts.\n\nSi tu no has creat aquest compte, simplement ignora aquest missatge.", diff --git a/src/lib/i18n/generated_messages/login.ts b/src/lib/i18n/generated_kcMessages/login.ts similarity index 99% rename from src/lib/i18n/generated_messages/login.ts rename to src/lib/i18n/generated_kcMessages/login.ts index aa862552..6b62db87 100644 --- a/src/lib/i18n/generated_messages/login.ts +++ b/src/lib/i18n/generated_kcMessages/login.ts @@ -2,7 +2,7 @@ //PLEASE DO NOT EDIT MANUALLY /* spell-checker: disable */ -export const messages= { +export const kcMessages= { "ca": { "doLogIn": "Inicia sessió", "doRegister": "Registra't", diff --git a/src/lib/i18n/kcMessages/login.ts b/src/lib/i18n/kcMessages/login.ts new file mode 100644 index 00000000..f0e78a68 --- /dev/null +++ b/src/lib/i18n/kcMessages/login.ts @@ -0,0 +1,33 @@ + +import { kcMessages } from "../generated_kcMessages/login"; +import { Evt } from "evt"; +import { objectKeys } from "evt/tools/typeSafety/objectKeys"; + +export const evtTermsUpdated = Evt.asNonPostable(Evt.create()); + +objectKeys(kcMessages).forEach(kcLanguage => + Object.defineProperty( + kcMessages[kcLanguage], + "termsText", + (() => { + + let value = kcMessages[kcLanguage].termsText; + + return { + "enumerable": true, + "get": () => value, + "set": (newValue: string) => { + + Evt.asPostable(evtTermsUpdated).post(); + + value = newValue; + } + }; + + + })() + ) +); + +export { kcMessages }; + diff --git a/src/lib/i18n/useKcMessage.tsx b/src/lib/i18n/useKcMessage.tsx index ade551b3..3b745e9c 100644 --- a/src/lib/i18n/useKcMessage.tsx +++ b/src/lib/i18n/useKcMessage.tsx @@ -1,21 +1,26 @@ -import { useCallback } from "react"; +import { useCallback, useReducer } from "react"; import { useKcLanguageTag } from "./useKcLanguageTag"; -import { messages } from "./generated_messages/login"; +import { kcMessages, evtTermsUpdated } from "./kcMessages/login"; import type { ReactNode } from "react"; +import { useEvt } from "evt/hooks"; //@ts-ignore import * as markdown from "markdown"; -export type MessageKey = keyof typeof messages["en"]; +export type MessageKey = keyof typeof kcMessages["en"]; export function useKcMessage() { const { kcLanguageTag } = useKcLanguageTag(); + const [trigger, forceUpdate] = useReducer((counter: number) => counter + 1, 0); + + useEvt(ctx => evtTermsUpdated.attach(ctx, forceUpdate), []); + const msgStr = useCallback( (key: MessageKey, ...args: (string | undefined)[]): string => { - let str: string = messages[kcLanguageTag as any as "en"][key] ?? messages["en"][key]; + let str: string = kcMessages[kcLanguageTag as any as "en"][key] ?? kcMessages["en"][key]; args.forEach((arg, i) => { @@ -30,7 +35,7 @@ export function useKcMessage() { return str; }, - [kcLanguageTag] + [kcLanguageTag, trigger] ); const msg = useCallback<(...args: Parameters) => ReactNode>( @@ -43,7 +48,7 @@ export function useKcMessage() { }} /> , - [kcLanguageTag] + [kcLanguageTag, trigger] ); return { msg, msgStr }; diff --git a/src/lib/index.ts b/src/lib/index.ts index ad1e2016..7c588925 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -3,6 +3,7 @@ export * from "./KcContext"; export * from "./i18n/KcLanguageTag"; export * from "./i18n/useKcLanguageTag"; export * from "./i18n/useKcMessage"; +export * from "./i18n/kcMessages/login"; export * from "./components/KcProps"; export * from "./components/Login"; @@ -16,4 +17,5 @@ export * from "./keycloakJsAdapter"; export * from "./tools/assert"; + export * as kcContextMocks from "./kcContextMocks"; \ No newline at end of file