# 翻译引擎(TranslationEngine)
通过实现 TranslationEngine 接口,可以为 MT 管理器的翻译模式增加翻译引擎。
# 接口说明
TranslationEngine 接口包含了以下方法:
/**
* 返回翻译引擎名称
*/
@NonNull
String name();
/**
* 初始化,每个实例仅调用一次
*/
void init(MTPluginContext context);
/**
* @return init中传入的context
*/
MTPluginContext getContext();
/**
* @return 配置信息
*/
@NonNull
Configuration getConfiguration();
/**
* 加载源语言
*/
@NonNull
List<String> loadSourceLanguages();
/**
* 加载目标语言
*
* @param sourceLanguage 源语言名称
*/
@NonNull
List<String> loadTargetLanguages(String sourceLanguage);
/**
* 将loadSourceLanguages和loadTargetLanguages中获取到
* 的language转化为可视化名称
*/
@NonNull
String getLanguageDisplayName(String language);
/**
* 在onStart前调用,区别是运行在UI线程
*/
void beforeStart();
/**
* 开始一轮翻译前调用,运行在子线程
*/
void onStart();
/**
* text为待翻译文本,其值受Configuration.acceptTranslated影响
*/
@NonNull
String translate(String text, String sourceLanguage, String targetLanguage) throws IOException;
/**
* 结束全部翻译或用户取消操作后调用,运行在子线程
*/
void onFinish();
/**
* 在onFinish后调用,区别是运行在UI线程
*/
void afterFinish();
/**
* 当翻译发生错误时调用,运行在UI线程
*
* @return 返回true时MT不会显示错误信息对话框
*/
boolean onError(Exception e);
各个方法调用流程如下图:
插件 API 还提供了 BaseTranslationEngine,通过继承它可快速实现翻译接口:
public abstract class BaseTranslationEngine implements TranslationEngine {
private final Configuration configuration;
private MTPluginContext context;
/**
* 默认配置
*/
public BaseTranslationEngine() {
this.configuration = new ConfigurationBuilder()
.setAutoRepairFormatControlError(true)
.build();
}
/**
* 自定义配置
*/
public BaseTranslationEngine(Configuration configuration) {
this.configuration = configuration;
}
@Override
public final void init(MTPluginContext context) {
this.context = context;
init();
}
protected void init() {
}
@Override
public MTPluginContext getContext() {
return context;
}
@NonNull
@Override
public Configuration getConfiguration() {
return configuration;
}
@NonNull
@Override
public String getLanguageDisplayName(String language) {
return getContext().getLanguageNameLocalString().get(language);
}
@Override
public void beforeStart() {
}
@Override
public void onStart() {
}
@Override
public void onFinish() {
}
@Override
public void afterFinish() {
}
@Override
public boolean onError(Exception e) {
getContext().log(e);
return false;
}
}
# 配置说明
MT 会调用翻译接口的 getConfiguration() 来获取配置信息,如果你是直接继承 BaseTranslationEngine,则可以通过构造函数使用默认配置(仅修复控制符翻译错误)或者传入自定义配置。
由于 Configuration 类的字段都是 final 无法更改,所以需要通过创建 ConfigurationBuilder 并进行配置,最后调用 build() 创建 Configuration 实例。
class ConfigurationBuilder {
private boolean acceptTranslated;
private boolean forceNotToSkipTranslated;
private boolean targetLanguageMutable;
private boolean autoRepairFormatControlError;
private boolean disableAutoHideLanguage;
/**
* 设置是否接受翻译过的文本。例如一个词条"Apple",第一次翻译将传递"Apple",
* 假设翻译结果为"苹果",如果再次对这个词条进行翻译,
* 当acceptTranslated为false,将传递"Apple"进行翻译;
* 当acceptTranslated为true,将传递"苹果"进行翻译。
*
* 默认为false
*/
public ConfigurationBuilder setAcceptTranslated(boolean acceptTranslated) {
this.acceptTranslated = acceptTranslated;
return this;
}
/**
* 设置是否强制不跳过已翻译词条(开启后界面上将会隐藏该选项)
*
* 默认为false
*/
public ConfigurationBuilder setForceNotToSkipTranslated(boolean forceNotToSkipTranslated) {
this.forceNotToSkipTranslated = forceNotToSkipTranslated;
return this;
}
/**
* 设置TargetLanguage是否是可变的,如果翻译引擎的目标语言列表会随着
* SourceLanguage的变化而变化,值应该设为true
*
* 默认为false
*/
public ConfigurationBuilder setTargetLanguageMutable(boolean targetLanguageMutable) {
this.targetLanguageMutable = targetLanguageMutable;
return this;
}
/**
* 设置是否自动修复简单的控制符翻译错误,如%s被翻译为%S
*
* 默认为false
*/
public ConfigurationBuilder setAutoRepairFormatControlError(boolean autoRepairFormatControlError) {
this.autoRepairFormatControlError = autoRepairFormatControlError;
return this;
}
/**
* 设置是否自动隐藏语言
* 像谷歌翻译这类翻译引擎支持大量语言翻译,
* 用户可在翻译模式中选择要隐藏的语言,如果不希望翻译引擎的源语言和
* 目标语言被自动隐藏,可将值设为true
*
* 默认为false
*/
public ConfigurationBuilder setDisableAutoHideLanguage(boolean disableAutoHideLanguage) {
this.disableAutoHideLanguage = disableAutoHideLanguage;
return this;
}
public Configuration build() {
return new Configuration(acceptTranslated,
forceNotToSkipTranslated,
targetLanguageMutable,
autoRepairFormatControlError,
disableAutoHideLanguage);
}
}
例如:
Configuration configuration = new ConfigurationBuilder()
.setAcceptTranslated(true)
.setForceNotToSkipTranslated(true)
.setTargetLanguageMutable(true)
.setAutoRepairFormatControlError(true)
.setDisableAutoHideLanguage(true)
.build();