From 3cff14fcf61343d5f3f77dac3fc6564736460b3d Mon Sep 17 00:00:00 2001 From: kazuya kawaguchi Date: Mon, 17 Mar 2025 17:16:45 +0900 Subject: [PATCH 1/2] feat(core-base): accessor for locale messages --- packages/core-base/src/context.ts | 29 ++++++++++++++++ packages/core-base/test/context.test-d.ts | 10 +++++- packages/core-base/test/context.test.ts | 42 ++++++++++++++++++++++- 3 files changed, 79 insertions(+), 2 deletions(-) diff --git a/packages/core-base/src/context.ts b/packages/core-base/src/context.ts index 4a49ea0a1..8ea49f26d 100644 --- a/packages/core-base/src/context.ts +++ b/packages/core-base/src/context.ts @@ -3,6 +3,7 @@ import { assign, create, + deepCopy, isArray, isBoolean, isFunction, @@ -431,6 +432,7 @@ export const getFallbackContext = (): CoreContext | null => _fallbackContext // ID for CoreContext let _cid = 0 +// TODO: API documentation, if `@intlify/core` will be documented as a separate package export function createCoreContext< Message = string, Options extends CoreOptions = CoreOptions, @@ -631,6 +633,33 @@ export function createCoreContext(options: any = {}): any { const createResources = (locale: Locale) => ({ [locale]: create() }) +// TODO: API documentation, if `@intlify/core` will be documented as a separate package +export function getMessages< + Context extends CoreContext, + Locales = keyof Context['messages'], + Return = Context['messages'][keyof Context['messages']] +>(ctx: Context, locale: Locales): Return | undefined { + const src = (ctx.messages as any)[locale] + if (src == null) { + return undefined + } + const dest = create() + deepCopy(src, dest) + return dest as Return +} + +// TODO: API documentation, if `@intlify/core` will be documented as a separate package +export function setMessages< + Context extends CoreContext, + Locales = keyof Context['messages'] +>( + ctx: Context, + locale: Locales, + messages: Context['messages'][keyof Context['messages']] +): void { + ;(ctx.messages as any)[locale] = messages +} + /** @internal */ export function isTranslateFallbackWarn( fallback: boolean | RegExp, diff --git a/packages/core-base/test/context.test-d.ts b/packages/core-base/test/context.test-d.ts index b0987e76c..1bfdc2919 100644 --- a/packages/core-base/test/context.test-d.ts +++ b/packages/core-base/test/context.test-d.ts @@ -1,4 +1,4 @@ -import { createCoreContext } from '../src' +import { createCoreContext, getMessages } from '../src' import type { DateTimeFormat, @@ -129,6 +129,10 @@ test('strict context', () => { en: NumberFormat ja: NumberFormat }>() + + expectTypeOf(getMessages(strictCtx, 'en')).toEqualTypeOf< + ResourceSchema | undefined + >() }) test('strict context with direct options', () => { @@ -198,6 +202,10 @@ test('strict context with direct options', () => { } }>() + expectTypeOf(getMessages(strictDirectCtx, 'en')).toEqualTypeOf< + ResourceSchema | undefined + >() + const nullCtx1 = createCoreContext({}) expectTypeOf(nullCtx1.locale).toEqualTypeOf() nullCtx1.locale = 'ja' diff --git a/packages/core-base/test/context.test.ts b/packages/core-base/test/context.test.ts index 8b7b3df94..26e0a3d8a 100644 --- a/packages/core-base/test/context.test.ts +++ b/packages/core-base/test/context.test.ts @@ -1,4 +1,8 @@ -import { createCoreContext as context } from '../src/context' +import { + createCoreContext as context, + getMessages, + setMessages +} from '../src/context' describe('locale', () => { test('default', () => { @@ -170,3 +174,39 @@ describe('escapeParameter', () => { expect(ctx.escapeParameter).toEqual(true) }) }) + +describe('getMessages', () => { + test('exist locale', () => { + const ctx = context({ + messages: { + en: { hello: 'hello' }, + ja: { hello: 'こんにちは!' } + } + }) + const messages = getMessages(ctx, 'en') + expect(messages).toEqual({ hello: 'hello' }) + }) + + test('not exist locale', () => { + const ctx = context({ + locale: 'en', + messages: { + en: { hello: 'hello' } + } + }) + const messages = getMessages(ctx, 'ja') + expect(messages).toBeUndefined() + }) +}) + +test('setMessages', () => { + const ctx = context({ + locale: 'en', + messages: { + en: { hello: 'hello' } + } + }) + + setMessages(ctx, 'ja', { hello: 'こんにちは!' }) + expect(getMessages(ctx, 'ja')).toMatchObject({ hello: 'こんにちは!' }) +}) From b061e708b0cb1c1e469faaaad30300fa5dfff22f Mon Sep 17 00:00:00 2001 From: kazuya kawaguchi Date: Mon, 17 Mar 2025 17:24:17 +0900 Subject: [PATCH 2/2] fix: change function name --- packages/core-base/src/context.ts | 4 ++-- packages/core-base/test/context.test-d.ts | 6 +++--- packages/core-base/test/context.test.ts | 14 +++++++------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/core-base/src/context.ts b/packages/core-base/src/context.ts index 8ea49f26d..2572b34d9 100644 --- a/packages/core-base/src/context.ts +++ b/packages/core-base/src/context.ts @@ -634,7 +634,7 @@ export function createCoreContext(options: any = {}): any { const createResources = (locale: Locale) => ({ [locale]: create() }) // TODO: API documentation, if `@intlify/core` will be documented as a separate package -export function getMessages< +export function getLocaleMessage< Context extends CoreContext, Locales = keyof Context['messages'], Return = Context['messages'][keyof Context['messages']] @@ -649,7 +649,7 @@ export function getMessages< } // TODO: API documentation, if `@intlify/core` will be documented as a separate package -export function setMessages< +export function setLocaleMessage< Context extends CoreContext, Locales = keyof Context['messages'] >( diff --git a/packages/core-base/test/context.test-d.ts b/packages/core-base/test/context.test-d.ts index 1bfdc2919..ab9c69491 100644 --- a/packages/core-base/test/context.test-d.ts +++ b/packages/core-base/test/context.test-d.ts @@ -1,4 +1,4 @@ -import { createCoreContext, getMessages } from '../src' +import { createCoreContext, getLocaleMessage } from '../src' import type { DateTimeFormat, @@ -130,7 +130,7 @@ test('strict context', () => { ja: NumberFormat }>() - expectTypeOf(getMessages(strictCtx, 'en')).toEqualTypeOf< + expectTypeOf(getLocaleMessage(strictCtx, 'en')).toEqualTypeOf< ResourceSchema | undefined >() }) @@ -202,7 +202,7 @@ test('strict context with direct options', () => { } }>() - expectTypeOf(getMessages(strictDirectCtx, 'en')).toEqualTypeOf< + expectTypeOf(getLocaleMessage(strictDirectCtx, 'en')).toEqualTypeOf< ResourceSchema | undefined >() diff --git a/packages/core-base/test/context.test.ts b/packages/core-base/test/context.test.ts index 26e0a3d8a..bed37cb50 100644 --- a/packages/core-base/test/context.test.ts +++ b/packages/core-base/test/context.test.ts @@ -1,7 +1,7 @@ import { createCoreContext as context, - getMessages, - setMessages + getLocaleMessage, + setLocaleMessage } from '../src/context' describe('locale', () => { @@ -175,7 +175,7 @@ describe('escapeParameter', () => { }) }) -describe('getMessages', () => { +describe('getLocaleMessage', () => { test('exist locale', () => { const ctx = context({ messages: { @@ -183,7 +183,7 @@ describe('getMessages', () => { ja: { hello: 'こんにちは!' } } }) - const messages = getMessages(ctx, 'en') + const messages = getLocaleMessage(ctx, 'en') expect(messages).toEqual({ hello: 'hello' }) }) @@ -194,7 +194,7 @@ describe('getMessages', () => { en: { hello: 'hello' } } }) - const messages = getMessages(ctx, 'ja') + const messages = getLocaleMessage(ctx, 'ja') expect(messages).toBeUndefined() }) }) @@ -207,6 +207,6 @@ test('setMessages', () => { } }) - setMessages(ctx, 'ja', { hello: 'こんにちは!' }) - expect(getMessages(ctx, 'ja')).toMatchObject({ hello: 'こんにちは!' }) + setLocaleMessage(ctx, 'ja', { hello: 'こんにちは!' }) + expect(getLocaleMessage(ctx, 'ja')).toMatchObject({ hello: 'こんにちは!' }) })