Skip to content

Commit

Permalink
feat(FgForrest#3): add google translator
Browse files Browse the repository at this point in the history
  • Loading branch information
Stepan Kamenik committed Mar 8, 2024
1 parent e2b495d commit a02b87c
Show file tree
Hide file tree
Showing 7 changed files with 83 additions and 29 deletions.
18 changes: 18 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,25 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>libraries-bom</artifactId>
<version>4.3.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>

<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-translate</artifactId>
</dependency>

<dependency>
<groupId>com.deepl.api</groupId>
<artifactId>deepl-java</artifactId>
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/one/edee/babylon/MainService.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public MainService(Exporter exporter,
this.importProcessor = importProcessor;
}

public void startTranslation(Action action, TranslationConfiguration configuration, String spreadsheetId, boolean combineSheets, String deeplApiKey) throws IOException, GeneralSecurityException, InterruptedException {
public void startTranslation(Action action, TranslationConfiguration configuration, String spreadsheetId, boolean combineSheets, String translatorApiKey) throws IOException, GeneralSecurityException, InterruptedException {
long stTime = System.currentTimeMillis();
switch (action) {
case EXPORT:
Expand All @@ -41,7 +41,7 @@ public void startTranslation(Action action, TranslationConfiguration configurati
configuration.getSnapshotPath(),
configuration.getLockedCellEditors(),
combineSheets,
deeplApiKey,
translatorApiKey,
configuration.getDefaultLang());
break;
case IMPORT:
Expand Down
10 changes: 5 additions & 5 deletions src/main/java/one/edee/babylon/SpringBootConsoleApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public void run(String... args) {
try {
log.info("Loading config file: '" + arguments.getConfigFileName() + "'");
TranslationConfiguration configuration = configurationReader.readAndCheckConfiguration(arguments.getConfigFileName());
mainService.startTranslation(arguments.getAction(), configuration, arguments.getGoogleSheetId(), arguments.isCombineSheets(), arguments.getDeeplApiKey());
mainService.startTranslation(arguments.getAction(), configuration, arguments.getGoogleSheetId(), arguments.isCombineSheets(), arguments.getTranslatorApiKey());
} catch (Exception e) {
log.error("BABYLON ERROR: ", e);
System.exit(-1);
Expand Down Expand Up @@ -75,7 +75,7 @@ public static Arguments parseArguments(String... args) {
arguments.setConfigFileName(args[1]);
arguments.setGoogleSheetId(args[2]);
if (args.length > 3){
arguments.setDeeplApiKey(args[3]);
arguments.setTranslatorApiKey(args[3]);
if (args.length > 4){
arguments.setCombineSheets(Boolean.parseBoolean(args[4]));
}
Expand All @@ -87,7 +87,7 @@ private static void printRequiredArguments() {
log.info("1 - expected action (import, export)");
log.info("2 - path to translator-config.json file");
log.info("3 - ID of the google sheet (e.g. 1xhnBAOpy8-9KWhl8NP0ZIy6mhlgXKnKcLJwKcIeyjPc)");
log.info("4 - arg to specify deepl api key");
log.info("4 - arg to specify translator api key");
log.info("5 - arg to specify combineSheets mode");
}

Expand Down Expand Up @@ -120,9 +120,9 @@ public static class Arguments {
private boolean combineSheets = false;

/**
* Deepl api key.
* Translator api key (Google/Deepl).
*/
private String deeplApiKey;
private String translatorApiKey;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,12 @@ public class TranslationConfiguration implements Serializable {
@NonNull
private String defaultLang;

/**
* Default language of project properties.
*/
@NonNull
private String translatorApiKey;

@JsonIgnore
public Path getSnapshotPath() {
return Paths.get(dataFileName);
Expand Down
55 changes: 42 additions & 13 deletions src/main/java/one/edee/babylon/export/Exporter.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package one.edee.babylon.export;

import com.deepl.api.TextResult;
import com.deepl.api.DeepLException;
import com.deepl.api.Translator;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.cloud.translate.Translate;
import com.google.cloud.translate.TranslateOptions;
import lombok.extern.apachecommons.CommonsLog;
import one.edee.babylon.db.SnapshotUtils;
import one.edee.babylon.export.dto.ExportResult;
Expand All @@ -11,6 +14,7 @@
import one.edee.babylon.snapshot.TranslationSnapshotWriteContract;
import one.edee.babylon.util.AntPathResourceLoader;
import one.edee.babylon.util.PathUtils;
import org.jetbrains.annotations.NotNull;
import org.springframework.util.StringUtils;

import java.io.File;
Expand All @@ -21,6 +25,9 @@
import java.util.function.Function;
import java.util.stream.Collectors;

import static com.google.cloud.translate.Translate.TranslateOption.sourceLanguage;
import static com.google.cloud.translate.Translate.TranslateOption.targetLanguage;

/**
* Performs the export phase that generates translation sheets.
*/
Expand Down Expand Up @@ -56,8 +63,8 @@ public void walkPathsAndWriteSheets(List<String> patternPaths,
String spreadsheetId,
Path snapshotPath,
boolean combineSheets,
String deeplApiKey) {
walkPathsAndWriteSheets(patternPaths, translationLangs, spreadsheetId, snapshotPath, Collections.emptyList(), combineSheets, deeplApiKey, null);
String translatorApiKey) {
walkPathsAndWriteSheets(patternPaths, translationLangs, spreadsheetId, snapshotPath, Collections.emptyList(), combineSheets, translatorApiKey, null);
}

/**
Expand All @@ -68,15 +75,15 @@ public void walkPathsAndWriteSheets(List<String> patternPaths,
* @param spreadsheetId id of GSheets spreadsheet, must be empty
* @param snapshotPath path to the translation snapshot file
* @param lockedCellEditors list of Google account emails, these account will have the permission to edit locked cells
* @param deeplApiKey
* @param translatorApiKey
*/
public void walkPathsAndWriteSheets(List<String> patternPaths,
List<String> translationLangs,
String spreadsheetId,
Path snapshotPath,
List<String> lockedCellEditors,
boolean combineSheets,
String deeplApiKey,
String translatorApiKey,
String defaultLang) {
warnDuplicatePaths(patternPaths);

Expand Down Expand Up @@ -109,11 +116,25 @@ public void walkPathsAndWriteSheets(List<String> patternPaths,
original.add(new TranslationSheet(COMBINING_SHEET_NAME,combine));
}

Map<String, List<String>> changed = translateTextsByExternalTool(translatorApiKey, defaultLang, result);

uploadTranslations(result, spreadsheetId, lockedCellEditors, changed);

updateSnapshotAndWriteToDisk(this.snapshot, result, snapshotPath);

List<Integer> prevSheetIds = prevSheets.stream().map(ASheet::getId).collect(Collectors.toList());
deleteOldSheets(prevSheetIds, spreadsheetId);
}

@NotNull
private static Map<String, List<String>> translateTextsByExternalTool(String translatorApiKey, String defaultLang, ExportResult result) {
Map<String, List<String>> changed = new HashMap<>();

if (deeplApiKey != null) {
if (translatorApiKey != null) {
try {
Translator translator = new Translator(deeplApiKey);
// Translator translator = new Translator(translatorApiKey);
//noinspection deprecation
Translate translate = TranslateOptions.newBuilder().setApiKey(translatorApiKey).build().getService();
for (TranslationSheet sheet : result.getSheets()) {
log.info("Translating sheet " + sheet.getSheetName());

Expand All @@ -136,8 +157,8 @@ public void walkPathsAndWriteSheets(List<String> patternPaths,
}

if (StringUtils.hasText(original)) {
TextResult translatedText = translator.translateText(original, defaultLang, lang);
toChange.put(l, translatedText.getText());
String translatedText = getTranslatedTextByGoogle(defaultLang, translate, original, lang);
toChange.put(l, translatedText);

changed
.computeIfAbsent(sheet.getSheetName(), key -> new LinkedList<>())
Expand All @@ -157,15 +178,23 @@ public void walkPathsAndWriteSheets(List<String> patternPaths,
log.error(e.getMessage(), e);
}
}
return changed;
}

uploadTranslations(result, spreadsheetId, lockedCellEditors, changed);
private static String getTranslatedTextByDeepl(String defaultLang, Translator translator, String original, String lang) throws DeepLException, InterruptedException {
return translator.translateText(original, defaultLang, lang).getText();
}

updateSnapshotAndWriteToDisk(this.snapshot, result, snapshotPath);
private static String getTranslatedTextByGoogle(String defaultLang, Translate translate, String original, String lang) {

List<Integer> prevSheetIds = prevSheets.stream().map(ASheet::getId).collect(Collectors.toList());
deleteOldSheets(prevSheetIds, spreadsheetId);
return translate.translate(
original,
sourceLanguage(defaultLang),
targetLanguage(lang))
.getTranslatedText();
}


private void warnDuplicatePaths(List<String> patternPaths) {
List<String> duplicatePaths = detectDuplicatePatternPaths(patternPaths);
if (!duplicatePaths.isEmpty()) {
Expand Down
10 changes: 5 additions & 5 deletions src/main/java/one/edee/babylon/maven/BabylonExpImpBaseMojo.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public abstract class BabylonExpImpBaseMojo extends AbstractMojo {
public static final String CONFIG_FILE_PARAM = "config.file";
public static final String GOOGLE_SHEET_ID_PARAM = "google.sheet.id";
public static final String COMBINE_SHEET_PARAM = "combine.sheets";
public static final String DEEPL_API_KEY_PARAM = "deepl.api.key";
public static final String TRANSLATOR_API_KEY_PARAM = "translator.api.key";

/**
* File name and relative path to the Json configuration file.
Expand All @@ -35,10 +35,10 @@ public abstract class BabylonExpImpBaseMojo extends AbstractMojo {
private Boolean combineSheets;

/**
* Deepl api key.
* Translator api key (Google/Deepl).
*/
@Parameter(property = DEEPL_API_KEY_PARAM)
private String deeplApiKey;
@Parameter(property = TRANSLATOR_API_KEY_PARAM)
private String translatorApiKey;

@Override
public void execute() {
Expand All @@ -50,7 +50,7 @@ private String[] getArguments() {
arg[0] = getAction().name();
arg[1] = this.configFileName;
arg[2] = this.googleSheetId;
arg[3] = this.deeplApiKey;
arg[3] = this.translatorApiKey;
arg[4] = String.valueOf(this.combineSheets);

return arg;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
*/
public class TsFileActiveRecord extends FileActiveRecord {

private static final String DEFAULT_LANG_DEF_IMPORT = "import type { LangDef } from '@edeeone/i18n/LangDef';";
private static final String DEFAULT_LANG_DEF_IMPORT = "import type { LangDef } from '@edeeone/juan-core/i18n/LangDef';";

/**
* Loads properties from file by specified reader.
Expand Down Expand Up @@ -75,7 +75,8 @@ public void save(Writer writer, String primaryPropFilePath, String mutation) thr
}

bufferedWriter.newLine();
bufferedWriter.write("const " + propertyListDefName + firstLetterToUppercase(mutation) + " : LangDef<typeof " + propertyListDefName + "> = {");
String finalLocalizationName = firstLetterToUppercase(mutation);
bufferedWriter.write("const " + propertyListDefName + finalLocalizationName + ": LangDef<typeof " + propertyListDefName + "> = {");
bufferedWriter.newLine();

synchronized (this) {
Expand All @@ -84,14 +85,14 @@ public void save(Writer writer, String primaryPropFilePath, String mutation) thr
AbstractProperty value = entry.getValue();
String keyDelimiter = key.matches("\\[.*]") ? "" : "'";

bufferedWriter.write(" " + keyDelimiter + key + keyDelimiter +": "+ value.getQuotedValue() + ",");
bufferedWriter.write(" " + keyDelimiter + key + keyDelimiter +": "+ value.getQuotedValue() + ",");
bufferedWriter.newLine();
}
}

bufferedWriter.write("};");
bufferedWriter.newLine();
bufferedWriter.write("export default "+baseName+";");
bufferedWriter.write("export default "+finalLocalizationName+";");

bufferedWriter.flush();
}
Expand Down

0 comments on commit a02b87c

Please sign in to comment.