From 745204f2f4a625a1f6be92995f466faa77535a19 Mon Sep 17 00:00:00 2001 From: rookie4show Date: Tue, 24 Feb 2026 23:29:48 +0800 Subject: [PATCH] fix(embed): fallback i18n when host app has no vue-i18n plugin --- src/components/Toolbar.vue | 13 ++++++++--- src/components/Yys.vue | 6 ++--- src/components/YysRank.vue | 6 ++--- .../flow/nodes/yys/PropertySelect.vue | 6 ++--- .../flow/nodes/yys/ShikigamiGroup.vue | 6 ++--- .../flow/nodes/yys/ShikigamiProperty.vue | 6 ++--- src/ts/useSafeI18n.ts | 22 +++++++++++++++++++ 7 files changed, 47 insertions(+), 18 deletions(-) create mode 100644 src/ts/useSafeI18n.ts diff --git a/src/components/Toolbar.vue b/src/components/Toolbar.vue index d476dee..5cc7a49 100644 --- a/src/components/Toolbar.vue +++ b/src/components/Toolbar.vue @@ -116,13 +116,13 @@ \ No newline at end of file + diff --git a/src/ts/useSafeI18n.ts b/src/ts/useSafeI18n.ts new file mode 100644 index 0000000..f778421 --- /dev/null +++ b/src/ts/useSafeI18n.ts @@ -0,0 +1,22 @@ +import { useI18n } from 'vue-i18n' + +type TranslateFn = (key: string, ...args: any[]) => string + +export function useSafeI18n(fallbackMap: Record = {}) { + let safeT: TranslateFn = (key) => fallbackMap[key] ?? key + + try { + const { t } = useI18n() + safeT = (key: string, ...args: any[]) => { + const translated = t(key, ...args) + if (typeof translated === 'string' && translated.length > 0) { + return translated + } + return fallbackMap[key] ?? key + } + } catch { + // The host app may not install vue-i18n; fallback to key/default text. + } + + return { t: safeT } +}