i18n-keyless-react 1.9.3 → 1.9.5
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.
- package/dist/I18nKeylessText.js +2 -4
- package/dist/__tests__/I18nKeylessText.test.js +5 -5
- package/dist/__tests__/store.test.js +12 -12
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/package.json +1 -1
- package/dist/store.d.ts +2 -1
- package/dist/store.js +5 -1
- package/package.json +1 -1
package/dist/I18nKeylessText.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import React, { useEffect, useMemo } from "react";
|
|
3
|
-
import { getTranslation } from "
|
|
4
|
-
import { useI18nKeyless } from "./store";
|
|
3
|
+
import { useI18nKeyless, getTranslation } from "./store";
|
|
5
4
|
const warnAboutWhitespace = (text) => {
|
|
6
5
|
if (process.env.NODE_ENV === "development" && text !== text.trim()) {
|
|
7
6
|
console.warn(`I18nKeylessText received text with leading/trailing whitespace: "${text}". ` +
|
|
@@ -18,8 +17,7 @@ export const I18nKeylessText = ({ children, replace, context, debug = false, for
|
|
|
18
17
|
warnAboutWhitespace(children);
|
|
19
18
|
}, [children]);
|
|
20
19
|
useEffect(() => {
|
|
21
|
-
|
|
22
|
-
getTranslation(sourceText, store, { context, debug, forceTemporary });
|
|
20
|
+
getTranslation(sourceText, { context, debug, forceTemporary });
|
|
23
21
|
}, [sourceText, currentLanguage, context, debug, forceTemporary]);
|
|
24
22
|
const translatedText = currentLanguage === config.languages.primary
|
|
25
23
|
? sourceText
|
|
@@ -2,6 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { render, screen } from "@testing-library/react";
|
|
3
3
|
import { I18nKeylessText } from "../I18nKeylessText";
|
|
4
4
|
import { vi, beforeEach, describe, it, expect, afterEach } from "vitest";
|
|
5
|
+
import { getTranslationCore } from "i18n-keyless-core";
|
|
5
6
|
// Create a mock store before vi.mock call using vi.hoisted
|
|
6
7
|
const mockStore = vi.hoisted(() => {
|
|
7
8
|
const store = {
|
|
@@ -31,16 +32,15 @@ const mockStore = vi.hoisted(() => {
|
|
|
31
32
|
return useI18nKeylessMock;
|
|
32
33
|
});
|
|
33
34
|
// Mock the store module - this is hoisted to the top of the file
|
|
34
|
-
vi.mock("../store", () => {
|
|
35
|
+
vi.mock("../store", async () => {
|
|
35
36
|
return {
|
|
36
37
|
useI18nKeyless: mockStore,
|
|
37
|
-
|
|
38
|
-
|
|
38
|
+
getTranslation: vi.fn((key, options) => {
|
|
39
|
+
return getTranslationCore(key, mockStore.getState(), options);
|
|
40
|
+
}),
|
|
39
41
|
};
|
|
40
42
|
});
|
|
41
|
-
// Mock utils module to avoid errors with getTranslation
|
|
42
43
|
vi.mock("../utils", () => ({
|
|
43
|
-
getTranslation: vi.fn(),
|
|
44
44
|
validateLanguage: vi.fn((lang) => lang),
|
|
45
45
|
}));
|
|
46
46
|
describe("I18nKeylessText", () => {
|
|
@@ -3,7 +3,7 @@ import { act } from "@testing-library/react";
|
|
|
3
3
|
import packageJson from "../package.json";
|
|
4
4
|
import { mockStore, mockStorage } from "./__mocks__/store";
|
|
5
5
|
import { useI18nKeyless, init } from "../store";
|
|
6
|
-
import {
|
|
6
|
+
import { getTranslationCore, queue } from "i18n-keyless-core";
|
|
7
7
|
// These vi.mock calls must be at the top level, outside of any function or block
|
|
8
8
|
vi.mock("zustand", () => ({
|
|
9
9
|
create: () => ({
|
|
@@ -17,7 +17,7 @@ vi.mock("../store", async () => {
|
|
|
17
17
|
return {
|
|
18
18
|
useI18nKeyless: mockStore,
|
|
19
19
|
useCurrentLanguage: vi.fn(),
|
|
20
|
-
|
|
20
|
+
getTranslationCore: vi.fn(),
|
|
21
21
|
setCurrentLanguage: vi.fn(),
|
|
22
22
|
fetchAllTranslations: vi.fn(),
|
|
23
23
|
clearI18nKeylessStorage: vi.fn(),
|
|
@@ -195,13 +195,13 @@ describe("i18n-keyless store", () => {
|
|
|
195
195
|
it("should return original text when current language is primary language", () => {
|
|
196
196
|
useI18nKeyless.setState({ currentLanguage: "en" });
|
|
197
197
|
const store = useI18nKeyless.getState();
|
|
198
|
-
const result =
|
|
198
|
+
const result = getTranslationCore("Hello World", store);
|
|
199
199
|
expect(result).toBe("Hello World");
|
|
200
200
|
});
|
|
201
201
|
it("should return original text when current language is primary language whatever context there is", () => {
|
|
202
202
|
useI18nKeyless.setState({ currentLanguage: "en" });
|
|
203
203
|
const store = useI18nKeyless.getState();
|
|
204
|
-
const result =
|
|
204
|
+
const result = getTranslationCore("Hello World again", store, { context: "whatever" });
|
|
205
205
|
expect(result).toBe("Hello World again");
|
|
206
206
|
});
|
|
207
207
|
it("should handle translations with context", () => {
|
|
@@ -213,8 +213,8 @@ describe("i18n-keyless store", () => {
|
|
|
213
213
|
},
|
|
214
214
|
});
|
|
215
215
|
const store = useI18nKeyless.getState();
|
|
216
|
-
const headerResult =
|
|
217
|
-
const footerResult =
|
|
216
|
+
const headerResult = getTranslationCore("Welcome", store, { context: "header" });
|
|
217
|
+
const footerResult = getTranslationCore("Good bye", store, { context: "footer" });
|
|
218
218
|
expect(headerResult).toBe("Bienvenue");
|
|
219
219
|
expect(footerResult).toBe("Au revoir");
|
|
220
220
|
});
|
|
@@ -225,7 +225,7 @@ describe("i18n-keyless store", () => {
|
|
|
225
225
|
global.fetch = vi.fn().mockResolvedValue({
|
|
226
226
|
json: () => Promise.resolve({ ok: true, data: { translations: {} } }),
|
|
227
227
|
});
|
|
228
|
-
const result =
|
|
228
|
+
const result = getTranslationCore("Hungry", store, {
|
|
229
229
|
forceTemporary: {
|
|
230
230
|
fr: "J'ai faim",
|
|
231
231
|
},
|
|
@@ -258,7 +258,7 @@ describe("i18n-keyless store", () => {
|
|
|
258
258
|
global.fetch = vi.fn().mockResolvedValue({
|
|
259
259
|
json: () => Promise.resolve({ ok: true }),
|
|
260
260
|
});
|
|
261
|
-
const result =
|
|
261
|
+
const result = getTranslationCore("Happiness", store, {
|
|
262
262
|
forceTemporary: {
|
|
263
263
|
fr: "Joie temporaire",
|
|
264
264
|
},
|
|
@@ -288,7 +288,7 @@ describe("i18n-keyless store", () => {
|
|
|
288
288
|
useI18nKeyless.setState({ currentLanguage: "fr" });
|
|
289
289
|
const store = useI18nKeyless.getState();
|
|
290
290
|
const queueSpy = vi.spyOn(queue, "add");
|
|
291
|
-
|
|
291
|
+
getTranslationCore("Missing Translation", store);
|
|
292
292
|
expect(queueSpy).toHaveBeenCalled();
|
|
293
293
|
});
|
|
294
294
|
it("should handle API translation errors gracefully", async () => {
|
|
@@ -297,7 +297,7 @@ describe("i18n-keyless store", () => {
|
|
|
297
297
|
// Mock a failed API call
|
|
298
298
|
global.fetch = vi.fn().mockRejectedValue(new Error("API Error"));
|
|
299
299
|
useI18nKeyless.setState({ currentLanguage: "fr" });
|
|
300
|
-
|
|
300
|
+
getTranslationCore("Test Error", store);
|
|
301
301
|
// Wait for async queue to process
|
|
302
302
|
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
303
303
|
expect(console.error).toHaveBeenCalledWith(expect.stringContaining("i18n-keyless: fetch all translations error:"), new Error("API Error"));
|
|
@@ -306,7 +306,7 @@ describe("i18n-keyless store", () => {
|
|
|
306
306
|
useI18nKeyless.setState({ currentLanguage: "fr" });
|
|
307
307
|
const store = useI18nKeyless.getState();
|
|
308
308
|
const queueSpy = vi.spyOn(queue, "add");
|
|
309
|
-
|
|
309
|
+
getTranslationCore("", store);
|
|
310
310
|
expect(queueSpy).not.toHaveBeenCalled();
|
|
311
311
|
});
|
|
312
312
|
it("should handle debug mode logging", async () => {
|
|
@@ -314,7 +314,7 @@ describe("i18n-keyless store", () => {
|
|
|
314
314
|
vi.clearAllMocks();
|
|
315
315
|
useI18nKeyless.setState({ currentLanguage: "fr" });
|
|
316
316
|
const store = useI18nKeyless.getState();
|
|
317
|
-
|
|
317
|
+
getTranslationCore("Debug Test", store, { debug: true });
|
|
318
318
|
// Wait for any async operations to complete
|
|
319
319
|
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
320
320
|
expect(console.log).toHaveBeenCalled();
|
package/dist/index.d.ts
CHANGED
|
@@ -2,3 +2,4 @@ export { I18nKeylessText } from "./I18nKeylessText";
|
|
|
2
2
|
export { init, setCurrentLanguage, useCurrentLanguage } from "./store";
|
|
3
3
|
export { clearI18nKeylessStorage } from "./utils";
|
|
4
4
|
export type { I18nKeylessTextProps } from "./I18nKeylessText";
|
|
5
|
+
export { type I18nConfig, type Lang, type PrimaryLang, type Translations, type TranslationStore, type TranslationStoreState, type I18nKeylessRequestBody, type I18nKeylessResponse, type TranslationOptions, fetchAllTranslations, validateLanguage, queue, } from "i18n-keyless-core";
|
package/dist/index.js
CHANGED
package/dist/package.json
CHANGED
package/dist/store.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { type I18nConfig, type Lang, type TranslationStore } from "i18n-keyless-core";
|
|
1
|
+
import { type I18nConfig, type Lang, type TranslationStore, type TranslationOptions } from "i18n-keyless-core";
|
|
2
2
|
export declare const useI18nKeyless: import("zustand").UseBoundStore<import("zustand").StoreApi<TranslationStore>>;
|
|
3
3
|
export declare function init(newConfig: I18nConfig): Promise<void>;
|
|
4
4
|
export declare function useCurrentLanguage(): Lang | null;
|
|
5
|
+
export declare function getTranslation(key: string, options?: TranslationOptions): string;
|
|
5
6
|
export declare function setCurrentLanguage(lang: I18nConfig["languages"]["supported"][number]): void;
|
|
6
7
|
export declare function clearI18nKeylessStorageAndStore(): Promise<void>;
|
package/dist/store.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { queue, fetchAllTranslations, validateLanguage, } from "i18n-keyless-core";
|
|
1
|
+
import { queue, fetchAllTranslations, validateLanguage, getTranslationCore, } from "i18n-keyless-core";
|
|
2
2
|
import { create } from "zustand";
|
|
3
3
|
import { init as initRoot, storeKeys, setItem, getItem, clearI18nKeylessStorage } from "./utils";
|
|
4
4
|
queue.on("empty", () => {
|
|
@@ -113,6 +113,10 @@ export function useCurrentLanguage() {
|
|
|
113
113
|
const currentLanguage = useI18nKeyless((state) => state.currentLanguage);
|
|
114
114
|
return currentLanguage;
|
|
115
115
|
}
|
|
116
|
+
export function getTranslation(key, options) {
|
|
117
|
+
const store = useI18nKeyless.getState();
|
|
118
|
+
return getTranslationCore(key, store, options);
|
|
119
|
+
}
|
|
116
120
|
export function setCurrentLanguage(lang) {
|
|
117
121
|
return useI18nKeyless.getState().setLanguage(lang);
|
|
118
122
|
}
|