diff --git a/next-i18next.config.js b/next-i18next.config.js index 8400cb5d8..64ef775af 100644 --- a/next-i18next.config.js +++ b/next-i18next.config.js @@ -3,7 +3,19 @@ const path = require("path"); module.exports = { i18n: { defaultLocale: "en", - locales: ["en", "es", "de", "fr", "it", "ko", "sv", "pt", "pt-BR"], + locales: [ + "en", + "es", + "de", + "fr", + "it", + "ko", + "sv", + "pt", + "pt-BR", + "hu", + "zh", + ], localePath: path.resolve("./public/locales"), reloadOnPrerender: process.env.NODE_ENV === "development", }, diff --git a/public/locales/en/common.json b/public/locales/en/common.json index 7ae2b7c3e..97fb5a642 100644 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -2,23 +2,14 @@ "blog": "Blog", "discussions": "Discussions", "donate": "Donate", - "english": "English", "footerCredit": "Made by @imlukevella", "footerSponsor": "This project is user-funded. Please consider supporting it by donating.", - "french": "French", - "german": "German", "home": "Home", - "italian": "Italian", - "korean": "Korean", "language": "Language", "links": "Links", - "portuguese": "Portuguese", - "portugueseBr": "Portuguese (Brazil)", "poweredBy": "Powered by", "privacyPolicy": "Privacy Policy", - "spanish": "Spanish", "starOnGithub": "Star us on Github", "support": "Support", - "swedish": "Swedish", "volunteerTranslator": "Help translate this site" } diff --git a/public/locales/hu/app.json b/public/locales/hu/app.json new file mode 100644 index 000000000..859d6de9f --- /dev/null +++ b/public/locales/hu/app.json @@ -0,0 +1,131 @@ +{ + "12h": "12 órás", + "24h": "24 órás", + "addParticipant": "Résztvevő hozzáadása", + "addTimeOption": "Időpont hozzáadása", + "alreadyVoted": "Már szavaztál", + "applyToAllDates": "Beállítás minden dátumhoz", + "areYouSure": "Biztos vagy benne?", + "back": "Vissza", + "calendarHelp": "Nem hozhatsz létre szavazás lehetőségek nélkül. Legalább egy lehetőséget adj meg a folytatáshoz.", + "calendarHelpTitle": "Elfelejtettél valamit?", + "cancel": "Mégse", + "comment": "Hozzászólás", + "commentPlaceholder": "Írj hozzászólást ehhez a szavazáshoz (mindenki láthatja)", + "comments": "Hozzászólások", + "continue": "Tovább", + "copied": "Másolva", + "copyLink": "Link másolása", + "createdBy": "{{name}} által", + "createPoll": "Szavazás létrehozása", + "creatingDemo": "Demo szavazás létrehozása…", + "delete": "Törlés", + "deleteComment": "Hozzászólás törlése", + "deleteDate": "Dátum törlése", + "deletedPoll": "Szavazás törlése", + "deletedPollInfo": "Ez a szavazás már nem létezik.", + "deletePoll": "Szavazás törlése", + "deletePollDescription": "Minden a szavazáshoz kötődő adatot törölni fogunk. Megerősítésként gépeld be “{{confirmText}}” szöveget az alábbi mezőbe:", + "deletingOptionsWarning": "Olyan lehetőséget töröldsz, amire résztvevők már szavaztak. Az ő szavazataik is törlődni fognak.", + "demoPollNotice": "Demó szavazások egy nap után automatikusan törlődnek", + "description": "Leírás", + "descriptionPlaceholder": "Helló mindenki, kérlek válasszátok ki a nektek megfelelő dátumokat!", + "donate": "Támogatás", + "edit": "Szerkeszt", + "editDetails": "Részletek szerkesztése", + "editOptions": "Lehetőségek szerkesztése", + "email": "Email", + "emailPlaceholder": "kovacs.anna@email.com", + "endingGuestSessionNotice": "Egy munkamenet befejezése nem visszavonható. Ezután nem leszel képes szerkeszteni a válaszaid vagy hozzászólásaidat, amiket ezzel a munkamenettel készítettél.", + "endSession": "Munkamenet befejezése", + "errorCreate": "Uha! Probléma történt a szavazás létrehozásakor. A hibát rögzítettük és megpróbáljuk javítani.", + "exportToCsv": "Exportálás CSV fáljba", + "finish": "Befejezés", + "forgetMe": "Felejts el", + "goToAdmin": "Irány az admin felület", + "guest": "Vendég", + "guestSessionNotice": "Vendég munkamenetet használsz. Ez teszi lehetővé, hogy felismerjünk téged később is, amikor visszatérsz, hogy szerkeszd a válaszaid.", + "guestSessionReadMore": "Olvass többet a vendég munkamenetekről.", + "hide": "Elrejt", + "ifNeedBe": "Ha szükséges", + "linkHasExpired": "A link lejárt vagy nem elérhető többé", + "loading": "Betöltés…", + "loadingParticipants": "Résztvevők betöltése…", + "location": "Helyszín", + "locationPlaceholder": "János kávézója", + "lockPoll": "Szavazás lezárása", + "login": "Bejelentkezés", + "loginCheckInbox": "Kérjük, ellenőrizd a postaládáját.", + "loginMagicLinkSent": "Egy varázs linket küldtünk ide:", + "loginSendMagicLink": "Küldj nekem egy varázs linket", + "loginViaMagicLink": "Bejelentkezés varázs linken keresztül", + "loginViaMagicLinkDescription": "Küldünk neked egy emailt egy varázs linkkel, amivel be tudsz jelentkezni.", + "loginWithValidEmail": "Kérjük, adj meg egy érvényes e-mail címet", + "logout": "Kijelentkezés", + "manage": "Kezelés", + "menu": "Menü", + "mixedOptionsDescription": "Egyszerre nem lehet időpont és dátum szerinti lehetőség a szavazásban. Melyiket szeretnéd megtartani?", + "mixedOptionsKeepDates": "Dátum lehetőségek megtartása", + "mixedOptionsKeepTimes": "Időpont lehetőségek megtartása", + "mixedOptionsTitle": "Kárjük várj egy percet... 🤔", + "monday": "Hétfő", + "monthView": "Havi nézet", + "name": "Név", + "namePlaceholder": "Kovács Anna", + "new": "Új", + "newPoll": "Új szavazás", + "next": "Következő", + "nextMonth": "Következő hónap", + "no": "Nem", + "noDatesSelected": "Nincs dátum kiválasztva", + "notificationsDisabled": "Értesítések ki lettek kapcsolva", + "notificationsOff": "Értesítések kikapcsolva", + "notificationsOn": "Értesítések bekapcsolva", + "notificationsOnDescription": "Emailt küldünk {{email}} email címre, ha bármi szavazáshoz kötődő tevékenység történik.", + "notificationsVerifyEmail": "Hitelesítened kell az email címed az értesítések bekapcsolásához", + "noVotes": "Senki sem szavazott erre a lehetóségre", + "ok": "Ok", + "options": "Lehetőségek", + "participant": "Résztvevő", + "participantCount_other": "{{count}} résztvevő", + "participantCount": "{{count}} résztvevő", + "pollHasBeenLocked": "A szavazás le lett zárva", + "pollHasBeenVerified": "A szavazásod hitelesítve lett", + "pollOwnerNotice": "Szia {{name}}, úgy tűnik, hogy te vagy ennek a szavazásnak a tulajdonosa.", + "pollsEmpty": "Nincs létrehozott szavazás", + "possibleAnswers": "Lehetséges válaszok", + "preferences": "Beállítások", + "previousMonth": "Előző hónap", + "profileLogin": "Profil - Bejelentkezés", + "profileUser": "Profil - {{username}}", + "requiredNameError": "Név megadása kötelező", + "save": "Mentés", + "saveInstruction": "Válaszd ki mikor érsz rá és kattints a {{save}} gombra", + "share": "Megosztás", + "shareDescription": "Küldd el ezt a linket a résztvevőidnek, hogy tudjanak szavazatokat leadni.", + "shareLink": "Megosztás linkkel", + "specifyTimes": "Időpontok megadása", + "specifyTimesDescription": "Adj meg kezdő és záró időpontot minde lehetőséghez", + "stepSummary": "{{current}} a {{total}}-ból", + "sunday": "Vasárnap", + "timeAndDate": "Idő és dátum", + "timeFormat": "Időformátum:", + "timeZone": "Időzóna:", + "title": "Cím", + "titlePlaceholder": "Havi találkozó", + "today": "Ma", + "unlockPoll": "Szavazás feloldása", + "unverifiedMessage": "Egy emailt küldtünk {{email}} címedre egy linkkel, amivel hitelesítheted az email címed.", + "user": "Felhasználó", + "vote": "Szavazat", + "voteCount_other": "{{count}} szavazat", + "voteCount": "{{count}} szavazat", + "weekStartsOn": "Hét kezdőnapja", + "weekView": "Heti nézet", + "whatsThis": "Mi ez?", + "yes": "Igen", + "you": "Te", + "yourDetails": "Adataid", + "yourName": "Neved…", + "yourPolls": "Szavazásaid" +} diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json new file mode 100644 index 000000000..0f6389617 --- /dev/null +++ b/public/locales/hu/common.json @@ -0,0 +1,24 @@ +{ + "blog": "Blog", + "discussions": "Beszélgetések", + "donate": "Támogatás", + "english": "Angol", + "footerCredit": "Készítette @imlukevella", + "footerSponsor": "Ezt a projektet a felhasználók finanszírozzák. Kérem gondold meg, hogy adományoddal támogatsz-e minket.", + "french": "Francia", + "german": "Német", + "home": "Főoldal", + "italian": "Olasz", + "korean": "Koreai", + "language": "Nyelv", + "links": "Linkek", + "portuguese": "Portugál", + "portugueseBr": "Portugál (Brazíliai)", + "poweredBy": "Biztosítja a", + "privacyPolicy": "Adatvédelmi irányelvek", + "spanish": "Spanyol", + "starOnGithub": "Csillagozz be GitHub-on", + "support": "Támogatás", + "swedish": "Svéd", + "volunteerTranslator": "Segíts lefordítani ezt az oldalt" +} diff --git a/public/locales/hu/errors.json b/public/locales/hu/errors.json new file mode 100644 index 000000000..8d2f36697 --- /dev/null +++ b/public/locales/hu/errors.json @@ -0,0 +1,6 @@ +{ + "notFoundTitle": "404 az oldal nem található", + "notFoundDescription": "Nem található az oldal, amit keresel.", + "goToHome": "Irány a főoldal", + "startChat": "Csevegés indítása" +} diff --git a/public/locales/hu/homepage.json b/public/locales/hu/homepage.json new file mode 100644 index 000000000..9da5fbc7e --- /dev/null +++ b/public/locales/hu/homepage.json @@ -0,0 +1,36 @@ +{ + "3Ls": "Igen, 3 L-el", + "adFree": "Reklámmentes", + "adFreeDescription": "Adhatsz egy kis pihenőt a reklám blokkolódnak - It nem lesz rá szükséged.", + "comments": "Hozzászólások", + "commentsDescription": "A résztvevők hozzászólhatnak a szavazásodhoz és azok minden résztvevő számára láthatóak.", + "features": "Funkciók", + "featuresSubheading": "Ütemezés, az okos út", + "follow": "Kövess minket", + "getStarted": "Kezdjünk bele", + "heroSubText": "Találd meg a megfelelő időpontot oda-vissza nélkül", + "heroText": "Ütemezz
találkozókat
könnyen", + "links": "Linkek", + "liveDemo": "Élő demó", + "metaDescription": "Hozz létre szavazásokat és szavazz, hogy megtaláld a legjobb napot vagy időt. Egy ingyenes Doodle alternatíva.", + "metaTitle": "Rallly - Ütemezz találkozókat", + "mobileFriendly": "Telefonon is használható", + "mobileFriendlyDescription": "Telefonon is jól működik, így a résztvevők bárhonnan kitölthetik a szavazásod.", + "new": "Új", + "noLoginRequired": "Bejelentkezés nem szükséges", + "noLoginRequiredDescription": "Nem kell bejelentkezz szavazások létrehozásához vagy a részvételéhez", + "notifications": "Értesítések", + "notificationsDescription": "Kövesd, hogy ki válaszolt. Értesítéseket kapsz, ha egy résztvevő szavaz vagy hozzászól a szavazásodhoz.", + "openSource": "Nyílt forráskódú", + "openSourceDescription": "A forráskód teljesen nyílt forráskódú és elérhető GitHub-on.", + "participant": "Résztvevő", + "participantCount_other": "{{count}} résztvevő", + "participantCount": "{{count}} résztvevő", + "perfect": "Tökéletes!", + "principles": "Alapelveink", + "principlesSubheading": "Mások vagyok, mint a többiek", + "selfHostable": "Önállóan futtatható", + "selfHostableDescription": "Futtathatos a saját szervereden magad kezelve minden adatod", + "timeSlots": "Idősávok", + "timeSlotsDescription": "Állíts be egyedi kezdő és befejező időpontokat minden válaszlehetőséghez. Az időpontok automatikusan igazodnak minden egyes résztvevő időzónájához vagy beállítható, hogy az időzónákat ne vegye figyelembe." +} diff --git a/public/locales/zh/app.json b/public/locales/zh/app.json new file mode 100644 index 000000000..f98f27377 --- /dev/null +++ b/public/locales/zh/app.json @@ -0,0 +1,131 @@ +{ + "12h": "12 小时", + "24h": "24 小时", + "addParticipant": "添加参与者", + "addTimeOption": "新增时间选择", + "alreadyVoted": "你已经投票", + "applyToAllDates": "适用于所有日期", + "areYouSure": "确定要这样做吗?", + "back": "返回", + "calendarHelp": "你不能在没有任何选项的情况下创建投票。至少添加一个选项以继续。", + "calendarHelpTitle": "忘记了一些东西?", + "cancel": "取消", + "comment": "评论", + "commentPlaceholder": "在这次投票上留下评论 (每个人都能看见)", + "comments": "评论", + "continue": "继续", + "copied": "已复制", + "copyLink": "复制链接", + "createdBy": "由 {{name}} 发起", + "createPoll": "创建投票", + "creatingDemo": "正在创建投票演示…", + "delete": "删除", + "deleteComment": "删除评论", + "deleteDate": "删除日期", + "deletedPoll": "已删除投票", + "deletedPollInfo": "这个投票已经不存在。", + "deletePoll": "删除投票", + "deletePollDescription": "此投票相关的所有数据将会被删除。如果确定,请在下面的输入框中输入 “{{confirmText}}” :", + "deletingOptionsWarning": "你正在删除参与者赞成的选项。他们的投票也会被删除。", + "demoPollNotice": "投票演示会在 1 天后自动删除", + "description": "描述", + "descriptionPlaceholder": "嘿,请选择一个合适的日期!", + "donate": "捐助", + "edit": "编辑", + "editDetails": "编辑详细信息", + "editOptions": "编辑选项", + "email": "邮箱", + "emailPlaceholder": "jessi.smith@email.com", + "endingGuestSessionNotice": "访客会话结束后无法恢复。你将无法编辑你在会话中的任何投票或评论。", + "endSession": "结束会话", + "errorCreate": "哎呀!你的投票创建时出现了一个问题。错误已被记录,我们会尝试修复它。", + "exportToCsv": "导出为 CSV文件", + "finish": "已完成", + "forgetMe": "忘记我", + "goToAdmin": "登录到管理员", + "guest": "访客", + "guestSessionNotice": "你正在使用访客会话。如果你稍后再回来编辑投票,我们也能识别你。", + "guestSessionReadMore": "了解更多关于访客会话的信息。", + "hide": "隐藏", + "ifNeedBe": "如果需要的话", + "linkHasExpired": "你的链接已过期且不再有效。", + "loading": "正在加载…", + "loadingParticipants": "正在加载参与者…", + "location": "地点", + "locationPlaceholder": "Joe 的咖啡店", + "lockPoll": "锁定投票", + "login": "登录", + "loginCheckInbox": "请检查你的收件箱。", + "loginMagicLinkSent": "魔法链接已发送至:", + "loginSendMagicLink": "发送我的魔术链接", + "loginViaMagicLink": "通过魔术链接登录", + "loginViaMagicLinkDescription": "我们将向你发送一封含有魔术链接的电子邮件,你可以用来登录。", + "loginWithValidEmail": "请输入正确的邮箱地址", + "logout": "退出", + "manage": "管理", + "menu": "菜单", + "mixedOptionsDescription": "你不能在同一个投票中同时拥有时间和日期选项。你想保留哪个?", + "mixedOptionsKeepDates": "保留日期选项", + "mixedOptionsKeepTimes": "保留时间选项", + "mixedOptionsTitle": "稍等一会儿…🤔", + "monday": "星期一", + "monthView": "月视图", + "name": "姓名", + "namePlaceholder": "杰西 · 史密斯", + "new": "新建", + "newPoll": "新投票", + "next": "下一步", + "nextMonth": "下个月", + "no": "不行", + "noDatesSelected": "未选择日期", + "notificationsDisabled": "通知已被禁用", + "notificationsOff": "关闭通知", + "notificationsOn": "启用通知", + "notificationsOnDescription": "当本次投票中有活动时,将邮件发送至 {{email}}。", + "notificationsVerifyEmail": "你需要验证你的电子邮件才能开启通知", + "noVotes": "没有人投票支持此选项", + "ok": "确定", + "options": "选项", + "participant": "参与者", + "participantCount_other": "{{count}} 位参与者", + "participantCount": "{{count}} 位参与者", + "pollHasBeenLocked": "此投票已锁定", + "pollHasBeenVerified": "你的投票已通过验证", + "pollOwnerNotice": "嘿 {{name}},看起来你是这个投票的所有者。", + "pollsEmpty": "未创建投票", + "possibleAnswers": "可能的选择包括", + "preferences": "偏好设置", + "previousMonth": "上个月", + "profileLogin": "个人资料 - 登录", + "profileUser": "个人资料 - {{username}}", + "requiredNameError": "姓名为必填项", + "save": "保存", + "saveInstruction": "选择你有空的时间并点击 {{save}}", + "share": "分享", + "shareDescription": "给你的 参与者 链接允许他们在你的投票中表决。", + "shareLink": "通过链接分享", + "specifyTimes": "指定时间", + "specifyTimesDescription": "包括每个选项的开始时间和结束时间", + "stepSummary": "第 {{current}} 步,共 {{total}} 步", + "sunday": "星期天", + "timeAndDate": "时间和日期", + "timeFormat": "时间格式:", + "timeZone": "时区:", + "title": "标题", + "titlePlaceholder": "每月会议", + "today": "今天", + "unlockPoll": "解锁投票", + "unverifiedMessage": "一封带有验证链接地址的电子邮件已发送至 {{email}} 。", + "user": "用户", + "vote": "投票", + "voteCount_other": "{{count}} 票", + "voteCount": "{{count}} 票", + "weekStartsOn": "每周开始于", + "weekView": "周视图", + "whatsThis": "这是什么?", + "yes": "确定", + "you": "你", + "yourDetails": "个人信息", + "yourName": "你的名字...", + "yourPolls": "你的投票" +} diff --git a/public/locales/zh/common.json b/public/locales/zh/common.json new file mode 100644 index 000000000..320cfe18a --- /dev/null +++ b/public/locales/zh/common.json @@ -0,0 +1,24 @@ +{ + "blog": "博客", + "discussions": "讨论", + "donate": "捐赠", + "english": "英语", + "footerCredit": "由 @imlukevella 制作", + "footerSponsor": "此项目由用户资助。请考虑通过 捐赠 来支持它。", + "french": "法语", + "german": "德语", + "home": "主页", + "italian": "意大利语", + "korean": "韩语", + "language": "语言", + "links": "链接", + "portuguese": "葡萄牙语", + "portugueseBr": "葡萄牙语 (巴西)", + "poweredBy": "提供服务", + "privacyPolicy": "隐私条款", + "spanish": "西班牙", + "starOnGithub": "在 GitHub 上 Star", + "support": "支持", + "swedish": "瑞典语", + "volunteerTranslator": "帮助翻译此网站" +} diff --git a/public/locales/zh/errors.json b/public/locales/zh/errors.json new file mode 100644 index 000000000..0f3dc345c --- /dev/null +++ b/public/locales/zh/errors.json @@ -0,0 +1,6 @@ +{ + "notFoundTitle": "404 未找到", + "notFoundDescription": "我们无法找到你想要的网页。", + "goToHome": "回到主页", + "startChat": "开始聊天" +} diff --git a/public/locales/zh/homepage.json b/public/locales/zh/homepage.json new file mode 100644 index 000000000..2215ce26a --- /dev/null +++ b/public/locales/zh/homepage.json @@ -0,0 +1,36 @@ +{ + "3Ls": "没错 - 这是三个 L!", + "adFree": "没有广告", + "adFreeDescription": "你可以让你的 ad-blocker 休息一下 — 你在这里不需要它。", + "comments": "评论", + "commentsDescription": "参与者可以评论你的投票,每个人都能看到。", + "features": "特色", + "featuresSubheading": "智能调度", + "follow": "关注", + "getStarted": "开始", + "heroSubText": "无需翻来翻去寻找合适的日期", + "heroText": "轻松安排
小组会议
", + "links": "链接", + "liveDemo": "实时演示", + "metaDescription": "创建投票并找到最好的日期或时间。Doodle 的免费替代品。", + "metaTitle": "Rallly - 安排小组会议", + "mobileFriendly": "移动设备友好", + "mobileFriendlyDescription": "在移动设备上效果很好,可以使参与者可以随时随地响应投票。", + "new": "新增功能", + "noLoginRequired": "无需登录", + "noLoginRequiredDescription": "你无需登录即可创建或参与投票", + "notifications": "通知", + "notificationsDescription": "随时了解回复。当参与者对你的投票进行表决或评论时,将会收到通知。", + "openSource": "开源", + "openSourceDescription": "代码库完全开源,可在GitHub上获取。", + "participant": "参与者", + "participantCount_other": "{{count}} 位参与者", + "participantCount": "{{count}} 位参与者", + "perfect": "太棒了!", + "principles": "原则", + "principlesSubheading": "我们和其他人不一样", + "selfHostable": "自托管", + "selfHostableDescription": "在你自己的服务器上运行它来完全掌握你的数据", + "timeSlots": "时间段", + "timeSlotsDescription": "为投票中的每个选项设置单独地开始和结束时间。时间可以根据每个参与者的时区自动调整,也可以设置为完全忽略时区。" +} diff --git a/src/components/poll/language-selector.tsx b/src/components/poll/language-selector.tsx index 0f2999516..1e53fd886 100644 --- a/src/components/poll/language-selector.tsx +++ b/src/components/poll/language-selector.tsx @@ -6,7 +6,7 @@ export const LanguageSelect: React.VoidFunctionComponent<{ className?: string; onChange?: (language: string) => void; }> = ({ className, onChange }) => { - const { t, i18n } = useTranslation("common"); + const { i18n } = useTranslation("common"); return ( ); }; diff --git a/src/middleware.ts b/src/middleware.ts index a6d719a3d..311e7d37f 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -9,6 +9,8 @@ const supportedLocales = [ "it", "ko", "sv", + "hu", + "zh", "pt", "pt-BR", ]; diff --git a/src/utils/dayjs.tsx b/src/utils/dayjs.tsx index 1563208c1..315051f7b 100644 --- a/src/utils/dayjs.tsx +++ b/src/utils/dayjs.tsx @@ -70,6 +70,16 @@ const dayjsLocales: Record< timeFormat: "12h", import: () => import("dayjs/locale/ko"), }, + hu: { + weekStartsOn: "monday", + timeFormat: "24h", + import: () => import("dayjs/locale/hu"), + }, + zh: { + weekStartsOn: "monday", + timeFormat: "24h", + import: () => import("dayjs/locale/zh"), + }, }; dayjs.extend(localizedFormat);