Skip to content

Commit c603570

Browse files
add new wTrans and wTransChoice
will watch any changes happens to the activeMessages object return the correct translation during any changes
1 parent 2c10e6e commit c603570

File tree

4 files changed

+50
-7
lines changed

4 files changed

+50
-7
lines changed

src/index.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { reactive, Plugin } from 'vue'
1+
import { reactive, Plugin, computed, ComputedRef } from 'vue'
22
import { OptionsInterface } from './interfaces/options'
33
import { LanguageInterface } from './interfaces/language'
44
import { LanguageJsonFileInterface } from './interfaces/language-json-file'
@@ -67,22 +67,36 @@ export function loadLanguageAsync(lang: string): Promise<string | void> {
6767
* Get the translation for the given key.
6868
*/
6969
export function trans(key: string, replacements: ReplacementsInterface = {}): string {
70+
return wTrans(key, replacements).value
71+
}
72+
73+
/**
74+
* Get the translation for the given key and watch for any changes.
75+
*/
76+
export function wTrans(key: string, replacements: ReplacementsInterface = {}): ComputedRef<string> {
7077
if (!activeMessages[key]) {
7178
activeMessages[key] = key
7279
}
7380

74-
return makeReplacements(activeMessages[key], replacements)
81+
return computed(() => makeReplacements(activeMessages[key], replacements))
7582
}
7683

7784
/**
7885
* Translates the given message based on a count.
7986
*/
8087
export function transChoice(key: string, number: number, replacements: ReplacementsInterface = {}): string {
81-
const message = trans(key, replacements)
88+
return wTransChoice(key, number, replacements).value
89+
}
90+
91+
/**
92+
* Translates the given message based on a count and watch for changes.
93+
*/
94+
export function wTransChoice(key: string, number: number, replacements: ReplacementsInterface = {}): ComputedRef<string> {
95+
const message = wTrans(key, replacements)
8296

8397
replacements.count = number.toString()
8498

85-
return makeReplacements(choose(message, number, options.lang), replacements)
99+
return computed(() => makeReplacements(choose(message.value, number, options.lang), replacements))
86100
}
87101

88102
/**

test/fixtures/lang/en.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"Welcome!": "Wecome!",
33
"Welcome, :name!": "Bem-vindo, :name!",
4-
"Only Available on EN": "Only Available on EN"
4+
"Only Available on EN": "Only Available on EN",
5+
"{1} :count minute ago|[2,*] :count minutes ago": "{1} :count minute ago|[2,*] :count minutes ago"
56
}

test/plurization.test.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { trans_choice, transChoice } from '../src';
1+
import { trans_choice, transChoice, wTransChoice, loadLanguageAsync } from '../src';
22

33
it.each([
44
['first', 'first', 1],
@@ -71,3 +71,18 @@ it('translates even using an alias "trans_choice"', async () => {
7171
expect(trans_choice('{1} :count minute ago|[2,*] :count minutes ago', 3))
7272
.toBe('há 3 minutos');
7373
})
74+
75+
76+
it('translates "wTransChoice" and test language change values', async () => {
77+
await global.mountPlugin()
78+
79+
const translation = wTransChoice('{1} :count minute ago|[2,*] :count minutes ago', 3)
80+
expect(translation.value)
81+
.toBe('há 3 minutos');
82+
83+
await loadLanguageAsync('en');
84+
85+
expect(translation.value)
86+
.toBe('3 minutes ago');
87+
88+
})

test/translate.test.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { mount } from '@vue/test-utils'
2-
import { i18nVue, trans, trans_choice, loadLanguageAsync, reset, getActiveLanguage, isLoaded } from '../src'
2+
import { i18nVue, trans, trans_choice, loadLanguageAsync, reset, getActiveLanguage, isLoaded, wTrans } from '../src'
33

44
beforeEach(() => reset());
55

@@ -94,3 +94,16 @@ it('checks if is a lang is loaded', async () => {
9494
await loadLanguageAsync('zh_TW');
9595
expect(isLoaded('zh_TW')).toBe(true);
9696
})
97+
98+
it('checks if watching translation works', async () => {
99+
await global.mountPlugin();
100+
101+
const translated = wTrans("Welcome!");
102+
expect(translated.value)
103+
.toBe('Bem-vindo!')
104+
105+
await loadLanguageAsync('en')
106+
107+
expect(translated.value)
108+
.toBe('Wecome!')
109+
})

0 commit comments

Comments
 (0)