i18n.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. ];
  14. let currentLanguage = languages[0];
  15. const fallbackLanguage = languages[0];
  16. export function setLanguage(newLng: string | undefined) {
  17. currentLanguage =
  18. languages.find(language => language.lng === newLng) || fallbackLanguage;
  19. languageDetector.cacheUserLanguage(currentLanguage.lng);
  20. }
  21. export function getLanguage() {
  22. return currentLanguage.lng;
  23. }
  24. function findPartsForData(data: any, parts: string[]) {
  25. for (var i = 0; i < parts.length; ++i) {
  26. const part = parts[i];
  27. if (data[part] === undefined) {
  28. return undefined;
  29. }
  30. data = data[part];
  31. }
  32. if (typeof data !== "string") {
  33. return undefined;
  34. }
  35. return data;
  36. }
  37. export function t(path: string, replacement?: { [key: string]: string }) {
  38. const parts = path.split(".");
  39. let translation =
  40. findPartsForData(currentLanguage.data, parts) ||
  41. findPartsForData(fallbackLanguage.data, parts);
  42. if (translation === undefined) {
  43. throw new Error(`Can't find translation for ${path}`);
  44. }
  45. if (replacement) {
  46. for (var key in replacement) {
  47. translation = translation.replace(`{{${key}}}`, replacement[key]);
  48. }
  49. }
  50. return translation;
  51. }
  52. const languageDetector = new LanguageDetector();
  53. languageDetector.init({
  54. languageUtils: {
  55. formatLanguageCode: function(lng: string) {
  56. return lng;
  57. },
  58. isWhitelisted: () => true,
  59. },
  60. checkWhitelist: false,
  61. });
  62. setLanguage(languageDetector.detect());