Skip to content
Merged
Show file tree
Hide file tree
Changes from 20 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions translate/README.md
Original file line number Diff line number Diff line change
@@ -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 <detect|translate|langsupport> <text>
<optional_source> <optional_target>
```

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
```
69 changes: 69 additions & 0 deletions translate/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
<!--
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.
-->
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.google.cloud.translate.samples</groupId>
<artifactId>translate</artifactId>
<version>1.0-SNAPSHOT</version>
<name>translate</name>
<url>http://maven.apache.org</url>
<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<parent>
<groupId>com.google.cloud</groupId>
<artifactId>shared-configuration</artifactId>
<version>1.0.0</version>
<relativePath>../java-repo-tools</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-translate</artifactId>
<version>0.3.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.truth</groupId>
<artifactId>truth</artifactId>
<version>0.30</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>com.google.cloud.translate.samples.TranslateText</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
/*
* 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.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.Translation;
import com.google.cloud.translate.testing.RemoteTranslateHelper;
import com.google.common.collect.ImmutableList;

import java.io.PrintStream;
import java.util.List;

public class TranslateText {
private static final Translate TRANSLATE = RemoteTranslateHelper.create().options().service();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are you sure this is the class we need to use for a sample? The fact that this is in a package called testing makes me wary to suggest it for production, non-test code.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably want to pass the Translate object to each individual function here rather than creating it statically, also. That way it is more clear that developers can create the object as part of a normal lifecycle.

Consider even having each function create a Translate object, depending on how these snippets will be used, that could be the most clear.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done ptal


/**
* 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) {
List<Detection> 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) {
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) {

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) {
List<Language> languages = TRANSLATE.listSupportedLanguages();

for (Language language : languages) {
out.printf("Name: %s, Code: %s\n", language.name(), language.code());
}
}

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);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
/*
* 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<String> 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).isLessThan(1.0);
assertThat(confidence).isGreaterThan(0.7);
}

@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).isLessThan(1.0);
assertThat(confidence).isGreaterThan(0.9);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

assertThat(confidence).isWithin(.05).of(.95) might be more readable.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was what I was asking for. (truth)

}

@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.");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm wary about this one, too. Since I'm sure there is more than one possible translation. Maybe change it to look for a few important words (like responsabilidad)

Copy link
Contributor Author

@puneith puneith Sep 30, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Currently, we only get one translation. If this changes it will be good to know why and make modifications to the test appropriately. I think just added keywords is too flexible.

}
}