[Idle-dev] I18N prep work - convert strings to use format()

Terry Reedy tjreedy at udel.edu
Wed Jan 21 22:15:42 CET 2015


On 1/21/2015 10:51 AM, Tal Einat wrote:
> On Wed, Jan 21, 2015 at 10:03 AM, Al Sweigart <al at inventwithpython.com> wrote:
>>
>> I'd like to change the old-style string formatting from '%s %s' %
>> (foo, bar) to the format() string method version. This is not just a
>> cosmetic change, but would be part of the prep work for I18N support
>> for IDLE.

Since I currently regard internationalizaiton as pie in the sky, I would 
tend to see such changes as cosmetic.  If I were editing format strings 
anyway, I might then make the change simply because I prefer it.

>> For some languages, the order that variables would need to be
>> interpolated into strings would not be the same. For example, in
>> English you could have:
>>
>> color = 'black'
>> animal = 'cat'
>> "The %s %s's toy." % (color, animal)
>>
>> While in Spanish, this would be:
>>
>> color = 'negro'
>> animal = 'gato'
>> "El juguete del %s %s." % (animal, color)

This can also be done with % formats.

 >>> "The %(color)s %(anim)s's toy." % {'color': 'black', 'anim': 'cat'}
"The black cat's toy."
 >>> "El juguete del %(anim)s %(color)s." % {'color': 'negro', 'anim': 
'gato'}
'El juguete del gato negro.'

That said, I prefer .format, and also note that the Idle replacement 
strings (as opposed to the format), should not need translation.

>> However, this defeats translating the "The %s %s's toy." string for
>> I18N. Using the format() string method fixes this: "The {color}
>> {animal}'s toy." could be translated as "El juguete del {animal}
>> {color}."
>>
>> I'd like to go through the strings in IDLE and convert them to use
>> format(). This wouldn't be all of the strings: only those that are
>> user-facing and have multiple %s (or other) conversion specifiers
>> would need to be translated.

The only examples I can think of where this applies are warning messages 
such as

     warning = ('\n Warning: configHandler.py - IdleConf.GetOption -\n'
                ' invalid %r value for configuration option %r\n'
                ' from section %r: %r' %
                 (type, option, section,
                 self.userCfg[configType].Get(section, option,
                               raw=raw)))

If Il8n did happen, these would be a low priority, as Il8n advocates 
have said menu first, then configuration dialogs next.  Unlike exception 
messages, which would not be translated, such messages should hopefully 
never be seen, and in a classroom, an instructor would need to interpret 
it anyway as to what to do.

When I work on confighandler (which definitely needs work) and review 
its warning messages, I should like to revise this one (and others like 
it) to specify the file with the problem, so one would know where to 
make a fix. For this one, the file depends on the user config directory 
and the config type.  (Telling users where the message comes from is 
pretty useless.)  I might rewrite as

warning = ("Config Warning: user configuration file {fname},"
            "section [{sname}], option {oname} must be type {tname}.  "
            "Entry {uval} is not valid; using backup value instead."
             .format(fname=<whatever>, sname=section, oname=option,
              tname=type, uval=...))

>> This is a change that touches on a lot of files, so I wanted to see if
>> anyone could foresee issues with this change before I start on it.

Not useful now in itself.

> If i18n is your goal, are you sure that string.format() is the way to go?

Either kind of format can be translated if one uses field names. If one 
replaces by position, .format is better since one can switch from '{0} 
{1}' to '{1} {0}' without changing the .format call.  With 4 or 5 
fields, as in the real example above, I like field names.  For code that 
should never be run, the run time cost is irrelevant.

-- 
Terry Jan Reedy



More information about the IDLE-dev mailing list