From 9d074fe0519652cd052b810380f36674f21f2b12 Mon Sep 17 00:00:00 2001 From: Cryosleeper Date: Thu, 1 Mar 2018 08:20:41 +0200 Subject: [PATCH 1/2] Proposition for defaulting on empty values --- README.md | 1 + .../localization/ConfigExtension.groovy | 1 + .../gradle/localization/ParserEngine.groovy | 2 ++ .../gradle/localization/ParseXLSXTest.groovy | 33 ++++++++++++++++++ .../values-pl/main_with_defaults.xml | 8 +++++ .../values/main_with_defaults.xml | 16 +++++++++ .../localization/valid_with_defaults.xlsx | Bin 0 -> 6620 bytes 7 files changed, 61 insertions(+) create mode 100644 src/test/resources/pl/droidsonroids/gradle/localization/parsed_valid_xlsx/values-pl/main_with_defaults.xml create mode 100644 src/test/resources/pl/droidsonroids/gradle/localization/parsed_valid_xlsx/values/main_with_defaults.xml create mode 100644 src/test/resources/pl/droidsonroids/gradle/localization/valid_with_defaults.xlsx diff --git a/README.md b/README.md index 0d6d4a0..bf87441 100644 --- a/README.md +++ b/README.md @@ -160,6 +160,7 @@ contain column names eg. `['Section', 'Notes']` * `allowNonTranslatableTranslation` - default=`false`, if set to true resources marked non-translatable but translated are permitted * `allowEmptyTranslations` - default=`false`, if set to true then empty values are permitted +* `handleEmptyTranslationsAsDefault` - default=`false`, if set to true empty values do not result in entries in non-default languages, i.e. no empty XML entries for non-default languages being created. If set to `true` then `allowEmptyTranslations` is ignored for all but default language * `outputFileName` - default=`strings.xml`, XML file name (with extension) which should be generated as an output * `outputIndent` - default=` `(two spaces), character(s) used to indent each line in output XML files * `skipInvalidName` - default=`false`, if set to true then rows with invalid key names will be ignored instead diff --git a/src/main/groovy/pl/droidsonroids/gradle/localization/ConfigExtension.groovy b/src/main/groovy/pl/droidsonroids/gradle/localization/ConfigExtension.groovy index 5142bf0..f71538d 100644 --- a/src/main/groovy/pl/droidsonroids/gradle/localization/ConfigExtension.groovy +++ b/src/main/groovy/pl/droidsonroids/gradle/localization/ConfigExtension.groovy @@ -9,6 +9,7 @@ import java.text.Normalizer * @author koral-- */ class ConfigExtension { + boolean handleEmptyTranslationsAsDefault = false; boolean allowNonTranslatableTranslation = false boolean allowEmptyTranslations = false boolean escapeApostrophes = true diff --git a/src/main/groovy/pl/droidsonroids/gradle/localization/ParserEngine.groovy b/src/main/groovy/pl/droidsonroids/gradle/localization/ParserEngine.groovy index e507fe7..b9d3514 100644 --- a/src/main/groovy/pl/droidsonroids/gradle/localization/ParserEngine.groovy +++ b/src/main/groovy/pl/droidsonroids/gradle/localization/ParserEngine.groovy @@ -144,6 +144,8 @@ class ParserEngine { if (value.empty) { if (!translatable && builder.mQualifier != mConfig.defaultColumnName) continue + if (mConfig.handleEmptyTranslationsAsDefault && builder.mQualifier != mConfig.defaultColumnName) + continue if (!mConfig.allowEmptyTranslations) throw new IllegalArgumentException("$name is not translated to locale $builder.mQualifier, row #${i + 1}") } else { diff --git a/src/test/groovy/pl/droidsonroids/gradle/localization/ParseXLSXTest.groovy b/src/test/groovy/pl/droidsonroids/gradle/localization/ParseXLSXTest.groovy index fd25a44..39ae776 100644 --- a/src/test/groovy/pl/droidsonroids/gradle/localization/ParseXLSXTest.groovy +++ b/src/test/groovy/pl/droidsonroids/gradle/localization/ParseXLSXTest.groovy @@ -43,6 +43,39 @@ class ParseXLSXTest extends LocalizationPluginTestBase { } } + @Test + void testXlsxFileWithDefaults() { + def name = 'valid_with_defaults.xlsx' + + ConfigExtension config = new ConfigExtension() + config.xlsFileURI = getClass().getResource(name).toString() + config.handleEmptyTranslationsAsDefault = true + config.allowEmptyTranslations = true + config.skipInvalidName = true + config.skipDuplicatedName = true + config.defaultColumnName = 'EN' + config.nameColumnName = 'Android' + config.ignorableColumns.add('WinPhone') + config.ignorableColumns.add('iOS') + config.ignorableColumns.add('END') + config.defaultLocaleQualifier = 'en' + config.useAllSheets = true + + def resDir = parseTestFile(config) + + resDir.traverse(type: FileType.FILES) { + def filePath = it.path.replace(resDir.path, '') + def expectedFileURL = getClass().getResource("parsed_valid_xlsx/$filePath") + def diff = DiffBuilder.compare(Input.fromFile(it)) + .withTest(Input.fromURL(expectedFileURL)) + .ignoreWhitespace() + .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byNameAndAllAttributes)) + .checkForSimilar() + .build() + assertThat(diff.hasDifferences()).as('file: %s is different than expected %s', filePath, diff.toString()).isFalse() + } + } + @Test void testXlsxURI() { ConfigExtension config = new ConfigExtension() diff --git a/src/test/resources/pl/droidsonroids/gradle/localization/parsed_valid_xlsx/values-pl/main_with_defaults.xml b/src/test/resources/pl/droidsonroids/gradle/localization/parsed_valid_xlsx/values-pl/main_with_defaults.xml new file mode 100644 index 0000000..58cd4e9 --- /dev/null +++ b/src/test/resources/pl/droidsonroids/gradle/localization/parsed_valid_xlsx/values-pl/main_with_defaults.xml @@ -0,0 +1,8 @@ + + + Plik + + krowy + krowa + + \ No newline at end of file diff --git a/src/test/resources/pl/droidsonroids/gradle/localization/parsed_valid_xlsx/values/main_with_defaults.xml b/src/test/resources/pl/droidsonroids/gradle/localization/parsed_valid_xlsx/values/main_with_defaults.xml new file mode 100644 index 0000000..a420292 --- /dev/null +++ b/src/test/resources/pl/droidsonroids/gradle/localization/parsed_valid_xlsx/values/main_with_defaults.xml @@ -0,0 +1,16 @@ + + + Application + File + %d %s + + + cows + cow + + + monday + tuesday + wednesday + + \ No newline at end of file diff --git a/src/test/resources/pl/droidsonroids/gradle/localization/valid_with_defaults.xlsx b/src/test/resources/pl/droidsonroids/gradle/localization/valid_with_defaults.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9247f8f56a2786c2ede4080e8c32feb65c6d52b6 GIT binary patch literal 6620 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 literal 0 HcmV?d00001 From 4add027597192cfc924850e1a6a2f2f8adf8e7ae Mon Sep 17 00:00:00 2001 From: Cryosleeper Date: Thu, 1 Mar 2018 08:30:14 +0200 Subject: [PATCH 2/2] Semicolon was removed --- .../pl/droidsonroids/gradle/localization/ConfigExtension.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/groovy/pl/droidsonroids/gradle/localization/ConfigExtension.groovy b/src/main/groovy/pl/droidsonroids/gradle/localization/ConfigExtension.groovy index f71538d..6d49195 100644 --- a/src/main/groovy/pl/droidsonroids/gradle/localization/ConfigExtension.groovy +++ b/src/main/groovy/pl/droidsonroids/gradle/localization/ConfigExtension.groovy @@ -9,7 +9,7 @@ import java.text.Normalizer * @author koral-- */ class ConfigExtension { - boolean handleEmptyTranslationsAsDefault = false; + boolean handleEmptyTranslationsAsDefault = false boolean allowNonTranslatableTranslation = false boolean allowEmptyTranslations = false boolean escapeApostrophes = true