This commit is contained in:
jmdaweb 2014-12-06 00:01:21 +01:00
commit f36accf89b
40 changed files with 7498 additions and 4209 deletions

View File

@ -35,6 +35,7 @@ timelines = list(default=list())
tweet_searches = list(default=list())
lists = list(default=list())
favourites_timelines = list(default=list())
trending_topic_buffers = list(default=list())
muted_buffers = list(default=list())
autoread_buffers = list(default=list())

View File

@ -15,7 +15,7 @@ class autocompletionUsers(object):
try:
pattern = text.split()[-1]
except IndexError:
output.speak(_(u"You have to start to write"))
output.speak(_(u"You have to start writing"))
return
if pattern.startswith("@") == True:
db = storage.storage()
@ -26,6 +26,6 @@ class autocompletionUsers(object):
self.window.PopupMenu(menu, self.window.text.GetPosition())
menu.Destroy()
else:
output.speak(_(u"There is not results in your users database"))
output.speak(_(u"There are not results in your users database"))
else:
output.speak(_(u"Autocompletion only works for users."))

View File

@ -35,4 +35,18 @@ class autocompletionSettings(object):
database.remove_by_buffer(2)
wx_settings.show_success_dialog()
self.dialog.Destroy()
def execute_at_startup(window):
database = storage.storage()
if config.main["mysc"]["save_followers_in_autocompletion_db"] == True:
buffer = window.search_buffer("people", "followers")
for i in buffer.db.settings[buffer.name_buffer]:
database.set_user(i["screen_name"], i["name"], 1)
else:
database.remove_by_buffer(1)
if config.main["mysc"]["save_friends_in_autocompletion_db"] == True:
buffer = window.search_buffer("people", "friends")
for i in buffer.db.settings[buffer.name_buffer]:
database.set_user(i["screen_name"], i["name"], 2)
else:
database.remove_by_buffer(2)

View File

@ -20,4 +20,4 @@ class autocompletionSettingsDialog(wx.Dialog):
self.SetClientSize(sizer.CalcMin())
def show_success_dialog():
wx.MessageDialog(None, _(u"Users TwBlue-database has been updated with new users."), _(u"Done"), wx.OK).ShowModal()
wx.MessageDialog(None, _(u"TWBlue's database of users has been updated."), _(u"Done"), wx.OK).ShowModal()

View File

@ -7,4 +7,5 @@ from favourites import *
from lists import *
from people import *
from tweet_searches import *
from user_searches import *
from user_searches import *
from trends import *

View File

@ -150,7 +150,7 @@ class basePanel(wx.Panel):
if config.main["general"]["relative_times"] == True:
# On windows we need only put the new date on the column, but under linux and mac it isn't possible.
if self.system == "Windows":
original_date = datetime.datetime.strptime(tweet["created_at"], "%a %b %d %H:%M:%S +0000 %Y")
original_date = datetime.datetime.strptime(self.db.settings[self.name_buffer][self.list.get_selected()]["created_at"], "%a %b %d %H:%M:%S +0000 %Y")
date = original_date-datetime.timedelta(seconds=-self.db.settings["utc_offset"])
ts = prettydate(original_date)
self.list.list.SetStringItem(self.list.get_selected(), 2, ts)
@ -159,7 +159,7 @@ class basePanel(wx.Panel):
if twitter.utils.is_audio(tweet):
sound.player.play("audio.ogg", False)
if twitter.utils.is_geocoded(tweet):
sound.player.play("geo.mp3", False)
sound.player.play("geo.ogg", False)
def start_streams(self):
if self.name_buffer == "sent":

View File

@ -20,18 +20,20 @@ import wx
from multiplatform_widgets import widgets
class accountPanel(wx.Panel):
def __init__(self, parent):
def __init__(self, parent, name_buffer):
super(accountPanel, self).__init__(parent=parent)
self.type = "account"
self.name_buffer = name_buffer
sizer = wx.BoxSizer(wx.VERTICAL)
self.list = widgets.list(self, _(u"Announce"))
sizer.Add(self.list.list, 0, wx.ALL, 5)
self.SetSizer(sizer)
def get_more_items(self):
output.speak(_(u"This action is not supported for this buffer"))
class emptyPanel(accountPanel):
def __init__(self, parent):
super(emptyPanel, self).__init__(parent=parent)
super(emptyPanel, self).__init__(parent=parent, name_buffer="")
self.type = "empty"
def get_more_items(self):
output.speak(_(u"This action is not supported for this buffer"))

View File

@ -17,35 +17,162 @@
#
############################################################
import wx
import sound
import config
import twitter
import gui.dialogs
import twitter
import config
import sound
import logging as original_logger
from base import basePanel
import output
import platform
import menus
from multiplatform_widgets import widgets
from mysc.thread_utils import call_threaded
log = original_logger.getLogger("buffers.base")
class trendPanel(basePanel):
def __init__(self, parent, window, name_buffer, *args, **kwargs):
super(searchPanel, self).__init__(parent, window, name_buffer, sound)
self.type = "trend"
self.args = kwargs
class trendsPanel(wx.Panel):
def compose_function(self, trend):
return [trend["name"]]
def start_streams(self):
num = twitter.starting.search(self.db, self.twitter, self.name_buffer, **self.args)
if num > 0: sound.player.play("search_updated.ogg")
self.put_items(num)
return num
def bind_events(self):
self.Bind(wx.EVT_LIST_ITEM_RIGHT_CLICK, self.showMenu, self.list.list)
self.Bind(wx.EVT_LIST_KEY_DOWN, self.showMenuByKey, self.list.list)
self.list.list.Bind(wx.EVT_CHAR_HOOK, self.interact)
def get_message(self, dialog=False):
return self.compose_function(self.trends[self.list.get_selected()])[0]
def create_list(self):
self.list = widgets.list(self, _(u"Trending topic"), style=wx.LC_REPORT|wx.LC_SINGLE_SEL|wx.LC_VRULES)
if self.system == "Windows":
self.list.set_windows_size(0, 30)
self.list.set_size()
def __init__(self, parent, window, name_buffer, argumento=None, sound=""):
self.type = "trends"
self.twitter = window.twitter
self.name_buffer = name_buffer
self.argumento = argumento
self.sound = sound
self.parent = window
self.system = platform.system()
wx.Panel.__init__(self, parent)
self.trends = []
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.create_list()
self.btn = wx.Button(self, -1, _(u"Tweet"))
self.btn.Bind(wx.EVT_BUTTON, self.post_status)
self.tweetTrendBtn = wx.Button(self, -1, _(u"Tweet about this trend"))
self.tweetTrendBtn.Bind(wx.EVT_BUTTON, self.onResponse)
btnSizer = wx.BoxSizer(wx.HORIZONTAL)
btnSizer.Add(self.btn, 0, wx.ALL, 5)
btnSizer.Add(self.tweetTrendBtn, 0, wx.ALL, 5)
self.sizer.Add(btnSizer, 0, wx.ALL, 5)
self.sizer.Add(self.list.list, 0, wx.ALL, 5)
self.bind_events()
self.SetSizer(self.sizer)
def remove_buffer(self):
dlg = wx.MessageDialog(self, _(u"Do you really want to delete this search term?"), _(u"Attention"), style=wx.ICON_QUESTION|wx.YES_NO)
dlg = wx.MessageDialog(self, _(u"Do you really want to delete this buffer?"), _(u"Attention"), style=wx.ICON_QUESTION|wx.YES_NO)
if dlg.ShowModal() == wx.ID_YES:
names = config.main["other_buffers"]["tweet_searches"]
user = self.name_buffer[:-7]
log.info(u"Deleting %s's search term" % user)
if user in names:
names.remove(user)
self.db.settings.pop(self.name_buffer)
pos = self.db.settings["buffers"].index(self.name_buffer)
self.db.settings["buffers"].remove(self.name_buffer)
return pos
topics = config.main["other_buffers"]["trending_topic_buffers"]
topic = self.name_buffer
log.info(u"Deleting %s's trending topics buffer" % topic)
if topic in topics:
topics.remove(topic)
return 0
def start_streams(self):
data = self.twitter.twitter.get_place_trends(id=self.argumento)
self.trends = data[0]["trends"]
sound.player.play(self.sound)
return len(self.trends)
def get_more_items(self):
output.speak(_(u"This action is not supported for this buffer"))
def put_items(self, num):
selected_item = self.list.get_selected()
if self.list.get_count() == 0:
for i in self.trends:
tweet = self.compose_function(i)
self.list.insert_item(False, *tweet)
self.set_list_position()
elif self.list.get_count() > 0:
if config.main["general"]["reverse_timelines"] == False:
for i in self.trends:
tweet = self.compose_function(i)
self.list.insert_item(False, *tweet)
else:
for i in self.trends:
tweet = self.compose_function(i)
self.list.insert_item(True, *tweet)
self.list.select_item(selected_item)
def post_status(self, ev=None):
text = gui.dialogs.message.tweet(_(u"Write the tweet here"), _(u"Tweet"), "", self)
if text.ShowModal() == wx.ID_OK:
if text.image == None:
call_threaded(self.twitter.api_call, call_name="update_status", _sound="tweet_send.ogg", status=text.text.GetValue())
else:
call_threaded(self.twitter.api_call, call_name="update_status_with_media", _sound="tweet_send.ogg", status=text.text.GetValue(), media=text.file)
if ev != None: self.list.list.SetFocus()
def onRetweet(self, event=None): pass
def onResponse(self, ev):
trend = self.trends[self.list.get_selected()]["name"]
text = gui.dialogs.message.tweet(_(u"Write the tweet here"), _(u"Tweet"), trend, self)
if text.ShowModal() == wx.ID_OK:
if text.image == None:
call_threaded(self.twitter.api_call, call_name="update_status", _sound="tweet_send.ogg", status=text.text.GetValue())
else:
call_threaded(self.twitter.api_call, call_name="update_status_with_media", _sound="tweet_send.ogg", status=text.text.GetValue(), media=text.file)
if ev != None: self.list.list.SetFocus()
def interact(self, ev):
if type(ev) is str: event = ev
else:
if ev.GetKeyCode() == wx.WXK_F5: event = "volume_down"
elif ev.GetKeyCode() == wx.WXK_F6: event = "volume_up"
elif ev.GetKeyCode() == wx.WXK_DELETE and ev.ShiftDown(): event = "clear_list"
else:
ev.Skip()
return
if event == "volume_down":
if config.main["sound"]["volume"] > 0.05:
config.main["sound"]["volume"] = config.main["sound"]["volume"]-0.05
sound.player.play("volume_changed.ogg", False)
if hasattr(self.parent, "audioStream"):
self.parent.audioStream.stream.volume = config.main["sound"]["volume"]
elif event == "volume_up":
if config.main["sound"]["volume"] < 0.95:
config.main["sound"]["volume"] = config.main["sound"]["volume"]+0.05
sound.player.play("volume_changed.ogg", False)
if hasattr(self.parent, "audioStream"):
self.parent.audioStream.stream.volume = config.main["sound"]["volume"]
elif event == "clear_list" and self.list.get_count() > 0:
dlg = wx.MessageDialog(self, _(u"Do you really want to empty this buffer? It's items will be removed from the list"), _(u"Empty buffer"), wx.ICON_QUESTION|wx.YES_NO)
if dlg.ShowModal() == wx.ID_YES:
self.trends = []
self.list.clear()
try:
ev.Skip()
except:
pass
def set_list_position(self):
if config.main["general"]["reverse_timelines"] == False:
self.list.select_item(len(self.trends)-1)
else:
self.list.select_item(0)
def showMenu(self, ev):
if self.list.get_count() == 0: return
self.PopupMenu(menus.trendsPanelMenu(self), ev.GetPosition())
def showMenuByKey(self, ev):
if self.list.get_count() == 0: return
if ev.GetKeyCode() == wx.WXK_WINDOWS_MENU:
self.PopupMenu(menus.trendsPanelMenu(self), self.list.list.GetPosition())

View File

@ -1 +1 @@
import message, urlList, follow, utils, show_user, update_profile, configuration, lists, search
import message, urlList, follow, utils, show_user, update_profile, configuration, lists, search, trending

View File

@ -19,24 +19,34 @@
import wx
class trendingTopicsDialog(wx.Dialog):
def __init__(self):
super(searchDialog, self).__init__(None, -1)
def __init__(self, information):
super(trendingTopicsDialog, self).__init__(None, -1)
self.countries = {}
self.cities = {}
self.information = information
self.split_information()
panel = wx.Panel(self)
sizer = wx.BoxSizer(wx.VERTICAL)
self.SetTitle(_(u"Search on Twitter"))
label = wx.StaticText(panel, -1, _(u"Search"))
self.term = wx.TextCtrl(panel, -1,)
dc = wx.WindowDC(self.term)
dc.SetFont(self.term.GetFont())
self.term.SetSize(dc.GetTextExtent("0"*40))
self.SetTitle(_(u"View trending topics"))
label = wx.StaticText(panel, -1, _(u"Trending topics by"))
sizer.Add(label, 0, wx.ALL, 5)
sizer.Add(self.term, 0, wx.ALL, 5)
self.tweets = wx.RadioButton(panel, -1, _(u"Tweets"), style=wx.RB_GROUP)
self.users = wx.RadioButton(panel, -1, _(u"Users"))
self.country = wx.RadioButton(panel, -1, _(u"Country"), style=wx.RB_GROUP)
self.city = wx.RadioButton(panel, -1, _(u"City"))
self.Bind(wx.EVT_RADIOBUTTON, self.get_places, self.country)
self.Bind(wx.EVT_RADIOBUTTON, self.get_places, self.city)
radioSizer = wx.BoxSizer(wx.HORIZONTAL)
radioSizer.Add(self.tweets, 0, wx.ALL, 5)
radioSizer.Add(self.users, 0, wx.ALL, 5)
radioSizer.Add(label, 0, wx.ALL, 5)
radioSizer.Add(self.country, 0, wx.ALL, 5)
radioSizer.Add(self.city, 0, wx.ALL, 5)
sizer.Add(radioSizer, 0, wx.ALL, 5)
label = wx.StaticText(panel, -1, _(u"Location"))
self.location = wx.ListBox(panel, -1, choices=[], style=wx.CB_READONLY)
self.get_places()
locationBox = wx.BoxSizer(wx.HORIZONTAL)
locationBox.Add(label, 0, wx.ALL, 5)
locationBox.Add(self.location, 0, wx.ALL, 5)
sizer.Add(locationBox, 0, wx.ALL, 5)
ok = wx.Button(panel, wx.ID_OK, _(u"OK"))
ok.SetDefault()
cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Close"))
@ -46,3 +56,23 @@ class trendingTopicsDialog(wx.Dialog):
sizer.Add(btnsizer, 0, wx.ALL, 5)
panel.SetSizer(sizer)
self.SetClientSize(sizer.CalcMin())
def split_information(self):
for i in self.information:
if i["placeType"]["name"] == "Country":
self.countries[i["name"]] = i["woeid"]
else:
self.cities[i["name"]] = i["woeid"]
def get_places(self, event=None):
values = []
if self.country.GetValue() == True:
for i in self.information:
if i["placeType"]["name"] == "Country":
values.append(i["name"])
elif self.city.GetValue() == True:
for i in self.information:
if i["placeType"]["name"] != "Country":
values.append(i["name"])
self.location.Set(values)

View File

@ -34,6 +34,7 @@ import urllib2
import sysTrayIcon
import switchModule
import languageHandler
from extra.autocompletionUsers import settings as autocompletionUsersSettings
import pygeocoder
from pygeolib import GeocoderError
from sessionmanager import manager
@ -226,7 +227,7 @@ class mainFrame(wx.Frame):
try:
updater.update_manager.check_for_update()
except:
pass
wx.MessageDialog(self, _(u"An error occurred while looking for an update. It may be due to any problem either on our server or on your DNS servers. Please, try again later."), _(u"Error!"), wx.OK|wx.ICON_ERROR).ShowModal()
self.SetMenuBar(self.makeMenus())
self.setup_twitter(panel)
@ -241,7 +242,7 @@ class mainFrame(wx.Frame):
# Gets the tabs for home, mentions, send and direct messages.
log.debug("Creating buffers...")
self.db.settings["buffers"] = []
account = buffers.accountPanel(self.nb)
account = buffers.accountPanel(self.nb, self.db.settings["user_name"])
self.nb.AddPage(account, self.db.settings["user_name"])
self.db.settings["buffers"].append(self.db.settings["user_name"])
account_index = self.db.settings["buffers"].index(self.db.settings["user_name"])
@ -355,6 +356,7 @@ class mainFrame(wx.Frame):
self.check_streams.start()
# If all it's done, then play a nice sound saying that all it's OK.
sound.player.play("ready.ogg")
autocompletionUsersSettings.execute_at_startup(window=self)
def remove_list(self, id):
for i in range(0, self.nb.GetPageCount()):
@ -1016,6 +1018,21 @@ class mainFrame(wx.Frame):
except KeyError:
pass
def get_trending_topics(self, event=None):
info = self.twitter.twitter.get_available_trends()
trendingDialog = dialogs.trending.trendingTopicsDialog(info)
if trendingDialog.ShowModal() == wx.ID_OK:
if trendingDialog.country.GetValue() == True:
woeid = trendingDialog.countries[trendingDialog.location.GetStringSelection()]
elif trendingDialog.city.GetValue() == True:
woeid = trendingDialog.cities[trendingDialog.location.GetStringSelection()]
buff = buffers.trendsPanel(self.nb, self, "%s_tt" % (woeid,), argumento=woeid, sound="tweet_timeline.ogg")
self.nb.InsertSubPage(self.db.settings["buffers"].index(self.db.settings["user_name"]), buff, _(u"Trending topics for %s") % (trendingDialog.location.GetStringSelection(),))
timer = RepeatingTimer(180, buff.start_streams)
timer.start()
num = buff.start_streams()
buff.put_items(num)
### Close App
def Destroy(self):
self.sysTray.Destroy()

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2014-11-08 16:42+Hora estándar central (México)\n"
"POT-Creation-Date: 2014-12-05 11:32+Hora estándar central (México)\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -15,8 +15,8 @@ msgstr ""
"Generated-By: pygettext.py 1.5\n"
#: ../src\extra\AudioUploader\gui.py:31 ../src\gui\dialogs\message.py:173
#: ../src\gui\dialogs\message.py:261
#: ../src\extra\AudioUploader\gui.py:31 ../src\gui\dialogs\message.py:174
#: ../src\gui\dialogs\message.py:271
msgid "Attach audio"
msgstr ""
@ -70,13 +70,13 @@ msgstr ""
msgid "Stopped"
msgstr ""
#: ../src\extra\AudioUploader\gui.py:129 ../src\gui\dialogs\message.py:222
#: ../src\extra\AudioUploader\gui.py:129 ../src\gui\dialogs\message.py:232
#: ../src\gui\dialogs\update_profile.py:87
msgid "Discarded"
msgstr ""
#: ../src\extra\AudioUploader\gui.py:139 ../src\gui\buffers\base.py:339
#: ../src\gui\buffers\base.py:351
#: ../src\extra\AudioUploader\gui.py:139 ../src\gui\buffers\base.py:356
#: ../src\gui\buffers\base.py:368
msgid "Playing..."
msgstr ""
@ -297,8 +297,45 @@ msgstr ""
msgid "The spelling review has finished."
msgstr ""
#: ../src\extra\translator\gui.py:24 ../src\gui\dialogs\message.py:181
#: ../src\gui\dialogs\message.py:269 ../src\gui\dialogs\message.py:355
#: ../src\extra\autocompletionUsers\completion.py:18
msgid "You have to start writing"
msgstr ""
#: ../src\extra\autocompletionUsers\completion.py:29
msgid "There are not results in your users database"
msgstr ""
#: ../src\extra\autocompletionUsers\completion.py:31
msgid "Autocompletion only works for users."
msgstr ""
#: ../src\extra\autocompletionUsers\settings.py:22
msgid "Updating database... You can close this window now. A message will tell you when the process finishes."
msgstr ""
#: ../src\extra\autocompletionUsers\wx_settings.py:6
msgid "Autocomplete users\342\200\231 settings"
msgstr ""
#: ../src\extra\autocompletionUsers\wx_settings.py:9
msgid "Add users from followers buffer"
msgstr ""
#: ../src\extra\autocompletionUsers\wx_settings.py:10
msgid "Add users from friends buffer"
msgstr ""
#: ../src\extra\autocompletionUsers\wx_settings.py:23
msgid "Done"
msgstr ""
#: ../src\extra\autocompletionUsers\wx_settings.py:23
msgid "TWBlue's database of users has been updated."
msgstr ""
#: ../src\extra\translator\gui.py:24 ../src\gui\dialogs\message.py:182
#: ../src\gui\dialogs\message.py:279 ../src\gui\dialogs\message.py:383
#: ../src\gui\dialogs\message.py:470
msgid "Translate message"
msgstr ""
@ -678,131 +715,134 @@ msgstr ""
msgid "autodetect"
msgstr ""
#: ../src\gui\buffers\base.py:55
#: ../src\gui\buffers\base.py:58
msgid "Client"
msgstr ""
#: ../src\gui\buffers\base.py:55
#: ../src\gui\buffers\base.py:58
msgid "Text"
msgstr ""
#: ../src\gui\buffers\base.py:55 ../src\gui\buffers\events.py:61
#: ../src\gui\buffers\base.py:58 ../src\gui\buffers\events.py:64
msgid "Date"
msgstr ""
#: ../src\gui\buffers\base.py:55 ../src\gui\buffers\people.py:41
#: ../src\gui\buffers\base.py:58 ../src\gui\buffers\people.py:44
#: ../src\gui\buffers\user_searches.py:31 ../src\gui\dialogs\utils.py:36
msgid "User"
msgstr ""
#: ../src\gui\buffers\base.py:80 ../src\gui\buffers\base.py:228
#: ../src\gui\buffers\events.py:62 ../src\gui\buffers\events.py:78
#: ../src\gui\dialogs\message.py:337
#: ../src\gui\buffers\base.py:83 ../src\gui\buffers\base.py:233
#: ../src\gui\buffers\events.py:65 ../src\gui\buffers\events.py:81
#: ../src\gui\buffers\trends.py:64 ../src\gui\buffers\trends.py:114
#: ../src\gui\buffers\trends.py:126 ../src\gui\dialogs\message.py:347
msgid "Tweet"
msgstr ""
#: ../src\gui\buffers\base.py:82 ../src\gui\buffers\base.py:240
#: ../src\gui\buffers\base.py:243
#: ../src\gui\buffers\base.py:85 ../src\gui\buffers\base.py:245
#: ../src\gui\buffers\base.py:248
msgid "Retweet"
msgstr ""
#: ../src\gui\buffers\base.py:84 ../src\gui\buffers\base.py:259
#: ../src\gui\buffers\base.py:87 ../src\gui\buffers\base.py:264
msgid "Reply"
msgstr ""
#: ../src\gui\buffers\base.py:86
#: ../src\gui\buffers\base.py:89
msgid "Direct message"
msgstr ""
#: ../src\gui\buffers\base.py:100
#: ../src\gui\buffers\base.py:103
msgid "Do you really want to delete this timeline?"
msgstr ""
#: ../src\gui\buffers\base.py:100 ../src\gui\buffers\favourites.py:41
#: ../src\gui\buffers\lists.py:46 ../src\gui\buffers\trends.py:41
#: ../src\gui\buffers\base.py:103 ../src\gui\buffers\favourites.py:41
#: ../src\gui\buffers\lists.py:46 ../src\gui\buffers\trends.py:77
#: ../src\gui\buffers\tweet_searches.py:45
#: ../src\gui\buffers\user_searches.py:56
msgid "Attention"
msgstr ""
#: ../src\gui\buffers\base.py:112
#: ../src\gui\buffers\base.py:115
msgid "This buffer is not a timeline; it can't be deleted."
msgstr ""
#: ../src\gui\buffers\base.py:196 ../src\gui\buffers\people.py:114
#: ../src\gui\buffers\base.py:201 ../src\gui\buffers\people.py:117
msgid "%s items retrieved"
msgstr ""
#: ../src\gui\buffers\base.py:220 ../src\gui\buffers\dm.py:44
#: ../src\gui\buffers\people.py:56
#: ../src\gui\buffers\base.py:225 ../src\gui\buffers\dm.py:46
#: ../src\gui\buffers\people.py:59
msgid "Direct message to %s"
msgstr ""
#: ../src\gui\buffers\base.py:220 ../src\gui\buffers\dm.py:44
#: ../src\gui\buffers\people.py:56
#: ../src\gui\buffers\base.py:225 ../src\gui\buffers\dm.py:46
#: ../src\gui\buffers\people.py:59
msgid "New direct message"
msgstr ""
#: ../src\gui\buffers\base.py:228 ../src\gui\buffers\events.py:78
#: ../src\gui\buffers\base.py:233 ../src\gui\buffers\events.py:81
#: ../src\gui\buffers\trends.py:114 ../src\gui\buffers\trends.py:126
msgid "Write the tweet here"
msgstr ""
#: ../src\gui\buffers\base.py:240
#: ../src\gui\buffers\base.py:245
msgid "Would you like to add a comment to this tweet?"
msgstr ""
#: ../src\gui\buffers\base.py:243
#: ../src\gui\buffers\base.py:248
msgid "Add your comment to the tweet"
msgstr ""
#: ../src\gui\buffers\base.py:259
#: ../src\gui\buffers\base.py:264
msgid "Reply to %s"
msgstr ""
#: ../src\gui\buffers\base.py:304
#: ../src\gui\buffers\base.py:319
msgid "Opening URL..."
msgstr ""
#: ../src\gui\buffers\base.py:321 ../src\gui\buffers\events.py:122
#: ../src\gui\buffers\base.py:338 ../src\gui\buffers\events.py:125
msgid "Do you really want to empty this buffer? It's tweets will be removed from the list but not from Twitter"
msgstr ""
#: ../src\gui\buffers\base.py:321 ../src\gui\buffers\events.py:122
#: ../src\gui\buffers\base.py:338 ../src\gui\buffers\events.py:125
#: ../src\gui\buffers\trends.py:156
msgid "Empty buffer"
msgstr ""
#: ../src\gui\buffers\base.py:326 ../src\gui\buffers\events.py:126
#: ../src\gui\buffers\base.py:343 ../src\gui\buffers\events.py:129
msgid "Do you really want to delete this message?"
msgstr ""
#: ../src\gui\buffers\base.py:326 ../src\gui\buffers\events.py:126
#: ../src\gui\buffers\base.py:343 ../src\gui\buffers\events.py:129
#: ../src\gui\dialogs\lists.py:107
msgid "Delete"
msgstr ""
#: ../src\gui\buffers\base.py:346 ../src\gui\buffers\base.py:357
#: ../src\gui\buffers\base.py:363 ../src\gui\buffers\base.py:374
msgid "Unable to play audio."
msgstr ""
#: ../src\gui\buffers\base.py:348
#: ../src\gui\buffers\base.py:365
msgid "Audio stopped."
msgstr ""
#: ../src\gui\buffers\events.py:35 ../src\gui\buffers\panels.py:37
#: ../src\gui\buffers\tweet_searches.py:58
#: ../src\gui\buffers\events.py:36 ../src\gui\buffers\panels.py:33
#: ../src\gui\buffers\trends.py:93 ../src\gui\buffers\tweet_searches.py:58
#: ../src\gui\buffers\user_searches.py:64
msgid "This action is not supported for this buffer"
msgstr ""
#: ../src\gui\buffers\events.py:44
#: ../src\gui\buffers\events.py:47
msgid "Empty"
msgstr ""
#: ../src\gui\buffers\events.py:61
#: ../src\gui\buffers\events.py:64
msgid "Event"
msgstr ""
#: ../src\gui\buffers\events.py:64
#: ../src\gui\buffers\events.py:67
msgid "Remove event"
msgstr ""
@ -814,222 +854,313 @@ msgstr ""
msgid "Do you really want to delete this list?"
msgstr ""
#: ../src\gui\buffers\panels.py:27
#: ../src\gui\buffers\menus.py:8
msgid "&Retweet"
msgstr ""
#: ../src\gui\buffers\menus.py:11 ../src\gui\buffers\menus.py:43
msgid "Re&ply"
msgstr ""
#: ../src\gui\buffers\menus.py:14
msgid "Add to &favourites"
msgstr ""
#: ../src\gui\buffers\menus.py:17
msgid "Remove from favo&urites"
msgstr ""
#: ../src\gui\buffers\menus.py:20 ../src\gui\buffers\menus.py:46
#: ../src\gui\buffers\menus.py:69
msgid "&Open URL"
msgstr ""
#: ../src\gui\buffers\menus.py:23 ../src\gui\buffers\menus.py:49
#: ../src\gui\buffers\menus.py:72
msgid "&Play audio"
msgstr ""
#: ../src\gui\buffers\menus.py:26 ../src\gui\buffers\menus.py:75
msgid "&Show tweet"
msgstr ""
#: ../src\gui\buffers\menus.py:29 ../src\gui\buffers\menus.py:55
#: ../src\gui\buffers\menus.py:78 ../src\gui\buffers\menus.py:92
#: ../src\gui\buffers\menus.py:115
msgid "&Copy to clipboard"
msgstr ""
#: ../src\gui\buffers\menus.py:32 ../src\gui\buffers\menus.py:58
#: ../src\gui\buffers\menus.py:81 ../src\gui\buffers\menus.py:95
msgid "&Delete"
msgstr ""
#: ../src\gui\buffers\menus.py:35 ../src\gui\buffers\menus.py:61
#: ../src\gui\buffers\menus.py:118
msgid "&User actions..."
msgstr ""
#: ../src\gui\buffers\menus.py:52
msgid "&Show direct message"
msgstr ""
#: ../src\gui\buffers\menus.py:89
msgid "&Show event"
msgstr ""
#: ../src\gui\buffers\menus.py:103
msgid "&Mention"
msgstr ""
#: ../src\gui\buffers\menus.py:106
msgid "&View lists"
msgstr ""
#: ../src\gui\buffers\menus.py:109
msgid "Show user &profile"
msgstr ""
#: ../src\gui\buffers\menus.py:112
msgid "&Show user"
msgstr ""
#: ../src\gui\buffers\panels.py:28
msgid "Announce"
msgstr ""
#: ../src\gui\buffers\people.py:46 ../src\gui\buffers\people.py:64
#: ../src\gui\buffers\people.py:49 ../src\gui\buffers\people.py:67
msgid "Mention"
msgstr ""
#: ../src\gui\buffers\people.py:64
#: ../src\gui\buffers\people.py:67
msgid "Mention to %s"
msgstr ""
#: ../src\gui\buffers\trends.py:41 ../src\gui\buffers\tweet_searches.py:45
#: ../src\gui\buffers\trends.py:47
msgid "Trending topic"
msgstr ""
#: ../src\gui\buffers\trends.py:66
msgid "Tweet about this trend"
msgstr ""
#: ../src\gui\buffers\trends.py:77
msgid "Do you really want to delete this buffer?"
msgstr ""
#: ../src\gui\buffers\trends.py:156
msgid "Do you really want to empty this buffer? It's items will be removed from the list"
msgstr ""
#: ../src\gui\buffers\tweet_searches.py:45
#: ../src\gui\buffers\user_searches.py:56
msgid "Do you really want to delete this search term?"
msgstr ""
#: ../src\gui\dialogs\configuration.py:39
#: ../src\gui\dialogs\configuration.py:40
msgid "Language"
msgstr ""
#: ../src\gui\dialogs\configuration.py:53
msgid "ask before exiting TwBlue?"
#: ../src\gui\dialogs\configuration.py:54
msgid "Set the autocomplete function"
msgstr ""
#: ../src\gui\dialogs\configuration.py:56
msgid "ask before exiting TwBlue?"
msgstr ""
#: ../src\gui\dialogs\configuration.py:59
msgid "Relative times"
msgstr ""
#: ../src\gui\dialogs\configuration.py:60
#: ../src\gui\dialogs\configuration.py:63
msgid "Activate Sapi5 when any other screen reader is not being run"
msgstr ""
#: ../src\gui\dialogs\configuration.py:63
#: ../src\gui\dialogs\configuration.py:66
msgid "Activate the auto-start of the invisible interface"
msgstr ""
#: ../src\gui\dialogs\configuration.py:67
#: ../src\gui\dialogs\configuration.py:70
msgid "API calls when the stream is started (One API call equals to 200 tweetts, two API calls equals 400 tweets, etc):"
msgstr ""
#: ../src\gui\dialogs\configuration.py:75
#: ../src\gui\dialogs\configuration.py:78
msgid "Items on each API call"
msgstr ""
#: ../src\gui\dialogs\configuration.py:82
#: ../src\gui\dialogs\configuration.py:85
msgid "Inverted buffers: The newest tweets will be shown at the beginning of the lists while the oldest at the end"
msgstr ""
#: ../src\gui\dialogs\configuration.py:97
#: ../src\gui\dialogs\configuration.py:101
msgid "Show followers"
msgstr ""
#: ../src\gui\dialogs\configuration.py:100
#: ../src\gui\dialogs\configuration.py:104
msgid "Show friends"
msgstr ""
#: ../src\gui\dialogs\configuration.py:103
#: ../src\gui\dialogs\configuration.py:107
msgid "Show favourites"
msgstr ""
#: ../src\gui\dialogs\configuration.py:106
#: ../src\gui\dialogs\configuration.py:110
msgid "Show blocked users"
msgstr ""
#: ../src\gui\dialogs\configuration.py:109
#: ../src\gui\dialogs\configuration.py:113
msgid "Show muted users"
msgstr ""
#: ../src\gui\dialogs\configuration.py:112
#: ../src\gui\dialogs\configuration.py:116
msgid "Show events"
msgstr ""
#: ../src\gui\dialogs\configuration.py:122
#: ../src\gui\dialogs\configuration.py:270
#: ../src\gui\dialogs\configuration.py:126
#: ../src\gui\dialogs\configuration.py:275
msgid "Ignored clients"
msgstr ""
#: ../src\gui\dialogs\configuration.py:128
#: ../src\gui\dialogs\configuration.py:132
msgid "Add client"
msgstr ""
#: ../src\gui\dialogs\configuration.py:129
#: ../src\gui\dialogs\configuration.py:133
msgid "Remove client"
msgstr ""
#: ../src\gui\dialogs\configuration.py:140
#: ../src\gui\dialogs\configuration.py:144
msgid "Add a new ignored client"
msgstr ""
#: ../src\gui\dialogs\configuration.py:140
#: ../src\gui\dialogs\configuration.py:144
msgid "Enter the name of the client here"
msgstr ""
#: ../src\gui\dialogs\configuration.py:157
#: ../src\gui\dialogs\configuration.py:161
msgid "Volume"
msgstr ""
#: ../src\gui\dialogs\configuration.py:166
#: ../src\gui\dialogs\configuration.py:170
msgid "Global mute"
msgstr ""
#: ../src\gui\dialogs\configuration.py:170
#: ../src\gui\dialogs\configuration.py:174
msgid "Output device"
msgstr ""
#: ../src\gui\dialogs\configuration.py:179
#: ../src\gui\dialogs\configuration.py:183
msgid "Input device"
msgstr ""
#: ../src\gui\dialogs\configuration.py:190
#: ../src\gui\dialogs\configuration.py:194
msgid "Sound pack"
msgstr ""
#: ../src\gui\dialogs\configuration.py:203
#: ../src\gui\dialogs\configuration.py:207
msgid "If you've got a SndUp account, enter your API Key here. Whether the API Key is wrong, the App will fail to upload anything to the server. Whether there's no API Key here, then the audio files will be uploaded anonimously"
msgstr ""
#: ../src\gui\dialogs\configuration.py:216
#: ../src\gui\dialogs\configuration.py:240
#: ../src\gui\dialogs\configuration.py:220
#: ../src\gui\dialogs\configuration.py:244
msgid "Unlink your Dropbox account"
msgstr ""
#: ../src\gui\dialogs\configuration.py:218
#: ../src\gui\dialogs\configuration.py:235
#: ../src\gui\dialogs\configuration.py:243
#: ../src\gui\dialogs\configuration.py:222
#: ../src\gui\dialogs\configuration.py:239
#: ../src\gui\dialogs\configuration.py:247
#: ../src\gui\dialogs\configuration.py:254
#: ../src\gui\dialogs\configuration.py:251
#: ../src\gui\dialogs\configuration.py:258
msgid "Link your Dropbox account"
msgstr ""
#: ../src\gui\dialogs\configuration.py:228
#: ../src\gui\dialogs\configuration.py:232
msgid "Authorisation"
msgstr ""
#: ../src\gui\dialogs\configuration.py:228
#: ../src\gui\dialogs\configuration.py:232
msgid "The authorisation request will be shown on your browser. Copy the code tat Dropbox will provide and, in the text box that will appear on TW Blue, paste it. This code is necessary to continue. You only need to do it once."
msgstr ""
#: ../src\gui\dialogs\configuration.py:230
#: ../src\gui\dialogs\configuration.py:234
msgid "Enter the code here."
msgstr ""
#: ../src\gui\dialogs\configuration.py:230
#: ../src\gui\dialogs\configuration.py:234
msgid "Verification code"
msgstr ""
#: ../src\gui\dialogs\configuration.py:242
#: ../src\gui\dialogs\configuration.py:246
msgid "Error during authorisation. Try again later."
msgstr ""
#: ../src\gui\dialogs\configuration.py:242
#: ../src\gui\dialogs\configuration.py:246
msgid "Error!"
msgstr ""
#: ../src\gui\dialogs\configuration.py:261
#: ../src\gui\dialogs\configuration.py:265
msgid "TW Blue preferences"
msgstr ""
#: ../src\gui\dialogs\configuration.py:265
#: ../src\gui\dialogs\configuration.py:269
msgid "General"
msgstr ""
#: ../src\gui\dialogs\configuration.py:268
#: ../src\gui\dialogs\configuration.py:273
msgid "Show other buffers"
msgstr ""
#: ../src\gui\dialogs\configuration.py:272
#: ../src\gui\dialogs\configuration.py:277
msgid "Sound"
msgstr ""
#: ../src\gui\dialogs\configuration.py:274
#: ../src\gui\dialogs\configuration.py:279
msgid "Audio Services"
msgstr ""
#: ../src\gui\dialogs\configuration.py:277
#: ../src\gui\dialogs\configuration.py:282
msgid "Save"
msgstr ""
#: ../src\gui\dialogs\configuration.py:280 ../src\gui\dialogs\follow.py:64
#: ../src\gui\dialogs\message.py:186 ../src\gui\dialogs\message.py:274
#: ../src\gui\dialogs\message.py:357 ../src\gui\dialogs\search.py:42
#: ../src\gui\dialogs\show_user.py:42 ../src\gui\dialogs\trending.py:42
#: ../src\gui\dialogs\update_profile.py:56 ../src\gui\dialogs\utils.py:42
#: ../src\gui\dialogs\configuration.py:285 ../src\gui\dialogs\follow.py:64
#: ../src\gui\dialogs\message.py:189 ../src\gui\dialogs\message.py:284
#: ../src\gui\dialogs\message.py:385 ../src\gui\dialogs\message.py:472
#: ../src\gui\dialogs\search.py:42 ../src\gui\dialogs\show_user.py:42
#: ../src\gui\dialogs\trending.py:52 ../src\gui\dialogs\update_profile.py:56
#: ../src\gui\dialogs\utils.py:42
msgid "Close"
msgstr ""
#: ../src\gui\dialogs\configuration.py:293
#: ../src\gui\dialogs\configuration.py:301
msgid "Followers"
msgstr ""
#: ../src\gui\dialogs\configuration.py:307
#: ../src\gui\dialogs\configuration.py:315
msgid "friends"
msgstr ""
#: ../src\gui\dialogs\configuration.py:321
#: ../src\gui\dialogs\configuration.py:329
msgid "Favorites"
msgstr ""
#: ../src\gui\dialogs\configuration.py:335
#: ../src\gui\dialogs\configuration.py:343
msgid "Events"
msgstr ""
#: ../src\gui\dialogs\configuration.py:346
#: ../src\gui\dialogs\configuration.py:354
msgid "Blocked users"
msgstr ""
#: ../src\gui\dialogs\configuration.py:360
#: ../src\gui\dialogs\configuration.py:368
msgid "Muted users"
msgstr ""
#: ../src\gui\dialogs\configuration.py:420
#: ../src\gui\dialogs\configuration.py:428
msgid "Restart TW Blue"
msgstr ""
#: ../src\gui\dialogs\configuration.py:420
#: ../src\gui\dialogs\configuration.py:428
msgid "The application requires to be restarted to save these changes. Press OK to do it now."
msgstr ""
@ -1066,7 +1197,7 @@ msgid "Report as spam"
msgstr ""
#: ../src\gui\dialogs\follow.py:61 ../src\gui\dialogs\search.py:40
#: ../src\gui\dialogs\trending.py:40 ../src\gui\dialogs\utils.py:39
#: ../src\gui\dialogs\trending.py:50 ../src\gui\dialogs\utils.py:39
msgid "OK"
msgstr ""
@ -1178,105 +1309,128 @@ msgstr ""
msgid "Select a list to remove the user"
msgstr ""
#: ../src\gui\dialogs\message.py:43 ../src\gui\dialogs\message.py:146
#: ../src\gui\dialogs\message.py:44 ../src\gui\dialogs\message.py:147
msgid "%s - %s of 140 characters"
msgstr ""
#: ../src\gui\dialogs\message.py:77
#: ../src\gui\dialogs\message.py:78
msgid "Attaching..."
msgstr ""
#: ../src\gui\dialogs\message.py:78
#: ../src\gui\dialogs\message.py:79
msgid "Uploading..."
msgstr ""
#: ../src\gui\dialogs\message.py:100
#: ../src\gui\dialogs\message.py:101
msgid "Unable to upload the audio"
msgstr ""
#: ../src\gui\dialogs\message.py:114 ../src\gui\dialogs\message.py:400
#: ../src\gui\dialogs\message.py:115 ../src\gui\dialogs\message.py:428
#: ../src\gui\dialogs\message.py:513
msgid "Translated"
msgstr ""
#: ../src\gui\dialogs\message.py:126
#: ../src\gui\dialogs\message.py:127
msgid "There's no URL to be shortened"
msgstr ""
#: ../src\gui\dialogs\message.py:129
#: ../src\gui\dialogs\message.py:130
msgid "URL shortened"
msgstr ""
#: ../src\gui\dialogs\message.py:137 ../src\gui\dialogs\message.py:412
#: ../src\gui\dialogs\message.py:138 ../src\gui\dialogs\message.py:440
#: ../src\gui\dialogs\message.py:525
msgid "There's no URL to be expanded"
msgstr ""
#: ../src\gui\dialogs\message.py:140 ../src\gui\dialogs\message.py:415
#: ../src\gui\dialogs\message.py:141 ../src\gui\dialogs\message.py:443
#: ../src\gui\dialogs\message.py:528
msgid "URL expanded"
msgstr ""
#: ../src\gui\dialogs\message.py:168 ../src\gui\dialogs\message.py:223
#: ../src\gui\dialogs\message.py:169 ../src\gui\dialogs\message.py:233
#: ../src\gui\dialogs\update_profile.py:51
#: ../src\gui\dialogs\update_profile.py:88
msgid "Upload a picture"
msgstr ""
#: ../src\gui\dialogs\message.py:171 ../src\gui\dialogs\message.py:259
#: ../src\gui\dialogs\message.py:350
#: ../src\gui\dialogs\message.py:172 ../src\gui\dialogs\message.py:269
#: ../src\gui\dialogs\message.py:378 ../src\gui\dialogs\message.py:465
msgid "Spelling correction"
msgstr ""
#: ../src\gui\dialogs\message.py:175 ../src\gui\dialogs\message.py:263
#: ../src\gui\dialogs\message.py:176 ../src\gui\dialogs\message.py:273
msgid "Shorten URL"
msgstr ""
#: ../src\gui\dialogs\message.py:177 ../src\gui\dialogs\message.py:265
#: ../src\gui\dialogs\message.py:352
#: ../src\gui\dialogs\message.py:178 ../src\gui\dialogs\message.py:275
#: ../src\gui\dialogs\message.py:380 ../src\gui\dialogs\message.py:467
msgid "Expand URL"
msgstr ""
#: ../src\gui\dialogs\message.py:183 ../src\gui\dialogs\message.py:271
#: ../src\gui\dialogs\message.py:184 ../src\gui\dialogs\message.py:281
msgid "Send"
msgstr ""
#: ../src\gui\dialogs\message.py:219 ../src\gui\dialogs\message.py:230
#: ../src\gui\dialogs\message.py:187
msgid "&Autocomplete users"
msgstr ""
#: ../src\gui\dialogs\message.py:229 ../src\gui\dialogs\message.py:240
#: ../src\gui\dialogs\update_profile.py:84
#: ../src\gui\dialogs\update_profile.py:95
msgid "Discard image"
msgstr ""
#: ../src\gui\dialogs\message.py:225 ../src\gui\dialogs\update_profile.py:90
#: ../src\gui\dialogs\message.py:235 ../src\gui\dialogs\update_profile.py:90
msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"
msgstr ""
#: ../src\gui\dialogs\message.py:225 ../src\gui\dialogs\update_profile.py:90
#: ../src\gui\dialogs\message.py:235 ../src\gui\dialogs\update_profile.py:90
msgid "Select the picture to be uploaded"
msgstr ""
#: ../src\gui\dialogs\message.py:253
#: ../src\gui\dialogs\message.py:263
msgid "Recipient"
msgstr ""
#: ../src\gui\dialogs\message.py:308
msgid "Mention to all"
#: ../src\gui\dialogs\message.py:318
msgid "Mention &to all"
msgstr ""
#: ../src\gui\dialogs\message.py:335
#: ../src\gui\dialogs\message.py:345
msgid "Tweet - %i characters "
msgstr ""
#: ../src\gui\dialogs\search.py:26 ../src\gui\dialogs\trending.py:26
#: ../src\gui\dialogs\message.py:363
msgid "Retweets: "
msgstr ""
#: ../src\gui\dialogs\message.py:368
msgid "Favourites: "
msgstr ""
#: ../src\gui\dialogs\message.py:451
msgid "View"
msgstr ""
#: ../src\gui\dialogs\message.py:453
msgid "Item"
msgstr ""
#: ../src\gui\dialogs\search.py:26
msgid "Search on Twitter"
msgstr ""
#: ../src\gui\dialogs\search.py:27 ../src\gui\dialogs\trending.py:27
#: ../src\gui\dialogs\search.py:27
msgid "Search"
msgstr ""
#: ../src\gui\dialogs\search.py:34 ../src\gui\dialogs\trending.py:34
#: ../src\gui\dialogs\search.py:34
msgid "Tweets"
msgstr ""
#: ../src\gui\dialogs\search.py:35 ../src\gui\dialogs\trending.py:35
#: ../src\gui\dialogs\search.py:35
msgid "Users"
msgstr ""
@ -1349,6 +1503,26 @@ msgstr ""
msgid "Favourites: %s"
msgstr ""
#: ../src\gui\dialogs\trending.py:30
msgid "View trending topics"
msgstr ""
#: ../src\gui\dialogs\trending.py:31
msgid "Trending topics by"
msgstr ""
#: ../src\gui\dialogs\trending.py:33
msgid "Country"
msgstr ""
#: ../src\gui\dialogs\trending.py:34
msgid "City"
msgstr ""
#: ../src\gui\dialogs\trending.py:43 ../src\gui\dialogs\update_profile.py:35
msgid "Location"
msgstr ""
#: ../src\gui\dialogs\update_profile.py:27
msgid "Update your profile"
msgstr ""
@ -1357,10 +1531,6 @@ msgstr ""
msgid "Name (20 characters maximum)"
msgstr ""
#: ../src\gui\dialogs\update_profile.py:35
msgid "Location"
msgstr ""
#: ../src\gui\dialogs\update_profile.py:40
msgid "Website"
msgstr ""

File diff suppressed because it is too large Load Diff

@ -1 +1 @@
Subproject commit 739034e207994b3a05e59e6d7836e68a0a1b6983
Subproject commit ddcbbd21d35995a4877df5b7cd03db12b31bee84