@etsoo/appscript 1.1.53 → 1.1.57
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/lib/cjs/app/CoreApp.d.ts +33 -4
- package/lib/cjs/app/CoreApp.js +7 -2
- package/lib/cjs/i18n/en-US.json +2 -0
- package/lib/cjs/i18n/zh-CN.json +2 -0
- package/lib/cjs/i18n/zh-HK.json +2 -0
- package/lib/mjs/app/CoreApp.d.ts +33 -4
- package/lib/mjs/app/CoreApp.js +7 -2
- package/lib/mjs/i18n/en-US.json +2 -0
- package/lib/mjs/i18n/zh-CN.json +2 -0
- package/lib/mjs/i18n/zh-HK.json +2 -0
- package/package.json +2 -2
- package/src/app/CoreApp.ts +44 -4
- package/src/i18n/en-US.json +2 -0
- package/src/i18n/zh-CN.json +2 -0
- package/src/i18n/zh-HK.json +2 -0
package/lib/cjs/app/CoreApp.d.ts
CHANGED
|
@@ -12,6 +12,29 @@ import { UserRole } from './UserRole';
|
|
|
12
12
|
export interface IDetectIPCallback {
|
|
13
13
|
(): void;
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Refresh token result type
|
|
17
|
+
* true means success, false means failed but no any message
|
|
18
|
+
* other cases means failed with differnet message
|
|
19
|
+
*/
|
|
20
|
+
export declare type RefreshTokenResult = boolean | string | ApiDataError | IActionResult;
|
|
21
|
+
/**
|
|
22
|
+
* Refresh token props
|
|
23
|
+
*/
|
|
24
|
+
export interface RefreshTokenProps<D extends {}> {
|
|
25
|
+
/**
|
|
26
|
+
* Callback
|
|
27
|
+
*/
|
|
28
|
+
callback?: (result: RefreshTokenResult) => void;
|
|
29
|
+
/**
|
|
30
|
+
* Data to pass
|
|
31
|
+
*/
|
|
32
|
+
data?: D;
|
|
33
|
+
/**
|
|
34
|
+
* Show loading bar or not
|
|
35
|
+
*/
|
|
36
|
+
showLoading?: boolean;
|
|
37
|
+
}
|
|
15
38
|
/**
|
|
16
39
|
* Core application interface
|
|
17
40
|
*/
|
|
@@ -171,8 +194,9 @@ export interface ICoreApp<S extends IAppSettings, N, C extends NotificationCallP
|
|
|
171
194
|
pageExit(): void;
|
|
172
195
|
/**
|
|
173
196
|
* Refresh token
|
|
197
|
+
* @param props Props
|
|
174
198
|
*/
|
|
175
|
-
refreshToken(): Promise<boolean>;
|
|
199
|
+
refreshToken<D extends {} = {}>(props?: RefreshTokenProps<D>): Promise<boolean>;
|
|
176
200
|
/**
|
|
177
201
|
* Signout
|
|
178
202
|
* @param apiUrl Signout API URL
|
|
@@ -195,8 +219,10 @@ export interface ICoreApp<S extends IAppSettings, N, C extends NotificationCallP
|
|
|
195
219
|
transformUrl(url: string): string;
|
|
196
220
|
/**
|
|
197
221
|
* Try login, returning false means is loading
|
|
222
|
+
* UI get involved while refreshToken not intended
|
|
223
|
+
* @param data Additional request data
|
|
198
224
|
*/
|
|
199
|
-
tryLogin(): Promise<boolean>;
|
|
225
|
+
tryLogin<D extends {} = {}>(data?: D): Promise<boolean>;
|
|
200
226
|
/**
|
|
201
227
|
* User login
|
|
202
228
|
* @param user User data
|
|
@@ -420,8 +446,9 @@ export declare abstract class CoreApp<S extends IAppSettings, N, C extends Notif
|
|
|
420
446
|
abstract freshCountdownUI(callback?: () => PromiseLike<unknown>): void;
|
|
421
447
|
/**
|
|
422
448
|
* Refresh token
|
|
449
|
+
* @param props Props
|
|
423
450
|
*/
|
|
424
|
-
refreshToken(): Promise<boolean>;
|
|
451
|
+
refreshToken<D extends {} = {}>(props?: RefreshTokenProps<D>): Promise<boolean>;
|
|
425
452
|
/**
|
|
426
453
|
* Setup callback
|
|
427
454
|
*/
|
|
@@ -448,8 +475,10 @@ export declare abstract class CoreApp<S extends IAppSettings, N, C extends Notif
|
|
|
448
475
|
transformUrl(url: string): string;
|
|
449
476
|
/**
|
|
450
477
|
* Try login, returning false means is loading
|
|
478
|
+
* UI get involved while refreshToken not intended
|
|
479
|
+
* @param data Additional request data
|
|
451
480
|
*/
|
|
452
|
-
tryLogin(): Promise<boolean>;
|
|
481
|
+
tryLogin<D extends {} = {}>(_data?: D): Promise<boolean>;
|
|
453
482
|
/**
|
|
454
483
|
* User login
|
|
455
484
|
* @param user User data
|
package/lib/cjs/app/CoreApp.js
CHANGED
|
@@ -399,8 +399,11 @@ class CoreApp {
|
|
|
399
399
|
}
|
|
400
400
|
/**
|
|
401
401
|
* Refresh token
|
|
402
|
+
* @param props Props
|
|
402
403
|
*/
|
|
403
|
-
async refreshToken() {
|
|
404
|
+
async refreshToken(props) {
|
|
405
|
+
if (props && props.callback)
|
|
406
|
+
props.callback(true);
|
|
404
407
|
return true;
|
|
405
408
|
}
|
|
406
409
|
/**
|
|
@@ -467,8 +470,10 @@ class CoreApp {
|
|
|
467
470
|
}
|
|
468
471
|
/**
|
|
469
472
|
* Try login, returning false means is loading
|
|
473
|
+
* UI get involved while refreshToken not intended
|
|
474
|
+
* @param data Additional request data
|
|
470
475
|
*/
|
|
471
|
-
async tryLogin() {
|
|
476
|
+
async tryLogin(_data) {
|
|
472
477
|
if (this._isTryingLogin)
|
|
473
478
|
return false;
|
|
474
479
|
this._isTryingLogin = true;
|
package/lib/cjs/i18n/en-US.json
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"failed": "Operation failed",
|
|
23
23
|
"id": "Number#",
|
|
24
24
|
"loading": "Loading...",
|
|
25
|
+
"login": "Login",
|
|
25
26
|
"menuHome": "Home",
|
|
26
27
|
"message": "Message",
|
|
27
28
|
"mobile": "Mobile number",
|
|
@@ -42,6 +43,7 @@
|
|
|
42
43
|
"refresh": "Refresh",
|
|
43
44
|
"refreshing": "Refreshing",
|
|
44
45
|
"releaseToRefresh": "Release to refresh",
|
|
46
|
+
"reloginTip": "Please enter your password, resubmit the data after successful login",
|
|
45
47
|
"remove": "Remove",
|
|
46
48
|
"renew": "Renew",
|
|
47
49
|
"resending": "Resending",
|
package/lib/cjs/i18n/zh-CN.json
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"failed": "操作失败",
|
|
23
23
|
"id": "编号",
|
|
24
24
|
"loading": "正在加载...",
|
|
25
|
+
"login": "登录",
|
|
25
26
|
"menuHome": "首页",
|
|
26
27
|
"message": "留言",
|
|
27
28
|
"mobile": "手机号码",
|
|
@@ -42,6 +43,7 @@
|
|
|
42
43
|
"refresh": "刷新",
|
|
43
44
|
"refreshing": "正在刷新",
|
|
44
45
|
"releaseToRefresh": "释放刷新",
|
|
46
|
+
"reloginTip": "请输入您的登录密码,登录成功后请重新提交数据",
|
|
45
47
|
"remove": "移除",
|
|
46
48
|
"renew": "续费",
|
|
47
49
|
"resending": "重新发送",
|
package/lib/cjs/i18n/zh-HK.json
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"failed": "操作失敗",
|
|
23
23
|
"id": "編號",
|
|
24
24
|
"loading": "正在加載...",
|
|
25
|
+
"login": "登錄",
|
|
25
26
|
"menuHome": "首頁",
|
|
26
27
|
"message": "留言",
|
|
27
28
|
"mobilePhone": "手機號碼",
|
|
@@ -42,6 +43,7 @@
|
|
|
42
43
|
"refresh": "刷新",
|
|
43
44
|
"refreshing": "正在刷新",
|
|
44
45
|
"releaseToRefresh": "釋放刷新",
|
|
46
|
+
"reloginTip": "請輸入您的登錄密碼,登錄成功後請重新提交數據",
|
|
45
47
|
"remove": "移除",
|
|
46
48
|
"renew": "續費",
|
|
47
49
|
"resending": "重新發送",
|
package/lib/mjs/app/CoreApp.d.ts
CHANGED
|
@@ -12,6 +12,29 @@ import { UserRole } from './UserRole';
|
|
|
12
12
|
export interface IDetectIPCallback {
|
|
13
13
|
(): void;
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Refresh token result type
|
|
17
|
+
* true means success, false means failed but no any message
|
|
18
|
+
* other cases means failed with differnet message
|
|
19
|
+
*/
|
|
20
|
+
export declare type RefreshTokenResult = boolean | string | ApiDataError | IActionResult;
|
|
21
|
+
/**
|
|
22
|
+
* Refresh token props
|
|
23
|
+
*/
|
|
24
|
+
export interface RefreshTokenProps<D extends {}> {
|
|
25
|
+
/**
|
|
26
|
+
* Callback
|
|
27
|
+
*/
|
|
28
|
+
callback?: (result: RefreshTokenResult) => void;
|
|
29
|
+
/**
|
|
30
|
+
* Data to pass
|
|
31
|
+
*/
|
|
32
|
+
data?: D;
|
|
33
|
+
/**
|
|
34
|
+
* Show loading bar or not
|
|
35
|
+
*/
|
|
36
|
+
showLoading?: boolean;
|
|
37
|
+
}
|
|
15
38
|
/**
|
|
16
39
|
* Core application interface
|
|
17
40
|
*/
|
|
@@ -171,8 +194,9 @@ export interface ICoreApp<S extends IAppSettings, N, C extends NotificationCallP
|
|
|
171
194
|
pageExit(): void;
|
|
172
195
|
/**
|
|
173
196
|
* Refresh token
|
|
197
|
+
* @param props Props
|
|
174
198
|
*/
|
|
175
|
-
refreshToken(): Promise<boolean>;
|
|
199
|
+
refreshToken<D extends {} = {}>(props?: RefreshTokenProps<D>): Promise<boolean>;
|
|
176
200
|
/**
|
|
177
201
|
* Signout
|
|
178
202
|
* @param apiUrl Signout API URL
|
|
@@ -195,8 +219,10 @@ export interface ICoreApp<S extends IAppSettings, N, C extends NotificationCallP
|
|
|
195
219
|
transformUrl(url: string): string;
|
|
196
220
|
/**
|
|
197
221
|
* Try login, returning false means is loading
|
|
222
|
+
* UI get involved while refreshToken not intended
|
|
223
|
+
* @param data Additional request data
|
|
198
224
|
*/
|
|
199
|
-
tryLogin(): Promise<boolean>;
|
|
225
|
+
tryLogin<D extends {} = {}>(data?: D): Promise<boolean>;
|
|
200
226
|
/**
|
|
201
227
|
* User login
|
|
202
228
|
* @param user User data
|
|
@@ -420,8 +446,9 @@ export declare abstract class CoreApp<S extends IAppSettings, N, C extends Notif
|
|
|
420
446
|
abstract freshCountdownUI(callback?: () => PromiseLike<unknown>): void;
|
|
421
447
|
/**
|
|
422
448
|
* Refresh token
|
|
449
|
+
* @param props Props
|
|
423
450
|
*/
|
|
424
|
-
refreshToken(): Promise<boolean>;
|
|
451
|
+
refreshToken<D extends {} = {}>(props?: RefreshTokenProps<D>): Promise<boolean>;
|
|
425
452
|
/**
|
|
426
453
|
* Setup callback
|
|
427
454
|
*/
|
|
@@ -448,8 +475,10 @@ export declare abstract class CoreApp<S extends IAppSettings, N, C extends Notif
|
|
|
448
475
|
transformUrl(url: string): string;
|
|
449
476
|
/**
|
|
450
477
|
* Try login, returning false means is loading
|
|
478
|
+
* UI get involved while refreshToken not intended
|
|
479
|
+
* @param data Additional request data
|
|
451
480
|
*/
|
|
452
|
-
tryLogin(): Promise<boolean>;
|
|
481
|
+
tryLogin<D extends {} = {}>(_data?: D): Promise<boolean>;
|
|
453
482
|
/**
|
|
454
483
|
* User login
|
|
455
484
|
* @param user User data
|
package/lib/mjs/app/CoreApp.js
CHANGED
|
@@ -396,8 +396,11 @@ export class CoreApp {
|
|
|
396
396
|
}
|
|
397
397
|
/**
|
|
398
398
|
* Refresh token
|
|
399
|
+
* @param props Props
|
|
399
400
|
*/
|
|
400
|
-
async refreshToken() {
|
|
401
|
+
async refreshToken(props) {
|
|
402
|
+
if (props && props.callback)
|
|
403
|
+
props.callback(true);
|
|
401
404
|
return true;
|
|
402
405
|
}
|
|
403
406
|
/**
|
|
@@ -464,8 +467,10 @@ export class CoreApp {
|
|
|
464
467
|
}
|
|
465
468
|
/**
|
|
466
469
|
* Try login, returning false means is loading
|
|
470
|
+
* UI get involved while refreshToken not intended
|
|
471
|
+
* @param data Additional request data
|
|
467
472
|
*/
|
|
468
|
-
async tryLogin() {
|
|
473
|
+
async tryLogin(_data) {
|
|
469
474
|
if (this._isTryingLogin)
|
|
470
475
|
return false;
|
|
471
476
|
this._isTryingLogin = true;
|
package/lib/mjs/i18n/en-US.json
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"failed": "Operation failed",
|
|
23
23
|
"id": "Number#",
|
|
24
24
|
"loading": "Loading...",
|
|
25
|
+
"login": "Login",
|
|
25
26
|
"menuHome": "Home",
|
|
26
27
|
"message": "Message",
|
|
27
28
|
"mobile": "Mobile number",
|
|
@@ -42,6 +43,7 @@
|
|
|
42
43
|
"refresh": "Refresh",
|
|
43
44
|
"refreshing": "Refreshing",
|
|
44
45
|
"releaseToRefresh": "Release to refresh",
|
|
46
|
+
"reloginTip": "Please enter your password, resubmit the data after successful login",
|
|
45
47
|
"remove": "Remove",
|
|
46
48
|
"renew": "Renew",
|
|
47
49
|
"resending": "Resending",
|
package/lib/mjs/i18n/zh-CN.json
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"failed": "操作失败",
|
|
23
23
|
"id": "编号",
|
|
24
24
|
"loading": "正在加载...",
|
|
25
|
+
"login": "登录",
|
|
25
26
|
"menuHome": "首页",
|
|
26
27
|
"message": "留言",
|
|
27
28
|
"mobile": "手机号码",
|
|
@@ -42,6 +43,7 @@
|
|
|
42
43
|
"refresh": "刷新",
|
|
43
44
|
"refreshing": "正在刷新",
|
|
44
45
|
"releaseToRefresh": "释放刷新",
|
|
46
|
+
"reloginTip": "请输入您的登录密码,登录成功后请重新提交数据",
|
|
45
47
|
"remove": "移除",
|
|
46
48
|
"renew": "续费",
|
|
47
49
|
"resending": "重新发送",
|
package/lib/mjs/i18n/zh-HK.json
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"failed": "操作失敗",
|
|
23
23
|
"id": "編號",
|
|
24
24
|
"loading": "正在加載...",
|
|
25
|
+
"login": "登錄",
|
|
25
26
|
"menuHome": "首頁",
|
|
26
27
|
"message": "留言",
|
|
27
28
|
"mobilePhone": "手機號碼",
|
|
@@ -42,6 +43,7 @@
|
|
|
42
43
|
"refresh": "刷新",
|
|
43
44
|
"refreshing": "正在刷新",
|
|
44
45
|
"releaseToRefresh": "釋放刷新",
|
|
46
|
+
"reloginTip": "請輸入您的登錄密碼,登錄成功後請重新提交數據",
|
|
45
47
|
"remove": "移除",
|
|
46
48
|
"renew": "續費",
|
|
47
49
|
"resending": "重新發送",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@etsoo/appscript",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.57",
|
|
4
4
|
"description": "Applications shared TypeScript framework",
|
|
5
5
|
"main": "lib/cjs/index.js",
|
|
6
6
|
"module": "lib/mjs/index.js",
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"@types/jest": "^27.0.3",
|
|
66
66
|
"@typescript-eslint/eslint-plugin": "^5.5.0",
|
|
67
67
|
"@typescript-eslint/parser": "^5.5.0",
|
|
68
|
-
"eslint": "^8.
|
|
68
|
+
"eslint": "^8.4.0",
|
|
69
69
|
"eslint-config-airbnb-base": "^15.0.0",
|
|
70
70
|
"eslint-plugin-import": "^2.25.3",
|
|
71
71
|
"jest": "^27.4.3",
|
package/src/app/CoreApp.ts
CHANGED
|
@@ -29,6 +29,37 @@ export interface IDetectIPCallback {
|
|
|
29
29
|
(): void;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
+
/**
|
|
33
|
+
* Refresh token result type
|
|
34
|
+
* true means success, false means failed but no any message
|
|
35
|
+
* other cases means failed with differnet message
|
|
36
|
+
*/
|
|
37
|
+
export type RefreshTokenResult =
|
|
38
|
+
| boolean
|
|
39
|
+
| string
|
|
40
|
+
| ApiDataError
|
|
41
|
+
| IActionResult;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Refresh token props
|
|
45
|
+
*/
|
|
46
|
+
export interface RefreshTokenProps<D extends {}> {
|
|
47
|
+
/**
|
|
48
|
+
* Callback
|
|
49
|
+
*/
|
|
50
|
+
callback?: (result: RefreshTokenResult) => void;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Data to pass
|
|
54
|
+
*/
|
|
55
|
+
data?: D;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Show loading bar or not
|
|
59
|
+
*/
|
|
60
|
+
showLoading?: boolean;
|
|
61
|
+
}
|
|
62
|
+
|
|
32
63
|
/**
|
|
33
64
|
* Core application interface
|
|
34
65
|
*/
|
|
@@ -231,8 +262,11 @@ export interface ICoreApp<
|
|
|
231
262
|
|
|
232
263
|
/**
|
|
233
264
|
* Refresh token
|
|
265
|
+
* @param props Props
|
|
234
266
|
*/
|
|
235
|
-
refreshToken(
|
|
267
|
+
refreshToken<D extends {} = {}>(
|
|
268
|
+
props?: RefreshTokenProps<D>
|
|
269
|
+
): Promise<boolean>;
|
|
236
270
|
|
|
237
271
|
/**
|
|
238
272
|
* Signout
|
|
@@ -260,8 +294,10 @@ export interface ICoreApp<
|
|
|
260
294
|
|
|
261
295
|
/**
|
|
262
296
|
* Try login, returning false means is loading
|
|
297
|
+
* UI get involved while refreshToken not intended
|
|
298
|
+
* @param data Additional request data
|
|
263
299
|
*/
|
|
264
|
-
tryLogin(): Promise<boolean>;
|
|
300
|
+
tryLogin<D extends {} = {}>(data?: D): Promise<boolean>;
|
|
265
301
|
|
|
266
302
|
/**
|
|
267
303
|
* User login
|
|
@@ -823,8 +859,10 @@ export abstract class CoreApp<
|
|
|
823
859
|
|
|
824
860
|
/**
|
|
825
861
|
* Refresh token
|
|
862
|
+
* @param props Props
|
|
826
863
|
*/
|
|
827
|
-
async refreshToken(
|
|
864
|
+
async refreshToken<D extends {} = {}>(props?: RefreshTokenProps<D>) {
|
|
865
|
+
if (props && props.callback) props.callback(true);
|
|
828
866
|
return true;
|
|
829
867
|
}
|
|
830
868
|
|
|
@@ -901,8 +939,10 @@ export abstract class CoreApp<
|
|
|
901
939
|
|
|
902
940
|
/**
|
|
903
941
|
* Try login, returning false means is loading
|
|
942
|
+
* UI get involved while refreshToken not intended
|
|
943
|
+
* @param data Additional request data
|
|
904
944
|
*/
|
|
905
|
-
async tryLogin() {
|
|
945
|
+
async tryLogin<D extends {} = {}>(_data?: D) {
|
|
906
946
|
if (this._isTryingLogin) return false;
|
|
907
947
|
this._isTryingLogin = true;
|
|
908
948
|
return true;
|
package/src/i18n/en-US.json
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"failed": "Operation failed",
|
|
23
23
|
"id": "Number#",
|
|
24
24
|
"loading": "Loading...",
|
|
25
|
+
"login": "Login",
|
|
25
26
|
"menuHome": "Home",
|
|
26
27
|
"message": "Message",
|
|
27
28
|
"mobile": "Mobile number",
|
|
@@ -42,6 +43,7 @@
|
|
|
42
43
|
"refresh": "Refresh",
|
|
43
44
|
"refreshing": "Refreshing",
|
|
44
45
|
"releaseToRefresh": "Release to refresh",
|
|
46
|
+
"reloginTip": "Please enter your password, resubmit the data after successful login",
|
|
45
47
|
"remove": "Remove",
|
|
46
48
|
"renew": "Renew",
|
|
47
49
|
"resending": "Resending",
|
package/src/i18n/zh-CN.json
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"failed": "操作失败",
|
|
23
23
|
"id": "编号",
|
|
24
24
|
"loading": "正在加载...",
|
|
25
|
+
"login": "登录",
|
|
25
26
|
"menuHome": "首页",
|
|
26
27
|
"message": "留言",
|
|
27
28
|
"mobile": "手机号码",
|
|
@@ -42,6 +43,7 @@
|
|
|
42
43
|
"refresh": "刷新",
|
|
43
44
|
"refreshing": "正在刷新",
|
|
44
45
|
"releaseToRefresh": "释放刷新",
|
|
46
|
+
"reloginTip": "请输入您的登录密码,登录成功后请重新提交数据",
|
|
45
47
|
"remove": "移除",
|
|
46
48
|
"renew": "续费",
|
|
47
49
|
"resending": "重新发送",
|
package/src/i18n/zh-HK.json
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"failed": "操作失敗",
|
|
23
23
|
"id": "編號",
|
|
24
24
|
"loading": "正在加載...",
|
|
25
|
+
"login": "登錄",
|
|
25
26
|
"menuHome": "首頁",
|
|
26
27
|
"message": "留言",
|
|
27
28
|
"mobilePhone": "手機號碼",
|
|
@@ -42,6 +43,7 @@
|
|
|
42
43
|
"refresh": "刷新",
|
|
43
44
|
"refreshing": "正在刷新",
|
|
44
45
|
"releaseToRefresh": "釋放刷新",
|
|
46
|
+
"reloginTip": "請輸入您的登錄密碼,登錄成功後請重新提交數據",
|
|
45
47
|
"remove": "移除",
|
|
46
48
|
"renew": "續費",
|
|
47
49
|
"resending": "重新發送",
|