diff --git a/app/components/AppBar.tsx b/app/components/AppBar.tsx index 6640dd4..569083b 100644 --- a/app/components/AppBar.tsx +++ b/app/components/AppBar.tsx @@ -13,6 +13,7 @@ import MenuIcon from "@mui/icons-material/Menu"; import CloseRoundedIcon from "@mui/icons-material/CloseRounded"; import TranslateIcon from "@mui/icons-material/Translate"; import ColorModeIconDropdown from "../shared-theme/ColorModeIconDropdown.tsx"; +import LocaleIconDropdown from "../shared-theme/LocaleIconDropdown.tsx"; import Icon from "./Icon.tsx"; import ExternalLinkButton from "./ExternalLinkButton.tsx"; import { ADMIN_LOGIN_URL, MEMBERSHIP_CARD_URL } from "../config.ts"; @@ -35,8 +36,8 @@ const StyledToolbar = styled(Toolbar)(({ theme }) => ({ padding: "8px 12px", })); -const LANGUAGE_LABELS: Record = { en: "EN", zh: "中文" }; -const LANGUAGE_TOGGLE: Record = { en: "zh", zh: "en" }; +const LANGUAGE_LABELS: Record = { en: "EN", zh: "中文", de: "DE" }; +const LANGUAGE_TOGGLE: Record = { en: "zh", zh: "en", de: "de" }; export default function AppAppBar() { const [open, setOpen] = React.useState(false); @@ -91,9 +92,7 @@ export default function AppAppBar() { {nav.adminLogin} - - - + @@ -142,4 +141,4 @@ export default function AppAppBar() { ); -} +} \ No newline at end of file diff --git a/app/locales/de.ts b/app/locales/de.ts new file mode 100644 index 0000000..98fe152 --- /dev/null +++ b/app/locales/de.ts @@ -0,0 +1,183 @@ +import type { Locale } from "./types.ts"; + +export const de: Locale = { + meta: { + title: "ACSSZ", + description: + "Vereinigung chinesischer Studierender und Wissenschaftler in Zürich (ACSSZ), gegründet in den 1980er Jahren – eine fürsorgende Gemeinschaft lokaler Studierender und Wissenschaftler.", + }, + nav: { + usefulInfo: "Nützliche Informationen", + eventNotification: "Veranstaltungen", + businessCooperation: "Kooperationen", + membershipCard: "Mitgliedskarte", + departments: "Abteilungen", + aboutUs: "Über uns", + adminLogin: "Admin-Login", + eventReview: "Veranstaltungsrückblick", + }, + hero: { + slides: new Map([ + ["Folie 1", "media/slider_food.jpeg"], + ["Folie 2", "media/slider_erhu.jpeg"], + ["Folie 3", "media/slider_hanfu.jpg"], + ["Folie 4", "media/slider-china.jpg"], + ["Folie 5", "media/slider_music.jpg"], + ]), + }, + events: { + title: "Veranstaltungen", + description: + "Die ACSSZ organisiert das ganze Jahr über verschiedene Veranstaltungen, um das Gemeinschaftsleben, den kulturellen Austausch und die berufliche Entwicklung zu fördern. Von Karriere-Einblicken bis hin zu Kulturgesprächen – wir schaffen eine Plattform für Studierende und Wissenschaftler zum Vernetzen und Wachsen.", + items: [ + { + name: "Karriere-Einblicke 2025 – Jobsuche und Aufenthaltsbewilligung in der Schweiz", + event: "Suchen Sie derzeit in der Schweiz eine Stelle und stehen vor Herausforderungen? Wie erhalten Sie eine Arbeitsbewilligung und können in der Schweiz bleiben? Wie optimieren Sie Ihren Lebenslauf und bereiten sich effektiv auf Vorstellungsgespräche vor?", + image: "media/Career_Insights.webp", + }, + { + name: "Global Village – Vielfalt erleben", + event: '🌏✨ Heute haben wir gemeinsam mit AIESEC Zürich am „Global Village – Vielfalt erleben" im Lichthof der Universität Zürich teilgenommen! Unser Team teilte chinesische Kultur – Gäste probierten Hanfu an, übten Kalligraphie und bereiteten Bubble Tea zu 🍵✍️💫', + image: "media/Global_Village.webp", + }, + { + name: "Chinesisch-Schweizerischer Kulturaustausch 2020", + event: "Anfang 2020 organisierten die Switzerland-China Bridge Association und die Zürcher Studierendenvereinigung gemeinsam einen chinesisch-schweizerischen Kulturaustausch mit den Schweizer Musikern Jason Huster, Anton Zemp und ihren Freunden.", + image: "media/Culture_Talk.jpg", + }, + { + name: "You are My Destiny | 520 Kennenlernen", + event: "Am 520 – komm und lern neue Leute kennen, verabschiede dich vom Single-Dasein!", + image: "media/Making_Friends.webp", + }, + { + name: "Demnächst mehr...", + event: "Weitere Veranstaltungen folgen in Kürze!", + image: "favicon.ico", + }, + { + name: "Demnächst mehr...", + event: "Weitere Veranstaltungen folgen in Kürze!", + image: "favicon.ico", + }, + ], + }, + departments: { + title: "Abteilungen", + description: "Willkommen bei der ACSSZ!", + items: [ + { + title: "Sekretariat", + description: + "Unterstützt das Präsidium und alle anderen Abteilungen, pflegt geordnete Datei- und E-Mail-Systeme und koordiniert Sitzungen inkl. Protokollführung, verwaltet das Cloud-Laufwerk, stellt Mitgliedschaftsnachweise aus, pflegt das Zürcher Erstsemester-Handbuch und organisiert Online-Infoveranstaltungen für Neustudierende.", + }, + { + title: "Abteilung für Öffentlichkeitsarbeit", + description: + "Vertritt die ACSSZ beim Aufbau und der Pflege externer Beziehungen. Hauptaufgaben: Unterstützung bei Notfällen (z. B. Diskriminierung, Sicherheitsvorfälle, Betrugswarnung), Aufbau von Unternehmensbeziehungen für Studentenrabatte (Partner: Sunrise YOL, Swisscare, JC Insurance Brokers u. a.) sowie Zusammenarbeit mit der Stadt Zürich, ETH/UZH-Studierendenverbänden und anderen Organisationen.", + }, + { + title: "Unternehmensabteilung", + description: + "Fördert die Verbindung zwischen Studierenden und Unternehmen. Hauptaufgaben: Organisation von Kooperationsprojekten, Verhandlungen mit chinesischen Unternehmen (z. B. Bank of China, Huawei, Xiaomi, Ctrip), Organisation von Firmenpräsentationen und Jobmessen sowie Aufbau nachhaltiger Unternehmensbeziehungen für Praktika und Beschäftigungsmöglichkeiten.", + }, + { + title: "Kultur- & Sportabteilung", + description: + "Zuständig für die Organisation von Kultur-, Sport- und Freizeitveranstaltungen, darunter Kulturaufführungen, Festivals, Kunstausstellungen, Sportwettkämpfe, Partys und Spieleabende sowie die Koordination mit verschiedenen Kultur- und Sportorganisationen.", + }, + { + title: "Öffentlichkeitsabteilung", + description: + "Das öffentliche Gesicht der ACSSZ. Von Texten bis Grafikdesign, von WeChat-Promotion bis zur Pflege von Social-Media-Kanälen – verantwortlich für den offiziellen WeChat-Account, Xiaohongshu und Bilibili, Veranstaltungspromotion sowie Poster- und Videogestaltung.", + }, + { + title: "IT-Abteilung", + description: + "Pflegt und entwickelt die ACSSZ-Mitgliedskarten-App, das Forum, die Website, das Erstsemester-Handbuch und den Cloud-Speicher. Aufgaben umfassen digitale Archivierung, technischen Support, Rechteverwaltung, Tool-Evaluierung und die Organisation von Tech-Sharing-Veranstaltungen.", + }, + ], + }, + manual: { + title: "Nützliche Informationen", + subtitle: "Handbuch für Erstsemester (Ausgabe 2025)", + }, + about: { + title: "Über uns", + paragraphs: [ + "Die Vereinigung chinesischer Studierender und Wissenschaftler in Zürich (ACSSZ) wurde Mitte der 1980er Jahre gegründet. Sie vertritt die Interessen aller chinesischen Studierenden und Wissenschaftler in Zürich. Anfang 2023 studierten über 2.000 chinesische Studierende in Zürich, mit rund 400 Neuzugängen pro Jahr.", + "Derzeit (2026) zählt die ACSSZ rund 100 Mitarbeitende in der Öffentlichkeits-, Aktivitäts-, Unternehmens-, PR- und IT-Abteilung sowie im Sekretariat und Präsidium.", + "Wir arbeiten mit Verantwortungsbewusstsein und Engagement in vier Bereichen: Studierendenwohlfahrt, Kulturaustausch, Freizeitaktivitäten und akademischer Austausch.", + 'Im Bereich Wohlfahrt bieten wir das „Erstsemester-Handbuch" als umfassenden Ratgeber für den Übergang von China in die Schweiz an. Vor jedem Herbstsemester organisieren wir eine Willkommensveranstaltung mit über 300 Teilnehmenden sowie Vorteile wie Swisscare-Versicherungsrabatte und günstige Sunrise YOL SIM-Karten.', + 'Im Bereich Kultur haben wir in den letzten zwei Jahren Großveranstaltungen wie „China Garden" und „China Day" organisiert – offen für alle, unabhängig von Sprache und Nationalität.', + 'Im Bereich Aktivitäten organisieren wir jährlich Veranstaltungen wie das „Frühlingsfest-Sportturnier", die „Laternenfest-Teeparty" und den „Sängerwettbewerb" – offen für alle Studierenden.', + 'Im akademischen Bereich organisiert unser Partner, der „Zürcher Chinesische Wissenschaftsclub", monatliche Vorträge zu Wissen und Forschung aus verschiedenen Fachgebieten.', + ], + imagePlaceholder: "Bild hier einfügen", + team: [ + { + name: "Präsidium", + members: [ + { role: "Präsident", names: ["HOU Jiale"] }, + { role: "Vizepräsident", names: ["XU Sijie", "YU Zhihe"] }, + { role: "Generalsekretär", names: ["ZHAO Yifei"] }, + { role: "Finanzen", names: ["SUN Xue"] }, + { role: "Schatzmeister", names: ["CHEN Yiyang"] }, + ], + }, + { + name: "Sekretariat", + members: [ + { role: "Leiter", names: ["GAO Xing"] }, + { role: "Stellvertretender Leiter", names: [] }, + ], + }, + { + name: "Öffentlichkeitsarbeit", + members: [ + { role: "Leiter", names: ["JIA Weimeng"] }, + { role: "Stellvertretender Leiter", names: ["LIU Qiao"] }, + { role: "Berater", names: ["QU Di"] }, + ], + }, + { + name: "Unternehmen", + members: [ + { role: "Leiter", names: ["ZHANG Dingyuan"] }, + { role: "Stellvertretender Leiter", names: ["CHEN Yuyang"] }, + { role: "Berater", names: ["LI Xu Wenjia"] }, + ], + }, + { + name: "Kultur & Sport", + members: [ + { role: "Leiter", names: ["JIA Chu"] }, + { role: "Stellvertretender Leiter", names: ["LIU Runpu"] }, + { role: "Berater", names: ["XU Yizhen", "JIANG Wenyi"] }, + ], + }, + { + name: "Öffentlichkeit", + members: [ + { role: "Leiter", names: ["ZHANG Xindi"] }, + { role: "Stellvertretender Leiter", names: ["HUANG Sice"] }, + { role: "Berater", names: ["JIANG Anyu"] }, + ], + }, + { + name: "IT", + members: [ + { role: "Leiter", names: ["LIU Zisen"] }, + { role: "Stellvertretender Leiter", names: ["SHANG Haoliang"] }, + { role: "Berater", names: ["ZHANG Zhuo", "GU Jian"] }, + ], + }, + ], + }, + logoCollection: { + title: "Unsere Kooperationspartner", + }, + footer: { + title: "Kontakt", + }, +}; \ No newline at end of file diff --git a/app/locales/index.ts b/app/locales/index.ts index 7f82a4f..9757d5f 100644 --- a/app/locales/index.ts +++ b/app/locales/index.ts @@ -1,10 +1,11 @@ import { en } from "./en.ts"; import { zh } from "./zh.ts"; +import { de } from "./de.ts"; import type { Locale } from "./types.ts"; -export type LocaleKey = "en" | "zh"; +export type LocaleKey = "en" | "zh" | "de"; -export const locales: Record = { en, zh }; +export const locales: Record = { en, zh, de }; export function getLocale(key: LocaleKey): Locale { return locales[key]; diff --git a/app/shared-theme/LocaleIconDropdown.tsx b/app/shared-theme/LocaleIconDropdown.tsx new file mode 100644 index 0000000..62f5857 --- /dev/null +++ b/app/shared-theme/LocaleIconDropdown.tsx @@ -0,0 +1,67 @@ +import * as React from "react"; +import TranslateIcon from "@mui/icons-material/Translate"; +import IconButton, { IconButtonOwnProps } from "@mui/material/IconButton"; +import Menu from "@mui/material/Menu"; +import MenuItem from "@mui/material/MenuItem"; +import { useLocale } from "../context/LocaleContext.tsx"; +import type { LocaleKey } from "../locales/index.ts"; + +export default function LocaleIconDropdown(props: IconButtonOwnProps) { + const {localeKey, setLocaleKey} = useLocale(); + const [anchorEl, setAnchorEl] = React.useState(null); + const open = Boolean(anchorEl); + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + const handleClose = () => { + setAnchorEl(null); + }; + const handleLocale = (targetMode: LocaleKey) => () => { + setLocaleKey(targetMode); + handleClose(); + }; + return ( + + + + + + + 中文 + + + English + + + Deutsch + + + + ); +} \ No newline at end of file