i18n.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import LanguageDetector from "i18next-browser-languagedetector";
  2. export const languages = [
  3. { lng: "en", label: "English", data: require("./locales/en.json") },
  4. { lng: "de", label: "Deutsch", data: require("./locales/de.json") },
  5. { lng: "es", label: "Español", data: require("./locales/es.json") },
  6. { lng: "fr", label: "Français", data: require("./locales/fr.json") },
  7. { lng: "id", label: "Bahasa Indonesia", data: require("./locales/id.json") },
  8. { lng: "no", label: "Norsk", data: require("./locales/no.json") },
  9. { lng: "pl", label: "Polski", data: require("./locales/pl.json") },
  10. { lng: "pt", label: "Português", data: require("./locales/pt.json") },
  11. { lng: "ru", label: "Русский", data: require("./locales/ru.json") },
  12. { lng: "tr", label: "Türkçe", data: require("./locales/tr.json") },
  13. { lng: "ko", label: "한국어", data: require("./locales/ko.json") },
  14. ];
  15. let currentLanguage = languages[0];
  16. const fallbackLanguage = languages[0];
  17. export function setLanguage(newLng: string | undefined) {
  18. currentLanguage =
  19. languages.find(language => language.lng === newLng) || fallbackLanguage;
  20. languageDetector.cacheUserLanguage(currentLanguage.lng);
  21. }
  22. export function getLanguage() {
  23. return currentLanguage.lng;
  24. }
  25. function findPartsForData(data: any, parts: string[]) {
  26. for (var i = 0; i < parts.length; ++i) {
  27. const part = parts[i];
  28. if (data[part] === undefined) {
  29. return undefined;
  30. }
  31. data = data[part];
  32. }
  33. if (typeof data !== "string") {
  34. return undefined;
  35. }
  36. return data;
  37. }
  38. export function t(path: string, replacement?: { [key: string]: string }) {
  39. const parts = path.split(".");
  40. let translation =
  41. findPartsForData(currentLanguage.data, parts) ||
  42. findPartsForData(fallbackLanguage.data, parts);
  43. if (translation === undefined) {
  44. throw new Error(`Can't find translation for ${path}`);
  45. }
  46. if (replacement) {
  47. for (var key in replacement) {
  48. translation = translation.replace(`{{${key}}}`, replacement[key]);
  49. }
  50. }
  51. return translation;
  52. }
  53. const languageDetector = new LanguageDetector();
  54. languageDetector.init({
  55. languageUtils: {
  56. formatLanguageCode: function(lng: string) {
  57. return lng;
  58. },
  59. isWhitelisted: () => true,
  60. },
  61. checkWhitelist: false,
  62. });
  63. setLanguage(languageDetector.detect());