DEV: Update `i18n:check` rake task to detect invalid Markdown links (#13728)

DEV: Update i18n:check rake task to detect invalid Markdown links (#13728)

In addition to that it fixes a problem where the check failed on empty locale files and allows calling the rake task with multiple locales.

diff --git a/lib/i18n/locale_file_checker.rb b/lib/i18n/locale_file_checker.rb
index 1f30f1a..e818823 100644
--- a/lib/i18n/locale_file_checker.rb
+++ b/lib/i18n/locale_file_checker.rb
@@ -8,6 +8,7 @@ class LocaleFileChecker
   TYPE_UNSUPPORTED_INTERPOLATION_KEYS = 2
   TYPE_MISSING_PLURAL_KEYS = 3
   TYPE_INVALID_MESSAGE_FORMAT = 4
+  TYPE_INVALID_MARKDOWN_LINK = 5
 
   def check(locale)
     @errors = {}
@@ -20,9 +21,12 @@ class LocaleFileChecker
       @locale_yaml = YAML.load_file(locale_path)
       @reference_yaml = YAML.load_file(reference_path)
 
+      next if @locale_yaml.blank? || @locale_yaml.first[1].blank?
+
       check_interpolation_keys
       check_plural_keys
       check_message_format
+      check_markdown_links
     end
 
     @errors
@@ -93,6 +97,16 @@ class LocaleFileChecker
     end
   end
 
+  def check_markdown_links
+    traverse_hash(@locale_yaml, []) do |keys, value|
+      next if value.is_a?(Array)
+
+      if /\[.*?\]\s+\(.*?\)/.match?(value)
+        add_error(keys, TYPE_INVALID_MARKDOWN_LINK, nil, pluralized: false)
+      end
+    end
+  end
+
   def check_plural_keys
     known_parent_keys = Set.new
 
diff --git a/lib/tasks/i18n.rake b/lib/tasks/i18n.rake
index 64fce0e..b35cce8 100644
--- a/lib/tasks/i18n.rake
+++ b/lib/tasks/i18n.rake
@@ -6,15 +6,19 @@ require 'seed_data/topics'
 require 'colored2'
 
 desc "Checks locale files for errors"
-task "i18n:check", [:locale] => [:environment] do |_, args|
+task "i18n:check" => [:environment] do |_, args|
   failed_locales = []
 
-  if args[:locale].present?
-    if LocaleSiteSetting.valid_value?(args[:locale])
-      locales = [args[:locale]]
-    else
-      puts "ERROR: #{locale} is not a valid locale"
-      exit 1
+  if args.extras.present?
+    locales = []
+
+    args.extras.each do |locale|
+      if LocaleSiteSetting.valid_value?(locale)
+        locales << locale
+      else
+        puts "ERROR: #{locale} is not a valid locale"
+        exit 1
+      end
     end
   else
     locales = LocaleSiteSetting.supported_locales
@@ -44,8 +48,10 @@ task "i18n:check", [:locale] => [:environment] do |_, args|
             "Missing plural keys".magenta
           when LocaleFileChecker::TYPE_INVALID_MESSAGE_FORMAT
             "Invalid message format".yellow
+          when LocaleFileChecker::TYPE_INVALID_MARKDOWN_LINK
+            "Invalid markdown links".yellow
           end
-        details = error[:details] ? ": #{error[:details]}" : ""
+        details = error[:details].present? ? ": #{error[:details]}" : ""
 
         puts error[:key] << " -- " << message << details
       end

GitHub sha: 2a95f892afbe4030c0c98a740124c212d5eb7b60

This commit appears in #13728 which was approved by CvX. It was merged by gschlager.