Skip to content

Commit 3903e67

Browse files
authored
feat(core-base): accessor for locale messages (#2135)
* feat(core-base): accessor for locale messages * fix: change function name
1 parent 8f8b44d commit 3903e67

File tree

3 files changed

+79
-2
lines changed

3 files changed

+79
-2
lines changed

packages/core-base/src/context.ts

+29
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import {
44
assign,
55
create,
6+
deepCopy,
67
isArray,
78
isBoolean,
89
isFunction,
@@ -431,6 +432,7 @@ export const getFallbackContext = (): CoreContext | null => _fallbackContext
431432
// ID for CoreContext
432433
let _cid = 0
433434

435+
// TODO: API documentation, if `@intlify/core` will be documented as a separate package
434436
export function createCoreContext<
435437
Message = string,
436438
Options extends CoreOptions<Message> = CoreOptions<Message>,
@@ -631,6 +633,33 @@ export function createCoreContext<Message = string>(options: any = {}): any {
631633

632634
const createResources = (locale: Locale) => ({ [locale]: create() })
633635

636+
// TODO: API documentation, if `@intlify/core` will be documented as a separate package
637+
export function getLocaleMessage<
638+
Context extends CoreContext,
639+
Locales = keyof Context['messages'],
640+
Return = Context['messages'][keyof Context['messages']]
641+
>(ctx: Context, locale: Locales): Return | undefined {
642+
const src = (ctx.messages as any)[locale]
643+
if (src == null) {
644+
return undefined
645+
}
646+
const dest = create()
647+
deepCopy(src, dest)
648+
return dest as Return
649+
}
650+
651+
// TODO: API documentation, if `@intlify/core` will be documented as a separate package
652+
export function setLocaleMessage<
653+
Context extends CoreContext,
654+
Locales = keyof Context['messages']
655+
>(
656+
ctx: Context,
657+
locale: Locales,
658+
messages: Context['messages'][keyof Context['messages']]
659+
): void {
660+
;(ctx.messages as any)[locale] = messages
661+
}
662+
634663
/** @internal */
635664
export function isTranslateFallbackWarn(
636665
fallback: boolean | RegExp,

packages/core-base/test/context.test-d.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { createCoreContext } from '../src'
1+
import { createCoreContext, getLocaleMessage } from '../src'
22

33
import type {
44
DateTimeFormat,
@@ -129,6 +129,10 @@ test('strict context', () => {
129129
en: NumberFormat
130130
ja: NumberFormat
131131
}>()
132+
133+
expectTypeOf(getLocaleMessage(strictCtx, 'en')).toEqualTypeOf<
134+
ResourceSchema | undefined
135+
>()
132136
})
133137

134138
test('strict context with direct options', () => {
@@ -198,6 +202,10 @@ test('strict context with direct options', () => {
198202
}
199203
}>()
200204

205+
expectTypeOf(getLocaleMessage(strictDirectCtx, 'en')).toEqualTypeOf<
206+
ResourceSchema | undefined
207+
>()
208+
201209
const nullCtx1 = createCoreContext({})
202210
expectTypeOf(nullCtx1.locale).toEqualTypeOf<Locale | LocaleDetector>()
203211
nullCtx1.locale = 'ja'

packages/core-base/test/context.test.ts

+41-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
import { createCoreContext as context } from '../src/context'
1+
import {
2+
createCoreContext as context,
3+
getLocaleMessage,
4+
setLocaleMessage
5+
} from '../src/context'
26

37
describe('locale', () => {
48
test('default', () => {
@@ -170,3 +174,39 @@ describe('escapeParameter', () => {
170174
expect(ctx.escapeParameter).toEqual(true)
171175
})
172176
})
177+
178+
describe('getLocaleMessage', () => {
179+
test('exist locale', () => {
180+
const ctx = context({
181+
messages: {
182+
en: { hello: 'hello' },
183+
ja: { hello: 'こんにちは!' }
184+
}
185+
})
186+
const messages = getLocaleMessage(ctx, 'en')
187+
expect(messages).toEqual({ hello: 'hello' })
188+
})
189+
190+
test('not exist locale', () => {
191+
const ctx = context({
192+
locale: 'en',
193+
messages: {
194+
en: { hello: 'hello' }
195+
}
196+
})
197+
const messages = getLocaleMessage(ctx, 'ja')
198+
expect(messages).toBeUndefined()
199+
})
200+
})
201+
202+
test('setMessages', () => {
203+
const ctx = context({
204+
locale: 'en',
205+
messages: {
206+
en: { hello: 'hello' }
207+
}
208+
})
209+
210+
setLocaleMessage(ctx, 'ja', { hello: 'こんにちは!' })
211+
expect(getLocaleMessage(ctx, 'ja')).toMatchObject({ hello: 'こんにちは!' })
212+
})

0 commit comments

Comments
 (0)