Skip to content

Commit de5e462

Browse files
authored
Merge pull request #13 from A-Ghorab/main
add new wTrans and wTransChoice
2 parents 2c10e6e + 9344325 commit de5e462

File tree

5 files changed

+106
-7
lines changed

5 files changed

+106
-7
lines changed

README.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,32 @@ trans('Welcome, :name!', { name: 'Francisco' }) // Bem-vindo Francisco!
7777
trans('Welcome, :NAME!', { name: 'Francisco' }) // Bem-vindo FRANCISCO!
7878
```
7979

80+
### `wTrans(message: string, replacements: {})`
81+
82+
The `wTrans()` same as `trans()` but returns a reactive obj with translated value,
83+
use it instead of `trans()` to watch any changes (language changes or lang files loaded) and set the new value.
84+
```jsx
85+
// lang/pt.json
86+
{
87+
"Welcome!": "Bem-vindo!",
88+
"Welcome, :name!": "Bem-vindo, :name!",
89+
}
90+
91+
import { wTrans } from 'laravel-vue-i18n';
92+
93+
setup() {
94+
return {
95+
welcomeLabel: wTrans('Welcome!'),
96+
welcomeFrancisco: wTrans('Welcome, :name!', { name: 'Francisco' })
97+
}
98+
}
99+
100+
<template>
101+
<div>{{ welcomeLabel }}</div> // <div>Bem-vindo!</div>
102+
<div>{{ welcomeFrancisco }}</div> // <div>Bem-vindo, Francisco!</div>
103+
</template>
104+
```
105+
80106
### `transChoice(message: string, count: number, replacements: {})`
81107

82108
The `transChoice()` method can translate a given message based on a count,
@@ -97,6 +123,36 @@ transChoice('{0} There are none|[1,19] There are some|[20,*] There are many', 19
97123
transChoice('{1} :count minute ago|[2,*] :count minutes ago', 10); // Há 10 minutos.
98124
```
99125

126+
127+
### `wTransChoice(message: string, count: number, replacements: {})`
128+
129+
The `wTransChoice()` same as `transChoice()` but returns a reactive obj with translated value,
130+
use it instead of `transChoice()` to watch any changes (language changes or lang files loaded) and set the new value.
131+
132+
133+
```jsx
134+
// lang/pt.json
135+
{
136+
"There is one apple|There are many apples": "Existe uma maça|Existe muitas maças",
137+
"{0} There are none|[1,19] There are some|[20,*] There are many": "Não tem|Tem algumas|Tem muitas",
138+
"{1} :count minute ago|[2,*] :count minutes ago": "{1} há :count minuto|[2,*] há :count minutos",
139+
}
140+
141+
import { wTransChoice } from 'laravel-vue-i18n';
142+
143+
setup() {
144+
return {
145+
oneAppleLabel: wTransChoice('There is one apple|There are many apples', 1),
146+
multipleApplesLabel: wTransChoice('{0} There are none|[1,19] There are some|[20,*] There are many', 19)
147+
}
148+
}
149+
150+
<template>
151+
<div>{{ oneAppleLabel }}</div> // <div>Existe uma maça</div>
152+
<div>{{ multipleApplesLabel }}</div> // <div>Tem algumas</div>
153+
</template>
154+
```
155+
100156
### `loadLanguageAsync(lang: string)`
101157

102158
The `loadLanguageAsync()` can be used to change the location during the runtime.

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)