index.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. import cn from "./cn";
  2. import en from "./en";
  3. import pt from "./pt";
  4. import tw from "./tw";
  5. import da from "./da";
  6. import id from "./id";
  7. import fr from "./fr";
  8. import es from "./es";
  9. import it from "./it";
  10. import tr from "./tr";
  11. import jp from "./jp";
  12. import de from "./de";
  13. import vi from "./vi";
  14. import ru from "./ru";
  15. import no from "./no";
  16. import cs from "./cs";
  17. import ko from "./ko";
  18. import ar from "./ar";
  19. import bn from "./bn";
  20. import sk from "./sk";
  21. import { merge } from "../utils/merge";
  22. import { safeLocalStorage } from "@/app/utils";
  23. import type { LocaleType } from "./cn";
  24. export type { LocaleType, PartialLocaleType } from "./cn";
  25. const localStorage = safeLocalStorage();
  26. const ALL_LANGS = {
  27. cn,
  28. en,
  29. tw,
  30. pt,
  31. da,
  32. jp,
  33. ko,
  34. id,
  35. fr,
  36. es,
  37. it,
  38. tr,
  39. de,
  40. vi,
  41. ru,
  42. cs,
  43. no,
  44. ar,
  45. bn,
  46. sk,
  47. };
  48. export type Lang = keyof typeof ALL_LANGS;
  49. export const AllLangs = Object.keys(ALL_LANGS) as Lang[];
  50. export const ALL_LANG_OPTIONS: Record<Lang, string> = {
  51. cn: "简体中文",
  52. en: "English",
  53. pt: "Português",
  54. tw: "繁體中文",
  55. da: "Dansk",
  56. jp: "日本語",
  57. ko: "한국어",
  58. id: "Indonesia",
  59. fr: "Français",
  60. es: "Español",
  61. it: "Italiano",
  62. tr: "Türkçe",
  63. de: "Deutsch",
  64. vi: "Tiếng Việt",
  65. ru: "Русский",
  66. cs: "Čeština",
  67. no: "Nynorsk",
  68. ar: "العربية",
  69. bn: "বাংলা",
  70. sk: "Slovensky",
  71. };
  72. const LANG_KEY = "lang";
  73. const DEFAULT_LANG = "en";
  74. const fallbackLang = en;
  75. const targetLang = ALL_LANGS[getLang()] as LocaleType;
  76. // if target lang missing some fields, it will use fallback lang string
  77. merge(fallbackLang, targetLang);
  78. export default fallbackLang as LocaleType;
  79. function getItem(key: string) {
  80. return localStorage.getItem(key);
  81. }
  82. function setItem(key: string, value: string) {
  83. localStorage.setItem(key, value);
  84. }
  85. function getLanguage() {
  86. try {
  87. const locale = new Intl.Locale(navigator.language).maximize();
  88. const region = locale?.region?.toLowerCase();
  89. // 1. check region code in ALL_LANGS
  90. if (AllLangs.includes(region as Lang)) {
  91. return region as Lang;
  92. }
  93. // 2. check language code in ALL_LANGS
  94. if (AllLangs.includes(locale.language as Lang)) {
  95. return locale.language as Lang;
  96. }
  97. return DEFAULT_LANG;
  98. } catch {
  99. return DEFAULT_LANG;
  100. }
  101. }
  102. export function getLang(): Lang {
  103. const savedLang = getItem(LANG_KEY);
  104. if (AllLangs.includes((savedLang ?? "") as Lang)) {
  105. return savedLang as Lang;
  106. }
  107. return getLanguage();
  108. }
  109. export function changeLang(lang: Lang) {
  110. setItem(LANG_KEY, lang);
  111. location.reload();
  112. }
  113. export function getISOLang() {
  114. const isoLangString: Record<string, string> = {
  115. cn: "zh-Hans",
  116. tw: "zh-Hant",
  117. };
  118. const lang = getLang();
  119. return isoLangString[lang] ?? lang;
  120. }
  121. const DEFAULT_STT_LANG = "zh-CN";
  122. export const STT_LANG_MAP: Record<Lang, string> = {
  123. cn: "zh-CN",
  124. en: "en-US",
  125. pt: "pt-BR",
  126. tw: "zh-TW",
  127. da: "da-DK",
  128. jp: "ja-JP",
  129. ko: "ko-KR",
  130. id: "id-ID",
  131. fr: "fr-FR",
  132. es: "es-ES",
  133. it: "it-IT",
  134. tr: "tr-TR",
  135. de: "de-DE",
  136. vi: "vi-VN",
  137. ru: "ru-RU",
  138. cs: "cs-CZ",
  139. no: "no-NO",
  140. ar: "ar-SA",
  141. bn: "bn-BD",
  142. sk: "sk-SK",
  143. };
  144. export function getSTTLang(): string {
  145. try {
  146. return STT_LANG_MAP[getLang()];
  147. } catch {
  148. return DEFAULT_STT_LANG;
  149. }
  150. }