Files
simple-react-app-kit/packages/i18n/src/runtime/hooks.ts
T

88 lines
2.1 KiB
TypeScript
Raw Normal View History

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
}