From 5b86e9f48e815072049cb95d9092e66a6b02ecac Mon Sep 17 00:00:00 2001 From: tomsun28 Date: Sun, 5 Dec 2021 00:09:03 +0800 Subject: [PATCH] =?UTF-8?q?[monitor]=20=E7=9B=91=E6=8E=A7=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E5=90=8D=E7=A7=B0i18n=E5=9B=BD=E9=99=85=E5=8C=96?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/usthe/common/entity/job/Job.java | 6 + .../manager/controller/I18nController.java | 46 +++++++ .../com/usthe/manager/service/AppService.java | 8 ++ .../manager/service/impl/AppServiceImpl.java | 19 +++ .../main/resources/define/app/A-example.yml | 5 +- manager/src/main/resources/define/app/api.yml | 3 + .../src/main/resources/define/app/ping.yml | 3 + .../src/main/resources/define/app/telnet.yml | 3 + .../src/main/resources/define/app/website.yml | 6 +- web-app/src/app/core/i18n/i18n.service.ts | 35 +++-- .../monitor-edit/monitor-edit.component.html | 2 +- .../monitor-list/monitor-list.component.html | 6 +- .../monitor-new/monitor-new.component.html | 2 +- web-app/src/assets/tmp/i18n/zh-CN.json | 121 ++---------------- 14 files changed, 135 insertions(+), 130 deletions(-) create mode 100644 manager/src/main/java/com/usthe/manager/controller/I18nController.java diff --git a/common/src/main/java/com/usthe/common/entity/job/Job.java b/common/src/main/java/com/usthe/common/entity/job/Job.java index e4799d2..77ae04a 100644 --- a/common/src/main/java/com/usthe/common/entity/job/Job.java +++ b/common/src/main/java/com/usthe/common/entity/job/Job.java @@ -45,6 +45,12 @@ public class Job { * 监控的类型 eg: linux | mysql | jvm */ private String app; + /** + * 监控类型的国际化名称 + * zh-CN: PING连通性 + * en-US: PING CONNECT + */ + private Map name; /** * 任务派发开始时间戳 */ diff --git a/manager/src/main/java/com/usthe/manager/controller/I18nController.java b/manager/src/main/java/com/usthe/manager/controller/I18nController.java new file mode 100644 index 0000000..bba7e9a --- /dev/null +++ b/manager/src/main/java/com/usthe/manager/controller/I18nController.java @@ -0,0 +1,46 @@ +package com.usthe.manager.controller; + +import com.usthe.common.entity.dto.Message; +import com.usthe.manager.pojo.entity.ParamDefine; +import com.usthe.manager.service.AppService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; + +/** + * 国际化I18N + * @author tom + * @date 2021/12/4 21:40 + */ +@Api(tags = "I18N国际化资源API") +@RestController +@RequestMapping(path = "/i18n", produces = {APPLICATION_JSON_VALUE}) +public class I18nController { + + @Autowired + private AppService appService; + + @GetMapping("/{lang}") + @ApiOperation(value = "查询总的i18n资源", notes = "查询总的i18n国际化文本资源") + public ResponseEntity>> queryI18n( + @ApiParam(value = "语言类型", example = "zh-CN", defaultValue = "zh-CN") + @PathVariable(name = "lang", required = false) String lang) { + if (lang == null || "".equals(lang)) { + lang = "zh-CN"; + } + lang = lang.equalsIgnoreCase("zh-cn")? "zh-CN" : lang; + lang = lang.equalsIgnoreCase("en-us")? "en-US" : lang; + Map i18nResource = appService.getI18nResources(lang); + return ResponseEntity.ok(new Message<>(i18nResource)); + } +} diff --git a/manager/src/main/java/com/usthe/manager/service/AppService.java b/manager/src/main/java/com/usthe/manager/service/AppService.java index 89894a5..0741257 100644 --- a/manager/src/main/java/com/usthe/manager/service/AppService.java +++ b/manager/src/main/java/com/usthe/manager/service/AppService.java @@ -4,6 +4,7 @@ import com.usthe.common.entity.job.Job; import com.usthe.manager.pojo.entity.ParamDefine; import java.util.List; +import java.util.Map; /** * 监控类型管理接口 @@ -26,4 +27,11 @@ public interface AppService { * @throws IllegalArgumentException 当不存在即不支持对应名称的监控类型时抛出 */ Job getAppDefine(String app) throws IllegalArgumentException; + + /** + * 获取定义的监控I18N资源 + * @param lang 语言类型 + * @return I18N资源 + */ + Map getI18nResources(String lang); } diff --git a/manager/src/main/java/com/usthe/manager/service/impl/AppServiceImpl.java b/manager/src/main/java/com/usthe/manager/service/impl/AppServiceImpl.java index 85d3d52..619dd51 100644 --- a/manager/src/main/java/com/usthe/manager/service/impl/AppServiceImpl.java +++ b/manager/src/main/java/com/usthe/manager/service/impl/AppServiceImpl.java @@ -6,6 +6,7 @@ import com.usthe.manager.pojo.dto.ParamDefineDto; import com.usthe.manager.pojo.entity.ParamDefine; import com.usthe.manager.service.AppService; import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.common.protocol.types.Field; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Service; @@ -17,6 +18,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.net.URL; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -57,6 +59,23 @@ public class AppServiceImpl implements AppService, CommandLineRunner { return appDefine; } + @Override + public Map getI18nResources(String lang) { + Map i18nMap = new HashMap<>(32); + for (Job job : appDefines.values()) { + // todo 暂时只国际化监控类型名称 后面需要支持指标名称 + Map name = job.getName(); + if (name != null && !name.isEmpty()) { + String i18nName = name.get(lang); + if (i18nName == null) { + i18nName = name.values().stream().findFirst().get(); + } + i18nMap.put("monitor.app." + job.getApp(), i18nName); + } + } + return i18nMap; + } + @Override public void run(String... args) throws Exception { // 读取app定义配置加载到内存中 define/app/*.yml diff --git a/manager/src/main/resources/define/app/A-example.yml b/manager/src/main/resources/define/app/A-example.yml index 534b33b..cd984f5 100644 --- a/manager/src/main/resources/define/app/A-example.yml +++ b/manager/src/main/resources/define/app/A-example.yml @@ -1,5 +1,8 @@ -# 监控应用类型名称(与文件名保持一致) eg: linux windows tomcat mysql aws... +# 监控应用类型(与文件名保持一致) eg: linux windows tomcat mysql aws... app: exapmle +name: + zh-CN: 模拟应用类型 + en-US: EXAMPLE APP # 参数映射map. type是参数类型: 0-number数字, 1-string明文字符串, 2-secret加密字符串 # 强制固定必须参数 - host configmap: diff --git a/manager/src/main/resources/define/app/api.yml b/manager/src/main/resources/define/app/api.yml index b52b67b..2731095 100644 --- a/manager/src/main/resources/define/app/api.yml +++ b/manager/src/main/resources/define/app/api.yml @@ -1,5 +1,8 @@ # 监控应用类型名称(与文件名保持一致) eg: linux windows tomcat mysql aws... app: api +name: + zh-CN: HTTP API + en-US: HTTP API # 参数映射map. type是参数类型: 0-number数字, 1-string明文字符串, 2-secret加密字符串 # 强制固定必须参数 - host configmap: diff --git a/manager/src/main/resources/define/app/ping.yml b/manager/src/main/resources/define/app/ping.yml index 1746a54..20f902a 100644 --- a/manager/src/main/resources/define/app/ping.yml +++ b/manager/src/main/resources/define/app/ping.yml @@ -1,5 +1,8 @@ # 监控应用类型名称(与文件名保持一致) eg: linux windows tomcat mysql aws... app: ping +name: + zh-CN: PING连通性 + en-US: PING CONNECT # 参数映射map. type是参数类型: 0-number数字, 1-string明文字符串, 2-secret加密字符串 # 强制固定必须参数 - host configmap: diff --git a/manager/src/main/resources/define/app/telnet.yml b/manager/src/main/resources/define/app/telnet.yml index 524c02d..2cfec94 100644 --- a/manager/src/main/resources/define/app/telnet.yml +++ b/manager/src/main/resources/define/app/telnet.yml @@ -1,4 +1,7 @@ app: telnet +name: + zh-CN: TELNET端口可用性 + en-US: PORT TELNET configmap: - key: host type: 1 diff --git a/manager/src/main/resources/define/app/website.yml b/manager/src/main/resources/define/app/website.yml index cf6643b..8896706 100644 --- a/manager/src/main/resources/define/app/website.yml +++ b/manager/src/main/resources/define/app/website.yml @@ -1,7 +1,7 @@ -# 监控应用类型名称(与文件名保持一致) eg: linux windows tomcat mysql aws... app: website -# 参数映射map. type是参数类型: 0-number数字, 1-string明文字符串, 2-secret加密字符串 -# 强制固定必须参数 - host +name: + zh-CN: 网站监测 + en-US: WEBSITE MONITOR configmap: - key: host type: 1 diff --git a/web-app/src/app/core/i18n/i18n.service.ts b/web-app/src/app/core/i18n/i18n.service.ts index 827afc5..7910bb5 100644 --- a/web-app/src/app/core/i18n/i18n.service.ts +++ b/web-app/src/app/core/i18n/i18n.service.ts @@ -1,24 +1,26 @@ // 请参考:https://ng-alain.com/docs/i18n -import { Platform } from '@angular/cdk/platform'; -import { registerLocaleData } from '@angular/common'; +import {Platform} from '@angular/cdk/platform'; +import {registerLocaleData} from '@angular/common'; import ngEn from '@angular/common/locales/en'; import ngZh from '@angular/common/locales/zh'; import ngZhTw from '@angular/common/locales/zh-Hant'; -import { Injectable } from '@angular/core'; +import {Injectable} from '@angular/core'; import { + _HttpClient, + AlainI18nBaseService, DelonLocaleService, en_US as delonEnUS, SettingsService, zh_CN as delonZhCn, - zh_TW as delonZhTw, - _HttpClient, - AlainI18nBaseService + zh_TW as delonZhTw } from '@delon/theme'; -import { AlainConfigService } from '@delon/util/config'; -import { enUS as dfEn, zhCN as dfZhCn, zhTW as dfZhTw } from 'date-fns/locale'; -import { NzSafeAny } from 'ng-zorro-antd/core/types'; -import { en_US as zorroEnUS, NzI18nService, zh_CN as zorroZhCN, zh_TW as zorroZhTW } from 'ng-zorro-antd/i18n'; -import { Observable } from 'rxjs'; +import {AlainConfigService} from '@delon/util/config'; +import {enUS as dfEn, zhCN as dfZhCn, zhTW as dfZhTw} from 'date-fns/locale'; +import {NzSafeAny} from 'ng-zorro-antd/core/types'; +import {en_US as zorroEnUS, NzI18nService, zh_CN as zorroZhCN, zh_TW as zorroZhTW} from 'ng-zorro-antd/i18n'; +import {Observable, zip} from 'rxjs'; +import {map} from "rxjs/operators"; +import {Message} from "../../pojo/Message"; interface LangConfigData { abbr: string; @@ -92,7 +94,16 @@ export class I18NService extends AlainI18nBaseService { } loadLangData(lang: string): Observable { - return this.http.get(`http://localhost:4200/assets/tmp/i18n/${lang}.json`); + return zip(this.http.get(`http://localhost:4200/assets/tmp/i18n/${lang}.json`),this.http.get(`/i18n/${lang}`)) + .pipe( + map(([langLocalData, langRemoteData]: [Record, Message]) => { + let remote:Record = langRemoteData.data; + Object.keys(remote).forEach(key => { + langLocalData[key] = remote[key]; + }); + return langLocalData; + }) + ) } use(lang: string, data: Record): void { diff --git a/web-app/src/app/routes/monitor/monitor-edit/monitor-edit.component.html b/web-app/src/app/routes/monitor/monitor-edit/monitor-edit.component.html index cea9cf0..f9daf74 100644 --- a/web-app/src/app/routes/monitor/monitor-edit/monitor-edit.component.html +++ b/web-app/src/app/routes/monitor/monitor-edit/monitor-edit.component.html @@ -13,7 +13,7 @@ - 修改 {{monitor.app}} 监控 + 修改 {{'monitor.app.' + monitor.app | i18n}} 监控 diff --git a/web-app/src/app/routes/monitor/monitor-list/monitor-list.component.html b/web-app/src/app/routes/monitor/monitor-list/monitor-list.component.html index 4534515..ac72d9f 100644 --- a/web-app/src/app/routes/monitor/monitor-list/monitor-list.component.html +++ b/web-app/src/app/routes/monitor/monitor-list/monitor-list.component.html @@ -7,7 +7,7 @@ - {{app?app.toUpperCase() : ""}} 监控列表 + {{'monitor.app.' + app | i18n}} 监控列表 @@ -15,7 +15,7 @@