[Dev] [README] i18n checkin
Brian Kirsch
bkirsch at osafoundation.org
Fri Sep 16 16:12:42 PDT 2005
Thanks Alec for the feedback!
One additional comment: Although there may be a few random cases where
we need to define date format information in the translation like Alec's
example below 99% of this formatting should come from PyICU via its
format classes (DateFormat, NumberFormat, etc). PyICU maintains this
information for 230+ locales.
-Brian
Brian Kirsch - Email Framework Engineer
Open Source Applications Foundation
543 Howard St. 5th Floor
San Francisco, CA 94105
(415) 946-3056
http://www.osafoundation.org
Alec Flett wrote:
> This is great work, thanks for going and doing all the legwork on this.
>
> There was a case in CalendarCanvas that I think is very subtle that I
> wanted to bring to everyone's attention, because you may run into a
> case of this without realizing it.The simple lesson here is that
> symbols also need to be translated.
>
> Here's the subtle case: the calendar canvas displays the month and
> year at the top of the calendar, and when a week spans 2 months, it
> shows both months plus the year. The code for the 2nd case looked like
> this:
>
> "%s - %s %d" % (month1, month2, year)
>
> It might look like the format string is not necessary to translate
> because there are no words, but you still need a locale-specific
> string here. In some language, you might display the year first, then
> the two months. Or, the character '-' might not mean "to" in your
> language and you may need another character or word.
>
> the proper way of making a translatable string is using the python
> keyword syntax that Brian has gone through and fixed most everywhere:
>
> _(u'%(month1) - %(month2) %(year)d') % { month1: month1, month2:
> month2, year: year}
>
> So for instance in spanish, the format string might be '%(year)d
> %(month1)s a %(month2)s'
>
>
> Alec
>
> Brian Kirsch wrote:
>
>> Aloha,
>> I just checked in a significant update to i18n in Chandler (rev 7213).
>> On your next svn update you will need to recreate your repository.
>>
>> This is a bulk commit encompassing many i18n improvements. A few of
>> the highlights include:
>> ================================================
>>
>> 1. The displayName attribute is now schema.Text which means it only
>> accepts unicode values :)
>>
>> 2. If Chandler is started with the --locale test. All translatable
>> strings will have a surrogate pair character inserted at the
>> beginning. This is useful for testing and to verify UI strings are
>> wrapped in _(). The 'Generate Data' menu items with the 'test'
>> locale inserts non-ascii characters to items on a semi-random basis.
>> Again, this is great for testing.
>>
>> 3. Added a __unicode__ method to the ContentItem base class.
>>
>> 4. Changed all translatable strings to use dicts for the keys. It is
>> very hard for a translator to get the context of a translation when
>> it is something like this "Test results (%s) failed for %s". It is
>> much better to have "Test results (%(accountType)s )failed for
>> %(user)s". To use the dict one would do this:
>>
>> >>> from i18n import OSAFMessageFactory as _
>> >>> s = _(u"Test results %(accountType)s failed for %(user)s") %
>> {'accountType': "IMAP", 'user': "Brian Kirsch"}
>> >>> print s.encode('utf8')
>> >>> #Assuming the locale is set to English
>> >>> u'Test results (IMAP) failed for Brian Kirsch'
>>
>> 5. Created the tools/createPot.py file which will produce the
>> chandler.pot translation file for all _() in application, parcels,
>> crypto, and i18n. The chandler.pot file will be created for now in
>> the $CHANDLERHOME/chandler directory.
>>
>> From the command line:
>>
>> %) cd $CHANDLERHOME/chandler
>> %) ./release/RunPython tools/createPot.py
>>
>>
>> 6. Created the osaf.messages file which contains common translation
>> strings leveraged through out the Chandler source.
>> >>> from osaf import messages
>> >>> print messages.ME.encode('utf8')
>> >>> #Assuming the locale is set to English
>> >>> u'me'
>>
>> 7. Created the ChandlerException which unlike the base Exception
>> class handles unicode error messages. This is useful because right
>> now many parts of Chandler capture exceptions and display them in the
>> UI. If the exception comes from outside of Chandler however it must
>> be translated manually before display.
>>
>>
>> >>> from osaf import ChandlerException
>> >>> raise ChandlerException(_(u"This is a localized error message"))
>>
>> 7. Random i18n improvements to the source code such as removing
>> translation methods around strings which were not displaying in the
>> UI and adding translation methods to strings which were displaying in
>> the UI.
>>
>> 8. Fixed some bugs I found in the Chandler code related to i18n and
>> exception handling
>>
>> 9. Identified areas of Chandler which are not correctly dealing with
>> i18n issues. I will be filing bug reports today but for the most part
>> Chandler components are handling i18n very well :)
>>
>>
>> So what should I do you ask?
>> ======================
>> 1. Please only check in translatable string with dict look ups. No
>> more %s in translations. Feel free to %s for non-displayable tasks
>> such as writing messages to the log.
>>
>> 2. Please create translation sentences not sentence fragments. For
>> example _(u"ago") does not give enough context for a translator to
>> work with. The translation of 'ago' will depend on the way it is used
>> in a sentence. Also where 'ago' appears in a sentence will change
>> from language to language.
>>
>> 2. Please Please Please run Chandler with --locale test before you
>> check in a major change. Look for the following:
>>
>> a. Did I add any strings to the UI? Are they wrapped in _() for
>> translation?
>> b. When I do a 'Generate Data' from the Test menu does my module
>> work properly? For example, can I share items with non-ascii values
>> properly, do they import and export as Ical events, can I send them
>> in an email?
>>
>> 3. Use osaf.messages for common translations strings such as 'All'
>> and 'Account Preferences' instead of redefining them in code.
>>
>> 4. Do not use displayNames as keys for lookup. Displaynames can
>> change depending on the locale and are not the appropriate place to
>> do comparisons. For example, some parts of the UI were checking if
>> the name of the collection is 'All'. Well this will fail in another
>> locale. Thanks to John for looking through the CPIA code and removing
>> the displayName collection lookups.
>>
>> 5. Only put _() a translation method around strings that are actually
>> displayed to the user in the UI. This reduces the burden on the
>> translator.
>>
>>
>> There will be a 'Busy Developers Guide' for internationalization
>> coming shortly.
>>
>> Thanks,
>> Brian
>>
>
More information about the Dev
mailing list