Merge remote-tracking branch 'origin/svelte_i18n' into frontend_school_order_selection

This commit is contained in:
Sebastian Pravda 2023-01-25 09:52:48 +01:00
commit 8ffa9f2f27
No known key found for this signature in database
GPG key ID: F3BC84F08EFA3F57
20 changed files with 931 additions and 65 deletions

View file

@ -0,0 +1,7 @@
{
"baseLocale": "cs",
"adapter": "svelte",
"esmImports": true,
"outputPath": "./src/translations",
"$schema": "https://unpkg.com/typesafe-i18n@5.20.0/schema/typesafe-i18n.json"
}

View file

@ -10,7 +10,8 @@
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
"lint": "prettier --plugin-search-dir . --check . && eslint .", "lint": "prettier --plugin-search-dir . --check . && eslint .",
"format": "prettier --plugin-search-dir . --write ." "format": "prettier --plugin-search-dir . --write .",
"typesafe-i18n": "typesafe-i18n"
}, },
"devDependencies": { "devDependencies": {
"@playwright/test": "^1.29.2", "@playwright/test": "^1.29.2",
@ -47,6 +48,7 @@
"svelte-tippy": "^1.3.2", "svelte-tippy": "^1.3.2",
"swiper": "^8.4.6", "swiper": "^8.4.6",
"tippy.js": "^6.3.7", "tippy.js": "^6.3.7",
"typesafe-i18n": "^5.20.0",
"yup": "^0.32.11" "yup": "^0.32.11"
} }
} }

View file

@ -34,6 +34,9 @@ dependencies:
tippy.js: tippy.js:
specifier: ^6.3.7 specifier: ^6.3.7
version: 6.3.7 version: 6.3.7
typesafe-i18n:
specifier: ^5.20.0
version: 5.20.0(typescript@4.9.4)
yup: yup:
specifier: ^0.32.11 specifier: ^0.32.11
version: 0.32.11 version: 0.32.11
@ -2392,11 +2395,19 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
dev: true dev: true
/typesafe-i18n@5.20.0(typescript@4.9.4):
resolution: {integrity: sha512-uOvKnVkp1tXRDNBz9Aom54qs0LP2xWrtDliMPdKm9Scsnvn0DC7ZqjSGdOWxVplpbFbqYWNZuzx5Q5jWOjnBTA==}
hasBin: true
peerDependencies:
typescript: '>=3.5.1'
dependencies:
typescript: 4.9.4
dev: false
/typescript@4.9.4: /typescript@4.9.4:
resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==}
engines: {node: '>=4.2.0'} engines: {node: '>=4.2.0'}
hasBin: true hasBin: true
dev: true
/unconfig@0.2.2: /unconfig@0.2.2:
resolution: {integrity: sha512-JN1MeYJ/POnjBj7NgOJJxPp6+NcD6Nd0hEuK0D89kjm9GvQQUq8HeE2Eb7PZgtu+64mWkDiqeJn1IZoLH7htPg==} resolution: {integrity: sha512-JN1MeYJ/POnjBj7NgOJJxPp6+NcD6Nd0hEuK0D89kjm9GvQQUq8HeE2Eb7PZgtu+64mWkDiqeJn1IZoLH7htPg==}

View file

@ -1,14 +1,23 @@
<script lang="ts"> <script lang="ts">
import LL from '$i18n/i18n-svelte';
export let linkOk: boolean = false; export let linkOk: boolean = false;
export let linkError: boolean = false; export let linkError: boolean = false;
export let applications: Array<number>; export let applications: Array<number>;
let title1 = `Ano, podával/a jsem dvě přihlášky na dva obory SSPŠaG (${applications[0]} a ${applications[1]})`; let title1 = $LL.components.checkbox.accountLinkCheckBox.multiple.title({
let title2 = `Ne, přihlášku na SSPŠaG jsem podával/a jen jednu (${applications[0]})`; first: applications[0],
second: applications[1]
});
let title2 = $LL.components.checkbox.accountLinkCheckBox.multiple.title2({
first: applications[0]
});
if (applications.length === 1) { if (applications.length === 1) {
title1 = `Ano, přihlášku na SSPŠaG jsem podával/a jen jednu (${applications[0]})`; title1 = $LL.components.checkbox.accountLinkCheckBox.single.title({
title2 = `Ne, přihlášku na SSPŠaG jsem podával více přihlášek`; first: applications[0]
});
title2 = $LL.components.checkbox.accountLinkCheckBox.single.title2();
} }
$: console.log(linkOk, linkError); $: console.log(linkOk, linkError);
@ -43,7 +52,7 @@
<div class="w-full text-lg font-semibold"> <div class="w-full text-lg font-semibold">
{title1} {title1}
</div> </div>
<div class="w-full text-sm">Vše je v pořádku</div> <div class="w-full text-sm">{$LL.components.checkbox.accountLinkCheckBox.ok()}</div>
</div> </div>
</label> </label>
</div> </div>
@ -63,7 +72,7 @@
<div class="w-full text-lg font-semibold"> <div class="w-full text-lg font-semibold">
{title2} {title2}
</div> </div>
<div class="w-full text-sm">Co se děje?</div> <div class="w-full text-sm">{$LL.components.checkbox.accountLinkCheckBox.whatHappened()}</div>
</div> </div>
</label> </label>
</div> </div>

View file

@ -1,4 +1,6 @@
<script lang="ts"> <script lang="ts">
import LL from '$i18n/i18n-svelte';
export let value: boolean = false; export let value: boolean = false;
export let error: string = ''; export let error: string = '';
@ -9,9 +11,9 @@
<div class="block"> <div class="block">
<span class="text-2xl">📜</span> <span class="text-2xl">📜</span>
<div class="w-full text-lg font-semibold">Souhlas se zpracováním osobních údajů</div> <div class="w-full text-lg font-semibold">{$LL.components.checkbox.gdprCheckBox.title()}</div>
<div class="w-full text-sm">Kliknutím vyjaďřujete souhlas se zpracováním osobních údajů</div> <div class="w-full text-sm">{$LL.components.checkbox.gdprCheckBox.description()}</div>
<div class="w-full text-sm"><a class="underline" href="/gdpr">Zde</a></div> <div class="w-full text-sm"><a class="underline" href="/gdpr">{$LL.components.checkbox.gdprCheckBox.here()}</a></div>
</div> </div>
</label> </label>

View file

@ -1,5 +1,5 @@
<script lang="ts"> <script lang="ts">
import type { School } from '$lib/stores/candidate'; import type { School } from '$lib/stores/candidate';
import AutoComplete from 'simple-svelte-autocomplete'; import AutoComplete from 'simple-svelte-autocomplete';
import { onMount } from 'svelte'; import { onMount } from 'svelte';
// import schoollistString from '$lib/assets/schoollist.txt'; // import schoollistString from '$lib/assets/schoollist.txt';

View file

@ -1,10 +1,11 @@
<script lang="ts"> <script lang="ts">
import LL from '$i18n/i18n-svelte';
import lion from '$lib/assets/logo/lion.png'; import lion from '$lib/assets/logo/lion.png';
import SplitLayout from '$lib/components/layout/SplitLayout.svelte'; import SplitLayout from '$lib/components/layout/SplitLayout.svelte';
import TextField from '$lib/components/textfield/TextField.svelte'; import TextField from '$lib/components/textfield/TextField.svelte';
import background from '$lib/assets/background2.jpg'; import background from '$lib/assets/background2.jpg';
import Lock from '$lib/components/icons/Lock.svelte';
import { apiLogin } from '$lib/@api/admin'; import { apiLogin } from '$lib/@api/admin';
import { goto } from '$app/navigation'; import { goto } from '$app/navigation';
import Submit from '$lib/components/button/Submit.svelte'; import Submit from '$lib/components/button/Submit.svelte';
@ -30,20 +31,20 @@
> >
<img class="object-cover" src={lion} alt="" /> <img class="object-cover" src={lion} alt="" />
</div> </div>
<h1 class="text-sspsBlue mt-8 text-4xl font-semibold">Přihlášení</h1> <h1 class="text-sspsBlue mt-8 text-4xl font-semibold">{$LL.admin.auth.login.title()}</h1>
<p class="text-sspsGray mt-8 text-center font-light"> <p class="text-sspsGray mt-8 text-center font-light">
Administrátoská sekce aplikace<br /> Přístup povolen pouze pro oprávněné osoby! {$LL.admin.auth.login.description()}
</p> </p>
<div class="mt-8 flex w-4/5 flex-col lg:w-3/5"> <div class="mt-8 flex w-4/5 flex-col lg:w-3/5">
<span> <span>
<TextField bind:value={adminIdValue} placeholder="Admin id" type="number" /> <TextField bind:value={adminIdValue} placeholder={$LL.input.adminId()} type="number" />
</span> </span>
<span class="mt-8"> <span class="mt-8">
<PasswordField bind:value={adminPasswordValue} placeholder="Heslo" /> <PasswordField bind:value={adminPasswordValue} placeholder={$LL.input.password()} />
</span> </span>
</div> </div>
<div class="mt-8 w-4/5 lg:w-3/5"> <div class="mt-8 w-4/5 lg:w-3/5">
<Submit value="Odeslat" on:click={login} /> <Submit value={$LL.input.submit()} on:click={login} />
</div> </div>
</div> </div>
</SplitLayout> </SplitLayout>

View file

@ -1,4 +1,6 @@
<script lang="ts"> <script lang="ts">
import LL from '$i18n/i18n-svelte';
import { goto } from '$app/navigation'; import { goto } from '$app/navigation';
import { apiFillDetails } from '$lib/@api/candidate'; import { apiFillDetails } from '$lib/@api/candidate';
import Submit from '$lib/components/button/Submit.svelte'; import Submit from '$lib/components/button/Submit.svelte';
@ -28,12 +30,13 @@
let pagesFilled = [false, false, false, false, false, false, false]; let pagesFilled = [false, false, false, false, false, false, false];
const pageCount = pagesFilled.length; const pageCount = pagesFilled.length;
let pageTexts = [ let pageTexts = [
'Zpracování osobních údajů', $LL.candidate.register.second.title(),
'Registrace', $LL.candidate.register.third.title(),
'Něco o Vás', $LL.candidate.register.fourth.title(),
'Zákonný zástupce', $LL.candidate.register.fifth.title(),
'Druhý zákonný zástupce', $LL.candidate.register.sixth.title(),
'Poslední krok' $LL.candidate.register.seventh.title(),
$LL.candidate.register.eighth.title()
]; ];
export let data: PageData; export let data: PageData;
@ -387,7 +390,7 @@
} }
break; break;
case 7: case 7:
if ($typedErrors["candidate"]["grades"].length > 0) return true; if ($typedErrors['candidate']['grades'].length > 0) return true;
break; break;
default: default:
return false; return false;
@ -434,7 +437,7 @@
] ]
}); });
pageIndex = 2; // skip gdpr page pageIndex = 2; // skip gdpr page
pageTexts[2] = 'Úprava osobních údajů'; pageTexts[2] = $LL.candidate.register.fourth.titleEdit();
} }
</script> </script>
@ -451,10 +454,9 @@
<form on:submit={handleSubmit} id="triggerForm" class="invisible hidden" /> <form on:submit={handleSubmit} id="triggerForm" class="invisible hidden" />
{#if pageIndex === 0} {#if pageIndex === 0}
<form on:submit={handleSubmit}> <form on:submit={handleSubmit}>
<h1 class="title mt-8">Propojení účtů</h1> <h1 class="title mt-8">{$LL.candidate.register.first.title()}</h1>
<p class="description mt-8 block text-center"> <p class="description mt-8 block text-center">
Elektronickou přihlášky stačí vyplnit jen jednou i v případě, že jste podali dvě {$LL.candidate.register.first.description()}
přihlášky. Potvrďte, že jste jste k nám skutečně podali dvě přihlášky.
</p> </p>
<div class="field"> <div class="field">
<AccountLinkCheckBox <AccountLinkCheckBox
@ -469,24 +471,18 @@
<form on:submit={handleSubmit}> <form on:submit={handleSubmit}>
<h1 class="title mt-8">{pageTexts[0]}</h1> <h1 class="title mt-8">{pageTexts[0]}</h1>
<p class="description mt-8 block text-center"> <p class="description mt-8 block text-center">
V rámci portálu pro přijímací řízení zpracováváme mnoho osobních údajů. Proto je nutný {$LL.candidate.register.second.description()}
Váš souhlas s jejich zpracováním. O bezpečnosti zpracování Vašich osobních údajů si <a href="/bezpecnost" class="text-sspsBlue underline"> {$LL.here()}</a>.
můžete přečíst
<a href="/bezpecnost" class="text-sspsBlue underline"> zde</a>.
</p> </p>
<div class="field"> <div class="field">
<GdprCheckBox <GdprCheckBox bind:value={$form.gdpr} error={$typedErrors['gdpr']} />
bind:value={$form.gdpr}
error={$typedErrors['gdpr']}
/>
</div> </div>
</form> </form>
{:else if pageIndex === 2} {:else if pageIndex === 2}
<form on:submit={handleSubmit}> <form on:submit={handleSubmit}>
<h1 class="title mt-8">{pageTexts[1]}</h1> <h1 class="title mt-8">{pageTexts[1]}</h1>
<p class="description mt-8 block text-center"> <p class="description mt-8 block text-center">
V rámci usnadnění přijímacího řízení jsme připravili online formulář, který Vám pomůže s {$LL.candidate.register.third.description()}
vyplněním potřebných údajů.
</p> </p>
<div class="w-full"> <div class="w-full">
<div class="flex flex-col"> <div class="flex flex-col">
@ -575,7 +571,7 @@
<SelectField <SelectField
error={$typedErrors['candidate']['testLanguage']} error={$typedErrors['candidate']['testLanguage']}
bind:value={$form.candidate.testLanguage} bind:value={$form.candidate.testLanguage}
placeholder="Jazyk odborných testů" placeholder={$LL.input.testLanguage()}
options={['Čeština', 'Angličtina']} options={['Čeština', 'Angličtina']}
/> />
</span> </span>
@ -585,14 +581,14 @@
error={$typedErrors['candidate']['birthdate']} error={$typedErrors['candidate']['birthdate']}
bind:value={$form.candidate.birthdate} bind:value={$form.candidate.birthdate}
type="text" type="text"
placeholder="Datum narození" placeholder={$LL.input.birthDate()}
helperText="TODO: (Uveďte ve formátu DD.MM.RRRR)" helperText="TODO: (Uveďte ve formátu DD.MM.RRRR)"
/> />
<TextField <TextField
error={$typedErrors['candidate']['birthplace']} error={$typedErrors['candidate']['birthplace']}
bind:value={$form.candidate.birthplace} bind:value={$form.candidate.birthplace}
type="text" type="text"
placeholder="Místo narození" placeholder={$LL.input.birthPlace()}
helperText="TODO: (Místo narození)" helperText="TODO: (Místo narození)"
/> />
</div> </div>
@ -601,13 +597,13 @@
<IdField <IdField
error={$typedErrors['candidate']['personalIdNumber']} error={$typedErrors['candidate']['personalIdNumber']}
bind:value={$form.candidate.personalIdNumber} bind:value={$form.candidate.personalIdNumber}
placeholder="Rodné číslo" placeholder={$LL.input.personalIdentificationNumber()}
/> />
{:else} {:else}
<TextField <TextField
error={$typedErrors['candidate']['personalIdNumber']} error={$typedErrors['candidate']['personalIdNumber']}
bind:value={$form.candidate.personalIdNumber} bind:value={$form.candidate.personalIdNumber}
placeholder="Rodné číslo" placeholder={$LL.input.personalIdentificationNumber()}
/> />
{/if} {/if}
<div class="ml-2"> <div class="ml-2">
@ -615,7 +611,7 @@
error={$typedErrors['candidate']['sex']} error={$typedErrors['candidate']['sex']}
bind:value={$form.candidate.sex} bind:value={$form.candidate.sex}
options={['Žena', 'Muž']} options={['Žena', 'Muž']}
placeholder="Pohlaví" placeholder={$LL.input.sex()}
/> />
</div> </div>
</div> </div>
@ -651,7 +647,7 @@
{:else if pageIndex === 4} {:else if pageIndex === 4}
<h1 class="title mt-8">{pageTexts[3]}</h1> <h1 class="title mt-8">{pageTexts[3]}</h1>
<p class="description mt-8 block text-center"> <p class="description mt-8 block text-center">
Sběr dat o zákonném zástupci je klíčový pro získání důležitých kontaktů a informací. {$LL.candidate.register.fifth.description()}
</p> </p>
<div class="flex w-full flex-col"> <div class="flex w-full flex-col">
<span class="field"> <span class="field">
@ -659,28 +655,28 @@
error={$typedErrors['parents'][0]['name'] || $typedErrors['parents'][0]['surname']} error={$typedErrors['parents'][0]['name'] || $typedErrors['parents'][0]['surname']}
bind:valueName={$form.parents[0].name} bind:valueName={$form.parents[0].name}
bind:valueSurname={$form.parents[0].surname} bind:valueSurname={$form.parents[0].surname}
placeholder="Jméno a příjmení zákonného zástupce" placeholder={$LL.input.parent.nameSurname()}
/> />
</span> </span>
<span class="field"> <span class="field">
<EmailField <EmailField
error={$typedErrors['parents'][0]['email']} error={$typedErrors['parents'][0]['email']}
bind:value={$form.parents[0].email} bind:value={$form.parents[0].email}
placeholder="E-mail zákonného zástupce" placeholder={$LL.input.parent.email()}
/> />
</span> </span>
<span class="field"> <span class="field">
<TelephoneField <TelephoneField
error={$typedErrors['parents'][0]['telephone']} error={$typedErrors['parents'][0]['telephone']}
bind:value={$form.parents[0].telephone} bind:value={$form.parents[0].telephone}
placeholder="Telefon zákonného zástupce" placeholder={$LL.input.parent.telephone()}
/> />
</span> </span>
</div> </div>
{:else if pageIndex === 5} {:else if pageIndex === 5}
<h1 class="title mt-8">{pageTexts[4]}</h1> <h1 class="title mt-8">{pageTexts[4]}</h1>
<p class="description mt-8 block text-center"> <p class="description mt-8 block text-center">
Zde můžete zadat údaje o druhém zákonném zástupci. Škole tím umožníte lépe komunikovat. {$LL.candidate.register.sixth.description()}
</p> </p>
<div class="flex w-full flex-col"> <div class="flex w-full flex-col">
<span class="field"> <span class="field">
@ -688,21 +684,21 @@
error={$typedErrors['parents'][1]['name'] || $typedErrors['parents'][1]['surname']} error={$typedErrors['parents'][1]['name'] || $typedErrors['parents'][1]['surname']}
bind:valueName={$form.parents[1].name} bind:valueName={$form.parents[1].name}
bind:valueSurname={$form.parents[1].surname} bind:valueSurname={$form.parents[1].surname}
placeholder="Jméno a příjmení zákonného zástupce (nepovinné)" placeholder={`${$LL.input.parent.nameSurname()} (${$LL.input.optional()})`}
/> />
</span> </span>
<span class="field"> <span class="field">
<EmailField <EmailField
error={$typedErrors['parents'][1]['email']} error={$typedErrors['parents'][1]['email']}
bind:value={$form.parents[1].email} bind:value={$form.parents[1].email}
placeholder="E-mail zákonného zástupce (nepovinné)" placeholder={`${$LL.input.parent.email()} (${$LL.input.optional()})`}
/> />
</span> </span>
<span class="field"> <span class="field">
<TelephoneField <TelephoneField
error={$typedErrors['parents'][1]['telephone']} error={$typedErrors['parents'][1]['telephone']}
bind:value={$form.parents[1].telephone} bind:value={$form.parents[1].telephone}
placeholder="Telefon zákonného zástupce (nepovinné)" placeholder={`${$LL.input.parent.telephone()} (${$LL.input.optional()})`}
/> />
</span> </span>
</div> </div>
@ -717,9 +713,9 @@
</span> </span>
</div> </div>
{:else if pageIndex === 7} {:else if pageIndex === 7}
<h1 class="title mt-8">{pageTexts[5]}</h1> <h1 class="title mt-8">{pageTexts[6]}</h1>
<p class="description mt-8 block text-center"> <p class="description mt-8 block text-center">
Přidejte prosím přepis Vaších známek z posledních dvou let studia {$LL.candidate.register.eighth.description()}
</p> </p>
<GradesTable <GradesTable
error={$typedErrors['candidate']['grades']} error={$typedErrors['candidate']['grades']}
@ -741,7 +737,7 @@
// @ts-ignore // @ts-ignore
errors.set(formInitialValues); errors.set(formInitialValues);
}} }}
value={pageIndex === pageCount ? 'Odeslat' : 'Pokračovat'} value={pageIndex === pageCount ? $LL.input.submit() : $LL.input.continue()}
/> />
</div> </div>

View file

@ -1,4 +1,5 @@
<script lang="ts"> <script lang="ts">
import LL from '$i18n/i18n-svelte';
import { goto } from '$app/navigation'; import { goto } from '$app/navigation';
import Submit from '$lib/components/button/Submit.svelte'; import Submit from '$lib/components/button/Submit.svelte';
@ -19,16 +20,15 @@
<SplitLayout> <SplitLayout>
<div class="form"> <div class="form">
<SchoolBadge /> <SchoolBadge />
<h1 class="text-sspsBlue mt-8 text-4xl font-semibold">Přihlášení</h1> <h1 class="text-sspsBlue mt-8 text-4xl font-semibold">{$LL.candidate.auth.login.title()}</h1>
<p class="text-sspsGray my-8 text-center font-light"> <p class="text-sspsGray my-8 text-center font-light">
Evidenční číslo je jedinečné číslo přidělené uchazeči, které slouží k jeho identifikaci<br /> a {$LL.candidate.auth.login.description()}
přihlášení se do systému.
</p> </p>
<div class="w-4/5 lg:w-3/5"> <div class="w-4/5 lg:w-3/5">
<TextField bind:value={applicationValue} placeholder="Ev. číslo" type="number" /> <TextField bind:value={applicationValue} placeholder={$LL.input.evidenceNumber()} type="number" />
</div> </div>
<div class="mt-8 w-4/5 lg:w-3/5"> <div class="mt-8 w-4/5 lg:w-3/5">
<Submit on:click={redirectToCode} value="Odeslat" /> <Submit on:click={redirectToCode} value={$LL.input.submit()} />
</div> </div>
</div> </div>
</SplitLayout> </SplitLayout>

View file

@ -1,4 +1,6 @@
<script lang="ts"> <script lang="ts">
import LL from '$i18n/i18n-svelte';
import FullLayout from '$lib/components/layout/FullLayout.svelte'; import FullLayout from '$lib/components/layout/FullLayout.svelte';
import woman from '$lib/assets/woman.png'; import woman from '$lib/assets/woman.png';
@ -132,9 +134,12 @@
{/each} {/each}
</div> </div>
<h3 class="text-sspsBlue mx-8 mt-8 text-center text-xl font-semibold"> <h3 class="text-sspsBlue mx-8 mt-8 text-center text-xl font-semibold">
Zadejte 12místný kód pro aktivaci účtu {$LL.candidate.auth.application.title()}
</h3> </h3>
<p class="text-sspsGray mx-8 mt-8 text-center">Nevíte si rady? Klikněte <u>zde</u></p> <p class="text-sspsGray mx-8 mt-8 text-center">
{$LL.candidate.auth.application.help.description()}
<u>{$LL.candidate.auth.application.help.here()}</u>
</p>
</div> </div>
</FullLayout> </FullLayout>

View file

@ -1,6 +1,11 @@
import { setLocale } from '$i18n/i18n-svelte';
import { loadAllLocalesAsync } from '$i18n/i18n-util.async';
import type { LayoutLoad } from './$types'; import type { LayoutLoad } from './$types';
export const load: LayoutLoad = async ({ url }) => { export const load: LayoutLoad = async ({ url }) => {
await loadAllLocalesAsync();
setLocale('cs');
return { return {
url: url.pathname url: url.pathname
}; };

View file

@ -0,0 +1,123 @@
import type { BaseTranslation } from '../i18n-types.js';
const cs: BaseTranslation = {
here: 'zde',
admin: {
auth: {
login: {
title: 'Přihlášení',
description: 'Administrátoská sekce aplikace\nPřístup povolen pouze pro oprávněné osoby!'
}
}
},
candidate: {
auth: {
login: {
title: 'Přihlášení',
description:
'Evidenční číslo je jedinečné číslo přidělené uchazeči, které slouží k jeho identifikaci\napřihlášení se do systému.'
},
application: {
title: 'Zadejte 12místný kód pro aktivaci účtu',
help: {
description: 'Nevíte si rady? Klikněte',
here: 'zde'
}
}
},
register: {
first: {
title: 'Propojení účtů',
description:
'Elektronickou přihlášky stačí vyplnit jen jednou i v případě, že jste podali dvě přihlášky. Potvrďte, že jste jste k nám skutečně podali dvě přihlášky.'
},
second: {
title: 'Zpracování osobních údajů',
description:
'V rámci portálu pro přijímací řízení zpracováváme mnoho osobních údajů. Proto je nutný Váš souhlas s jejich zpracováním. O bezpečnosti zpracování Vašich osobních údajů si můžete přečíst'
},
third: {
title: 'Registrace',
description:
'V rámci usnadnění přijímacího řízení jsme připravili online formulář, který Vám pomůže s vyplněním potřebných údajů.'
},
fourth: {
title: 'Něco o Vás',
titleEdit: 'Úprava osobních údajů',
description:
'Pro registraci je potřeba vyplnit několik údajů o Vás. Tyto údaje budou použity pro přijímací řízení. Všechny údaje jsou důležité.'
},
fifth: {
title: 'Zákonný zástupce',
description:
'Sběr dat o zákonném zástupci je klíčový pro získání důležitých kontaktů a informací.'
},
sixth: {
title: 'Druhý zákonný zástupce',
description:
'Zde můžete zadat údaje o druhém zákonném zástupci. Škole tím umožníte lépe komunikovat.'
},
seventh: {
title: 'Dokončení registrace',
description:
'Zadejte prosím své občanství, rodné číslo, či jeho alternativu Vaší země a obor na který se hlásíte.'
},
eighth: {
title: 'Poslední krok',
description: 'Přidejte prosím přepis Vaších známek z posledních dvou let studia'
}
}
},
components: {
checkbox: {
accountLinkCheckBox: {
ok: 'Vše je v pořádku',
whatHappened: 'Co se děje?',
multiple: {
title:
'Ano, podával/a jsem dvě přihlášky na dva obory SSPŠaG ({first:number}) a ({second:number})',
title2: 'Ne, přihlášku na SSPŠaG jsem podával/a jen jednu ({first:number})'
},
single: {
title: 'Ano, přihlášku na SSPŠaG jsem podával/a jen jednu ({first:number})',
title2: 'Ne, přihlášku na SSPŠaG jsem podával více přihlášek'
}
},
gdprCheckBox: {
title: 'Souhlasím se zpracováním osobních údajů',
description: 'Kliknutím vyjaďřujete souhlas se zpracováním osobních údajů',
here: 'Zde'
}
}
},
input: {
optional: 'nepovinné',
nameSurname: 'Jméno a příjmení',
email: 'E-mail',
telephone: 'Telefon',
address: 'Ulice a č. p.',
zipCode: 'PSČ',
city: 'Město',
birthPlace: 'Místo narození',
birthDate: 'Datum narození',
sex: 'Pohlaví',
citizenship: 'Občanství',
testLanguage: 'Jazyk odborných testů',
schoolIzo: 'IZO školy',
schoolName: 'Název školy',
insuranceNumber: 'Číslo zdravotní pojišťovny',
personalIdentificationNumber: 'Rodné číslo',
evidenceNumber: 'Ev. číslo',
adminId: 'Admin Id',
password: 'Heslo',
submit: 'Odeslat',
continue: "Pokračovat",
parent: {
nameSurname: 'Jméno a příjmení zákonného zástupce',
email: 'E-mail zákonného zástupce',
telephone: 'Telefon zákonného zástupce'
}
}
};
export default cs;

View file

@ -0,0 +1,11 @@
import type { FormattersInitializer } from 'typesafe-i18n'
import type { Locales, Formatters } from './i18n-types.js'
export const initFormatters: FormattersInitializer<Locales, Formatters> = (locale: Locales) => {
const formatters: Formatters = {
// add your formatter functions here
}
return formatters
}

View file

@ -0,0 +1,12 @@
// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
/* eslint-disable */
import { initI18nSvelte } from 'typesafe-i18n/svelte'
import type { Formatters, Locales, TranslationFunctions, Translations } from './i18n-types.js'
import { loadedFormatters, loadedLocales } from './i18n-util.js'
const { locale, LL, setLocale } = initI18nSvelte<Locales, Translations, TranslationFunctions, Formatters>(loadedLocales, loadedFormatters)
export { locale, LL, setLocale }
export default LL

View file

@ -0,0 +1,593 @@
// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
/* eslint-disable */
import type { BaseTranslation as BaseTranslationType, LocalizedString, RequiredParams } from 'typesafe-i18n'
export type BaseTranslation = BaseTranslationType
export type BaseLocale = 'cs'
export type Locales =
| 'cs'
export type Translation = RootTranslation
export type Translations = RootTranslation
type RootTranslation = {
/**
* zde
*/
here: string
admin: {
auth: {
login: {
/**
* Přihlášení
*/
title: string
/**
* Administrátoská sekce aplikace
Přístup povolen pouze pro oprávněné osoby!
*/
description: string
}
}
}
candidate: {
auth: {
login: {
/**
* Přihlášení
*/
title: string
/**
* Evidenční číslo je jedinečné číslo přidělené uchazeči, které slouží k jeho identifikaci
apřihlášení se do systému.
*/
description: string
}
application: {
/**
* Zadejte 12místný kód pro aktivaci účtu
*/
title: string
help: {
/**
* Nevíte si rady? Klikněte
*/
description: string
/**
* zde
*/
here: string
}
}
}
register: {
first: {
/**
* Propojení účtů
*/
title: string
/**
* Elektronickou přihlášky stačí vyplnit jen jednou i v případě, že jste podali dvě přihlášky. Potvrďte, že jste jste k nám skutečně podali dvě přihlášky.
*/
description: string
}
second: {
/**
* Zpracování osobních údajů
*/
title: string
/**
* V rámci portálu pro přijímací řízení zpracováváme mnoho osobních údajů. Proto je nutný Váš souhlas s jejich zpracováním. O bezpečnosti zpracování Vašich osobních údajů si můžete přečíst
*/
description: string
}
third: {
/**
* Registrace
*/
title: string
/**
* V rámci usnadnění přijímacího řízení jsme připravili online formulář, který Vám pomůže s vyplněním potřebných údajů.
*/
description: string
}
fourth: {
/**
* Něco o Vás
*/
title: string
/**
* Úprava osobních údajů
*/
titleEdit: string
/**
* Pro registraci je potřeba vyplnit několik údajů o Vás. Tyto údaje budou použity pro přijímací řízení. Všechny údaje jsou důležité.
*/
description: string
}
fifth: {
/**
* Zákonný zástupce
*/
title: string
/**
* Sběr dat o zákonném zástupci je klíčový pro získání důležitých kontaktů a informací.
*/
description: string
}
sixth: {
/**
* Druhý zákonný zástupce
*/
title: string
/**
* Zde můžete zadat údaje o druhém zákonném zástupci. Škole tím umožníte lépe komunikovat.
*/
description: string
}
seventh: {
/**
* Dokončení registrace
*/
title: string
/**
* Zadejte prosím své občanství, rodné číslo, či jeho alternativu Vaší země a obor na který se hlásíte.
*/
description: string
}
eighth: {
/**
* Poslední krok
*/
title: string
/**
* Přidejte prosím přepis Vaších známek z posledních dvou let studia
*/
description: string
}
}
}
components: {
checkbox: {
accountLinkCheckBox: {
/**
* Vše je v pořádku
*/
ok: string
/**
* Co se děje?
*/
whatHappened: string
multiple: {
/**
* Ano, podával/a jsem dvě přihlášky na dva obory SSPŠaG ({first}) a ({second})
* @param {number} first
* @param {number} second
*/
title: RequiredParams<'first' | 'second'>
/**
* Ne, přihlášku na SSPŠaG jsem podával/a jen jednu ({first})
* @param {number} first
*/
title2: RequiredParams<'first'>
}
single: {
/**
* Ano, přihlášku na SSPŠaG jsem podával/a jen jednu ({first})
* @param {number} first
*/
title: RequiredParams<'first'>
/**
* Ne, přihlášku na SSPŠaG jsem podával více přihlášek
*/
title2: string
}
}
gdprCheckBox: {
/**
* Souhlasím se zpracováním osobních údajů
*/
title: string
/**
* Kliknutím vyjaďřujete souhlas se zpracováním osobních údajů
*/
description: string
/**
* Zde
*/
here: string
}
}
}
input: {
/**
* nepovinné
*/
optional: string
/**
* Jméno a příjmení
*/
nameSurname: string
/**
* E-mail
*/
email: string
/**
* Telefon
*/
telephone: string
/**
* Ulice a č. p.
*/
address: string
/**
* PSČ
*/
zipCode: string
/**
* Město
*/
city: string
/**
* Místo narození
*/
birthPlace: string
/**
* Datum narození
*/
birthDate: string
/**
* Pohlaví
*/
sex: string
/**
* Občanství
*/
citizenship: string
/**
* Jazyk odborných testů
*/
testLanguage: string
/**
* IZO školy
*/
schoolIzo: string
/**
* Název školy
*/
schoolName: string
/**
* Číslo zdravotní pojišťovny
*/
insuranceNumber: string
/**
* Rodné číslo
*/
personalIdentificationNumber: string
/**
* Ev. číslo
*/
evidenceNumber: string
/**
* Admin Id
*/
adminId: string
/**
* Heslo
*/
password: string
/**
* Odeslat
*/
submit: string
/**
* Pokračovat
*/
'continue': string
parent: {
/**
* Jméno a příjmení zákonného zástupce
*/
nameSurname: string
/**
* E-mail zákonného zástupce
*/
email: string
/**
* Telefon zákonného zástupce
*/
telephone: string
}
}
}
export type TranslationFunctions = {
/**
* zde
*/
here: () => LocalizedString
admin: {
auth: {
login: {
/**
* Přihlášení
*/
title: () => LocalizedString
/**
* Administrátoská sekce aplikace
Přístup povolen pouze pro oprávněné osoby!
*/
description: () => LocalizedString
}
}
}
candidate: {
auth: {
login: {
/**
* Přihlášení
*/
title: () => LocalizedString
/**
* Evidenční číslo je jedinečné číslo přidělené uchazeči, které slouží k jeho identifikaci
apřihlášení se do systému.
*/
description: () => LocalizedString
}
application: {
/**
* Zadejte 12místný kód pro aktivaci účtu
*/
title: () => LocalizedString
help: {
/**
* Nevíte si rady? Klikněte
*/
description: () => LocalizedString
/**
* zde
*/
here: () => LocalizedString
}
}
}
register: {
first: {
/**
* Propojení úč
*/
title: () => LocalizedString
/**
* Elektronickou přihlášky stačí vyplnit jen jednou i v případě, že jste podali dvě přihlášky. Potvrďte, že jste jste k nám skutečně podali dvě přihlášky.
*/
description: () => LocalizedString
}
second: {
/**
* Zpracování osobních údajů
*/
title: () => LocalizedString
/**
* V rámci portálu pro přijímací řízení zpracováváme mnoho osobních údajů. Proto je nutný Váš souhlas s jejich zpracováním. O bezpečnosti zpracování Vašich osobních údajů si můžete přečíst
*/
description: () => LocalizedString
}
third: {
/**
* Registrace
*/
title: () => LocalizedString
/**
* V rámci usnadnění přijímacího řízení jsme připravili online formulář, který Vám pomůže s vyplněním potřebných údajů.
*/
description: () => LocalizedString
}
fourth: {
/**
* Něco o Vás
*/
title: () => LocalizedString
/**
* Úprava osobních údajů
*/
titleEdit: () => LocalizedString
/**
* Pro registraci je potřeba vyplnit několik údajů o Vás. Tyto údaje budou použity pro přijímací řízení. Všechny údaje jsou důležité.
*/
description: () => LocalizedString
}
fifth: {
/**
* Zákonný zástupce
*/
title: () => LocalizedString
/**
* Sběr dat o zákonném zástupci je klíčový pro získání důležitých kontaktů a informací.
*/
description: () => LocalizedString
}
sixth: {
/**
* Druhý zákonný zástupce
*/
title: () => LocalizedString
/**
* Zde můžete zadat údaje o druhém zákonném zástupci. Škole tím umožníte lépe komunikovat.
*/
description: () => LocalizedString
}
seventh: {
/**
* Dokončení registrace
*/
title: () => LocalizedString
/**
* Zadejte prosím své občanství, rodné číslo, či jeho alternativu Vaší země a obor na který se hlásíte.
*/
description: () => LocalizedString
}
eighth: {
/**
* Poslední krok
*/
title: () => LocalizedString
/**
* Přidejte prosím přepis Vaších známek z posledních dvou let studia
*/
description: () => LocalizedString
}
}
}
components: {
checkbox: {
accountLinkCheckBox: {
/**
* Vše je v pořádku
*/
ok: () => LocalizedString
/**
* Co se děje?
*/
whatHappened: () => LocalizedString
multiple: {
/**
* Ano, podával/a jsem dvě přihlášky na dva obory SSPŠaG ({first}) a ({second})
*/
title: (arg: { first: number, second: number }) => LocalizedString
/**
* Ne, přihlášku na SSPŠaG jsem podával/a jen jednu ({first})
*/
title2: (arg: { first: number }) => LocalizedString
}
single: {
/**
* Ano, přihlášku na SSPŠaG jsem podával/a jen jednu ({first})
*/
title: (arg: { first: number }) => LocalizedString
/**
* Ne, přihlášku na SSPŠaG jsem podával více přihlášek
*/
title2: () => LocalizedString
}
}
gdprCheckBox: {
/**
* Souhlasím se zpracováním osobních údajů
*/
title: () => LocalizedString
/**
* Kliknutím vyjaďřujete souhlas se zpracováním osobních údajů
*/
description: () => LocalizedString
/**
* Zde
*/
here: () => LocalizedString
}
}
}
input: {
/**
* nepovinné
*/
optional: () => LocalizedString
/**
* Jméno a příjmení
*/
nameSurname: () => LocalizedString
/**
* E-mail
*/
email: () => LocalizedString
/**
* Telefon
*/
telephone: () => LocalizedString
/**
* Ulice a č. p.
*/
address: () => LocalizedString
/**
* PSČ
*/
zipCode: () => LocalizedString
/**
* Město
*/
city: () => LocalizedString
/**
* Místo narození
*/
birthPlace: () => LocalizedString
/**
* Datum narození
*/
birthDate: () => LocalizedString
/**
* Pohlaví
*/
sex: () => LocalizedString
/**
* Občanství
*/
citizenship: () => LocalizedString
/**
* Jazyk odborných testů
*/
testLanguage: () => LocalizedString
/**
* IZO školy
*/
schoolIzo: () => LocalizedString
/**
* Název školy
*/
schoolName: () => LocalizedString
/**
* Číslo zdravotní pojišťovny
*/
insuranceNumber: () => LocalizedString
/**
* Rodné číslo
*/
personalIdentificationNumber: () => LocalizedString
/**
* Ev. číslo
*/
evidenceNumber: () => LocalizedString
/**
* Admin Id
*/
adminId: () => LocalizedString
/**
* Heslo
*/
password: () => LocalizedString
/**
* Odeslat
*/
submit: () => LocalizedString
/**
* Pokračovat
*/
'continue': () => LocalizedString
parent: {
/**
* Jméno a příjmení zákonného zástupce
*/
nameSurname: () => LocalizedString
/**
* E-mail zákonného zástupce
*/
email: () => LocalizedString
/**
* Telefon zákonného zástupce
*/
telephone: () => LocalizedString
}
}
}
export type Formatters = {}

View file

@ -0,0 +1,26 @@
// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
/* eslint-disable */
import { initFormatters } from './formatters.js'
import type { Locales, Translations } from './i18n-types.js'
import { loadedFormatters, loadedLocales, locales } from './i18n-util.js'
const localeTranslationLoaders = {
cs: () => import('./cs/index.js'),
}
const updateDictionary = (locale: Locales, dictionary: Partial<Translations>): Translations =>
loadedLocales[locale] = { ...loadedLocales[locale], ...dictionary }
export const importLocaleAsync = async (locale: Locales): Promise<Translations> =>
(await localeTranslationLoaders[locale]()).default as unknown as Translations
export const loadLocaleAsync = async (locale: Locales): Promise<void> => {
updateDictionary(locale, await importLocaleAsync(locale))
loadFormatters(locale)
}
export const loadAllLocalesAsync = (): Promise<void[]> => Promise.all(locales.map(loadLocaleAsync))
export const loadFormatters = (locale: Locales): void =>
void (loadedFormatters[locale] = initFormatters(locale))

View file

@ -0,0 +1,24 @@
// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
/* eslint-disable */
import { initFormatters } from './formatters.js'
import type { Locales, Translations } from './i18n-types.js'
import { loadedFormatters, loadedLocales, locales } from './i18n-util.js'
import cs from './cs/index.js'
const localeTranslations = {
cs,
}
export const loadLocale = (locale: Locales): void => {
if (loadedLocales[locale]) return
loadedLocales[locale] = localeTranslations[locale] as unknown as Translations
loadFormatters(locale)
}
export const loadAllLocales = (): void => locales.forEach(loadLocale)
export const loadFormatters = (locale: Locales): void =>
void (loadedFormatters[locale] = initFormatters(locale))

View file

@ -0,0 +1,34 @@
// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
/* eslint-disable */
import { i18n as initI18n, i18nObject as initI18nObject, i18nString as initI18nString } from 'typesafe-i18n'
import type { LocaleDetector } from 'typesafe-i18n/detectors'
import type { LocaleTranslationFunctions, TranslateByString } from 'typesafe-i18n'
import { detectLocale as detectLocaleFn } from 'typesafe-i18n/detectors'
import type { Formatters, Locales, Translations, TranslationFunctions } from './i18n-types.js'
export const baseLocale: Locales = 'cs'
export const locales: Locales[] = [
'cs'
]
export const isLocale = (locale: string): locale is Locales => locales.includes(locale as Locales)
export const loadedLocales: Record<Locales, Translations> = {} as Record<Locales, Translations>
export const loadedFormatters: Record<Locales, Formatters> = {} as Record<Locales, Formatters>
export const i18nString = (locale: Locales): TranslateByString => initI18nString<Locales, Formatters>(locale, loadedFormatters[locale])
export const i18nObject = (locale: Locales): TranslationFunctions =>
initI18nObject<Locales, Translations, TranslationFunctions, Formatters>(
locale,
loadedLocales[locale],
loadedFormatters[locale]
)
export const i18n = (): LocaleTranslationFunctions<Locales, Translations, TranslationFunctions> =>
initI18n<Locales, Translations, TranslationFunctions, Formatters>(loadedLocales, loadedFormatters)
export const detectLocale = (...detectors: LocaleDetector[]): Locales => detectLocaleFn<Locales>(baseLocale, locales, ...detectors)

View file

@ -1,5 +1,6 @@
import adapter from '@sveltejs/adapter-node'; import adapter from '@sveltejs/adapter-node';
import preprocess from 'svelte-preprocess'; import preprocess from 'svelte-preprocess';
import path from "path";
import { windi } from 'svelte-windicss-preprocess'; import { windi } from 'svelte-windicss-preprocess';
/** @type {import('@sveltejs/kit').Config} */ /** @type {import('@sveltejs/kit').Config} */
@ -8,7 +9,11 @@ const config = {
// for more information about preprocessors // for more information about preprocessors
preprocess: [preprocess(), windi({})], preprocess: [preprocess(), windi({})],
kit: { kit: {
adapter: adapter({ out: 'build' }) adapter: adapter({ out: 'build' }),
alias: {
$i18n: path.resolve('./src/translations'),
}
} }
}; };

View file

@ -9,6 +9,6 @@
"resolveJsonModule": true, "resolveJsonModule": true,
"skipLibCheck": true, "skipLibCheck": true,
"sourceMap": true, "sourceMap": true,
"strict": true "strict": true,
} }
} }