feat: add i18n component for rendering html from a localized string
parent
e88195d2cd
commit
458ee3cce4
@ -0,0 +1,47 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import type {
|
||||||
|
GetMessageArgs,
|
||||||
|
I18nProps,
|
||||||
|
LocalizerDictionary,
|
||||||
|
LocalizerToken,
|
||||||
|
} from '../../types/Localizer';
|
||||||
|
|
||||||
|
import { SessionHtmlRenderer } from './SessionHTMLRenderer';
|
||||||
|
|
||||||
|
/** An array of supported html tags to render if found in a string */
|
||||||
|
const supportedFormattingTags = ['b', 'i', 'u', 's'];
|
||||||
|
|
||||||
|
/** A regex to match supported formatting tags */
|
||||||
|
const formattingTagRegex = new RegExp(
|
||||||
|
`<(?:${supportedFormattingTags.join('|')})>.*?</(?:${supportedFormattingTags.join('|')})>`,
|
||||||
|
'g'
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve a localized message string, substituting dynamic parts where necessary and formatting it as HTML if necessary.
|
||||||
|
*
|
||||||
|
* @param token - The token identifying the message to retrieve and an optional record of substitution variables and their replacement values.
|
||||||
|
* @param args - An optional record of substitution variables and their replacement values. This is required if the string has dynamic parts.
|
||||||
|
*
|
||||||
|
* @returns The localized message string with substitutions and formatting applied.
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* ```tsx
|
||||||
|
* <I18n token="about" />
|
||||||
|
* <I18n token="disappearingMessagesFollowSettingOn" args={{ time: 10, type: 'mode' }} />
|
||||||
|
* ```
|
||||||
|
*/
|
||||||
|
export const I18n = <T extends LocalizerToken>(props: I18nProps<T>) => {
|
||||||
|
const i18nArgs = 'args' in props ? props.args : undefined;
|
||||||
|
|
||||||
|
const i18nString = window.i18n<T, LocalizerDictionary[T]>(
|
||||||
|
...([props.token, i18nArgs] as GetMessageArgs<T>)
|
||||||
|
);
|
||||||
|
|
||||||
|
/** If the string contains a relevant formatting tag, render it as HTML */
|
||||||
|
if (i18nString.match(formattingTagRegex)) {
|
||||||
|
return <SessionHtmlRenderer html={i18nString} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
return <>{i18nString}</>;
|
||||||
|
};
|
||||||
Loading…
Reference in New Issue