Source code for camelot.view.controls.user_translatable_label

#  ============================================================================
#
#  Copyright (C) 2007-2013 Conceptive Engineering bvba. All rights reserved.
#  www.conceptive.be / info@conceptive.be
#
#  This file is part of the Camelot Library.
#
#  This file may be used under the terms of the GNU General Public
#  License version 2.0 as published by the Free Software Foundation
#  and appearing in the file license.txt included in the packaging of
#  this file.  Please review this information to ensure GNU
#  General Public Licensing requirements will be met.
#
#  If you are unsure which license is appropriate for your use, please
#  visit www.python-camelot.com or contact info@conceptive.be
#
#  This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
#  WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
#  For use of this library in commercial applications, please contact
#  info@conceptive.be
#
#  ============================================================================

from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import Qt

from camelot.core.utils import ugettext_lazy
from camelot.core.utils import ugettext as _
from camelot.view.art import Icon

class TranslateLabelAction(QtGui.QAction):
    
    translate_icon = Icon( 'tango/16x16/apps/preferences-desktop-locale.png' )
    
    def __init__(self, parent):
        super(TranslateLabelAction, self).__init__(_('Change translation'), parent)
        self.setIcon(self.translate_icon.getQIcon())

[docs]class UserTranslatableLabel(QtGui.QLabel): """A QLabel that allows the user to translate the text contained within by right clicking on it and selecting the appropriate submenu. """ def __init__ (self, text, parent=None): """:param text: the text to be displayed within the label, this can be either a normal string or a ugettext_lazy string, only in the last case, the label will be translatable""" super(UserTranslatableLabel, self).__init__(unicode(text), parent) self.setContextMenuPolicy(Qt.ActionsContextMenu) if isinstance(text, (ugettext_lazy)): self._text = text translate_action = TranslateLabelAction(self) translate_action.triggered.connect( self.change_translation ) self.addAction(translate_action) else: self._text = None @QtCore.pyqtSlot() def change_translation(self): if self._text: new_translation, ok = QtGui.QInputDialog.getText(self, _('Change translation'), _('Translation'), QtGui.QLineEdit.Normal, unicode(self._text)) # when the user presses ok in a blank dialog, the labels # should not disappear new_translation = unicode( new_translation ).strip() if ok and new_translation: from camelot.core.utils import set_translation self.setText(new_translation) set_translation(self._text._string_to_translate, new_translation) from camelot.view.model_thread import post post(self.create_update_translation_table(self._text._string_to_translate, unicode(QtCore.QLocale().name()), unicode(new_translation))) def create_update_translation_table(self, source, language, value): def update_translation_table(): from camelot.model.i18n import Translation from sqlalchemy.orm.session import Session t = Translation.get_by(source=source, language=language) if not t: t = Translation(source=source, language=language) t.value = value Session.object_session( t ).flush( [t] ) return update_translation_table