diff --git a/package-lock.json b/package-lock.json index 5048b8a..885fb93 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,7 @@ "gh-pages": "^3.2.3", "google-spreadsheet": "^3.1.15", "googleapis": "^39.2.0", - "i18next": "^22.4.13", + "i18next": "^22.4.15", "i18next-browser-languagedetector": "^7.0.1", "mkdirp": "^1.0.4", "prettier": "^2.4.1", @@ -41,7 +41,7 @@ "react-router-dom": "^6.10.0", "react-scripts": "4.0.3", "react-timer-hook": "^3.0.5", - "react-to-print": "^2.14.0", + "react-to-print": "^2.14.12", "rimraf": "^3.0.2", "ts-node": "^10.3.0", "ts-prune": "^0.10.1", @@ -9943,9 +9943,9 @@ } }, "node_modules/i18next": { - "version": "22.4.13", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.4.13.tgz", - "integrity": "sha512-GX7flMHRRqQA0I1yGLmaZ4Hwt1JfLqagk8QPDPZsqekbKtXsuIngSVWM/s3SLgNkrEXjA+0sMGNuOEkkmyqmWg==", + "version": "22.4.15", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.4.15.tgz", + "integrity": "sha512-yYudtbFrrmWKLEhl6jvKUYyYunj4bTBCe2qIUYAxbXoPusY7YmdwPvOE6fx6UIfWvmlbCWDItr7wIs8KEBZ5Zg==", "funding": [ { "type": "individual", @@ -15531,12 +15531,13 @@ } }, "node_modules/prop-types": { - "version": "15.7.2", - "license": "MIT", + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", - "react-is": "^16.8.1" + "react-is": "^16.13.1" } }, "node_modules/prop-types/node_modules/react-is": { @@ -16160,14 +16161,15 @@ } }, "node_modules/react-to-print": { - "version": "2.14.0", - "license": "MIT", + "version": "2.14.12", + "resolved": "https://registry.npmjs.org/react-to-print/-/react-to-print-2.14.12.tgz", + "integrity": "sha512-qFJAwvDFd95Z+FWNqitt+HaB1/z+Zdd0MMrNOPUSus3fG32vqv512yB+HXhQ94J3HKoyqaIg44v0Zfc6xUBqlg==", "dependencies": { - "prop-types": "^15.7.2" + "prop-types": "^15.8.1" }, "peerDependencies": { - "react": "^15.0.0 || ^16.0.0 || ^17.0.0", - "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0" + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/read-pkg": { @@ -27357,9 +27359,9 @@ "version": "1.1.1" }, "i18next": { - "version": "22.4.13", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.4.13.tgz", - "integrity": "sha512-GX7flMHRRqQA0I1yGLmaZ4Hwt1JfLqagk8QPDPZsqekbKtXsuIngSVWM/s3SLgNkrEXjA+0sMGNuOEkkmyqmWg==", + "version": "22.4.15", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.4.15.tgz", + "integrity": "sha512-yYudtbFrrmWKLEhl6jvKUYyYunj4bTBCe2qIUYAxbXoPusY7YmdwPvOE6fx6UIfWvmlbCWDItr7wIs8KEBZ5Zg==", "requires": { "@babel/runtime": "^7.20.6" }, @@ -30921,11 +30923,13 @@ } }, "prop-types": { - "version": "15.7.2", + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "requires": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", - "react-is": "^16.8.1" + "react-is": "^16.13.1" }, "dependencies": { "react-is": { @@ -31351,9 +31355,11 @@ "requires": {} }, "react-to-print": { - "version": "2.14.0", + "version": "2.14.12", + "resolved": "https://registry.npmjs.org/react-to-print/-/react-to-print-2.14.12.tgz", + "integrity": "sha512-qFJAwvDFd95Z+FWNqitt+HaB1/z+Zdd0MMrNOPUSus3fG32vqv512yB+HXhQ94J3HKoyqaIg44v0Zfc6xUBqlg==", "requires": { - "prop-types": "^15.7.2" + "prop-types": "^15.8.1" } }, "read-pkg": { diff --git a/package.json b/package.json index 9c27273..aa0b132 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "gh-pages": "^3.2.3", "google-spreadsheet": "^3.1.15", "googleapis": "^39.2.0", - "i18next": "^22.4.13", + "i18next": "^22.4.15", "i18next-browser-languagedetector": "^7.0.1", "mkdirp": "^1.0.4", "prettier": "^2.4.1", @@ -50,7 +50,7 @@ "react-router-dom": "^6.10.0", "react-scripts": "4.0.3", "react-timer-hook": "^3.0.5", - "react-to-print": "^2.14.0", + "react-to-print": "^2.14.12", "rimraf": "^3.0.2", "ts-node": "^10.3.0", "ts-prune": "^0.10.1", diff --git a/src/components/ExtendCorrection/ExtendedCorrection.css b/src/components/ExtendCorrection/ExtendedCorrection.css index 8f2a55f..66a3f54 100644 --- a/src/components/ExtendCorrection/ExtendedCorrection.css +++ b/src/components/ExtendCorrection/ExtendedCorrection.css @@ -8,24 +8,29 @@ } @media print { + @page { + size: A4; + margin: 20mm !important; + } html, body { height: initial !important; overflow: initial !important; -webkit-print-color-adjust: exact; print-color-adjust: exact; - } -} -@media print { + } .page-break { margin-top: 1rem; display: block; - page-break-before: always; + page-break-before: always !important; } .print-only { display: block; } + .print-only li { + page-break-inside: avoid; + } div { break-inside: avoid; } @@ -34,7 +39,3 @@ } } -@page { - size: auto; - margin: 20mm !important; -} diff --git a/src/components/ExtendCorrection/ExtendedCorrection.tsx b/src/components/ExtendCorrection/ExtendedCorrection.tsx index 90c39e5..d06486a 100644 --- a/src/components/ExtendCorrection/ExtendedCorrection.tsx +++ b/src/components/ExtendCorrection/ExtendedCorrection.tsx @@ -14,9 +14,12 @@ import DocumentHeader from './DocumentHeader' import firefoxImg1 from '../../static/firefox_1.png' import firefoxImg2 from '../../static/firefox_2.png' import firefoxImg3 from '../../static/firefox_3.png' +import firefoxImg2En from '../../static/firefox_2_en.png' +import firefoxImg3En from '../../static/firefox_3_en.png' import Question from '../Util/Question' import { Trans, useTranslation } from 'react-i18next' +const IMG_WIDTH = 320 const styles = StyleSheet.create({ collapsible: { display: 'flex', @@ -24,7 +27,6 @@ const styles = StyleSheet.create({ padding: '15px', gap: '10px' }, - doc: {}, printButton: { display: 'inline-flex', alignItems: 'center', @@ -39,23 +41,32 @@ const styles = StyleSheet.create({ textAlign: 'center' }, li: { - margin: '10px' + margin: '10px', + display: 'block' }, ul: { listStyleType: 'none' }, ol: { - paddingLeft: 20 + paddingLeft: 20, + maxWidth: IMG_WIDTH, + margin: '0 auto', + textAlign: 'left', + gap: 10 }, img: { marginTop: 5, marginBottom: 10, - maxWidth: 320, + maxWidth: IMG_WIDTH, width: '100%', height: 'auto', objectFit: 'cover' }, - nowrap: { whiteSpace: 'nowrap' } + nowrap: { whiteSpace: 'nowrap' }, + printDoc: { + maxWidth: '210mm', + margin: '0 auto' + } }) // using 'other' as fallback because @@ -101,7 +112,7 @@ export default function ExtendedCorrection(props: ExtendedCorrectionProps) { ref.current} - trigger={() => - - )} + return mobile ? ( +
+
+ +
- + + {active && ( +
+ +
+ )}
+ ) : ( +
+ + {active && ( +
+ +
+ )} + +
+ ) +} + +function SectionInfo(props: TopControlsProps) { + const { currentSection, answers, questions, active } = props + const { mobile } = useContext(MobileContext) + return ( +

+ Sezione: {getSectionName(currentSection)}
+ Risposte: { + answers[currentSection].filter((a) => !!a.letter).length + } / {questions[currentSection].length} + {mobile &&
} + {active && + ` (${props.answers[currentSection].reduce( + (acc, curr) => acc + (curr.flagged ? 1 : 0), + 0 + )} da rivedere)`} +

) } diff --git a/src/components/Util/Button.tsx b/src/components/Util/Button.tsx index 1b9deb3..1ae8083 100644 --- a/src/components/Util/Button.tsx +++ b/src/components/Util/Button.tsx @@ -5,7 +5,8 @@ const styles = StyleSheet.create({ display: 'flex', fontFamily: ' Arial', fontSize: '9.5pt', - alignItems: 'center' + alignItems: 'center', + cursor: 'pointer' }, p: { display: 'inline-block', diff --git a/src/components/Util/Question.tsx b/src/components/Util/Question.tsx index 7567b8d..413e9dc 100644 --- a/src/components/Util/Question.tsx +++ b/src/components/Util/Question.tsx @@ -10,18 +10,22 @@ const styles = StyleSheet.create({ }, option: { display: 'flex', - gap: 4, - margin: 4 + gap: 8, + margin: '4px 0' }, result: { textDecoration: 'underline', paddingTop: 4, display: 'block' + }, + icon: { + width: '10px', + height: '10px' } }) const TickSign = () => <>✓ -const CrossSign = () => <>✗ +const CrossSign = () => <>✕ interface Props { q: IQuestion @@ -65,7 +69,7 @@ export default function Question({ const visibility = isCorrect || choice === letter ? 'visible' : 'hidden' return (

- + {isCorrect ? : } {letter.toUpperCase()}. diff --git a/src/components/Util/Wrapper.tsx b/src/components/Util/Wrapper.tsx index 8c066ae..ea66cd0 100644 --- a/src/components/Util/Wrapper.tsx +++ b/src/components/Util/Wrapper.tsx @@ -1,27 +1,33 @@ import { StyleSheet } from '../../utils/style' -const styles = StyleSheet.create({ - wrapper: { - display: 'flex', - flexDirection: 'column', - alignItems: 'center', - margin: '10px auto', - marginBlock: '16px', - maxWidth: 900, - textAlign: 'center' - }, - h2: { - fontSize: '16pt' - } -}) - interface Props extends React.HTMLAttributes { title?: string + center?: boolean } -export default function Wrapper({ children, style, title, ...props }: Props) { +export default function Wrapper({ + children, + center = true, + style, + title, + ...props +}: Props) { + const styles = StyleSheet.create({ + wrapper: { + display: 'flex', + flexDirection: 'column', + alignItems: center ? 'center' : 'flex-start', + margin: '10px auto', + maxWidth: 900, + textAlign: center ? 'center' : 'initial', + ...style + }, + h2: { + fontSize: '16pt' + } + }) return ( -

+
{title &&

{title}

} {children}
diff --git a/src/components/pages/About.tsx b/src/components/pages/About.tsx index d0aad6b..9d1f70e 100644 --- a/src/components/pages/About.tsx +++ b/src/components/pages/About.tsx @@ -3,15 +3,29 @@ import { StyleSheet, theme } from '../../utils/style' import telegramLogo from '../../static/telegram_logo.svg' import Wrapper from '../Util/Wrapper' import { Trans, useTranslation } from 'react-i18next' +import { useContext } from 'react' +import { MobileContext } from '../../utils/contexts' const styles = StyleSheet.create({ p: { - margin: '20px', textAlign: 'justify', width: '100%' }, - centered: { - textAlign: 'center' + grid: { + margin: '10px 0', + width: '100%', + display: 'flex', + justifyContent: 'space-between', + alignItems: 'flex-start' + }, + col: { + display: 'flex', + flexDirection: 'column', + justifyContent: 'space-between', + alignItems: 'flex-start', + height: '100%', + gap: 10, + textAlign: 'left' }, link: { display: 'inline-flex', @@ -19,14 +33,20 @@ const styles = StyleSheet.create({ gap: '5px', alignItems: 'center' }, - liDiv: { + list: { + paddingInlineStart: 30 + }, + liP: { display: 'flex', gap: '5px', alignItems: 'center', - flexDirection: 'row' + flexDirection: 'row', + margin: 0, + marginBottom: 10 }, telegramLink: { - display: 'flex' + display: 'inline-flex', + alignSelf: 'center' }, telegramLogo: { height: '17.5px' @@ -34,97 +54,130 @@ const styles = StyleSheet.create({ }) export default function About() { - const { t, i18n } = useTranslation() + const { i18n } = useTranslation() + const { mobile } = useContext(MobileContext) + return (

about.main

-
- {t('about.projectTeam')} -
-
    - {members - .filter((m) => !m.ah) - .sort((a, b) => - a.name.toUpperCase() > b.name.toUpperCase() ? 1 : -1 - ) - .map((m, i) => ( -
  • -
    - {(m.prefix || '') + ' ' + m.name}{' '} - - - -
    -
  • - ))} -
- Ad hoc: -
    - {members - .filter((m) => !!m.ah) - .sort((a, b) => - a.name.toUpperCase() > b.name.toUpperCase() ? 1 : -1 - ) - .map((m, i) => ( -
  • -
    - {m.name}{' '} - - - -
    -
  • - ))} -
-
- {t('about.supportGroups.head')} -
    -
  • -
    - {t('about.supportGroups.1')} +
    +
    + +
    +
    + + +
    +
    + + ) +} + +function TgLogo() { + return ( + + + + ) +} + +function ProjectTeam() { + const { t } = useTranslation() + const team = members + .filter((m) => !m.ah) + .sort((a, b) => (a.name.toUpperCase() > b.name.toUpperCase() ? 1 : -1)) + + return ( +
    + {t('about.projectTeam')} +
    +

  • -
  • -
    - {t('about.supportGroups.2')} + ))} +
+
+ ) +} + +function AdHoc() { + const ah = members + .filter((m) => !!m.ah) + .sort((a, b) => (a.name.toUpperCase() > b.name.toUpperCase() ? 1 : -1)) + + return ( +
+ Ad hoc +
+

- -
- + ))} + + + ) +} + +function TgGroups() { + const { t, i18n } = useTranslation() + const components = { + tgProject: ( + + ), + tgHelp: ( + + ), + tgLogo: + } + return ( +
+ {t('about.supportGroups.head')} +
    +
  • + + about.supportGroups.1 + +
  • +
  • + + about.supportGroups.2 + +
  • +
+
) } diff --git a/src/components/pages/Home.tsx b/src/components/pages/Home.tsx index beedc33..9b5346e 100644 --- a/src/components/pages/Home.tsx +++ b/src/components/pages/Home.tsx @@ -18,6 +18,9 @@ const styles = StyleSheet.create({ display: 'flex', fontSize: 14, gap: 6 + }, + dsaInfo: { + maxWidth: '755px' } }) @@ -62,7 +65,7 @@ export default function Home({ viewState }: InfoStartProps) { } open={isDsa} transitionTime={150}> -

+

home.dsaInfo

diff --git a/src/components/pages/Results.tsx b/src/components/pages/Results.tsx index dd90291..64023b0 100644 --- a/src/components/pages/Results.tsx +++ b/src/components/pages/Results.tsx @@ -21,6 +21,7 @@ import { import { useEffect, useState } from 'react' import { statePair } from '../../utils/types' import { Trans, useTranslation } from 'react-i18next' +import Wrapper from '../Util/Wrapper' const styles = StyleSheet.create({ div: { @@ -32,7 +33,8 @@ const styles = StyleSheet.create({ tableDiv: { alignSelf: 'center', width: '100%', - overflow: 'auto', + maxWidth: '90vw', + overflowX: 'auto', display: 'flex' }, table: { borderSpacing: 0, margin: 'auto' }, @@ -172,12 +174,12 @@ export default function Results(props: ResultsProps) {
TOL{' '} {testPassed - ? `${t('results.testPassed')} ${!tengPassed ? ' (OFA TENG)' : ''}` - : `${t('results.testFailed')}: OFA TEST${ + ? `${t('results.test.passed')} ${!tengPassed ? ' (OFA TENG)' : ''}` + : `${t('results.test.failed')}: OFA TEST${ !tengPassed ? ' + OFA TENG' : '' }`}
- {t('results.testPoints')}: {formatNumber(score)} /{' '} + {t('results.test.points')}: {formatNumber(score)} /{' '} {formatNumber(testTotalScore)} ({formatNumber(score, true)})


@@ -186,11 +188,19 @@ export default function Results(props: ResultsProps) { - - - - - + + + + + {( Object.entries(correctionGrid) as [ @@ -218,89 +228,91 @@ export default function Results(props: ResultsProps) { ) return ( -
-
{resultTable()}
+ +
+
{resultTable()}
- setIsResultSaved(true)} - /> + setIsResultSaved(true)} + /> -
-

{t('results.pointsCalcTitle')}

-

- - results.pointsCalcBody1 - - {t('results.pointsCalcUl1')} -

    -
  • - - results.pointsCalcItem1 - -
  • -
  • - - results.pointsCalcItem2 - -
  • -
  • - - results.pointsCalcItem3 - -
  • -
- {t('results.pointsCalcUl2')} -
    - {Object.entries(sectionInfo).map(([, info], index) => ( -
  • - {typeof info.coeff == 'number' - ? formatNumber(info.coeff) - : info.coeff.toFraction()} +
    +

    {t('results.pointsCalc.title')}

    +

    + + results.pointsCalc.body.1 + + {t('results.pointsCalc.ul.1')} +

      +
    • - results.pointsCalcItem4 + results.pointsCalc.ul.item.1
    • - ))} -
    - results.pointsCalcBody2 -

    -
    -

    {t('results.saveReminder')}

    -
+ {t('results.pointsCalc.ul.2')} +
    + {Object.entries(sectionInfo).map(([, info], index) => ( +
  • + {typeof info.coeff == 'number' + ? formatNumber(info.coeff) + : info.coeff.toFraction()} + + results.pointsCalc.ul.item.4 + +
  • + ))} +
+ results.pointsCalc.body.2 +

+
+

{t('results.saveReminder')}

+
-
+ ) } diff --git a/src/locales/en.json b/src/locales/en.json index 01b59e7..740bf8a 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -1,55 +1,97 @@ { "language": "English", + "tg": { + "project": "The TOL Project", + "help": "Gruppo Preparazione TOL" + }, "home": { "disclaimer": "\"The TOL Project\" (Project) is in no way connected to Politecnico di Milano but is managed free of charge by students. The authors of the Project do not assume any responsibility, nor do they expressly or implicitly guarantee the accuracy or reliability of the contents of this site for the purpose of passing the admission test at Politecnico di Milano.", "languageInfo": "*The test simulation will be in Italian", "startBtn": "Start the test", "dsaBtn": "Student with SLD", - "dsaInfo": "Students with Specific Learning Disorders (SLD) taking the TOL are eligible for an additional 30 percent time, provided they disclose it when registering for the test. A certification stating the SLD diagnosis is also required.
Selecting \"Student with SLD\" will apply the bonus time in this simulation as well." + "dsaInfo": "Students with Specific Learning Disorders (SLD) taking the TOL are eligible for an additional 30 percent time, provided they disclose it when registering for the test. A certification stating the SLD diagnosis is also required. Selecting \"Student with SLD\" will apply the bonus time in this simulation as well." }, "about": { "main": "In order to be admitted to the Engineering school of Politecnico di Milano (PoliMi), the aspiring freshmen must pass the admission test (TOL).
Among the resources that PoliMi offers for free to prepare, you can find: the Politest, a collection of commented and solved exercises, the DOL, an online demo with a limited number of questions, and two complete self-assessment tests (pdf with questions, xls with exact answers).

Thus, we did not have a complete, web-based TOL simulation, that is, in the same environment in which the future freshmen will take the admission test.
We have set ourself the goal of creating a complete and free TOL simulation, in order to provide aspiring freshmen with a familiar environment in which to practice, very similar to the one they will encounter at the admission test.
The project is fully managed by students, from developing the web application to creating the TOL questions.", "projectTeam": "Project team", "supportGroups": { "head": "Support groups", - "1": "Project feedback & info: ", - "2": "TOL questions and their resolution: " + "1": "Project feedback & info: $t(tg.project) ", + "2": "TOL questions and their resolution: $t(tg.help) " } }, "license": { "main": "The TOL Project by PoliNetwork is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License
Permissions beyond the scope of this license may be available here." }, "privacy": { - "localStorage": "This website uses the browser to save user preferences, for example the test mode (regular or DSA) or the website language. These settings are never sent to any server, instead they are handled locally by the browser. Moreover, preferences are deleted after 6 months from the last change." + "localStorage": "This website uses the browser to save user preferences, for example the test mode (regular or SLD) or the website language. These settings are never sent to any server, instead they are handled locally by the browser. Moreover, preferences are deleted after 6 months from the last change." }, "results": { "exitWarn": "You did not save your results. Are you sure you want to exit?", - "testPassed": "passed", - "testFailed": "failed", - "testPoints": "Score", - "tableHeader1": "Section score", - "tableHeader2": "Num. of questions", - "tableHeader3": "Correct", - "tableHeader4": "Wrong", - "tableHeader5": "Not given", - "pointsCalcTitle": "How the score is calculated", - "pointsCalcBody1": "The maximum achievable scoreis {{v1}} and is expressed to the second decimal place.
The attribution of OFA TEST (Obblighi Formativi Aggiunti) occurs when the test score, rounded to the nearest integer, is less than {{v2}}.
The attribution of OFA TENG occurs when, considering only the {{v3}} section, the number of correct answers is less than {{v4}}.
", - "pointsCalcUl1": "The test score is calculated by assigning:", - "pointsCalcItem1_one": "{{v}} point for each correct answer", - "pointsCalcItem2_one": "{{v}} point for each wrong answer", - "pointsCalcItem3_one": "{{v}} point for each answer not given", - "pointsCalcItem1_other": "{{v}} points for each correct answer", - "pointsCalcItem2_other": "{{v}} points for each wrong answer", - "pointsCalcItem3_other": "{{v}} points for each answer not given", - "pointsCalcUl2": "and assigning a weight of", - "pointsCalcItem4": " for each question of {{sec}}", - "pointsCalcBody2": "The total score gets rounded to the nearest integer (e.g., 59,49 gets rounded to 59, while 59,50 to 60)", + "test": { + "passed": "passed", + "failed": "failed", + "points": "Score" + }, + "table": { + "header": { + "score": "Section score", + "numQ": "Num. of questions", + "correct": "Correct", + "wrong": "Wrong", + "notGiven": "Not given" + } + }, + "pointsCalc": { + "title": "How the score is calculated", + "body": { + "1": "The maximum achievable scoreis {{v1}} and is expressed to the second decimal place.
The attribution of OFA TEST (Obblighi Formativi Aggiunti) occurs when the test score, rounded to the nearest integer, is less than {{v2}}.
The attribution of OFA TENG occurs when, considering only the {{v3}} section, the number of correct answers is less than {{v4}}.
", + "2": "The total score gets rounded to the nearest integer (e.g., 59,49 gets rounded to 59, while 59,50 to 60)" + }, + "ul":{ + "1": "The test score is calculated by assigning:", + "2": "and assigning a weight of", + "item": { + "1_one": "{{v}} point for each correct answer", + "1_other": "{{v}} points for each correct answer", + "2_one": "{{v}} point for each wrong answer", + "2_other": "{{v}} points for each wrong answer", + "3_one": "{{v}} point for each answer not given", + "3_other": "{{v}} points for each answer not given", + "4": " for each question of {{sec}}" + } + } + }, "saveReminder": "Remember to save your results before starting a new test, or they will be lost!", - "homeBtn": "Go back to home", - "saveBtn": "Save test results", - "pdfTitle": "Simulation of {{- date}} at {{- time}}", - "pdfInfo1": "Do you have any doubts about the questions and their resolution? Ask on the ", - "tgGroup": "PoliNetwork's TOL Prepration Group", - "pdfInfo2": "On the following pages you will find, divided by section, the questions that have been proposed to you with the related outcome." + "btn": { + "home": "Go back to home", + "save": "Save test results" + }, + "pdf": { + "title": "Simulation of {{- date}} at {{- time}}", + "info": { + "1": "Do you have any doubts about the questions and their resolution? Ask on the PoliNetwork's $t(tg.help)!", + "2": "On the following pages you will find, divided by section, the questions that have been proposed to you with the related outcome." + } + }, + "save": { + "title": "Save your results", + "firefox": { + "body": { + "1": "Your browser (Firefox Android) does not support automatic printing of the PDF with the results.", + "2": "Follow these instructions to save your results:" + }, + "li": { + "1": "Open the Firefox menu", + "2": "Click on the share button", + "3": "In the menu that opens, press on \"Save as PDF\"" + } + }, + "fallback": { + "1": "Your browser does not support automatic printing of the PDF with the results.", + "2": "You can try using your browser's \"Save as PDF\" feature, which may be in the sharing menu or in the main browser menu.", + "3": "Please report your browser here so we can fix the problem." + } + } } } diff --git a/src/locales/it.json b/src/locales/it.json index 46c62aa..af634cf 100644 --- a/src/locales/it.json +++ b/src/locales/it.json @@ -1,19 +1,23 @@ { "language": "Italian", + "tg": { + "project": "The TOL Project", + "help": "Gruppo Preparazione TOL" + }, "home": { "disclaimer": "\"The TOL Project\" (Progetto) non è in alcun modo collegato al Politecnico di Milano ma è gestito gratuitamente da studenti. Gli autori del Progetto non si assumono alcuna responsabilità, né garantiscono espressamente o implicitamente l'accuratezza o l'affidabilità dei contenuti di questo sito ai fini del superamento del test di ammissione del Politecnico di Milano", "languageInfo": "", "startBtn": "Inizia il test", "dsaBtn": "Studente con DSA", - "dsaInfo": "Gli studenti con Disturbi Specifici dell'Apprendimento (DSA) che affrontano il TOL, possono usufruire di un tempo supplementare pari al 30%, previa segnalazione in fase di iscrizione al test. È inoltre richiesta una certificazione attestante la diagnosi di DSA.
Selezionando \"Studente con DSA\" verrà applicato il tempo bonus in questa simulazione." + "dsaInfo": "Gli studenti con Disturbi Specifici dell'Apprendimento (DSA) che affrontano il TOL possono usufruire di un tempo supplementare pari al 30%, previa segnalazione in fase di iscrizione al test. È inoltre richiesta una certificazione attestante la diagnosi di DSA. Selezionando \"Studente con DSA\" verrà applicato il tempo bonus in questa simulazione." }, "about": { "main": "Per poter essere ammessi alla scuola di Ingegneria del Politecnico di Milano (PoliMi), le aspiranti matricole devono superare il test di ammissione (TOL).
Tra le risorse che il PoliMi offre gratuitamente per prepararsi abbiamo: il Politest, una raccolta di esercizi commentati e risolti, la DOL, una demo online con un numero ridotto di domande, e due test di autovalutazione completi (pdf con domande, xls con risposte esatte).

Non avevamo dunque una simulazione TOL completa e basata sul web, ovvero nello stesso ambiente in cui le future matricole sosterranno il test di ammissione.
Ci siamo posti l'obiettivo di creare una simulazione TOL completa e gratuita, al fine di fornire alle aspiranti matricole un ambiente familiare dove esercitarsi, molto simile a quello che incontreranno al test di ammissione.
Il progetto è completamente gestito dagli studenti, dallo sviluppo dell'applicazione web alla creazione delle domande TOL. ", "projectTeam": "Team del progetto", "supportGroups": { "head": "Gruppi di supporto", - "1": "Segnalazioni e informazioni sul progetto: ", - "2": "Quesiti TOL e loro risoluzione: " + "1": "Segnalazioni e informazioni sul progetto: $t(tg.project) ", + "2": "Quesiti TOL e loro risoluzione: $t(tg.help) " } }, "license": { @@ -24,32 +28,70 @@ }, "results": { "exitWarn": "Non hai salvato i tuoi risultati. Sicuro di voler uscire?", - "testPassed": "passato", - "testFailed": "non passato", - "testPoints": "Punteggio", - "tableHeader1": "Punteggio sezione", - "tableHeader2": "N° quesiti", - "tableHeader3": "Esatti", - "tableHeader4": "Errati", - "tableHeader5": "Senza risposta", - "pointsCalcTitle": "Come viene calcolato il punteggio", - "pointsCalcBody1": "Il punteggio massimo conseguibile è di {{v1}} e viene espresso fino alla seconda cifra decimale.
L'attribuzione di OFA TEST (Obblighi Formativi Aggiunti) avviene quando il punteggio test, arrotondato all'intero più vicino, è minore di {{v2}}.
L'attribuzione di OFA TENG avviene quando, considerando la sola sezione di {{v3}}, il numero di risposte corrette è inferiore a {{v4}}.
", - "pointsCalcUl1": "Il punteggio della prova viene calcolato attribuendo:", - "pointsCalcItem1_one": "{{v}} punto ad ogni risposta esatta", - "pointsCalcItem2_one": "{{v}} punto ad ogni risposta errata", - "pointsCalcItem3_one": "{{v}} punto ad ogni risposta non data", - "pointsCalcItem1_other": "{{v}} punti ad ogni risposta esatta", - "pointsCalcItem2_other": "{{v}} punti ad ogni risposta errata", - "pointsCalcItem3_other": "{{v}} punti ad ogni risposta non data", - "pointsCalcUl2": "e assegnando peso di", - "pointsCalcItem4": " ad ogni quesito di {{sec}}", - "pointsCalcBody2": "Il punteggio complessivo viene arrotondato all'intero più vicino (es: il punteggio 59,49 viene arrotondato a 59, il punteggio 59,50 a 60)", + "test": { + "passed": "superato", + "failed": "non superato", + "points": "Punteggio" + }, + "table": { + "header": { + "score": "Punteggio sezione", + "numQ": "N° quesiti", + "correct": "Esatti", + "wrong": "Errati", + "notGiven": "Senza risposta" + } + }, + "pointsCalc": { + "title": "Come viene calcolato il punteggio", + "body": { + "1": "Il punteggio massimo conseguibile è di {{v1}} e viene espresso fino alla seconda cifra decimale.
L'attribuzione di OFA TEST (Obblighi Formativi Aggiunti) avviene quando il punteggio test, arrotondato all'intero più vicino, è minore di {{v2}}.
L'attribuzione di OFA TENG avviene quando, considerando la sola sezione di {{v3}}, il numero di risposte corrette è inferiore a {{v4}}.
", + "2": "Il punteggio complessivo viene arrotondato all'intero più vicino (es: il punteggio 59,49 viene arrotondato a 59, il punteggio 59,50 a 60)" + }, + "ul": { + "1": "Il punteggio della prova viene calcolato attribuendo:", + "2": "e assegnando peso di", + "item": { + "1_one": "{{v}} punto ad ogni risposta esatta", + "2_one": "{{v}} punto ad ogni risposta errata", + "3_one": "{{v}} punto ad ogni risposta non data", + "1_other": "{{v}} punti ad ogni risposta esatta", + "2_other": "{{v}} punti ad ogni risposta errata", + "3_other": "{{v}} punti ad ogni risposta non data", + "4": " ad ogni quesito di {{sec}}" + } + } + }, "saveReminder": "Ricordati di salvare i tuoi risultati prima di iniziare un nuovo test, o andranno persi!", - "homeBtn": "Torna alla home", - "saveBtn": "Salva risultati della simulazione", - "pdfTitle": "Simulazione del {{- date}} alle {{- time}}", - "pdfInfo1": "Hai delle domande sui quesiti e la loro risoluzione? Falle sul ", - "tgGroup": "Gruppo Preprazione TOL di PoliNetwork", - "pdfInfo2": "Nelle pagine successive troverai, suddivisi per sezione, i quesiti che ti sono stati proposti con il relativo esito." + "btn": { + "home": "Torna alla home", + "save": "Salva risultati della simulazione" + }, + "pdf": { + "title": "Simulazione del {{- date}} alle {{- time}}", + "info": { + "1": "Hai delle domande sui quesiti e la loro risoluzione? Falle sul $t(tg.help) di PoliNetwork!", + "2": "Nelle pagine successive troverai, suddivisi per sezione, i quesiti che ti sono stati proposti con il relativo esito." + } + }, + "save": { + "title": "Salva i tuoi risultati", + "firefox": { + "body": { + "1": "Il tuo browser (Firefox Android) non supporta la stampa automatica.", + "2": "Per salvare i risultati segui questi passaggi:" + }, + "li": { + "1": "Apri il menu di Firefox", + "2": "Premi il tasto per condividere", + "3": "Nel menu che si apre, premi su \"Salva come PDF\"" + } + }, + "fallback": { + "1": "Per il tuo browser non è supportata la stampa automatica del PDF con i risultati.", + "2": "Puoi provare ad utilizzare la funzione \"Salva come PDF\" del tuo browser che potrebbe essere nel menu di condivisione oppure nel menu principale del browser.", + "3": "Ti invitiamo a segnalare il tuo browser qui in modo da poter risolvere il problema." + } + } } } diff --git a/src/static/firefox_1.png b/src/static/firefox_1.png old mode 100755 new mode 100644 diff --git a/src/static/firefox_2.png b/src/static/firefox_2.png old mode 100755 new mode 100644 diff --git a/src/static/firefox_2_en.png b/src/static/firefox_2_en.png new file mode 100644 index 0000000..8025ddc Binary files /dev/null and b/src/static/firefox_2_en.png differ diff --git a/src/static/firefox_3.png b/src/static/firefox_3.png old mode 100755 new mode 100644 diff --git a/src/static/firefox_3_en.png b/src/static/firefox_3_en.png new file mode 100644 index 0000000..fa30b20 Binary files /dev/null and b/src/static/firefox_3_en.png differ
{t('results.tableHeader1')}{t('results.tableHeader2')}{t('results.tableHeader3')}{t('results.tableHeader4')}{t('results.tableHeader5')} + {t('results.table.header.score')} + {t('results.table.header.numQ')} + {t('results.table.header.correct')} + + {t('results.table.header.wrong')} + + {t('results.table.header.notGiven')} +