diff --git a/web/package.json b/web/package.json
index 958db46..70e37dd 100644
--- a/web/package.json
+++ b/web/package.json
@@ -8,6 +8,9 @@
"axios": "^0.21.1",
"clsx": "^1.1.1",
"fontsource-roboto": "^4.0.0",
+ "i18next": "^20.3.1",
+ "i18next-browser-languagedetector": "^6.1.1",
+ "i18next-xhr-backend": "^3.2.2",
"konva": "^8.0.1",
"lodash": "^4.17.21",
"material-ui-image": "^3.3.2",
@@ -16,6 +19,7 @@
"react-copy-to-clipboard": "^5.0.3",
"react-div-100vh": "^0.6.0",
"react-dom": "^17.0.2",
+ "react-i18next": "^11.10.0",
"react-konva": "^17.0.2-4",
"react-measure": "^2.5.2",
"react-scripts": "4.0.3",
diff --git a/web/public/index.html b/web/public/index.html
index 1fe47d0..41b4208 100644
--- a/web/public/index.html
+++ b/web/public/index.html
@@ -2,7 +2,7 @@
-
+
diff --git a/web/src/App/Sidebar.jsx b/web/src/App/Sidebar.jsx
index 5d6edac..1d792e0 100644
--- a/web/src/App/Sidebar.jsx
+++ b/web/src/App/Sidebar.jsx
@@ -14,21 +14,24 @@ import {
PowerSettingsNew as PowerSettingsNewIcon,
} from '@material-ui/icons'
import List from '@material-ui/core/List'
+import { useTranslation } from 'react-i18next'
import { AppSidebarStyle } from './style'
export default function Sidebar({ isDrawerOpen, setIsDonationDialogOpen }) {
+ // eslint-disable-next-line no-unused-vars
+ const { t, i18n } = useTranslation('translations')
return (
-
+
-
+
@@ -37,11 +40,11 @@ export default function Sidebar({ isDrawerOpen, setIsDonationDialogOpen }) {
- fetch(shutdownHost())}>
+ fetch(shutdownHost())}>
-
+
@@ -52,7 +55,7 @@ export default function Sidebar({ isDrawerOpen, setIsDonationDialogOpen }) {
-
+
diff --git a/web/src/components/About.jsx b/web/src/components/About.jsx
index a241eee..cfc5894 100644
--- a/web/src/components/About.jsx
+++ b/web/src/components/About.jsx
@@ -8,36 +8,38 @@ import InfoIcon from '@material-ui/icons/Info'
import ListItem from '@material-ui/core/ListItem'
import ListItemIcon from '@material-ui/core/ListItemIcon'
import ListItemText from '@material-ui/core/ListItemText'
+import { useTranslation } from 'react-i18next'
export default function AboutDialog() {
const [open, setOpen] = useState(false)
-
+ // eslint-disable-next-line no-unused-vars
+ const { t, i18n } = useTranslation('translations')
return (
setOpen(true)}>
-
+
diff --git a/web/src/components/Add/index.jsx b/web/src/components/Add/index.jsx
index b798785..7e27629 100644
--- a/web/src/components/Add/index.jsx
+++ b/web/src/components/Add/index.jsx
@@ -3,22 +3,23 @@ import ListItemIcon from '@material-ui/core/ListItemIcon'
import LibraryAddIcon from '@material-ui/icons/LibraryAdd'
import ListItemText from '@material-ui/core/ListItemText'
import ListItem from '@material-ui/core/ListItem'
+import { useTranslation } from 'react-i18next'
import AddDialog from './AddDialog'
export default function AddDialogButton() {
const [isDialogOpen, setIsDialogOpen] = useState(false)
-
const handleClickOpen = () => setIsDialogOpen(true)
const handleClose = () => setIsDialogOpen(false)
-
+ // eslint-disable-next-line no-unused-vars
+ const { t, i18n } = useTranslation('translations')
return (
-
+
{isDialogOpen &&
}
diff --git a/web/src/components/Donate/DonateDialog.jsx b/web/src/components/Donate/DonateDialog.jsx
index 40a0b75..5d0a113 100644
--- a/web/src/components/Donate/DonateDialog.jsx
+++ b/web/src/components/Donate/DonateDialog.jsx
@@ -6,14 +6,17 @@ import DialogActions from '@material-ui/core/DialogActions'
import List from '@material-ui/core/List'
import ButtonGroup from '@material-ui/core/ButtonGroup'
import Button from '@material-ui/core/Button'
+import { useTranslation } from 'react-i18next'
const donateFrame =
'
'
export default function DonateDialog({ onClose }) {
+ // eslint-disable-next-line no-unused-vars
+ const { t, i18n } = useTranslation('translations')
return (