[Dev] Re: new schema type Python syntax
Andi Vajda
vajda at osafoundation.org
Thu Jul 28 16:19:28 PDT 2005
Could we please, please, please *not* use _() as this blows away the python
shell's _ symbol which is conveniently the last value returned (like Lisp's
*). It makes debugging that much harder.
Thanks !
Andi..
On Thu, 28 Jul 2005, Brian Kirsch wrote:
>
>
>
> Phillip J. Eby wrote:
>
>> At 10:59 AM 7/28/2005 -1000, Brian Kirsch wrote:
>>
>>> Phillip J. Eby wrote:
>>>
>>>> At 10:06 AM 7/28/2005 -1000, Brian Kirsch wrote:
>>>>
>>>>> I am not sure. Using the Text alias is nice since it makes things
>>>>> simple. I am open to feedback / suggestions on this one.
>>>>
>>>>
>>>>
>>>> The parcel issues should go away soon; John has now joined the "let's use
>>>> Python instead of parcel.xml" movement, and I don't think there are many
>>>> other people against it. When parcel.xml goes away then the file/line
>>>> issue goes away too, since _("text") can set the parcel (by looking at
>>>> the __name__ of the module it is called from).
>>>
>>>
>>> Great. That makes things much easier.
>>>
>>>
>>>> Also, it incidentally means that all localizable strings will be
>>>> extractable from the Python source.
>>>
>>>
>>> Can you go in to more detail on this?
>>>
>>> What would the advantage be of extracting all LocalizableStrings from
>>> Python source since we still want to leverage the repository for
>>> LocalizableString storage.
>>
>>
>> Well, since all the strings will *be* in the source, it would be the
>> obvious place to extract them from, since we'd need to for runtime-only
>> messages anyway. So extracting them all from source guarantees none will
>> be missed, and avoids any redundancy.
>>
>> Whether you then *put* the strings you extracted into the repository is
>> entirely orthogonal. I'm just suggesting that extracting them all direct
>> from the source is a convenient way to get them for whatever other
>> processing you want to do, at least once we're not using parcel.xml any
>> more.
>>
>> It's fairly easy to extract the strings using the Python
>> "tokenize.generate_tokens(input_file.readline)" function. Just loop over
>> the tokens looking for '_' followed by '(', one or more string/unicode
>> tokens, and ')'. Part of the data that's produced by the function is
>> line/column start+end info for each token, so that's about everything you
>> need.
>>
>
> Ok I buy that. What's nice about that to is if all LocalizableString are
> wrapped in _() then it is easy to tell in a schema definition whether the
> assignment was a uString or LocalizableString. i.e.
>
> Schema.One(Schema.Text, initialValue = u"This is a UString")
>
> Schema.One(Schema.Text, initialValue = _(u"This is a Localizable String"))
>
> Given all the changes to the parcel / gettext lookup strategy I think it is
> worth reinvestigating how a message would be registered globally such that
> any parcel could access it. For example "Can not connect to Server" is
> generic and should exist as a root message which any parcel can utilize.
>
> Since the _() uses the module (aka parcel) path to find where the translation
> file is located how would a parcel reference a root level message. The two
> ideas I can think off of the top of my head are:
>
> 1. create all definitions at the parcel root and provide Python variable
> references to the translations. This is basically what is currently proposed
> in the i18n spec.
>
> So the root level of the parcel hierarchy would have a definition such as :
>
> CANNOT_CONNECT_TO_SERVER = _(u"Unable to connect to server")
>
>
> A parcel would import the root messages ie.:
>
> import messages
>
> alert(messages.CANNOT_CONNECT_TO_SERVER))
>
>
> 2. Add an additional argument to _() to specify adding it to the global
> lookup space. I can then define global messages from any parcel
>
> in my parcel I have something like this:
>
> CANNOT_CONNECT_TO_SERVER = _(u"Unable to connect to server", global=True)
>
>
> Each approach has advantages and disadvantages.
>
> The first approach has the advantage of only defining the translation once.
> This prevents parcel developers from typo's and case issues. "Unable to
> connect" and "unable to connect" are treated as two distinct keys by gettext.
> The first approach has the disadvantage of global definitions only being
> assignable at the parcel root. This is a bit inflexible.
>
>
> The second approach has the advantage of any parcel can define globals. The
> disadvantage is that the case and typo issues mentioned above come in to
> play.
>
> Of course the whole reason for having a _() creation short cut was to prevent
> developers from the burden of having to define simple info and error messages
> in parcel.xml.
>
> If parcel.xml is going away then do we even need _()? It is simple to define
> a LocalizableString in Python.
>
> From schema:
> cantConnect = Schema.One(Schema.Text, initialValue=u"Unable to connect to
> server")
>
> Instance creation:
> dnsError = LocalizableString(u"No host found matching that name")
>
>
> The LocalizableString is the one doing the translation lookup in its
> __unicode__ method.
>
> def __unicode__(self):
> return I18nManager.translate(self.itsPath, self.defaultText)
>
>
> Thoughts?
>
>
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
>
> Open Source Applications Foundation "Dev" mailing list
> http://lists.osafoundation.org/mailman/listinfo/dev
>
More information about the Dev
mailing list