Files
FastGPT/document/lib/localized-navigation.ts
Archer 2fd4b6030b feat(i18n): Fix language loss in navigation and add language selector (#6467)
* feat(docs): enable i18n language selector

* docs(i18n): translate introduction page to English

* fix(i18n): fix language switching issue by always showing locale prefix

* fix(docs): use relative paths for internal links to preserve language

* refactor(i18n): add getLocalizedPath helper to simplify URL generation

* refactor(i18n): make getLocalizedPath respect hideLocale config

* feat(i18n): fallback to default language when translation missing, keep URL unchanged

* feat(i18n): fix language loss in navigation and add language selector

- Set hideLocale to 'never' to always show language prefix
- Add localized-navigation.ts with useLocalizedRouter hook
- Update all navigation points to preserve language:
  1. Tab navigation (already using getLocalizedPath)
  2. Sidebar navigation (handled by Fumadocs)
  3. Home/404 redirects (using getLocalizedPath)
  4. MDX Redirect component (using useLocalizedRouter)
  5. Old page redirects (updated not-found.tsx)
  6. Document links (custom LocalizedLink component)
- Configure language selector in layout.config.tsx
- Add LOCALIZED_NAVIGATION.md documentation

* fix(i18n): fix type errors and useEffect dependencies

* refactor(i18n): move redirects to middleware for SSR support

- Move old path redirects from client-side (not-found.tsx) to server-side (middleware.ts)
- Use 301 permanent redirects for better SEO
- Preserve language prefix in redirects
- Fix SSR issue caused by client-side redirects

* refactor(i18n): clean up not-found.tsx, remove duplicate redirect maps

- Remove duplicate exactMap and prefixMap (now in middleware)
- Keep dynamic meta.json lookup for unknown pages
- Simplify to only handle fallback cases
- Two-layer approach: middleware (SSR) + not-found (dynamic)

* refactor(i18n): simplify not-found to always redirect to introduction

- Remove dynamic meta.json lookup
- Always redirect to introduction page on 404
- Ensures no 404 pages are shown
- Keep language prefix in redirect

* fix(i18n): fix middleware type error with ts-expect-error

- Add @ts-expect-error for Fumadocs middleware signature mismatch
- Fix syntax error in config matcher (remove literal \n)

---------

Co-authored-by: archer <archer@archerdeMac-mini.local>
2026-02-26 16:29:03 +08:00

54 lines
1.3 KiB
TypeScript

'use client';
import { useRouter, usePathname } from 'next/navigation';
import { i18n, getLocalizedPath } from './i18n';
/**
* Get current language from pathname
*/
export function useCurrentLang(): string {
const pathname = usePathname();
// Extract language from pathname (e.g., /zh-CN/docs/... -> zh-CN)
const segments = pathname.split('/').filter(Boolean);
const firstSegment = segments[0];
// Check if first segment is a valid language
if (i18n.languages.includes(firstSegment)) {
return firstSegment;
}
return i18n.defaultLanguage;
}
/**
* Get localized path for current language
*/
export function useLocalizedPath(path: string): string {
const lang = useCurrentLang();
return getLocalizedPath(path, lang);
}
/**
* Router with automatic language prefix handling
*/
export function useLocalizedRouter() {
const router = useRouter();
const lang = useCurrentLang();
return {
push: (path: string) => {
router.push(getLocalizedPath(path, lang));
},
replace: (path: string) => {
router.replace(getLocalizedPath(path, lang));
},
prefetch: (path: string) => {
router.prefetch(getLocalizedPath(path, lang));
},
back: () => router.back(),
forward: () => router.forward(),
refresh: () => router.refresh(),
};
}