2018-08-16 08:15:54 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
module RuboCop
|
|
|
|
module Cop
|
2022-09-14 11:12:56 -04:00
|
|
|
class RubyInterpolationInTranslation < RuboCop::Cop::Base
|
2018-08-16 08:15:54 -04:00
|
|
|
MSG = "Don't use ruby interpolation \#{} inside translated strings, instead use \%{}"
|
|
|
|
|
|
|
|
TRANSLATION_METHODS = ':_ :s_ :N_ :n_'
|
|
|
|
|
|
|
|
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
|