@tanosugi/better-auth-utils
Version:
Better Auth Utils
80 lines (79 loc) • 2.91 kB
JavaScript
"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 };
}