import * as React from "react" import { useLingui } from "@lingui/react" import { I18nRuntimeContext } from "./context" import { createIntlFormatters } from "./intl-formatters" import type { IntlFormatters, LocaleDefinition, MessageDescriptor, MessageId, MessageOptions, MessageValues, TranslateFunction, } from "./types" export function useTranslate(): TranslateFunction { const { i18n } = useLingui() return React.useCallback( (descriptor, values) => i18n._({ ...descriptor, values: values ?? descriptor.values, }), [i18n] ) } export function useMessage(descriptor: MessageDescriptor): string export function useMessage( id: MessageId, values?: MessageValues, options?: MessageOptions ): string export function useMessage( descriptorOrId: MessageDescriptor | MessageId, values?: MessageValues, options?: MessageOptions ) { const { i18n } = useLingui() return React.useMemo( () => typeof descriptorOrId === "string" ? i18n._(descriptorOrId, values, options) : i18n._({ ...descriptorOrId, values: values ?? descriptorOrId.values, }), [descriptorOrId, i18n, options, values] ) } export function useLocale(): string { return useLocaleDefinition().locale } export function useLocaleDefinition(): LocaleDefinition { const runtime = React.useContext(I18nRuntimeContext) const { i18n } = useLingui() return ( runtime?.locale ?? { label: i18n.locale, languageTag: i18n.locale, locale: i18n.locale, } ) } export function useLocales(): readonly LocaleDefinition[] { const runtime = React.useContext(I18nRuntimeContext) const activeLocale = useLocaleDefinition() return runtime?.locales ?? [activeLocale] } export function useFormatters(): IntlFormatters { const runtime = React.useContext(I18nRuntimeContext) const locale = useLocaleDefinition() const fallbackFormatters = React.useMemo( () => createIntlFormatters(locale.languageTag ?? locale.locale), [locale.languageTag, locale.locale] ) return runtime?.formatters ?? fallbackFormatters }