# 翻译引擎(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();

# 开发实例

快速开始 - 简单翻译插件

官方翻译插件源码 (opens new window)