keycloak_theme/src/lib/i18n/useKcMessage.tsx

45 lines
1.1 KiB
TypeScript
Raw Normal View History

import { useCallback } from "react";
2021-03-02 23:48:31 +01:00
import { useKcLanguageTag } from "./useKcLanguageTag";
import { messages } from "./generated_messages/login";
2021-03-01 20:45:37 +01:00
import type { ReactNode } from "react";
2021-03-02 22:48:36 +01:00
import { id } from "evt/tools/typeSafety/id";
2021-03-02 22:48:36 +01:00
export type MessageKey = keyof typeof messages["en"];
2021-03-07 15:37:37 +01:00
export function useKcMessage() {
2021-03-02 23:48:31 +01:00
const { kcLanguageTag } = useKcLanguageTag();
const msgStr = useCallback(
2021-03-02 22:48:36 +01:00
(key: MessageKey, ...args: (string | undefined)[]): string => {
2021-03-02 23:48:31 +01:00
let str: string = messages[kcLanguageTag as any as "en"][key] ?? messages["en"][key];
2021-03-01 20:45:37 +01:00
args.forEach((arg, i) => {
if (arg === undefined) {
return;
}
2021-03-02 22:48:36 +01:00
str = str.replace(new RegExp(`\\{${i}\\}`, "g"), arg);
2021-03-01 20:45:37 +01:00
});
2021-03-02 22:48:36 +01:00
return str;
},
[kcLanguageTag]
);
const msg = useCallback(
2021-03-07 15:37:37 +01:00
id<(...args: Parameters<typeof msgStr>) => ReactNode>(
2021-03-02 22:48:36 +01:00
(key, ...args) =>
2021-03-07 15:37:37 +01:00
<span className={key} dangerouslySetInnerHTML={{ "__html": msgStr(key, ...args) }} />
),
[kcLanguageTag]
2021-03-02 22:48:36 +01:00
);
2021-03-07 15:37:37 +01:00
return { msg, msgStr };
}