Skip to content

Commit 1d59d83

Browse files
feat(web): instant-translate
1 parent 1c20e01 commit 1d59d83

File tree

4 files changed

+33
-15
lines changed

4 files changed

+33
-15
lines changed

web/global.d.ts

+15-1
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,25 @@ declare global {
1010
const path: string;
1111
export default path;
1212
}
13+
interface Window {
14+
google: {
15+
translate: {
16+
TranslateElement: new (
17+
config: {
18+
pageLanguage: string;
19+
includedLanguages: string;
20+
},
21+
elementId: string
22+
) => void;
23+
};
24+
};
25+
googleTranslateElementInit: () => void;
26+
}
1327
}
1428

1529
declare module "styled-components" {
1630
type Theme = typeof lightTheme;
17-
//eslint-disable-next-line @typescript-eslint/no-empty-interface
31+
1832
export interface DefaultTheme extends Theme {}
1933
}
2034

web/src/components/TranslateDropdown.tsx

+8-9
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ import { DropdownSelect } from "@kleros/ui-components-library";
55
import { SupportedLangs, useTranslate } from "context/TranslateProvider";
66

77
const Langs: { value: SupportedLangs; text: string }[] = [
8-
{ text: "en", value: "en" },
9-
{ text: "es", value: "es" },
10-
{ text: "hi", value: "hi" },
11-
{ text: "js", value: "ja" },
12-
{ text: "zh", value: "zh" },
13-
{ text: "ko", value: "ko" },
14-
{ text: "fr", value: "fr" },
8+
{ text: "English", value: "en" },
9+
{ text: "Spanish", value: "es" },
10+
{ text: "Hindi", value: "hi" },
11+
{ text: "Japanese", value: "ja" },
12+
{ text: "Chinese", value: "zh" },
13+
{ text: "Korean", value: "ko" },
14+
{ text: "French", value: "fr" },
1515
];
1616

1717
const TranslateDropdown: React.FC = () => {
@@ -26,8 +26,7 @@ const TranslateDropdown: React.FC = () => {
2626
}))}
2727
defaultValue={"en"}
2828
callback={(val) => {
29-
//@ts-expect-error is string
30-
setLang(val);
29+
setLang(val as SupportedLangs);
3130
}}
3231
/>
3332
);

web/src/context/TranslateProvider.tsx

+8-5
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,17 @@ export const TranslateProvider: React.FC<{ children: React.ReactNode }> = ({ chi
2323

2424
useEffect(() => {
2525
try {
26-
// Check if the Google Translate script is already in the document
2726
const existingScript = document.querySelector('script[src*="translate.google.com/translate_a/element.js"]');
2827
if (!existingScript) {
2928
const addScript = document.createElement("script");
3029
addScript.setAttribute("src", "//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit");
3130
document.body.appendChild(addScript);
3231

33-
//@ts-expect-error will exist
3432
window.googleTranslateElementInit = () => {
35-
//@ts-expect-error will exist
3633
new window.google.translate.TranslateElement(
3734
{
3835
pageLanguage: "en",
39-
includedLanguages: "en,es,hi,ja,zh,fr,ko", // Include all languages you need here
36+
includedLanguages: "en,es,hi,ja,zh,fr,ko",
4037
},
4138
"google_translate_element"
4239
);
@@ -52,7 +49,13 @@ export const TranslateProvider: React.FC<{ children: React.ReactNode }> = ({ chi
5249
(cValue: SupportedLangs) => {
5350
setCurrentLang(cValue);
5451
document.cookie = "googtrans" + "=" + `/en/${cValue}` + ";" + "Session" + ";path=/";
55-
window.location.reload();
52+
if (window.google?.translate?.TranslateElement) {
53+
const select = document.querySelector(".goog-te-combo") as HTMLSelectElement;
54+
if (select) {
55+
select.value = cValue;
56+
select.dispatchEvent(new Event("change"));
57+
}
58+
}
5659
},
5760
[setCurrentLang]
5861
);

web/src/layout/Header/navbar/Menu/index.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { useToggleTheme } from "hooks/useToggleThemeContext";
1212
import { landscapeStyle } from "styles/landscapeStyle";
1313

1414
import LightButton from "components/LightButton";
15+
import TranslateDropdown from "components/TranslateDropdown";
1516

1617
import { IHelp, ISettings } from "..";
1718

@@ -90,6 +91,7 @@ const Menu: React.FC<ISettings & IHelp> = ({ toggleIsHelpOpen, toggleIsSettingsO
9091
<LightButton {...{ text, onClick, Icon }} />
9192
</ButtonContainer>
9293
))}
94+
<TranslateDropdown />
9395
</Container>
9496
);
9597
};

0 commit comments

Comments
 (0)