diff --git a/src/components/BlockCategories/Logic.jsx b/src/components/BlockCategories/Logic.jsx index 811ca6b..758cd53 100644 --- a/src/components/BlockCategories/Logic.jsx +++ b/src/components/BlockCategories/Logic.jsx @@ -4,3 +4,5 @@ export const Logic = ` `; + +// Temp change \ No newline at end of file diff --git a/src/components/BlocklyComponent.jsx b/src/components/BlocklyComponent.jsx index dd76345..97e6694 100644 --- a/src/components/BlocklyComponent.jsx +++ b/src/components/BlocklyComponent.jsx @@ -1,5 +1,7 @@ // Updated BlocklyComponent.jsx import React, { useEffect, useRef } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; + import Blockly from 'blockly'; import { Logic } from './BlockCategories/Logic'; import { Loops } from './BlockCategories/Loops'; @@ -7,10 +9,36 @@ import { Math } from './BlockCategories/Math'; import { Text } from './BlockCategories/Text'; import initializeBlockly from './InitializeBlockly'; // import the function +import * as en from 'blockly/msg/en'; // Import English messages +import * as fr from 'blockly/msg/fr'; // Import French messages +// import countryFlagEmoji from "country-flag-emoji"; + const BlocklyComponent = () => { + + const language = useSelector(state => state.language); + // const ukEmoji = countryFlagEmoji.get('GB'); + // const franceEmoji = countryFlagEmoji.get('FR'); + const blocklyRef = useRef(null); + const toggleLanguage = (selectedLanguage) => { + dispatch(setLanguage(selectedLanguage)); + updateBlocklyLocale(selectedLanguage); + }; + + const updateBlocklyLocale = (lang) => { + const languageMap = { + en, + fr, + }; + Blockly.setLocale(languageMap[lang]); + }; + useEffect(() => { + + updateBlocklyLocale(language); // Update Blockly locale based on the initial language + + if (blocklyRef.current === null) { // Initialize Blockly with English Blockly.setLocale('en'); @@ -21,17 +49,22 @@ const BlocklyComponent = () => { ${Loops} ${Math} ${Text} + `; initializeBlockly(toolboxXml); // Initialize Blockly using the separate function blocklyRef.current = true; } - }, []); + }, [language]); return (
-

Blockly Toolbox

-

Blockly Workspace

+

+ {language === 'en' ? 'Blockly Toolbox' : ' Boîte à outils Blockly'} +

+

+ {language === 'en' ? 'Blockly Workspace' : 'Espace de travail Blockly'} +

); diff --git a/src/components/Canvas.jsx b/src/components/Canvas.jsx index b219d0d..00c133e 100644 --- a/src/components/Canvas.jsx +++ b/src/components/Canvas.jsx @@ -2,6 +2,7 @@ import React from 'react'; import { Card } from '@mui/material'; import Draggable from 'react-draggable'; import { Resizable } from 're-resizable'; +import { useSelector, useDispatch } from 'react-redux'; // Import the button components import FlagButton from './Canvas/FlagButton'; @@ -13,9 +14,13 @@ import ZoomOut from './Canvas/ZoomOut'; import FullScreen from './Canvas/FullScreen'; const Canvas = () => { + + const language = useSelector(state => state.language); // Language + const dispatch = useDispatch(); //dispatch fore event click + return ( -

Canvas

+

{language === 'en' ? 'Canvas' : 'Toile'}

state.language); + const [projectName, setProjectName] = useState('Project_Name'); + const [isDropdownOpen, setDropdownOpen] = useState(false); + const dispatch = useDispatch(); // Add this line to get access to dispatch function const handleProjectNameChange = (event) => { setProjectName(event.target.value); }; + const toggleLanguage = (selectedLanguage) => { + dispatch(setLanguage(selectedLanguage)); + updateBlocklyLocale(selectedLanguage); + }; + + const toggleDropdown = () => { + setDropdownOpen(!isDropdownOpen); + }; + + const handleLanguageChange = (selectedLanguage) => { + toggleDropdown(); + toggleLanguage(selectedLanguage); + }; + + const updateBlocklyLocale = (lang) => { + const languageMap = { + en, + fr, + }; + Blockly.setLocale(languageMap[lang]); + }; + + const [anchorEl, setAnchorEl] = useState(null); + + const handleClick = (event) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + const handleLanguageItemClick = (selectedLanguage) => { + handleClose(); + handleLanguageChange(selectedLanguage); + }; + return ( - + {/* LogicBlocks Title */} -

LogicBlocks

+

{language === 'en' ? 'LogicBlocks' : 'Blocs Logiques'}

{/* Navigation Buttons */} - - - - - +
+ + + + + +
{/* Editable Project Name */} |, endAdornment: |, }} /> + {/* Language Dropdown */} +
+ + + handleLanguageItemClick('en')}>English + handleLanguageItemClick('fr')}>Français + + {/* */} + {/* {isDropdownOpen && ( + + )} */} +
+ {/* Spacing Element */} @@ -61,9 +148,12 @@ export default function Header() { Logo {/* Sign In Button */} - +
); } + diff --git a/src/features/languageSlice.js b/src/features/languageSlice.js new file mode 100644 index 0000000..8633668 --- /dev/null +++ b/src/features/languageSlice.js @@ -0,0 +1,16 @@ +// languageSlice.js + +import { createSlice } from '@reduxjs/toolkit'; + +const languageSlice = createSlice({ + name: 'language', + initialState: 'en', + reducers: { + setLanguage: (state, action) => { + return action.payload; + }, + }, +}); + +export const { setLanguage } = languageSlice.actions; +export default languageSlice.reducer; diff --git a/src/store/store.js b/src/store/store.js index d3a3e50..a5796c2 100644 --- a/src/store/store.js +++ b/src/store/store.js @@ -1,5 +1,10 @@ import { configureStore } from "@reduxjs/toolkit"; +import languageReducer from "../features/languageSlice"; + export const store = configureStore({ - reducer: {}, + reducer: { + language: languageReducer, + }, + devTools: process.env.NODE_ENV !== 'production', });