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