Skip to content

Commit 5e2ed33

Browse files
committed
Startseite uebersetzbar machen und den Sprachschalter der Rechtsseiten entfernen
Die Startseite lag noch komplett englisch unter /de/. React-Seiten werden nicht in den i18n-Baum kopiert, nur .md und .mdx, ihre Texte muessen also wie beim Footer ueber <Translate> laufen. Betrifft die Ueberschrift ueber den Karten, deren Beschreibungen und Tags, den Get-Started-Button und den kompletten Need-help-Block. Die Ressourcenliste wandert dafuer aus der Modulkonstante in eine Funktion, weil translate() die Uebersetzungen zur Renderzeit liest. Produkt- und Techniknamen bleiben unangetastet: MSK Core, Lua, ESX, QBCore, Exports, Event Handler. Impressum und Datenschutz hatten einen eigenen de/en-Umschalter mit localStorage, der die Locale von Docusaurus ignoriert hat. /de/impressum zeigte deshalb je nach Browsersprache trotzdem Englisch, und die Sprachwahl in der Navbar hatte dort keine Wirkung. Beide Fassungen bleiben im JSX, fuer seitenlangen Rechtstext ist das praktikabler als <Translate>, ausgewaehlt wird jetzt aber ueber i18n.currentLocale.
1 parent fa352a9 commit 5e2ed33

4 files changed

Lines changed: 305 additions & 189 deletions

File tree

i18n/de/code.json

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,5 +404,97 @@
404404
"notFound.browseDocs": {
405405
"message": "Zur Dokumentation",
406406
"description": "Label of the button leading to the docs on the 404 page"
407+
},
408+
"home.resource.ticketbot.description": {
409+
"message": "Ein Discord Ticket Bot, mit dem Spieler direkt aus Discord heraus Support-Tickets aufmachen.",
410+
"description": "Description of the Discord Ticketbot card on the homepage"
411+
},
412+
"home.resource.giveawaybot.description": {
413+
"message": "Ein Discord Giveaway Bot, mit dem du Gewinnspiele direkt aus Discord heraus veranstaltest.",
414+
"description": "Description of the Discord Giveawaybot card on the homepage"
415+
},
416+
"home.resource.core.description": {
417+
"message": "Unsere Kernbibliothek für alle Ressourcen, mit gemeinsamen Hilfsfunktionen und mehr.",
418+
"description": "Description of the MSK Core card on the homepage"
419+
},
420+
"home.resource.handcuffs.description": {
421+
"message": "Eine Handschellen-Ressource, mit der du Spieler fesselst, mit zahlreichen Optionen und Funktionen.",
422+
"description": "Description of the MSK Handcuffs card on the homepage"
423+
},
424+
"home.resource.vehiclekeys.description": {
425+
"message": "Eine Ressource für Fahrzeugschlüssel, mit der du Schlüssel verwaltest, mit zahlreichen Optionen und Funktionen.",
426+
"description": "Description of the MSK Vehiclekeys card on the homepage"
427+
},
428+
"home.resource.garage.description": {
429+
"message": "Ein vollwertiges Garagensystem, mit dem du abgestellte Fahrzeuge verwaltest und mehr.",
430+
"description": "Description of the MSK Garage card on the homepage"
431+
},
432+
"home.resource.enginetoggle.description": {
433+
"message": "Eine Ressource zum Ein- und Ausschalten des Motors, einfach und sparsam im Umgang mit dem Motorzustand.",
434+
"description": "Description of the MSK EngineToggle card on the homepage"
435+
},
436+
"home.resource.fuel.description": {
437+
"message": "Eine Ressource für den Tankinhalt, mit der du den Füllstand von Fahrzeugen verwaltest, mit zahlreichen Optionen und Funktionen.",
438+
"description": "Description of the MSK Fuel card on the homepage"
439+
},
440+
"home.feature.installation": {
441+
"message": "Installation",
442+
"description": "Tag on a homepage resource card"
443+
},
444+
"home.feature.configuration": {
445+
"message": "Konfiguration",
446+
"description": "Tag on a homepage resource card"
447+
},
448+
"home.feature.client": {
449+
"message": "Client",
450+
"description": "Tag on a homepage resource card"
451+
},
452+
"home.feature.shared": {
453+
"message": "Shared",
454+
"description": "Tag on a homepage resource card"
455+
},
456+
"home.feature.server": {
457+
"message": "Server",
458+
"description": "Tag on a homepage resource card"
459+
},
460+
"home.feature.events": {
461+
"message": "Events",
462+
"description": "Tag on a homepage resource card"
463+
},
464+
"home.feature.exports": {
465+
"message": "Exports",
466+
"description": "Tag on a homepage resource card"
467+
},
468+
"home.feature.eventHandler": {
469+
"message": "Event Handler",
470+
"description": "Tag on a homepage resource card"
471+
},
472+
"home.card.cta": {
473+
"message": "Loslegen →",
474+
"description": "Label of the button at the bottom of a homepage resource card"
475+
},
476+
"home.resources.title": {
477+
"message": "Ressourcen",
478+
"description": "Headline above the resource cards on the homepage"
479+
},
480+
"home.resources.subtitle": {
481+
"message": "Wähle eine Ressource, um ihre Dokumentation zu lesen.",
482+
"description": "Line below the headline above the resource cards on the homepage"
483+
},
484+
"home.help.title": {
485+
"message": "Brauchst du Hilfe?",
486+
"description": "Headline of the help banner at the bottom of the homepage"
487+
},
488+
"home.help.text": {
489+
"message": "Komm in den Discord von MSK Scripts, für Support, Neuigkeiten und den Austausch mit der Community.",
490+
"description": "Text of the help banner at the bottom of the homepage"
491+
},
492+
"home.help.discordButton": {
493+
"message": "Discord beitreten",
494+
"description": "Label of the Discord button in the homepage help banner"
495+
},
496+
"home.meta.description": {
497+
"message": "Dokumentation für die Ressourcen von MSK Scripts.",
498+
"description": "Meta description of the homepage"
407499
}
408500
}

src/pages/datenschutz.tsx

Lines changed: 7 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
import { useEffect, useState } from 'react';
1+
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
22
import Layout from '@theme/Layout';
33
import styles from './legal.module.css';
44

5-
const STORAGE_KEY = 'msk-docu-legal-lang';
6-
75
const content = {
86
de: {
97
title: 'Datenschutzerklärung',
@@ -532,46 +530,17 @@ const content = {
532530
};
533531

534532
export default function Datenschutz() {
535-
const [lang, setLang] = useState<'de' | 'en'>('en');
536-
537-
useEffect(() => {
538-
const stored =
539-
typeof window !== 'undefined' ? window.localStorage.getItem(STORAGE_KEY) : null;
540-
if (stored === 'de' || stored === 'en') {
541-
setLang(stored);
542-
return;
543-
}
544-
const browserLang =
545-
typeof navigator !== 'undefined' ? navigator.language?.toLowerCase() ?? '' : '';
546-
setLang(browserLang.startsWith('de') ? 'de' : 'en');
547-
}, []);
548-
549-
const handleChange = (value: 'de' | 'en') => {
550-
setLang(value);
551-
if (typeof window !== 'undefined') {
552-
window.localStorage.setItem(STORAGE_KEY, value);
553-
}
554-
};
555-
533+
// Die Seite folgt der Sprache der Website. Vorher hing sie an einem eigenen
534+
// Umschalter samt localStorage, der die Locale von Docusaurus ignorierte:
535+
// /de/ zeigte dann je nach Browser trotzdem Englisch, und die Sprachwahl in
536+
// der Navbar hatte hier keine Wirkung.
537+
const { i18n } = useDocusaurusContext();
538+
const lang: 'de' | 'en' = i18n.currentLocale === 'de' ? 'de' : 'en';
556539
const c = content[lang];
557540

558541
return (
559542
<Layout title={c.title}>
560543
<div className={styles.legalPage}>
561-
<div className={styles.langSwitcher}>
562-
<span className={styles.langLabel} aria-hidden="true">
563-
🌐
564-
</span>
565-
<select
566-
value={lang}
567-
onChange={(e) => handleChange(e.target.value as 'de' | 'en')}
568-
className={styles.langSelect}
569-
aria-label="Sprache wählen / Choose language"
570-
>
571-
<option value="de">🇩🇪 Deutsch</option>
572-
<option value="en">🇬🇧 English</option>
573-
</select>
574-
</div>
575544
<div className={styles.legalContent}>{c.sections}</div>
576545
</div>
577546
</Layout>

src/pages/impressum.tsx

Lines changed: 7 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
import { useEffect, useState } from 'react';
1+
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
22
import Layout from '@theme/Layout';
33
import styles from './legal.module.css';
44

5-
const STORAGE_KEY = 'msk-docu-legal-lang';
6-
75
const content = {
86
de: {
97
title: 'Impressum',
@@ -136,46 +134,17 @@ const content = {
136134
};
137135

138136
export default function Impressum() {
139-
const [lang, setLang] = useState<'de' | 'en'>('en');
140-
141-
useEffect(() => {
142-
const stored =
143-
typeof window !== 'undefined' ? window.localStorage.getItem(STORAGE_KEY) : null;
144-
if (stored === 'de' || stored === 'en') {
145-
setLang(stored);
146-
return;
147-
}
148-
const browserLang =
149-
typeof navigator !== 'undefined' ? navigator.language?.toLowerCase() ?? '' : '';
150-
setLang(browserLang.startsWith('de') ? 'de' : 'en');
151-
}, []);
152-
153-
const handleChange = (value: 'de' | 'en') => {
154-
setLang(value);
155-
if (typeof window !== 'undefined') {
156-
window.localStorage.setItem(STORAGE_KEY, value);
157-
}
158-
};
159-
137+
// Die Seite folgt der Sprache der Website. Vorher hing sie an einem eigenen
138+
// Umschalter samt localStorage, der die Locale von Docusaurus ignorierte:
139+
// /de/ zeigte dann je nach Browser trotzdem Englisch, und die Sprachwahl in
140+
// der Navbar hatte hier keine Wirkung.
141+
const { i18n } = useDocusaurusContext();
142+
const lang: 'de' | 'en' = i18n.currentLocale === 'de' ? 'de' : 'en';
160143
const c = content[lang];
161144

162145
return (
163146
<Layout title={c.title}>
164147
<div className={styles.legalPage}>
165-
<div className={styles.langSwitcher}>
166-
<span className={styles.langLabel} aria-hidden="true">
167-
🌐
168-
</span>
169-
<select
170-
value={lang}
171-
onChange={(e) => handleChange(e.target.value as 'de' | 'en')}
172-
className={styles.langSelect}
173-
aria-label="Sprache wählen / Choose language"
174-
>
175-
<option value="de">🇩🇪 Deutsch</option>
176-
<option value="en">🇬🇧 English</option>
177-
</select>
178-
</div>
179148
<div className={styles.legalContent}>{c.sections}</div>
180149
</div>
181150
</Layout>

0 commit comments

Comments
 (0)