我定义了一个包装HMS ML Kit设备内翻译器的类。这个类有两个翻译器实例,分别使用两种不同的设置:
MLLocalTranslator translatorSend = new MLLocalTranslator();MLLocalTranslator translatorReceive = new MLLocalTranslator();MLTranslateSetting settingSend = new MLTranslateSetting();MLTranslateSetting settingReceive = new MLTranslateSetting();
translatorSend
将请求从一种语言(例如 it
)翻译成英语(en
)。translatorReceive
将请求的响应从 en
翻译成 it
。
然而,prepare
方法只下载了 en_it
翻译模型,而没有下载 it_en
模型(如果存在的话)。
HMSTranslator(String languageCode) { settingSend.sourceLangCode = languageCode; settingSend.targetLangCode = "en"; settingReceive.sourceLangCode = "en"; settingReceive.targetLangCode = languageCode;}Future<bool> prepare() async { if(settingSend.sourceLangCode != settingSend.targetLangCode) { bool isSendPrepared = await translatorSend.prepareModel(setting: settingSend) bool isReceivePrepared = await translatorReceive.prepareModel(setting: settingReceive); isPrepared = isSendPrepared && isReceivePrepared; } else { isPrepared = false; } return isPrepared;}
问题出现在我使用 translatorSend
翻译字符串时。
Future<String> translateString(String stringToTranslate) async { if(settingSend.sourceLangCode != settingSend.targetLangCode) { String result; if (isPrepared) { result = await translatorSend.asyncTranslate(sourceText: stringToTranslate); } else { settingSend.sourceTextOnRemote = stringToTranslate; result = await sendRemoteTranslator.asyncTranslate(setting: settingSend); } return result; } else { return stringToTranslate; }}
这个方法应该将一个 it
字符串翻译成 en
字符串。然而,它似乎调用了 en_it
模型并且翻译失败:
I/flutter (28228): TRANSLATOR: it to enI/flutter (28228): TRANSLATOR: PREPAREDI/MLLocalTranslator(28228): translate sourceLanguage: en targetLanguage: itWHAT: vestiti usati -> vestiti usati - WHERE applicazione -> applicazione
将响应从 en
翻译成 it
是可以工作的。
我测试了其他语言,发现 fr
也存在同样的问题。
进一步的测试显示,es
可以正常工作:
WHAT: ropa usada -> Used clothing - WHERE aplicación -> application
回答:
请检查您是否使用的是Flutter插件的新版本。
语言包可以双向使用。例如,en
–it
可以用于 en
到 it
或 it
到 en
的翻译。
以下供您参考:
基于官方网站的插件Demo进行修改
通过多次调用同一实例来实现双向翻译。
//入口函数_translationMake() async { try { await _prepareModel_run("it","en","vestiti usati"); await _prepareModel_run("en","it","application"); } on Exception catch (e) { print(e.toString()); }}_prepareModel_run(String srcLang, String dstLang, String content) async { setting.sourceLangCode = srcLang; setting.targetLangCode = dstLang; try { final bool res = await translator.prepareModel(setting: setting); if (res) { final String s = await _localTranslate_run(content); if (s != null) { print("_prepareModel_run " + content + " translate to "+s); } }else { print("_prepareModel_run res false"); } } on Exception catch (e) { print(e.toString()); }}Future<String> _localTranslate_run(String Content) async { try { final String s = await translator.syncTranslate(sourceText: Content); if (s != null) { _stopLocalTranslate(); setState(() => _translateResult = s); return s; } else { print("no Translation"); setState(() => _translateResult = "no translation"); return "no translation"; } } on Exception catch (e) { print(e.toString()); }}
日志打印结果如下:
_prepareModel_run vestiti usati translate to Used clothes_prepareModel_run application translate to applicazione