diff --git a/package-lock.json b/package-lock.json index 0b77b6d..b55e7c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "axios": "^1.7.9", "cra-template": "1.2.0", + "i18n": "^0.15.1", "react": "^19.0.0", "react-audio-player": "^0.17.0", "react-dom": "^19.0.0", @@ -2775,6 +2776,45 @@ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" }, + "node_modules/@messageformat/core": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@messageformat/core/-/core-3.4.0.tgz", + "integrity": "sha512-NgCFubFFIdMWJGN5WuQhHCNmzk7QgiVfrViFxcS99j7F5dDS5EP6raR54I+2ydhe4+5/XTn/YIEppFaqqVWHsw==", + "dependencies": { + "@messageformat/date-skeleton": "^1.0.0", + "@messageformat/number-skeleton": "^1.0.0", + "@messageformat/parser": "^5.1.0", + "@messageformat/runtime": "^3.0.1", + "make-plural": "^7.0.0", + "safe-identifier": "^0.4.1" + } + }, + "node_modules/@messageformat/date-skeleton": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@messageformat/date-skeleton/-/date-skeleton-1.1.0.tgz", + "integrity": "sha512-rmGAfB1tIPER+gh3p/RgA+PVeRE/gxuQ2w4snFWPF5xtb5mbWR7Cbw7wCOftcUypbD6HVoxrVdyyghPm3WzP5A==" + }, + "node_modules/@messageformat/number-skeleton": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@messageformat/number-skeleton/-/number-skeleton-1.2.0.tgz", + "integrity": "sha512-xsgwcL7J7WhlHJ3RNbaVgssaIwcEyFkBqxHdcdaiJzwTZAWEOD8BuUFxnxV9k5S0qHN3v/KzUpq0IUpjH1seRg==" + }, + "node_modules/@messageformat/parser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@messageformat/parser/-/parser-5.1.1.tgz", + "integrity": "sha512-3p0YRGCcTUCYvBKLIxtDDyrJ0YijGIwrTRu1DT8gIviIDZru8H23+FkY6MJBzM1n9n20CiM4VeDYuBsrrwnLjg==", + "dependencies": { + "moo": "^0.5.1" + } + }, + "node_modules/@messageformat/runtime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@messageformat/runtime/-/runtime-3.0.1.tgz", + "integrity": "sha512-6RU5ol2lDtO8bD9Yxe6CZkl0DArdv0qkuoZC+ZwowU+cdRlVE1157wjCmlA5Rsf1Xc/brACnsZa5PZpEDfTFFg==", + "dependencies": { + "make-plural": "^7.0.0" + } + }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", @@ -7347,6 +7387,14 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, + "node_modules/fast-printf": { + "version": "1.6.10", + "resolved": "https://registry.npmjs.org/fast-printf/-/fast-printf-1.6.10.tgz", + "integrity": "sha512-GwTgG9O4FVIdShhbVF3JxOgSBY2+ePGsu2V/UONgoCPzF9VY6ZdBMKsHKCYQHZwNk3qNouUolRDsgVxcVA5G1w==", + "engines": { + "node": ">=10.0" + } + }, "node_modules/fast-uri": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", @@ -8427,6 +8475,25 @@ "node": ">=10.17.0" } }, + "node_modules/i18n": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/i18n/-/i18n-0.15.1.tgz", + "integrity": "sha512-yue187t8MqUPMHdKjiZGrX+L+xcUsDClGO0Cz4loaKUOK9WrGw5pgan4bv130utOwX7fHE9w2iUeHFalVQWkXA==", + "dependencies": { + "@messageformat/core": "^3.0.0", + "debug": "^4.3.3", + "fast-printf": "^1.6.9", + "make-plural": "^7.0.0", + "math-interval-parser": "^2.0.1", + "mustache": "^4.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/mashpie" + } + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -10422,6 +10489,11 @@ "semver": "bin/semver.js" } }, + "node_modules/make-plural": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-7.4.0.tgz", + "integrity": "sha512-4/gC9KVNTV6pvYg2gFeQYTW3mWaoJt7WZE5vrp1KnQDgW92JtYZnzmZT81oj/dUTqAIu0ufI2x3dkgu3bB1tYg==" + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -10430,6 +10502,14 @@ "tmpl": "1.0.5" } }, + "node_modules/math-interval-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/math-interval-parser/-/math-interval-parser-2.0.1.tgz", + "integrity": "sha512-VmlAmb0UJwlvMyx8iPhXUDnVW1F9IrGEd9CIOmv+XL8AErCUUuozoDMrgImvnYt2A+53qVX/tPW6YJurMKYsvA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -10615,6 +10695,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/moo": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==" + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -10632,6 +10717,14 @@ "multicast-dns": "cli.js" } }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "bin": { + "mustache": "bin/mustache" + } + }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -13845,6 +13938,11 @@ } ] }, + "node_modules/safe-identifier": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", + "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==" + }, "node_modules/safe-push-apply": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", diff --git a/package.json b/package.json index b995402..c4a29c9 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "dependencies": { "axios": "^1.7.9", "cra-template": "1.2.0", + "i18n": "^0.15.1", "react": "^19.0.0", "react-audio-player": "^0.17.0", "react-dom": "^19.0.0", diff --git a/src/App.js b/src/App.js index 95faae6..2503c9c 100644 --- a/src/App.js +++ b/src/App.js @@ -9,6 +9,7 @@ import Cookies from 'universal-cookie'; import {FetchPOST} from './middlewares/Fetch'; import MusikBox from './components/MusikBox'; import NavRight from './components/NavRight'; +import { I18nProvider } from './middlewares/Locale'; const cookie = new Cookies(); export default function App() { @@ -19,6 +20,7 @@ export default function App() { const [profile, setProfile] = useState(""); const [auth, setAuth] = useState(""); const [rightPage, setRightPage] = useState("null"); + const [locale, setLocale] = useState(''); const [pageMenusContent, setPageMenusContent] = useState("null"); // Yeni state @@ -27,7 +29,10 @@ export default function App() { port: 3001, pathname: "/get/user/my" }) - .then(res => setProfile(res.user)); + .then(res => { + setProfile(res.user); + setLocale(res.user.locale); + }); FetchPOST({ port: 3001, @@ -50,60 +55,65 @@ export default function App() { setPageMenusContent(content); }; - const exports = {setRightPage, rightPage} + const exports = {setRightPage, rightPage}; if(auth === false){ return ( -
-
-
-
-
-
- + +
+
+
+
+
+
+ +
-
+ ) }else if(auth === true){ return ( -
-
-
-
-
-
-
- + +
+
+
+
+
+
+
+ +
+
+
+ +
+
-
- +
+
+ +
+
+
- -
-
-
- -
-
-
+
- -
+
); } }; \ No newline at end of file diff --git a/src/components/NavLeft.jsx b/src/components/NavLeft.jsx index ff32eef..55d8b5c 100644 --- a/src/components/NavLeft.jsx +++ b/src/components/NavLeft.jsx @@ -1,13 +1,15 @@ -import React from 'react' +import React, { useContext } from 'react' import { Link } from 'react-router-dom'; import { menus } from '../menus'; +import { I18nContext } from '../middlewares/Locale'; export default function NavLeft(props) { + const { locale } = useContext(I18nContext) return (
{menus.map(get => ( - props.setSelectedMenu(get.id)} className={'p-4 hover:bg-pc hover:bg-opacity-50 ' + (get.id === props.selectedMenu && 'bg-pc font-bold')}>{get.title} + props.setSelectedMenu(get.id)} className={'p-4 hover:bg-pc hover:bg-opacity-50 ' + (get.id === props.selectedMenu && 'bg-pc font-bold')}>{locale[get.title]} ))}
diff --git a/src/components/Pages.jsx b/src/components/Pages.jsx index 6caa7c3..eab3735 100644 --- a/src/components/Pages.jsx +++ b/src/components/Pages.jsx @@ -29,37 +29,37 @@ export default function Pages(props) { return (
- }/> - }> - }> - }> - }> - }> - }> - }> + }/> + }> + }> + }> + }> + }> + }> + }> {/* }> */} - }> - }> + }> + }> {/* }> */} - }> - }> - }/> - }> + }> + }> + }/> + }> - }> - }/> - }> + }> + }/> + }> - }> - }/> - }/> + }> + }/> + }/> {/* } /> */} - }/> + }/>
); diff --git a/src/components/profiles/settings/Profile.jsx b/src/components/profiles/settings/Profile.jsx index 91fa134..876d85e 100644 --- a/src/components/profiles/settings/Profile.jsx +++ b/src/components/profiles/settings/Profile.jsx @@ -1,10 +1,12 @@ -import React, { useEffect, useState } from 'react' +import React, { useContext, useEffect, useState } from 'react' import { FetchPOST } from '../../../middlewares/Fetch' import { useOutletContext } from 'react-router-dom'; import Loading from '../../Loading'; +import { I18nContext } from '../../../middlewares/Locale'; export default function Profile(props) { const { selectedMenu, setSelectedMenu } = useOutletContext(); + const { locale, setLocale } = useContext(I18nContext); const [settings, setSettings] = useState([]); const [loading, setLoading] = useState(true); @@ -17,20 +19,10 @@ export default function Profile(props) { const [relation, setRelation] = useState(""); const [privat, setPrivat] = useState(""); const [about, setAbout] = useState(""); - + const [language, setLanguage] = useState("tr"); const settingsPOST = async function(e) { e.preventDefault(); - const h = { - name: e.target.name.value, - surname: e.target.surname.value, - username: e.target.username.value, - gender: e.target.gender.value, - education: e.target.education.value, - relation: e.target.relation.value, - private: e.target.private.value, - about: e.target.about.value - }; await FetchPOST({ port: 3001, pathname: "/profile/settings", @@ -49,12 +41,14 @@ export default function Profile(props) { education: e.target.education.value, about: e.target.about.value, relation: e.target.relation.value, - private: e.target.private.value + private: e.target.private.value, + language: e.target.language.value }) } }) .then(res => { if(res.Status === "Success"){ + setLocale(e.target.language.value); window.location.reload(); }; }); @@ -78,6 +72,7 @@ export default function Profile(props) { setGender(res.data.user.gender); setRelation(res.data.user.relation); setAbout(res.data.user.about); + setLanguage(res.data.user.locale); setLoading(false); }); @@ -145,6 +140,27 @@ export default function Profile(props) {
+
+
+

Arayüz Dili

+ +
+ {/*
+

Gizlilik

+ +
*/} +

Hakkında

diff --git a/src/menus.js b/src/menus.js index 12cff36..90fd6de 100644 --- a/src/menus.js +++ b/src/menus.js @@ -1,18 +1,18 @@ export const menus = [{ id: 1, - title: "Anasayfa", + title: "homepage", path: "" },{ id: 2, - title: "Bloglar", + title: "blogs", path: "/blogs" },{ id: 3, - title: "Kişiler", + title: "peoples", path: "/peoples" },{ id: 4, - title: "Servisler", + title: "services", path: "/services" }]; diff --git a/src/middlewares/Locale.jsx b/src/middlewares/Locale.jsx new file mode 100644 index 0000000..cf9e6ef --- /dev/null +++ b/src/middlewares/Locale.jsx @@ -0,0 +1,31 @@ +import { createContext, useEffect, useState } from 'react'; +import { FetchPOST } from './Fetch'; + +const I18nContext = createContext(); + +const I18nProvider = ({ children }) => { + const [locale, setLocale] = useState({}); + + useEffect(() => { + FetchPOST({ + port: 3001, + pathname: "/get/user/my/get/locale" + }) + .then(res => { + FetchPOST({ + port: 3001, + pathname: "/locales/" + res.locale + }) + .then(res => setLocale(res)); + }); + + },[]); + + return ( + + {children} + + ); +}; + +export { I18nProvider, I18nContext }; \ No newline at end of file diff --git a/src/pages/Home.jsx b/src/pages/Home.jsx index e8a3caa..b200424 100644 --- a/src/pages/Home.jsx +++ b/src/pages/Home.jsx @@ -1,13 +1,16 @@ -import React, { useEffect } from 'react' +import React, { useContext, useEffect } from 'react' +import { I18nContext } from '../middlewares/Locale'; export default function Home({importData}) { + const { locale } = useContext(I18nContext); + useEffect(() => { importData.setSelectedMenu(1); },[]); return (
- Anasayfa + {locale['hello']}
); }; \ No newline at end of file