You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Qwik-Speak实现Qwik URL路由的动态翻译?

Qwik-Speak实现路由路径的多语言动态切换

可以实现切换语言时动态翻译路由路径并保留原有功能,以下是具体实现方案:

核心思路

通过路由翻译映射、动态路由匹配和多语言路由生成三个环节,将不同语言的路径指向同一组件,同时保证组件的loader、action等原有功能不受影响。

1. 定义路由翻译映射

在Qwik-Speak的翻译资源文件中,为每个路由添加多语言映射:

  • en.json(英文):
{
  "routes": {
    "about": "/about-us"
  }
}
  • sv.json(瑞典语):
{
  "routes": {
    "about": "/om-oss"
  }
}

或者单独维护一个路由映射文件(如route-translations.ts),统一管理各语言的路由对应关系:

export const routeMap = {
  "en-US": { about: "/about-us" },
  "sv-SE": { about: "/om-oss" }
};

2. 生成多语言路由链接

在组件中,不要直接写固定路径,而是通过Qwik-Speak的翻译函数生成对应语言的路由:

import { component$ } from '@builder.io/qwik';
import { useSpeak, useLocale } from 'qwik-speak';

export default component$(() => {
  const { t } = useSpeak();
  const locale = useLocale();

  return (
    <a href={`/${locale}/${t('routes.about')}`}>
      {t('about.pageTitle')}
    </a>
  );
});

3. 配置路由匹配规则

由于Qwik基于文件系统路由,需要将不同语言的路径映射到同一组件:

  • 创建动态路由文件src/routes/[lang]/[...slug]/index.tsx
  • 在loader中根据当前语言和路径slug匹配对应组件:
import { component$, useRouteLoader$ } from '@builder.io/qwik';
import { useLocale } from 'qwik-speak';
import AboutUs from '../about-us/index';

export const useLoader = useRouteLoader$(({ params }) => {
  const locale = useLocale();
  const slug = params.slug;

  // 匹配瑞典语路径到AboutUs组件
  if (locale === 'sv-SE' && slug === 'om-oss') {
    return { Component: AboutUs };
  }
  // 匹配英语路径到AboutUs组件
  if (locale === 'en-US' && slug === 'about-us') {
    return { Component: AboutUs };
  }
  // 其他情况返回404或默认组件
  return { Component: () => <div>404</div> };
});

export default component$(() => {
  const { Component } = useLoader();
  return <Component />;
});

4. 语言切换时的路由跳转

在语言切换逻辑中,解析当前路径并生成对应语言的新路径跳转:

import { $, useNavigate } from '@builder.io/qwik';
import { useSpeak, useLocale } from 'qwik-speak';
import { routeMap } from './route-translations';

// 反向映射:路径到路由键的对应关系
const reverseRouteMap = {
  "/about-us": "about",
  "/om-oss": "about"
};

export const switchLocale = $((newLocale: string) => {
  const navigate = useNavigate();
  const currentLocale = useLocale();
  const currentPath = window.location.pathname.replace(`/${currentLocale}`, '');
  const routeKey = reverseRouteMap[currentPath];
  
  if (routeKey) {
    const newPath = `/${newLocale}${routeMap[newLocale][routeKey]}`;
    navigate(newPath);
  }
});

功能保留说明

所有组件的原有逻辑(如routeLoader$、routeAction$)都能正常工作,因为不同语言的路径最终都会映射到同一个组件文件,组件内部的业务逻辑无需修改。

内容的提问来源于stack exchange,提问作者Ihor Simashko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 15:41:01