import 'package:get/get.dart'; import '../../core/utils/logger.dart'; import 'sparkchain_session.dart'; /// 文本机器翻译走讯飞 SDK 的 gtrans,不再直连微软翻译,也不再打自家网关。 class ServerTranslationService extends GetxService { static ServerTranslationService get to => Get.find(); static const _tag = 'ServerTrans'; /// 与旧实现保持同样的接口形态。讯飞 SDK 在真正翻译时才初始化。 bool get isInitialized => true; /// 保留这个方法只为兼容调用方(translation_controller 会先调 initialize)。 Future initialize() async => true; /// 最近一次实际使用的服务商 / 服务配置 id,排查"到底用的哪家"时看它。 final lastProvider = ''.obs; final lastSvcId = ''.obs; /// 讯飞 gtrans 不回填检测语种,自动检测时这里保持空。 final lastDetectedFrom = ''.obs; static const Duration realtimeTimeout = Duration(seconds: 12); Future translateText({ required String text, required String sourceLanguageCode, required String targetLanguageCode, Object? cancelToken, Duration? timeout = realtimeTimeout, bool tryOnDevice = true, }) async { final src = text.trim(); if (src.isEmpty) return null; if (!tryOnDevice) return null; // 签名留给原来的调用方。翻译本身在 SDK 里,不再用取消令牌和超时打网关。 if (cancelToken != null || timeout != null) { Logger.i(_tag, '文本翻译走讯飞 SDK gtrans'); } final onDevice = await SparkChainSession.translate( from: sourceLanguageCode, to: targetLanguageCode, text: src, ); if (onDevice == null) { Logger.w(_tag, '讯飞 SDK 没返回译文: $sourceLanguageCode→$targetLanguageCode'); return null; } lastProvider.value = 'sparkchain'; lastSvcId.value = 'sparkchain'; lastDetectedFrom.value = ''; return onDevice; } }