diff --git a/package.json b/package.json index b8848943..b7117a17 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "dom-to-image": "^2.6.0", "electron-window-state": "^5.0.3", "font-gis": "^1.0.6", + "i18next": "^24.2.3", "leaflet": "^1.9.4", "leaflet.nauticscale": "^1.1.0", "leaflet.polylinemeasure": "^3.0.0", @@ -49,6 +50,7 @@ "react": "^19.0.0", "react-dom": "^19.0.0", "react-error-boundary": "^5.0.0", + "react-i18next": "^15.4.1", "react-leaflet": "^5.0.0", "react-leaflet-custom-control": "^1.4.0", "react-leaflet-geoman-v2": "^1.0.1", diff --git a/src/components/WelcomePage/LanguageSelector.tsx b/src/components/WelcomePage/LanguageSelector.tsx new file mode 100644 index 00000000..bb33bb1f --- /dev/null +++ b/src/components/WelcomePage/LanguageSelector.tsx @@ -0,0 +1,25 @@ +// src/components/WelcomePage/LanguageSelector.tsx +import React from 'react' +import { useTranslation } from 'react-i18next' + +const LanguageSelector: React.FC = () => { + const { i18n } = useTranslation() + + const changeLanguage = (event: React.ChangeEvent) => { + const newLang = event.target.value + i18n.changeLanguage(newLang).then(() => { + // Force a re-render of the entire app + window.location.reload() + }) + } + + return ( + + ) +} + +export default LanguageSelector \ No newline at end of file diff --git a/src/components/WelcomePage/index.tsx b/src/components/WelcomePage/index.tsx index 87e4f0a9..65d92794 100644 --- a/src/components/WelcomePage/index.tsx +++ b/src/components/WelcomePage/index.tsx @@ -1,5 +1,8 @@ +// src/components/WelcomePage/index.tsx import { Button, Col, Image, Row, Typography } from 'antd' import './styles.css' +import { useTranslation } from 'react-i18next' +import LanguageSelector from './LanguageSelector' interface WelcomePageProps { onDragOver: (event: React.DragEvent) => void @@ -16,7 +19,7 @@ const WelcomePage: React.FC = ({ handleNew, openExistingDocument }) => { - // Get debug information from environment variables + const { t } = useTranslation() const gitBranch = import.meta.env.VITE_GIT_BRANCH || 'unknown' const buildDate = import.meta.env.VITE_BUILD_DATE ? new Date(import.meta.env.VITE_BUILD_DATE).toLocaleString() @@ -24,40 +27,42 @@ const WelcomePage: React.FC = ({ return (
- Welcome to Albatross + {t('welcomeToAlbatross')}   - Application logo - albatross flying + {t('applicationLogoAlt')}   - Open an existing document or create a new one + {t('openOrCreateDocument')} - - + + - + +
+ +
- {/* Debug info box */}
- Branch: {gitBranch} | Build: {buildDate} + {t('branch')}: {gitBranch} | {t('build')}: {buildDate}
) } -export default WelcomePage +export default WelcomePage \ No newline at end of file diff --git a/src/i18n.ts b/src/i18n.ts new file mode 100644 index 00000000..bb08e4d5 --- /dev/null +++ b/src/i18n.ts @@ -0,0 +1,22 @@ +import i18n from 'i18next' +import { initReactI18next } from 'react-i18next' +import enTranslations from './locales/en.json' +import itTranslations from './locales/it.json' +import nlTranslations from './locales/nl.json' + +i18n + .use(initReactI18next) + .init({ + resources: { + en: { translation: enTranslations }, + it: { translation: itTranslations }, + nl: { translation: nlTranslations } + }, + lng: 'en', + fallbackLng: 'en', + interpolation: { + escapeValue: false + } + }) + +export default i18n \ No newline at end of file diff --git a/src/locales/en.json b/src/locales/en.json new file mode 100644 index 00000000..50ad4721 --- /dev/null +++ b/src/locales/en.json @@ -0,0 +1,11 @@ +{ + "welcomeToAlbatross": "Welcome to Albatross", + "applicationLogoAlt": "Application logo - albatross flying", + "openOrCreateDocument": "Open an existing document or create a new one", + "new": "New", + "samplePlot": "Sample plot", + "open": "Open", + "branch": "Branch", + "build": "Build", + "unknown": "unknown" +} \ No newline at end of file diff --git a/src/locales/it.json b/src/locales/it.json new file mode 100644 index 00000000..4b7ad0f9 --- /dev/null +++ b/src/locales/it.json @@ -0,0 +1,11 @@ +{ + "welcomeToAlbatross": "Benvenuto in Albatross", + "applicationLogoAlt": "Logo dell'applicazione - albatross in volo", + "openOrCreateDocument": "Apri un documento esistente o creane uno nuovo", + "new": "Nuovo", + "samplePlot": "Grafico di esempio", + "open": "Apri", + "branch": "Ramo", + "build": "Compilazione", + "unknown": "sconosciuto" +} \ No newline at end of file diff --git a/src/locales/nl.json b/src/locales/nl.json new file mode 100644 index 00000000..614848f9 --- /dev/null +++ b/src/locales/nl.json @@ -0,0 +1,11 @@ +{ + "welcomeToAlbatross": "Welkom bij Albatross", + "applicationLogoAlt": "Applicatielogo - vliegende albatros", + "openOrCreateDocument": "Open een bestaand document of maak een nieuw document", + "new": "Nieuw", + "samplePlot": "Voorbeeldgrafiek", + "open": "Openen", + "branch": "Tak", + "build": "Build", + "unknown": "onbekend" +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index d71824e5..77f46e70 100644 --- a/yarn.lock +++ b/yarn.lock @@ -960,6 +960,13 @@ dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.25.0", "@babel/runtime@^7.26.10": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.0.tgz#fbee7cf97c709518ecc1f590984481d5460d4762" + integrity sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.25.9", "@babel/template@^7.3.3": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" @@ -7346,6 +7353,13 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +html-parse-stringify@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" + integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== + dependencies: + void-elements "3.1.0" + http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" @@ -7409,6 +7423,13 @@ husky@^9.1.7: resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.7.tgz#d46a38035d101b46a70456a850ff4201344c0b2d" integrity sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA== +i18next@^24.2.3: + version "24.2.3" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-24.2.3.tgz#3a05f72615cbd7c00d7e348667e2aabef1df753b" + integrity sha512-lfbf80OzkocvX7nmZtu7nSTNbrTYR52sLWxPtlXX1zAhVw8WEnFk4puUkCR4B1dNQwbSpEHHHemcZu//7EcB7A== + dependencies: + "@babel/runtime" "^7.26.10" + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -10054,6 +10075,14 @@ react-fast-compare@^3.2.0: resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== +react-i18next@^15.4.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-15.4.1.tgz#33f3e89c2f6c68e2bfcbf9aa59986ad42fe78758" + integrity sha512-ahGab+IaSgZmNPYXdV1n+OYky95TGpFwnKRflX/16dY04DsYYKHtVLjeny7sBSCREEcoMbAgSkFiGLF5g5Oofw== + dependencies: + "@babel/runtime" "^7.25.0" + html-parse-stringify "^3.0.1" + react-icons@^4.2.0: version "4.12.0" resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.12.0.tgz#54806159a966961bfd5cdb26e492f4dafd6a8d78" @@ -11946,6 +11975,11 @@ vite@^5.4.10: optionalDependencies: fsevents "~2.3.3" +void-elements@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" + integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== + walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f"