[PyQt] i18n
Giovanni Bajo
rasky at develer.com
Wed Feb 11 17:36:23 GMT 2009
On 2/11/2009 5:58 PM, Doug Bell wrote:
> Frédéric wrote:
>> On mercredi 11 février 2009, Doug Bell wrote:
>>
>>>> Are there some tips, for example, to bind the _() method I use with
>>>> gettext and PyGTK? Something to help me migrate my code without having
>>>> to modify it everywhere...
>>> Here's how I do it:
>>>
>>> def translate(text, comment=''):
>>> """Translation function that sets context to calling module's
>>> filename"""
>>> try:
>>> frame = sys._getframe(1)
>>> fileName = frame.f_code.co_filename
>>> finally:
>>> del frame
>>> context = os.path.basename(os.path.splitext(fileName)[0])
>>> return unicode(QtCore.QCoreApplication.translate(context, text,
>>> comment))
>>>
>>> def markNoTranslate(text, comment=''):
>>> """Mark text for translation without actually doing the
>>> translation"""
>>> return text
>>>
>>> __builtin__._ = translate
>>> __builtin__.N_ = markNoTranslate
>> Thanks!
>>
>> What is the purpose of the N_() function?
>
> It's for cases where you want to mark a string to be included in the
> language files, but you don't want to change the string by doing the
> translation immediately. An example would be a string used as a key in
> an untranslated data file that later needs to be translated for output.
> The N_() function applied to the string literal would just mark it, then
> the _() function could be applied later to a variable containing that
> string.
>
> Note that you will also need to slightly modify the pylupdate program
> to look for the _() and N_() functions and to use the proper context.
It looks like a little too much effort. For such cases, what we usually
do is something like:
if 0:
self.tr("text 1")
self.tr("text 2")
self.tr("text 3")
self.tr("text 4")
self.tr("text 5")
and you're done. Moreover: if those strings comes from a data file, you
can even write a generator that parses the data file, produces a file
like the above snippet, and feed it to pylupdate. You don't need a
custom pylupdate for sure.
This said, I don't agree with the recommendation of not using self.tr().
In my experience, there are only a few cases where this turns out to be
a problem, compared to the benefits of code readability of self.tr().
For those cases in which it is a problem, the alternative is to use
qApp.translate(), which is a much shorter synonymous of
QtCore.QCoreApplication.translate :) (OK I'm cheating: I'm not taking
into account that I can use 'qApp' because of star-imports).
--
Giovanni Bajo
Develer S.r.l.
http://www.develer.com
More information about the PyQt
mailing list