08c0a1b852
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' }
29 lines
888 B
Ruby
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
|