summaryrefslogtreecommitdiff
path: root/lib/gitlab/i18n
diff options
context:
space:
mode:
authorBob Van Landuyt <bob@vanlanduyt.co>2017-08-31 20:11:22 +0200
committerBob Van Landuyt <bob@vanlanduyt.co>2017-09-01 13:44:10 +0200
commit4761235f6944d1627346ca835a192c1ed32f745e (patch)
treee1e36df4d5e374a2a861e44cf59bf92aa4c7ae8b /lib/gitlab/i18n
parent538104bdd1f8f8905e2bc514bc5f94d564e3bbef (diff)
downloadgitlab-ce-4761235f6944d1627346ca835a192c1ed32f745e.tar.gz
Validate unescaped `%` chars in PO files
Diffstat (limited to 'lib/gitlab/i18n')
-rw-r--r--lib/gitlab/i18n/po_linter.rb21
-rw-r--r--lib/gitlab/i18n/translation_entry.rb18
2 files changed, 36 insertions, 3 deletions
diff --git a/lib/gitlab/i18n/po_linter.rb b/lib/gitlab/i18n/po_linter.rb
index c3b1fe582af..2e02787a4f4 100644
--- a/lib/gitlab/i18n/po_linter.rb
+++ b/lib/gitlab/i18n/po_linter.rb
@@ -63,10 +63,25 @@ module Gitlab
validate_variables(errors, entry)
validate_newlines(errors, entry)
validate_number_of_plurals(errors, entry)
+ validate_unescaped_chars(errors, entry)
errors
end
+ def validate_unescaped_chars(errors, entry)
+ if entry.msgid_contains_unescaped_chars?
+ errors << 'contains unescaped `%`, escape it using `%%`'
+ end
+
+ if entry.plural_id_contains_unescaped_chars?
+ errors << 'plural id contains unescaped `%`, escape it using `%%`'
+ end
+
+ if entry.translations_contain_unescaped_chars?
+ errors << 'translation contains unescaped `%`, escape it using `%%`'
+ end
+ end
+
def validate_number_of_plurals(errors, entry)
return unless metadata_entry&.expected_plurals
return unless entry.translated?
@@ -79,15 +94,15 @@ module Gitlab
def validate_newlines(errors, entry)
if entry.msgid_contains_newlines?
- errors << "is defined over multiple lines, this breaks some tooling."
+ errors << 'is defined over multiple lines, this breaks some tooling.'
end
if entry.plural_id_contains_newlines?
- errors << "plural is defined over multiple lines, this breaks some tooling."
+ errors << 'plural is defined over multiple lines, this breaks some tooling.'
end
if entry.translations_contain_newlines?
- errors << "has translations defined over multiple lines, this breaks some tooling."
+ errors << 'has translations defined over multiple lines, this breaks some tooling.'
end
end
diff --git a/lib/gitlab/i18n/translation_entry.rb b/lib/gitlab/i18n/translation_entry.rb
index 8d4fec0decd..e6c95afca7e 100644
--- a/lib/gitlab/i18n/translation_entry.rb
+++ b/lib/gitlab/i18n/translation_entry.rb
@@ -1,6 +1,8 @@
module Gitlab
module I18n
class TranslationEntry
+ PERCENT_REGEX = /(?:^|[^%])%(?!{\w*}|[a-z%])/.freeze
+
attr_reader :nplurals, :entry_data
def initialize(entry_data, nplurals)
@@ -64,6 +66,22 @@ module Gitlab
all_translations.any? { |translation| translation.is_a?(Array) }
end
+ def msgid_contains_unescaped_chars?
+ contains_unescaped_chars?(msgid)
+ end
+
+ def plural_id_contains_unescaped_chars?
+ contains_unescaped_chars?(plural_id)
+ end
+
+ def translations_contain_unescaped_chars?
+ all_translations.any? { |translation| contains_unescaped_chars?(translation) }
+ end
+
+ def contains_unescaped_chars?(string)
+ string =~ PERCENT_REGEX
+ end
+
private
def translation_keys