mirror of
https://github.com/Novaloop-AG/healthchat-web.git
synced 2026-11-10 09:15:16 +00:00
13696af194
* Split translations between EW and shared components Uses update module API with global TranslationKey type that can be overridden. WIP. * Removed the wrong script (for now) * Add the type files * Add shared components i18n file * More i18n strings * Add i18n check for shared conmponents * Needs a different name * rerun i18n for merge from develop, fix test * Move translated strings to shared components file NB. there are lots of removed strings for a few languages where we seem to have hit a localazy bug or something where the key/value for plurals got switched, making the translations invalid. They've been missing for a while so I'm removing them rather than trying to restore them, * Add shared components files to localazy * Merge element web & shared component translations for the built app * Use right translations for shared component tests and fix missign en_EN strings * Pull shared components translations too * Fix/disable warnings * We can now remove the build:res call ...right? (right?) * Remove webpack import for languages index ..and just load it using a relative path which we do for the individual language files and also did anyway for the index because even in non-test it was an object, not a string, so we always usesd the 'test' code path. * Make the storybook language selector work ...without referring to the parent app's files * Revert unnecessary yarn lock change * Typo Co-authored-by: Michael Telatynski <7t3chguy@gmail.com> * Add comment on why we use merge * Fix localazy download config to actually put the translations in the right place * Better typescript syntax Co-authored-by: Michael Telatynski <7t3chguy@gmail.com> * Watch both translations files --------- Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
88 lines
3.7 KiB
TypeScript
88 lines
3.7 KiB
TypeScript
/*
|
|
Copyright 2025 New Vector Ltd.
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
|
|
Please see LICENSE files in the repository root for full details.
|
|
*/
|
|
|
|
import type { StorybookConfig } from "@storybook/react-vite";
|
|
import path from "node:path";
|
|
import fs from "node:fs";
|
|
import { nodePolyfills } from "vite-plugin-node-polyfills";
|
|
import { mergeConfig } from "vite";
|
|
|
|
// Get a list of available languages so the language selector can display them at runtime
|
|
const languages = fs.readdirSync("src/i18n/strings").map((f) => f.slice(0, -5));
|
|
|
|
const config: StorybookConfig = {
|
|
stories: ["../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"],
|
|
addons: ["@storybook/addon-docs", "@storybook/addon-designs", "@storybook/addon-a11y"],
|
|
framework: "@storybook/react-vite",
|
|
core: {
|
|
disableTelemetry: true,
|
|
},
|
|
typescript: {
|
|
reactDocgen: "react-docgen-typescript",
|
|
},
|
|
async viteFinal(config) {
|
|
return mergeConfig(config, {
|
|
resolve: {
|
|
alias: {
|
|
// Alias used by i18n.tsx
|
|
$webapp: path.resolve("../../webapp"),
|
|
},
|
|
},
|
|
plugins: [
|
|
// Needed for counterpart to work
|
|
nodePolyfills({ include: ["process", "util"] }),
|
|
{
|
|
name: "language-middleware",
|
|
configureServer(server) {
|
|
server.middlewares.use((req, res, next) => {
|
|
if (req.url === "/i18n/languages.json") {
|
|
// Dynamically generate a languages.json file based on what files are available
|
|
const langJson: Record<string, string> = {};
|
|
for (const lang of languages) {
|
|
const normalizedLanguage = lang.toLowerCase().replace("_", "-");
|
|
const languageParts = normalizedLanguage.split("-");
|
|
if (languageParts.length === 2 && languageParts[0] === languageParts[1]) {
|
|
langJson[languageParts[0]] = `${lang}.json`;
|
|
} else {
|
|
langJson[normalizedLanguage] = `${lang}.json`;
|
|
}
|
|
}
|
|
|
|
res.setHeader("Content-Type", "application/json");
|
|
res.end(JSON.stringify(langJson));
|
|
} else if (req.url?.startsWith("/i18n/")) {
|
|
// Serve the individual language files, which annoyingly can't be a simple
|
|
// static dir because the directory structure in src doesn't match what
|
|
// the app requests.
|
|
const langFile = req.url.split("/").pop();
|
|
res.setHeader("Content-Type", "application/json");
|
|
fs.createReadStream(`src/i18n/strings/${langFile}`).pipe(res);
|
|
} else {
|
|
next();
|
|
}
|
|
});
|
|
},
|
|
},
|
|
],
|
|
server: {
|
|
allowedHosts: ["localhost", ".docker.internal"],
|
|
},
|
|
});
|
|
},
|
|
refs: {
|
|
"compound-web": {
|
|
title: "Compound Web",
|
|
url: "https://element-hq.github.io/compound-web/",
|
|
},
|
|
},
|
|
env: (config) => ({
|
|
...config,
|
|
STORYBOOK_LANGUAGES: JSON.stringify(languages),
|
|
}),
|
|
};
|
|
export default config;
|