[PyQt] pyuic ignores translation comments

2010-12-31 Thread Sebastian Wiesner
Hello,

the C++ uic extracts the value of the comment of string
properties in UI files, and uses it as third argument disambiguation
in the generated C++ code.  However, in PyQt 4.8.2 pyuic and
uic.loadUi apparently ignore this attribute, and instead to always
pass None for this third argument.  According to the documentation
of QCoreApplication.translate() this argument is used to
disambiguate identical messages used in different contexts, so I
guess, that this behaviour actually introduces translation bugs, if a
single object contains two identical messages with different context.

It certainly leads to translation bugs in PyKDE, which uses gettext
instead of Qt's message format.  The standard KDE gettext toolchain
extracts the contents of the comment attribute and uses them as
message context (msgctxt field in gettext catalog files).  Now
gettext considers two identical messages with different contexts as
two different messages, and even more, it identifies messages through
the context and the message id.  So if a message has a context
attached, the context *must* also be given, when loading the
translation in the source code.  For instance, given a message foo
with context bar, the message *must* be loaded using i18nc(bar,
foo) (i18nc is the KDE function to load a message with context,
where the context is the first argument).  If just i18n(foo) is
used, the translation is *not* found (i18n is the KDE function to load
a message without context).

As uic now simply ignores this contexts, all messages in UI files,
which have a comment attached, are incorrectly loaded in KDE
applications, and consequently it can happen, that large parts of the
user interface file simply remain untranslated.  I hit this bug in my
program synaptiks, and was forced to dig into the uic code and write
a workaround [1], which modifies uic in such a way, that it respects
the comments.  Concerning the implementation, tr2i18n is nothing
special.  The line return tr2i18n(text, comment) could be replaced
with QtGui.QApplication.translate(self.uiname, text, comment.
QtGui.QApplication.UnicodeUTF8), I'm just using tr2i18n, because it
is shorter, and because it is the function, KDE uses in compiled UI
files.

I consider this a bug in PyQt4.uic and I'd like to see it fixed.  Any
other comments?

[1] https://github.com/lunaryorn/synaptiks/blob/master/synaptiks/kde/uic.py
___
PyQt mailing listPyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt


Re: [PyQt] pyuic ignores translation comments

2010-12-31 Thread Phil Thompson
On Fri, 31 Dec 2010 16:20:07 +0100, Sebastian Wiesner
lunary...@googlemail.com wrote:
 Hello,
 
 the C++ uic extracts the value of the comment of string
 properties in UI files, and uses it as third argument disambiguation
 in the generated C++ code.  However, in PyQt 4.8.2 pyuic and
 uic.loadUi apparently ignore this attribute, and instead to always
 pass None for this third argument.  According to the documentation
 of QCoreApplication.translate() this argument is used to
 disambiguate identical messages used in different contexts, so I
 guess, that this behaviour actually introduces translation bugs, if a
 single object contains two identical messages with different context.
 
 It certainly leads to translation bugs in PyKDE, which uses gettext
 instead of Qt's message format.  The standard KDE gettext toolchain
 extracts the contents of the comment attribute and uses them as
 message context (msgctxt field in gettext catalog files).  Now
 gettext considers two identical messages with different contexts as
 two different messages, and even more, it identifies messages through
 the context and the message id.  So if a message has a context
 attached, the context *must* also be given, when loading the
 translation in the source code.  For instance, given a message foo
 with context bar, the message *must* be loaded using i18nc(bar,
 foo) (i18nc is the KDE function to load a message with context,
 where the context is the first argument).  If just i18n(foo) is
 used, the translation is *not* found (i18n is the KDE function to load
 a message without context).
 
 As uic now simply ignores this contexts, all messages in UI files,
 which have a comment attached, are incorrectly loaded in KDE
 applications, and consequently it can happen, that large parts of the
 user interface file simply remain untranslated.  I hit this bug in my
 program synaptiks, and was forced to dig into the uic code and write
 a workaround [1], which modifies uic in such a way, that it respects
 the comments.  Concerning the implementation, tr2i18n is nothing
 special.  The line return tr2i18n(text, comment) could be replaced
 with QtGui.QApplication.translate(self.uiname, text, comment.
 QtGui.QApplication.UnicodeUTF8), I'm just using tr2i18n, because it
 is shorter, and because it is the function, KDE uses in compiled UI
 files.
 
 I consider this a bug in PyQt4.uic and I'd like to see it fixed.  Any
 other comments?
 
 [1]
https://github.com/lunaryorn/synaptiks/blob/master/synaptiks/kde/uic.py

Should be fixed in tonight's snapshot.

Thanks,
Phil
___
PyQt mailing listPyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt