From 9089918b0dfa10a755a0d54d8f99b4666c0aa19b Mon Sep 17 00:00:00 2001 From: Steve Yonkeu Date: Wed, 8 Apr 2026 09:02:18 +0100 Subject: [PATCH 1/3] Enhance internationalization support across Speakers, Sponsor, and Venue pages - Integrated i18n for text elements in Speakers.jsx, including timeline milestones and call for proposals. - Updated Sponsor.jsx to utilize translation for sponsorship details and benefits. - Improved Venue.jsx with translated content for venue details and travel information. - Added icons from lucide-react for better visual representation in Sponsor and Venue sections. Signed-off-by: Steve Yonkeu --- index.html | 4 +- package-lock.json | 99 ++++++++++++ package.json | 3 + src/components/Footer.jsx | 47 +++--- src/components/Navbar.jsx | 41 +++-- src/components/TeamCard.jsx | 23 +-- src/i18n/LanguageContext.jsx | 36 +++++ src/i18n/en.json | 294 +++++++++++++++++++++++++++++++++++ src/i18n/fr.json | 294 +++++++++++++++++++++++++++++++++++ src/index.css | 37 ++++- src/main.jsx | 1 + src/pages/About.jsx | 94 ++++------- src/pages/Attend.jsx | 126 +++++++-------- src/pages/Home.jsx | 96 +++++------- src/pages/Speakers.jsx | 187 ++++++++++------------ src/pages/Sponsor.jsx | 78 +++++----- src/pages/Venue.jsx | 59 ++++--- 17 files changed, 1098 insertions(+), 421 deletions(-) create mode 100644 src/i18n/LanguageContext.jsx create mode 100644 src/i18n/en.json create mode 100644 src/i18n/fr.json diff --git a/index.html b/index.html index dc613da..3421fae 100644 --- a/index.html +++ b/index.html @@ -12,8 +12,8 @@ PyCon Cameroon 2026 | Cameroon's Premier Python Conference - - + + diff --git a/package-lock.json b/package-lock.json index a9af49c..480887f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,12 @@ "name": "react", "version": "0.0.0", "dependencies": { + "i18next": "^26.0.3", "leaflet": "^1.9.4", + "lucide-react": "^1.7.0", "react": "^19.2.0", "react-dom": "^19.2.0", + "react-i18next": "^17.0.2", "react-leaflet": "^5.0.0", "react-router-dom": "^7.13.0" }, @@ -260,6 +263,14 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", @@ -2167,6 +2178,44 @@ "hermes-estree": "0.25.1" } }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "dependencies": { + "void-elements": "3.1.0" + } + }, + "node_modules/i18next": { + "version": "26.0.3", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-26.0.3.tgz", + "integrity": "sha512-1571kXINxHKY7LksWp8wP+zP0YqHSSpl/OW0Y0owFEf2H3s8gCAffWaZivcz14rMkOvn3R/psiQxVsR9t2Nafg==", + "funding": [ + { + "type": "individual", + "url": "https://www.locize.com/i18next" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + }, + { + "type": "individual", + "url": "https://www.locize.com" + } + ], + "dependencies": { + "@babel/runtime": "^7.29.2" + }, + "peerDependencies": { + "typescript": "^5 || ^6" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -2363,6 +2412,14 @@ "yallist": "^3.0.2" } }, + "node_modules/lucide-react": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.7.0.tgz", + "integrity": "sha512-yI7BeItCLZJTXikmK4KNUGCKoGzSvbKlfCvw44bU4fXAL6v3gYS4uHD1jzsLkfwODYwI6Drw5Tu9Z5ulDe0TSg==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -2589,6 +2646,32 @@ "react": "^19.2.4" } }, + "node_modules/react-i18next": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-17.0.2.tgz", + "integrity": "sha512-shBftH2vaTWK2Bsp7FiL+cevx3xFJlvFxmsDFQSrJc+6twHkP0tv/bGa01VVWzpreUVVwU+3Hev5iFqRg65RwA==", + "dependencies": { + "@babel/runtime": "^7.29.2", + "html-parse-stringify": "^3.0.1", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "i18next": ">= 26.0.1", + "react": ">= 16.8.0", + "typescript": "^5 || ^6" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, "node_modules/react-leaflet": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-5.0.0.tgz", @@ -2857,6 +2940,14 @@ "punycode": "^2.1.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/vite": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", @@ -2932,6 +3023,14 @@ } } }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 0ca50a0..8b447bd 100644 --- a/package.json +++ b/package.json @@ -12,9 +12,12 @@ "deploy:preview": "npm run build && firebase hosting:channel:deploy preview" }, "dependencies": { + "i18next": "^26.0.3", "leaflet": "^1.9.4", + "lucide-react": "^1.7.0", "react": "^19.2.0", "react-dom": "^19.2.0", + "react-i18next": "^17.0.2", "react-leaflet": "^5.0.0", "react-router-dom": "^7.13.0" }, diff --git a/src/components/Footer.jsx b/src/components/Footer.jsx index 8fc80c8..fb87c3e 100644 --- a/src/components/Footer.jsx +++ b/src/components/Footer.jsx @@ -1,7 +1,10 @@ import React from 'react'; import { Link } from 'react-router-dom'; +import { useTranslation } from 'react-i18next'; const Footer = () => { + const { t } = useTranslation(); + return (