ChatGPT-Next-Web/app/locales/index.ts
sijinhui a70f984b0f Merge remote-tracking branch 'upstream/main'
# 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
2024-07-11 10:58:00 +08:00

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;
}