Java 调用 Google 翻译 API
1、简介
本文将带你了解如何将 Google Translate API 集成到 Java 应用中,谷歌的翻译服务支持 100 多种语言,通过它的 API,我们可以轻松构建一个可以执行实时语言翻译的应用。
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 客户端
依赖添加后,下一步就是在 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、列出支持的语种
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、翻译文本
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、检测文本语言
谷歌翻译 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、一次翻译多种文本
此外,如果我们需要翻译多个文本片段,可以使用 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、使用自定义术语(词汇)
对于专业翻译,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、总结
本文介绍了如何在 Java 中调用谷歌的 Translate API。
Ref:https://www.baeldung.com/java-google-translate-api