mirror of
https://github.com/multica-ai/multica.git
synced 2026-07-29 14:37:44 +02:00
Markdown links like `[xx](/workspaces)` written in `*.zh.mdx` rendered as bare `<a href="/workspaces">`, which Next's basePath rewrote to `/docs/workspaces` and the docs middleware then routed to English — silently kicking Chinese readers out of their locale on every internal click. Add a `LocaleLink` MDX `a` override that runs every internal href through `prefixLocale(href, lang)` before passing it to `next/link`, and wire a `DocsLocaleProvider` around the MDX body in both page entry points so the override and `NumberedCard` know the active locale. External links, in-page anchors, relative paths, already-prefixed paths, and default-language pages are deliberately left untouched. Closes the bug reported in https://github.com/multica-ai/multica/issues/2173. Co-authored-by: multica-agent <github@multica.ai>
53 lines
1.9 KiB
TypeScript
53 lines
1.9 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { prefixLocale } from "./locale-link";
|
|
|
|
describe("prefixLocale", () => {
|
|
it("prefixes root-relative paths with the active non-default locale", () => {
|
|
expect(prefixLocale("/workspaces", "zh")).toBe("/zh/workspaces");
|
|
expect(prefixLocale("/agents-create", "zh")).toBe("/zh/agents-create");
|
|
});
|
|
|
|
it("preserves anchors and query strings on prefixed paths", () => {
|
|
expect(prefixLocale("/providers#claude-code", "zh")).toBe(
|
|
"/zh/providers#claude-code",
|
|
);
|
|
expect(prefixLocale("/agents?from=docs", "zh")).toBe(
|
|
"/zh/agents?from=docs",
|
|
);
|
|
});
|
|
|
|
it("rewrites the bare root path to the locale root", () => {
|
|
expect(prefixLocale("/", "zh")).toBe("/zh");
|
|
});
|
|
|
|
it("leaves the default language untouched (URLs are prefix-less)", () => {
|
|
expect(prefixLocale("/workspaces", "en")).toBe("/workspaces");
|
|
expect(prefixLocale("/", "en")).toBe("/");
|
|
});
|
|
|
|
it("does not double-prefix paths that already carry a known locale", () => {
|
|
expect(prefixLocale("/zh/workspaces", "zh")).toBe("/zh/workspaces");
|
|
expect(prefixLocale("/en/workspaces", "zh")).toBe("/en/workspaces");
|
|
});
|
|
|
|
it("leaves external URLs alone", () => {
|
|
expect(prefixLocale("https://multica.ai/download", "zh")).toBe(
|
|
"https://multica.ai/download",
|
|
);
|
|
expect(prefixLocale("mailto:hello@multica.ai", "zh")).toBe(
|
|
"mailto:hello@multica.ai",
|
|
);
|
|
expect(prefixLocale("tel:+1234567890", "zh")).toBe("tel:+1234567890");
|
|
});
|
|
|
|
it("leaves in-page anchors and relative paths alone", () => {
|
|
expect(prefixLocale("#section", "zh")).toBe("#section");
|
|
expect(prefixLocale("./sibling", "zh")).toBe("./sibling");
|
|
expect(prefixLocale("../sibling", "zh")).toBe("../sibling");
|
|
});
|
|
|
|
it("returns empty/undefined hrefs unchanged", () => {
|
|
expect(prefixLocale("", "zh")).toBe("");
|
|
});
|
|
});
|