语言切换
Methanol 采用“按目录”组织多语言结构:若某目录的 index.mdx 配置了 lang 属性,该目录即被识别为独立的语言入口。
模板中可获取以下上下文:
ctx.languages:语言入口列表ctx.language:当前激活的语言入口(没有则为null)
每个入口包含 routePath, routeHref, label, code。
基于 <select> 的简单切换器
const LanguageSwitch = ({ ctx }) => {
const languages = Array.isArray(ctx.languages) ? ctx.languages : []
if (!languages.length) return null
const currentHref = ctx.language?.routeHref || null
return (
<select
aria-label="Select language"
onchange="location.href=this.value"
value={currentHref || undefined}
>
{languages.map((lang) => (
<option value={lang.routeHref} selected={lang.routeHref === currentHref ? true : null}>
{lang.label}
</option>
))}
</select>
)
}
基于链接列表的切换器
const LanguageLinks = ({ ctx }) => {
const languages = Array.isArray(ctx.languages) ? ctx.languages : []
if (!languages.length) return null
const currentHref = ctx.language?.routeHref
return (
<nav aria-label="Languages">
{languages.map((lang) => (
<a href={lang.routeHref} aria-current={lang.routeHref === currentHref ? 'page' : null}>
{lang.label}
</a>
))}
</nav>
)
}
注意事项
- 链接建议使用
routeHref(自动包含site.base)。 - 建议配合
isRoot: true配置语言根目录,确保每种语言拥有独立的导航树结构。