Skip to content

Commit c546ff7

Browse files
authored
Merge pull request #2133 from Parvinmh/i18n
add multi-language support (localization)
2 parents 70e873b + 6dc8a3d commit c546ff7

File tree

7 files changed

+140
-6
lines changed

7 files changed

+140
-6
lines changed

src/i18n/de_DE.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export default {
2+
buttons: {
3+
next: "Weiter",
4+
prev: "Zurück",
5+
skip: "Überspringen",
6+
done: "Fertig",
7+
},
8+
messages: {
9+
dontShowAgainLabel: "Nicht wieder anzeigen",
10+
stepNumbersOfLabel: "von",
11+
},
12+
};

src/i18n/en_US.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export default {
2+
buttons: {
3+
next: "Next",
4+
prev: "Back",
5+
skip: "Skip",
6+
done: "Done",
7+
},
8+
messages: {
9+
dontShowAgainLabel: "Don't show this again",
10+
stepNumbersOfLabel: "of",
11+
},
12+
};

src/i18n/es_ES.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export default {
2+
buttons: {
3+
next: "Siguiente",
4+
prev: "Atrás",
5+
skip: "Saltar",
6+
done: "Hecho",
7+
},
8+
messages: {
9+
dontShowAgainLabel: "No mostrar esto de nuevo",
10+
stepNumbersOfLabel: "de",
11+
},
12+
};

src/i18n/fa_IR.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export default {
2+
buttons: {
3+
next: "بعدی",
4+
prev: "قبلی",
5+
skip: "رد کردن",
6+
done: "پایان",
7+
},
8+
messages: {
9+
dontShowAgainLabel: "دیگر این را نشان نده",
10+
stepNumbersOfLabel: "از",
11+
},
12+
};

src/i18n/fr_FR.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export default {
2+
buttons: {
3+
next: "Suivant",
4+
prev: "Retour",
5+
skip: "Passer",
6+
done: "Terminé",
7+
},
8+
messages: {
9+
dontShowAgainLabel: "Ne plus afficher ceci",
10+
stepNumbersOfLabel: "sur",
11+
},
12+
};

src/i18n/language.ts

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import enUS from "./en_US";
2+
import faIR from "./fa_IR";
3+
import de_DE from "./de_DE";
4+
import esES from "./es_ES";
5+
import frFR from "./fr_FR";
6+
7+
type MessageFormat = (...args: any[]) => string;
8+
type Message = string | MessageFormat;
9+
export type Language = { [key: string]: Message | Language };
10+
11+
const languages: Record<string, Language> = {
12+
en_US: enUS,
13+
fa_IR: faIR,
14+
de_DE: de_DE,
15+
es_ES: esES,
16+
fr_FR: frFR,
17+
};
18+
19+
export class Translator {
20+
private _language: Language;
21+
22+
constructor(language?: Language) {
23+
if (language) {
24+
this._language = language;
25+
} else {
26+
const rawLang =
27+
(navigator.language || (navigator as any).userLanguage || "en-US")
28+
.replace("-", "_");
29+
30+
const normalizedLang = Object.keys(languages).find(
31+
key => key.toLowerCase() === rawLang.toLowerCase()
32+
);
33+
34+
this._language = normalizedLang ? languages[normalizedLang] : enUS;
35+
}
36+
}
37+
38+
setLanguage(language: Language) {
39+
this._language = language;
40+
}
41+
42+
private getString(message: string, lang: Language = this._language): MessageFormat | null {
43+
if (!lang || !message) return null;
44+
45+
const splitted = message.split(".");
46+
const key = splitted[0];
47+
48+
if (lang[key]) {
49+
const val = lang[key];
50+
51+
if (typeof val === "string") {
52+
return (): string => val;
53+
} else if (typeof val === "function") {
54+
return val;
55+
} else {
56+
return this.getString(splitted.slice(1).join("."), val as Language);
57+
}
58+
}
59+
60+
return null;
61+
}
62+
63+
translate(message: string, ...args: any[]): string {
64+
const translated = this.getString(message);
65+
return translated ? translated(...args) : message;
66+
}
67+
}

src/packages/tour/option.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { TooltipPosition } from "../../packages/tooltip";
22
import { TourStep, ScrollTo } from "./steps";
3+
import { Translator, Language } from "../../i18n/language";
4+
import enUS from "../../i18n/en_US";
35

46
export interface TourOptions {
57
steps: Partial<TourStep>[];
@@ -74,16 +76,20 @@ export interface TourOptions {
7476
progressBarAdditionalClass: string;
7577
/* Optional property to determine if content should be rendered as HTML */
7678
tooltipRenderAsHtml?: boolean;
79+
/* Optional property to set the language of the tour.
80+
Defaults to the user's browser language if not provided. */
81+
language?: Language;
7782
}
7883

79-
export function getDefaultTourOptions(): TourOptions {
84+
export function getDefaultTourOptions(language: Language = enUS): TourOptions {
85+
const translator = new Translator(language);
8086
return {
8187
steps: [],
8288
isActive: true,
83-
nextLabel: "Next",
84-
prevLabel: "Back",
89+
nextLabel: translator.translate("buttons.next"),
90+
prevLabel: translator.translate("buttons.prev"),
8591
skipLabel: "×",
86-
doneLabel: "Done",
92+
doneLabel: translator.translate("buttons.done"),
8793
hidePrev: false,
8894
hideNext: false,
8995
nextToDone: true,
@@ -94,7 +100,7 @@ export function getDefaultTourOptions(): TourOptions {
94100
exitOnEsc: true,
95101
exitOnOverlayClick: true,
96102
showStepNumbers: false,
97-
stepNumbersOfLabel: "of",
103+
stepNumbersOfLabel: translator.translate("messages.stepNumbersOfLabel"),
98104
keyboardNavigation: true,
99105
showButtons: true,
100106
showBullets: true,
@@ -108,13 +114,14 @@ export function getDefaultTourOptions(): TourOptions {
108114
disableInteraction: false,
109115

110116
dontShowAgain: false,
111-
dontShowAgainLabel: "Don't show this again",
117+
dontShowAgainLabel: translator.translate("messages.dontShowAgain"),
112118
dontShowAgainCookie: "introjs-dontShowAgain",
113119
dontShowAgainCookieDays: 365,
114120
helperElementPadding: 10,
115121

116122
buttonClass: "introjs-button",
117123
progressBarAdditionalClass: "",
118124
tooltipRenderAsHtml: true,
125+
language,
119126
};
120127
}

0 commit comments

Comments
 (0)