51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Java 调用 Google 翻译 API

1、简介 {#1简介}

本文将带你了解如何将 Google Translate API 集成到 Java 应用中,谷歌的翻译服务支持 100 多种语言,通过它的 API,我们可以轻松构建一个可以执行实时语言翻译的应用。

2、添加 SDK 依赖 {#2添加-sdk-依赖}

首先,在 pom.xml 文件中添加 Google Cloud Translate 依赖:

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

Google Cloud Translate 提供了与 API 交互的简易接口。它会处理我们的应用与 Google 翻译服务之间的所有通信。

3、初始化 Translate 客户端 {#3初始化-translate-客户端}

依赖添加后,下一步就是在 Java 应用中初始化 Translate 客户端。这需要使用从 Google Cloud Console 获取的服务帐户 JSON 文件进行身份验证。这种方法更安全,建议用于服务器端应用。

接下来,需要确保服务帐户已启用云翻译 API 并分配给 Google Cloud 中的云翻译 API 用户角色。

然后,通过 TranslateOptions 设置 API 凭证等配置,然后初始化 Translate 客户端:

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、列出支持的语种 {#4列出支持的语种}

Google 云翻译 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) {
        // 异常处理
    }
}

如果希望语言名称以特定的目标语言显示,可以使用 LanguageListOption.targetLanguage() 方法。例如,如果我们希望名称以西班牙语("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、翻译文本 {#5翻译文本}

Google 翻译 API 提供 translate() 方法,用于指定要翻译的文本和目标语言。然后,API 会返回翻译后的文本。

此外,API 还支持 HTML 输入。在翻译 HTML 时,API 不会修改任何 HTML 标签,只会翻译标签之间的文本内容。

示例如下,使用 translate 方法翻译一段文字:

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 表示西班牙语,fr 表示法语)。然后,使用 translate.translate() 发起翻译请求,同时传递要翻译的文本和目标语言。

从 API 收到翻译响应后,该方法会返回一个 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、检测文本语言 {#6检测文本语言}

谷歌翻译 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、一次翻译多种文本 {#7一次翻译多种文本}

此外,如果我们需要翻译多个文本片段,可以使用 translate 方法翻译字符串列表。这种方法比为每个文本单独调用 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;
}

例如,如果我们调用 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、使用自定义术语(词汇) {#8使用自定义术语词汇}

对于专业翻译,Google Cloud 的 Translation v3 API 支持词汇表,但我们需要切换到 TranslationServiceClient 才能实现。

词汇表可以确保根据我们的偏好对特定术语进行统一翻译。例如,如果我们正在翻译技术文档,我们可能希望确保某些术语始终以特定的方式翻译(例如框架 spring 不应该翻译为 春天)。

要使用词汇表,首先需要在谷歌云控制台中创建一个词汇表。创建后,我们将得到一个词汇表 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 作为附加参数传递给 translate() 方法。然后,API 会使用词汇表确保特定术语按照我们的自定义定义进行翻译。

例如,如果我们有一个词汇表指定 "Hello" 在法语中应翻译为 "Salutations",那么调用 translateWithGlossary("Hello", "fr", "{glossary-id}") 就会返回 "Salutations"

9、总结 {#9总结}

本文介绍了如何在 Java 中调用谷歌的 Translate API。


Ref:https://www.baeldung.com/java-google-translate-api

赞(3)
未经允许不得转载:工具盒子 » Java 调用 Google 翻译 API