From 286a44eb9a0c8fef80d58079a9c68697e15778ff Mon Sep 17 00:00:00 2001 From: DenisArger Date: Thu, 31 Aug 2023 11:32:02 +0300 Subject: [PATCH 001/108] feat: add button for slide verses --- src/components/NextVerseButton.jsx | 26 +++++++++++++++++++++++++ src/components/PrevVerseButton.jsx | 31 ++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 src/components/NextVerseButton.jsx create mode 100644 src/components/PrevVerseButton.jsx diff --git a/src/components/NextVerseButton.jsx b/src/components/NextVerseButton.jsx new file mode 100644 index 0000000..a19696a --- /dev/null +++ b/src/components/NextVerseButton.jsx @@ -0,0 +1,26 @@ +import PropTypes from 'prop-types'; + +const NextVerseButton = ({ onClick }) => ( + +); + +NextVerseButton.propTypes = { + onClick: PropTypes.func.isRequired, +}; +export default NextVerseButton; diff --git a/src/components/PrevVerseButton.jsx b/src/components/PrevVerseButton.jsx new file mode 100644 index 0000000..95ff5f5 --- /dev/null +++ b/src/components/PrevVerseButton.jsx @@ -0,0 +1,31 @@ +import PropTypes from 'prop-types'; + +const PrevVerseButton = ({ onClick }) => ( + +); + +PrevVerseButton.propTypes = { + onClick: PropTypes.func.isRequired, + classes: PropTypes.string.isRequired, +}; +PrevVerseButton.defaultProps = { + onClick: () => {}, + classes: 'w-6 h-6', +}; +export default PrevVerseButton; From 5207fd22c905e083d8aaa9b1394c09059f71bc6d Mon Sep 17 00:00:00 2001 From: DenisArger Date: Thu, 31 Aug 2023 11:32:26 +0300 Subject: [PATCH 002/108] feat: add pagination for verses --- src/components/VerseSlider.jsx | 44 +++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/src/components/VerseSlider.jsx b/src/components/VerseSlider.jsx index 2700869..3a7b7d6 100644 --- a/src/components/VerseSlider.jsx +++ b/src/components/VerseSlider.jsx @@ -4,6 +4,8 @@ import { createBrowserHistory } from 'history'; import NextButton from './NextButton'; import PrevButton from './PrevButton'; +import NextVerseButton from './NextVerseButton'; +import PrevVerseButton from './PrevVerseButton'; import { languageIndexState } from '../atoms'; import versesData from '../verses.json'; @@ -49,24 +51,38 @@ const VerseSlider = () => { {versesData[languageIndex].verse}

+
+ {versesData.map((verse, index) => ( + + ))} +
+
-
-
-
- {versesData[languageIndex].languageOriginal}{' '} - - {versesData[ - languageIndex - ].languageOriginal.toLocaleLowerCase() !== - versesData[languageIndex].languageEnglish.toLocaleLowerCase() - ? '(' + versesData[languageIndex].languageEnglish + ')' - : ''} - -
-
+ +
+
+ + +
+ {versesData[languageIndex].languageOriginal}{' '} + + {versesData[languageIndex].languageOriginal.toLowerCase() !== + versesData[languageIndex].languageEnglish.toLowerCase() + ? '(' + versesData[languageIndex].languageEnglish + ')' + : ''} + +
+ + + + +
Date: Thu, 31 Aug 2023 12:07:57 +0300 Subject: [PATCH 003/108] feat: add ref on youtube --- public/youtube-hover.png | Bin 0 -> 407 bytes public/youtube.png | Bin 0 -> 404 bytes src/components/About.jsx | 35 +++++++++++++++++++++++++++++------ 3 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 public/youtube-hover.png create mode 100644 public/youtube.png diff --git a/public/youtube-hover.png b/public/youtube-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..a72be4dcf6b0528d991f74863e60025a227b3e0c GIT binary patch literal 407 zcmV;I0cie-P)dfOK$_Kna#$Ct89X3269SXWBiRhQ z1x6yE;-+SoY{Rz0D~m@>`%|3;tHS8H-2bzW1<+ywVAu_t-fTzx2j4(k1_<>*A?l0} z>S~2PE^@2>6p(KLDUn}a0%GQlf^&R;EfT7fVD+$)x#gc$Y@ zyeDIfYuh#jCJ)FOsA-zra~_dd)>_Q-j2LCv5z0#HuSpJT-}g=kkpgiItBC~}h9MPz zZK6Q5)~>3m902T30y$@#FxHw*%@4}U637MR_4O(sBNsHv
@@ -29,14 +34,32 @@ function About() {
-
-
+
+
{t('AboutProject')}

{t('AboutProjectText')}

-

{`${t('TranslatedLanguage', { - count: versesData.length, - })} 7000`}

+

+ {`${t('TranslatedLanguage', { + count: versesData.length, + })} 7000`} +

+
+
{t('OurGoal')}
From 0dfe865f6f6f47649e7cc9a5d702c6c4dd36c64a Mon Sep 17 00:00:00 2001 From: DenisArger Date: Thu, 31 Aug 2023 13:22:38 +0300 Subject: [PATCH 004/108] feat: add switch dark mode --- index.html | 3 ++- package.json | 3 ++- src/components/Header.jsx | 38 +++++++++++++++++++++++++++++++++++--- src/index.css | 1 - src/verses.json | 12 ++++++++++++ tailwind.config.js | 1 + yarn.lock | 5 +++++ 7 files changed, 57 insertions(+), 6 deletions(-) diff --git a/index.html b/index.html index d065b2c..1850f6f 100644 --- a/index.html +++ b/index.html @@ -16,9 +16,10 @@ 3:16 John - +
+ diff --git a/package.json b/package.json index c7f1601..e4c2e50 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,8 @@ "@headlessui/react": "^1.7.16", "axios": "^1.4.0", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "react-icons": "^4.10.1" }, "devDependencies": { "@types/react": "^18.2.15", diff --git a/src/components/Header.jsx b/src/components/Header.jsx index 9c80663..39beadc 100644 --- a/src/components/Header.jsx +++ b/src/components/Header.jsx @@ -1,12 +1,44 @@ +import { useState, useEffect } from 'react'; +import { FiSun, FiMoon } from 'react-icons/fi'; import LocaleSwitch from './LocaleSwitch'; function Header() { + const [isDarkMode, setIsDarkMode] = useState(false); + + const toggleDarkMode = () => { + const newMode = !isDarkMode; + setIsDarkMode(newMode); + localStorage.setItem('darkMode', newMode.toString()); + }; + + useEffect(() => { + const savedDarkMode = localStorage.getItem('darkMode'); + if (savedDarkMode) { + setIsDarkMode(savedDarkMode === 'true'); + } + }, []); + + useEffect(() => { + if (isDarkMode) { + document.documentElement.classList.add('dark') + } else { + document.documentElement.classList.remove('dark'); + } + }, [isDarkMode]); + return ( -
-
+
+
3:16 John
-
+
+
diff --git a/src/index.css b/src/index.css index 6b99ebe..776f09b 100644 --- a/src/index.css +++ b/src/index.css @@ -7,7 +7,6 @@ @layer base { html { font-family: 'Inter', system-ui, sans-serif; - @apply bg-white text-black dark:bg-stone-900 dark:text-zinc-100; } } diff --git a/src/verses.json b/src/verses.json index 719b096..72ebbe5 100644 --- a/src/verses.json +++ b/src/verses.json @@ -47,6 +47,18 @@ "nameTranslate": "Открытый перевод Нового Завета (OTNT)", "refNameTranslate": "http://biblelamp.ru/openbible/" }, + { + "languageEnglish": "russian", + "languageOriginal": "Русский", + "languageVariants": "russian, русский", + "verse": "Ибо так возлюбил Бог мир, что отдал Сына Своего Единородного, дабы всякий, верующий в Него, не погиб, но имел жизнь вечную", + "owner": "Test Owner", + "refOwner": "https://bible.by/nrt/", + "license": "CC BY-SA 3.0", + "refLicense": "https://creativecommons.org/licenses/by-sa/3.0/deed.ru", + "nameTranslate": "Синодальный", + "refNameTranslate": "http://biblelamp.ru/openbible/" + }, { "languageEnglish": "ukrainian", "languageOriginal": "Українська", diff --git a/tailwind.config.js b/tailwind.config.js index d21f1cd..d98165c 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,5 +1,6 @@ /** @type {import('tailwindcss').Config} */ export default { + darkMode: 'class', content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'], theme: { extend: {}, diff --git a/yarn.lock b/yarn.lock index b3554f0..6c5559a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1982,6 +1982,11 @@ react-i18next@^13.1.2: "@babel/runtime" "^7.22.5" html-parse-stringify "^3.0.1" +react-icons@^4.10.1: + version "4.10.1" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.10.1.tgz#3f3b5eec1f63c1796f6a26174a1091ca6437a500" + integrity sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw== + react-is@^16.13.1: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" From 3130dd2df7a91938f141303d9aa466e079915b8a Mon Sep 17 00:00:00 2001 From: DenisArger Date: Thu, 31 Aug 2023 14:57:03 +0300 Subject: [PATCH 005/108] feat: add original verses --- src/verses.json | 226 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 176 insertions(+), 50 deletions(-) diff --git a/src/verses.json b/src/verses.json index 72ebbe5..d1520f4 100644 --- a/src/verses.json +++ b/src/verses.json @@ -1,74 +1,200 @@ [ { - "languageEnglish": "belorussian", - "languageOriginal": "Беларуская", - "languageVariants": "Belorussian, беларуская, by", - "verse": "Бо так палюбіў Бог сьвет, што аддаў Сына Свайго Адзінароднага, каб кожны, хто верыць у Яго, не загінуў, а меў жыцьцё вечнае.", + "languageEnglish": "Belarusan", + "languageOriginal": "беларуская", + "languageVariants": "bel, Belarusan, беларуская", + "verse": "Бо так палюбіў Бог сьвет, што Сына Свайго Адзінароднага аддаў, каб кожны, хто верыць у Яго, не загінуў, але меў жыцьцё вечнае.", "owner": "", - "refOwner": "https://bible.by/nrt/", - "license": "Biblica, Inc.®, 2006, 2010, 2012, 2014", + "refOwner": "", + "license": "© Antoni Bokun", "refLicense": "", - "nameTranslate": "King James Version (KJV)", - "refNameTranslate": "https://bible.by/nrt/" + "nameTranslate": "Belarusian New Testament and Books of Old Testament", + "nameTranslateAlternative": "Новы Запавет і Кнігі Старога Запавету", + "shortNameTranslate": "NTPrv", + "refNameTranslate": "", + "openSourse": false }, { - "languageEnglish": "english", + "languageEnglish": "Belarusan", + "languageOriginal": "беларуская", + "languageVariants": "bel, Belarusan, беларуская", + "verse": "Бо так палюбіў Бог сьвет, што Сына Свайго Адзінароднага аддаў, каб кожны, хто верыць у Яго, не загінуў, але меў жыцьцё вечнае.", + "owner": "", + "refOwner": "", + "license": "© Antoni Bokun", + "refLicense": "", + "nameTranslate": "Bible (A.Bokun translation)", + "nameTranslateAlternative": "Біблія (пераклад А.Бокуна)", + "shortNameTranslate": "BBB", + "refNameTranslate": "", + "openSourse": false + }, + { + "languageEnglish": "German, Standard", + "languageOriginal": "Deutsch", + "languageVariants": "deu, German, Standard, Deutsch", + "verse": "Denn so hat Gott die Welt geliebt, dass er seinen eingeborenen Sohn gab, damit jeder, der an ihn glaubt, nicht verloren gehe, sondern ewiges Leben habe.", + "owner": "", + "refOwner": "", + "license": "© 2019 by Verbreitung des christlichen Glaubens e.V.", + "refLicense": "", + "nameTranslate": "Elberfelder Translation (Version of bibelkommentare.de)", + "nameTranslateAlternative": "Elberfelder Übersetzung (Version von bibelkommentare.de)", + "shortNameTranslate": "ELBBK", + "refNameTranslate": "", + "openSourse": false + }, + { + "languageEnglish": "German, Standard", + "languageOriginal": "Deutsch", + "languageVariants": "deu, German, Standard, Deutsch", + "verse": "Also hat Gott die Welt geliebt, daß er seinen eingeborenen Sohn gab, auf daß alle, die an ihn glauben, nicht verloren werden, sondern das ewige Leben haben.", + "owner": "", + "refOwner": "", + "license": "This work is in the Public Domain due to copyright expiration.", + "refLicense": "", + "nameTranslate": "German Luther Bible 1912 with Strong's numbers", + "nameTranslateAlternative": "Lutherbibel 1912 mit Strongs", + "shortNameTranslate": "deuL1912", + "refNameTranslate": "", + "openSourse": false + }, + { + "languageEnglish": "German, Standard", + "languageOriginal": "Deutsch", + "languageVariants": "deu, German, Standard, Deutsch", + "verse": "Denn also hat Gott die Welt geliebt, daß er seinen eingeborenen Sohn gab, auf daß jeder, der an ihn glaubt, nicht verloren gehe, sondern ewiges Leben habe.", + "owner": "", + "refOwner": "", + "license": "PUBLIC DOMAIN. Published 1905", + "refLicense": "", + "nameTranslate": "German Unrevised Elberfelder Bible", + "nameTranslateAlternative": "Darby Unrevidierte Elberfelder", + "shortNameTranslate": "deuelo", + "refNameTranslate": "", + "openSourse": false + }, + + { + "languageEnglish": "English", "languageOriginal": "English", - "languageVariants": "english", + "languageVariants": "eng, English, English", + "verse": "", + "owner": "", + "refOwner": "", + "license": "The Holy Bible, Berean Standard Bible, BSB is produced in cooperation with Bible Hub, Discovery Bible, OpenBible.com, and the Berean Bible Translation Committee. This text of God's Word has been dedicated to the public domain", + "refLicense": "", + "nameTranslate": "Berean Standard Bible", + "nameTranslateAlternative": "English: Berean Standard Bible", + "shortNameTranslate": "BSB", + "refNameTranslate": "", + "openSourse": false + } + ,{ + "languageEnglish": "English", + "languageOriginal": "English", + "languageVariants": "eng, English, English", "verse": "For God so loved the world, that he gave his only begotten Son, that whosoever believeth in him should not perish, but have everlasting life.", "owner": "", - "refOwner": "https://bible.by/nrt/", - "license": "Biblica, Inc.®, 2006, 2010, 2012, 2014", + "refOwner": "", + "license": "PUBLIC DOMAIN except in the United Kingdom, where a Crown Copyright applies to printing the KJV. See http://www.cambridge.org/about-us/who-we-are/queens-printers-patent", "refLicense": "", - "nameTranslate": "King James Version (KJV)", - "refNameTranslate": "https://bible.by/nrt/" + "nameTranslate": "King James (Authorised) Version", + "nameTranslateAlternative": "King James Version", + "shortNameTranslate": "engKJV", + "refNameTranslate": "", + "openSourse": false }, { - "languageEnglish": "german", - "languageOriginal": "Deutsch", - "languageVariants": "german, deutsch", - "verse": "Denn also hat Gott die Welt geliebt, daß er seinen eingeborenen Sohn gab, damit alle, die an ihn glauben, nicht verloren werden, sondern das ewige Leben haben.", + "languageEnglish": "English", + "languageOriginal": "English", + "languageVariants": "eng, English, English", + "verse": "For God so loved the world that He gave the only begotten Son, that everyone who is believing in Him may not perish, but may have continuous life.", "owner": "", - "refOwner": "https://bible.by/nrt/", - "license": "Biblica, Inc.®, 2006, 2010, 2012, 2014", + "refOwner": "", + "license": "The Literal Standard Version of The Holy Bible is a registered copyright of Covenant Press and the Covenant Christian Coalition (© 2020), but has been subsequently released under the Creative Commons Attribution-ShareAlike license (CC BY-SA) per our desire to provide God’s word freely. Covenant Press requests that the text remain unaltered in the English language and that translations based on the LSV maintain the same spirit of faithfulness to the original Hebrew, Aramaic, and Greek text. Attribution of minor citations for personal or non-commercial use can be provided as simply “LSV” or “Literal Standard Version.” Citations for commercial use, or distribution of the entire LSV Bible or entire book(s) of the LSV Bible, must be fully attributed and include both “Literal Standard Version (LSV)” and the name of our organization. Covenant Press is soliciting partnerships with Bible publishers that are interested in the LSV project. For queries about partnering with us, please email the translation team at covenantpress@ccc.one. To learn more, visit lsvbible.com. The purpose behind the LSV is to provide readers with a modern, easy-to-read, literal, and accurate translation of the Bible that is free to read, distribute, and translate from. We pray that God will use the LSV to illuminate the hearts and minds of multitudes with the good news that His Son Jesus Christ came in the flesh, died for our sins as a substitutionary sacrifice, rose bodily from the dead, and is coming back again.", "refLicense": "", - "nameTranslate": "King James Version (KJV)", - "refNameTranslate": "https://bible.by/nrt/" + "nameTranslate": "Literal Standard Version", + "nameTranslateAlternative": "Literal Standard Version", + "shortNameTranslate": "LSV", + "refNameTranslate": "", + "openSourse": false }, { - "languageEnglish": "russian", - "languageOriginal": "Русский", - "languageVariants": "russian, русский", - "verse": "Бог так полюбил мир, что дал Единственного Сына, чтобы верующий в Него не погиб, но обрел вечную жизнь.", - "owner": "Test Owner", - "refOwner": "https://bible.by/nrt/", - "license": "CC BY-SA 3.0", - "refLicense": "https://creativecommons.org/licenses/by-sa/3.0/deed.ru", - "nameTranslate": "Открытый перевод Нового Завета (OTNT)", - "refNameTranslate": "http://biblelamp.ru/openbible/" + "languageEnglish": "English", + "languageOriginal": "English", + "languageVariants": "eng, English, English", + "verse": "For God so loved the world, that he gave his only born Son, that whoever believes in him should not perish, but have eternal life.", + "owner": "", + "refOwner": "", + "license": "\n PUBLIC DOMAIN\n ", + "refLicense": "", + "nameTranslate": "World English Bible", + "nameTranslateAlternative": "World English Bible", + "shortNameTranslate": "WEB", + "refNameTranslate": "", + "openSourse": false }, { - "languageEnglish": "russian", - "languageOriginal": "Русский", - "languageVariants": "russian, русский", - "verse": "Ибо так возлюбил Бог мир, что отдал Сына Своего Единородного, дабы всякий, верующий в Него, не погиб, но имел жизнь вечную", - "owner": "Test Owner", - "refOwner": "https://bible.by/nrt/", - "license": "CC BY-SA 3.0", - "refLicense": "https://creativecommons.org/licenses/by-sa/3.0/deed.ru", - "nameTranslate": "Синодальный", - "refNameTranslate": "http://biblelamp.ru/openbible/" + "languageEnglish": "Spanish", + "languageOriginal": "Español", + "languageVariants": "spa, Spanish, Español", + "verse": "Porque de tal manera amó Dios al mundo, que ha dado á su Hijo unigénito, para que todo aquel que en él cree, no se pierda, mas tenga vida eterna.", + "owner": "", + "refOwner": "", + "license": "Reina-Valera 1909 - Dominio público. Fue realizada por Sociedades Bíblicas Unidas y publicada por primera vez en 1909.", + "refLicense": "", + "nameTranslate": "Reina Valera 1909", + "nameTranslateAlternative": "Reina Valera 1909", + "shortNameTranslate": "RVR09", + "refNameTranslate": "", + "openSourse": false + }, + + { + "languageEnglish": "Spanish", + "languageOriginal": "Español", + "languageVariants": "spa, Spanish, Español", + "verse": "Porque Dios tuvo tal amor por el mundo que le dio a su único Hijo, para que todo el que tenga fe en él no muera, sino que tenga vida eterna.", + "owner": "", + "refOwner": "", + "license": "This Bible translation is in the PUBLIC DOMAIN (not copyrighted). CC0", + "refLicense": "", + "nameTranslate": "The Holy Bible in Simple Spanish", + "nameTranslateAlternative": "La Biblia en Español Sencillo", + "shortNameTranslate": "spabes", + "refNameTranslate": "", + "openSourse": false + }, + { + "languageEnglish": "Spanish", + "languageOriginal": "Español", + "languageVariants": "spa, Spanish, Español", + "verse": "Porque Dios amó al mundo, y lo hizo de esta manera: entregó a su único Hijo, a fin de que todos los que crean en él no mueran, sino que tengan vida eterna.", + "owner": "", + "refOwner": "", + "license": "Derechos de autor © 2022 Jonathan Gallagher. Publicado bajo licencia Creative Commons Attribution-ShareAlike 4.0 Unported. Versión 1.1 beta. Para correcciones enviar correo electrónico a jonathangallagherfbv@gmail.com Copyright © 2022 Jonathan Gallagher. Dr. Jonathan Gallagher. Released under Creative Commons Attribution-ShareAlike 4.0 Unported License. Version 1.1 beta. For corrections send email to jonathangallagherfbv@gmail.com", + "refLicense": "", + "nameTranslate": "The New Testament in Spanish, Free Bible Version", + "nameTranslateAlternative": "El Nuevo Testamento, Versión Biblia Libre", + "shortNameTranslate": "VBL", + "refNameTranslate": "", + "openSourse": false }, { - "languageEnglish": "ukrainian", - "languageOriginal": "Українська", - "languageVariants": "Ukrainian, ua, Українська", - "verse": "Так бо Бог полюбив світ, що дав Сина Свого Одноро́дженого, щоб кожен, хто вірує в Нього, не згинув, але мав життя вічне.", + "languageEnglish": "Spanish", + "languageOriginal": "Español", + "languageVariants": "spa, Spanish, Español", + "verse": "Porque Dios amó al mundo, y lo hizo de esta manera: entregó a su único Hijo, a fin de que todos los que crean en él no mueran, sino que tengan vida eterna. ", "owner": "", - "refOwner": "https://bible.by/nrt/", - "license": "Biblica, Inc.®, 2006, 2010, 2012, 2014", + "refOwner": "", + "license": "Derechos de autor © 2022 Jonathan Gallagher. Publicado bajo licencia Creative Commons Attribution-ShareAlike 4.0 Unported. Versión 1.1 beta. Para correcciones enviar correo electrónico a jonathangallagherfbv@gmail.com Copyright © 2022 Jonathan Gallagher. Dr. Jonathan Gallagher. Released under Creative Commons Attribution-ShareAlike 4.0 Unported License. Version 1.1 beta. For corrections send email to jonathangallagherfbv@gmail.com", "refLicense": "", - "nameTranslate": "King James Version (KJV)", - "refNameTranslate": "https://bible.by/nrt/" + "nameTranslate": "Versión Biblia Libre", + "nameTranslateAlternative": "Versión Biblia Libre", + "shortNameTranslate": "VBL", + "refNameTranslate": "", + "openSourse": false } + ] From 944c87996d2bc170ec762e98ca64c426f9811e93 Mon Sep 17 00:00:00 2001 From: DenisArger Date: Fri, 1 Sep 2023 20:35:40 +0300 Subject: [PATCH 006/108] fix: edi text about --- public/locales/ru/translation.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/locales/ru/translation.json b/public/locales/ru/translation.json index b1d2e3a..a551265 100644 --- a/public/locales/ru/translation.json +++ b/public/locales/ru/translation.json @@ -1,6 +1,6 @@ { "AboutProject": "О проекте", - "AboutProjectText": "На русском. Lorem ipsum dolor sit amet consectetur. Massa nunc tempor velit vivamus vitae auctor. A sagittis sit nunc sed blandit. Ipsum eu orci magna sed ipsum tristique nec. Eget mi faucibus est nunc arcu viverra.", + "AboutProjectText": " Иоанна 3:16 - проект, цель которого сделать доступным хорошо известный стих на все языки мира.", "By": "от", "ContactUs": "Свяжитесь с нами", "Country": "Страна", @@ -18,7 +18,7 @@ "Message": "Сообщение", "NotAllFieldFull": "Не все поля заполнены", "OurGoal": "Наша цель", - "OurGoalText": "Наша цель - до 2033 года перевести стих Иоанна 3:16 на все языки мира.", + "OurGoalText": "Наша цель - поддержать видение по переводу Библии до 2033 года на все языки мира.", "PrivacyPolicyMessage": "Нажимая кнопку 'Отправить', вы соглашаетесь с политикой конфиденциальности.", "Send": "Отправить", "YourEmail": "Ваш email", From ed10ed894a2132da556b0421bbf534bd0e810e2d Mon Sep 17 00:00:00 2001 From: DenisArger Date: Fri, 1 Sep 2023 20:35:57 +0300 Subject: [PATCH 007/108] fix: edit file json --- src/verses.json | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/verses.json b/src/verses.json index d1520f4..f92af89 100644 --- a/src/verses.json +++ b/src/verses.json @@ -30,9 +30,9 @@ "openSourse": false }, { - "languageEnglish": "German, Standard", + "languageEnglish": "German", "languageOriginal": "Deutsch", - "languageVariants": "deu, German, Standard, Deutsch", + "languageVariants": "deu, German,Deutsch", "verse": "Denn so hat Gott die Welt geliebt, dass er seinen eingeborenen Sohn gab, damit jeder, der an ihn glaubt, nicht verloren gehe, sondern ewiges Leben habe.", "owner": "", "refOwner": "", @@ -45,7 +45,7 @@ "openSourse": false }, { - "languageEnglish": "German, Standard", + "languageEnglish": "German", "languageOriginal": "Deutsch", "languageVariants": "deu, German, Standard, Deutsch", "verse": "Also hat Gott die Welt geliebt, daß er seinen eingeborenen Sohn gab, auf daß alle, die an ihn glauben, nicht verloren werden, sondern das ewige Leben haben.", @@ -60,9 +60,9 @@ "openSourse": false }, { - "languageEnglish": "German, Standard", + "languageEnglish": "German", "languageOriginal": "Deutsch", - "languageVariants": "deu, German, Standard, Deutsch", + "languageVariants": "deu, German, Deutsch", "verse": "Denn also hat Gott die Welt geliebt, daß er seinen eingeborenen Sohn gab, auf daß jeder, der an ihn glaubt, nicht verloren gehe, sondern ewiges Leben habe.", "owner": "", "refOwner": "", @@ -74,23 +74,7 @@ "refNameTranslate": "", "openSourse": false }, - { - "languageEnglish": "English", - "languageOriginal": "English", - "languageVariants": "eng, English, English", - "verse": "", - "owner": "", - "refOwner": "", - "license": "The Holy Bible, Berean Standard Bible, BSB is produced in cooperation with Bible Hub, Discovery Bible, OpenBible.com, and the Berean Bible Translation Committee. This text of God's Word has been dedicated to the public domain", - "refLicense": "", - "nameTranslate": "Berean Standard Bible", - "nameTranslateAlternative": "English: Berean Standard Bible", - "shortNameTranslate": "BSB", - "refNameTranslate": "", - "openSourse": false - } - ,{ "languageEnglish": "English", "languageOriginal": "English", "languageVariants": "eng, English, English", @@ -135,6 +119,21 @@ "refNameTranslate": "", "openSourse": false }, + { + "languageEnglish": "English", + "languageOriginal": "English", + "languageVariants": "eng, English, English", + "verse": "16For God so loued the worlde, that hee hath giuen his onely begotten Sonne, that whosoeuer beleeueth in him, should not perish, but haue euerlasting life. ", + "owner": "", + "refOwner": "", + "license": "PUBLIC DOMAIN", + "refLicense": "", + "nameTranslate": "Geneva Bible", + "nameTranslateAlternative": "Geneva Bible", + "shortNameTranslate": "enggnv", + "refNameTranslate": "", + "openSourse": false + }, { "languageEnglish": "Spanish", "languageOriginal": "Español", From 02f4a50d5f12305b2800edb9886b217bab707e37 Mon Sep 17 00:00:00 2001 From: DenisArger Date: Fri, 1 Sep 2023 20:38:18 +0300 Subject: [PATCH 008/108] fix: the theme switching icon has been reduced --- src/components/Header.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Header.jsx b/src/components/Header.jsx index 39beadc..47277dd 100644 --- a/src/components/Header.jsx +++ b/src/components/Header.jsx @@ -28,12 +28,12 @@ function Header() { return (
-
+
3:16 John
- +
+ 3:16 John
+ +
); } From 9ed0de6cde99147abf709b5d3ef28aab3f4f10f1 Mon Sep 17 00:00:00 2001 From: DenisArger Date: Fri, 1 Sep 2023 21:48:48 +0300 Subject: [PATCH 012/108] refactor: delete extract code --- src/components/VerseSlider.jsx | 36 ++++++++++++++++------------------ 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/src/components/VerseSlider.jsx b/src/components/VerseSlider.jsx index be64bff..2cd9d37 100644 --- a/src/components/VerseSlider.jsx +++ b/src/components/VerseSlider.jsx @@ -17,8 +17,23 @@ const VerseSlider = () => { const [languageIndex, setLanguageIndex] = useRecoilState(languageIndexState); const [translateIndex, setTranslateIndex] = useState(0); + const getLanguageGroups = () => { + const groups = {}; + versesData.forEach((verse) => { + if (!groups[verse.languageEnglish]) { + groups[verse.languageEnglish] = []; + } + groups[verse.languageEnglish].push(verse); + }); + return groups; + }; + + + const languageGroups = getLanguageGroups(); + const currentLanguage = versesData[languageIndex].languageEnglish; + const currentGroup = languageGroups[currentLanguage]; + const goToNextVerse = () => { - const currentLanguage = versesData[languageIndex].languageEnglish; const languages = Object.keys(languageGroups); const currentIndex = languages.indexOf(currentLanguage); const nextIndex = (currentIndex + 1) % languages.length; @@ -31,7 +46,6 @@ const VerseSlider = () => { }; const goToPrevVerse = () => { - const currentLanguage = versesData[languageIndex].languageEnglish; const languages = Object.keys(languageGroups); const currentIndex = languages.indexOf(currentLanguage); const prevIndex = (currentIndex - 1 + languages.length) % languages.length; @@ -44,8 +58,6 @@ const VerseSlider = () => { }; const goToNextVerseLang = () => { - const currentLanguage = versesData[languageIndex].languageEnglish; - const currentGroup = languageGroups[currentLanguage]; const nextIndex = (translateIndex + 1) % currentGroup.length; setTranslateIndex(nextIndex); @@ -59,8 +71,6 @@ const VerseSlider = () => { }; const goToPrevVerseLang = () => { - const currentLanguage = versesData[languageIndex].languageEnglish; - const currentGroup = languageGroups[currentLanguage]; const prevIndex = (translateIndex - 1 + currentGroup.length) % currentGroup.length; setTranslateIndex(prevIndex); @@ -73,20 +83,8 @@ const VerseSlider = () => { history.push('/' + prevLanguageEnglish + '/' + prevShortNameTranslate); }; - const getLanguageGroups = () => { - const groups = {}; - versesData.forEach((verse) => { - if (!groups[verse.languageEnglish]) { - groups[verse.languageEnglish] = []; - } - groups[verse.languageEnglish].push(verse); - }); - return groups; - }; - const languageGroups = getLanguageGroups(); - const currentLanguage = versesData[languageIndex].languageEnglish; - const currentGroup = languageGroups[currentLanguage]; + return (
From 0fba6a41681fb05d9db2913f086f13232c8cd94b Mon Sep 17 00:00:00 2001 From: DenisArger Date: Fri, 1 Sep 2023 22:41:14 +0300 Subject: [PATCH 013/108] =?UTF-8?q?refactor:=20add=20file=20VerseUtils=20f?= =?UTF-8?q?o=D0=BA=20getLanguageGroups?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/VerseSlider.jsx | 19 +++---------------- src/components/VerseUtils.jsx | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 16 deletions(-) create mode 100644 src/components/VerseUtils.jsx diff --git a/src/components/VerseSlider.jsx b/src/components/VerseSlider.jsx index 2cd9d37..997dcc5 100644 --- a/src/components/VerseSlider.jsx +++ b/src/components/VerseSlider.jsx @@ -7,7 +7,7 @@ import NextButton from './NextButton'; import PrevButton from './PrevButton'; import NextVerseButton from './NextVerseButton'; import PrevVerseButton from './PrevVerseButton'; - +import { languageGroups } from './VerseUtils'; import { languageIndexState } from '../atoms'; import versesData from '../verses.json'; @@ -17,19 +17,6 @@ const VerseSlider = () => { const [languageIndex, setLanguageIndex] = useRecoilState(languageIndexState); const [translateIndex, setTranslateIndex] = useState(0); - const getLanguageGroups = () => { - const groups = {}; - versesData.forEach((verse) => { - if (!groups[verse.languageEnglish]) { - groups[verse.languageEnglish] = []; - } - groups[verse.languageEnglish].push(verse); - }); - return groups; - }; - - - const languageGroups = getLanguageGroups(); const currentLanguage = versesData[languageIndex].languageEnglish; const currentGroup = languageGroups[currentLanguage]; @@ -39,7 +26,7 @@ const VerseSlider = () => { const nextIndex = (currentIndex + 1) % languages.length; const nextLanguage = languages[nextIndex]; - setTranslateIndex(0); // Сбросить translateIndex на 0 при переключении языковой группы + setTranslateIndex(0); setLanguageIndex(versesData.findIndex((verse) => verse.languageEnglish === nextLanguage)); history.push('/' + nextLanguage + '/' + languageGroups[nextLanguage][0].shortNameTranslate); @@ -51,7 +38,7 @@ const VerseSlider = () => { const prevIndex = (currentIndex - 1 + languages.length) % languages.length; const prevLanguage = languages[prevIndex]; - setTranslateIndex(0); // Сбросить translateIndex на 0 при переключении языковой группы + setTranslateIndex(0); setLanguageIndex(versesData.findIndex((verse) => verse.languageEnglish === prevLanguage)); history.push('/' + prevLanguage + '/' + languageGroups[prevLanguage][0].shortNameTranslate); diff --git a/src/components/VerseUtils.jsx b/src/components/VerseUtils.jsx new file mode 100644 index 0000000..2544d32 --- /dev/null +++ b/src/components/VerseUtils.jsx @@ -0,0 +1,15 @@ +import versesData from '../verses.json'; + +const getLanguageGroups = () => { + const groups = {}; + versesData.forEach((verse) => { + if (!groups[verse.languageEnglish]) { + groups[verse.languageEnglish] = []; + } + groups[verse.languageEnglish].push(verse); + }); + return groups; + }; + + + export const languageGroups = getLanguageGroups(); From 1785ae466c943ce15f821fd96a159b571465fa2b Mon Sep 17 00:00:00 2001 From: DenisArger Date: Fri, 1 Sep 2023 22:41:58 +0300 Subject: [PATCH 014/108] feat: edit count: count language --- src/components/About.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/About.jsx b/src/components/About.jsx index 3e88fa8..51cd83d 100644 --- a/src/components/About.jsx +++ b/src/components/About.jsx @@ -5,8 +5,9 @@ import Feedback from './Feedback'; import Modal from './Modal'; import PrevButton from './PrevButton'; import Header from './Header'; +import { languageGroups } from './VerseUtils'; -import versesData from '../verses.json'; +// import versesData from '../verses.json'; import youtubeImage from '../../public/youtube.png'; import youtubeHoverImage from '../../public/youtube-hover.png'; @@ -14,7 +15,6 @@ function About() { const { t } = useTranslation(); const [isOpen, setIsOpen] = useState(false); const [isHovered, setIsHovered] = useState(false); - return (
@@ -41,7 +41,7 @@ function About() {

{t('AboutProjectText')}

{`${t('TranslatedLanguage', { - count: versesData.length, + count: Object.keys(languageGroups).length, })} 7000`}

From 9aea1caf4973e971be23ed1e5623a424c8b8db9a Mon Sep 17 00:00:00 2001 From: DenisArger Date: Fri, 1 Sep 2023 23:10:15 +0300 Subject: [PATCH 015/108] fix: edit translate about Project and goal --- public/locales/en/translation.json | 4 ++-- public/locales/ru/translation.json | 2 +- src/components/About.jsx | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 10c26cd..79dc423 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -1,6 +1,6 @@ { "AboutProject": "About project", - "AboutProjectText": "English. Lorem ipsum dolor sit amet consectetur. Massa nunc tempor velit vivamus vitae auctor. A sagittis sit nunc sed blandit. Ipsum eu orci magna sed ipsum tristique nec. Eget mi faucibus est nunc arcu viverra.", + "AboutProjectText": "John 3:16 is a project aimed at making a well-known verse available in all languages of the world.", "By": "by", "ContactUs": "Contact us", "Country": "Country", @@ -18,7 +18,7 @@ "Message": "Message", "NotAllFieldFull": "Not all fields are filled in", "OurGoal": "Our goal", - "OurGoalText": "Our goal is to have John 3:16 translated into all the languages of the world by 2033.", + "OurGoalText": "Our goal is to support the vision of translating the Bible until 2033 into all languages of the world.", "PrivacyPolicyMessage": "By clicking the 'Submit' button, you agree to the privacy policy.", "Send": "Send", "YourEmail": "Your email", diff --git a/public/locales/ru/translation.json b/public/locales/ru/translation.json index a551265..fb462eb 100644 --- a/public/locales/ru/translation.json +++ b/public/locales/ru/translation.json @@ -1,6 +1,6 @@ { "AboutProject": "О проекте", - "AboutProjectText": " Иоанна 3:16 - проект, цель которого сделать доступным хорошо известный стих на все языки мира.", + "AboutProjectText": "Иоанна 3:16 - проект, цель которого сделать доступным хорошо известный стих на все языки мира.", "By": "от", "ContactUs": "Свяжитесь с нами", "Country": "Страна", diff --git a/src/components/About.jsx b/src/components/About.jsx index 51cd83d..feed6c1 100644 --- a/src/components/About.jsx +++ b/src/components/About.jsx @@ -7,7 +7,6 @@ import PrevButton from './PrevButton'; import Header from './Header'; import { languageGroups } from './VerseUtils'; -// import versesData from '../verses.json'; import youtubeImage from '../../public/youtube.png'; import youtubeHoverImage from '../../public/youtube-hover.png'; From 30376cfa38dc7e58fede5275c87c91b6efb771cb Mon Sep 17 00:00:00 2001 From: Denis Arger Date: Wed, 6 Sep 2023 11:49:21 +0300 Subject: [PATCH 016/108] style: changes after autoformatting --- src/App.jsx | 8 +-- src/atoms.js | 2 +- src/components/About.jsx | 30 ++++----- src/components/Feedback.jsx | 49 +++++++-------- src/components/Header.jsx | 18 +++--- src/components/LanguageSelect.jsx | 29 +++++---- src/components/LocaleSwitch.jsx | 17 +++--- src/components/Modal.jsx | 12 ++-- src/components/NextButton.jsx | 8 ++- src/components/NextVerseButton.jsx | 8 ++- src/components/PrevButton.jsx | 10 +-- src/components/VerseSlider.jsx | 97 ++++++++++++++++++------------ src/components/VerseUtils.jsx | 23 ++++--- src/i18n.js | 2 +- src/main.jsx | 14 ++--- 15 files changed, 181 insertions(+), 146 deletions(-) diff --git a/src/App.jsx b/src/App.jsx index 252de3a..3ebb6fe 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,7 +1,7 @@ -import LanguageSelect from './components/LanguageSelect'; -import Header from './components/Header'; -import VerseSlider from './components/VerseSlider'; -import About from './components/About'; +import LanguageSelect from "./components/LanguageSelect"; +import Header from "./components/Header"; +import VerseSlider from "./components/VerseSlider"; +import About from "./components/About"; function App() { return ( diff --git a/src/atoms.js b/src/atoms.js index dcc1214..ffa521f 100644 --- a/src/atoms.js +++ b/src/atoms.js @@ -3,4 +3,4 @@ import { atom } from 'recoil'; export const languageIndexState = atom({ key: 'languageIndexState', default: 0, -}); +}); \ No newline at end of file diff --git a/src/components/About.jsx b/src/components/About.jsx index feed6c1..150701b 100644 --- a/src/components/About.jsx +++ b/src/components/About.jsx @@ -1,14 +1,14 @@ -import { useState } from 'react'; -import { useTranslation } from 'react-i18next'; +import { useState } from "react"; +import { useTranslation } from "react-i18next"; -import Feedback from './Feedback'; -import Modal from './Modal'; -import PrevButton from './PrevButton'; -import Header from './Header'; -import { languageGroups } from './VerseUtils'; +import Feedback from "./Feedback"; +import Modal from "./Modal"; +import PrevButton from "./PrevButton"; +import Header from "./Header"; +import { languageGroups } from "./VerseUtils"; -import youtubeImage from '../../public/youtube.png'; -import youtubeHoverImage from '../../public/youtube-hover.png'; +import youtubeImage from "../../public/youtube.png"; +import youtubeHoverImage from "../../public/youtube-hover.png"; function About() { const { t } = useTranslation(); @@ -21,7 +21,7 @@ function About() { className="font-bold underline text-base" onClick={() => setIsOpen(true)} > - {t('AboutProject')} + {t("AboutProject")}
setIsOpen(false)}> @@ -36,10 +36,10 @@ function About() {
diff --git a/src/components/Feedback.jsx b/src/components/Feedback.jsx index 869f9db..801f0f3 100644 --- a/src/components/Feedback.jsx +++ b/src/components/Feedback.jsx @@ -1,27 +1,27 @@ -import { useEffect, useState } from 'react'; -import { useTranslation } from 'react-i18next'; -import axios from 'axios'; +import { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; +import axios from "axios"; function Feedback() { const { t } = useTranslation(); - const [name, setName] = useState(''); - const [email, setEmail] = useState(''); - const [country, setCountry] = useState(''); - const [message, setMessage] = useState(''); - const [error, setError] = useState(''); + const [name, setName] = useState(""); + const [email, setEmail] = useState(""); + const [country, setCountry] = useState(""); + const [message, setMessage] = useState(""); + const [error, setError] = useState(""); const [isSended, setIsSended] = useState(false); const validation = () => { let error = null; if (!name || !country || !email || !message) { - error = 'NotAllFieldFull'; + error = "NotAllFieldFull"; } return { error }; }; const handleSubmit = (e) => { e.preventDefault(); - setError(''); + setError(""); const { error } = validation(); if (error) { setError(error); @@ -29,16 +29,16 @@ function Feedback() { } axios .post( - '/.netlify/functions/sendFeedback', + "/.netlify/functions/sendFeedback", JSON.stringify({ name, country, message, email }) ) .then((res) => { console.log({ res }); setIsSended(true); - setCountry(''); - setName(''); - setEmail(''); - setMessage(''); + setCountry(""); + setName(""); + setEmail(""); + setMessage(""); }) .catch((err) => { console.log({ err }); @@ -54,27 +54,28 @@ function Feedback() { <>
-
{t('ContactUs')}
+ className="flex flex-col items-center justify-center gap-7 border-t border-gray-400 dark:border-zinc-700 pt-7" + > +
{t("ContactUs")}
{!isSended ? (
setName(e.target.value)} /> setEmail(e.target.value)} /> setCountry(e.target.value)} />