index.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import cn from "./cn";
  2. import en from "./en";
  3. import jp from "./jp";
  4. import { merge } from "../utils/merge";
  5. import type { LocaleType } from "./cn";
  6. export type { LocaleType, PartialLocaleType } from "./cn";
  7. const ALL_LANGS = {
  8. cn,
  9. en,
  10. jp,
  11. };
  12. export type Lang = keyof typeof ALL_LANGS;
  13. export const AllLangs = Object.keys(ALL_LANGS) as Lang[];
  14. export const ALL_LANG_OPTIONS: Record<Lang, string> = {
  15. cn: "简体中文",
  16. en: "English",
  17. jp: "日本語",
  18. };
  19. const LANG_KEY = "lang";
  20. const DEFAULT_LANG = "en";
  21. const fallbackLang = en;
  22. const targetLang = ALL_LANGS[getLang()] as LocaleType;
  23. // if target lang missing some fields, it will use fallback lang string
  24. merge(fallbackLang, targetLang);
  25. export default fallbackLang as LocaleType;
  26. function getItem(key: string) {
  27. try {
  28. return localStorage.getItem(key);
  29. } catch {
  30. return null;
  31. }
  32. }
  33. function setItem(key: string, value: string) {
  34. try {
  35. localStorage.setItem(key, value);
  36. } catch {}
  37. }
  38. function getLanguage() {
  39. try {
  40. const locale = new Intl.Locale(navigator.language).maximize();
  41. const region = locale?.region?.toLowerCase();
  42. // 1. check region code in ALL_LANGS
  43. if (AllLangs.includes(region as Lang)) {
  44. return region as Lang;
  45. }
  46. // 2. check language code in ALL_LANGS
  47. if (AllLangs.includes(locale.language as Lang)) {
  48. return locale.language as Lang;
  49. }
  50. return DEFAULT_LANG;
  51. } catch {
  52. return DEFAULT_LANG;
  53. }
  54. }
  55. export function getLang(): Lang {
  56. const savedLang = getItem(LANG_KEY);
  57. if (AllLangs.includes((savedLang ?? "") as Lang)) {
  58. return savedLang as Lang;
  59. }
  60. return getLanguage();
  61. }
  62. export function changeLang(lang: Lang) {
  63. setItem(LANG_KEY, lang);
  64. location.reload();
  65. }
  66. export function getISOLang() {
  67. const isoLangString: Record<string, string> = {
  68. cn: "zh-Hans",
  69. };
  70. const lang = getLang();
  71. return isoLangString[lang] ?? lang;
  72. }