@midwayjs/i18n 3.3.6 → 3.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/interface.d.ts +9 -8
- package/dist/middleware.js +85 -71
- package/package.json +2 -2
package/dist/interface.d.ts
CHANGED
|
@@ -3,19 +3,20 @@ export interface TranslateOptions {
|
|
|
3
3
|
group?: string;
|
|
4
4
|
args?: any;
|
|
5
5
|
}
|
|
6
|
+
export interface RequestResolver {
|
|
7
|
+
queryField: string;
|
|
8
|
+
cookieField: {
|
|
9
|
+
fieldName: string;
|
|
10
|
+
cookieDomain: string;
|
|
11
|
+
cookieMaxAge: number;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
6
14
|
export interface I18nOptions {
|
|
7
15
|
defaultLocale: string;
|
|
8
16
|
localeTable: Record<string, Record<string, any>>;
|
|
9
17
|
fallbacks: Record<string, any>;
|
|
10
18
|
writeCookie: boolean;
|
|
11
|
-
resolver:
|
|
12
|
-
queryField: string;
|
|
13
|
-
cookieField: {
|
|
14
|
-
fieldName: string;
|
|
15
|
-
cookieDomain: string;
|
|
16
|
-
cookieMaxAge: number;
|
|
17
|
-
};
|
|
18
|
-
};
|
|
19
|
+
resolver: RequestResolver | false;
|
|
19
20
|
}
|
|
20
21
|
export declare const I18N_ATTR_KEY = "i18n:locale";
|
|
21
22
|
//# sourceMappingURL=interface.d.ts.map
|
package/dist/middleware.js
CHANGED
|
@@ -17,15 +17,19 @@ const utils_1 = require("./utils");
|
|
|
17
17
|
let I18nFilter = class I18nFilter {
|
|
18
18
|
match(value, req, res) {
|
|
19
19
|
const saveLocale = req.getAttr(interface_1.I18N_ATTR_KEY);
|
|
20
|
-
if (this.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
20
|
+
if (this.resolverConfig) {
|
|
21
|
+
if (this.i18nConfig.writeCookie &&
|
|
22
|
+
saveLocale &&
|
|
23
|
+
this.resolverConfig.cookieField) {
|
|
24
|
+
const cookieOptions = {
|
|
25
|
+
// make sure browser javascript can read the cookie
|
|
26
|
+
httpOnly: false,
|
|
27
|
+
maxAge: this.resolverConfig.cookieField.cookieMaxAge,
|
|
28
|
+
signed: false,
|
|
29
|
+
domain: this.resolverConfig.cookieField.cookieDomain,
|
|
30
|
+
};
|
|
31
|
+
res.cookie(this.resolverConfig.cookieField.fieldName, saveLocale, cookieOptions);
|
|
32
|
+
}
|
|
29
33
|
}
|
|
30
34
|
return value;
|
|
31
35
|
}
|
|
@@ -48,31 +52,35 @@ let I18nMiddleware = class I18nMiddleware {
|
|
|
48
52
|
// add a filter for i18n cookie
|
|
49
53
|
app.useFilter(I18nFilter);
|
|
50
54
|
return async (req, res, next) => {
|
|
51
|
-
// get request locale from query/header/cookie
|
|
52
|
-
let requestLocale = req.query[this.resolverConfig.queryField] ||
|
|
53
|
-
req.cookies[this.resolverConfig.cookieField.fieldName];
|
|
54
55
|
const i18nService = await req.requestContext.getAsync(i18nService_1.MidwayI18nService);
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
//
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
56
|
+
let requestLocale;
|
|
57
|
+
if (this.resolverConfig) {
|
|
58
|
+
// get request locale from query/header/cookie
|
|
59
|
+
requestLocale =
|
|
60
|
+
req.query[this.resolverConfig.queryField] ||
|
|
61
|
+
req.cookies[this.resolverConfig.cookieField.fieldName];
|
|
62
|
+
if (!requestLocale) {
|
|
63
|
+
// Accept-Language: zh-CN,zh;q=0.5
|
|
64
|
+
// Accept-Language: zh-CN
|
|
65
|
+
let languages = req.acceptsLanguages();
|
|
66
|
+
if (languages) {
|
|
67
|
+
if (Array.isArray(languages)) {
|
|
68
|
+
if (languages[0] === '*') {
|
|
69
|
+
languages = languages.slice(1);
|
|
70
|
+
}
|
|
71
|
+
if (languages.length > 0) {
|
|
72
|
+
for (let i = 0; i < languages.length; i++) {
|
|
73
|
+
const lang = (0, utils_1.formatLocale)(languages[i]);
|
|
74
|
+
if (i18nService.hasAvailableLocale(lang)) {
|
|
75
|
+
requestLocale = lang;
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
70
78
|
}
|
|
71
79
|
}
|
|
72
80
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
81
|
+
else {
|
|
82
|
+
requestLocale = languages;
|
|
83
|
+
}
|
|
76
84
|
}
|
|
77
85
|
}
|
|
78
86
|
}
|
|
@@ -87,57 +95,63 @@ let I18nMiddleware = class I18nMiddleware {
|
|
|
87
95
|
}
|
|
88
96
|
else {
|
|
89
97
|
return async (ctx, next) => {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
ctx.
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
if (
|
|
102
|
-
if (languages
|
|
103
|
-
languages
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
98
|
+
if (this.resolverConfig) {
|
|
99
|
+
// get request locale from query/header/cookie
|
|
100
|
+
let requestLocale = ctx.query[this.resolverConfig.queryField] ||
|
|
101
|
+
ctx.cookies.get(this.resolverConfig.cookieField.fieldName, {
|
|
102
|
+
signed: false,
|
|
103
|
+
});
|
|
104
|
+
const i18nService = await ctx.requestContext.getAsync(i18nService_1.MidwayI18nService);
|
|
105
|
+
if (!requestLocale) {
|
|
106
|
+
// Accept-Language: zh-CN,zh;q=0.5
|
|
107
|
+
// Accept-Language: zh-CN
|
|
108
|
+
let languages = ctx.acceptsLanguages();
|
|
109
|
+
if (languages) {
|
|
110
|
+
if (Array.isArray(languages)) {
|
|
111
|
+
if (languages[0] === '*') {
|
|
112
|
+
languages = languages.slice(1);
|
|
113
|
+
}
|
|
114
|
+
if (languages.length > 0) {
|
|
115
|
+
for (let i = 0; i < languages.length; i++) {
|
|
116
|
+
const lang = (0, utils_1.formatLocale)(languages[i]);
|
|
117
|
+
if (i18nService.hasAvailableLocale(lang)) {
|
|
118
|
+
requestLocale = lang;
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
111
121
|
}
|
|
112
122
|
}
|
|
113
123
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
124
|
+
else {
|
|
125
|
+
requestLocale = languages;
|
|
126
|
+
}
|
|
117
127
|
}
|
|
118
128
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
129
|
+
// save current locale
|
|
130
|
+
if (requestLocale) {
|
|
131
|
+
i18nService.saveRequestLocale(requestLocale);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
i18nService.saveRequestLocale();
|
|
135
|
+
}
|
|
126
136
|
}
|
|
127
137
|
// run next middleware and controller
|
|
128
138
|
await next();
|
|
129
139
|
// get need save locale
|
|
130
140
|
const saveLocale = ctx.getAttr(interface_1.I18N_ATTR_KEY);
|
|
131
|
-
if (this.
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
+
if (this.resolverConfig) {
|
|
142
|
+
if (this.i18nConfig.writeCookie &&
|
|
143
|
+
saveLocale &&
|
|
144
|
+
this.resolverConfig.cookieField) {
|
|
145
|
+
const cookieOptions = {
|
|
146
|
+
// make sure browser javascript can read the cookie
|
|
147
|
+
httpOnly: false,
|
|
148
|
+
maxAge: this.resolverConfig.cookieField.cookieMaxAge,
|
|
149
|
+
signed: false,
|
|
150
|
+
domain: this.resolverConfig.cookieField.cookieDomain,
|
|
151
|
+
overwrite: true,
|
|
152
|
+
};
|
|
153
|
+
ctx.cookies.set(this.resolverConfig.cookieField.fieldName, saveLocale, cookieOptions);
|
|
154
|
+
}
|
|
141
155
|
}
|
|
142
156
|
};
|
|
143
157
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@midwayjs/i18n",
|
|
3
3
|
"description": "midway i18n component",
|
|
4
|
-
"version": "3.3.
|
|
4
|
+
"version": "3.3.9",
|
|
5
5
|
"main": "dist/index",
|
|
6
6
|
"typings": "index.d.ts",
|
|
7
7
|
"files": [
|
|
@@ -39,5 +39,5 @@
|
|
|
39
39
|
"type": "git",
|
|
40
40
|
"url": "https://github.com/midwayjs/midway.git"
|
|
41
41
|
},
|
|
42
|
-
"gitHead": "
|
|
42
|
+
"gitHead": "6fb04e62985a6ed0adc76f74d3c17350f37f9fe7"
|
|
43
43
|
}
|