Mehrsprachigkeit: Sprachumschalter in der Navigation (DE/CH/EN/FR/PT)

Neues i18n-System, komplett clientseitig (kein Build-Tool):
- main.js: I18N_CORE übersetzt Navigation, Fußzeile und Musik-Widget auf
  JEDER Seite (Markennamen wie DogFather/HasiDog/Casper/Team Dogi bleiben
  bewusst in jeder Sprache gleich). Sprachumschalter (Flagge + Kürzel) neu
  im Nav-Bar, per Klick wählbar, Wahl landet in localStorage und bleibt
  beim Klicken durch die Seite erhalten.
- Jeder komplett neue Besuch (kein gespeicherter Wert) startet IMMER auf
  Deutsch - keine automatische Browsersprache-Erkennung, wie gewünscht.
- assets/js/i18n-index.js: vollständiges Wörterbuch für die Startseite
  (Hero, Charaktere, Foto-Collage, Stats, "Was dich erwartet",
  Team-Vorschau, Aktionen, Galerie, Testimonial, finaler CTA) inkl. der
  dynamischen Live-Status-Texte.
- Schweizer Hochdeutsch (de-CH) korrekt mit ss statt ß angelegt (z.B.
  "Musik-Feld schliessen").
- Weitere Unterseiten (streamer.html, vanvan.html, ...) bekommen ihr
  eigenes Wörterbuch schrittweise in künftigen Runden - Navigation/
  Fußzeile/Musik-Widget sind aber schon jetzt überall mehrsprachig.
This commit is contained in:
2026-08-02 00:30:20 +02:00
parent ccba34a706
commit a758b9a6b4
4 changed files with 619 additions and 117 deletions
+255
View File
@@ -0,0 +1,255 @@
/* =====================================================================
i18n-index.js — Übersetzungs-Wörterbuch NUR für index.html
Wird von main.js (applyTranslations) über data-i18n="schluessel" auf
die passenden Elemente angewendet. Nur auf der Startseite eingebunden
— andere Seiten haben aktuell noch kein eigenes Wörterbuch und bleiben
bewusst auf Deutsch (Navigation/Fußzeile/Musik-Widget sind aber überall
mehrsprachig, siehe I18N_CORE in main.js).
Schweizer Hochdeutsch (de-CH) ist auf dieser Seite überall identisch zu
Deutsch (de) — keiner der Texte hier enthält ein ß.
===================================================================== */
window.I18N_PAGE = {
idx_hero_h1: {
de: "Streamer. Community. HasiDog. Manager.<br>Gemeinsam stark.",
"de-CH": "Streamer. Community. HasiDog. Manager.<br>Gemeinsam stark.",
en: "Streamer. Community. HasiDog. Manager.<br>Stronger together.",
fr: "Streamer. Communauté. HasiDog. Manager.<br>Plus forts ensemble.",
pt: "Streamer. Comunidade. HasiDog. Manager.<br>Mais fortes juntos.",
},
idx_hero_lead: {
de: "Drei Welten, eine Familie: Team Dogi.",
"de-CH": "Drei Welten, eine Familie: Team Dogi.",
en: "Three worlds, one family: Team Dogi.",
fr: "Trois mondes, une famille : Team Dogi.",
pt: "Três mundos, uma família: Team Dogi.",
},
idx_live_loading: {
de: "Status wird geladen …",
"de-CH": "Status wird geladen …",
en: "Loading status …",
fr: "Chargement du statut …",
pt: "Carregando status …",
},
idx_live_info: {
de: `DogFather geht <strong>jeden Tag ab 20 Uhr</strong> live — oft schon tagsüber, zu wechselnden Zeiten. <a href="streamplan.html">Streamplan ansehen →</a>`,
"de-CH": `DogFather geht <strong>jeden Tag ab 20 Uhr</strong> live — oft schon tagsüber, zu wechselnden Zeiten. <a href="streamplan.html">Streamplan ansehen →</a>`,
en: `DogFather goes live <strong>every day from 8 PM</strong> — often earlier too, at varying times. <a href="streamplan.html">View the schedule →</a>`,
fr: `DogFather est en live <strong>tous les jours à partir de 20h</strong> — souvent même plus tôt, à des horaires variables. <a href="streamplan.html">Voir le programme →</a>`,
pt: `DogFather fica ao vivo <strong>todos os dias a partir das 20h</strong> — muitas vezes já durante o dia, em horários variados. <a href="streamplan.html">Ver a programação →</a>`,
},
idx_hero_btn_links: {
de: "Alle Links 🩵", "de-CH": "Alle Links 🩵",
en: "All Links 🩵", fr: "Tous les liens 🩵", pt: "Todos os links 🩵",
},
idx_hero_btn_team: {
de: "Teil vom Team werden", "de-CH": "Teil vom Team werden",
en: "Join the team", fr: "Rejoindre l'équipe", pt: "Fazer parte da equipe",
},
idx_hero_card1_tag: { de: "Welt 1", "de-CH": "Welt 1", en: "World 1", fr: "Monde 1", pt: "Mundo 1" },
idx_hero_card1_desc: {
de: "Streamer, Entertainer, das Herz hinter dem Kanal. Halligalli, Humor und ein offenes Ohr für die Community.",
"de-CH": "Streamer, Entertainer, das Herz hinter dem Kanal. Halligalli, Humor und ein offenes Ohr für die Community.",
en: "Streamer, entertainer, the heart behind the channel. Good times, humor, and an open ear for the community.",
fr: "Streamer, entertainer, le cœur de la chaîne. Bonne humeur, humour et une oreille attentive pour la communauté.",
pt: "Streamer, entertainer, o coração por trás do canal. Diversão, humor e sempre um ouvido aberto para a comunidade.",
},
idx_hero_card2_tag: { de: "Welt 2", "de-CH": "Welt 2", en: "World 2", fr: "Monde 2", pt: "Mundo 2" },
idx_hero_card2_desc: {
de: "Die Community, das Maskottchen und Husky Casper — die verspielte, familiäre Seite von Team Dogi.",
"de-CH": "Die Community, das Maskottchen und Husky Casper — die verspielte, familiäre Seite von Team Dogi.",
en: "The community, the mascot, and Husky Casper — the playful, family side of Team Dogi.",
fr: "La communauté, la mascotte et le husky Casper — le côté joueur et familial de Team Dogi.",
pt: "A comunidade, o mascote e o husky Casper — o lado brincalhão e familiar do Team Dogi.",
},
idx_hero_card3_tag: { de: "Welt 3", "de-CH": "Welt 3", en: "World 3", fr: "Monde 3", pt: "Mundo 3" },
idx_hero_card3_desc: {
de: "Als Manager bei Spicy Media: Scouts, Creator und faire Zusammenarbeit auf Augenhöhe.",
"de-CH": "Als Manager bei Spicy Media: Scouts, Creator und faire Zusammenarbeit auf Augenhöhe.",
en: "As a manager at Spicy Media: scouts, creators, and fair collaboration at eye level.",
fr: "En tant que manager chez Spicy Media : scouts, creators et une collaboration équitable, d'égal à égal.",
pt: "Como manager na Spicy Media: scouts, creators e uma parceria justa entre iguais.",
},
idx_char_eyebrow: {
de: "🩵 Die Gesichter der Welten", "de-CH": "🩵 Die Gesichter der Welten",
en: "🩵 The Faces of the Worlds", fr: "🩵 Les visages des mondes", pt: "🩵 Os rostos dos mundos",
},
idx_char_lead: {
de: "Zwei Charaktere, ein Universum — klick dich in ihre Welt.",
"de-CH": "Zwei Charaktere, ein Universum — klick dich in ihre Welt.",
en: "Two characters, one universe — click your way into their world.",
fr: "Deux personnages, un seul univers — clique pour entrer dans leur monde.",
pt: "Dois personagens, um universo — clique e entre no mundo deles.",
},
idx_char1_sub: {
de: "Streamer · Entertainer · Welt 1", "de-CH": "Streamer · Entertainer · Welt 1",
en: "Streamer · Entertainer · World 1", fr: "Streamer · Entertainer · Monde 1", pt: "Streamer · Entertainer · Mundo 1",
},
idx_char2_sub: {
de: "Community · Maskottchen · Welt 2", "de-CH": "Community · Maskottchen · Welt 2",
en: "Community · Mascot · World 2", fr: "Communauté · Mascotte · Monde 2", pt: "Comunidade · Mascote · Mundo 2",
},
idx_char_go: {
de: "Zur Welt →", "de-CH": "Zur Welt →",
en: "Enter the world →", fr: "Découvrir le monde →", pt: "Ver o mundo →",
},
idx_collage_eyebrow: {
de: "🩵 Gesichter hinter dem Universum", "de-CH": "🩵 Gesichter hinter dem Universum",
en: "🩵 Faces Behind the Universe", fr: "🩵 Les visages derrière l'univers", pt: "🩵 Rostos por trás do universo",
},
idx_collage_cap_team: { de: "Team 🩵🐾", "de-CH": "Team 🩵🐾", en: "Team 🩵🐾", fr: "Équipe 🩵🐾", pt: "Equipe 🩵🐾" },
idx_collage_cap_huskylife: { de: "Husky-Life", "de-CH": "Husky-Life", en: "Husky Life", fr: "Vie de husky", pt: "Vida de husky" },
idx_collage_cap_nose: { de: "Nase an Nase 🩵", "de-CH": "Nase an Nase 🩵", en: "Nose to Nose 🩵", fr: "Nez à nez 🩵", pt: "Nariz a nariz 🩵" },
idx_collage_footer: {
de: "DogFather & Casper — die zwei Gesichter hinter dem ganzen Universum. 🩵🐾",
"de-CH": "DogFather & Casper — die zwei Gesichter hinter dem ganzen Universum. 🩵🐾",
en: "DogFather & Casper — the two faces behind the whole universe. 🩵🐾",
fr: "DogFather & Casper — les deux visages derrière tout l'univers. 🩵🐾",
pt: "DogFather & Casper — os dois rostos por trás de todo o universo. 🩵🐾",
},
idx_stats_team: {
de: "Menschen im Team Dogi", "de-CH": "Menschen im Team Dogi",
en: "People in Team Dogi", fr: "Personnes dans Team Dogi", pt: "Pessoas no Team Dogi",
},
idx_stats_daily_label: { de: "Täglich", "de-CH": "Täglich", en: "Daily", fr: "Chaque jour", pt: "Diariamente" },
idx_stats_daily_desc: {
de: "live ab 20 Uhr", "de-CH": "live ab 20 Uhr",
en: "live from 8 PM", fr: "en live dès 20h", pt: "ao vivo a partir das 20h",
},
idx_stats_worlds: {
de: "Welten, eine Familie", "de-CH": "Welten, eine Familie",
en: "worlds, one family", fr: "mondes, une famille", pt: "mundos, uma família",
},
idx_stats_family: {
de: "Team Dogi ist Familie", "de-CH": "Team Dogi ist Familie",
en: "Team Dogi is family", fr: "Team Dogi, c'est la famille", pt: "Team Dogi é família",
},
idx_expect_eyebrow: {
de: "Ein bisschen von allem", "de-CH": "Ein bisschen von allem",
en: "A little bit of everything", fr: "Un peu de tout", pt: "Um pouco de tudo",
},
idx_expect_h2: {
de: "Was dich im Universum erwartet", "de-CH": "Was dich im Universum erwartet",
en: "What awaits you in the universe", fr: "Ce qui t'attend dans l'univers", pt: "O que te espera no universo",
},
idx_expect_c1_h3: { de: "🎥 Streamer", "de-CH": "🎥 Streamer", en: "🎥 Streamer", fr: "🎥 Streamer", pt: "🎥 Streamer" },
idx_expect_c1_p: {
de: "Halligalli, Humor & Hasencontent.", "de-CH": "Halligalli, Humor & Hasencontent.",
en: "Good times, humor & bunny content.", fr: "Bonne humeur, humour et contenu de lapin.", pt: "Diversão, humor e conteúdo de coelho.",
},
idx_expect_c2_h3: { de: "🕰️ Zeitreise", "de-CH": "🕰️ Zeitreise", en: "🕰️ Timeline", fr: "🕰️ Chronologie", pt: "🕰️ Linha do tempo" },
idx_expect_c2_p: {
de: "Die Geschichte von DogFather & Team Dogi.", "de-CH": "Die Geschichte von DogFather & Team Dogi.",
en: "The story of DogFather & Team Dogi.", fr: "L'histoire de DogFather et de Team Dogi.", pt: "A história de DogFather e do Team Dogi.",
},
idx_expect_c3_h3: { de: "🩵 Community", "de-CH": "🩵 Community", en: "🩵 Community", fr: "🩵 Communauté", pt: "🩵 Comunidade" },
idx_expect_c3_p: {
de: "Team Dogi ist Familie.", "de-CH": "Team Dogi ist Familie.",
en: "Team Dogi is family.", fr: "Team Dogi, c'est la famille.", pt: "Team Dogi é família.",
},
idx_expect_c4_h3: { de: "🐾 Casper", "de-CH": "🐾 Casper", en: "🐾 Casper", fr: "🐾 Casper", pt: "🐾 Casper" },
idx_expect_c4_p: {
de: "Der Husky an DogFathers Seite.", "de-CH": "Der Husky an DogFathers Seite.",
en: "The husky by DogFather's side.", fr: "Le husky aux côtés de DogFather.", pt: "O husky ao lado de DogFather.",
},
idx_expect_c5_h3: { de: "🧑‍🤝‍🧑 Modi-Team", "de-CH": "🧑‍🤝‍🧑 Modi-Team", en: "🧑‍🤝‍🧑 Modi-Team", fr: "🧑‍🤝‍🧑 Modi-Team", pt: "🧑‍🤝‍🧑 Modi-Team" },
idx_expect_c5_p: {
de: "VanVan, Diene & Co.", "de-CH": "VanVan, Diene & Co.",
en: "VanVan, Diene & co.", fr: "VanVan, Diene et l'équipe.", pt: "VanVan, Diene e equipe.",
},
idx_expect_c6_h3: { de: "🖼️ Medien: DogFather", "de-CH": "🖼️ Medien: DogFather", en: "🖼️ Media: DogFather", fr: "🖼️ Médias : DogFather", pt: "🖼️ Mídia: DogFather" },
idx_expect_c7_h3: { de: "🐰 Medien: HasiDog", "de-CH": "🐰 Medien: HasiDog", en: "🐰 Media: HasiDog", fr: "🐰 Médias : HasiDog", pt: "🐰 Mídia: HasiDog" },
idx_expect_c8_h3: { de: "🐺 Medien: Casper", "de-CH": "🐺 Medien: Casper", en: "🐺 Media: Casper", fr: "🐺 Médias : Casper", pt: "🐺 Mídia: Casper" },
idx_expect_media_p: {
de: "Fotos, Videos & Events.", "de-CH": "Fotos, Videos & Events.",
en: "Photos, videos & events.", fr: "Photos, vidéos et événements.", pt: "Fotos, vídeos e eventos.",
},
idx_team_h2: { de: "Team Dogi 🩵", "de-CH": "Team Dogi 🩵", en: "Team Dogi 🩵", fr: "Team Dogi 🩵", pt: "Team Dogi 🩵" },
idx_team_lead: {
de: "Von VanVan bis zu den Scouts — die Menschen, die DOGFATHER UNIVERSE tragen.",
"de-CH": "Von VanVan bis zu den Scouts — die Menschen, die DOGFATHER UNIVERSE tragen.",
en: "From VanVan to the scouts — the people who carry DOGFATHER UNIVERSE.",
fr: "De VanVan aux scouts — les personnes qui portent DOGFATHER UNIVERSE.",
pt: "De VanVan aos scouts — as pessoas que sustentam o DOGFATHER UNIVERSE.",
},
idx_team_btn_modi: {
de: "Modi-Team ansehen", "de-CH": "Modi-Team ansehen",
en: "View Modi-Team", fr: "Voir l'équipe Modi", pt: "Ver equipe Modi",
},
idx_team_btn_scouts: {
de: "Scout-Team ansehen", "de-CH": "Scout-Team ansehen",
en: "View Scout Team", fr: "Voir l'équipe Scouts", pt: "Ver equipe Scouts",
},
idx_aktionen_h2: {
de: "Was gerade läuft", "de-CH": "Was gerade läuft",
en: "What's happening right now", fr: "Ce qui se passe en ce moment", pt: "O que está rolando agora",
},
idx_aktionen_btn: {
de: "Alle Aktionen & Projekte", "de-CH": "Alle Aktionen & Projekte",
en: "All actions & projects", fr: "Toutes les actions et projets", pt: "Todas as ações e projetos",
},
idx_galerie_h2: { de: "Impressionen", "de-CH": "Impressionen", en: "Impressions", fr: "Aperçus", pt: "Impressões" },
idx_galerie_btn: {
de: "Zur ganzen Galerie", "de-CH": "Zur ganzen Galerie",
en: "View the full gallery", fr: "Voir toute la galerie", pt: "Ver galeria completa",
},
idx_testimonial_eyebrow: {
de: "Was andere sagen", "de-CH": "Was andere sagen",
en: "What others say", fr: "Ce que les autres disent", pt: "O que os outros dizem",
},
idx_testimonial_quote: {
de: "„Hier stehen bald echte Stimmen aus der Community. 🩵“",
"de-CH": "„Hier stehen bald echte Stimmen aus der Community. 🩵“",
en: "“Real voices from the community will be here soon. 🩵”",
fr: "« De vrais témoignages de la communauté arriveront bientôt ici. 🩵 »",
pt: "“Em breve, depoimentos reais da comunidade estarão aqui. 🩵”",
},
idx_testimonial_attrib: {
de: "— Team Dogi", "de-CH": "— Team Dogi", en: "— Team Dogi", fr: "— Team Dogi", pt: "— Team Dogi",
},
idx_testimonial_btn: {
de: "Mehr Stimmen", "de-CH": "Mehr Stimmen",
en: "More voices", fr: "Plus de témoignages", pt: "Mais depoimentos",
},
idx_cta_eyebrow: { de: "🩵 Bereit?", "de-CH": "🩵 Bereit?", en: "🩵 Ready?", fr: "🩵 Prêt·e ?", pt: "🩵 Pronto?" },
idx_cta_h2: {
de: "Werde Teil von DOGFATHER UNIVERSE", "de-CH": "Werde Teil von DOGFATHER UNIVERSE",
en: "Become part of DOGFATHER UNIVERSE", fr: "Rejoins DOGFATHER UNIVERSE", pt: "Faça parte do DOGFATHER UNIVERSE",
},
idx_cta_lead: {
de: "Als Zuschauer:in, Creator, Scout oder Kooperationspartner — hier ist für jeden Platz.",
"de-CH": "Als Zuschauer:in, Creator, Scout oder Kooperationspartner — hier ist für jeden Platz.",
en: "As a viewer, creator, scout, or cooperation partner — there's room for everyone here.",
fr: "Que tu sois spectateur·rice, creator, scout ou partenaire — il y a une place pour toi ici.",
pt: "Como espectador(a), creator, scout ou parceiro(a) — aqui há espaço para todos.",
},
idx_cta_btn_links: {
de: "Alle Links 🩵", "de-CH": "Alle Links 🩵",
en: "All Links 🩵", fr: "Tous les liens 🩵", pt: "Todos os links 🩵",
},
idx_cta_btn_bewerben: {
de: "Jetzt bewerben", "de-CH": "Jetzt bewerben",
en: "Apply now", fr: "Postuler maintenant", pt: "Candidate-se agora",
},
/* Live-Status (wird von index.html per JS gesetzt, siehe dortiges
Inline-Skript — Schlüssel hier nur zentral gepflegt) */
idx_live_now: {
de: "Jetzt live: {titel}", "de-CH": "Jetzt live: {titel}",
en: "Live now: {titel}", fr: "En direct : {titel}", pt: "Ao vivo agora: {titel}",
},
idx_live_now_generic: {
de: "Jetzt live!", "de-CH": "Jetzt live!",
en: "Live now!", fr: "En direct !", pt: "Ao vivo agora!",
},
idx_live_offline: {
de: "Gerade offline", "de-CH": "Gerade offline",
en: "Currently offline", fr: "Actuellement hors ligne", pt: "Offline no momento",
},
idx_live_error: {
de: "Status gerade nicht abrufbar", "de-CH": "Status gerade nicht abrufbar",
en: "Status currently unavailable", fr: "Statut actuellement indisponible", pt: "Status indisponível no momento",
},
};