mirror of
https://github.com/element-hq/element-call.git
synced 2026-09-10 05:06:16 +00:00
The component bundled English alone: the standalone app fetches its locale files at runtime from URLs its own build emits, which a host serving the library from elsewhere could not resolve, so bundling one language was the self-contained option. Now every locale is a chunk of its own that the host's bundler loads the first time it is needed, with English still bundled in so that the fallback never waits. Element Call starts in the browser's language and follows the host's own setting through a `language` prop; `supportedLanguages` says what it accepts. Translations are shared by every Element Call on the page, so the most recently set language wins for all of them. The harness gets a language picker, and the app and the component share the parsing of locale paths. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
47 lines
1.5 KiB
TypeScript
47 lines
1.5 KiB
TypeScript
/*
|
|
Copyright 2026 Element Creations Ltd.
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
|
|
Please see LICENSE in the repository root for full details.
|
|
*/
|
|
|
|
import { describe, expect, test } from "vitest";
|
|
|
|
import { supportedLanguages, translationsBackend } from "./localization";
|
|
|
|
const read = async (
|
|
language: string,
|
|
namespace = "app",
|
|
): Promise<Record<string, unknown>> =>
|
|
await new Promise((resolve, reject) =>
|
|
translationsBackend.read(language, namespace, (error, data) => {
|
|
if (error) reject(error);
|
|
else resolve(data as Record<string, unknown>);
|
|
}),
|
|
);
|
|
|
|
describe("component translations", () => {
|
|
test("offer every language in locales/, tagged as its directory is", () => {
|
|
expect(supportedLanguages).toContain("en");
|
|
expect(supportedLanguages).toContain("de");
|
|
expect(supportedLanguages).toContain("zh-Hans");
|
|
expect(new Set(supportedLanguages).size).toBe(supportedLanguages.length);
|
|
});
|
|
|
|
test("load a language's translations on demand", async () => {
|
|
const de = await read("de");
|
|
expect(de).toHaveProperty("action");
|
|
expect(de).not.toEqual(await read("en"));
|
|
});
|
|
|
|
test("refuse a language there are no translations for", async () => {
|
|
await expect(read("xx")).rejects.toThrow("No app translations for xx");
|
|
});
|
|
|
|
test("refuse a namespace there are no translations for", async () => {
|
|
await expect(read("en", "other")).rejects.toThrow(
|
|
"No other translations for en",
|
|
);
|
|
});
|
|
});
|