diff --git a/gcloud-java-translate/src/main/java/com/google/cloud/translate/Translate.java b/gcloud-java-translate/src/main/java/com/google/cloud/translate/Translate.java index 5e406a9e2e28..4d77a74e180b 100644 --- a/gcloud-java-translate/src/main/java/com/google/cloud/translate/Translate.java +++ b/gcloud-java-translate/src/main/java/com/google/cloud/translate/Translate.java @@ -51,6 +51,38 @@ public static LanguageListOption targetLanguage(String targetLanguage) { } } + /** + * Class for specifying translate options. + */ + class TranslateOption extends Option { + + private static final long serialVersionUID = 1347871763933507106L; + + private TranslateOption(TranslateRpc.Option rpcOption, String value) { + super(rpcOption, value); + } + + /** + * Returns an option for setting the source language. If not provided, Google Translate will try + * to detect the language of the text to translate. + * + * @param sourceLanguage the source language code + */ + public static TranslateOption sourceLanguage(String sourceLanguage) { + return new TranslateOption(TranslateRpc.Option.SOURCE_LANGUAGE, sourceLanguage); + } + + /** + * Returns an option for setting the target language. If this option is not provided, the value + * returned by {@link TranslateOptions#targetLanguage()} is used. + * + * @param targetLanguage the target language code + */ + public static TranslateOption targetLanguage(String targetLanguage) { + return new TranslateOption(TranslateRpc.Option.TARGET_LANGUAGE, targetLanguage); + } + } + /** * Returns the list of languages supported by Google Translate. If * {@link LanguageListOption#targetLanguage(String)} is provided, {@link Language#name()} values @@ -112,4 +144,48 @@ public static LanguageListOption targetLanguage(String targetLanguage) { * } */ Detection detect(String text); + + /** + * Translates the provided texts. + * + *

Example of translating some texts: + *

 {@code
+   * List texts = new LinkedList<>();
+   * texts.add("Hello, World!");
+   * texts.add("¡Hola Mundo!");
+   * List translations = translate.translate(texts);
+   * }
+ * + *

Example of translating some texts, specifying source and target language: + *

 {@code
+   * List texts = new LinkedList<>();
+   * texts.add("¡Hola Mundo!");
+   * List translations = translate.translate(texts,
+   *     TranslateOption.sourceLanguage("es"), TranslateOption.targetLanguage("de"));
+   * }
+ * + * @param texts the texts to translate + * @return a list of objects containing information on the language translation, one for each + * provided text, in order. + */ + List translate(List texts, TranslateOption... options); + + /** + * Translates the provided texts. + * + *

Example of translating a text: + *

 {@code
+   * Translation translation = translate.translate("¡Hola Mundo!");
+   * }
+ * + *

Example of translating a text, specifying source and target language: + *

 {@code
+   * Translation translation = translate.translate("¡Hola Mundo!",
+   *     TranslateOption.sourceLanguage("es"), TranslateOption.targetLanguage("de"));
+   * }
+ * + * @param text the text to translate + * @return an object containing information on the language translation + */ + Translation translate(String text, TranslateOption... options); } diff --git a/gcloud-java-translate/src/main/java/com/google/cloud/translate/TranslateImpl.java b/gcloud-java-translate/src/main/java/com/google/cloud/translate/TranslateImpl.java index e7aa8dfd6200..3d02ac898660 100644 --- a/gcloud-java-translate/src/main/java/com/google/cloud/translate/TranslateImpl.java +++ b/gcloud-java-translate/src/main/java/com/google/cloud/translate/TranslateImpl.java @@ -22,6 +22,7 @@ import com.google.api.services.translate.model.DetectionsResourceItems; import com.google.api.services.translate.model.LanguagesResource; +import com.google.api.services.translate.model.TranslationsResource; import com.google.cloud.BaseService; import com.google.cloud.RetryHelper.RetryHelperException; import com.google.cloud.translate.spi.TranslateRpc; @@ -102,6 +103,26 @@ public Detection detect(String text) { return detect(Collections.singletonList(text)).get(0); } + @Override + public List translate(final List texts, final TranslateOption... options) { + try { + return Lists.transform(runWithRetries(new Callable>() { + @Override + public List call() { + return translateRpc.translate(texts, optionMap(options)); + } + }, options().retryParams(), EXCEPTION_HANDLER, options().clock()), + Translation.FROM_PB_FUNCTION); + } catch (RetryHelperException e) { + throw TranslateException.translateAndThrow(e); + } + } + + @Override + public Translation translate(String text, TranslateOption... options) { + return translate(Collections.singletonList(text), options).get(0); + } + private Map optionMap(Option... options) { Map optionMap = Maps.newEnumMap(TranslateRpc.Option.class); for (Option option : options) { diff --git a/gcloud-java-translate/src/main/java/com/google/cloud/translate/TranslateOptions.java b/gcloud-java-translate/src/main/java/com/google/cloud/translate/TranslateOptions.java index 42d6e200b823..12973b360b92 100644 --- a/gcloud-java-translate/src/main/java/com/google/cloud/translate/TranslateOptions.java +++ b/gcloud-java-translate/src/main/java/com/google/cloud/translate/TranslateOptions.java @@ -20,11 +20,13 @@ import com.google.cloud.AuthCredentials; import com.google.cloud.HttpServiceOptions; +import com.google.cloud.translate.Translate.TranslateOption; import com.google.cloud.translate.spi.DefaultTranslateRpc; import com.google.cloud.translate.spi.TranslateRpc; import com.google.cloud.translate.spi.TranslateRpcFactory; import com.google.common.collect.ImmutableSet; +import java.util.List; import java.util.Locale; import java.util.Set; @@ -96,6 +98,10 @@ public Builder authCredentials(AuthCredentials authCredentials) { /** * Sets the code for the default target language. If not set, english ({@code en}) is used. + * {@link Translate#translate(List, TranslateOption...)} and + * {@link Translate#translate(String, TranslateOption...)} calls will use this + * value unless a {@link TranslateOption#targetLanguage(String)} option is explicitly + * provided. * * @return the builder */ diff --git a/gcloud-java-translate/src/test/java/com/google/cloud/translate/TranslateImplTest.java b/gcloud-java-translate/src/test/java/com/google/cloud/translate/TranslateImplTest.java index 24b56a5bb0cb..92f0f3cfad50 100644 --- a/gcloud-java-translate/src/test/java/com/google/cloud/translate/TranslateImplTest.java +++ b/gcloud-java-translate/src/test/java/com/google/cloud/translate/TranslateImplTest.java @@ -21,8 +21,10 @@ import com.google.api.services.translate.model.DetectionsResourceItems; import com.google.api.services.translate.model.LanguagesResource; +import com.google.api.services.translate.model.TranslationsResource; import com.google.cloud.RetryParams; import com.google.cloud.translate.Translate.LanguageListOption; +import com.google.cloud.translate.Translate.TranslateOption; import com.google.cloud.translate.spi.TranslateRpc; import com.google.cloud.translate.spi.TranslateRpcFactory; import com.google.common.collect.ImmutableList; @@ -63,6 +65,12 @@ public class TranslateImplTest { new DetectionsResourceItems().setLanguage("en").setConfidence(0.8F); private static final Detection DETECTION1 = Detection.fromPb(DETECTION1_PB); private static final Detection DETECTION2 = Detection.fromPb(DETECTION2_PB); + private static final TranslationsResource TRANSLATION1_PB = + new TranslationsResource().setTranslatedText("Hello World!").setDetectedSourceLanguage("es"); + private static final TranslationsResource TRANSLATION2_PB = + new TranslationsResource().setTranslatedText("Hello World!").setDetectedSourceLanguage("de"); + private static final Translation TRANSLATION1 = Translation.fromPb(TRANSLATION1_PB); + private static final Translation TRANSLATION2 = Translation.fromPb(TRANSLATION2_PB); // Empty TranslateRpc options private static final Map EMPTY_RPC_OPTIONS = ImmutableMap.of(); @@ -73,6 +81,15 @@ public class TranslateImplTest { private static final Map LANGUAGE_LIST_OPTIONS = ImmutableMap.of( TranslateRpc.Option.TARGET_LANGUAGE, LANGUAGE_LIST_OPTION.value()); + // Translate options + private static final TranslateOption TARGET_LANGUAGE_OPTION = + TranslateOption.targetLanguage("en"); + private static final TranslateOption SOURCE_LANGUAGE_OPTION = + TranslateOption.sourceLanguage("de"); + private static final Map TRANSLATE_OPTIONS = ImmutableMap.of( + TranslateRpc.Option.TARGET_LANGUAGE, TARGET_LANGUAGE_OPTION.value(), + TranslateRpc.Option.SOURCE_LANGUAGE, SOURCE_LANGUAGE_OPTION.value()); + private TranslateOptions options; private TranslateRpcFactory rpcFactoryMock; private TranslateRpc translateRpcMock; @@ -249,6 +266,51 @@ public void testDetectVarargNoDetection() { translate.detect(text1, text2); } + @Test + public void testTranslate() { + String text = "¡Hola Mundo!"; + EasyMock.expect(translateRpcMock.translate(ImmutableList.of(text), EMPTY_RPC_OPTIONS)) + .andReturn(ImmutableList.of(TRANSLATION1_PB)); + EasyMock.replay(translateRpcMock); + initializeService(); + assertEquals(TRANSLATION1, translate.translate(text)); + } + + @Test + public void testTranslateWithOptions() { + String text = "Hallo Welt!"; + EasyMock.expect(translateRpcMock.translate(ImmutableList.of(text), TRANSLATE_OPTIONS)) + .andReturn(ImmutableList.of(TRANSLATION2_PB)); + EasyMock.replay(translateRpcMock); + initializeService(); + assertEquals(TRANSLATION2, + translate.translate(text, TARGET_LANGUAGE_OPTION, SOURCE_LANGUAGE_OPTION)); + } + + @Test + public void testTranslateList() { + String text1 = "¡Hola Mundo!"; + String text2 = "Hallo Welt!"; + List texts = ImmutableList.of(text1, text2); + EasyMock.expect(translateRpcMock.translate(texts, EMPTY_RPC_OPTIONS)) + .andReturn(ImmutableList.of(TRANSLATION1_PB, TRANSLATION2_PB)); + EasyMock.replay(translateRpcMock); + initializeService(); + assertEquals(ImmutableList.of(TRANSLATION1, TRANSLATION2), translate.translate(texts)); + } + + @Test + public void testTranslateListWithOptions() { + String text = "Hallo Welt!"; + List texts = ImmutableList.of(text); + EasyMock.expect(translateRpcMock.translate(texts, TRANSLATE_OPTIONS)) + .andReturn(ImmutableList.of(TRANSLATION2_PB)); + EasyMock.replay(translateRpcMock); + initializeService(); + assertEquals(ImmutableList.of(TRANSLATION2), + translate.translate(texts, TARGET_LANGUAGE_OPTION, SOURCE_LANGUAGE_OPTION)); + } + @Test public void testRetryableException() { EasyMock.expect(translateRpcMock.listSupportedLanguages(EMPTY_RPC_OPTIONS))