gitlab-org--gitlab-foss/rubocop/cop/ruby_interpolation_in_translation.rb
Bob Van Landuyt 08c0a1b852 Reject ruby interpolation in externalized strings
When using ruby interpolation in externalized strings, they can't be
detected. Which means they will never be presented to be translated.

To mix variables into translations we need to use `sprintf`
instead.

Instead of:

    _("Hello #{subject}")

Use:

    _("Hello %{subject}) % { subject: 'world' }
2018-08-25 18:43:21 +02:00

29 lines
888 B
Ruby

# frozen_string_literal: true
module RuboCop
module Cop
class RubyInterpolationInTranslation < RuboCop::Cop::Cop
MSG = "Don't use ruby interpolation \#{} inside translated strings, instead use \%{}"
TRANSLATION_METHODS = ':_ :s_ :N_ :n_'
RUBY_INTERPOLATION_REGEX = /.*\#\{.*\}/
def_node_matcher :translation_method?, <<~PATTERN
(send nil? {#{TRANSLATION_METHODS}} $dstr ...)
PATTERN
def_node_matcher :plural_translation_method?, <<~PATTERN
(send nil? :n_ str $dstr ...)
PATTERN
def on_send(node)
interpolation = translation_method?(node) || plural_translation_method?(node)
return unless interpolation
interpolation.descendants.each do |possible_violation|
add_offense(possible_violation, message: MSG) if possible_violation.type != :str
end
end
end
end
end