mirror of
https://github.com/cupcakearmy/svelte-i18n.git
synced 2024-06-30 18:54:49 +02:00
fix: 🐛 lookup message not caching correctly
It was only caching lookups of fallback locales. If a message was found in the passed locale, it wouldn't be cached.
This commit is contained in:
parent
f8b0fe8bbe
commit
bb8c68f2eb
|
@ -10,14 +10,24 @@ const addToCache = (path: string, locale: string, message: string) => {
|
||||||
return message
|
return message
|
||||||
}
|
}
|
||||||
|
|
||||||
export const lookupMessage = (path: string, locale: string): string => {
|
const searchForMessage = (path: string, locale: string): string => {
|
||||||
if (locale == null) return null
|
if (locale == null) return null
|
||||||
if (locale in lookupCache && path in lookupCache[locale]) {
|
|
||||||
return lookupCache[locale][path]
|
|
||||||
}
|
|
||||||
|
|
||||||
const message = getMessageFromDictionary(locale, path)
|
const message = getMessageFromDictionary(locale, path)
|
||||||
if (message) return message
|
if (message) return message
|
||||||
|
|
||||||
return addToCache(path, locale, lookupMessage(path, getFallbackOf(locale)))
|
return searchForMessage(path, getFallbackOf(locale))
|
||||||
|
}
|
||||||
|
|
||||||
|
export const lookup = (path: string, locale: string) => {
|
||||||
|
if (locale in lookupCache && path in lookupCache[locale]) {
|
||||||
|
return lookupCache[locale][path]
|
||||||
|
}
|
||||||
|
|
||||||
|
const message = searchForMessage(path, locale)
|
||||||
|
if (message) {
|
||||||
|
return addToCache(path, locale, message)
|
||||||
|
}
|
||||||
|
|
||||||
|
return null
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { derived } from 'svelte/store'
|
import { derived } from 'svelte/store'
|
||||||
|
|
||||||
import { Formatter, MessageObject } from '../types'
|
import { Formatter, MessageObject } from '../types'
|
||||||
import { lookupMessage } from '../includes/lookup'
|
import { lookup } from '../includes/lookup'
|
||||||
import { hasLocaleQueue } from '../includes/loaderQueue'
|
import { hasLocaleQueue } from '../includes/loaderQueue'
|
||||||
import { capital, upper, lower, title } from '../includes/utils'
|
import { capital, upper, lower, title } from '../includes/utils'
|
||||||
import {
|
import {
|
||||||
|
@ -29,7 +29,7 @@ const formatMessage: Formatter = (id, options = {}) => {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
const message = lookupMessage(id, locale)
|
const message = lookup(id, locale)
|
||||||
|
|
||||||
if (!message) {
|
if (!message) {
|
||||||
if (getOptions().warnOnMissingMessages) {
|
if (getOptions().warnOnMissingMessages) {
|
||||||
|
|
|
@ -28,6 +28,7 @@ export function getFallbackOf(locale: string) {
|
||||||
if (fallbackLocale && !isRelatedLocale(locale, fallbackLocale)) {
|
if (fallbackLocale && !isRelatedLocale(locale, fallbackLocale)) {
|
||||||
return fallbackLocale
|
return fallbackLocale
|
||||||
}
|
}
|
||||||
|
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { lookupMessage, lookupCache } from '../../../src/client/includes/lookup'
|
import { lookup, lookupCache } from '../../../src/client/includes/lookup'
|
||||||
import { $dictionary, addMessages } from '../../../src/client/stores/dictionary'
|
import { $dictionary, addMessages } from '../../../src/client/stores/dictionary'
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
|
@ -6,43 +6,46 @@ beforeEach(() => {
|
||||||
})
|
})
|
||||||
|
|
||||||
test('returns null if no locale was passed', () => {
|
test('returns null if no locale was passed', () => {
|
||||||
expect(lookupMessage('message.id', undefined)).toBe(null)
|
expect(lookup('message.id', undefined)).toBe(null)
|
||||||
expect(lookupMessage('message.id', null)).toBe(null)
|
expect(lookup('message.id', null)).toBe(null)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('gets a shallow message of a locale dictionary', () => {
|
test('gets a shallow message of a locale dictionary', () => {
|
||||||
addMessages('en', { field: 'name' })
|
addMessages('en', { field: 'name' })
|
||||||
expect(lookupMessage('field', 'en')).toBe('name')
|
|
||||||
|
expect(lookup('field', 'en')).toBe('name')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('gets a deep message of a locale dictionary', () => {
|
test('gets a deep message of a locale dictionary', () => {
|
||||||
addMessages('en', { deep: { field: 'lastname' } })
|
addMessages('en', { deep: { field: 'lastname' } })
|
||||||
expect(lookupMessage('deep.field', 'en')).toBe('lastname')
|
expect(lookup('deep.field', 'en')).toBe('lastname')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('gets a message from the fallback dictionary', () => {
|
test('gets a message from the fallback dictionary', () => {
|
||||||
addMessages('en', { field: 'name' })
|
addMessages('en', { field: 'name' })
|
||||||
expect(lookupMessage('field', 'en-US')).toBe('name')
|
|
||||||
|
expect(lookup('field', 'en-US')).toBe('name')
|
||||||
})
|
})
|
||||||
|
|
||||||
test('caches found messages by locale', () => {
|
test('caches found messages by locale', () => {
|
||||||
addMessages('en', { field: 'name' })
|
addMessages('en', { field: 'name' })
|
||||||
addMessages('pt', { field: 'nome' })
|
addMessages('pt', { field: 'nome' })
|
||||||
lookupMessage('field', 'en-US')
|
lookup('field', 'en-US')
|
||||||
lookupMessage('field', 'pt-BR')
|
lookup('field', 'pt')
|
||||||
|
|
||||||
expect(lookupCache).toMatchObject({
|
expect(lookupCache).toMatchObject({
|
||||||
'en-US': { field: 'name' },
|
'en-US': { field: 'name' },
|
||||||
'pt-BR': { field: 'nome' },
|
pt: { field: 'nome' },
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
test("doesn't cache falsy messages", () => {
|
test("doesn't cache falsy messages", () => {
|
||||||
addMessages('en', { field: 'name' })
|
addMessages('en', { field: 'name' })
|
||||||
addMessages('pt', { field: 'nome' })
|
addMessages('pt', { field: 'nome' })
|
||||||
lookupMessage('field_2', 'en-US')
|
lookup('field_2', 'en-US')
|
||||||
lookupMessage('field_2', 'pt-BR')
|
lookup('field_2', 'pt')
|
||||||
expect(lookupCache).not.toMatchObject({
|
expect(lookupCache).not.toMatchObject({
|
||||||
'en-US': { field_2: 'name' },
|
'en-US': { field_2: 'name' },
|
||||||
'pt-BR': { field_2: 'nome' },
|
pt: { field_2: 'nome' },
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { get } from 'svelte/store'
|
import { get } from 'svelte/store'
|
||||||
|
|
||||||
import { lookupMessage } from '../../../src/client/includes/lookup'
|
import { lookup } from '../../../src/client/includes/lookup'
|
||||||
import {
|
import {
|
||||||
isFallbackLocaleOf,
|
isFallbackLocaleOf,
|
||||||
getFallbackOf,
|
getFallbackOf,
|
||||||
|
@ -132,5 +132,5 @@ test('should flush the queue of the locale when changing the store value', async
|
||||||
await $locale.set('en')
|
await $locale.set('en')
|
||||||
|
|
||||||
expect(hasLocaleQueue('en')).toBe(false)
|
expect(hasLocaleQueue('en')).toBe(false)
|
||||||
expect(lookupMessage('foo', 'en')).toBe('Foo')
|
expect(lookup('foo', 'en')).toBe('Foo')
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue
Block a user