fix: 语言切换全面修复 —— 品牌层/主题首页/详情区块/404 全量 i18n(zh 矩阵 13/13)

- 站点品牌双语:每站 brandZh(品牌名/标语/hero/导航/页脚/搜索占位)由生成器写入
  站点 messages 的 zh 覆盖;SiteChrome 改为 async getTranslations 按语言渲染
- 五套主题首页接线 siteHome/hero 命名空间(新增 wire-theme-i18n.py 一次性接线脚本,
  仅处理组件函数体、hook 自动插入、hero 用 th 命名空间)
- 详情页 Use cases/Good for/FAQ/reviewCta、用例与合集索引与详情、提交页、
  对比页、Alternatives 表头与 FAQ 全部走 next-intl
- 404 双语言:locale 内走 next-intl,根级按 Accept-Language
- 修复 zh.json 中 84 处 zhXxx 旁挂键归位 + en.json 残留清理(i18n 694 键一致)
- 回归:/zh 下 13 页全中文无英文残留、无横向溢出;五站 /zh lang=zh 全部正确
This commit is contained in:
AI Directory Platform
2026-09-09 16:59:52 +00:00
parent f4f48f7293
commit 5cc4195d68
50 changed files with 4141 additions and 235 deletions
+298 -3
View File
@@ -53,12 +53,30 @@
"linkedin": "LinkedIn",
"github": "GitHub"
}
},
"site": {
"items": [
"Stories",
"Guides",
"Best Picks",
"Directory",
"Rankings",
"Submit"
],
"hrefs": [
"/blog",
"/ai-tools-for",
"/best",
"/tools",
"/rankings",
"/submit"
]
}
},
"hero": {
"badge": "Discover the Best AI Tools",
"title": "The AI Ledger — AI Tools, Reviewed and Ranked",
"description": "Independent journalism on AI: buying guides, comparisons and a community-ranked directory of the best AI tools.",
"title": "AI tools, reviewed and ranked",
"description": "Guides, comparisons and a community-powered directory of the best AI tools.",
"cta": {
"primary": "Explore Tools",
"secondary": "Read Blog"
@@ -649,7 +667,9 @@
"latest": "Latest",
"trending": "Trending"
},
"clearFilters": "Clear search & filters"
"clearFilters": "Clear search & filters",
"useCasesTitle": "Use cases",
"goodForTitle": "Good for"
},
"seo": {
"home": {
@@ -796,5 +816,280 @@
"new": "New",
"editorsChoice": "Editor's Choice",
"empty": "No tools on this board yet."
},
"siteHome": {
"trending": {
"title": "Trending this week",
"subtitle": "Ranked by votes, reviews and engagement over the last 7 days"
},
"categories": {
"title": "Browse by category",
"viewAll": "All tools"
},
"new": {
"title": "New AI tools"
},
"editors": {
"title": "Editor's Choice"
},
"useCases": {
"title": "Tools by use case",
"subtitle": "What do you want to get done?",
"viewAll": "All use cases"
},
"bestLists": {
"title": "Best AI tool lists",
"subtitle": "Curated rankings by our editors",
"viewAll": "All lists"
},
"reviews": {
"title": "Latest community reviews"
},
"cta": {
"title": "Built an AI tool?",
"body": "Submit it to {brand} and get discovered by thousands of users looking for tools like yours.",
"button": "Submit your tool"
},
"popular": {
"label": "Popular:"
},
"toolsCount": "{count} tools",
"feed": {
"title": "Today's feed",
"browse": "Browse all products"
},
"leaderboard": {
"title": "Leaderboard",
"full": "Full leaderboard"
},
"picks": {
"title": "Editor's picks"
},
"collections": {
"title": "Collections"
},
"launch": {
"button": "Launch your product"
},
"featured": {
"label": "Featured story",
"read": "Read the story"
},
"picksEditorial": {
"label": "Editor's picks"
},
"guides": {
"title": "Buying guides",
"subtitle": "Deep dives that help you choose",
"viewAll": "All guides"
},
"stories": {
"title": "Latest stories",
"viewAll": "All stories"
},
"community": {
"title": "From the community",
"viewAll": "Browse directory"
},
"ship": {
"title": "Ship faster with AI",
"subtitle": "Pick your workflow — we ranked the tools for it",
"viewAll": "All use cases"
},
"upvoted": {
"title": "Most upvoted this week",
"viewAll": "View all"
},
"workflows": {
"title": "Workflows & stacks",
"subtitle": "Batteries-included tool stacks for common dev tasks",
"viewAll": "All workflows"
},
"browseCategory": {
"title": "Browse by category"
},
"trendingNow": {
"title": "Trending now"
},
"seeRankings": "See full rankings",
"browse": "Browse tools",
"noLaunches": "No launches yet — be the first to submit.",
"searchPlaceholder": "Search AI tools...",
"reviewsCount": "{count} reviews",
"mastheadLabel": "INDEPENDENT AI COVERAGE",
"minimalTagline": "AI TOOL SEARCH",
"minimalPlaceholder": "I need to create marketing videos...",
"useCasesBlockTitle": "Use cases",
"goodForBlockTitle": "Good for",
"searchButton": "Search",
"trendingTitle": "Trending this week",
"trendingSubtitle": "Ranked by votes, reviews and engagement over the last 7 days",
"allRankings": "All rankings",
"categoriesTitle": "Browse by category",
"categoriesViewAll": "All tools",
"newTitle": "New AI tools",
"editorsTitle": "Editor's Choice",
"useCasesTitle": "Tools by use case",
"useCasesSubtitle": "What do you want to get done?",
"useCasesViewAll": "All use cases",
"bestListsTitle": "Best AI tool lists",
"bestListsSubtitle": "Curated rankings by our editors",
"bestListsViewAll": "All lists",
"reviewsTitle": "Latest community reviews",
"ctaTitle": "Built an AI tool?",
"ctaBody": "Submit it to {brand} and get discovered by thousands of users looking for tools like yours.",
"ctaButton": "Submit your tool",
"popularLabel": "Popular:",
"feedTitle": "Today's feed",
"feedBrowse": "Browse all products",
"leaderboardTitle": "Leaderboard",
"leaderboardFull": "Full leaderboard",
"picksTitle": "Editor's picks",
"collectionsTitle": "Collections",
"launchButton": "Launch your product",
"featuredLabel": "Featured story",
"featuredRead": "Read the story",
"picksEditorialLabel": "EDITOR'S PICKS",
"guidesTitle": "Buying guides",
"guidesSubtitle": "Deep dives that help you choose",
"guidesViewAll": "All guides",
"storiesTitle": "Latest stories",
"storiesViewAll": "All stories",
"communityTitle": "From the community",
"communityViewAll": "Browse directory",
"shipTitle": "Ship faster with AI",
"shipSubtitle": "Pick your workflow — we ranked the tools for it",
"upvotedTitle": "Most upvoted this week",
"upvotedViewAll": "View all",
"workflowsTitle": "Workflows & stacks",
"workflowsSubtitle": "Batteries-included tool stacks for common dev tasks",
"workflowsViewAll": "All workflows",
"browseCategoryTitle": "Browse by category",
"trendingNowTitle": "Trending now",
"browseButton": "Browse tools",
"toolsCompared": "{count} tools compared",
"popularSearches": [
"writing",
"video",
"coding",
"image"
]
},
"best": {
"indexTitle": "Best AI Tools — Curated Lists",
"indexSubtitle": "Hand-picked rankings, updated with community signal. Every list is labeled and never sold.",
"empty": "No collections published yet.",
"curated": "Curated list",
"faq": "Frequently asked questions",
"more": "More best lists",
"toolsCompared": "{count} tools"
},
"aiToolsFor": {
"indexTitle": "AI tools for what you do",
"indexSubtitle": "Skip the categories. Start from your task or your role — every page ranks tools by real community votes and reviews.",
"byTask": "By task",
"byAudience": "By audience",
"noData": "No use cases yet.",
"noAud": "No audiences yet.",
"noTools": "No tools tagged yet."
},
"submitPage": {
"title": "Submit your AI tool",
"subtitle": "Get a free listing with community votes, user reviews and analytics. Submissions are reviewed by our editors, usually within 48 hours."
},
"faq": {
"title": "Frequently asked questions"
},
"compare": {
"intro": "A side-by-side comparison based on community votes, ratings and reviews — not sponsored placement.",
"leaning": "Right now the community leans toward {name}.",
"label": "Compare",
"noReviews": "—",
"latest": "Latest review"
},
"alternatives": {
"noAlt": "No alternatives found yet.",
"thisTool": "{name} (this tool)",
"table": {
"tool": "Tool",
"rating": "Rating",
"votes": "Votes",
"pricing": "Pricing"
},
"zhTable": {
"tool": "Tool",
"rating": "Rating",
"votes": "Votes",
"pricing": "Pricing"
}
},
"notFound": {
"code": "404",
"title": "Page not found",
"body": "The page you are looking for doesn't exist or may have moved.",
"home": "Back to home",
"tools": "Browse tools"
},
"search": {
"placeholder": "Search 1,000+ AI tools...",
"button": "Search"
},
"siteFooter": {
"groups": [
{
"title": "Read",
"links": [
{
"label": "Latest Stories",
"href": "/blog"
},
{
"label": "Buying Guides",
"href": "/best"
},
{
"label": "Use Case Guides",
"href": "/ai-tools-for"
}
]
},
{
"title": "Directory",
"links": [
{
"label": "All Tools",
"href": "/tools"
},
{
"label": "Community Rankings",
"href": "/rankings"
},
{
"label": "Submit a Tool",
"href": "/submit"
}
]
},
{
"title": "Company",
"links": [
{
"label": "Contact",
"href": "/contact"
},
{
"label": "Terms",
"href": "/terms"
},
{
"label": "Privacy",
"href": "/privacy"
}
]
}
]
},
"siteHeader": {
"searchPlaceholder": "Search the directory..."
}
}
+298 -4
View File
@@ -53,12 +53,29 @@
"linkedin": "领英",
"github": "GitHub"
}
},
"site": {
"items": [
"文章",
"指南",
"最佳推荐",
"目录",
"排行榜",
"提交"
],
"hrefs": [
"/blog",
"/ai-tools-for",
"/best",
"/tools",
"/rankings",
"/submit"
]
}
},
"hero": {
"badge": "发现最好的 AI 工具",
"title": "The AI Ledger — AI 工具评测与排名",
"description": "独立 AI 媒体:深度指南、横向对比,以及由社区排名的 AI 工具目录。",
"title": "AI 工具,评测与排名",
"description": "指南、对比,以及由社区驱动的最佳 AI 工具目录。",
"cta": {
"primary": "探索工具",
"secondary": "阅读博客"
@@ -657,7 +674,9 @@
"latest": "最新",
"trending": "最热"
},
"clearFilters": "清除搜索与筛选"
"clearFilters": "清除搜索与筛选",
"useCasesTitle": "使用场景",
"goodForTitle": "适合人群"
},
"seo": {
"home": {
@@ -804,5 +823,280 @@
"new": "最新收录",
"editorsChoice": "编辑精选",
"empty": "该榜单暂无工具。"
},
"siteHome": {
"trending": {
"title": "本周趋势",
"subtitle": "按最近 7 天投票、评论与互动排名"
},
"categories": {
"title": "按分类浏览",
"viewAll": "全部工具"
},
"new": {
"title": "最新收录"
},
"editors": {
"title": "编辑精选"
},
"useCases": {
"title": "按用例找工具",
"subtitle": "你想完成什么?",
"viewAll": "全部用例"
},
"bestLists": {
"title": "最佳 AI 工具清单",
"subtitle": "编辑精选排名",
"viewAll": "全部清单"
},
"reviews": {
"title": "最新社区评论"
},
"cta": {
"title": "做了 AI 工具?",
"body": "提交到 {brand},让成千上万寻找工具的用户发现你。",
"button": "提交你的工具"
},
"popular": {
"label": "热门:"
},
"toolsCount": "{count} 个工具",
"feed": {
"title": "今日发布流",
"browse": "浏览全部产品"
},
"leaderboard": {
"title": "排行榜",
"full": "完整榜单"
},
"picks": {
"title": "编辑推荐"
},
"collections": {
"title": "合集"
},
"launch": {
"button": "发布你的产品"
},
"featured": {
"label": "头条文章",
"read": "阅读全文"
},
"picksEditorial": {
"label": "编辑推荐"
},
"guides": {
"title": "选购指南",
"subtitle": "帮你做决定的深度对比",
"viewAll": "全部指南"
},
"stories": {
"title": "最新文章",
"viewAll": "全部文章"
},
"community": {
"title": "来自社区",
"viewAll": "浏览目录"
},
"ship": {
"title": "用 AI 加速交付",
"subtitle": "选好工作流,我们为它排好了工具",
"viewAll": "全部用例"
},
"upvoted": {
"title": "本周最多投票",
"viewAll": "查看全部"
},
"workflows": {
"title": "工作流与技术栈",
"subtitle": "常见开发任务的完整工具组合",
"viewAll": "全部工作流"
},
"browseCategory": {
"title": "按分类浏览"
},
"trendingNow": {
"title": "当前趋势"
},
"seeRankings": "查看完整排行",
"browse": "浏览工具",
"noLaunches": "还没有发布——来做第一个。",
"searchPlaceholder": "搜索 AI 工具...",
"reviewsCount": "{count} 条评论",
"mastheadLabel": "独立 AI 报道",
"minimalTagline": "AI 工具搜索",
"minimalPlaceholder": "我需要制作营销视频……",
"useCasesBlockTitle": "使用场景",
"goodForBlockTitle": "适合人群",
"searchButton": "搜索",
"trendingTitle": "本周趋势",
"trendingSubtitle": "按最近 7 天投票、评论与互动排名",
"allRankings": "全部榜单",
"categoriesTitle": "按分类浏览",
"categoriesViewAll": "全部工具",
"newTitle": "最新收录",
"editorsTitle": "编辑精选",
"useCasesTitle": "按用例找工具",
"useCasesSubtitle": "你想完成什么?",
"useCasesViewAll": "全部用例",
"bestListsTitle": "最佳 AI 工具清单",
"bestListsSubtitle": "编辑精选排名",
"bestListsViewAll": "全部清单",
"reviewsTitle": "最新社区评论",
"ctaTitle": "做了 AI 工具?",
"ctaBody": "提交到 {brand},让成千上万寻找工具的用户发现你。",
"ctaButton": "提交你的工具",
"popularLabel": "热门:",
"feedTitle": "今日发布流",
"feedBrowse": "浏览全部产品",
"leaderboardTitle": "排行榜",
"leaderboardFull": "完整榜单",
"picksTitle": "编辑推荐",
"collectionsTitle": "合集",
"launchButton": "发布你的产品",
"featuredLabel": "头条文章",
"featuredRead": "阅读全文",
"picksEditorialLabel": "编辑推荐",
"guidesTitle": "选购指南",
"guidesSubtitle": "帮你做决定的深度对比",
"guidesViewAll": "全部指南",
"storiesTitle": "最新文章",
"storiesViewAll": "全部文章",
"communityTitle": "来自社区",
"communityViewAll": "浏览目录",
"shipTitle": "用 AI 加速交付",
"shipSubtitle": "选好工作流,我们为它排好了工具",
"upvotedTitle": "本周最多投票",
"upvotedViewAll": "查看全部",
"workflowsTitle": "工作流与技术栈",
"workflowsSubtitle": "常见开发任务的完整工具组合",
"workflowsViewAll": "全部工作流",
"browseCategoryTitle": "按分类浏览",
"trendingNowTitle": "当前趋势",
"browseButton": "浏览工具",
"toolsCompared": "{count} 个工具",
"popularSearches": [
"写作",
"视频",
"编程",
"图像"
]
},
"best": {
"indexTitle": "最佳 AI 工具——精选清单",
"indexSubtitle": "人工精选排名,持续吸收社区信号。每个清单都明确标注,永不售卖。",
"empty": "暂无合集。",
"curated": "编辑精选",
"faq": "常见问题",
"more": "更多最佳清单",
"toolsCompared": "{count} 个工具"
},
"aiToolsFor": {
"indexTitle": "按任务找 AI 工具",
"indexSubtitle": "别再翻分类。从你的任务或角色出发——每页都按真实社区投票与评论排名。",
"byTask": "按任务",
"byAudience": "按人群",
"noData": "暂无用例。",
"noAud": "暂无人群。",
"noTools": "暂无关联工具。"
},
"submitPage": {
"title": "提交你的 AI 工具",
"subtitle": "免费收录,获得社区投票、用户评论与数据分析。编辑通常在 48 小时内完成审核。"
},
"faq": {
"title": "常见问题"
},
"compare": {
"intro": "基于社区投票、评分与评论的并排对比——非赞助排名。",
"leaning": "当前社区更倾向 {name}。",
"label": "对比",
"noReviews": "—",
"latest": "最新评论"
},
"alternatives": {
"noAlt": "暂无替代品。",
"thisTool": "{name}(本工具)",
"table": {
"tool": "工具",
"rating": "评分",
"votes": "票数",
"pricing": "定价"
},
"zhTable": {
"tool": "工具",
"rating": "评分",
"votes": "票数",
"pricing": "定价"
}
},
"notFound": {
"code": "404",
"title": "页面不存在",
"body": "你访问的页面不存在或已被移动。",
"home": "返回首页",
"tools": "浏览工具"
},
"search": {
"placeholder": "搜索 1000+ AI 工具...",
"button": "搜索"
},
"siteFooter": {
"groups": [
{
"title": "阅读",
"links": [
{
"label": "Latest Stories",
"href": "/blog"
},
{
"label": "Buying Guides",
"href": "/best"
},
{
"label": "Use Case Guides",
"href": "/ai-tools-for"
}
]
},
{
"title": "目录",
"links": [
{
"label": "All Tools",
"href": "/tools"
},
{
"label": "Community Rankings",
"href": "/rankings"
},
{
"label": "Submit a Tool",
"href": "/submit"
}
]
},
{
"title": "公司",
"links": [
{
"label": "Contact",
"href": "/contact"
},
{
"label": "Terms",
"href": "/terms"
},
{
"label": "Privacy",
"href": "/privacy"
}
]
}
]
},
"siteHeader": {
"searchPlaceholder": "搜索目录..."
}
}
@@ -0,0 +1,2 @@
// 自动生成:[locale]/not-found.tsx 的薄路由
export { default } from "@aidir/core/pages/[locale]/not-found";
+15 -3
View File
@@ -6,13 +6,25 @@ import { locales, defaultLocale, type Locale } from "@aidir/core/i18n.config";
const brandMessages = {
en: {
seo: { home: {"title":"The AI Ledger — AI Tools, Reviewed and Ranked","description":"Independent journalism on AI: buying guides, comparisons and a community-ranked directory of the best AI tools.","ogImage":"/og-image.png"} },
hero: { title: "The AI Ledger — AI Tools, Reviewed and Ranked", description: "Independent journalism on AI: buying guides, comparisons and a community-ranked directory of the best AI tools." },
hero: { title: "AI tools, reviewed and ranked", description: "Guides, comparisons and a community-powered directory of the best AI tools." },
common: { brand: { name: "The AI Ledger", tagline: "Independent journalism on AI tools, with a community-ranked directory." } },
navigation: {
main: { tools: "Stories", blog: "Stories" },
site: { items: ["Stories","Guides","Best Picks","Directory","Rankings","Submit"], hrefs: ["/blog","/ai-tools-for","/best","/tools","/rankings","/submit"] },
},
siteFooter: { groups: [{"title":"Read","links":[{"label":"Latest Stories","href":"/blog"},{"label":"Buying Guides","href":"/best"},{"label":"Use Case Guides","href":"/ai-tools-for"}]},{"title":"Directory","links":[{"label":"All Tools","href":"/tools"},{"label":"Community Rankings","href":"/rankings"},{"label":"Submit a Tool","href":"/submit"}]},{"title":"Company","links":[{"label":"Contact","href":"/contact"},{"label":"Terms","href":"/terms"},{"label":"Privacy","href":"/privacy"}]}] },
siteHeader: { searchPlaceholder: "Search the directory..." },
},
zh: {
seo: { home: {"title":"The AI Ledger — AI 工具评测与排名","description":"独立 AI 媒体:深度指南、横向对比,以及由社区排名的 AI 工具目录。","ogImage":"/og-image.png"} },
hero: { title: "The AI Ledger — AI 工具评测与排名", description: "独立 AI 媒体:深度指南、横向对比,以及由社区排名的 AI 工具目录。" },
common: { brand: { name: "The AI Ledger", tagline: "Independent journalism on AI tools, with a community-ranked directory." } },
hero: { title: "AI 工具,评测与排名", description: "指南、对比,以及由社区驱动的最佳 AI 工具目录。" },
common: { brand: { name: "The AI Ledger", tagline: "独立 AI 报道,附社区排名目录。" } },
navigation: {
main: { tools: "文章", blog: "文章" },
site: { items: ["文章","指南","最佳推荐","目录","排行榜","提交"], hrefs: ["/blog","/ai-tools-for","/best","/tools","/rankings","/submit"] },
},
siteFooter: { groups: [{"title":"阅读","links":[{"label":"Latest Stories","href":"/blog"},{"label":"Buying Guides","href":"/best"},{"label":"Use Case Guides","href":"/ai-tools-for"}]},{"title":"目录","links":[{"label":"All Tools","href":"/tools"},{"label":"Community Rankings","href":"/rankings"},{"label":"Submit a Tool","href":"/submit"}]},{"title":"公司","links":[{"label":"Contact","href":"/contact"},{"label":"Terms","href":"/terms"},{"label":"Privacy","href":"/privacy"}]}] },
siteHeader: { searchPlaceholder: "搜索目录..." },
},
} as const;
+20
View File
@@ -2,6 +2,26 @@ import type { SiteConfig } from "@/kit/types";
// The AI Ledger —— 独立站点的全部品牌/导航/页脚配置
export const siteConfig: SiteConfig = {
"brandZh": {
"name": "The AI Ledger",
"tagline": "独立 AI 报道,附社区排名目录。",
"headline": "AI 工具,评测与排名",
"subheadline": "指南、对比,以及由社区驱动的最佳 AI 工具目录。",
"nav": [
"文章",
"指南",
"最佳推荐",
"目录",
"排行榜",
"提交"
],
"footer": [
"阅读",
"目录",
"公司"
],
"searchPlaceholder": "搜索目录..."
},
"accent": "36 70% 40%",
"port": 3003,
"brand": {
+16 -13
View File
@@ -1,6 +1,7 @@
// 自动生成:站点首页组件(源自底座 editorial 形态,品牌来自 @/site/brand)
import { siteConfig } from "@/site/brand";
import { BookOpen, PenTool, ArrowRight, Star } from "lucide-react";
import { getTranslations } from "next-intl/server";
import { LocaleLink } from "@/components/locale-link";
import { SectionHeader } from "@/kit/section";
import { getHomeDataSafe } from "@/kit/home-data";
@@ -45,6 +46,8 @@ const footerGroups = [
];
async function SiteHome({ locale }: { locale: string }) {
const t = await getTranslations("siteHome");
const th = await getTranslations("hero");
const data = await getHomeDataSafe(6);
const featured = data.articles[0];
const editorPicks = data.editorsChoice.slice(0, 4);
@@ -55,13 +58,13 @@ async function SiteHome({ locale }: { locale: string }) {
<section className="border-b border-border">
<div className="mx-auto max-w-4xl px-4 py-16 text-center sm:px-6 md:py-20">
<p className="text-xs font-medium uppercase tracking-[0.3em] text-muted-foreground">
Independent AI Coverage
{t("mastheadLabel")}
</p>
<h1 className="mt-4 text-4xl font-bold tracking-tight text-foreground md:text-5xl">
{siteConfig.brand.headline}
{th("title")}
</h1>
<p className="mx-auto mt-4 max-w-xl text-base leading-relaxed text-muted-foreground">
{siteConfig.brand.subheadline}
{th("description")}
</p>
</div>
</section>
@@ -72,7 +75,7 @@ async function SiteHome({ locale }: { locale: string }) {
<section>
<div className="mb-4 flex items-center gap-2 text-xs font-semibold uppercase tracking-widest text-primary">
<BookOpen className="h-3.5 w-3.5" />
Featured story
{t("featuredLabel")}
</div>
<LocaleLink href={`/blog/${featured.slug}`} className="group block">
<h2 className="text-2xl font-bold leading-snug text-foreground group-hover:underline md:text-3xl">
@@ -84,7 +87,7 @@ async function SiteHome({ locale }: { locale: string }) {
</p>
)}
<span className="mt-3 inline-flex items-center gap-1 text-sm font-medium text-primary">
Read the story
{t("featuredRead")}
<ArrowRight className="h-3.5 w-3.5 transition-transform group-hover:translate-x-0.5" />
</span>
</LocaleLink>
@@ -96,7 +99,7 @@ async function SiteHome({ locale }: { locale: string }) {
<section>
<div className="mb-4 flex items-center gap-2 text-xs font-semibold uppercase tracking-widest text-primary">
<PenTool className="h-3.5 w-3.5" />
Editor's picks
{t("picksEditorialLabel")}
</div>
<div className="divide-y divide-border border-y border-border">
{editorPicks.map((tool, i) => (
@@ -132,10 +135,10 @@ async function SiteHome({ locale }: { locale: string }) {
{data.collections.length > 0 && (
<section>
<SectionHeader
title="Buying guides"
subtitle="Deep dives that help you choose"
title={t("guidesTitle")}
subtitle={t("guidesSubtitle")}
viewAllHref="/best"
viewAllLabel="All guides"
viewAllLabel={t("guidesViewAll")}
/>
<div className="grid gap-6 sm:grid-cols-2">
{data.collections.slice(0, 4).map((col) => (
@@ -151,7 +154,7 @@ async function SiteHome({ locale }: { locale: string }) {
{locale === "zh" && col.introZh ? col.introZh : col.introEn}
</p>
<p className="mt-2 text-xs uppercase tracking-wide text-muted-foreground">
{col.toolCount} tools compared
{col.toolCount} {t("toolsCompared")}
</p>
</LocaleLink>
))}
@@ -162,7 +165,7 @@ async function SiteHome({ locale }: { locale: string }) {
{/* Latest articles */}
{data.articles.length > 1 && (
<section>
<SectionHeader title="Latest stories" viewAllHref="/blog" />
<SectionHeader title={t("storiesTitle")} viewAllHref="/blog" />
<div className="grid gap-6 sm:grid-cols-2">
{data.articles.slice(1).map((article) => (
<LocaleLink key={article.slug} href={`/blog/${article.slug}`} className="group">
@@ -184,9 +187,9 @@ async function SiteHome({ locale }: { locale: string }) {
{data.latestReviews.length > 0 && (
<section>
<SectionHeader
title="From the community"
title={t("communityTitle")}
viewAllHref="/tools"
viewAllLabel="Browse directory"
viewAllLabel={t("communityViewAll")}
/>
<div className="grid gap-6 sm:grid-cols-2">
{data.latestReviews.slice(0, 4).map((review, i) => (