UNPKG

@tanosugi/better-auth-utils

Version:

Better Auth Utils

80 lines (79 loc) 2.91 kB
"use client"; import { useEffect, useState } from "react"; import { getUILocaleDict } from "./locales/ui"; function browserLocale() { let lang; if (typeof navigator !== "undefined") { lang = navigator.language || (Array.isArray(navigator.languages) && navigator.languages.length > 0 ? navigator.languages[0] : undefined); } return (lang ?? "en").split("-")[0] || "en"; } // UIローカライズ辞書取得hook(CSR専用) export function useUILocaleDict(locale, apiRoute) { const resolvedLocale = locale ?? browserLocale(); const [data, setData] = useState(undefined); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { // localStorageから取得 let localDict = undefined; if (typeof window !== "undefined") { const stored = localStorage.getItem(`ui-locale-dict-${resolvedLocale}`); if (stored) { try { localDict = JSON.parse(stored); setData(localDict); setIsLoading(false); } catch (e) { // パース失敗時は削除 localStorage.removeItem(`ui-locale-dict-${resolvedLocale}`); } } } if (localDict) return; setIsLoading(true); setError(null); (async () => { try { let dict; if (apiRoute) { // API経由で取得 const res = await fetch(`${apiRoute}?locale=${resolvedLocale}`); if (!res.ok) throw new Error(`API fetch failed: ${res.status}`); dict = await res.json(); } else { // 直接importで取得 dict = await getUILocaleDict(resolvedLocale); } setData(dict); setIsLoading(false); // localStorageに保存 if (typeof window !== "undefined") { try { localStorage.setItem(`ui-locale-dict-${resolvedLocale}`, JSON.stringify(dict)); } catch (e) { // 保存失敗時は何もしない } } } catch (e) { setError(e); setIsLoading(false); // エラー時はlocalStorageからも削除 if (typeof window !== "undefined") { localStorage.removeItem(`ui-locale-dict-${resolvedLocale}`); } } })(); }, [resolvedLocale, apiRoute]); return { data, isLoading, error }; }