Skip to content

Commit 658efbf

Browse files
authored
Fix: Synchronous Watcher Issue Caused by Locale Setting Order (#2104)
1 parent c1e7b6d commit 658efbf

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -2110,17 +2110,17 @@ export function createComposer(options: any = {}): any {
21102110
const locale = computed({
21112111
get: () => _locale.value,
21122112
set: val => {
2113+
_context.locale = val
21132114
_locale.value = val
2114-
_context.locale = _locale.value
21152115
}
21162116
})
21172117

21182118
// fallbackLocale
21192119
const fallbackLocale = computed({
21202120
get: () => _fallbackLocale.value,
21212121
set: val => {
2122+
_context.fallbackLocale = val
21222123
_fallbackLocale.value = val
2123-
_context.fallbackLocale = _fallbackLocale.value
21242124
updateFallbackLocale(_context, _locale.value, val)
21252125
}
21262126
})

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

+22-1
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,35 @@ describe('locale', () => {
6464
test('reactivity', async () => {
6565
const fn = vi.fn()
6666

67-
const { locale } = createComposer({})
67+
const { locale, t } = createComposer({
68+
messages: {
69+
en: {
70+
test: 'en'
71+
},
72+
'en-US': {
73+
test: 'en-US'
74+
}
75+
}
76+
})
6877
watch(locale, fn)
6978
locale.value = 'en'
7079
await nextTick()
7180

7281
expect(fn).toBeCalled()
7382
expect(fn.mock.calls[0][0]).toEqual('en')
7483
expect(fn.mock.calls[0][1]).toEqual('en-US')
84+
85+
let result = ''
86+
locale.value = 'en'
87+
88+
watch(locale, () => (result = t('test')), {
89+
immediate: true,
90+
flush: 'sync'
91+
})
92+
expect(result).toEqual('en')
93+
locale.value = 'en-US'
94+
await nextTick()
95+
expect(result).toEqual('en-US')
7596
})
7697
})
7798

0 commit comments

Comments
 (0)