import React, { useEffect } from 'react'; import { LocaleKey, LocaleMessages } from '../components'; import { PrimitiveType } from 'intl-messageformat'; import { useIntl } from 'react-intl'; import { useSynced } from '@airtable/blocks/ui'; import { GlobalSettingsKeys } from './useGlobalSettings'; export type SupportedLocales = 'en-US' | 'en' | 'zh' | 'zh-CN'; function importMessages(locale: SupportedLocales): Promise<LocaleMessages> { switch (locale) { case 'en': case 'en-US': default: return import('../locales/en-US').then((m) => m.default); case 'zh': case 'zh-CN': return import('../locales/zh-CN').then((m) => m.default); } } /** * */ export const useI18n = () => { const [syncData, setLocale, canSetValue] = useSynced( GlobalSettingsKeys.LANGUAGE ); const locale = (syncData || navigator.language) as SupportedLocales; const [messages, setMessages] = React.useState<LocaleMessages | null>(null); useEffect(() => { importMessages(locale)?.then(setMessages); }, [locale]); return { locale, messages, setLocale, canSetValue }; }; export const useFormatMessage = (): (( id: LocaleKey, // only accepts valid keys, not any string values?: Record<string, PrimitiveType> ) => string) => { const intl = useIntl(); return (id, values) => intl.formatMessage({ id }, values); };