码桶

发现社区成员的开源项目

main
useTranslate.ts1.3 KB
import { useState, useEffect, useCallback } from 'react';
import zhStrings from '../utils/lang/zh.js';
import langModules from '../utils/translations.js';

type Lang = 'zh' | 'en' | 'ja' | 'ko';
const langCycle: Lang[] = ['zh', 'en', 'ja', 'ko'];

// Pre-populate cache with zh (default) for instant availability
const cache: Record<string, Record<string, string>> = { zh: zhStrings };

const useTranslate = () => {
    const [lang, setLang] = useState<Lang>(
        (localStorage.getItem('lang') as Lang) || 'zh'
    );
    const [strings, setStrings] = useState<Record<string, string>>(cache[lang] || {});

    useEffect(() => {
        if (cache[lang]) { setStrings(cache[lang]); return; }
        langModules[lang]().then((mod: any) => {
            cache[lang] = mod.default;
            setStrings(mod.default);
        });
    }, [lang]);

    const t = useCallback((key: string): string => strings[key] || key, [strings]);

    const changeLang = (l: Lang) => {
        setLang(l);
        localStorage.setItem('lang', l);
    };

    const toggleLang = () => {
        const idx = langCycle.indexOf(lang);
        const next = langCycle[(idx + 1) % langCycle.length];
        changeLang(next);
    };

    return { t, lang, changeLang, toggleLang };
};

export default useTranslate;