// ======================================== // useLocale Hook // ======================================== // Convenient hook for locale management import { useCallback, useMemo } from 'react'; import { useAppStore, selectLocale } from '../stores/appStore'; import type { Locale } from '../types/store'; import { availableLocales, formatMessage } from '../lib/i18n'; export interface UseLocaleReturn { /** Current locale ('en' or 'zh') */ locale: Locale; /** Set locale preference */ setLocale: (locale: Locale) => void; /** Available locales with display names */ availableLocales: Record; } /** * Hook for managing locale state * @returns Locale state and actions * * @example * ```tsx * const { locale, setLocale, availableLocales } = useLocale(); * * return ( * * ); * ``` */ export function useLocale(): UseLocaleReturn { const locale = useAppStore(selectLocale); const setLocaleAction = useAppStore((state) => state.setLocale); const setLocale = useCallback( (newLocale: Locale) => { setLocaleAction(newLocale); }, [setLocaleAction] ); return { locale, setLocale, availableLocales, }; } /** * Hook to format i18n messages with the current locale * @returns A formatMessage function for translating message IDs * * Supports both string and react-intl descriptor formats: * - formatMessage('home.title') * - formatMessage({ id: 'home.title' }) * * @example * ```tsx * const formatMessage = useFormatMessage(); * return

{formatMessage('home.title')}

; * ``` */ export function useFormatMessage(): ( idOrDescriptor: string | { id: string; defaultMessage?: string }, values?: Record ) => string { // Use useMemo to avoid recreating the function on each render return useMemo(() => { return (idOrDescriptor: string | { id: string; defaultMessage?: string }, values?: Record) => { const id = typeof idOrDescriptor === 'string' ? idOrDescriptor : idOrDescriptor.id; return formatMessage(id, values); }; }, []); }