def interpolate(locale, string, values = {})
return string unless string.is_a?(::String) && !values.empty?
preserve_encoding(string) do
s = string.gsub(INTERPOLATION_SYNTAX_PATTERN) do
escaped, key = $1, $2.to_sym
if escaped
"{{#{key}}}"
elsif RESERVED_KEYS.include?(key)
raise ReservedInterpolationKey.new(key, string)
else
"%{#{key}}"
end
end
values.each do |key, value|
value = value.call(values) if interpolate_lambda?(value, s, key)
value = value.to_s unless value.is_a?(::String)
values[key] = value
end
s % values
end
rescue KeyError => e
raise MissingInterpolationArgument.new(values, string)
end