SvelteKit路由匹配器中如何获取前置路由匹配结果?
解决国际化URL路由匹配中获取前置语言参数的问题
核心思路
通过共享的国际化路由配置,结合服务端/客户端的路径解析逻辑,在子路由匹配器中获取前置语言参数,验证路由与语言的对应关系,无效组合直接返回404。
步骤1:创建全局路由映射配置
新建全局配置文件(比如i18n-routes.js),维护语言与路由的唯一对应关系:
// 语言-路由映射表,确保每种语言的路由一一对应 export const routeMap = { en: { privacy: 'privacy' }, es: { privacy: 'privacidad' } }; // 允许的语言列表 export const validLangs = Object.keys(routeMap);
步骤2:验证语言参数有效性
在[lang=lang].js匹配器中,校验语言是否在允许列表内:
import { validLangs } from '$lib/i18n-routes'; export function match(param) { return validLangs.includes(param); }
步骤3:在子路由匹配器中校验语言与路由的对应关系
在[route1=route1].js匹配器中,分别处理服务端和客户端的路径解析,获取前置语言参数,再验证当前路由是否属于该语言的有效路由:
import { routeMap } from '$lib/i18n-routes'; export function match(param, context) { let lang; // 服务端环境:从请求URL解析语言参数 if (context?.request) { const pathSegments = new URL(context.request.url).pathname.split('/').filter(Boolean); lang = pathSegments[0]; } // 客户端环境:从当前页面路径解析语言参数 else if (typeof window !== 'undefined') { const pathSegments = window.location.pathname.split('/').filter(Boolean); lang = pathSegments[0]; } // 无法获取语言参数时,直接返回不匹配 else { return false; } // 校验当前路由是否属于该语言的有效路由 return routeMap[lang] ? Object.values(routeMap[lang]).includes(param) : false; }
效果验证
- 访问
/en/privacy:语言和路由匹配,正常加载页面 - 访问
/es/privacidad:语言和路由匹配,正常加载页面 - 访问
/en/privacidad:路由不属于英语的有效路由,匹配器返回false,触发404
内容的提问来源于stack exchange,提问作者DShook
相关产品推荐
相关产品推荐

