diff --git a/im-platform/src/main/java/com/bx/implatform/controller/LoginController.java b/im-platform/src/main/java/com/bx/implatform/controller/LoginController.java index 2e57ebd..aa4c584 100644 --- a/im-platform/src/main/java/com/bx/implatform/controller/LoginController.java +++ b/im-platform/src/main/java/com/bx/implatform/controller/LoginController.java @@ -12,6 +12,7 @@ import com.bx.implatform.service.IImSettingService; import com.bx.implatform.service.ImAgentService; import com.bx.implatform.service.UserService; import com.bx.implatform.util.BaiduTranslationUtils; +import com.bx.implatform.util.GoogleTranslationUtils; import com.bx.implatform.util.YouDaoTranslationUtils; import com.bx.implatform.vo.LoginVO; import io.swagger.v3.oas.annotations.Operation; @@ -35,6 +36,8 @@ public class LoginController { private final YouDaoTranslationUtils youDaoTranslationUtils; + private final GoogleTranslationUtils googleTranslationUtils; + @PostMapping("/login") @Operation(summary = "用户登录", description = "用户登录") public Result login(@Valid @RequestBody LoginDTO dto) { @@ -88,7 +91,7 @@ public class LoginController { public Result getTranslate(@RequestBody JSONObject jsonObject) { String str = jsonObject.getStr("str"); - if(str == null || str.isEmpty()){ + if(ObjectUtil.isEmpty(str)){ return ResultUtils.success("","success"); } @@ -100,24 +103,36 @@ public class LoginController { String trans = ""; //如果代理有配置,则使用代理的配置 - if(settingService.isUseBaidu()) { - if (country == null || country.isEmpty()) { - trans = baiduTranslationUtils.translateByAgentConfiguration(str, "zh"); - } else { - trans = baiduTranslationUtils.translateByAgentConfiguration(str, country); - } - }else if(settingService.isUseYouDao()) { - if (country == null || country.isEmpty()) { - trans = youDaoTranslationUtils.translateByAgentConfiguration(str, "zh"); - } else { - trans = youDaoTranslationUtils.translateByAgentConfiguration(str, country); - } - }else{ - if (country == null || country.isEmpty()) { - trans = baiduTranslationUtils.translate(str, "zh"); - } else { - trans = baiduTranslationUtils.translate(str, country); - } + String translateType = settingService.translateType(); + switch (translateType) { + case "0"://默认使用系统自带的百度翻译 + if (country == null || country.isEmpty()) { + trans = baiduTranslationUtils.translate(str, "zh"); + } else { + trans = baiduTranslationUtils.translate(str, country); + } + break; + case "1": + if (country == null || country.isEmpty()) { + trans = baiduTranslationUtils.translateByAgentConfiguration(str, "zh"); + } else { + trans = baiduTranslationUtils.translateByAgentConfiguration(str, country); + } + break; + case "2": + if (country == null || country.isEmpty()) { + trans = youDaoTranslationUtils.translateByAgentConfiguration(str, "zh"); + } else { + trans = youDaoTranslationUtils.translateByAgentConfiguration(str, country); + } + break; + case "3": + if (country == null || country.isEmpty()) { + trans = googleTranslationUtils.translateByAgentConfiguration(str, "zh"); + } else { + trans = googleTranslationUtils.translateByAgentConfiguration(str, country); + } + break; } return ResultUtils.success(trans,"success"); diff --git a/im-platform/src/main/java/com/bx/implatform/entity/setting/domain/TranslationSetting.java b/im-platform/src/main/java/com/bx/implatform/entity/setting/domain/TranslationSetting.java index 25cf631..9eed2c4 100644 --- a/im-platform/src/main/java/com/bx/implatform/entity/setting/domain/TranslationSetting.java +++ b/im-platform/src/main/java/com/bx/implatform/entity/setting/domain/TranslationSetting.java @@ -8,7 +8,7 @@ import lombok.Setter; public class TranslationSetting { /** - * 翻译类型 0-默认管理员配置 1-百度翻译 2-有道翻译 + * 翻译类型 0-默认管理员配置 1-百度翻译 2-有道翻译 3-谷歌翻译 */ private String type = "0"; @@ -20,4 +20,6 @@ public class TranslationSetting { private String appSecret = "";//有道翻译使用 + private String googleApiKey = "";//谷歌翻译使用 + } diff --git a/im-platform/src/main/java/com/bx/implatform/service/IImSettingService.java b/im-platform/src/main/java/com/bx/implatform/service/IImSettingService.java index c872456..1f228bb 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/IImSettingService.java +++ b/im-platform/src/main/java/com/bx/implatform/service/IImSettingService.java @@ -7,7 +7,5 @@ public interface IImSettingService extends IService { ImSetting getByTokenAndSettingName(String settingName); - boolean isUseBaidu(); - - boolean isUseYouDao(); + String translateType(); } diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/ImSettingServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/ImSettingServiceImpl.java index b273f82..8bcaafe 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/ImSettingServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/ImSettingServiceImpl.java @@ -47,15 +47,15 @@ public class ImSettingServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(ImSetting::getUniqueToken, token); - queryWrapper.eq(ImSetting::getSettingName, SettingEnum.TRANSLATION_SETTING.name()); - ImSetting setting = baseMapper.selectOne(queryWrapper); - if(setting == null){ - return false; + if(ObjectUtil.isEmpty(settingType) || ObjectUtil.isEmpty(settingType.getType())){ + return "0"; } - TranslationSetting baidu = JSONUtil.toBean(setting.getSettingValue(), TranslationSetting.class); - return baidu != null && baidu.getType().equals("2"); + return settingType.getType(); } } diff --git a/im-platform/src/main/java/com/bx/implatform/util/GoogleTranslationUtils.java b/im-platform/src/main/java/com/bx/implatform/util/GoogleTranslationUtils.java new file mode 100644 index 0000000..29569d0 --- /dev/null +++ b/im-platform/src/main/java/com/bx/implatform/util/GoogleTranslationUtils.java @@ -0,0 +1,184 @@ +package com.bx.implatform.util; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.bx.implatform.entity.ImSetting; +import com.bx.implatform.entity.setting.domain.TranslationSetting; +import com.bx.implatform.enums.SettingEnum; +import com.bx.implatform.service.IImSettingService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 谷歌翻译工具类 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class GoogleTranslationUtils { + + /** + * 谷歌翻译API地址 + */ + private static final String GOOGLE_URL = "https://translation.googleapis.com/language/translate/v2"; + + /** + * 谷歌翻译APIKEY + */ + private static final String GOOGLE_API_KEY = "20311d34bea5d593"; + + private final IImSettingService settingService; + + /** + * 翻译文本 + * + * @param query 待翻译文本 + * @param from 源语言 + * @param to 目标语言 + * @return 翻译结果 + */ + public String translate(String query, String from, String to) { + try { + // 发送GET请求 + HttpResponse response = HttpRequest.get(GOOGLE_URL) + .form("key", GOOGLE_API_KEY) + .form("q", query) + .form("target", to) + .form("source", from) + .execute(); + + // 解析响应 + String body = response.body(); + JSONObject result = JSONUtil.parseObj(body); + + // 检查是否有错误 + if (result.containsKey("error")) { + JSONObject error = result.getJSONObject("error"); + log.error("谷歌翻译失败,错误码:{},错误信息:{}", error.getStr("code"), error.getStr("message")); + return "谷歌翻译异常:" + error.getStr("message"); + } + + // 获取翻译结果 + JSONObject data = result.getJSONObject("data"); + if (data == null) { + log.error("谷歌翻译结果为空"); + return "谷歌翻译结果为空"; + } + + JSONArray translations = data.getJSONArray("translations"); + if (translations == null || translations.isEmpty()) { + log.error("谷歌翻译结果为空"); + return "谷歌翻译结果为空"; + } + + // 返回第一条翻译结果 + JSONObject translation = translations.getJSONObject(0); + return translation.getStr("translatedText"); + } catch (Exception e) { + log.error("谷歌翻译异常", e); + return "谷歌翻译异常"; + } + } + + /** + * 翻译文本(自动检测源语言) + * + * @param query 待翻译文本 + * @param to 目标语言 + * @return 翻译结果 + */ + public String translate(String query, String to) { + return translate(query, "", to); + } + + /** + * 翻译文本(使用Agent配置) + * + * @param query 待翻译文本 + * @param from 源语言 + * @param to 目标语言 + * @return 翻译结果 + */ + public String translateByAgentConfiguration(String query, String from, String to) { + System.out.println("1111111"); + System.out.println("开始谷歌翻译"); + try { + ImSetting setting = settingService.getByTokenAndSettingName(SettingEnum.TRANSLATION_SETTING.name()); + TranslationSetting configuration = JSONUtil.toBean(setting.getSettingValue(), TranslationSetting.class); + + // 转化语言标识 + to = convertTo(to); + + // 发送GET请求 + HttpResponse response = HttpRequest.get(GOOGLE_URL) + .form("key", configuration.getGoogleApiKey()) + .form("q", query) + .form("target", to) + .form("source", from) + .execute(); + + // 解析响应 + String body = response.body(); + JSONObject result = JSONUtil.parseObj(body); + + // 检查是否有错误 + if (result.containsKey("error")) { + JSONObject error = result.getJSONObject("error"); + log.error("谷歌翻译失败,错误码:{},错误信息:{}", error.getStr("code"), error.getStr("message")); + return "谷歌翻译异常:" + error.getStr("message"); + } + + // 获取翻译结果 + JSONObject data = result.getJSONObject("data"); + if (data == null) { + log.error("谷歌翻译结果为空"); + return "谷歌翻译结果为空"; + } + + JSONArray translations = data.getJSONArray("translations"); + if (translations == null || translations.isEmpty()) { + log.error("谷歌翻译结果为空"); + return "谷歌翻译结果为空"; + } + + // 返回第一条翻译结果 + JSONObject translation = translations.getJSONObject(0); + return translation.getStr("translatedText"); + } catch (Exception e) { + log.error("谷歌翻译异常", e); + return "谷歌翻译异常"; + } + } + + /** + * 翻译文本(自动检测源语言,使用Agent配置) + * + * @param query 待翻译文本 + * @param to 目标语言 + * @return 翻译结果 + */ + public String translateByAgentConfiguration(String query, String to) { + return translateByAgentConfiguration(query, "", to); + } + + /** + * 转化语言标识 + * + * @param to 目标语言 + * @return 转换后的语言标识 + */ + private String convertTo(String to) { + return switch (to) { + case "jp" -> "ja"; + case "kor" -> "ko"; + case "vie" -> "vi"; + case "fra" -> "fr"; + case "ara" -> "ar"; + default -> to; + }; + } +}