Skip to content

Commit a312a37

Browse files
committed
feat: resolve will handle require, object or Promise. #19
2 parents 4766970 + 058b0c3 commit a312a37

File tree

4 files changed

+56
-3
lines changed

4 files changed

+56
-3
lines changed

README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,17 @@ resolve: async lang => {
4949
}
5050
````
5151

52+
### With SSR
53+
54+
The `resolve` method can receive a `require` instead of a `Promise`:
55+
56+
```js
57+
.use(i18nVue, {
58+
lang: 'pt',
59+
resolve: lang => require(`../../lang/${lang}.json`),
60+
})
61+
````
62+
5263
### Usage
5364
5465
```html

src/index.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { reactive, Plugin, computed, ComputedRef } from 'vue'
22
import { OptionsInterface } from './interfaces/options'
33
import { LanguageInterface } from './interfaces/language'
4+
import { LanguageJsonFileInterface } from './interfaces/language-json-file'
45
import { ReplacementsInterface } from './interfaces/replacements'
56
import { choose } from './pluralization'
67

@@ -51,8 +52,7 @@ export function loadLanguageAsync(lang: string): Promise<string | void> {
5152
return Promise.resolve(setLanguage(loadedLang))
5253
}
5354

54-
return options
55-
.resolve(lang)
55+
return resolveLang(options.resolve, lang)
5656
.then(({ default: messages }) => {
5757
const data: LanguageInterface = { lang, messages }
5858
loaded.push(data)
@@ -134,6 +134,19 @@ function setLanguage({ lang, messages }: LanguageInterface): string {
134134
return lang
135135
}
136136

137+
/**
138+
* It resolves the language file or data, from direct data, require or Promise.
139+
*/
140+
function resolveLang(callable: Function, lang: string): Promise<LanguageJsonFileInterface> {
141+
const data = callable(lang)
142+
143+
if (data instanceof Promise) {
144+
return data
145+
}
146+
147+
return new Promise((resolve) => resolve({ default: data }))
148+
}
149+
137150
/**
138151
* Make the place-holder replacements on a line.
139152
*/

test/fixtures/lang/en.json

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

test/translate.test.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,32 @@ it('checks if watching translation works', async () => {
107107
expect(translated.value)
108108
.toBe('Wecome!')
109109
})
110+
111+
it('resolves translated data without Promise', async () => {
112+
const wrapper = mount({ template: `<h1>{{ $t('Welcome!') }}</h1>` }, {
113+
global: {
114+
plugins: [[i18nVue, {
115+
resolve: () => ({ 'Foo': 'Bar' }),
116+
}]]
117+
}
118+
});
119+
120+
await new Promise(resolve => setTimeout(resolve));
121+
122+
expect(trans('Foo')).toBe('Bar');
123+
});
124+
125+
it('resolves translated data with require', async () => {
126+
const wrapper = mount({ template: `<h1>{{ $t('Welcome!') }}</h1>` }, {
127+
global: {
128+
plugins: [[i18nVue, {
129+
lang: 'pt',
130+
resolve: (lang) => require(`./fixtures/lang/${lang}.json`),
131+
}]]
132+
}
133+
});
134+
135+
await new Promise(resolve => setTimeout(resolve));
136+
137+
expect(trans('Welcome!')).toBe('Bem-vindo!');
138+
});

0 commit comments

Comments
 (0)