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('|')})>.*?`, '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. * @param as - An optional HTML tag to render the component as. Defaults to a fragment, unless the string contains html tags. In that case, it will render as HTML in a div tag. * * @returns The localized message string with substitutions and formatting applied. * * @example * ```tsx * * * * ``` */ export const I18n = (props: I18nProps) => { const i18nArgs = 'args' in props ? props.args : undefined; const i18nString = window.i18n( ...([props.token, i18nArgs] as GetMessageArgs) ); /** If the string contains a relevant formatting tag, render it as HTML */ if (i18nString.match(formattingTagRegex)) { return ; } const Comp = props.as ?? React.Fragment; return {i18nString}; };