diff --git a/mitterlib/network/__init__.py b/mitterlib/network/__init__.py index cd341ce..c5025e4 100644 --- a/mitterlib/network/__init__.py +++ b/mitterlib/network/__init__.py @@ -20,6 +20,7 @@ import logging import os.path import urllib2 +import gettext from mitterlib.network.networkbase import NetworkData from mitterlib import module_search @@ -29,6 +30,13 @@ _log = logging.getLogger('mitterlib.network.Networks') # List of files that are not networks SKIPPABLES = ('__init__.py', 'networkbase.py') +#-------------------------------------------------------------------- +# i18n +#-------------------------------------------------------------------- +t = gettext.translation('networks', fallback=True) +_ = t.gettext +N_ = t.ngettext + #-------------------------------------------------------------------- # Helper functions #-------------------------------------------------------------------- @@ -56,12 +64,15 @@ class NetworksNoSuchNetworkError(NetworksError): self._network = network def __str__(self): - return 'Unknown network %s' % (self._network) + return _('Unknown network %s') % (self._network) pass class NetworksNoNetworkSetupError(NetworksError): """There are no networks set up.""" + + def __str__(self): + return _('No networks set up.') pass diff --git a/mitterlib/network/networkbase.py b/mitterlib/network/networkbase.py index a8d6a2f..bf8abf6 100644 --- a/mitterlib/network/networkbase.py +++ b/mitterlib/network/networkbase.py @@ -24,6 +24,7 @@ The :mod:`networkbase` module defines the base classes for all networks. """ import logging +import gettext from mitterlib.constants import version @@ -39,6 +40,12 @@ def auth_options(namespace, options, auths): default=None, help=option['help'], *(option['flags'])) +#-------------------------------------------------------------------- +# i18n +#-------------------------------------------------------------------- +t = gettext.translation('networks', fallback=True) +_ = t.gettext +N_ = t.ngettext #-------------------------------------------------------------------- # Exceptions @@ -56,36 +63,77 @@ class NetworkUnknownError(NetworkError): class NetworkLimitExceededError(NetworkError): """The number of requests available was exceeded.""" + + def __init__(self, network_name): + self.name = network_name + + def __str__(self): + return _('No more available requests on %s') % (self.name) pass class NetworkDNSError(NetworkError): """A DNS failure prevented the request to continue.""" + + def __init__(self, network_name): + self.name = network_name + + def __str__(self): + return _('DNS failure on a request to %s') % (self.name) pass class NetworkInvalidResponseError(NetworkError): """The server returned the information in an unexpected way.""" + + def __init__(self, network_name): + self.name = network_name + + def __str__(self): + return _('The server on %s return the information in an ' \ + 'unexpected way.') % (self.name) pass class NetworkLowLevelError(NetworkError): """A low level error occurred in the network layer.""" + + def __init__(self, network_name): + self.name = network_name + + def __str__(self): + return _('Low level error in the network layer when talking ' \ + 'to %s') % (self.name) pass class NetworkBadStatusLineError(NetworkError): """Bad status line exception.""" + def __init__(self, network_name): + self.name = network_name + + def __str__(self): + return _('Bad status line in network %s') % (self.name) pass class NetworkAuthorizationFailError(NetworkError): """Authorization failure.""" + def __init__(self, network_name): + self.name = network_name + + def __str__(self): + return _('Autorization failed for %s') % (self.name) pass class NetworkPermissionDeniedError(NetworkError): """Permission denied when accessing the message/list.""" + def __init__(self, network_name): + self.name = network_name + + def __str__(self): + return _('Permission denied received on %s') % (self.name) pass #-------------------------------------------------------------------- @@ -99,6 +147,11 @@ class NetworkWarning(Warning): class MessageTooLongWarning(NetworkWarning): """The message is too long for the network.""" + def __init__(self, network_name): + self.name = network_name + + def __str__(self): + return _('Message too long for %s') % (self.name) pass #-------------------------------------------------------------------- diff --git a/mitterlib/network/twitter.py b/mitterlib/network/twitter.py index 3bde47a..67441b0 100644 --- a/mitterlib/network/twitter.py +++ b/mitterlib/network/twitter.py @@ -276,17 +276,17 @@ class Connection(NetworkBase): # pages. if exc.code == 403: # Permission denied. - raise NetworkPermissionDeniedError - raise NetworkInvalidResponseError + raise NetworkPermissionDeniedError(self.NAMESPACE) + raise NetworkInvalidResponseError(self.NAMESPACE) except urllib2.URLError, exc: _log.error('URL error: %s' % exc.reason) - raise NetworkDNSError + raise NetworkDNSError(self.NAMESPACE) except BadStatusLine: _log.error('Bad status line (Twitter is going bananas)') - raise NetworkBadStatusLineError + raise NetworkBadStatusLineError(self.NAMESPACE) except socketError: # That's the worst exception ever. _log.error('Socket connection error') - raise NetworkLowLevelError + raise NetworkLowLevelError(self.NAMESPACE) # TODO: Permission denied? # Introduced in Twitter in 2009.03.27 diff --git a/mitterlib/ui/helpers/gtk_messagegrid.py b/mitterlib/ui/helpers/gtk_messagegrid.py index 148fdc8..32dd7b2 100644 --- a/mitterlib/ui/helpers/gtk_messagegrid.py +++ b/mitterlib/ui/helpers/gtk_messagegrid.py @@ -247,7 +247,7 @@ class MessageGrid(gtk.ScrolledWindow, gobject.GObject): # not right click return False - path = widget.get_path_at_pos(event.x, event.y) + path = widget.get_path_at_pos(int(event.x), int(event.y)) if not path: return False diff --git a/mitterlib/ui/ui_pygtk.py b/mitterlib/ui/ui_pygtk.py index 7059cf4..0c16a07 100644 --- a/mitterlib/ui/ui_pygtk.py +++ b/mitterlib/ui/ui_pygtk.py @@ -26,6 +26,7 @@ import logging import urllib2 import gettext import datetime +import warnings from mitterlib.ui.helpers.image_helpers import find_image from mitterlib.ui.helpers.gtk_threading import ThreadManager @@ -801,11 +802,11 @@ class Interface(object): """Function called if the retrival of current messages returns an exception.""" _log.debug(str(exception)) + message = _('%s\nAuto-refresh is now disabled. Use the "refresh" ' \ + 'option to re-enable it.') % (str(exception)) error_win = gtk.MessageDialog(parent=self._main_window, type=gtk.MESSAGE_ERROR, - message_format=_('Error retrieving current messages. ' \ - 'Auto-refresh disabled. Use the "Refresh" option ' \ - 'to re-enable it.'), + message_format=_message, buttons=gtk.BUTTONS_OK) error_win.run() error_win.hide() @@ -902,10 +903,10 @@ class Interface(object): """Called when there is an exception updating the status.""" _log.debug('Update error') _log.debug(str(exception)) + message = _('%s\nPlease, try again.') % (message) error_win = gtk.MessageDialog(parent=self._main_window, type=gtk.MESSAGE_ERROR, - message_format=_('Error updating your status. Please ' \ - 'try again.'), + message_format=message, buttons=gtk.BUTTONS_OK) error_win.run() error_win.hide() @@ -928,6 +929,12 @@ class Interface(object): """Called when the message cannot be deleted.""" _log.debug('Delete error') _log.debug(str(exception)) + error_win = gtk.MessageDialog(parent=self._main_window, + type=gtk.MESSAGE_ERROR, + message_format=str(exception), + buttons=gtk.BUTTONS_OK) + error_win.run() + error_win.hide() return ### Results for the repost message call @@ -944,8 +951,7 @@ class Interface(object): error_win = gtk.MessageDialog(parent=self._main_window, type=gtk.MESSAGE_ERROR, - message_format=_('Error reposting message. Please ' \ - 'try again.'), + message_format=str(exception), buttons=gtk.BUTTONS_OK) error_win.run() error_win.hide() @@ -969,8 +975,7 @@ class Interface(object): error_win = gtk.MessageDialog(parent=self._main_window, type=gtk.MESSAGE_ERROR, - message_format=_('Error changing favorite status of the ' \ - 'message. Please, try again.'), + message_format=str(exception), buttons=gtk.BUTTONS_OK) error_win.run() error_win.hide() @@ -1018,6 +1023,9 @@ class Interface(object): """Call function; displays the interface. This method should appear on every interface.""" + # turn warnings into exception (so we can catch them) + warnings.simplefilter('error') + if self._options[self.NAMESPACE]['statusicon']: self._statusicon = gtk.StatusIcon() self._statusicon.set_from_pixbuf(self._images['icon'])