1. 引言

本文将带你一步步在Java应用中集成Google Translate API。Google翻译服务支持100+种语言,通过API我们可以轻松构建实时翻译功能的应用程序。

2. 搭建Java应用环境

要在Java中使用Google Translate API,需要先添加必要的依赖库。我们使用Google Cloud Translate客户端库,它提供了与API交互的便捷接口,负责处理应用与Google翻译服务之间的所有通信

pom.xml中添加以下依赖:

<dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-translate</artifactId>
</dependency>

这个依赖确保我们能访问Google Cloud Translate API客户端库,提供发送翻译请求、语言检测和管理API交互的所有工具。

3. 初始化翻译客户端

添加依赖后,需要在Java应用中初始化Translate客户端。我们使用从Google Cloud Console获取的服务账号JSON文件进行身份验证,这是服务器端应用推荐的安全方式。

⚠️ 确保服务账号已启用Cloud Translation API并分配Cloud Translation API User角色

使用TranslateOptions类配置客户端:

class Translator {

    static {
        initializeTranslateClient();
    }

    public static void initializeTranslateClient() {
        if (translate == null) {
            try {
                GoogleCredentials credentials = GoogleCredentials.fromStream(
                  new FileInputStream("src/main/resources/YOUR_SERVICEACCOUNT_JSON.json")
                );
                translate = TranslateOptions.newBuilder()
                  .setCredentials(credentials)
                  .build()
                  .getService();
                logger.info("Google Translate client initialized.");
            } catch (Exception e) {
                logger.error("Failed to initialize Google Translate client.", e);
            }
        }
    }

    // 其他方法将在此处添加
}

上述代码通过TranslateOptions.newBuilder()配置客户端,使用GoogleCredentials.fromStream()加载服务账号凭证。构建对象后调用getService()获取Translate实例,用于与API交互。

4. 获取支持的语言列表

Google Cloud Translation API允许获取支持的语言列表。这在用户界面显示语言选项或翻译前验证可用语言时特别有用

使用listSupportedLanguages()方法获取语言列表:

static void listSupportedLanguages() {
    try {
        List<Language> languages = translate.listSupportedLanguages();
        for (Language language : languages) {
            logger.info(String.format("Name: %s, Code: %s", language.getName(), language.getCode()));
        }
    } catch (Exception e) {
        // 处理异常
    }
}

若需按特定目标语言显示语言名称(例如西班牙语"es"):

List<Language> languages = translate.listSupportedLanguages(
  Translate.LanguageListOption.targetLanguage("es")
);

for (Language language : languages) {
    logger.info(String.format("Name: %s, Code: %s", language.getName(), language.getCode()));
}

这对按用户偏好语言显示选项很有用。运行程序将输出:

Name: Inglés, Code: en
Name: Español, Code: es
Name: Francés, Code: fr
Name: Chino (Simplificado), Code: zh
...

5. 翻译文本

Google Translate API提供translate()方法,可指定待翻译文本和目标语言。API还支持HTML输入——翻译HTML时,API不会修改标签,只翻译标签间的文本内容

翻译文本的示例方法:

static String translateText(String text, String targetLanguage) {
    String s = "";
    try {
        Translation translation = translate.translate(
          text,
          Translate.TranslateOption.targetLanguage(targetLanguage)
        );
        s = translation.getTranslatedText();
    } catch (Exception e) {
        // 处理异常
    }
    return s;
}

text是待翻译内容,targetLanguage是目标语言代码(如"es"代表西班牙语)。通过translate.translate()发送请求,返回的Translation对象用getTranslatedText()获取译文。

例如调用translateText("Hello, world!", "es")将返回"¡Hola, mundo!"。通过单元测试验证功能:

@Test 
void whenTranslateTextIsCalledWithEnglishTextAndFrenchTargetLanguage_thenReturnTranslatedText() { 
    String originalText = "Hello, world!";
    String targetLanguage = "es"; 
    String expectedTranslatedText = "¡Hola Mundo!";

    String translatedText = Translator.translateText(originalText, targetLanguage);
    assertEquals(expectedTranslatedText, translatedText);
}

@Test 
void whenTranslateTextIsCalledWithEnglishHTMLAndFrenchTargetLanguage_thenReturnTranslatedHTML() { 
    String originalHtml = "<p>Hello, world!</p>";
    String targetLanguage = "es"; 
    String expectedTranslatedHtml = "<p>¡Hola Mundo!</p>";

    String translatedHtml = Translator.translateText(originalHtml, targetLanguage);
    assertEquals(expectedTranslatedHtml, translatedHtml);
}

6. 检测文本语言

Google Translate API支持语言检测功能,当不知道输入文本语言时特别有用

使用detect()方法检测语言:

static String detectLanguage(String text) {
    return translate.detect(text).getLanguage();
}

通过translate.detect(text)检测语言,返回的Detection对象用getLanguage()提取语言代码

例如调用detectLanguage("Hola, mundo!")将返回"es"(西班牙语):

@Test
void whenDetectLanguageIsCalledWithSpanishText_thenReturnSpanishLanguageCode() {
    String text = "Hola, mundo!";
    String expectedLanguageCode = "es";
    String detectedLanguage = Translator.detectLanguage(text);

    assertEquals(expectedLanguageCode, detectedLanguage);
}

7. 批量翻译文本

需要翻译多个文本时,批量翻译比单独调用API更高效

static List<String> translateBatch(List<String> texts, String targetLanguage) {
    List<String> translationList = null;
    try {
        List<Translation> translations = translate.translate(
          texts,
          Translate.TranslateOption.targetLanguage(targetLanguage)
        );
        translationList = translations.stream()
          .map(Translation::getTranslatedText)
          .collect(Collectors.toList());
    } catch (Exception e) {
        // 处理异常
    }
    return translationList;
}

该方法接收文本列表和目标语言,单次API调用完成所有翻译,返回译文列表。

例如调用translateBatch(List.of("Apple", "Banana", "Orange"), "fr")将返回List.of("Pomme", "Banane", "Orange")

@Test  
void whenTranslateBatchIsCalledWithMultipleTexts_thenReturnTranslatedTexts() {
    List<String> originalTexts = List.of("Apple", "Banana", "Orange");
    List<String> expectedTranslatedTexts = List.of("Pomme", "Banane", "Orange");

    List<String> translatedTexts = Translator.translateBatch(originalTexts, "fr");

    assertEquals(expectedTranslatedTexts, translatedTexts);
}

8. 使用自定义术语表

专业翻译场景下,Google Cloud Translation v3 API支持术语表功能,但需切换到TranslationServiceClient

术语表确保特定术语按偏好一致翻译。例如翻译技术文档时,可强制某些术语使用特定译法

使用前需在Google Cloud Console创建术语表,获取术语表ID:

static String translateWithGlossary(String projectId, String location, String text, String targetLanguage, String glossaryId) {
    String translatedText = "";

    try (TranslationServiceClient client = TranslationServiceClient.create()) {
        LocationName parent = LocationName.of(projectId, location);
        GlossaryName glossaryName = GlossaryName.of(projectId, location, glossaryId);

        TranslateTextRequest request = TranslateTextRequest.newBuilder()
          .setParent(parent.toString())
          .setTargetLanguageCode(targetLanguage)
          .addContents(text)
          .setGlossaryConfig(TranslateTextGlossaryConfig.newBuilder()
            .setGlossary(glossaryName.toString()).build()) // 附加术语表
          .build();

        TranslateTextResponse response = client.translateText(request);
        translatedText = response.getTranslations(0).getTranslatedText();
    } catch (IOException e) {
        // 处理异常
    }

    return translatedText;
}

该方法将术语表ID作为额外参数传递,API会根据术语表中的自定义定义翻译特定术语

例如若术语表规定"Hello"在法语中译为"Salutations",调用translateWithGlossary("Hello", "fr", "glossary-id")将返回"Salutations"。

9. 总结

本文详细介绍了在Java应用中集成Google Translate API的完整流程:

  • ✅ 初始化翻译客户端
  • ✅ 实现文本翻译功能
  • ✅ 添加语言检测能力
  • ✅ 支持批量文本翻译
  • ✅ 使用自定义术语表

通过这些步骤,你可以轻松构建强大的多语言翻译功能。实际开发中记得处理好异常和API配额限制,避免踩坑。


原始标题:Using Google Translate API in a Java Application | Baeldung