Skip to content

Commit 44169cd

Browse files
authored
feat: reactive availableLocales using computed property (#2058)
* feat: add computed property and tests * feat(tests): add checking with watchEffect --------- Co-authored-by: mnenie <[email protected]>
1 parent fe6956c commit 44169cd

File tree

4 files changed

+57
-18
lines changed

4 files changed

+57
-18
lines changed

packages/vue-i18n-core/src/composer.ts

+7-4
Original file line numberDiff line numberDiff line change
@@ -1315,7 +1315,7 @@ export interface Composer<
13151315
* @remarks
13161316
* The list of available locales in `messages` in lexical order.
13171317
*/
1318-
readonly availableLocales: Locales[]
1318+
readonly availableLocales: ComputedRef<Locales[]>
13191319
/**
13201320
* @remarks
13211321
* The locale messages of localization.
@@ -2130,6 +2130,11 @@ export function createComposer(options: any = {}): any {
21302130
() => _messages.value as any
21312131
)
21322132

2133+
// availableLocales
2134+
const availableLocales = computed<Locale[]>(() =>
2135+
Object.keys(_messages.value).sort()
2136+
)
2137+
21332138
// datetimeFormats
21342139
const datetimeFormats = /* #__PURE__*/ computed<DateTimeFormatsType>(
21352140
() => _datetimeFormats.value
@@ -2549,9 +2554,7 @@ export function createComposer(options: any = {}): any {
25492554
updateFallbackLocale(_context, _locale.value, _fallbackLocale.value)
25502555
}
25512556
},
2552-
get availableLocales(): Locale[] {
2553-
return Object.keys(_messages.value).sort()
2554-
},
2557+
availableLocales,
25552558
messages,
25562559
get modifiers(): LinkedModifiers<Message> {
25572560
return _modifiers

packages/vue-i18n-core/src/legacy.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -967,7 +967,7 @@ export interface VueI18n<
967967
* @remarks
968968
* The list of available locales in `messages` in lexical order.
969969
*/
970-
readonly availableLocales: Composition['availableLocales']
970+
readonly availableLocales: Locales[]
971971
/**
972972
* @remarks
973973
* The locale messages of localization.
@@ -1485,7 +1485,7 @@ export function createVueI18n(options: any = {}): any {
14851485

14861486
// availableLocales
14871487
get availableLocales(): Locale[] {
1488-
return composer.availableLocales as Locale[]
1488+
return composer.availableLocales.value
14891489
},
14901490

14911491
// missing

packages/vue-i18n-core/test/composer.test.ts

+11-3
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ describe('inheritLocale', () => {
150150
describe('availableLocales', () => {
151151
test('not initialize messages at composer creating', () => {
152152
const { availableLocales } = createComposer({})
153-
expect(availableLocales).toEqual(['en-US'])
153+
expect(availableLocales.value).toEqual(['en-US'])
154154
})
155155

156156
test('initialize messages at composer creating', () => {
@@ -162,10 +162,18 @@ describe('availableLocales', () => {
162162
fr: {}
163163
}
164164
})
165-
expect(availableLocales).toEqual(['en', 'ja', 'ru', 'fr'].sort())
165+
expect(availableLocales.value).toEqual(['en', 'ja', 'ru', 'fr'].sort())
166+
})
167+
test('reactive update', () => {
168+
const { availableLocales, setLocaleMessage } = createComposer({
169+
messages: {
170+
en: {}
171+
}
172+
})
173+
setLocaleMessage('ja', { hello: 'こんにちは、世界!' })
174+
expect(availableLocales.value).toEqual(['en', 'ja'].sort())
166175
})
167176
})
168-
169177
describe('messages', () => {
170178
test('default value', () => {
171179
const { messages } = createComposer({})

packages/vue-i18n-core/test/legacy.test.ts

+37-9
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,44 @@ test('fallbackLocale', () => {
4444
expect(i18n.fallbackLocale).toEqual('ja')
4545
})
4646

47-
test('availableLocales', () => {
48-
const i18n = createVueI18n({
49-
messages: {
50-
en: {},
51-
ja: {},
52-
ru: {},
53-
fr: {}
54-
}
47+
describe('availableLocales', () => {
48+
test('initialize messages', async () => {
49+
const i18n = createVueI18n({
50+
messages: {
51+
en: {},
52+
ja: {},
53+
fr: {}
54+
}
55+
})
56+
expect(i18n.availableLocales).toEqual(['en', 'ja', 'fr'].sort())
57+
})
58+
test('reactive update', () => {
59+
const i18n = createVueI18n({
60+
messages: {
61+
en: {},
62+
ja: {},
63+
fr: {}
64+
}
65+
})
66+
i18n.setLocaleMessage('ru', { hello: 'Привет мир!' })
67+
expect(i18n.availableLocales).toEqual(['en', 'ja', 'fr', 'ru'].sort())
68+
})
69+
test('trigger new value with watchEffect', async () => {
70+
const i18n = createVueI18n({
71+
messages: {
72+
ja: {}
73+
}
74+
})
75+
let locales = [] as string[]
76+
77+
watchEffect(() => {
78+
locales = i18n.availableLocales
79+
})
80+
81+
i18n.setLocaleMessage('en', { hello: 'Hello' })
82+
await nextTick()
83+
expect(locales.sort()).toEqual(['en', 'ja'].sort())
5584
})
56-
expect(i18n.availableLocales).toEqual(['en', 'ja', 'ru', 'fr'].sort())
5785
})
5886

5987
test('missing', () => {

0 commit comments

Comments
 (0)