Skip to content

Commit e2bd7e0

Browse files
authored
fix: replacements with the same prefix (#109)
1 parent f50586a commit e2bd7e0

File tree

2 files changed

+18
-8
lines changed

2 files changed

+18
-8
lines changed

src/index.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -425,14 +425,16 @@ export class I18n {
425425
makeReplacements(message: string, replacements?: ReplacementsInterface): string {
426426
const capitalize = (s: string) => s.charAt(0).toUpperCase() + s.slice(1)
427427

428-
Object.entries(replacements || []).forEach(([key, value]) => {
429-
value = value.toString()
430-
431-
message = message
432-
.replace(new RegExp(`:${key}`, 'g'), value)
433-
.replace(new RegExp(`:${key.toUpperCase()}`, 'g'), value.toUpperCase())
434-
.replace(new RegExp(`:${capitalize(key)}`, 'g'), capitalize(value))
435-
})
428+
Object.entries(replacements || [])
429+
.sort((a, b) => (a[0].length >= b[0].length ? -1 : 1))
430+
.forEach(([key, value]) => {
431+
value = value.toString()
432+
433+
message = message
434+
.replace(new RegExp(`:${key}`, 'g'), value)
435+
.replace(new RegExp(`:${key.toUpperCase()}`, 'g'), value.toUpperCase())
436+
.replace(new RegExp(`:${capitalize(key)}`, 'g'), capitalize(value))
437+
})
436438

437439
return message
438440
}

test/translate.test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,14 @@ it('replaces multiple occurrences with "trans" helper', async () => {
8888
.toBe('olá Francisco, olá Francisco')
8989
})
9090

91+
it('replaces occurrences that have the same prefix name', async () => {
92+
await global.mountPlugin();
93+
94+
expect(trans('Showing :from - :to of :total items',
95+
{ from: '1', to: '2', total: '300' }
96+
)).toBe('Showing 1 - 2 of 300 items')
97+
});
98+
9199
it('loads a lang', async () => {
92100
const wrapper = await global.mountPlugin(`<h1>{{ $t('Welcome, :name!', { name: 'Francisco' }) }}</h1>`, 'en');
93101

0 commit comments

Comments
 (0)