Skip to content

Commit 56339a9

Browse files
ericyangpanclaude
andcommitted
refactor(i18n): use localized Link/router from i18n/navigation
Remove hardcoded locale prefixes from all link hrefs and router navigation throughout the application. Use i18n-aware Link component and router from @/i18n/navigation which automatically handles locale prefixes. This refactoring: - Removes manual locale path construction (e.g., `/${locale}/path`) - Uses localized Link/router for automatic locale prefix injection - Removes unused locale parameters where no longer needed - Improves consistency across all navigation components 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent ee40317 commit 56339a9

File tree

16 files changed

+43
-43
lines changed

16 files changed

+43
-43
lines changed

src/app/[locale]/clis/comparison/page.client.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ type Props = {
1717
locale: string
1818
}
1919

20-
export default function CLIComparisonPageClient({ locale }: Props) {
20+
export default function CLIComparisonPageClient({ locale: _locale }: Props) {
2121
const t = useTranslations('pages.comparison')
2222
const tCommunity = useTranslations('shared.platforms')
2323
const tGlobal = useTranslations()
@@ -304,7 +304,7 @@ export default function CLIComparisonPageClient({ locale }: Props) {
304304
<ComparisonTable
305305
items={clis as unknown as Record<string, unknown>[]}
306306
columns={columns}
307-
itemLinkPrefix={`/${locale}/clis`}
307+
itemLinkPrefix={`/clis`}
308308
/>
309309
</div>
310310
</section>
@@ -313,7 +313,7 @@ export default function CLIComparisonPageClient({ locale }: Props) {
313313
<section className="py-[var(--spacing-lg)] border-b border-[var(--color-border)]">
314314
<div className="max-w-8xl mx-auto px-[var(--spacing-md)]">
315315
<Link
316-
href={`/${locale}/clis`}
316+
href="/clis"
317317
className="inline-flex items-center gap-[var(--spacing-xs)] text-sm text-[var(--color-text-secondary)] hover:text-[var(--color-text)] transition-colors"
318318
>
319319
{t('clis.backTo')}

src/app/[locale]/clis/page.client.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ export default function CLIsPageClient({ locale }: Props) {
104104
subtitle={t('subtitle')}
105105
action={
106106
<Link
107-
href={`/${locale}/clis/comparison`}
107+
href="/clis/comparison"
108108
className="text-sm px-[var(--spacing-md)] py-[var(--spacing-xs)] border border-[var(--color-border)] hover:border-[var(--color-border-strong)] transition-colors"
109109
>
110110
{t('compareAll')}
@@ -134,7 +134,7 @@ export default function CLIsPageClient({ locale }: Props) {
134134
{filteredAndSortedClis.map(cli => (
135135
<Link
136136
key={cli.name}
137-
href={`/${locale}/clis/${cli.id}`}
137+
href={`/clis/${cli.id}`}
138138
className="block border border-[var(--color-border)] p-[var(--spacing-md)] hover:border-[var(--color-border-strong)] transition-all hover:-translate-y-0.5 group flex flex-col"
139139
>
140140
<div className="flex justify-between items-start mb-[var(--spacing-sm)]">

src/app/[locale]/extensions/comparison/page.client.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ type Props = {
1616
locale: string
1717
}
1818

19-
export default function ExtensionComparisonPageClient({ locale }: Props) {
19+
export default function ExtensionComparisonPageClient({ locale: _locale }: Props) {
2020
const t = useTranslations('pages.comparison')
2121
const tCommunity = useTranslations('shared.platforms')
2222
const tGlobal = useTranslations()
@@ -290,7 +290,7 @@ export default function ExtensionComparisonPageClient({ locale }: Props) {
290290
<ComparisonTable
291291
items={extensions as unknown as Record<string, unknown>[]}
292292
columns={columns}
293-
itemLinkPrefix={`/${locale}/extensions`}
293+
itemLinkPrefix={`/extensions`}
294294
/>
295295
</div>
296296
</section>
@@ -299,7 +299,7 @@ export default function ExtensionComparisonPageClient({ locale }: Props) {
299299
<section className="py-[var(--spacing-lg)] border-b border-[var(--color-border)]">
300300
<div className="max-w-8xl mx-auto px-[var(--spacing-md)]">
301301
<Link
302-
href={`/${locale}/extensions`}
302+
href="/extensions"
303303
className="inline-flex items-center gap-[var(--spacing-xs)] text-sm text-[var(--color-text-secondary)] hover:text-[var(--color-text)] transition-colors"
304304
>
305305
{t('extensions.backTo')}

src/app/[locale]/extensions/page.client.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ export default function ExtensionsPageClient({ locale }: Props) {
105105
subtitle={t('subtitle')}
106106
action={
107107
<Link
108-
href={`/${locale}/extensions/comparison`}
108+
href="/extensions/comparison"
109109
className="text-sm px-[var(--spacing-md)] py-[var(--spacing-xs)] border border-[var(--color-border)] hover:border-[var(--color-border-strong)] transition-colors"
110110
>
111111
{t('compareAll')}
@@ -137,7 +137,7 @@ export default function ExtensionsPageClient({ locale }: Props) {
137137
{filteredAndSortedExtensions.map(extension => (
138138
<Link
139139
key={extension.name}
140-
href={`/${locale}/extensions/${extension.id}`}
140+
href={`/extensions/${extension.id}`}
141141
className="block border border-[var(--color-border)] p-[var(--spacing-md)] hover:border-[var(--color-border-strong)] transition-all hover:-translate-y-0.5 group flex flex-col"
142142
>
143143
<div className="flex justify-between items-start mb-[var(--spacing-sm)]">

src/app/[locale]/ides/comparison/page.client.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ type Props = {
1717
locale: string
1818
}
1919

20-
export default function IDEComparisonPageClient({ locale }: Props) {
20+
export default function IDEComparisonPageClient({ locale: _locale }: Props) {
2121
const t = useTranslations('pages.comparison')
2222
const tCommunity = useTranslations('shared.platforms')
2323
const tGlobal = useTranslations()
@@ -303,7 +303,7 @@ export default function IDEComparisonPageClient({ locale }: Props) {
303303
<ComparisonTable
304304
items={ides as unknown as Record<string, unknown>[]}
305305
columns={columns}
306-
itemLinkPrefix={`/${locale}/ides`}
306+
itemLinkPrefix={`/ides`}
307307
/>
308308
</div>
309309
</section>
@@ -312,7 +312,7 @@ export default function IDEComparisonPageClient({ locale }: Props) {
312312
<section className="py-[var(--spacing-lg)] border-b border-[var(--color-border)]">
313313
<div className="max-w-8xl mx-auto px-[var(--spacing-md)]">
314314
<Link
315-
href={`/${locale}/ides`}
315+
href="/ides"
316316
className="inline-flex items-center gap-[var(--spacing-xs)] text-sm text-[var(--color-text-secondary)] hover:text-[var(--color-text)] transition-colors"
317317
>
318318
{t('ides.backTo')}

src/app/[locale]/ides/page.client.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ export default function IDEsPageClient({ locale }: Props) {
104104
subtitle={t('subtitle')}
105105
action={
106106
<Link
107-
href={`/${locale}/ides/comparison`}
107+
href="/ides/comparison"
108108
className="text-sm px-[var(--spacing-md)] py-[var(--spacing-xs)] border border-[var(--color-border)] hover:border-[var(--color-border-strong)] transition-colors"
109109
>
110110
{t('compareAll')}
@@ -134,7 +134,7 @@ export default function IDEsPageClient({ locale }: Props) {
134134
{filteredAndSortedIdes.map(ide => (
135135
<Link
136136
key={ide.name}
137-
href={`/${locale}/ides/${ide.id}`}
137+
href={`/ides/${ide.id}`}
138138
className="block border border-[var(--color-border)] p-[var(--spacing-md)] hover:border-[var(--color-border-strong)] transition-all hover:-translate-y-0.5 group flex flex-col"
139139
>
140140
<div className="flex justify-between items-start mb-[var(--spacing-sm)]">

src/app/[locale]/model-providers/page.client.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ export default function ModelProvidersPageClient({ locale }: Props) {
9191
{foundationModelProviders.map(provider => (
9292
<Link
9393
key={provider.name}
94-
href={`/${locale}/model-providers/${provider.id}`}
94+
href={`/model-providers/${provider.id}`}
9595
className="block border border-[var(--color-border)] p-[var(--spacing-md)] hover:border-[var(--color-border-strong)] transition-all hover:-translate-y-0.5 group"
9696
>
9797
<div className="flex justify-between items-start mb-[var(--spacing-sm)]">
@@ -116,7 +116,7 @@ export default function ModelProvidersPageClient({ locale }: Props) {
116116
{modelServiceProviders.map(provider => (
117117
<Link
118118
key={provider.name}
119-
href={`/${locale}/model-providers/${provider.id}`}
119+
href={`/model-providers/${provider.id}`}
120120
className="block border border-[var(--color-border)] p-[var(--spacing-md)] hover:border-[var(--color-border-strong)] transition-all hover:-translate-y-0.5 group"
121121
>
122122
<div className="flex justify-between items-start mb-[var(--spacing-sm)]">

src/app/[locale]/models/comparison/page.client.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ type Props = {
1313
locale: string
1414
}
1515

16-
export default function ModelComparisonPageClient({ locale }: Props) {
16+
export default function ModelComparisonPageClient({ locale: _locale }: Props) {
1717
const t = useTranslations('pages.comparison')
1818
const tGlobal = useTranslations()
1919
const tCommunity = useTranslations('shared.platforms')
@@ -165,7 +165,7 @@ export default function ModelComparisonPageClient({ locale }: Props) {
165165
<ComparisonTable
166166
items={models as unknown as Record<string, unknown>[]}
167167
columns={columns}
168-
itemLinkPrefix={`/${locale}/models`}
168+
itemLinkPrefix={`/models`}
169169
/>
170170
</div>
171171
</section>
@@ -174,7 +174,7 @@ export default function ModelComparisonPageClient({ locale }: Props) {
174174
<section className="py-[var(--spacing-lg)] border-b border-[var(--color-border)]">
175175
<div className="max-w-8xl mx-auto px-[var(--spacing-md)]">
176176
<Link
177-
href={`/${locale}/models`}
177+
href="/models"
178178
className="inline-flex items-center gap-[var(--spacing-xs)] text-sm text-[var(--color-text-secondary)] hover:text-[var(--color-text)] transition-colors"
179179
>
180180
{t('models.backTo')}

src/app/[locale]/models/page.client.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ export default function ModelsPageClient({ locale }: Props) {
6868
subtitle={t('subtitle')}
6969
action={
7070
<Link
71-
href={`/${locale}/models/comparison`}
71+
href="/models/comparison"
7272
className="text-sm px-[var(--spacing-md)] py-[var(--spacing-xs)] border border-[var(--color-border)] hover:border-[var(--color-border-strong)] transition-colors"
7373
>
7474
{t('compareAll')}
@@ -93,7 +93,7 @@ export default function ModelsPageClient({ locale }: Props) {
9393
{filteredModels.map(model => (
9494
<Link
9595
key={model.name}
96-
href={`/${locale}/models/${model.id}`}
96+
href={`/models/${model.id}`}
9797
className="block border border-[var(--color-border)] p-[var(--spacing-md)] hover:border-[var(--color-border-strong)] transition-all hover:-translate-y-0.5 group"
9898
>
9999
<div className="flex justify-between items-start mb-[var(--spacing-sm)]">

src/app/[locale]/search/page.client.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
'use client'
22

3-
import { useRouter, useSearchParams } from 'next/navigation'
3+
import { useSearchParams } from 'next/navigation'
44
import { useTranslations } from 'next-intl'
55
import { useEffect, useMemo, useState } from 'react'
66
import SearchInput from '@/components/controls/SearchInput'
77
import Footer from '@/components/Footer'
88
import Header from '@/components/Header'
9-
import { Link } from '@/i18n/navigation'
9+
import { Link, useRouter } from '@/i18n/navigation'
1010
import type { SearchResult } from '@/lib/search'
1111
import { search } from '@/lib/search'
1212

@@ -44,13 +44,14 @@ export default function SearchPageClient({ locale, initialQuery }: Props) {
4444
if (searchQuery.trim()) {
4545
params.set('q', searchQuery.trim())
4646
}
47-
router.push(`/${locale}/search?${params.toString()}`)
47+
// Use i18n router which automatically handles locale prefix
48+
router.push(`/search?${params.toString()}`)
4849
setTimeout(() => setIsSearching(false), 300)
4950
}
5051

5152
// Get category route
5253
const getCategoryRoute = (category: string, id: string) => {
53-
return `/${locale}/${category}/${id}`
54+
return `/${category}/${id}`
5455
}
5556

5657
return (

0 commit comments

Comments
 (0)