>> Sam Sungshik Kong wrote in [ruby-talk:102028]:
>>> s = "My name is %(name)s and my age is %(age)d." % {"name":
>>> "Sam", "age": 34}
>>> I know that ruby has "#{name}" expression. But that requires a
>>> variable named "name" in advance. I want to bind the format
>>> string and data later.
>> I proposed that feature once in [ruby-dev:16351], though
>> rejected, but still I think that it would be useful for I18N. Is
>> it worth for RCR?
> Do you have an example on how would you use this? I ask because I
> would also vote strongly against it.

For I18N, a facility like this is essential, as different languages
may require words in different orders. My standard I18N technique
these days is to have a Messages hash that is replaced by a language
module (cf. Ruwiki's lib/ruwiki/lang/en.rb). In it, I have:

  :no_template_found =>
    "No template of %s found in template set %s."

In lib/ruwiki/config.rb, I have:

  raise ConfigError, message[:no_template_found] %
    [kind.inspect, @template_set] unless TEMPLATES.include?(kind)

      # kind = :edit
      # @template_set = "default"

Basically, this entirely depends on the word order for the template
set and the kind of template always being the same. If, instead, I
were to change my :no_template_found value to:

  "Template set %s does not include template %s."

My output would no longer be correct. If, however, I were able to
do:

  "Template set %(set) does not include template %(kind)."

This would not be an issue, because I would simply change my call to
be:

  raise ConfigError, message[:no_template_found] %
    {"kind" => kind.inspect, "set" => @template_set} unless
      TEMPLATES.include?(kind)

I have had to resort to some rather artificial and stilted wordings
because of the limitations inherent in the current approach. I'm not
sure that the form %(key) is the best -- one loses the best part of
%-formatting (easy tabular format) unless one can include full format
specifiers:

  %5.2f{money}      OR %{money}5.2f

I think that whatever solution is reached, that should be used --
but I desparately need the ability to format this stuff, because the
language files are separate and must stay that way to be properly
I18Ned.

Nothing about this would change that the #{foo} form is preferred
for many things in Ruby, and it has nothing to do with clarity: it
has everything to do, from my perspective, with I18N and L10N
issues. For that reason alone, we need this in core.

-austin
--
austin ziegler * austin.ziegler / evault.com