package com.xy.service; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.xy.annotate.RestMappingController; import com.xy.dto.TranslateDto; import com.xy.entity.SysMenu; import com.xy.service.impl.SysMenuServiceImpl; import com.xy.third.baidu.TransApi; import com.xy.utils.R; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.client.loadbalancer.AsyncLoadBalancerAutoConfiguration; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import java.util.ArrayList; import java.util.List; /** * 翻译服务 */ @Api(tags = "翻译服务") @Slf4j @Service @RequiredArgsConstructor @RestMappingController("/translate") public class TranslateService { private static final String APP_ID = "20240428002037687"; private static final String SECURITY_KEY = "nXkFm4SaA2Wrmb42Xmky"; private final SysMenuServiceImpl sysMenuService; private final AsyncLoadBalancerAutoConfiguration asyncLoadBalancerAutoConfiguration; /** * 调用百度翻译API * * @param query 待翻译的文本 * @param lanSrc 原语言 zh * @param lanDst 目标语言 en * @return */ public static String translate(String query, String lanSrc, String lanDst) { TransApi api = new TransApi(APP_ID, SECURITY_KEY); log.info("正在翻译文本:{}", query); JSONObject res = JSONUtil.parseObj(api.getTransResult(query, lanSrc, lanDst)); JSONArray transResult = res.getJSONArray("trans_result"); if (!JSONUtil.isNull(transResult)) { JSONObject jsonObject = transResult.getJSONObject(0); log.info("文本:{},翻译结果:{}", query, jsonObject.getStr("dst")); return jsonObject.getStr("dst"); } else { log.info("文本:{},翻译失败:{}", query, JSONUtil.toJsonPrettyStr(res)); return "-"; } } @PostMapping("/menuOne") @ApiOperation("单个菜单翻译-同步返回结果") public R translateMenuOne(@RequestBody @Validated TranslateDto.One one) { String content = one.getContent(); String targetType = one.getTargetType(); String translatedValue = translate(content, "zh", targetType); return R.ok(translatedValue); } /** * 全量菜单翻译 * * @return */ @PostMapping("/menuAll") @ApiOperation("菜单全量翻译-已翻译的忽略") public R translateMenuAll() { translateAllMenu(); return R.ok(); } @Async protected void translateAllMenu() { List sysMenus = sysMenuService.list(); List updateMenus = new ArrayList<>(); for (SysMenu sysMenu : sysMenus) { String name = sysMenu.getName(); String enName = sysMenu.getEnName(); if (StrUtil.isEmpty(enName)) { //百度api翻译 String translatedValue = translate(name, "zh", "en"); sysMenu.setName(translatedValue); updateMenus.add(sysMenu); // 增加1.2秒的延迟 try { Thread.sleep(1800); } catch (InterruptedException e) { Thread.currentThread().interrupt(); log.error("线程中断异常", e); } } } if (CollUtil.isNotEmpty(updateMenus)) { sysMenuService.updateBatchById(updateMenus); } } }