class RuboCop::Cop::I18n::GetText::DecorateStringFormattingUsingInterpolation
When using an decorated string to support I18N, any strings inside the decoration should not contain the '#{}' interpolation string as this makes it hard to translate the strings.
Check GetText.supported_decorators
for a list of decorators that can be used.
@example
# bad _("result is #{this_is_the_result}") n_("a string" + "a string with a #{float_value}")
@example
# good _("result is %{detail}" % {detail: message})
Public Instance Methods
on_send(node)
click to toggle source
# File lib/rubocop/cop/i18n/gettext/decorate_string_formatting_using_interpolation.rb, line 26 def on_send(node) decorator_name = node.loc.selector.source return unless GetText.supported_decorator?(decorator_name) method_name = node.method_name arg_nodes = node.arguments return unless !arg_nodes.empty? && contains_string_formatting_with_interpolation?(arg_nodes) message_section = arg_nodes[0] add_offense(message_section, message: "'#{method_name}' function, message string should not contain \#{} formatting") end
Private Instance Methods
contains_string_formatting_with_interpolation?(node)
click to toggle source
# File lib/rubocop/cop/i18n/gettext/decorate_string_formatting_using_interpolation.rb, line 44 def contains_string_formatting_with_interpolation?(node) return node.any? { |n| contains_string_formatting_with_interpolation?(n) } if node.is_a?(Array) return string_contains_interpolation_format?(node.source) if node.respond_to?(:type) && (node.str_type? || node.dstr_type?) return node.children.any? { |child| contains_string_formatting_with_interpolation?(child) } if node.respond_to?(:children) false end
string_contains_interpolation_format?(str)
click to toggle source
# File lib/rubocop/cop/i18n/gettext/decorate_string_formatting_using_interpolation.rb, line 40 def string_contains_interpolation_format?(str) str.match(/\#{[^}]+}/) end