index.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import CN from "./cn";
  2. import EN from "./en";
  3. import TW from "./tw";
  4. import ES from "./es";
  5. import IT from "./it";
  6. import TR from "./tr";
  7. import JP from "./jp";
  8. import DE from "./de";
  9. import VI from "./vi";
  10. export type { LocaleType } from "./cn";
  11. export const AllLangs = [
  12. "en",
  13. "cn",
  14. "tw",
  15. "es",
  16. "it",
  17. "tr",
  18. "jp",
  19. "de",
  20. "vi",
  21. ] as const;
  22. export type Lang = (typeof AllLangs)[number];
  23. const LANG_KEY = "lang";
  24. const DEFAULT_LANG = "en";
  25. function getItem(key: string) {
  26. try {
  27. return localStorage.getItem(key);
  28. } catch {
  29. return null;
  30. }
  31. }
  32. function setItem(key: string, value: string) {
  33. try {
  34. localStorage.setItem(key, value);
  35. } catch {}
  36. }
  37. function getLanguage() {
  38. try {
  39. return navigator.language.toLowerCase();
  40. } catch {
  41. console.log("[Lang] failed to detect user lang.");
  42. return DEFAULT_LANG;
  43. }
  44. }
  45. export function getLang(): Lang {
  46. const savedLang = getItem(LANG_KEY);
  47. if (AllLangs.includes((savedLang ?? "") as Lang)) {
  48. return savedLang as Lang;
  49. }
  50. const lang = getLanguage();
  51. for (const option of AllLangs) {
  52. if (lang.includes(option)) {
  53. return option;
  54. }
  55. }
  56. return DEFAULT_LANG;
  57. }
  58. export function changeLang(lang: Lang) {
  59. setItem(LANG_KEY, lang);
  60. location.reload();
  61. }
  62. export default {
  63. en: EN,
  64. cn: CN,
  65. tw: TW,
  66. es: ES,
  67. it: IT,
  68. tr: TR,
  69. jp: JP,
  70. de: DE,
  71. vi: VI,
  72. }[getLang()] as typeof CN;