diff --git a/README.en.md b/README.en.md index 7683db8..7203d6e 100644 --- a/README.en.md +++ b/README.en.md @@ -46,7 +46,7 @@ homepage ## Contribution Guide -See [CONTRIBUTING.md](docs/en/CONTRIBUTING.md) in the `docs` directory to learn how to participate in the project. +See [CONTRIBUTING.md](docs/en-US/CONTRIBUTING.md) in the `docs` directory to learn how to participate in the project. ## License diff --git a/README.md b/README.md index 373b908..c20b6c9 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ homepage ## 贡献指南 -参见 `docs` 目录中的 [CONTRIBUTING.md](docs/zh-Hans/CONTRIBUTING.md) 了解如何参与项目。 +参见 `docs` 目录中的 [CONTRIBUTING.md](docs/zh-CN/CONTRIBUTING.md) 了解如何参与项目。 ## 许可 diff --git a/README.zh-Hant.md b/README.zh-Hant.md index 43f0500..b55b296 100644 --- a/README.zh-Hant.md +++ b/README.zh-Hant.md @@ -46,7 +46,7 @@ homepage ## 貢獻指南 -參見 `docs` 目錄中的 [CONTRIBUTING.md](docs/zh-Hant/CONTRIBUTING.md) 了解如何參與專案。 +參見 `docs` 目錄中的 [CONTRIBUTING.md](docs/zh-TW/CONTRIBUTING.md) 了解如何參與專案。 ## 許可 diff --git a/data/en/about.json b/data/en-US/about.json similarity index 100% rename from data/en/about.json rename to data/en-US/about.json diff --git a/data/en/contributors.json b/data/en-US/contributors.json similarity index 100% rename from data/en/contributors.json rename to data/en-US/contributors.json diff --git a/data/en/index.json b/data/en-US/index.json similarity index 92% rename from data/en/index.json rename to data/en-US/index.json index ec68c78..220ebe4 100644 --- a/data/en/index.json +++ b/data/en-US/index.json @@ -17,7 +17,9 @@ "meta": { "title": "STARSET Mirror", "description": "STARSET Mirror, connecting STARSET and you." - } + }, + "latestUpdates": "Latest Updates", + "featuredProjects": "Featured Projects" }, "projects": { "meta": { @@ -47,6 +49,7 @@ "loading": "Loading...", "back_to_list": "Back to Updates", "filter": { + "all": "All Updates", "title": "Filter by Tags", "search_placeholder": "Search tags...", "no_results": "No matching tags found", @@ -73,6 +76,7 @@ "title": "Contributors - STARSET Mirror", "description": "Meet the amazing people behind STARSET Mirror. Our contributors work tirelessly to bring STARSET closer to you." }, + "title": "Contributors", "tabs": { "contributors": "Contributors", "sponsors": "Sponsors" @@ -95,17 +99,16 @@ }, "aria": { "mainContent": "Main content", + "breadcrumb": "Page navigation", + "navigation": "Site navigation", "menu": "Menu", - "navigation": "Navigation", "search": "Search", - "language": "Change language", - "darkMode": "Toggle dark mode", - "openMenu": "Open menu", - "closeMenu": "Close menu", - "error": "Error", + "darkMode": "Dark mode", + "language": "Language selection", "loading": "Loading", - "comments": "Comments section", - "breadcrumb": "Breadcrumb" + "error": "Error", + "closeMenu": "Close menu", + "openMenu": "Open menu" }, "hero": { "title": "Connecting STARSET and You", @@ -171,7 +174,9 @@ }, "common": { "loading": "Loading...", - "error": "An error occurred" + "error": "An error occurred", + "retry": "Retry", + "close": "Close" } } } \ No newline at end of file diff --git a/data/en/projects.json b/data/en-US/projects.json similarity index 100% rename from data/en/projects.json rename to data/en-US/projects.json diff --git a/data/en/sponsors.json b/data/en-US/sponsors.json similarity index 100% rename from data/en/sponsors.json rename to data/en-US/sponsors.json diff --git a/data/en/updates.json b/data/en-US/updates.json similarity index 100% rename from data/en/updates.json rename to data/en-US/updates.json diff --git a/data/en/updates/2023/starset-wiki-calls-for-contributions.md b/data/en-US/updates/2023/starset-wiki-calls-for-contributions.md similarity index 100% rename from data/en/updates/2023/starset-wiki-calls-for-contributions.md rename to data/en-US/updates/2023/starset-wiki-calls-for-contributions.md diff --git a/data/en/updates/2024/changes-about-our-social-profiles.md b/data/en-US/updates/2024/changes-about-our-social-profiles.md similarity index 100% rename from data/en/updates/2024/changes-about-our-social-profiles.md rename to data/en-US/updates/2024/changes-about-our-social-profiles.md diff --git a/data/en/updates/2024/starset-wiki-project-update-2024.md b/data/en-US/updates/2024/starset-wiki-project-update-2024.md similarity index 100% rename from data/en/updates/2024/starset-wiki-project-update-2024.md rename to data/en-US/updates/2024/starset-wiki-project-update-2024.md diff --git a/data/en/updates/2025/introducing-tss-rocks.md b/data/en-US/updates/2025/introducing-tss-rocks.md similarity index 100% rename from data/en/updates/2025/introducing-tss-rocks.md rename to data/en-US/updates/2025/introducing-tss-rocks.md diff --git a/data/en/updates/index/2023.json b/data/en-US/updates/index/2023.json similarity index 100% rename from data/en/updates/index/2023.json rename to data/en-US/updates/index/2023.json diff --git a/data/en/updates/index/2024.json b/data/en-US/updates/index/2024.json similarity index 100% rename from data/en/updates/index/2024.json rename to data/en-US/updates/index/2024.json diff --git a/data/en/updates/index/2025.json b/data/en-US/updates/index/2025.json similarity index 100% rename from data/en/updates/index/2025.json rename to data/en-US/updates/index/2025.json diff --git a/data/zh-Hans/about.json b/data/zh-CN/about.json similarity index 100% rename from data/zh-Hans/about.json rename to data/zh-CN/about.json diff --git a/data/zh-Hans/contributors.json b/data/zh-CN/contributors.json similarity index 100% rename from data/zh-Hans/contributors.json rename to data/zh-CN/contributors.json diff --git a/data/zh-Hans/index.json b/data/zh-CN/index.json similarity index 92% rename from data/zh-Hans/index.json rename to data/zh-CN/index.json index f4e3d2f..ce86c7a 100644 --- a/data/zh-Hans/index.json +++ b/data/zh-CN/index.json @@ -17,21 +17,22 @@ "meta": { "title": "STARSET Mirror", "description": "STARSET Mirror,连接星落与你" - } + }, + "latestUpdates": "最新动态", + "featuredProjects": "精选项目" }, "aria": { "mainContent": "主要内容", + "breadcrumb": "页面导航", + "navigation": "网站导航", "menu": "菜单", - "navigation": "导航", "search": "搜索", - "language": "切换语言", - "darkMode": "切换深色模式", - "openMenu": "打开菜单", - "closeMenu": "关闭菜单", - "error": "错误", + "darkMode": "深色模式", + "language": "语言选择", "loading": "加载中", - "comments": "评论区", - "breadcrumb": "面包屑导航" + "error": "错误", + "closeMenu": "关闭菜单", + "openMenu": "打开菜单" }, "hero": { "title": "连接星落与你", @@ -69,6 +70,7 @@ "loading": "正在加载...", "back_to_list": "返回动态列表", "filter": { + "all": "全部动态", "title": "按标签筛选", "search_placeholder": "搜索标签...", "no_results": "未找到匹配的标签", @@ -95,6 +97,7 @@ "title": "贡献者 - STARSET Mirror", "description": "认识 STARSET Mirror 背后的优秀贡献者们。他们不懈努力,让 STARSET 与你更近。" }, + "title": "贡献者", "tabs": { "contributors": "贡献者", "sponsors": "赞助人" @@ -165,7 +168,9 @@ }, "common": { "loading": "加载中...", - "error": "发生错误" + "error": "发生错误", + "retry": "重试", + "close": "关闭" } } } \ No newline at end of file diff --git a/data/zh-Hans/projects.json b/data/zh-CN/projects.json similarity index 100% rename from data/zh-Hans/projects.json rename to data/zh-CN/projects.json diff --git a/data/zh-Hans/sponsors.json b/data/zh-CN/sponsors.json similarity index 100% rename from data/zh-Hans/sponsors.json rename to data/zh-CN/sponsors.json diff --git a/data/zh-Hans/updates.json b/data/zh-CN/updates.json similarity index 100% rename from data/zh-Hans/updates.json rename to data/zh-CN/updates.json diff --git a/data/zh-Hans/updates/2020/journal-2020q3.md b/data/zh-CN/updates/2020/journal-2020q3.md similarity index 100% rename from data/zh-Hans/updates/2020/journal-2020q3.md rename to data/zh-CN/updates/2020/journal-2020q3.md diff --git a/data/zh-Hans/updates/2021/disclaimer-about-bilibili-horizons-dmca.md b/data/zh-CN/updates/2021/disclaimer-about-bilibili-horizons-dmca.md similarity index 100% rename from data/zh-Hans/updates/2021/disclaimer-about-bilibili-horizons-dmca.md rename to data/zh-CN/updates/2021/disclaimer-about-bilibili-horizons-dmca.md diff --git a/data/zh-Hans/updates/2021/journal-2020q4.md b/data/zh-CN/updates/2021/journal-2020q4.md similarity index 100% rename from data/zh-Hans/updates/2021/journal-2020q4.md rename to data/zh-CN/updates/2021/journal-2020q4.md diff --git a/data/zh-Hans/updates/2021/one-year-anniversary.md b/data/zh-CN/updates/2021/one-year-anniversary.md similarity index 100% rename from data/zh-Hans/updates/2021/one-year-anniversary.md rename to data/zh-CN/updates/2021/one-year-anniversary.md diff --git a/data/zh-Hans/updates/2021/summary-202102.md b/data/zh-CN/updates/2021/summary-202102.md similarity index 100% rename from data/zh-Hans/updates/2021/summary-202102.md rename to data/zh-CN/updates/2021/summary-202102.md diff --git a/data/zh-Hans/updates/2021/summary-202108.md b/data/zh-CN/updates/2021/summary-202108.md similarity index 100% rename from data/zh-Hans/updates/2021/summary-202108.md rename to data/zh-CN/updates/2021/summary-202108.md diff --git a/data/zh-Hans/updates/2022/journal-2021h2.md b/data/zh-CN/updates/2022/journal-2021h2.md similarity index 100% rename from data/zh-Hans/updates/2022/journal-2021h2.md rename to data/zh-CN/updates/2022/journal-2021h2.md diff --git a/data/zh-Hans/updates/2023/10th-anniversary-special.md b/data/zh-CN/updates/2023/10th-anniversary-special.md similarity index 100% rename from data/zh-Hans/updates/2023/10th-anniversary-special.md rename to data/zh-CN/updates/2023/10th-anniversary-special.md diff --git a/data/zh-Hans/updates/2023/journal-2022.md b/data/zh-CN/updates/2023/journal-2022.md similarity index 100% rename from data/zh-Hans/updates/2023/journal-2022.md rename to data/zh-CN/updates/2023/journal-2022.md diff --git a/data/zh-Hans/updates/2023/lyrics-translation-completed.md b/data/zh-CN/updates/2023/lyrics-translation-completed.md similarity index 100% rename from data/zh-Hans/updates/2023/lyrics-translation-completed.md rename to data/zh-CN/updates/2023/lyrics-translation-completed.md diff --git a/data/zh-Hans/updates/2023/summary-202310.md b/data/zh-CN/updates/2023/summary-202310.md similarity index 100% rename from data/zh-Hans/updates/2023/summary-202310.md rename to data/zh-CN/updates/2023/summary-202310.md diff --git a/data/zh-Hans/updates/2024/journal-2023.md b/data/zh-CN/updates/2024/journal-2023.md similarity index 100% rename from data/zh-Hans/updates/2024/journal-2023.md rename to data/zh-CN/updates/2024/journal-2023.md diff --git a/data/zh-Hans/updates/2025/introducing-tss-rocks.md b/data/zh-CN/updates/2025/introducing-tss-rocks.md similarity index 100% rename from data/zh-Hans/updates/2025/introducing-tss-rocks.md rename to data/zh-CN/updates/2025/introducing-tss-rocks.md diff --git a/data/zh-Hans/updates/2025/journal-2024.md b/data/zh-CN/updates/2025/journal-2024.md similarity index 100% rename from data/zh-Hans/updates/2025/journal-2024.md rename to data/zh-CN/updates/2025/journal-2024.md diff --git a/data/zh-Hans/updates/2025/starset-mirror-now-part-of-wholetrans.md b/data/zh-CN/updates/2025/starset-mirror-now-part-of-wholetrans.md similarity index 100% rename from data/zh-Hans/updates/2025/starset-mirror-now-part-of-wholetrans.md rename to data/zh-CN/updates/2025/starset-mirror-now-part-of-wholetrans.md diff --git a/data/zh-Hans/updates/index/2020.json b/data/zh-CN/updates/index/2020.json similarity index 100% rename from data/zh-Hans/updates/index/2020.json rename to data/zh-CN/updates/index/2020.json diff --git a/data/zh-Hans/updates/index/2021.json b/data/zh-CN/updates/index/2021.json similarity index 100% rename from data/zh-Hans/updates/index/2021.json rename to data/zh-CN/updates/index/2021.json diff --git a/data/zh-Hans/updates/index/2022.json b/data/zh-CN/updates/index/2022.json similarity index 100% rename from data/zh-Hans/updates/index/2022.json rename to data/zh-CN/updates/index/2022.json diff --git a/data/zh-Hans/updates/index/2023.json b/data/zh-CN/updates/index/2023.json similarity index 100% rename from data/zh-Hans/updates/index/2023.json rename to data/zh-CN/updates/index/2023.json diff --git a/data/zh-Hans/updates/index/2024.json b/data/zh-CN/updates/index/2024.json similarity index 100% rename from data/zh-Hans/updates/index/2024.json rename to data/zh-CN/updates/index/2024.json diff --git a/data/zh-Hans/updates/index/2025.json b/data/zh-CN/updates/index/2025.json similarity index 100% rename from data/zh-Hans/updates/index/2025.json rename to data/zh-CN/updates/index/2025.json diff --git a/data/zh-Hant/about.json b/data/zh-TW/about.json similarity index 100% rename from data/zh-Hant/about.json rename to data/zh-TW/about.json diff --git a/data/zh-Hant/contributors.json b/data/zh-TW/contributors.json similarity index 100% rename from data/zh-Hant/contributors.json rename to data/zh-TW/contributors.json diff --git a/data/zh-Hant/index.json b/data/zh-TW/index.json similarity index 80% rename from data/zh-Hant/index.json rename to data/zh-TW/index.json index c09cb8d..bce3bec 100644 --- a/data/zh-Hant/index.json +++ b/data/zh-TW/index.json @@ -17,21 +17,22 @@ "meta": { "title": "STARSET Mirror", "description": "STARSET Mirror,連結星落與你。" - } + }, + "latestUpdates": "最新動態", + "featuredProjects": "查看專案" }, "aria": { "mainContent": "主要內容", + "breadcrumb": "頁面導航", + "navigation": "網站導航", "menu": "選單", - "navigation": "導航", "search": "搜尋", - "language": "切換語言", - "darkMode": "切換深色模式", - "openMenu": "打開選單", - "closeMenu": "關閉選單", - "error": "錯誤", + "darkMode": "深色模式", + "language": "語言選擇", "loading": "載入中", - "comments": "評論區", - "breadcrumb": "麵包屑導航" + "error": "錯誤", + "closeMenu": "關閉選單", + "openMenu": "開啟選單" }, "hero": { "title": "連接星落與你", @@ -42,10 +43,6 @@ } }, "projects": { - "meta": { - "title": "專案 - STARSET Mirror", - "description": "探索我們為 STARSET 和社群打造的專案。從翻譯到社群服務,了解我們如何為社群貢獻力量。" - }, "title": "專案", "tags": { "translation": "翻譯", @@ -61,14 +58,11 @@ } }, "updates": { - "meta": { - "title": "動態 - STARSET Mirror", - "description": "了解 STARSET Mirror 的最新動態、更新和活動。跟隨我們支持 STARSET 社群的脚步。" - }, "title": "專案動態", "loading": "正在載入...", "back_to_list": "返回動態列表", "filter": { + "all": "全部動態", "title": "按標籤篩選", "search_placeholder": "搜尋標籤...", "no_results": "未找到匹配的標籤", @@ -91,10 +85,7 @@ } }, "contributors": { - "meta": { - "title": "貢獻者 - STARSET Mirror", - "description": "了解 STARSET Mirror 的核心貢獻者和贊助人。" - }, + "title": "貢獻者", "tabs": { "contributors": "貢獻者", "sponsors": "贊助人" @@ -103,10 +94,6 @@ "regular_members": "專案成員 & 社群貢獻者" }, "about": { - "meta": { - "title": "關於 - STARSET Mirror", - "description": "了解 STARSET Mirror 的使命、價值觀,以及我们致力于连接 STARSET 与全球粉丝的愿景。" - }, "title": "關於我們", "contact": { "title": "聯絡方式" @@ -171,7 +158,9 @@ }, "common": { "loading": "載入中...", - "error": "發生錯誤" + "error": "發生錯誤", + "retry": "重試", + "close": "關閉" } } } \ No newline at end of file diff --git a/data/zh-Hant/projects.json b/data/zh-TW/projects.json similarity index 100% rename from data/zh-Hant/projects.json rename to data/zh-TW/projects.json diff --git a/data/zh-Hant/sponsors.json b/data/zh-TW/sponsors.json similarity index 100% rename from data/zh-Hant/sponsors.json rename to data/zh-TW/sponsors.json diff --git a/data/zh-Hant/updates.json b/data/zh-TW/updates.json similarity index 100% rename from data/zh-Hant/updates.json rename to data/zh-TW/updates.json diff --git a/data/zh-Hant/updates/2020/journal-2020q3.md b/data/zh-TW/updates/2020/journal-2020q3.md similarity index 100% rename from data/zh-Hant/updates/2020/journal-2020q3.md rename to data/zh-TW/updates/2020/journal-2020q3.md diff --git a/data/zh-Hant/updates/2021/disclaimer-about-bilibili-horizons-dmca.md b/data/zh-TW/updates/2021/disclaimer-about-bilibili-horizons-dmca.md similarity index 100% rename from data/zh-Hant/updates/2021/disclaimer-about-bilibili-horizons-dmca.md rename to data/zh-TW/updates/2021/disclaimer-about-bilibili-horizons-dmca.md diff --git a/data/zh-Hant/updates/2021/journal-2020q4.md b/data/zh-TW/updates/2021/journal-2020q4.md similarity index 100% rename from data/zh-Hant/updates/2021/journal-2020q4.md rename to data/zh-TW/updates/2021/journal-2020q4.md diff --git a/data/zh-Hant/updates/2021/one-year-anniversary.md b/data/zh-TW/updates/2021/one-year-anniversary.md similarity index 100% rename from data/zh-Hant/updates/2021/one-year-anniversary.md rename to data/zh-TW/updates/2021/one-year-anniversary.md diff --git a/data/zh-Hant/updates/2021/summary-202102.md b/data/zh-TW/updates/2021/summary-202102.md similarity index 100% rename from data/zh-Hant/updates/2021/summary-202102.md rename to data/zh-TW/updates/2021/summary-202102.md diff --git a/data/zh-Hant/updates/2021/summary-202108.md b/data/zh-TW/updates/2021/summary-202108.md similarity index 100% rename from data/zh-Hant/updates/2021/summary-202108.md rename to data/zh-TW/updates/2021/summary-202108.md diff --git a/data/zh-Hant/updates/2022/journal-2021h2.md b/data/zh-TW/updates/2022/journal-2021h2.md similarity index 100% rename from data/zh-Hant/updates/2022/journal-2021h2.md rename to data/zh-TW/updates/2022/journal-2021h2.md diff --git a/data/zh-Hant/updates/2023/10th-anniversary-special.md b/data/zh-TW/updates/2023/10th-anniversary-special.md similarity index 100% rename from data/zh-Hant/updates/2023/10th-anniversary-special.md rename to data/zh-TW/updates/2023/10th-anniversary-special.md diff --git a/data/zh-Hant/updates/2023/journal-2022.md b/data/zh-TW/updates/2023/journal-2022.md similarity index 100% rename from data/zh-Hant/updates/2023/journal-2022.md rename to data/zh-TW/updates/2023/journal-2022.md diff --git a/data/zh-Hant/updates/2023/lyrics-translation-completed.md b/data/zh-TW/updates/2023/lyrics-translation-completed.md similarity index 100% rename from data/zh-Hant/updates/2023/lyrics-translation-completed.md rename to data/zh-TW/updates/2023/lyrics-translation-completed.md diff --git a/data/zh-Hant/updates/2023/summary-202310.md b/data/zh-TW/updates/2023/summary-202310.md similarity index 100% rename from data/zh-Hant/updates/2023/summary-202310.md rename to data/zh-TW/updates/2023/summary-202310.md diff --git a/data/zh-Hant/updates/2024/journal-2023.md b/data/zh-TW/updates/2024/journal-2023.md similarity index 100% rename from data/zh-Hant/updates/2024/journal-2023.md rename to data/zh-TW/updates/2024/journal-2023.md diff --git a/data/zh-Hant/updates/2025/introducing-tss-rocks.md b/data/zh-TW/updates/2025/introducing-tss-rocks.md similarity index 100% rename from data/zh-Hant/updates/2025/introducing-tss-rocks.md rename to data/zh-TW/updates/2025/introducing-tss-rocks.md diff --git a/data/zh-Hant/updates/2025/journal-2024.md b/data/zh-TW/updates/2025/journal-2024.md similarity index 100% rename from data/zh-Hant/updates/2025/journal-2024.md rename to data/zh-TW/updates/2025/journal-2024.md diff --git a/data/zh-Hant/updates/2025/starset-mirror-now-part-of-wholetrans.md b/data/zh-TW/updates/2025/starset-mirror-now-part-of-wholetrans.md similarity index 100% rename from data/zh-Hant/updates/2025/starset-mirror-now-part-of-wholetrans.md rename to data/zh-TW/updates/2025/starset-mirror-now-part-of-wholetrans.md diff --git a/data/zh-Hant/updates/index/2020.json b/data/zh-TW/updates/index/2020.json similarity index 100% rename from data/zh-Hant/updates/index/2020.json rename to data/zh-TW/updates/index/2020.json diff --git a/data/zh-Hant/updates/index/2021.json b/data/zh-TW/updates/index/2021.json similarity index 100% rename from data/zh-Hant/updates/index/2021.json rename to data/zh-TW/updates/index/2021.json diff --git a/data/zh-Hant/updates/index/2022.json b/data/zh-TW/updates/index/2022.json similarity index 100% rename from data/zh-Hant/updates/index/2022.json rename to data/zh-TW/updates/index/2022.json diff --git a/data/zh-Hant/updates/index/2023.json b/data/zh-TW/updates/index/2023.json similarity index 100% rename from data/zh-Hant/updates/index/2023.json rename to data/zh-TW/updates/index/2023.json diff --git a/data/zh-Hant/updates/index/2024.json b/data/zh-TW/updates/index/2024.json similarity index 100% rename from data/zh-Hant/updates/index/2024.json rename to data/zh-TW/updates/index/2024.json diff --git a/data/zh-Hant/updates/index/2025.json b/data/zh-TW/updates/index/2025.json similarity index 100% rename from data/zh-Hant/updates/index/2025.json rename to data/zh-TW/updates/index/2025.json diff --git a/docs/README.md b/docs/README.md index df9788c..5c0e54e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,3 +1,3 @@ -- [简体中文](./zh-Hans/) -- [繁體中文](./zh-Hant/) -- [English](./en/) +- [简体中文](./zh-CN/) +- [繁體中文](./zh-TW/) +- [English](./en-US/) diff --git a/docs/en/CONTRIBUTING.md b/docs/en-US/CONTRIBUTING.md similarity index 100% rename from docs/en/CONTRIBUTING.md rename to docs/en-US/CONTRIBUTING.md diff --git a/docs/zh-Hans/CONTRIBUTING.md b/docs/zh-CN/CONTRIBUTING.md similarity index 100% rename from docs/zh-Hans/CONTRIBUTING.md rename to docs/zh-CN/CONTRIBUTING.md diff --git a/docs/zh-Hant/CONTRIBUTING.md b/docs/zh-TW/CONTRIBUTING.md similarity index 100% rename from docs/zh-Hant/CONTRIBUTING.md rename to docs/zh-TW/CONTRIBUTING.md diff --git a/package.json b/package.json index b549135..5bc54fc 100644 --- a/package.json +++ b/package.json @@ -5,10 +5,9 @@ "type": "module", "scripts": { "dev": "vite", - "build": "tsx scripts/check-translations.ts && vite build && tsx scripts/generate-rss.ts && tsx scripts/generate-sitemap.ts", + "build": "vite build && tsx scripts/generate-rss.ts && tsx scripts/generate-sitemap.ts", "lint": "eslint .", - "preview": "vite preview", - "check-translations": "tsx scripts/check-translations.ts" + "preview": "vite preview" }, "dependencies": { "@ant-design/icons": "^5.6.0", @@ -37,7 +36,6 @@ "@types/react-dom": "^18.3.5", "@vitejs/plugin-react": "^4.3.4", "autoprefixer": "^10.4.20", - "chalk": "^5.4.1", "eslint": "^9.19.0", "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-react-refresh": "^0.4.18", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6b07920..140910a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -81,9 +81,6 @@ importers: autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.5.1) - chalk: - specifier: ^5.4.1 - version: 5.4.1 eslint: specifier: ^9.19.0 version: 9.19.0(jiti@1.21.7) @@ -992,10 +989,6 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -2949,8 +2942,6 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.4.1: {} - chokidar@3.6.0: dependencies: anymatch: 3.1.3 diff --git a/scripts/check-translations.ts b/scripts/check-translations.ts deleted file mode 100644 index 9331e86..0000000 --- a/scripts/check-translations.ts +++ /dev/null @@ -1,183 +0,0 @@ -import fs from 'fs-extra'; -import path from 'path'; -import * as globModule from 'glob'; -const glob = globModule.glob; -import chalk from 'chalk'; - -interface TranslationMap { - [key: string]: string | TranslationMap; -} - -interface TranslationResult { - missingKeys: string[]; - unusedKeys: string[]; -} - -// 递归获取所有翻译键 -function getAllTranslationKeys(obj: TranslationMap, prefix = ''): string[] { - return Object.entries(obj).reduce((acc, [key, value]) => { - const currentKey = prefix ? `${prefix}.${key}` : key; - if (typeof value === 'object') { - return [...acc, ...getAllTranslationKeys(value, currentKey)]; - } - // 如果键以 translation. 开头,移除这个前缀 - const finalKey = currentKey.startsWith('translation.') - ? currentKey.substring('translation.'.length) - : currentKey; - if (!shouldIgnoreKey(finalKey)) { - return [...acc, finalKey]; - } - return acc; - }, []); -} - -// 从源代码中提取翻译键的正则表达式 -const translationKeyRegexes = [ - /(?:t|i18n\.t)\(['"]([a-zA-Z][a-zA-Z0-9._-]+)['"](?:\s*,\s*{[^}]*})?\)/gi, // t('key') or t('key', {}) - /(?:t|i18n\.t)\(\s*(?:[a-zA-Z][a-zA-Z0-9._]+\s*\?\s*)?['"]([a-zA-Z][a-zA-Z0-9._-]+)['"](?:\s*:\s*['"]([a-zA-Z][a-zA-Z0-9._-]+)['"])?(?:\s*,\s*{[^}]*})?\)/gi, // t(isOpen ? 'key1' : 'key2') or t('key') - /useTranslation\(['"]([a-zA-Z][a-zA-Z0-9._-]+)['"]\)/gi, // useTranslation('key') - /]*i18nKey=["']([a-zA-Z][a-zA-Z0-9._-]+)["']/gi, // -]; - -// 从文件内容中提取翻译键 -function extractTranslationKeys(content: string): Set { - const keys = new Set(); - for (const regex of translationKeyRegexes) { - let match; - while ((match = regex.exec(content)) !== null) { - // 如果有多个捕获组(三元运算符的情况),添加所有捕获的键 - for (let i = 1; i < match.length; i++) { - const key = match[i]; - if (key && !shouldIgnoreKey(key)) { - keys.add(key); - } - } - } - } - return keys; -} - -// 忽略的翻译键 -const ignoredKeys = new Set([ - 'content-type', - 'page', - 'tags' -]); - -// 忽略的翻译键前缀 -const ignoredPrefixes = [ - 'projects.status.', - 'projects.tags.', - 'social.links', - 'updates.tags', - 'data.' -]; - -// 检查键是否应该被忽略 -function shouldIgnoreKey(key: string): boolean { - if (ignoredKeys.has(key)) return true; - return ignoredPrefixes.some(prefix => key.startsWith(prefix)); -} - -// 比较翻译键 -function compareTranslations(usedKeys: Set, availableKeys: Set): TranslationResult { - const missingKeys = Array.from(usedKeys) - .filter(key => !availableKeys.has(key)) - .sort(); - - const unusedKeys = Array.from(availableKeys) - .filter(key => !usedKeys.has(key)) - .sort(); - - return { missingKeys, unusedKeys }; -} - -async function main() { - console.log(chalk.blue('Checking translations...')); - // 获取所有支持的语言 - const dataDir = path.resolve('data'); - const langs = fs.readdirSync(dataDir) - .filter(file => fs.statSync(path.join(dataDir, file)).isDirectory()) - .filter(dir => /^[a-z]{2}-[A-Z]{2}$/.test(dir)); - - // 扫描源代码文件 - const srcFiles = await glob('src/**/*.{ts,tsx,js,jsx}', { absolute: true }); - const usedKeys = new Set(); - - // 从所有源代码文件中提取翻译键 - for (const file of srcFiles) { - const content = await fs.readFile(file, 'utf-8'); - const keys = extractTranslationKeys(content); - keys.forEach(key => usedKeys.add(key)); - } - - // 检查每个语言的翻译 - let hasWarnings = false; - for (const lang of langs) { - const indexPath = path.join(dataDir, lang, 'index.json'); - if (fs.existsSync(indexPath)) { - const content = await fs.readJson(indexPath); - // 确保我们从 translations 对象开始 - const translationsObj = content.translations || content; - const availableKeys = new Set(getAllTranslationKeys(translationsObj)); - - const { missingKeys, unusedKeys } = compareTranslations(usedKeys, availableKeys); - - if (missingKeys.length > 0 || unusedKeys.length > 0) { - hasWarnings = true; - console.log(chalk.yellow(`\n[${lang}]`)); - - if (missingKeys.length > 0) { - console.log(chalk.yellow(` Missing translations: (${missingKeys.length} keys)`)); - // 按命名空间分组输出 - const groupedKeys = missingKeys.reduce((acc, key) => { - const namespace = key.split('.')[0]; - if (!acc[namespace]) acc[namespace] = []; - acc[namespace].push(key); - return acc; - }, {} as Record); - - Object.entries(groupedKeys) - .sort(([a], [b]) => a.localeCompare(b)) - .forEach(([namespace, keys]) => { - console.log(chalk.cyan(`\n ${namespace}:`)); - keys.forEach(key => { - console.log(chalk.red(` ${key}`)); - }); - }); - } - - if (unusedKeys.length > 0) { - console.log(chalk.yellow(`\n Unused translations: (${unusedKeys.length} keys)`)); - // 按命名空间分组输出 - const groupedKeys = unusedKeys.reduce((acc, key) => { - const namespace = key.split('.')[0]; - if (!acc[namespace]) acc[namespace] = []; - acc[namespace].push(key); - return acc; - }, {} as Record); - - Object.entries(groupedKeys) - .sort(([a], [b]) => a.localeCompare(b)) - .forEach(([namespace, keys]) => { - console.log(chalk.cyan(`\n ${namespace}:`)); - keys.forEach(key => { - console.log(chalk.yellow(` ${key}`)); - }); - }); - } - } - } - } - - if (!hasWarnings) { - console.log(chalk.green('\n✓ All translations are complete and clean!')); - } else { - console.log(chalk.yellow('\n⚠️ Please review the translation issues listed above.')); - } -} - -main().catch(error => { - console.error(chalk.red('Error:'), error); - process.exit(1); -}); diff --git a/scripts/generate-rss.ts b/scripts/generate-rss.ts index 81d9a8d..4c56dbd 100644 --- a/scripts/generate-rss.ts +++ b/scripts/generate-rss.ts @@ -14,22 +14,22 @@ interface LanguageConfig { const LANGUAGES: LanguageConfig[] = [ { - code: 'en', - dataDir: 'en', - title: 'Starset Mirror - Updates', - description: 'Latest updates from Starset Mirror' + code: 'en-US', + dataDir: 'en-US', + title: 'STARSET Mirror Site Updates', + description: 'Latest updates from STARSET Mirror Site' }, { - code: 'zh-Hans', - dataDir: 'zh-Hans', - title: 'Starset Mirror - 更新', - description: 'Starset Mirror 的最新更新' + code: 'zh-CN', + dataDir: 'zh-CN', + title: 'STARSET Mirror 项目动态', + description: 'STARSET Mirror 最新动态' }, { code: 'zh-Hant', - dataDir: 'zh-Hant', - title: 'Starset Mirror - 更新', - description: 'Starset Mirror 的最新更新' + dataDir: 'zh-TW', + title: 'STARSET Mirror 專案動态', + description: 'STARSET Mirror 最新動態' } ]; diff --git a/scripts/generate-sitemap.ts b/scripts/generate-sitemap.ts index db8492e..0c1ce36 100644 --- a/scripts/generate-sitemap.ts +++ b/scripts/generate-sitemap.ts @@ -6,7 +6,7 @@ import xml2js from 'xml2js'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); -const LANGUAGES = ['en', 'zh-Hans', 'zh-Hant']; +const LANGUAGES = ['en-US', 'zh-CN', 'zh-TW']; const BASE_URL = 'mirror.starset.fans'; interface Update { diff --git a/scripts/generate-update-sitemaps.js b/scripts/generate-update-sitemaps.js index 1126697..bc4aeed 100644 --- a/scripts/generate-update-sitemaps.js +++ b/scripts/generate-update-sitemaps.js @@ -6,7 +6,7 @@ import xml2js from 'xml2js'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); -const LANGUAGES = ['en', 'zh-Hans', 'zh-Hant']; +const LANGUAGES = ['en-US', 'zh-CN', 'zh-TW']; const BASE_URL = 'starset.wiki'; // Replace with your actual domain async function getYearlyIndices(lang) { diff --git a/src/components/About.tsx b/src/components/About.tsx index 1472682..ca5d26b 100644 --- a/src/components/About.tsx +++ b/src/components/About.tsx @@ -4,24 +4,22 @@ import iconMap from '../utils/iconMap'; const About = () => { const { t } = useTranslation(); - const aboutData = t('data.about', { returnObjects: true }) || {}; - const socialLinks = t('social.links', { returnObjects: true }) || []; - - if (!aboutData) return null; + const aboutData = t('data.about', { returnObjects: true }); + const socialLinks = t('social.links', { returnObjects: true }); return (

{t('about.title')}

- {aboutData.content?.intro?.map((paragraph: string, index: number) => ( + {aboutData.content.intro.map((paragraph: string, index: number) => (

{paragraph}

))}
- {aboutData.stats?.map((stat: { value: string; label: string }, index: number) => ( + {aboutData.stats.map((stat: { value: string; label: string }, index: number) => (

{stat.value}

{stat.label}

@@ -29,7 +27,7 @@ const About = () => { ))}
- {aboutData.content?.workScope && ( + {aboutData.content.workScope && (

工作范围

    @@ -38,7 +36,7 @@ const About = () => { {index + 1} - {item} + {item} ))}
@@ -69,14 +67,14 @@ const About = () => {

{t('about.join.title')}

- {aboutData.content?.contact?.description} + {aboutData.content.contact.description}

diff --git a/src/components/Comments.tsx b/src/components/Comments.tsx index 183b282..7ecacc3 100644 --- a/src/components/Comments.tsx +++ b/src/components/Comments.tsx @@ -1,6 +1,5 @@ import { useCallback, useRef, useEffect } from 'react' import { useLocation } from 'react-router-dom' -import { useTranslation } from 'react-i18next' import 'artalk/dist/Artalk.css' import Artalk from 'artalk' @@ -10,7 +9,6 @@ interface CommentsProps { const Comments = ({ title }: CommentsProps) => { const { pathname } = useLocation() - const { t } = useTranslation() const artalkRef = useRef() const containerRef = useRef(null) @@ -61,10 +59,10 @@ const Comments = ({ title }: CommentsProps) => { }, [pathname, title]) return ( -
) diff --git a/src/components/Contributors.tsx b/src/components/Contributors.tsx index 7059b00..f9aabe2 100644 --- a/src/components/Contributors.tsx +++ b/src/components/Contributors.tsx @@ -23,8 +23,7 @@ interface Contributor { const Contributors: React.FC = () => { const { t } = useTranslation(); - const contributorsData = t('data.contributors', { returnObjects: true }) || {}; - const members = Array.isArray(contributorsData.members) ? contributorsData.members : []; + const members = t('data.contributors.members', { returnObjects: true }) as Contributor[]; // Fisher-Yates shuffle algorithm const shuffleArray = (array: T[]): T[] => { diff --git a/src/components/LanguageSwitcher.tsx b/src/components/LanguageSwitcher.tsx index 7570ed9..a1a406c 100644 --- a/src/components/LanguageSwitcher.tsx +++ b/src/components/LanguageSwitcher.tsx @@ -3,14 +3,14 @@ import { useTranslation } from 'react-i18next'; import { Globe } from 'lucide-react'; const LanguageSwitcher = () => { - const { i18n, t } = useTranslation(); + const { i18n } = useTranslation(); const [isOpen, setIsOpen] = useState(false); const menuRef = useRef(null); const languages = [ - { code: 'zh-Hans', name: '简体中文' }, - { code: 'zh-Hant', name: '繁體中文' }, - { code: 'en', name: 'English' } + { code: 'zh-CN', name: '简体中文' }, + { code: 'zh-TW', name: '繁體中文' }, + { code: 'en-US', name: 'English' } ]; useEffect(() => { @@ -32,12 +32,9 @@ const LanguageSwitcher = () => { return (
diff --git a/src/components/LoadingSpinner.tsx b/src/components/LoadingSpinner.tsx index 5952e06..cda0d28 100644 --- a/src/components/LoadingSpinner.tsx +++ b/src/components/LoadingSpinner.tsx @@ -5,12 +5,8 @@ const LoadingSpinner: React.FC = () => { const { t } = useTranslation(); return ( -
-
+
+
{t('common.loading')}
); diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 65b0c90..93ae5af 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -34,11 +34,7 @@ const Navbar = () => {
{/* Desktop Navigation */} - +
{/* Mobile Navigation Button */}
@@ -75,11 +71,7 @@ const Navbar = () => { {/* Mobile Navigation Menu */} {isOpen && ( -
+
{navItems.map((item) => ( { const { t } = useTranslation(); - const projectsData = t('data.projects', { returnObjects: true }) || {}; - const projects = Array.isArray(projectsData.projects) ? projectsData.projects : []; + const projects = t('data.projects.projects', { returnObjects: true }) as Project[]; const [selectedTags, setSelectedTags] = useState([]); // 获取所有可用的标签 const allTags = Array.from( - new Set(projects.flatMap(project => project.tags || [])) + new Set(projects.flatMap(project => project.tags)) ); // 根据选中的标签筛选项目 const filteredProjects = selectedTags.length > 0 ? projects.filter(project => - selectedTags.every(tag => (project.tags || []).includes(tag)) + selectedTags.every(tag => project.tags.includes(tag)) ) : projects; @@ -120,7 +119,7 @@ const Projects = () => { {/* 标签区域固定高度 */}
- {(project.tags || []).map((tag) => ( + {project.tags.map((tag) => (
)} -

{getMessage(sponsor)}

+

{sponsor.nickname}

{sponsor.year} diff --git a/src/components/ThemeSwitcher.tsx b/src/components/ThemeSwitcher.tsx index c4b07b0..8946fb2 100644 --- a/src/components/ThemeSwitcher.tsx +++ b/src/components/ThemeSwitcher.tsx @@ -23,16 +23,7 @@ const ThemeSwitcher = () => { items={themes} value={theme} onChange={setTheme} - > - - + /> ); }; diff --git a/src/components/Timeline.tsx b/src/components/Timeline.tsx index 582f08c..fb4090f 100644 --- a/src/components/Timeline.tsx +++ b/src/components/Timeline.tsx @@ -62,7 +62,6 @@ const Pagination: React.FC = ({ const Timeline = () => { const { t, i18n } = useTranslation(); const LANGUAGE_CODE_MAP: Record = { - 'zh-CN': 'zh-Hans', 'zh-TW': 'zh-Hant' }; const [searchParams, setSearchParams] = useSearchParams(); @@ -113,12 +112,8 @@ const Timeline = () => { if (error) { return ( -
-

{t('common.error')}

+
+

{t('updates.error')}

); } @@ -157,7 +152,7 @@ const Timeline = () => { {isLoading ? (
-

{t('updates.loading')}

+

{t('updates.loading')}

) : updates.length > 0 ? ( <> @@ -216,7 +211,7 @@ const Timeline = () => { ) : (
-

{t('updates.notFound.title')}

+

{t('updates.no_results')}

)}
diff --git a/src/components/TranslationBackground.tsx b/src/components/TranslationBackground.tsx index 9c29bc6..8ff1609 100644 --- a/src/components/TranslationBackground.tsx +++ b/src/components/TranslationBackground.tsx @@ -36,33 +36,10 @@ const TranslationBackground = () => { setIsVisible(true); }, []); - const getLanguageName = (language: string) => { - switch (language) { - case 'zh-Hans': - return '简体中文'; - case 'zh-Hant': - return '繁體中文'; - default: - return 'English'; - } - }; - - const getTranslationName = (language: string) => { - switch (language) { - case 'zh-Hans': - case 'zh-Hant': - return '翻译'; - default: - return 'Translation'; - } - }; - const getMainText = (translation: typeof translations.translations[0]) => { switch (i18n.language) { - case 'zh-Hans': case 'zh-CN': return translation.zh_CN; - case 'zh-Hant': case 'zh-TW': return translation.zh_TW; default: @@ -72,9 +49,7 @@ const TranslationBackground = () => { const getSecondaryText = (translation: typeof translations.translations[0]) => { switch (i18n.language) { - case 'zh-Hans': case 'zh-CN': - case 'zh-Hant': case 'zh-TW': return translation.en; default: diff --git a/src/components/ui/Dropdown.tsx b/src/components/ui/Dropdown.tsx index af4b3c4..fbf4de5 100644 --- a/src/components/ui/Dropdown.tsx +++ b/src/components/ui/Dropdown.tsx @@ -1,5 +1,4 @@ import React, { useState, useRef, useEffect } from 'react'; -import { useTranslation } from 'react-i18next'; interface DropdownProps { icon: React.ReactNode; @@ -17,7 +16,6 @@ const Dropdown = ({ icon, items, value, onChange, position = 'right' }: Dropdown const [isOpen, setIsOpen] = useState(false); const dropdownRef = useRef(null); const menuRef = useRef(null); - const { t } = useTranslation(); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { @@ -33,12 +31,9 @@ const Dropdown = ({ icon, items, value, onChange, position = 'right' }: Dropdown return (
diff --git a/src/components/ui/TagFilter.tsx b/src/components/ui/TagFilter.tsx index b2557c7..f7b8ecd 100644 --- a/src/components/ui/TagFilter.tsx +++ b/src/components/ui/TagFilter.tsx @@ -104,11 +104,10 @@ const TagFilter: React.FC = ({ setSearchQuery(e.target.value)} placeholder={t('updates.filter.search_placeholder')} - aria-label={t('aria.search')} + className="w-full px-4 py-2.5 pl-10 text-sm rounded-lg bg-gray-100 dark:bg-gray-700 text-gray-900 dark:text-gray-100 placeholder-gray-500 dark:placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500" />
diff --git a/src/i18n/index.ts b/src/i18n/index.ts index a0d1e58..50626e6 100644 --- a/src/i18n/index.ts +++ b/src/i18n/index.ts @@ -3,42 +3,42 @@ import { initReactI18next } from 'react-i18next'; import LanguageDetector from 'i18next-browser-languagedetector'; // 导入翻译文件 -import zhHansTranslation from '../../data/zh-Hans/index.json'; -import zhHantTranslation from '../../data/zh-Hant/index.json'; -import enTranslation from '../../data/en/index.json'; +import zhCNTranslation from '../../data/zh-CN/index.json'; +import zhTWTranslation from '../../data/zh-TW/index.json'; +import enUSTranslation from '../../data/en-US/index.json'; // 导入数据文件 -import zhHansAbout from '../../data/zh-Hans/about.json'; -import zhHansProjects from '../../data/zh-Hans/projects.json'; -import zhHansContributors from '../../data/zh-Hans/contributors.json'; -import zhHansUpdates from '../../data/zh-Hans/updates.json'; +import zhCNAbout from '../../data/zh-CN/about.json'; +import zhCNProjects from '../../data/zh-CN/projects.json'; +import zhCNContributors from '../../data/zh-CN/contributors.json'; +import zhCNUpdates from '../../data/zh-CN/updates.json'; -import zhHantAbout from '../../data/zh-Hant/about.json'; -import zhHantProjects from '../../data/zh-Hant/projects.json'; -import zhHantContributors from '../../data/zh-Hant/contributors.json'; -import zhHantUpdates from '../../data/zh-Hant/updates.json'; +import zhTWAbout from '../../data/zh-TW/about.json'; +import zhTWProjects from '../../data/zh-TW/projects.json'; +import zhTWContributors from '../../data/zh-TW/contributors.json'; +import zhTWUpdates from '../../data/zh-TW/updates.json'; -import enAbout from '../../data/en/about.json'; -import enProjects from '../../data/en/projects.json'; -import enContributors from '../../data/en/contributors.json'; -import enUpdates from '../../data/en/updates.json'; +import enUSAbout from '../../data/en-US/about.json'; +import enUSProjects from '../../data/en-US/projects.json'; +import enUSContributors from '../../data/en-US/contributors.json'; +import enUSUpdates from '../../data/en-US/updates.json'; i18n .use(LanguageDetector) .use(initReactI18next) .init({ resources: { - 'zh-Hans': { - translation: zhHansTranslation.translation + 'zh-CN': { + translation: zhCNTranslation.translation }, - 'zh-Hant': { - translation: zhHantTranslation.translation + 'zh-TW': { + translation: zhTWTranslation.translation }, - 'en': { - translation: enTranslation.translation + 'en-US': { + translation: enUSTranslation.translation } }, - fallbackLng: 'zh-Hans', + fallbackLng: 'zh-CN', interpolation: { escapeValue: false, }, @@ -48,30 +48,30 @@ i18n }); // 添加数据命名空间 -i18n.addResourceBundle('zh-Hans', 'translation', { +i18n.addResourceBundle('zh-CN', 'translation', { data: { - about: zhHansAbout, - projects: zhHansProjects, - contributors: zhHansContributors, - updates: zhHansUpdates + about: zhCNAbout, + projects: zhCNProjects, + contributors: zhCNContributors, + updates: zhCNUpdates } }, true, true); -i18n.addResourceBundle('zh-Hant', 'translation', { +i18n.addResourceBundle('zh-TW', 'translation', { data: { - about: zhHantAbout, - projects: zhHantProjects, - contributors: zhHantContributors, - updates: zhHantUpdates + about: zhTWAbout, + projects: zhTWProjects, + contributors: zhTWContributors, + updates: zhTWUpdates } }, true, true); -i18n.addResourceBundle('en', 'translation', { +i18n.addResourceBundle('en-US', 'translation', { data: { - about: enAbout, - projects: enProjects, - contributors: enContributors, - updates: enUpdates + about: enUSAbout, + projects: enUSProjects, + contributors: enUSContributors, + updates: enUSUpdates } }, true, true);