Skip to content
2 changes: 1 addition & 1 deletion next-i18next.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
module.exports = {
i18n: {
defaultLocale: "zh-Hans",
locales: ["zh-Hans", "en"],
locales: ["zh-Hans", "zh-tw", "en", "ru"],
localeDetection: false,
},
reloadOnPrerender: process.env.NODE_ENV === "development",
Expand Down
1 change: 1 addition & 0 deletions public/locales/en/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
"event": {
"filter": {
"onlyAvailable": "Only view upcoming conventions",
"all": "Overall scale",
"cosy": "Mini (0-100 attendees)",
"small": "Small (100-500 attendees)",
"medium": "Medium (500-1,000 attendees)",
Expand Down
118 changes: 118 additions & 0 deletions public/locales/ru/common.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
{
"header": {
"title": "Фуркон календарь",
"slogan": "Готовь уши и хвосты — будет жарко!🔥",
"nav": {
"homepage": "главная страница",
"city": "город",
"organization": "Организаторы",
"years": "временная шкала"
}
},
"footer": {
"friendsLink": "Партнёрские ссылки",
"aboutUs": "О нас",
"disclaimer": "Сведения носят справочный характер.Официальный источник — сайт организатора.",
"use": "Сайт создан",
"and": "и",
"made": " "
},
"homepage": {
"total": "{{total}} Всего фурконов",
"month": "{{month}} ",
"nextYearMonth": "в{{month}}следующего года",
"group": {
"status": {
"passed": "Завершено",
"now": "Прямо сейчас!",
"soon": "Скоро будет!",
"next": "Ещё в этом году",
"nextYear": "Смотрим на следующий год"
}
},
"noResult": "По вашему запросу конвентов не найдено...",
"noResultTip": "Попробуйте другие параметры... или подождём вместе?",
"noResultContact": "Сообщите нам об анонсированном фурконе! Контакты — в подвале сайта."
},
"event": {
"filter": {
"onlyAvailable": "Только предстоящие ",
"all": "Все размеры",
"cosy": "Камерные (0-100)",
"small": "Камерные (100-500)",
"medium": "Камерные (500-1,000)",
"large": "Камерные (1,000-3,000)",
"xlarge": "Камерные (3,000-5,000)",
"xxlarge": "Супер-гигантские (5,000+)",
"mega": "Супер-гигантские (10,000+ )"
},
"status": {
"cancel": "Мероприятие отменено организаторами и не состоится"
},
"type": {
"all-in-con": "Многофункциональный фуркон",
"comic-market": "Комикет-ярмарка",
"suit-only-con": "Фурсют-митап",
"travel-con": "Путешествие фурри",
"fandom-meetup": "Тематический сход"
},
"locationType": {
"hotel": "Отель",
"venue": "Площадка",
"online": "Онлайн"
},
"hostBy": "Организатор: {{hostName}}",
"unknown": "Пока не объявлено",
"scaleDes": "Предположительно {{scale}} мероприятие",
"scale": {
"all": "Все размеры",
"cosy": "Камерные (0-100)",
"small": "Камерные (100-500)",
"medium": "Камерные (500-1,000)",
"large": "Камерные (1,000-3,000)",
"xlarge": "Камерные (3,000-5,000)",
"xxlarge": "Супер-гигантские (5,000+)",
"mega": "Супер-гигантские (10,000+ )"
},
"goToSource": "Перейти к источнику",
"map": "Карта конвента",
"mapLoading": "Открыть в Gaode Map...",
"gotoGaoDe": "Открыть в Gaode Map",
"gotoOrganization": "Участники и стенды",
"dateFormat": "MMMM dd, yyyy"
},
"organization": {
"active": "Активные организаторы",
"inactive": "Неактивные организаторы",
"createdAt": "Основан {{distance}} назад",
"firstTimeEvent": "Первый фуркон: {{day}}.{{month}}.{{year}}",
"firstTimeShow": "Впервые на сцене: {{day}}.{{month}}.{{year}}",
"totalEvent": "Зафиксировано {{amount}} фурконов/встреч",
"website": "Официальный сайт",
"bilibili": "Bilibili",
"twitter": "Twitter",
"weibo": "Weibo",
"wikifur": "WikiFur",
"facebook": "Facebook",
"plurk": "Plurk",
"rednote": "RedNote",
"qq": "QQ International: {{qq}}",
"copyQq": "Скопировать номер QQ-группы",
"qqCopySuccess": "🥳 Скопировано! Присоединяйтесь к группе QQ International",
"mail": "Почта: {{email}}",
"copyMail": "Скопировать адрес",
"mailCopySuccess": "🥳 Скопировано! Пишите письмо",
"des": "Об организаторе",
"defaultDes": "Организатор ленив и не написал описание",
"passedEvent": "Прошедшие фурконы"
},
"years": {
"title": "Итоги",
"des": "За {{totalYear}} лет в календаре фурри-мероприятий собрано {{totalAmount}} фурконов/встреч. Среди них:",
"unknown": "Дата уточняется",
"known": "{{year}} год",
"thisYear": "В этом году",
"total": "Всего {{total}} фурконов/встреч",
"month": "{{month}} месяц"
}
}
117 changes: 117 additions & 0 deletions public/locales/zh-tw/common.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
{
"header": {
"title": "獸展日曆",
"slogan": "放假囉!",
"nav": {
"homepage": "首頁",
"city": "城市",
"organization": "主辦單位",
"years": "年份表"
}
},
"footer": {
"friendsLink": "合作連結",
"aboutUs": "關於我們",
"disclaimer": "本頁資訊僅供參考,詳情請以活動官方公告為準",
"use": "採用",
"and": "與",
"made": "製作而成"
},
"homepage": {
"total": "共收錄 {{total}} 場展會",
"month": "{{month}}月",
"nextYearMonth": "明年{{month}}月",
"group": {
"status": {
"passed": "已結束",
"now": "正在舉行",
"soon": "即將開始",
"next": "今年場次",
"nextYear": "明年展會"
}
},
"noResult": "目前沒有符合條件的展會...",
"noResultTip": "試試其他搜尋條件,或是...再等等看?",
"noResultContact": "歡迎透過頁尾聯絡方式,向我們回報已公佈的展會資訊!"
},
"event": {
"filter": {
"onlyAvailable": "只看未開始的展會",
"all": "所有規模",
"cosy": "迷你型(0-100人)",
"small": "小型(100-500人)",
"medium": "中型(500-1000人)",
"large": "大型(1000-3000人)",
"xlarge": "超大型(3000-5000人)",
"xxlarge": "特大型(5000人以上)",
"mega": "巨型(破萬人)"
},
"status": {
"cancel": "活動已由主辦單位取消。"
},
"type": {
"all-in-con": "綜合型展會",
"comic-market": "販售會",
"suit-only-con": "獸裝限定聚",
"travel-con": "旅行聚會",
"fandom-meetup": "主題同好聚"
},
"locationType": {
"hotel": "飯店",
"venue": "展演場館",
"online": "線上活動"
},
"hostBy": "主辦單位:{{hostName}}",
"unknown": "尚未公佈",
"scaleDes": "預估為 {{scale}} 展會",
"scale": {
"cosy": "迷你型(0-100人)",
"small": "小型規模(100-500人)",
"medium": "中型規模(500-1000人)",
"large": "大型規模(1000-3000人)",
"xlarge": "超大型規模(3000-5000人)",
"xxlarge": "特大型規模(5000人以上)",
"mega": "巨型規模(破萬人)"
},
"goToSource": "查看原始資訊",
"map": "活動地圖",
"mapLoading": "地圖載入中",
"gotoGaoDe": "用高德地圖查看",
"gotoOrganization": "查看主辦單位",
"dateFormat": "yyyy年MM月dd日"
},
"organization": {
"active": "營運中",
"inactive": "已停辦",
"createdAt": "創立於 {{distance}}",
"firstTimeEvent": "首場展會:{{year}}年{{month}}月{{day}}日",
"firstTimeShow": "首次登場:{{year}}年{{month}}月{{day}}日",
"totalEvent": "累計舉辦 {{amount}} 場展會/獸聚",
"website": "官方網站",
"bilibili": "Bilibili",
"twitter": "Twitter",
"weibo": "微博",
"wikifur": "前往 Wikifur 瞭解更多",
"facebook": "Facebook",
"plurk": "Plurk",
"rednote": "小紅書",
"qq": "QQ群號:{{qq}}",
"copyQq": "複製QQ群號",
"qqCopySuccess": "🥳 複製成功!請至QQ使用群號搜尋",
"mail": "寄信至 {{email}}",
"copyMail": "複製信箱",
"mailCopySuccess": "🥳 複製成功!快去寄信吧",
"des": "主辦單位簡介",
"defaultDes": "這個主辦單位尚未提供簡介。",
"passedEvent": "歷年活動"
},
"years": {
"title": "年度統計",
"des": "獸展日曆共收錄 {{totalYear}} 個年度的 {{totalAmount}} 場展會/獸聚。其中:",
"unknown": "日期未定",
"known": "{{year}}年",
"thisYear": "本年度",
"total": "共 {{total}} 場展會/獸聚",
"month": "{{month}}月"
}
}
16 changes: 13 additions & 3 deletions src/components/layout/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ const PUBLIC_URL = process.env.NEXT_PUBLIC_WEBSITE_URL;

const getCanonicalUrl = (locale: string | undefined, path: string) => {
switch (locale) {
case "ru":
return `https://www.furrycons.cn/ru${path}`;
case "zh-tw":
return `https://www.furrycons.cn/tw${path}`;
case "en":
return `https://www.furrycons.cn/en${path}`;
case "zh-Hans":
Expand Down Expand Up @@ -75,7 +79,7 @@ export default function Layout({
content={
headMetas?.keywords
? headMetas.keywords
: universalKeywords(i18n.language as "zh-Hans" | "en").join(",")
: universalKeywords(i18n.language as "zh-Hans" | "zh-tw" | "en" | "ru").join(",")
}
key="keywords"
/>
Expand Down Expand Up @@ -168,8 +172,8 @@ export default function Layout({

<link
rel="alternate"
hrefLang="zh-TW"
href={`https://www.furrycons.cn${Path}`}
hrefLang="zh-tw"
href={`https://www.furrycons.cn/tw${Path}`}
/>

<link
Expand All @@ -178,6 +182,12 @@ export default function Layout({
href={`https://www.furrycons.cn/en${Path}`}
/>

<link
rel="alternate"
hrefLang="ru"
href={`https://www.furrycons.cn/ru${Path}`}
/>

<link
rel="alternate"
hrefLang="x-default"
Expand Down
20 changes: 20 additions & 0 deletions src/components/layout/localeMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,26 @@ export default function LocaleMenu() {
English
</Link>
</li>
<li>
<Link
href={pathname}
locale="zh-tw"
className="px-4 py-2 w-full block text-center hover:bg-gray-100 rounded-md"
onClick={() => setOpen(false)}
>
繁體中文
</Link>
</li>
<li>
<Link
href={pathname}
locale="ru"
className="px-4 py-2 w-full block text-center hover:bg-gray-100 rounded-md"
onClick={() => setOpen(false)}
>
Русский
</Link>
</li>
</ul>
</div>
)}
Expand Down
Loading
Loading