diff --git a/.astro-i18n/generated.d.ts b/.astro-i18n/generated.d.ts new file mode 100644 index 00000000..52bf1762 --- /dev/null +++ b/.astro-i18n/generated.d.ts @@ -0,0 +1,52 @@ +type DefaultLangCode = "de" +type SupportedLangCode = "en" | "fr" +type LangCode = DefaultLangCode | SupportedLangCode +type RouteUri = | "/bedarfsausweis" | "/velopers" | "/faq" | "/pdf/ansichtsausweis" | "/pdf/datenblatt" | "/user" | "/verbrauchsausweis/erstellen" | "/verbrauchsausweis" | "/verbrauchsausweis-gewerbe" | "/" | "/kaufabschluss" | "/kundendaten" | "/login" | "/logout" | "/signup" +type RouteParams = {"/bedarfsausweis": undefined; "/velopers": undefined; "/faq": undefined; "/pdf/ansichtsausweis": undefined; "/pdf/datenblatt": undefined; "/user": undefined; "/verbrauchsausweis/erstellen": undefined; "/verbrauchsausweis": undefined; "/verbrauchsausweis-gewerbe": undefined; "/": undefined; "/kaufabschluss": undefined; "/kundendaten": undefined; "/login": undefined; "/logout": undefined; "/signup": undefined; } +type TranslationPath = "header.profil" | "header.kontakt" | "header.login" +type TranslationOptions = { "header.profil": {} | undefined; "header.kontakt": {} | undefined; "header.login": {} | undefined; } + +declare module "astro-i18n" { + export * from "astro-i18n/" + + export function l( + route: Uri | string & {}, + ...args: Uri extends keyof RouteParams + ? undefined extends RouteParams[Uri] + ? [params?: Record, targetLangCode?: LangCode, routeLangCode?: LangCode] + : [params: RouteParams[Uri], targetLangCode?: LangCode, routeLangCode?: LangCode] + : [params?: Record, targetLangCode?: LangCode, routeLangCode?: LangCode] + ): string + + export function t( + path: Path | string & {}, + ...args: undefined extends TranslationOptions[Path] + ? [options?: keyof TranslationOptions extends Path ? Record : TranslationOptions[Path], langCode?: LangCode] + : [options: TranslationOptions[Path], langCode?: LangCode] + ): string + + export function extractRouteLangCode(route: string): LangCode | undefined + + type Translation = string | { [translationKey: string]: string | Translation } + type Translations = { [langCode: string]: Record } + type RouteTranslations = { [langCode: string]: Record } + type InterpolationFormatter = (value: unknown, ...args: unknown[]) => string + class AstroI18n { + defaultLangCode: DefaultLangCode + supportedLangCodes: SupportedLangCode[] + showDefaultLangCode: boolean + translations: Translations + routeTranslations: RouteTranslations + get langCodes(): LangCode[] + get langCode(): LangCode + set langCode(langCode: LangCode) + get formatters(): Record + init(Astro: { url: URL }, formatters?: Record): void + addTranslations(translations: Translations): void + addRouteTranslations(routeTranslations: RouteTranslations): void + getFormatter(name: string): InterpolationFormatter | undefined + setFormatter(name: string, formatter: InterpolationFormatter): void + deleteFormatter(name: string): void + } + export const astroI18n: AstroI18n +} diff --git a/astro-i18next.config.mjs b/astro-i18next.config.mjs new file mode 100644 index 00000000..8614c860 --- /dev/null +++ b/astro-i18next.config.mjs @@ -0,0 +1,16 @@ +/** @type {import('astro-i18next').AstroI18nextConfig} */ + +export default { + defaultLocale: "de", + locales: ["de", "en", "fr"], + showDefaultLocale: false, + routes: { + en: { + "verbrauchsausweis": "consumption-certificate", + "bedarfsausweis": "requirement-certificate" + }, + fr: { + + } + } +} \ No newline at end of file diff --git a/astro.config.mjs b/astro.config.mjs index fd949b8c..89289ff9 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,5 +1,6 @@ import { defineConfig } from "astro/config"; import svelte from "@astrojs/svelte"; +import astroI18next from "astro-i18next"; import tailwind from "@astrojs/tailwind"; @@ -11,7 +12,7 @@ import mdx from "@astrojs/mdx"; // https://astro.build/config export default defineConfig({ - integrations: [svelte(), tailwind(), mdx()], + integrations: [astroI18next(),svelte(), tailwind(), mdx()], outDir: "./dist", output: "server", adapter: node({ diff --git a/package.json b/package.json index 55165107..90065ea0 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,8 @@ "test:e2e": "cypress run", "test:unit": "vitest", "format": "prettier --write .", - "build:production": "astro build && node server.js" + "build:production": "astro build && node server.js", + "i18n:generate": "npx astro-i18next generate" }, "private": true, "dependencies": { @@ -20,9 +21,16 @@ "@astrojs/svelte": "^2.2.0", "@astrojs/tailwind": "^3.1.3", "@ibcornelsen/ui": "^0.0.2", + "@mollie/api-client": "^3.7.0", "astro": "^2.5.1", + "astro-i18next": "1.0.0-beta.21", "cookiejs": "^2.1.2", + "esbuild": "^0.18.17", "express": "^4.18.2", + "flag-icons": "^6.9.2", + "i18next": "^23.4.1", + "i18next-fs-backend": "^2.1.5", + "i18next-http-backend": "^2.2.1", "jimp": "^0.22.8", "jwt-simple": "^0.5.6", "katex": "^0.16.7", @@ -34,6 +42,7 @@ "svelte-preprocess": "^5.0.3", "tailwindcss": "^3.3.2", "uuid": "^9.0.0", + "vite-tsconfig-paths": "^4.2.0", "zod": "^3.21.4" }, "devDependencies": { diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json new file mode 100644 index 00000000..c1518972 --- /dev/null +++ b/public/locales/de/translation.json @@ -0,0 +1,7 @@ +{ + "header": { + "profil": "Profil", + "kontakt": "Kontakt", + "login": "Login" + } +} \ No newline at end of file diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json new file mode 100644 index 00000000..df366b95 --- /dev/null +++ b/public/locales/en/translation.json @@ -0,0 +1,7 @@ +{ + "header": { + "profil": "Profile", + "kontakt": "Contact Us", + "login": "Log in" + } +} \ No newline at end of file diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json new file mode 100644 index 00000000..1d870d27 --- /dev/null +++ b/public/locales/fr/translation.json @@ -0,0 +1,7 @@ +{ + "header": { + "kontakt": "Nous contacter", + "login": "Se connecter", + "profil": "Profil" + } +} \ No newline at end of file diff --git a/schema/Ausweis.ts b/schema/Ausweis.ts new file mode 100644 index 00000000..7ae1f47d --- /dev/null +++ b/schema/Ausweis.ts @@ -0,0 +1,15 @@ +import { Energiekennwert } from "./Energiekennwert"; + +export interface Ausweis { + ausweisart: "Verbrauchsausweis" | "Bedarfsausweis" | "Verbrauchsausweis Nichtwohngebäude", + energiekennwerte: Energiekennwert[], + erstellungsdatum: string, + // Ausstellungsgrund des Ausweises + ausstellgrund: "Vermietung" | "Verkauf" | "Neubau" | "Sonstiges", + // Gültigkeitsdatum des Ausweises + gueltig_bis: string, + // Baujahr des Gebäudes, es können ebenfalls mehrere Baujahre angegeben werden. + baujahr_gebaeude: number[] | number, + // Baujahr der Anlagentechnik, es können ebenfalls mehrere Baujahre oder mehrere Baujahre für mehrere Anlagen angegeben werden. + baujahr_anlage: number[] | number | number[][], +} \ No newline at end of file diff --git a/schema/Energiekennwert.ts b/schema/Energiekennwert.ts new file mode 100644 index 00000000..710eca50 --- /dev/null +++ b/schema/Energiekennwert.ts @@ -0,0 +1,9 @@ +export interface Energiekennwert { + verbraeuche: number[], + energietraeger_einheit: string, + energietraeger: string, + // Anteil Warmwasser am Heizverbrauch in Prozent + anteil_warmwasser: number, + zeitraum_start: string, + zeitraum_ende: string, +} \ No newline at end of file diff --git a/schema/Gebaeude.ts b/schema/Gebaeude.ts new file mode 100644 index 00000000..5beb2141 --- /dev/null +++ b/schema/Gebaeude.ts @@ -0,0 +1,7 @@ +export interface Gebaeude { + objekt_typ: string, + objekt_plz: string, + objekt_ort: string, + objekt_strasse: string, + +} \ No newline at end of file diff --git a/src/components/AnsichtsausweisButton.svelte b/src/components/AnsichtsausweisButton.svelte index 6897d58a..c6cadeed 100644 --- a/src/components/AnsichtsausweisButton.svelte +++ b/src/components/AnsichtsausweisButton.svelte @@ -5,14 +5,10 @@ export let ausweis: Verbrauchsausweis | Bedarfsausweis | VerbrauchsausweisGewerbe; - function viewAusweis() { - const base64 = btoa(JSON.stringify(ausweis)); - - window.open(`/pdf/ansichtsausweis?base64=${base64}`, "_blank"); - } + const base64 = btoa(JSON.stringify(ausweis)); - + diff --git a/src/components/Ausweis/AusweisPreviewContainer.svelte b/src/components/Ausweis/AusweisPreviewContainer.svelte index 2ce473fb..f0d1cc0f 100644 --- a/src/components/Ausweis/AusweisPreviewContainer.svelte +++ b/src/components/Ausweis/AusweisPreviewContainer.svelte @@ -2,9 +2,9 @@ import { Verbrauchsausweis } from "src/lib/Ausweis/Verbrauchsausweis"; import { VerbrauchsausweisGewerbe } from "src/lib/Ausweis/VerbrauchsausweisGewerbe"; import { Bedarfsausweis } from "src/lib/Ausweis/Bedarfsausweis"; - import AnsichtsausweisButton from "~/components/AnsichtsausweisButton.svelte"; - import DatenblattButton from "~/components/DatenblattButton.svelte"; - import HelpLabel from "~/components/HelpLabel.svelte"; + import AnsichtsausweisButton from "#components/AnsichtsausweisButton.svelte"; + import DatenblattButton from "#components/DatenblattButton.svelte"; + import HelpLabel from "#components/HelpLabel.svelte"; export let ausweis: | Verbrauchsausweis diff --git a/src/components/Ausweis/Ausweisart.svelte b/src/components/Ausweis/Ausweisart.svelte index fd75af71..e546d213 100644 --- a/src/components/Ausweis/Ausweisart.svelte +++ b/src/components/Ausweis/Ausweisart.svelte @@ -1,18 +1,17 @@
diff --git a/src/components/Ausweis/Kundendaten.svelte b/src/components/Ausweis/Kundendaten.svelte index a6b7a1e2..6a4c176d 100644 --- a/src/components/Ausweis/Kundendaten.svelte +++ b/src/components/Ausweis/Kundendaten.svelte @@ -1,7 +1,9 @@ -
-
-
-
-

Verbrauchsausweis erstellen - 45€

- -
+
+
+
+

Verbrauchsausweis erstellen - 45€

+
+
-
-
+ +
+

- +
- +
- - + +
- +
@@ -84,7 +93,7 @@
- +
- +
- + - +
- - + +
- - + +
- +
@@ -157,14 +172,12 @@ id="deliveryAddress" bind:checked={deliveryAddress} /> - +
- +
- +
- + - +
- - + + +
+
+
+ +
+ +
+

Bitte wählen sie ihre Bezahlmethode aus.

+
+
+
+
+ PayPal +
+ Zahlen mit PayPal +
+
+
+ Giropay +
+ Zahlen mit Giropay +
+
+
+ Sofort +
+ Zahlen mit Sofort +
+
+
+
+
+ Mastercard +
+ Zahlen mit Kreditkarte +
+
+
+ Rechnung +
+ Zahlen mit Rechnung +
+
+
+ SEPA +
+ SEPA über PayPal +
+
+
+
+
+
+
{paymentType}
+ +
+ {#if paymentType == "rechnung"} +

+ Sobald sie AGB und Datenschutzerklärung + gelesen und akzeptiert haben können sie den + Kauf fortsetzen. Durch das Klicken auf + 'Kostenpflichtig Bestellen' wird ihnen eine + Email mit weiteren Informationen über ihren + Kauf zugeschickt, von der aus sie den + Bezahlvorgang abschließen können. +

+ {:else} +

+ Sobald sie AGB und Datenschutzerklärung + gelesen und akzeptiert haben können sie den + Kauf fortsetzen. Durch das Klicken auf + 'Kostenpflichtig Bestellen' werden sie zu {paymentType} weitergeleitet. +

+ {/if} +
+
+ + +
+
+ + +
+
+
@@ -214,12 +384,14 @@
- - +
-
- -
+
+
+ +
+ +
diff --git a/src/components/Ausweis/Verbrauch.svelte b/src/components/Ausweis/Verbrauch.svelte index 0141cbf1..b3251283 100644 --- a/src/components/Ausweis/Verbrauch.svelte +++ b/src/components/Ausweis/Verbrauch.svelte @@ -26,6 +26,7 @@ ]; export let gebaeude: Gebaeude; + export let ausweis: Verbrauchsausweis; const fuelMap: Record = {}; for (const fuel of fuelList) { @@ -37,8 +38,6 @@ let month: string = "01"; let year: string = "2018"; - $: ausweis = gebaeude.ausweis || new Verbrauchsausweis(); - $: { if (month && year) { ausweis.kennwerte.zeitraum = moment(`${month}.01.${year}`); diff --git a/src/components/AusweisCard.svelte b/src/components/AusweisCard.svelte index 32fb17b8..10cfec1a 100644 --- a/src/components/AusweisCard.svelte +++ b/src/components/AusweisCard.svelte @@ -1,10 +1,9 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/components/Header.astro b/src/components/Header.astro index a6309600..df2f0129 100644 --- a/src/components/Header.astro +++ b/src/components/Header.astro @@ -1,5 +1,9 @@ --- +import i18next from "i18next"; +import {localizeUrl} from "astro-i18next" +import { t } from "i18next"; import { isLoggedIn } from "../lib/UI/isLoggedIn"; +import LanguageDropdown from "./LanguageDropdown.svelte"; const loggedIn = isLoggedIn(Astro); --- @@ -16,22 +20,56 @@ const loggedIn = isLoggedIn(Astro); src="/images/header/logo-big.png" class="header-logo" alt="IBCornelsen - Logo" - onclick="window.location.href = '/'" + onclick=" + window.location.href = '/' +" /> -

Energieausweis online erstellen

-

Energieausweise nach aktueller GEG

+

+ Energieausweis online erstellen +

+

+ Energieausweise nach aktueller GEG +

@@ -163,7 +161,7 @@ autocomplete="off" data-rule-minlength="2" data-msg-minlength="min. 2 Zeichen" - bind:value={$gebaeude.wohnflaeche} + bind:value={gebaeude.wohnflaeche} /> @@ -175,7 +173,7 @@ Heizung @@ -286,7 +284,7 @@ >Warmwasser @@ -294,7 +292,7 @@ >Lüftung @@ -302,7 +300,7 @@ >Kühlung @@ -441,7 +439,7 @@ >F - Bitte prüfen Sie hier die Angaben zum Sanierungszustand des Gebäudes - +
@@ -450,11 +448,6 @@ - {#each Object.entries($notifications) as [uid, notification] (uid)} @@ -463,7 +456,7 @@ {/each} - {#if auditBedarfsausweisBenoetigt($gebaeude)} + {#if auditBedarfsausweisBenoetigt(gebaeude)} {/if} - {#if auditHeizungGebaeudeBaujahr($gebaeude)} + {#if auditHeizungGebaeudeBaujahr(gebaeude)} { hidden.add(AuditType.HEIZUNG_GEBAEUDE_BAUJAHR); - $gebaeude = $gebaeude; + gebaeude = gebaeude; }, type: "warning", }} @@ -498,7 +491,7 @@ {/if} - {#if auditVerbrauchAbweichung($gebaeude).length > 0} + {#if auditVerbrauchAbweichung(gebaeude).length > 0} { hidden.add(AuditType.VERBRAUCH_ABWEICHUNG); - $gebaeude = $gebaeude; + gebaeude = gebaeude; }, type: "warning", }} > Die Abweichung der Verbräuche zwischen Zeitraum {auditVerbrauchAbweichung( - $gebaeude - )[0]} und {auditVerbrauchAbweichung($gebaeude)[1]} beträgt mehr als 25% + gebaeude + )[0]} und {auditVerbrauchAbweichung(gebaeude)[1]} beträgt mehr als 25% und sie haben keinen Leerstand angegeben. Sind sie sich sicher, dass das stimmt? diff --git a/src/components/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeContent.svelte b/src/components/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeContent.svelte index 338c8757..9ad9b1b2 100644 --- a/src/components/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeContent.svelte +++ b/src/components/VerbrauchsausweisGewerbe/VerbrauchsausweisGewerbeContent.svelte @@ -1,11 +1,11 @@