1
- import { afterEach , expect , test , vi } from 'vitest'
1
+ import { afterEach , describe , expect , test , vi } from 'vitest'
2
2
import { createApp , eventHandler , toNodeListener } from 'h3'
3
3
import { getQueryLocale } from '@intlify/utils/h3'
4
4
import supertest from 'supertest'
@@ -11,6 +11,8 @@ import {
11
11
12
12
import type { App , H3Event } from 'h3'
13
13
import type { SuperTest , Test } from 'supertest'
14
+ import type { CoreContext } from '@intlify/core'
15
+ import type { DefineLocaleMessage } from '../src/index.ts'
14
16
15
17
let app : App
16
18
let request : SuperTest < Test >
@@ -36,8 +38,8 @@ test('translation', async () => {
36
38
37
39
app . use (
38
40
'/' ,
39
- eventHandler ( ( event ) => {
40
- const t = useTranslation ( event )
41
+ eventHandler ( async ( event ) => {
42
+ const t = await useTranslation ( event )
41
43
return { message : t ( 'hello' , { name : 'h3' } ) }
42
44
} ) ,
43
45
)
@@ -49,40 +51,93 @@ test('translation', async () => {
49
51
expect ( res . body ) . toEqual ( { message : 'hello, h3' } )
50
52
} )
51
53
52
- test ( 'custom locale detection' , async ( ) => {
53
- const defaultLocale = 'en'
54
-
55
- // define custom locale detector
56
- const localeDetector = ( event : H3Event ) : string => {
57
- try {
54
+ describe ( 'custom locale detection' , ( ) => {
55
+ test ( 'basic' , async ( ) => {
56
+ // define custom locale detector
57
+ const localeDetector = ( event : H3Event ) : string => {
58
58
return getQueryLocale ( event ) . toString ( )
59
- } catch ( _e ) {
60
- return defaultLocale
61
59
}
62
- }
63
60
64
- const middleware = defineI18nMiddleware ( {
65
- locale : localeDetector ,
66
- messages : {
61
+ const middleware = defineI18nMiddleware ( {
62
+ locale : localeDetector ,
63
+ messages : {
64
+ en : {
65
+ hello : 'hello, {name}' ,
66
+ } ,
67
+ ja : {
68
+ hello : 'こんにちは, {name}' ,
69
+ } ,
70
+ } ,
71
+ } )
72
+ app = createApp ( { ...middleware } )
73
+ request = supertest ( toNodeListener ( app ) )
74
+
75
+ app . use (
76
+ '/' ,
77
+ eventHandler ( async ( event ) => {
78
+ const t = await useTranslation ( event )
79
+ return { message : t ( 'hello' , { name : 'h3' } ) }
80
+ } ) ,
81
+ )
82
+
83
+ const res = await request . get ( '/?locale=ja' )
84
+ expect ( res . body ) . toEqual ( { message : 'こんにちは, h3' } )
85
+ } )
86
+
87
+ test ( 'async' , async ( ) => {
88
+ const sleep = ( ms : number ) => new Promise ( ( resolve ) => setTimeout ( resolve , ms ) )
89
+
90
+ const loader = ( path : string ) => import ( path ) . then ( ( m ) => m . default || m )
91
+ const messages : Record < string , ( ) => ReturnType < typeof loader > > = {
92
+ en : ( ) => loader ( './fixtures/en.json' ) ,
93
+ ja : ( ) => loader ( './fixtures/ja.json' ) ,
94
+ }
95
+
96
+ // async locale detector
97
+ const localeDetector = async (
98
+ event : H3Event ,
99
+ i18n : CoreContext < string , DefineLocaleMessage > ,
100
+ ) => {
101
+ const locale = getQueryLocale ( event ) . toString ( )
102
+ await sleep ( 100 )
103
+ const loader = messages [ locale ]
104
+ if ( loader && ! i18n . messages [ locale ] ) {
105
+ const message = await loader ( )
106
+ i18n . messages [ locale ] = message
107
+ }
108
+ return locale
109
+ }
110
+
111
+ const middleware = defineI18nMiddleware ( {
112
+ locale : localeDetector ,
113
+ messages : {
114
+ en : {
115
+ hello : 'hello, {name}' ,
116
+ } ,
117
+ } ,
118
+ } )
119
+ app = createApp ( { ...middleware } )
120
+ request = supertest ( toNodeListener ( app ) )
121
+
122
+ app . use (
123
+ '/' ,
124
+ eventHandler ( async ( event ) => {
125
+ const t = await useTranslation ( event )
126
+ return { message : t ( 'hello' , { name : 'h3' } ) }
127
+ } ) ,
128
+ )
129
+
130
+ const translated : Record < string , { message : string } > = {
67
131
en : {
68
- hello : 'hello, {name} ' ,
132
+ message : 'hello, h3 ' ,
69
133
} ,
70
134
ja : {
71
- hello : 'こんにちは, {name} ' ,
135
+ message : 'こんにちは, h3 ' ,
72
136
} ,
73
- } ,
137
+ }
138
+ for ( const locale of [ 'en' , 'ja' ] ) {
139
+ const res = await request . get ( `/?locale=${ locale } ` )
140
+ expect ( res . body ) . toEqual ( translated [ locale ] )
141
+ }
74
142
} )
75
- app = createApp ( { ...middleware } )
76
- request = supertest ( toNodeListener ( app ) )
77
-
78
- app . use (
79
- '/' ,
80
- eventHandler ( ( event ) => {
81
- const t = useTranslation ( event )
82
- return { message : t ( 'hello' , { name : 'h3' } ) }
83
- } ) ,
84
- )
85
-
86
- const res = await request . get ( '/?locale=ja' )
87
- expect ( res . body ) . toEqual ( { message : 'こんにちは, h3' } )
88
143
} )
0 commit comments