|
1 | | -import { loadCopydeck } from "./engine"; |
2 | | -import type { CopyDeck } from "./types"; |
| 1 | +import { loadCopydeck } from "./engine.js"; |
| 2 | +import type { CopyDeck } from "./types.js"; |
3 | 3 |
|
4 | | -/** |
5 | | - * Loads a copydeck from /copydecks/{locale}/copydeck.json. |
6 | | - * Falls back to a base language (e.g. "en" from "en-GB") or "en". |
7 | | - */ |
8 | | -export async function loadCopydeckFor(locale: string = "en"): Promise<CopyDeck> { |
| 4 | +type Options = { base?: string }; |
| 5 | + |
| 6 | +export async function loadCopydeckFor(locale = "en", opts: Options = {}): Promise<CopyDeck> { |
9 | 7 | const tryLocales = [locale]; |
10 | | - const base = locale.split("-")[0]; |
11 | | - if (base !== locale) tryLocales.push(base); |
| 8 | + const baseLang = locale.split("-")[0]; |
| 9 | + if (baseLang !== locale) tryLocales.push(baseLang); |
12 | 10 | if (!tryLocales.includes("en")) tryLocales.push("en"); |
13 | 11 |
|
| 12 | + const baseUrl = opts.base |
| 13 | + ? new URL(opts.base, window.location.origin) |
| 14 | + : new URL("./copydecks/", import.meta.url); |
| 15 | + |
14 | 16 | for (const lang of tryLocales) { |
15 | 17 | try { |
16 | | - const res = await fetch(`/copydecks/${lang}/copydeck.json`); |
| 18 | + const url = new URL(`${lang}/copydeck.json`, baseUrl).toString(); |
| 19 | + const res = await fetch(url); |
17 | 20 | if (res.ok) { |
18 | | - const deck = await res.json(); |
| 21 | + const deck = (await res.json()) as CopyDeck; |
19 | 22 | loadCopydeck(deck); |
20 | 23 | return deck; |
21 | 24 | } |
22 | | - } catch { |
23 | | - /* try next */ |
24 | | - } |
| 25 | + } catch { /* try next */ } |
25 | 26 | } |
26 | 27 | throw new Error(`No copydeck found for ${tryLocales.join(", ")}`); |
27 | 28 | } |
| 29 | + |
0 commit comments