From 8598f3912ecc16f9b7c3f502e09d9ea96f7e507d Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Fri, 8 Aug 2025 11:26:18 +0900 Subject: per-locale bundle & inline locale (#16369) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: split entry file by locale name * chore: とりあえず transform hook で雑に分割 * chore: とりあえず transform 結果をいい感じに * chore: concurrent buildで高速化 * chore: vite ではローケルのないものをビルドして後処理でどうにかするように * chore: 後処理のためにi18n.jを単体になるように切り出す * chore: use typescript * chore: remove unref(i18n) in vite build process * chore: inline variable * fix: build error * fix: i18n.ts.something.replaceAll() become error * chore: ignore export specifier from error * chore: support i18n.tsx as object * chore: process literal for all files * chore: split config and locale * chore: inline locale name * chore: remove updating locale in boot common * chore: use top-level await to load locales * chore: inline locale * chore: remove loading locale from boot.js * chore: remove loading locale from boot.js * コメント追加 * fix test; fetchに失敗する * import削除ログをdebugレベルに * fix: watch pug * chore: use hash for entry files * chore: remove es-module-lexer from dependencies * chore: move to frontend-builder * chore: use inline locale in embed * chore: refetch json on hot reload * feat: store localization related to boot.js in backend in bootloaderLocales localstorage * 応急処置を戻す * fix spex * fix `Using i18n identifier "e" directly. Skipping inlining.` warning * refactor: use scriptsDir parameter * chore: remove i18n from depmap * chore: make build crash if errors * error -> warn few conditions * use inline object * update localstorage keys * remove accessing locale localstorage * fix: failed to process i18n.tsx.aaa({x:i18n.bbb}) --- packages/frontend/src/boot/common.ts | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) (limited to 'packages/frontend/src/boot/common.ts') diff --git a/packages/frontend/src/boot/common.ts b/packages/frontend/src/boot/common.ts index ea41155ab0..395d1e5e7e 100644 --- a/packages/frontend/src/boot/common.ts +++ b/packages/frontend/src/boot/common.ts @@ -5,9 +5,10 @@ import { computed, watch, version as vueVersion } from 'vue'; import { compareVersions } from 'compare-versions'; -import { version, lang, updateLocale, locale, apiUrl, isSafeMode } from '@@/js/config.js'; +import { version, lang, apiUrl, isSafeMode } from '@@/js/config.js'; import defaultLightTheme from '@@/themes/l-light.json5'; import defaultDarkTheme from '@@/themes/d-green-lime.json5'; +import { storeBootloaderErrors } from '@@/js/store-boot-errors'; import type { App } from 'vue'; import widgets from '@/widgets/index.js'; import directives from '@/directives/index.js'; @@ -79,25 +80,7 @@ export async function common(createVue: () => Promise>) { //#endregion //#region Detect language & fetch translations - const localeVersion = miLocalStorage.getItem('localeVersion'); - const localeOutdated = (localeVersion == null || localeVersion !== version || locale == null); - - async function fetchAndUpdateLocale({ useCache } = { useCache: true }) { - const fetchOptions: RequestInit | undefined = useCache ? undefined : { cache: 'no-store' }; - const res = await window.fetch(`/assets/locales/${lang}.${version}.json`, fetchOptions); - if (res.status === 200) { - const newLocale = await res.text(); - const parsedNewLocale = JSON.parse(newLocale); - miLocalStorage.setItem('locale', newLocale); - miLocalStorage.setItem('localeVersion', version); - updateLocale(parsedNewLocale); - updateI18n(parsedNewLocale); - } - } - - if (localeOutdated) { - fetchAndUpdateLocale(); - } + storeBootloaderErrors({ ...i18n.ts._bootErrors, reload: i18n.ts.reload }); if (import.meta.hot) { import.meta.hot.on('locale-update', async (updatedLang: string) => { @@ -106,7 +89,8 @@ export async function common(createVue: () => Promise>) { await new Promise(resolve => { window.setTimeout(resolve, 500); }); - await fetchAndUpdateLocale({ useCache: false }); + // fetch with cache: 'no-store' to ensure the latest locale is fetched + await window.fetch(`/assets/locales/${lang}.${version}.json`, { cache: 'no-store' }).then(async res => res.status === 200 && await res.text()); window.location.reload(); } }); -- cgit v1.2.3-freya