taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit 6e90585334346fee433de72689780e9ba3d68519
parent d9437ccfe338af2fd2bae1bcc8b86a3203d78b6e
Author: Sebastian <sebasjm@taler-systems.com>
Date:   Mon,  9 Feb 2026 11:26:26 -0300

fix #11033

Diffstat:
Mpackages/aml-backoffice-ui/src/App.tsx | 8+-------
Mpackages/bank-ui/src/app.tsx | 14+-------------
Mpackages/kyc-ui/src/app.tsx | 8+-------
Mpackages/merchant-backoffice-ui/src/Application.tsx | 24+++++++++---------------
Mpackages/web-util/src/context/translation.ts | 45++++++++++++++++++++-------------------------
Mpackages/web-util/src/hooks/useLang.ts | 7++++++-
6 files changed, 38 insertions(+), 68 deletions(-)

diff --git a/packages/aml-backoffice-ui/src/App.tsx b/packages/aml-backoffice-ui/src/App.tsx @@ -55,13 +55,7 @@ export function App(): VNode { const baseUrl = getInitialBackendBaseURL(settings.backendBaseURL); return ( <UiSettingsProvider value={settings}> - <TranslationProvider - source={strings} - completeness={{ - es: strings["es"].completeness ?? 0, - de: strings["de"].completeness ?? 0, - }} - > + <TranslationProvider source={strings}> <ExchangeApiProvider baseUrl={new URL("/", baseUrl)} frameOnError={ExchangeAmlFrame} diff --git a/packages/bank-ui/src/app.tsx b/packages/bank-ui/src/app.tsx @@ -61,19 +61,7 @@ export function App() { const baseUrl = getInitialBackendBaseURL(settings.backendBaseURL); return ( <SettingsProvider value={settings}> - <TranslationProvider - source={strings} - completeness={{ - uk: strings["uk"].completeness, - // tr: strings["tr"].completeness, - ru: strings["ru"].completeness, - // sv: strings["sv"].completeness, - it: strings["it"].completeness, - fr: strings["fr"].completeness, - es: strings["es"].completeness, - de: strings["de"].completeness, - }} - > + <TranslationProvider source={strings}> <SubApp baseUrl={baseUrl} /> </TranslationProvider> </SettingsProvider> diff --git a/packages/kyc-ui/src/app.tsx b/packages/kyc-ui/src/app.tsx @@ -58,13 +58,7 @@ export function App(): VNode { const baseUrl = getInitialBackendBaseURL(settings.backendBaseURL); return ( <SettingsProvider value={settings}> - <TranslationProvider - source={strings} - completeness={{ - es: strings["es"].completeness, - de: strings["de"].completeness, - }} - > + <TranslationProvider source={strings}> <ExchangeApiProvider baseUrl={new URL("/", baseUrl)} frameOnError={Frame} diff --git a/packages/merchant-backoffice-ui/src/Application.tsx b/packages/merchant-backoffice-ui/src/Application.tsx @@ -91,7 +91,10 @@ import { revalidateInstanceConfirmedTransfers, revalidateInstanceIncomingTransfers, } from "./hooks/transfer.js"; -import { revalidateInstanceMoneyPots, revalidateMoneyPotDetails } from "./hooks/pots.js"; +import { + revalidateInstanceMoneyPots, + revalidateMoneyPotDetails, +} from "./hooks/pots.js"; import { revalidateInstanceGroups } from "./hooks/groups.js"; import { revalidateInstanceScheduledReports } from "./hooks/reports.js"; @@ -108,19 +111,7 @@ export function Application(): VNode { const baseUrl = getInitialBackendBaseURL(settings.backendBaseURL); return ( <SettingsProvider value={settings}> - <TranslationProvider - source={strings} - completeness={{ - uk: strings["uk"].completeness, - tr: strings["tr"].completeness, - // ru: strings["ru"].completeness, - sv: strings["sv"].completeness, - it: strings["it"].completeness, - fr: strings["fr"].completeness, - es: strings["es"].completeness, - de: strings["de"].completeness, - }} - > + <TranslationProvider source={strings}> <MerchantApiProvider baseUrl={new URL("./", baseUrl)} frameOnError={OnConfigError} @@ -437,7 +428,10 @@ const swrCacheEvictor = new (class return; } case TalerMerchantInstanceCacheEviction.UPDATE_POTS: { - await Promise.all([revalidateInstanceMoneyPots(), revalidateMoneyPotDetails()]); + await Promise.all([ + revalidateInstanceMoneyPots(), + revalidateMoneyPotDetails(), + ]); return; } case TalerMerchantInstanceCacheEviction.DELETE_POTS: { diff --git a/packages/web-util/src/context/translation.ts b/packages/web-util/src/context/translation.ts @@ -30,25 +30,25 @@ export type InternationalizationAPI = typeof i18n; interface Type { lang: string; - supportedLang: { [id in keyof typeof supportedLang]: string }; + supportedLang: { [id in keyof typeof SUPPORTED_LANGS]: string }; changeLanguage: (l: string) => void; i18n: InternationalizationAPI; dateLocale: Locale; - completeness: { [id in keyof typeof supportedLang]: number }; + completeness: Record<string, number>; } -const supportedLang = { +const SUPPORTED_LANGS = { es: "Espanol [es]", en: "English [en]", fr: "Francais [fr]", de: "Deutsch [de]", - sv: "Svenska [sv]", - it: "Italiane [it]", + // sv: "Svenska [sv]", + // it: "Italiane [it]", }; const initial: Type = { lang: "en", - supportedLang, + supportedLang: SUPPORTED_LANGS, changeLanguage: () => { // do not change anything }, @@ -59,19 +59,20 @@ const initial: Type = { en: 0, es: 0, fr: 0, - it: 0, - sv: 0, }, }; const Context = createContext<Type>(initial); +interface LangInfo { + lang: string; + completeness: number; +} interface Props { initial?: string; children: ComponentChildren; /** ONLY USER FOR TESTING */ forceLang__testing?: string; - source: Record<string, any>; - completeness?: Record<string, number>; + source: Record<string, LangInfo>; } // Outmost UI wrapper. @@ -80,21 +81,15 @@ export const TranslationProvider = ({ children, forceLang__testing: forceLang, source, - completeness: completenessProp, }: Props): VNode => { - const completeness = { - en: 100, - de: - !completenessProp || !completenessProp["de"] ? 0 : completenessProp["de"], - es: - !completenessProp || !completenessProp["es"] ? 0 : completenessProp["es"], - fr: - !completenessProp || !completenessProp["fr"] ? 0 : completenessProp["fr"], - it: - !completenessProp || !completenessProp["it"] ? 0 : completenessProp["it"], - sv: - !completenessProp || !completenessProp["sv"] ? 0 : completenessProp["sv"], - }; + + const completeness = Object.keys(SUPPORTED_LANGS).reduce((map, lang) => { + if (lang !== "en" && source[lang] && source[lang].completeness ) { + map[lang] = source[lang].completeness + } + return map + }, { en: 100 } as Record<string,number>) + const { value: lang, update: changeLanguage } = useLang( initial, completeness, @@ -127,7 +122,7 @@ export const TranslationProvider = ({ value: { lang, changeLanguage, - supportedLang, + supportedLang: SUPPORTED_LANGS, i18n, dateLocale, completeness, diff --git a/packages/web-util/src/hooks/useLang.ts b/packages/web-util/src/hooks/useLang.ts @@ -20,7 +20,12 @@ import { useLocalStorage, } from "./useLocalStorage.js"; -const MIN_LANG_COVERAGE_THRESHOLD = 90; +/** + * If the translation is under this threshold then + * browser won't automatically switch to default lang. + * + */ +const MIN_LANG_COVERAGE_THRESHOLD = 85; /** * choose the best from the browser config based on the completeness * on the translation