From 75dba78bb597fc3d2534c5933d78f2dbcf30fea1 Mon Sep 17 00:00:00 2001 From: Yevheniy Oliynyk Date: Tue, 7 Jan 2025 19:15:57 +0100 Subject: [PATCH 1/2] feat: option to skip special chars escape --- README.md | 9 +++++++++ .../client/config/CrowdinPropertiesLoader.java | 3 +++ .../java/com/crowdin/client/config/FileBean.java | 14 ++++++++++++-- src/main/java/com/crowdin/logic/SourceLogic.java | 14 ++++++-------- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index cbf90df..5073eaf 100644 --- a/README.md +++ b/README.md @@ -173,6 +173,15 @@ files: cleanup_mode: true ``` +It's also possible to disable escaping special characters (`=`, `:`, `!` and `#`): + +```yml +files: + - source: "**/values/strings.xml" + translation: "/values-%two_letters_code%/%original_file_name%" + escape_special_characters: false +``` + ##### Translations upload options The following properties can be used to configure the import options for uploaded translations: diff --git a/src/main/java/com/crowdin/client/config/CrowdinPropertiesLoader.java b/src/main/java/com/crowdin/client/config/CrowdinPropertiesLoader.java index 57ef2aa..447a294 100644 --- a/src/main/java/com/crowdin/client/config/CrowdinPropertiesLoader.java +++ b/src/main/java/com/crowdin/client/config/CrowdinPropertiesLoader.java @@ -37,6 +37,7 @@ public class CrowdinPropertiesLoader { private static final String PROPERTY_FILES_CLEANUP_MODE = "cleanup_mode"; private static final String PROPERTY_FILES_UPDATE_STRINGS = "update_strings"; private static final String PROPERTY_EXCLUDED_TARGET_LANGUAGES = "excluded_target_languages"; + private static final String PROPERTY_ESCAPE_SPECIAL_CHARACTERS = "escape_special_characters"; private static final Pattern BASE_URL_PATTERN = Pattern.compile("^(https://([a-zA-Z0-9_-]+\\.(api\\.)?)?crowdin\\.com/?|http://(.+)\\.dev\\.crowdin\\.com/?)$"); @@ -182,6 +183,7 @@ private static List getSourcesWithTranslations(Map pro String translation = getStringProperty(file, PROPERTY_FILES_TRANSLATION); Boolean updateStrings = getBooleanProperty(file, PROPERTY_FILES_UPDATE_STRINGS); Boolean cleanupMode = getBooleanProperty(file, PROPERTY_FILES_CLEANUP_MODE); + Boolean escapeSpecialCharacters = getBooleanProperty(file, PROPERTY_ESCAPE_SPECIAL_CHARACTERS); List labels = getListStringsProperty(file, PROPERTY_LABELS); List excludedTargetLanguages = getListStringsProperty(file, PROPERTY_EXCLUDED_TARGET_LANGUAGES); @@ -193,6 +195,7 @@ private static List getSourcesWithTranslations(Map pro fb.setExcludedTargetLanguages(excludedTargetLanguages); fb.setUpdateStrings(updateStrings); fb.setCleanupMode(cleanupMode); + fb.setEscapeSpecialCharacters(escapeSpecialCharacters); fileBeans.add(fb); } else if (StringUtils.isEmpty(source)) { errors.add(String.format(MESSAGES_BUNDLE.getString("errors.config.missing_property"), PROPERTY_FILES_SOURCE)); diff --git a/src/main/java/com/crowdin/client/config/FileBean.java b/src/main/java/com/crowdin/client/config/FileBean.java index cb6a21c..d71ee84 100644 --- a/src/main/java/com/crowdin/client/config/FileBean.java +++ b/src/main/java/com/crowdin/client/config/FileBean.java @@ -11,6 +11,7 @@ public class FileBean { private List labels; private Boolean cleanupMode; private Boolean updateStrings; + private Boolean escapeSpecialCharacters; public String getSource() { return source; @@ -60,17 +61,25 @@ public void setUpdateStrings(Boolean updateStrings) { this.updateStrings = updateStrings; } + public Boolean getEscapeSpecialCharacters() { + return escapeSpecialCharacters; + } + + public void setEscapeSpecialCharacters(Boolean escapeSpecialCharacters) { + this.escapeSpecialCharacters = escapeSpecialCharacters; + } + @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; FileBean fileBean = (FileBean) o; - return Objects.equals(source, fileBean.source) && Objects.equals(translation, fileBean.translation) && Objects.equals(excludedTargetLanguages, fileBean.excludedTargetLanguages) && Objects.equals(labels, fileBean.labels) && Objects.equals(cleanupMode, fileBean.cleanupMode) && Objects.equals(updateStrings, fileBean.updateStrings); + return Objects.equals(source, fileBean.source) && Objects.equals(translation, fileBean.translation) && Objects.equals(excludedTargetLanguages, fileBean.excludedTargetLanguages) && Objects.equals(labels, fileBean.labels) && Objects.equals(cleanupMode, fileBean.cleanupMode) && Objects.equals(updateStrings, fileBean.updateStrings) && Objects.equals(escapeSpecialCharacters, fileBean.escapeSpecialCharacters); } @Override public int hashCode() { - return Objects.hash(source, translation, excludedTargetLanguages, labels, cleanupMode, updateStrings); + return Objects.hash(source, translation, excludedTargetLanguages, labels, cleanupMode, updateStrings, escapeSpecialCharacters); } @Override @@ -82,6 +91,7 @@ public String toString() { ", labels=" + labels + ", cleanupMode=" + cleanupMode + ", updateStrings=" + updateStrings + + ", escapeSpecialCharacters=" + escapeSpecialCharacters + '}'; } } diff --git a/src/main/java/com/crowdin/logic/SourceLogic.java b/src/main/java/com/crowdin/logic/SourceLogic.java index 61714a2..ff8f391 100644 --- a/src/main/java/com/crowdin/logic/SourceLogic.java +++ b/src/main/java/com/crowdin/logic/SourceLogic.java @@ -6,13 +6,7 @@ import com.crowdin.client.core.model.PatchRequest; import com.crowdin.client.labels.model.Label; import com.crowdin.client.languages.model.Language; -import com.crowdin.client.sourcefiles.model.AddDirectoryRequest; -import com.crowdin.client.sourcefiles.model.AddFileRequest; -import com.crowdin.client.sourcefiles.model.Branch; -import com.crowdin.client.sourcefiles.model.Directory; -import com.crowdin.client.sourcefiles.model.FileInfo; -import com.crowdin.client.sourcefiles.model.GeneralFileExportOptions; -import com.crowdin.client.sourcefiles.model.UpdateFileRequest; +import com.crowdin.client.sourcefiles.model.*; import com.crowdin.client.sourcestrings.model.UploadStringsProgress; import com.crowdin.client.sourcestrings.model.UploadStringsRequest; import com.crowdin.service.CrowdinProjectCacheProvider; @@ -102,7 +96,7 @@ public void uploadSource(VirtualFile source, FileBean fileBean, boolean preserve try { VirtualFile pathToPattern = FileUtil.getBaseDir(source, fileBean.getSource()); - GeneralFileExportOptions exportOptions = new GeneralFileExportOptions(); + PropertyFileExportOptions exportOptions = new PropertyFileExportOptions(); String path; String parentPath; @@ -120,6 +114,10 @@ public void uploadSource(VirtualFile source, FileBean fileBean, boolean preserve exportOptions.setExportPattern(sepAtStart(fileBean.getTranslation())); } + if (fileBean.getEscapeSpecialCharacters() != null) { + exportOptions.setEscapeSpecialCharacters(fileBean.getEscapeSpecialCharacters() ? 1 : 0); + } + String outputName = FileUtil.noSepAtStart(path); FileInfo foundFile = filePaths.get(path); if (foundFile != null) { From a58e3ddd49138a0c0df586ab0e36c1125fc4908f Mon Sep 17 00:00:00 2001 From: Yevheniy Oliynyk Date: Wed, 15 Jan 2025 14:20:33 +0100 Subject: [PATCH 2/2] fix type --- README.md | 2 +- .../com/crowdin/client/config/CrowdinPropertiesLoader.java | 6 +++++- src/main/java/com/crowdin/client/config/FileBean.java | 6 +++--- src/main/java/com/crowdin/logic/SourceLogic.java | 2 +- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 5073eaf..f1a111f 100644 --- a/README.md +++ b/README.md @@ -179,7 +179,7 @@ It's also possible to disable escaping special characters (`=`, `:`, `!` and `#` files: - source: "**/values/strings.xml" translation: "/values-%two_letters_code%/%original_file_name%" - escape_special_characters: false + escape_special_characters: 0 ``` ##### Translations upload options diff --git a/src/main/java/com/crowdin/client/config/CrowdinPropertiesLoader.java b/src/main/java/com/crowdin/client/config/CrowdinPropertiesLoader.java index 447a294..3438dcd 100644 --- a/src/main/java/com/crowdin/client/config/CrowdinPropertiesLoader.java +++ b/src/main/java/com/crowdin/client/config/CrowdinPropertiesLoader.java @@ -183,7 +183,7 @@ private static List getSourcesWithTranslations(Map pro String translation = getStringProperty(file, PROPERTY_FILES_TRANSLATION); Boolean updateStrings = getBooleanProperty(file, PROPERTY_FILES_UPDATE_STRINGS); Boolean cleanupMode = getBooleanProperty(file, PROPERTY_FILES_CLEANUP_MODE); - Boolean escapeSpecialCharacters = getBooleanProperty(file, PROPERTY_ESCAPE_SPECIAL_CHARACTERS); + Integer escapeSpecialCharacters = getIntegerProperty(file, PROPERTY_ESCAPE_SPECIAL_CHARACTERS); List labels = getListStringsProperty(file, PROPERTY_LABELS); List excludedTargetLanguages = getListStringsProperty(file, PROPERTY_EXCLUDED_TARGET_LANGUAGES); @@ -212,6 +212,10 @@ private static String getStringProperty(Map map, String property return getProperty(map, property, String.class); } + private static Integer getIntegerProperty(Map map, String property) { + return getProperty(map, property, Integer.class); + } + private static List getListStringsProperty(Map map, String property) { List list = getProperty(map, property, List.class); if (list == null) { diff --git a/src/main/java/com/crowdin/client/config/FileBean.java b/src/main/java/com/crowdin/client/config/FileBean.java index d71ee84..85e6524 100644 --- a/src/main/java/com/crowdin/client/config/FileBean.java +++ b/src/main/java/com/crowdin/client/config/FileBean.java @@ -11,7 +11,7 @@ public class FileBean { private List labels; private Boolean cleanupMode; private Boolean updateStrings; - private Boolean escapeSpecialCharacters; + private Integer escapeSpecialCharacters; public String getSource() { return source; @@ -61,11 +61,11 @@ public void setUpdateStrings(Boolean updateStrings) { this.updateStrings = updateStrings; } - public Boolean getEscapeSpecialCharacters() { + public Integer getEscapeSpecialCharacters() { return escapeSpecialCharacters; } - public void setEscapeSpecialCharacters(Boolean escapeSpecialCharacters) { + public void setEscapeSpecialCharacters(Integer escapeSpecialCharacters) { this.escapeSpecialCharacters = escapeSpecialCharacters; } diff --git a/src/main/java/com/crowdin/logic/SourceLogic.java b/src/main/java/com/crowdin/logic/SourceLogic.java index ff8f391..432e5bc 100644 --- a/src/main/java/com/crowdin/logic/SourceLogic.java +++ b/src/main/java/com/crowdin/logic/SourceLogic.java @@ -115,7 +115,7 @@ public void uploadSource(VirtualFile source, FileBean fileBean, boolean preserve } if (fileBean.getEscapeSpecialCharacters() != null) { - exportOptions.setEscapeSpecialCharacters(fileBean.getEscapeSpecialCharacters() ? 1 : 0); + exportOptions.setEscapeSpecialCharacters(fileBean.getEscapeSpecialCharacters()); } String outputName = FileUtil.noSepAtStart(path);