@shuo-li/i18n 1.0.6 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -231,6 +231,7 @@ var currentSig = null;
231
231
  var currentPromise = null;
232
232
  var resolvedStores = [];
233
233
  var resolvedModules = [];
234
+ var resolvedStaticModules = [];
234
235
  var resolvedLanguages = [];
235
236
  var unloginPullStarted = false;
236
237
  var managerOptions = null;
@@ -259,6 +260,7 @@ function closeSSE() {
259
260
  loadedModules.clear();
260
261
  loadingModules.clear();
261
262
  unloginPullStarted = false;
263
+ resolvedStaticModules = [];
262
264
  currentSig = null;
263
265
  currentPromise = null;
264
266
  }
@@ -334,11 +336,18 @@ async function _initI18n(options) {
334
336
  resolvedStores = options.stores;
335
337
  resolvedLanguages = _nullishCoalesce(options.languages, () => ( [options.langCode]));
336
338
  resolvedModules = _nullishCoalesce(options.modules, () => ( []));
339
+ resolvedStaticModules = options.staticLocales ? [...new Set(
340
+ Object.values(options.staticLocales).flatMap((langModules) => Object.keys(langModules))
341
+ )] : [];
337
342
  await storage.ensureStores(resolvedStores);
338
343
  await checkCacheVersion(storage, options);
344
+ const allKnownModules = sortedModules();
339
345
  for (const lang of resolvedLanguages) {
340
- for (const m of resolvedModules) {
341
- _i18next2.default.addResourceBundle(lang, m, getStaticLocale(m, lang), true, false);
346
+ for (const m of allKnownModules) {
347
+ const data = getStaticLocale(m, lang);
348
+ if (Object.keys(data).length > 0) {
349
+ _i18next2.default.addResourceBundle(lang, m, data, true, false);
350
+ }
342
351
  }
343
352
  }
344
353
  await injectCurrentLanguageModules(currentLang);
@@ -655,8 +664,9 @@ function buildSig(options) {
655
664
  return [options.apiContext.baseURL, options.langCode, cgKeys].join("|");
656
665
  }
657
666
  function sortedModules() {
658
- const priority = PRIORITY_MODULES.filter((m) => resolvedModules.includes(m));
659
- const rest = resolvedModules.filter((m) => !PRIORITY_MODULES.includes(m));
667
+ const all = [.../* @__PURE__ */ new Set([...resolvedStaticModules, ...resolvedModules])];
668
+ const priority = PRIORITY_MODULES.filter((m) => all.includes(m));
669
+ const rest = all.filter((m) => !PRIORITY_MODULES.includes(m));
660
670
  return [...priority, ...rest];
661
671
  }
662
672
  function getStaticLocale(moduleCode, langCode) {
@@ -231,6 +231,7 @@ var currentSig = null;
231
231
  var currentPromise = null;
232
232
  var resolvedStores = [];
233
233
  var resolvedModules = [];
234
+ var resolvedStaticModules = [];
234
235
  var resolvedLanguages = [];
235
236
  var unloginPullStarted = false;
236
237
  var managerOptions = null;
@@ -259,6 +260,7 @@ function closeSSE() {
259
260
  loadedModules.clear();
260
261
  loadingModules.clear();
261
262
  unloginPullStarted = false;
263
+ resolvedStaticModules = [];
262
264
  currentSig = null;
263
265
  currentPromise = null;
264
266
  }
@@ -334,11 +336,18 @@ async function _initI18n(options) {
334
336
  resolvedStores = options.stores;
335
337
  resolvedLanguages = options.languages ?? [options.langCode];
336
338
  resolvedModules = options.modules ?? [];
339
+ resolvedStaticModules = options.staticLocales ? [...new Set(
340
+ Object.values(options.staticLocales).flatMap((langModules) => Object.keys(langModules))
341
+ )] : [];
337
342
  await storage.ensureStores(resolvedStores);
338
343
  await checkCacheVersion(storage, options);
344
+ const allKnownModules = sortedModules();
339
345
  for (const lang of resolvedLanguages) {
340
- for (const m of resolvedModules) {
341
- i18n.addResourceBundle(lang, m, getStaticLocale(m, lang), true, false);
346
+ for (const m of allKnownModules) {
347
+ const data = getStaticLocale(m, lang);
348
+ if (Object.keys(data).length > 0) {
349
+ i18n.addResourceBundle(lang, m, data, true, false);
350
+ }
342
351
  }
343
352
  }
344
353
  await injectCurrentLanguageModules(currentLang);
@@ -655,8 +664,9 @@ function buildSig(options) {
655
664
  return [options.apiContext.baseURL, options.langCode, cgKeys].join("|");
656
665
  }
657
666
  function sortedModules() {
658
- const priority = PRIORITY_MODULES.filter((m) => resolvedModules.includes(m));
659
- const rest = resolvedModules.filter((m) => !PRIORITY_MODULES.includes(m));
667
+ const all = [.../* @__PURE__ */ new Set([...resolvedStaticModules, ...resolvedModules])];
668
+ const priority = PRIORITY_MODULES.filter((m) => all.includes(m));
669
+ const rest = all.filter((m) => !PRIORITY_MODULES.includes(m));
660
670
  return [...priority, ...rest];
661
671
  }
662
672
  function getStaticLocale(moduleCode, langCode) {
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2
2
 
3
3
 
4
4
 
@@ -7,7 +7,7 @@ var _chunkAJJKJPNBcjs = require('./chunk-AJJKJPNB.cjs');
7
7
 
8
8
 
9
9
 
10
- var _chunkJPKSBSEOcjs = require('./chunk-JPKSBSEO.cjs');
10
+ var _chunk2EV6FQILcjs = require('./chunk-2EV6FQIL.cjs');
11
11
 
12
12
  // src/index.ts
13
13
  var _i18next = require('i18next'); var _i18next2 = _interopRequireDefault(_i18next);
@@ -15,17 +15,17 @@ var _reacti18next = require('react-i18next');
15
15
 
16
16
  // src/storage/indexeddb.ts
17
17
  var DB_NAME = "i18n_cache";
18
- var SCHEMA_VERSION = 2;
19
18
  function resourceStoreName(name) {
20
19
  return `i18n_resources_${name}`;
21
20
  }
22
21
  var dbInstance = null;
23
22
  var dbOpenPromise = null;
24
23
  var dbStoreNames = [];
25
- function openDB(storeNames) {
24
+ function openDB(storeNames, version) {
26
25
  return new Promise((resolve, reject) => {
27
- const request = indexedDB.open(DB_NAME, SCHEMA_VERSION);
28
- request.onupgradeneeded = (event) => {
26
+ const req = version !== void 0 ? indexedDB.open(DB_NAME, version) : indexedDB.open(DB_NAME);
27
+ req.onupgradeneeded = (event) => {
28
+ if (version === void 0) return;
29
29
  const db = event.target.result;
30
30
  for (const name of storeNames) {
31
31
  const storeName = resourceStoreName(name);
@@ -36,8 +36,8 @@ function openDB(storeNames) {
36
36
  }
37
37
  }
38
38
  };
39
- request.onsuccess = () => {
40
- const db = request.result;
39
+ req.onsuccess = () => {
40
+ const db = req.result;
41
41
  db.onversionchange = () => {
42
42
  db.close();
43
43
  dbInstance = null;
@@ -47,16 +47,23 @@ function openDB(storeNames) {
47
47
  dbInstance = null;
48
48
  dbOpenPromise = null;
49
49
  };
50
- resolve(db);
50
+ const missing = storeNames.filter((n) => !db.objectStoreNames.contains(resourceStoreName(n)));
51
+ if (missing.length === 0 || version !== void 0) {
52
+ resolve(db);
53
+ return;
54
+ }
55
+ const nextVersion = db.version + 1;
56
+ db.close();
57
+ openDB(storeNames, nextVersion).then(resolve).catch(reject);
51
58
  };
52
- request.onerror = () => reject(request.error);
53
- request.onblocked = () => reject(new Error("[i18n] IndexedDB open blocked"));
59
+ req.onerror = () => reject(req.error);
60
+ req.onblocked = () => reject(new Error("[i18n] IndexedDB open blocked"));
54
61
  });
55
62
  }
56
- function getDB(storeNames) {
63
+ function getDB() {
57
64
  if (dbInstance) return Promise.resolve(dbInstance);
58
65
  if (!dbOpenPromise) {
59
- dbOpenPromise = openDB(_nullishCoalesce(storeNames, () => ( dbStoreNames))).then((db) => {
66
+ dbOpenPromise = openDB(dbStoreNames).then((db) => {
60
67
  dbInstance = db;
61
68
  dbOpenPromise = null;
62
69
  return db;
@@ -83,8 +90,31 @@ async function withRetry(fn) {
83
90
  }
84
91
  var IndexedDBAdapter = class {
85
92
  async ensureStores(stores) {
86
- dbStoreNames = stores.map((s) => s.name);
87
- await getDB(dbStoreNames);
93
+ const storeNames = stores.map((s) => s.name);
94
+ dbStoreNames = storeNames;
95
+ if (dbInstance) {
96
+ const allExist = storeNames.every(
97
+ (n) => dbInstance.objectStoreNames.contains(resourceStoreName(n))
98
+ );
99
+ if (allExist) return;
100
+ const nextVersion = dbInstance.version + 1;
101
+ dbInstance.close();
102
+ dbInstance = null;
103
+ dbOpenPromise = null;
104
+ dbInstance = await openDB(storeNames, nextVersion);
105
+ return;
106
+ }
107
+ if (!dbOpenPromise) {
108
+ dbOpenPromise = openDB(storeNames).then((db) => {
109
+ dbInstance = db;
110
+ dbOpenPromise = null;
111
+ return db;
112
+ }).catch((err) => {
113
+ dbOpenPromise = null;
114
+ throw err;
115
+ });
116
+ }
117
+ await dbOpenPromise;
88
118
  }
89
119
  async getRecord(storeName, key) {
90
120
  return withRetry(async () => {
@@ -165,7 +195,7 @@ if (!_i18next2.default.isInitialized) {
165
195
  }
166
196
  });
167
197
  }
168
- var { initI18n, closeSSE, ensureModules, getResource, getAllRecordsByModule } = _chunkJPKSBSEOcjs.createI18nManager.call(void 0, {
198
+ var { initI18n, closeSSE, ensureModules, getResource, getAllRecordsByModule } = _chunk2EV6FQILcjs.createI18nManager.call(void 0, {
169
199
  storage: new IndexedDBAdapter(),
170
200
  createWorker: () => new (0, _chunkAJJKJPNBcjs.WebWorkerAdapter)(
171
201
  new Worker(new URL("./workers/preload-worker.js", import.meta.url), { type: "module" })
@@ -181,4 +211,4 @@ var { initI18n, closeSSE, ensureModules, getResource, getAllRecordsByModule } =
181
211
 
182
212
 
183
213
 
184
- exports.I18N_RESOURCES_UPDATED_EVENT = _chunkJPKSBSEOcjs.I18N_RESOURCES_UPDATED_EVENT; exports.closeSSE = closeSSE; exports.emitI18nResourcesUpdated = _chunkJPKSBSEOcjs.emitI18nResourcesUpdated; exports.ensureModules = ensureModules; exports.getAllRecordsByModule = getAllRecordsByModule; exports.getResource = getResource; exports.initI18n = initI18n; exports.useDict = _chunkAJJKJPNBcjs.useDict; exports.useTranslation = _chunkAJJKJPNBcjs.useTranslation;
214
+ exports.I18N_RESOURCES_UPDATED_EVENT = _chunk2EV6FQILcjs.I18N_RESOURCES_UPDATED_EVENT; exports.closeSSE = closeSSE; exports.emitI18nResourcesUpdated = _chunk2EV6FQILcjs.emitI18nResourcesUpdated; exports.ensureModules = ensureModules; exports.getAllRecordsByModule = getAllRecordsByModule; exports.getResource = getResource; exports.initI18n = initI18n; exports.useDict = _chunkAJJKJPNBcjs.useDict; exports.useTranslation = _chunkAJJKJPNBcjs.useTranslation;
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  I18N_RESOURCES_UPDATED_EVENT,
8
8
  createI18nManager,
9
9
  emitI18nResourcesUpdated
10
- } from "./chunk-X6D2MZ7M.js";
10
+ } from "./chunk-5VHZCG34.js";
11
11
 
12
12
  // src/index.ts
13
13
  import i18n from "i18next";
@@ -15,17 +15,17 @@ import { initReactI18next } from "react-i18next";
15
15
 
16
16
  // src/storage/indexeddb.ts
17
17
  var DB_NAME = "i18n_cache";
18
- var SCHEMA_VERSION = 2;
19
18
  function resourceStoreName(name) {
20
19
  return `i18n_resources_${name}`;
21
20
  }
22
21
  var dbInstance = null;
23
22
  var dbOpenPromise = null;
24
23
  var dbStoreNames = [];
25
- function openDB(storeNames) {
24
+ function openDB(storeNames, version) {
26
25
  return new Promise((resolve, reject) => {
27
- const request = indexedDB.open(DB_NAME, SCHEMA_VERSION);
28
- request.onupgradeneeded = (event) => {
26
+ const req = version !== void 0 ? indexedDB.open(DB_NAME, version) : indexedDB.open(DB_NAME);
27
+ req.onupgradeneeded = (event) => {
28
+ if (version === void 0) return;
29
29
  const db = event.target.result;
30
30
  for (const name of storeNames) {
31
31
  const storeName = resourceStoreName(name);
@@ -36,8 +36,8 @@ function openDB(storeNames) {
36
36
  }
37
37
  }
38
38
  };
39
- request.onsuccess = () => {
40
- const db = request.result;
39
+ req.onsuccess = () => {
40
+ const db = req.result;
41
41
  db.onversionchange = () => {
42
42
  db.close();
43
43
  dbInstance = null;
@@ -47,16 +47,23 @@ function openDB(storeNames) {
47
47
  dbInstance = null;
48
48
  dbOpenPromise = null;
49
49
  };
50
- resolve(db);
50
+ const missing = storeNames.filter((n) => !db.objectStoreNames.contains(resourceStoreName(n)));
51
+ if (missing.length === 0 || version !== void 0) {
52
+ resolve(db);
53
+ return;
54
+ }
55
+ const nextVersion = db.version + 1;
56
+ db.close();
57
+ openDB(storeNames, nextVersion).then(resolve).catch(reject);
51
58
  };
52
- request.onerror = () => reject(request.error);
53
- request.onblocked = () => reject(new Error("[i18n] IndexedDB open blocked"));
59
+ req.onerror = () => reject(req.error);
60
+ req.onblocked = () => reject(new Error("[i18n] IndexedDB open blocked"));
54
61
  });
55
62
  }
56
- function getDB(storeNames) {
63
+ function getDB() {
57
64
  if (dbInstance) return Promise.resolve(dbInstance);
58
65
  if (!dbOpenPromise) {
59
- dbOpenPromise = openDB(storeNames ?? dbStoreNames).then((db) => {
66
+ dbOpenPromise = openDB(dbStoreNames).then((db) => {
60
67
  dbInstance = db;
61
68
  dbOpenPromise = null;
62
69
  return db;
@@ -83,8 +90,31 @@ async function withRetry(fn) {
83
90
  }
84
91
  var IndexedDBAdapter = class {
85
92
  async ensureStores(stores) {
86
- dbStoreNames = stores.map((s) => s.name);
87
- await getDB(dbStoreNames);
93
+ const storeNames = stores.map((s) => s.name);
94
+ dbStoreNames = storeNames;
95
+ if (dbInstance) {
96
+ const allExist = storeNames.every(
97
+ (n) => dbInstance.objectStoreNames.contains(resourceStoreName(n))
98
+ );
99
+ if (allExist) return;
100
+ const nextVersion = dbInstance.version + 1;
101
+ dbInstance.close();
102
+ dbInstance = null;
103
+ dbOpenPromise = null;
104
+ dbInstance = await openDB(storeNames, nextVersion);
105
+ return;
106
+ }
107
+ if (!dbOpenPromise) {
108
+ dbOpenPromise = openDB(storeNames).then((db) => {
109
+ dbInstance = db;
110
+ dbOpenPromise = null;
111
+ return db;
112
+ }).catch((err) => {
113
+ dbOpenPromise = null;
114
+ throw err;
115
+ });
116
+ }
117
+ await dbOpenPromise;
88
118
  }
89
119
  async getRecord(storeName, key) {
90
120
  return withRetry(async () => {
package/dist/mp/index.cjs CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- var _chunkJPKSBSEOcjs = require('../chunk-JPKSBSEO.cjs');
5
+ var _chunk2EV6FQILcjs = require('../chunk-2EV6FQIL.cjs');
6
6
 
7
7
  // src/storage/wx-sqlite.ts
8
8
  var DB_NAME = "i18n_cache";
@@ -181,7 +181,7 @@ function wxFetch(input, init) {
181
181
  }
182
182
 
183
183
  // src/mp/index.ts
184
- var { initI18n, closeSSE, ensureModules, getResource, getAllRecordsByModule } = _chunkJPKSBSEOcjs.createI18nManager.call(void 0, {
184
+ var { initI18n, closeSSE, ensureModules, getResource, getAllRecordsByModule } = _chunk2EV6FQILcjs.createI18nManager.call(void 0, {
185
185
  storage: new WxSQLiteAdapter(),
186
186
  createWorker: () => new WxWorkerAdapter(wx.createWorker("workers/preload-worker-mp.js")),
187
187
  fetchFn: wxFetch
@@ -194,4 +194,4 @@ var { initI18n, closeSSE, ensureModules, getResource, getAllRecordsByModule } =
194
194
 
195
195
 
196
196
 
197
- exports.I18N_RESOURCES_UPDATED_EVENT = _chunkJPKSBSEOcjs.I18N_RESOURCES_UPDATED_EVENT; exports.closeSSE = closeSSE; exports.emitI18nResourcesUpdated = _chunkJPKSBSEOcjs.emitI18nResourcesUpdated; exports.ensureModules = ensureModules; exports.getAllRecordsByModule = getAllRecordsByModule; exports.getResource = getResource; exports.initI18n = initI18n;
197
+ exports.I18N_RESOURCES_UPDATED_EVENT = _chunk2EV6FQILcjs.I18N_RESOURCES_UPDATED_EVENT; exports.closeSSE = closeSSE; exports.emitI18nResourcesUpdated = _chunk2EV6FQILcjs.emitI18nResourcesUpdated; exports.ensureModules = ensureModules; exports.getAllRecordsByModule = getAllRecordsByModule; exports.getResource = getResource; exports.initI18n = initI18n;
package/dist/mp/index.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  I18N_RESOURCES_UPDATED_EVENT,
3
3
  createI18nManager,
4
4
  emitI18nResourcesUpdated
5
- } from "../chunk-X6D2MZ7M.js";
5
+ } from "../chunk-5VHZCG34.js";
6
6
 
7
7
  // src/storage/wx-sqlite.ts
8
8
  var DB_NAME = "i18n_cache";
@@ -7,7 +7,7 @@ var _chunkAJJKJPNBcjs = require('../chunk-AJJKJPNB.cjs');
7
7
 
8
8
 
9
9
 
10
- var _chunkJPKSBSEOcjs = require('../chunk-JPKSBSEO.cjs');
10
+ var _chunk2EV6FQILcjs = require('../chunk-2EV6FQIL.cjs');
11
11
 
12
12
  // src/native/index.ts
13
13
  var _i18next = require('i18next'); var _i18next2 = _interopRequireDefault(_i18next);
@@ -121,7 +121,7 @@ if (!_i18next2.default.isInitialized) {
121
121
  }
122
122
  });
123
123
  }
124
- var { initI18n, closeSSE, ensureModules, getResource, getAllRecordsByModule } = _chunkJPKSBSEOcjs.createI18nManager.call(void 0, {
124
+ var { initI18n, closeSSE, ensureModules, getResource, getAllRecordsByModule } = _chunk2EV6FQILcjs.createI18nManager.call(void 0, {
125
125
  storage: new SQLiteAdapter(),
126
126
  // Hermes Worker(RN 0.71+),API 与 Web Worker 一致
127
127
  createWorker: () => new (0, _chunkAJJKJPNBcjs.WebWorkerAdapter)(
@@ -138,4 +138,4 @@ var { initI18n, closeSSE, ensureModules, getResource, getAllRecordsByModule } =
138
138
 
139
139
 
140
140
 
141
- exports.I18N_RESOURCES_UPDATED_EVENT = _chunkJPKSBSEOcjs.I18N_RESOURCES_UPDATED_EVENT; exports.closeSSE = closeSSE; exports.emitI18nResourcesUpdated = _chunkJPKSBSEOcjs.emitI18nResourcesUpdated; exports.ensureModules = ensureModules; exports.getAllRecordsByModule = getAllRecordsByModule; exports.getResource = getResource; exports.initI18n = initI18n; exports.useDict = _chunkAJJKJPNBcjs.useDict; exports.useTranslation = _chunkAJJKJPNBcjs.useTranslation;
141
+ exports.I18N_RESOURCES_UPDATED_EVENT = _chunk2EV6FQILcjs.I18N_RESOURCES_UPDATED_EVENT; exports.closeSSE = closeSSE; exports.emitI18nResourcesUpdated = _chunk2EV6FQILcjs.emitI18nResourcesUpdated; exports.ensureModules = ensureModules; exports.getAllRecordsByModule = getAllRecordsByModule; exports.getResource = getResource; exports.initI18n = initI18n; exports.useDict = _chunkAJJKJPNBcjs.useDict; exports.useTranslation = _chunkAJJKJPNBcjs.useTranslation;
@@ -7,7 +7,7 @@ import {
7
7
  I18N_RESOURCES_UPDATED_EVENT,
8
8
  createI18nManager,
9
9
  emitI18nResourcesUpdated
10
- } from "../chunk-X6D2MZ7M.js";
10
+ } from "../chunk-5VHZCG34.js";
11
11
 
12
12
  // src/native/index.ts
13
13
  import i18n from "i18next";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shuo-li/i18n",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "description": "Cross-platform i18n library for Web, React Native and WeChat MiniProgram",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",