Skip to content

Commit

Permalink
fix: cannot resolve flatjson messages
Browse files Browse the repository at this point in the history
resolve #1595
  • Loading branch information
kazupon committed Oct 22, 2023
1 parent bd7ec22 commit edaf498
Show file tree
Hide file tree
Showing 2 changed files with 137 additions and 2 deletions.
23 changes: 21 additions & 2 deletions packages/vue-i18n-core/src/composer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ import {
isPlainObject,
isObject,
assign,
inBrowser
inBrowser,
hasOwn
} from '@intlify/shared'
import {
isTranslateFallbackWarn,
Expand Down Expand Up @@ -53,7 +54,8 @@ import {
deepCopy,
getLocaleMessages,
getComponentOptions,
createTextNode
createTextNode,
handleFlatJson
} from './utils'
import { VERSION } from './misc'

Expand Down Expand Up @@ -1848,6 +1850,7 @@ export function createComposer(options: any = {}, VueI18nLegacy?: any): any {
NumberFormatsType
>
const _isGlobal = __root === undefined
const flatJson = options.flatJson

let _inheritLocale = isBoolean(options.inheritLocale)
? options.inheritLocale
Expand Down Expand Up @@ -2375,6 +2378,15 @@ export function createComposer(options: any = {}, VueI18nLegacy?: any): any {

// setLocaleMessage
function setLocaleMessage(locale: Locale, message: LocaleMessage<Message>) {
if (flatJson) {
const _message = { [locale]: message }
for (const key in _message) {
if (hasOwn(_message, key)) {
handleFlatJson(_message[key])
}
}
message = _message[locale]
}
_messages.value[locale] = message
if (__BRIDGE__) {
__legacy && __legacy.setLocaleMessage(locale, message)
Expand All @@ -2391,6 +2403,13 @@ export function createComposer(options: any = {}, VueI18nLegacy?: any): any {
if (__BRIDGE__) {
__legacy && __legacy.mergeLocaleMessage(locale, message)
}
const _message = { [locale]: message }
for (const key in _message) {
if (hasOwn(_message, key)) {
handleFlatJson(_message[key])
}
}
message = _message[locale]
deepCopy(message, _messages.value[locale])
_context.messages = _messages.value as typeof _context.messages
}
Expand Down
116 changes: 116 additions & 0 deletions packages/vue-i18n-core/test/issues.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1049,3 +1049,119 @@ test('issue #1547', async () => {

expect(wrapper.html()).toEqual('<div>Deep Linked message</div>')
})

test('issue #1595', async () => {
const i18n = createI18n({
legacy: false,
locale: 'en',
flatJson: true,
messages: {
en: {
simple: 'Simple',
'deep.key': 'Deep',
content: '@:simple @:deep.key'
}
}
})

const ja = {
simple: 'シンプル',
'deep.key': 'ディープ',
content: '@:simple @:deep.key'
}
i18n.global.setLocaleMessage('ja', ja)

const App = defineComponent({
setup() {
const { t, locale } = useI18n()
return { t, locale }
},
template: `<form>
<select v-model="locale">
<option value="en">en</option>
<option value="ja">ja</option>
</select>
</form>
{{ t('content') }}
`
})

expect(i18n.global.getLocaleMessage('ja')).toEqual({
simple: 'シンプル',
deep: {
key: 'ディープ'
},
content: '@:simple @:deep.key'
})

const wrapper = await mount(App, i18n)
expect(wrapper.html()).toEqual(
'<form><select><option value="en">en</option><option value="ja">ja</option></select></form> Simple Deep'
)
// @ts-ignore
i18n.global.locale.value = 'ja'
await nextTick()

expect(wrapper.html()).toEqual(
'<form><select><option value="en">en</option><option value="ja">ja</option></select></form> シンプル ディープ'
)
})

test('issue #1595 merge case', async () => {
const i18n = createI18n({
legacy: false,
locale: 'en',
flatJson: true,
messages: {
en: {
simple: 'Simple',
'deep.key': 'Deep',
content: '@:simple @:deep.key'
},
ja: {
simple: 'シンプル',
content: '@:simple @:deep.key'
}
}
})

const ja = {
'deep.key': 'ディープ'
}
i18n.global.mergeLocaleMessage('ja', ja)

const App = defineComponent({
setup() {
const { t, locale } = useI18n()
return { t, locale }
},
template: `<form>
<select v-model="locale">
<option value="en">en</option>
<option value="ja">ja</option>
</select>
</form>
{{ $t('content') }}
`
})

expect(i18n.global.getLocaleMessage('ja')).toEqual({
simple: 'シンプル',
deep: {
key: 'ディープ'
},
content: '@:simple @:deep.key'
})

const wrapper = await mount(App, i18n)
expect(wrapper.html()).toEqual(
'<form><select><option value="en">en</option><option value="ja">ja</option></select></form> Simple Deep'
)
// @ts-ignore
i18n.global.locale.value = 'ja'
await nextTick()

expect(wrapper.html()).toEqual(
'<form><select><option value="en">en</option><option value="ja">ja</option></select></form> シンプル ディープ'
)
})

0 comments on commit edaf498

Please sign in to comment.