diff --git a/packages/core-base/src/context.ts b/packages/core-base/src/context.ts index 4a49ea0a1..2572b34d9 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 getLocaleMessage< + 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 setLocaleMessage< + 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..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 } from '../src' +import { createCoreContext, getLocaleMessage } from '../src' import type { DateTimeFormat, @@ -129,6 +129,10 @@ test('strict context', () => { en: NumberFormat ja: NumberFormat }>() + + expectTypeOf(getLocaleMessage(strictCtx, 'en')).toEqualTypeOf< + ResourceSchema | undefined + >() }) test('strict context with direct options', () => { @@ -198,6 +202,10 @@ test('strict context with direct options', () => { } }>() + expectTypeOf(getLocaleMessage(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..bed37cb50 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, + getLocaleMessage, + setLocaleMessage +} from '../src/context' describe('locale', () => { test('default', () => { @@ -170,3 +174,39 @@ describe('escapeParameter', () => { expect(ctx.escapeParameter).toEqual(true) }) }) + +describe('getLocaleMessage', () => { + test('exist locale', () => { + const ctx = context({ + messages: { + en: { hello: 'hello' }, + ja: { hello: 'こんにちは!' } + } + }) + const messages = getLocaleMessage(ctx, 'en') + expect(messages).toEqual({ hello: 'hello' }) + }) + + test('not exist locale', () => { + const ctx = context({ + locale: 'en', + messages: { + en: { hello: 'hello' } + } + }) + const messages = getLocaleMessage(ctx, 'ja') + expect(messages).toBeUndefined() + }) +}) + +test('setMessages', () => { + const ctx = context({ + locale: 'en', + messages: { + en: { hello: 'hello' } + } + }) + + setLocaleMessage(ctx, 'ja', { hello: 'こんにちは!' }) + expect(getLocaleMessage(ctx, 'ja')).toMatchObject({ hello: 'こんにちは!' }) +})