mirror of
https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web.git
synced 2025-10-01 23:56:39 +08:00
# Conflicts: # app/api/auth.ts # app/api/common.ts # app/azure.ts # app/client/api.ts # app/client/platforms/openai.ts # app/components/chat.tsx # app/components/settings.tsx # app/constant.ts # app/layout.tsx # app/masks/index.ts # app/store/chat.ts # app/store/config.ts # app/utils/hooks.ts # app/utils/model.ts # package.json # yarn.lock
140 lines
2.8 KiB
TypeScript
140 lines
2.8 KiB
TypeScript
import cn from "./cn";
|
|
import en from "./en";
|
|
// import pt from "./pt";
|
|
// import tw from "./tw";
|
|
// import id from "./id";
|
|
// import fr from "./fr";
|
|
// import es from "./es";
|
|
// import it from "./it";
|
|
// import tr from "./tr";
|
|
// import jp from "./jp";
|
|
// import de from "./de";
|
|
// import vi from "./vi";
|
|
// import ru from "./ru";
|
|
// import no from "./no";
|
|
// import cs from "./cs";
|
|
// import ko from "./ko";
|
|
// import ar from "./ar";
|
|
// import bn from "./bn";
|
|
// import sk from "./sk";
|
|
import { merge } from "../utils/merge";
|
|
|
|
import type { LocaleType } from "./cn";
|
|
export type { LocaleType, PartialLocaleType } from "./cn";
|
|
|
|
const ALL_LANGS = {
|
|
cn,
|
|
en,
|
|
// tw,
|
|
// pt,
|
|
// jp,
|
|
// ko,
|
|
// id,
|
|
// fr,
|
|
// es,
|
|
// it,
|
|
// tr,
|
|
// de,
|
|
// vi,
|
|
// ru,
|
|
// cs,
|
|
// no,
|
|
// ar,
|
|
// bn,
|
|
// sk,
|
|
};
|
|
|
|
export type Lang = keyof typeof ALL_LANGS;
|
|
|
|
export const AllLangs = Object.keys(ALL_LANGS) as Lang[];
|
|
|
|
export const ALL_LANG_OPTIONS: Record<Lang, string> = {
|
|
cn: "简体中文",
|
|
en: "English",
|
|
// pt: "Português",
|
|
// tw: "繁體中文",
|
|
// jp: "日本語",
|
|
// ko: "한국어",
|
|
// id: "Indonesia",
|
|
// fr: "Français",
|
|
// es: "Español",
|
|
// it: "Italiano",
|
|
// tr: "Türkçe",
|
|
// de: "Deutsch",
|
|
// vi: "Tiếng Việt",
|
|
// ru: "Русский",
|
|
// cs: "Čeština",
|
|
// no: "Nynorsk",
|
|
// ar: "العربية",
|
|
// bn: "বাংলা",
|
|
// sk: "Slovensky",
|
|
};
|
|
|
|
const LANG_KEY = "lang";
|
|
const DEFAULT_LANG = "en";
|
|
|
|
const fallbackLang = en;
|
|
const targetLang = ALL_LANGS[getLang()] as LocaleType;
|
|
|
|
// if target lang missing some fields, it will use fallback lang string
|
|
merge(fallbackLang, targetLang);
|
|
|
|
export default fallbackLang as LocaleType;
|
|
|
|
function getItem(key: string) {
|
|
try {
|
|
return localStorage.getItem(key);
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function setItem(key: string, value: string) {
|
|
try {
|
|
localStorage.setItem(key, value);
|
|
} catch {}
|
|
}
|
|
|
|
function getLanguage() {
|
|
try {
|
|
const locale = new Intl.Locale(navigator.language).maximize();
|
|
const region = locale?.region?.toLowerCase();
|
|
// 1. check region code in ALL_LANGS
|
|
if (AllLangs.includes(region as Lang)) {
|
|
return region as Lang;
|
|
}
|
|
// 2. check language code in ALL_LANGS
|
|
if (AllLangs.includes(locale.language as Lang)) {
|
|
return locale.language as Lang;
|
|
}
|
|
return DEFAULT_LANG;
|
|
} catch {
|
|
return DEFAULT_LANG;
|
|
}
|
|
}
|
|
|
|
export function getLang(): Lang {
|
|
const savedLang = getItem(LANG_KEY);
|
|
|
|
if (AllLangs.includes((savedLang ?? "") as Lang)) {
|
|
return savedLang as Lang;
|
|
}
|
|
|
|
return getLanguage();
|
|
}
|
|
|
|
export function changeLang(lang: Lang) {
|
|
setItem(LANG_KEY, lang);
|
|
location.reload();
|
|
}
|
|
|
|
export function getISOLang() {
|
|
const isoLangString: Record<string, string> = {
|
|
cn: "zh-Hans",
|
|
tw: "zh-Hant",
|
|
};
|
|
|
|
const lang = getLang();
|
|
return isoLangString[lang] ?? lang;
|
|
}
|