diff --git a/translate/README.md b/translate/README.md new file mode 100644 index 00000000000..ff2e9131d2e --- /dev/null +++ b/translate/README.md @@ -0,0 +1,66 @@ +# Google Cloud Translate Sample + +This sample demonstrates the use of [Google Cloud Translate +API][Translate-Docs] for translating and detecting language text. + +[Translate-Docs]: https://cloud.google.com/translate/docs/ + +## Java Version + +This sample requires you to have +[Java8](https://docs.oracle.com/javase/8/docs/technotes/guides/install/install_overview.html). + +## Download Maven + +This sample uses the [Apache Maven][maven] build system. Before getting started, +be +sure to [download][maven-download] and [install][maven-install] it. When you use +Maven as described here, it will automatically download the needed client +libraries. + +[maven]: https://maven.apache.org +[maven-download]: https://maven.apache.org/download.cgi +[maven-install]: https://maven.apache.org/install.html + +## Run the sample + +To build the sample, we use Maven. + +```bash +mvn clean compile assembly:single +``` + +We can then run the assembled JAR file with the `java` command. The variable +$COMMAND takes three values `langsupport`, `detect` and `translate`. + +``` +JAR_FILE=target/translate-1.0-SNAPSHOT-jar-with-dependencies.jar +java -jar $JAR_FILE + +``` + +Example Usage: + +``` +INPUT="A quick brown fox jumped over a lazy dog." +SOURCE_LANG="en" +TARGET_LANG="fr" +``` + +Translate API Features: + + * List the languages supported by the API + ``` + java -jar $JAR_FILE langsupport + ``` + + * Detect input text language + ``` + java -jar $JAR_FILE detect "$INPUT" + ``` + + * Translate input text (with options) + ``` + java -jar $JAR_FILE translate "$INPUT" + java -jar $JAR_FILE translate "$INPUT" $SOURCE_LANG $TARGET_LANG + ``` diff --git a/translate/pom.xml b/translate/pom.xml new file mode 100644 index 00000000000..2eddfbdd0df --- /dev/null +++ b/translate/pom.xml @@ -0,0 +1,69 @@ + + + 4.0.0 + com.google.cloud.translate.samples + translate + 1.0-SNAPSHOT + translate + http://maven.apache.org + + 1.8 + 1.8 + UTF-8 + + + com.google.cloud + shared-configuration + 1.0.0 + ../java-repo-tools + + + + com.google.cloud + google-cloud-translate + 0.3.0 + + + junit + junit + 4.12 + test + + + com.google.truth + truth + 0.30 + + + + + + maven-assembly-plugin + + + + com.google.cloud.translate.samples.TranslateText + + + + jar-with-dependencies + + + + + + diff --git a/translate/src/main/java/com/google/cloud/translate/samples/TranslateText.java b/translate/src/main/java/com/google/cloud/translate/samples/TranslateText.java new file mode 100644 index 00000000000..3e0e46532dc --- /dev/null +++ b/translate/src/main/java/com/google/cloud/translate/samples/TranslateText.java @@ -0,0 +1,143 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.cloud.translate.samples; + +import com.google.cloud.RetryParams; +import com.google.cloud.translate.Detection; +import com.google.cloud.translate.Language; +import com.google.cloud.translate.Translate; +import com.google.cloud.translate.Translate.TranslateOption; +import com.google.cloud.translate.TranslateOptions; +import com.google.cloud.translate.Translation; +import com.google.common.collect.ImmutableList; + +import java.io.PrintStream; +import java.util.List; + +public class TranslateText { + /** + * Detect the language of input text. + * + * @param sourceText source text to be detected for language + * @param out print stream + */ + public static void detectLanguage(String sourceText, PrintStream out) { + Translate translate = createTranslateService(); + List detections = translate.detect(ImmutableList.of(sourceText)); + System.out.println("Language(s) detected:"); + for (Detection detection : detections) { + out.printf("\t%s\n", detection); + } + } + + /** + * Translates the source text in any language to english. + * + * @param sourceText source text to be translated + * @param out print stream + */ + public static void translateText(String sourceText, PrintStream out) { + Translate translate = createTranslateService(); + Translation translation = translate.translate(sourceText); + out.printf("Source Text:\n\t%s\n", sourceText); + out.printf("Translated Text:\n\t%s\n", translation.translatedText()); + } + + /** + * Translate the source text from source to target language. + * + * @param sourceText source text to be translated + * @param sourceLang source language of the text + * @param targetLang target language of translated text + * @param out print stream + */ + public static void translateTextWithOptions( + String sourceText, + String sourceLang, + String targetLang, + PrintStream out) { + + Translate translate = createTranslateService(); + TranslateOption srcLang = TranslateOption.sourceLanguage(sourceLang); + TranslateOption tgtLang = TranslateOption.targetLanguage(targetLang); + + Translation translation = translate.translate(sourceText, srcLang, tgtLang); + out.printf("Source Text:\n\tLang: %s, Text: %s\n", sourceLang, sourceText); + out.printf("TranslatedText:\n\tLang: %s, Text: %s\n", targetLang, translation.translatedText()); + } + + /** + * Displays a list of supported languages and codes. + * + * @param out print stream + */ + public static void displaySupportedLanguages(PrintStream out) { + Translate translate = createTranslateService(); + List languages = translate.listSupportedLanguages(); + + for (Language language : languages) { + out.printf("Name: %s, Code: %s\n", language.name(), language.code()); + } + } + + /** + * Create Google Translate API Service. + * + * @return Google Translate Service + */ + public static Translate createTranslateService() { + TranslateOptions translateOption = TranslateOptions.builder() + .retryParams(retryParams()) + .connectTimeout(60000) + .readTimeout(60000) + .build(); + return translateOption.service(); + } + + /** + * Retry params for the Translate API. + */ + private static RetryParams retryParams() { + return RetryParams.builder() + .retryMaxAttempts(3) + .maxRetryDelayMillis(30000) + .totalRetryPeriodMillis(120000) + .initialRetryDelayMillis(250) + .build(); + } + + public static void main(String[] args) { + String command = args[0]; + String text; + + if (command.equals("detect")) { + text = args[1]; + TranslateText.detectLanguage(text, System.out); + } else if (command.equals("translate")) { + text = args[1]; + try { + String sourceLang = args[2]; + String targetLang = args[3]; + TranslateText.translateTextWithOptions(text, sourceLang, targetLang, System.out); + } catch (ArrayIndexOutOfBoundsException ex) { + TranslateText.translateText(text, System.out); + } + } else if (command.equals("langsupport")) { + TranslateText.displaySupportedLanguages(System.out); + } + } +} diff --git a/translate/src/test/java/com/google/cloud/translate/samples/TranslateTextTest.java b/translate/src/test/java/com/google/cloud/translate/samples/TranslateTextTest.java new file mode 100644 index 00000000000..88b63cbb792 --- /dev/null +++ b/translate/src/test/java/com/google/cloud/translate/samples/TranslateTextTest.java @@ -0,0 +1,132 @@ +/* + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.cloud.translate.samples; + +import static com.google.common.truth.Truth.assertThat; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.util.Arrays; +import java.util.List; + +/** + * Unit tests for {@link Analyze}. + */ +@RunWith(JUnit4.class) +public class TranslateTextTest { + + @Test public void testSupportedLanguages() throws Exception { + // Supported languages + List languages = Arrays.asList( + "Afrikaans", "Albanian", "Amharic", "Arabic", "Armenian", "Azerbaijani", "Basque", + "Belarusian", "Bengali", "Bosnian", "Bulgarian", "Catalan", "Cebuano", "Chichewa", + "Chinese", "Chinese", "Corsican", "Croatian", "Czech", "Danish", "Dutch", "English", + "Esperanto", "Estonian", "Filipino", "Finnish", "French", "Frisian", "Galician", + "Georgian", "German", "Greek", "Gujarati", "Haitian", "Hausa", "Hawaiian", "Hebrew", + "Hindi", "Hmong", "Hungarian", "Icelandic", "Igbo", "Indonesian", "Irish", "Italian", + "Japanese", "Javanese", "Kannada", "Kazakh", "Khmer", "Korean", "Kurdish", "Kyrgyz", + "Lao", "Latin", "Latvian", "Lithuanian", "Luxembourgish", "Macedonian", "Malagasy", + "Malay", "Malayalam", "Maltese", "Maori", "Marathi", "Mongolian", "Myanmar", "Nepali", + "Norwegian", "Pashto", "Persian", "Polish", "Portuguese", "Punjabi", "Romanian", + "Russian", "Samoan", "Scots", "Serbian", "Sesotho", "Shona", "Sindhi", "Sinhala", + "Slovak", "Slovenian", "Somali", "Spanish", "Sundanese", "Swahili", "Swedish", + "Tajik", "Tamil", "Telugu", "Thai", "Turkish", "Ukrainian", "Urdu", "Uzbek", + "Vietnamese", "Welsh", "Xhosa", "Yiddish", "Yoruba", "Zulu"); + + // Arrange + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + PrintStream out = new PrintStream(bout); + + // Act + TranslateText.displaySupportedLanguages(out); + + // Assert + String got = bout.toString(); + for (String language : languages) { + assertThat(got).contains(language); + } + } + + @Test public void testEnglishLangDetection() throws Exception { + // Arrange + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + PrintStream out = new PrintStream(bout); + + // Act + TranslateText.detectLanguage("With power comes great responsibility.", out); + + // Assert + String got = bout.toString(); + assertThat(got).contains("language=en"); + + // Assert + Double confidence = Double.parseDouble( + got.split("confidence=")[1].split("}")[0] + ); + assertThat(confidence).isWithin(0.7).of(1.0); + } + + @Test public void testGermanLangDetection() throws Exception { + // Arrange + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + PrintStream out = new PrintStream(bout); + + // Act + TranslateText.detectLanguage("Mit Macht kommt große Verantwortung.", out); + + // Assert + String got = bout.toString(); + assertThat(got).contains("language=de"); + + // Assert + Double confidence = Double.parseDouble( + got.split("confidence=")[1].split("}")[0] + ); + assertThat(confidence).isWithin(0.9).of(1.0); + } + + @Test public void testDefaultIdentityTranslation() throws Exception { + // Arrange + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + PrintStream out = new PrintStream(bout); + + // Act + String proverb = "What you do not wish for yourself, do not do to others."; + TranslateText.translateText(proverb, out); + + // Assert + String got = bout.toString(); + assertThat(got).contains(proverb); + } + + @Test public void testGermanToSpanishTranslation() throws Exception { + // Arrange + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + PrintStream out = new PrintStream(bout); + + // Act + TranslateText.translateTextWithOptions("Mit Macht kommt große Verantwortung.", "de", "es", out); + + // Assert + String got = bout.toString(); + assertThat(got).contains("Con el poder viene una gran responsabilidad."); + } +}