From ec1ee038764546cf25c194d6130877f245bd43dd Mon Sep 17 00:00:00 2001 From: Kyle Corry Date: Mon, 22 Jan 2024 16:34:11 -0500 Subject: [PATCH] Fix translation format string --- app/src/main/res/values-uk/strings.xml | 2 +- scripts/string-fixer.py | 32 ++++++++++++++++++++++---- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index c1fdcb78f..767da9a1a 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -1122,7 +1122,7 @@ Відновити Сповіщення (%s) Сповіщення про захід сонця можуть бути неточними під час подорожі - Це дозволяє %1$ встановлювати точні будильники та нагадування, наприклад, про захід сонця. Без цього будильники можуть не спрацьовувати в потрібний час. + Це дозволяє %1$s встановлювати точні будильники та нагадування, наприклад, про захід сонця. Без цього будильники можуть не спрацьовувати в потрібний час. \n \nЩоб дозволити, натисніть \"%2$s\" і увімкніть налаштування для дозволу будильників і нагадувань. Будильники та нагадування заборонено, сповіщення можуть бути неточними. diff --git a/scripts/string-fixer.py b/scripts/string-fixer.py index d6fd20e1b..28deb3003 100644 --- a/scripts/string-fixer.py +++ b/scripts/string-fixer.py @@ -126,11 +126,23 @@ def check(self, source_tree, tree, element) -> bool: source_element = get_string_element(source_tree, element.get('name')) if source_element is None: return False - # Count % signs in the reference string - reference_count = source_element.text.count('%') - # Count % signs in the string - string_count = element.text.count('%') - return string_count != reference_count + + # Get the format arguments from the source string + source_format_args = self.__get_format_args(source_element.text) + + # Get the format arguments from the string + format_args = self.__get_format_args(element.text) + + # If the number of format arguments does not match, return true + if len(source_format_args) != len(format_args): + return True + + # If the format arguments do not match, return true + for i in range(len(source_format_args)): + if source_format_args[i] != format_args[i]: + return True + + return False def fix(self, source_tree, tree, element) -> bool: delete_element(tree, element) @@ -139,6 +151,16 @@ def fix(self, source_tree, tree, element) -> bool: def is_warning(self) -> bool: return False + def __get_format_args(self, text): + # Avoid counting %% as a format argument + t = text.replace('%%', '') + + # Get the format arguments from the source string (ex. %s, %d, %1$s, %0.2f) but %% is ignored + r = r'%[^a-zA-Z]*[a-zA-Z]' + + # Find all matches + return re.findall(r, t) + class PositionalFormattingUnspecified(StringDiagnostic): def check(self, source_tree, tree, element) -> bool: # Regex to get all format arguments without a positional index