mirror of
https://github.com/MCV-Software/TWBlue.git
synced 2025-07-17 21:56:07 -04:00
Merge branch 'next-gen' into japanese_translation
This commit is contained in:
@@ -1,40 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
from builtins import object
|
||||
import os
|
||||
import widgetUtils
|
||||
import logging
|
||||
from wxUI.dialogs import attach as gui
|
||||
log = logging.getLogger("controller.attach")
|
||||
|
||||
class attach(object):
|
||||
def __init__(self):
|
||||
self.attachments = list()
|
||||
self.dialog = gui.attachDialog()
|
||||
widgetUtils.connect_event(self.dialog.photo, widgetUtils.BUTTON_PRESSED, self.upload_image)
|
||||
widgetUtils.connect_event(self.dialog.remove, widgetUtils.BUTTON_PRESSED, self.remove_attachment)
|
||||
self.dialog.get_response()
|
||||
log.debug("Attachments controller started.")
|
||||
|
||||
def upload_image(self, *args, **kwargs):
|
||||
image, description = self.dialog.get_image()
|
||||
if image != None:
|
||||
imageInfo = {"type": "photo", "file": image, "description": description}
|
||||
log.debug("Image data to upload: %r" % (imageInfo,))
|
||||
self.attachments.append(imageInfo)
|
||||
info = [_(u"Photo"), description]
|
||||
self.dialog.attachments.insert_item(False, *info)
|
||||
self.dialog.remove.Enable(True)
|
||||
|
||||
def remove_attachment(self, *args, **kwargs):
|
||||
current_item = self.dialog.attachments.get_selected()
|
||||
log.debug("Removing item %d" % (current_item,))
|
||||
if current_item == -1: current_item = 0
|
||||
self.attachments.pop(current_item)
|
||||
self.dialog.attachments.remove_item(current_item)
|
||||
self.check_remove_status()
|
||||
log.debug("Removed")
|
||||
|
||||
def check_remove_status(self):
|
||||
if len(self.attachments) == 0 and self.dialog.attachments.get_count() == 0:
|
||||
self.dialog.remove.Enable(False)
|
@@ -84,42 +84,15 @@ class BaseBuffer(base.Buffer):
|
||||
return _(u"Unknown buffer")
|
||||
|
||||
def post_status(self, *args, **kwargs):
|
||||
item = None
|
||||
title = _(u"Tweet")
|
||||
caption = _(u"Write the tweet here")
|
||||
title = _("Tweet")
|
||||
caption = _("Write the tweet here")
|
||||
tweet = messages.tweet(self.session, title, caption, "")
|
||||
if tweet.message.get_response() == widgetUtils.OK:
|
||||
if config.app["app-settings"]["remember_mention_and_longtweet"]:
|
||||
config.app["app-settings"]["longtweet"] = tweet.message.long_tweet.GetValue()
|
||||
config.app.write()
|
||||
text = tweet.message.get_text()
|
||||
if len(text) > 280 and tweet.message.get("long_tweet") == True:
|
||||
if not hasattr(tweet, "attachments"):
|
||||
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text)
|
||||
else:
|
||||
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1)
|
||||
if not hasattr(tweet, "attachments") or len(tweet.attachments) == 0:
|
||||
item = self.session.api_call(call_name="update_status", status=text, _sound="tweet_send.ogg", tweet_mode="extended")
|
||||
else:
|
||||
call_threaded(self.post_with_media, text=text, attachments=tweet.attachments)
|
||||
# We will no longer will reuse the sent item from here as Streaming API should give us the new and correct item.
|
||||
# but in case we'd need it, just uncomment the following couple of lines and make sure we reduce the item correctly.
|
||||
# if item != None:
|
||||
# pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"])
|
||||
if hasattr(tweet.message, "destroy"): tweet.message.destroy()
|
||||
self.session.settings.write()
|
||||
|
||||
def post_with_media(self, text, attachments):
|
||||
media_ids = []
|
||||
for i in attachments:
|
||||
img = self.session.twitter.media_upload(i["file"])
|
||||
self.session.twitter.create_media_metadata(media_id=img.media_id, alt_text=i["description"])
|
||||
media_ids.append(img.media_id)
|
||||
item = self.session.twitter.update_status(status=text, media_ids=media_ids)
|
||||
# We will no longer will reuse the sent item from here as Streaming API should give us the new and correct item.
|
||||
# but in case we'd need it, just uncomment the following couple of lines and make sure we reduce the item correctly.
|
||||
# if item != None:
|
||||
# pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"])
|
||||
response = tweet.message.ShowModal()
|
||||
if response == wx.ID_OK:
|
||||
tweet_data = tweet.get_tweet_data()
|
||||
call_threaded(self.session.send_tweet, *tweet_data)
|
||||
if hasattr(tweet.message, "destroy"):
|
||||
tweet.message.destroy()
|
||||
|
||||
def get_formatted_message(self):
|
||||
if self.type == "dm" or self.name == "direct_messages":
|
||||
@@ -422,7 +395,6 @@ class BaseBuffer(base.Buffer):
|
||||
user = self.session.get_user(tweet.user)
|
||||
screen_name = user.screen_name
|
||||
id = tweet.id
|
||||
twishort_enabled = hasattr(tweet, "twishort")
|
||||
users = utils.get_all_mentioned(tweet, self.session.db, field="screen_name")
|
||||
ids = utils.get_all_mentioned(tweet, self.session.db, field="id")
|
||||
# Build the window title
|
||||
@@ -430,38 +402,14 @@ class BaseBuffer(base.Buffer):
|
||||
title=_("Reply to {arg0}").format(arg0=screen_name)
|
||||
else:
|
||||
title=_("Reply")
|
||||
message = messages.reply(self.session, title, _(u"Reply to %s") % (screen_name,), "", users=users, ids=ids)
|
||||
if message.message.get_response() == widgetUtils.OK:
|
||||
message = messages.reply(self.session, title, _("Reply to %s") % (screen_name,), "", users=users, ids=ids)
|
||||
if message.message.ShowModal() == widgetUtils.OK:
|
||||
if config.app["app-settings"]["remember_mention_and_longtweet"]:
|
||||
config.app["app-settings"]["longtweet"] = message.message.long_tweet.GetValue()
|
||||
if len(users) > 0:
|
||||
config.app["app-settings"]["mention_all"] = message.message.mentionAll.GetValue()
|
||||
config.app["app-settings"]["mention_all"] = message.message.mention_all.GetValue()
|
||||
config.app.write()
|
||||
params = {"_sound": "reply_send.ogg", "in_reply_to_status_id": id, "tweet_mode": "extended"}
|
||||
text = message.message.get_text()
|
||||
if twishort_enabled == False:
|
||||
excluded_ids = message.get_ids()
|
||||
params["exclude_reply_user_ids"] =excluded_ids
|
||||
params["auto_populate_reply_metadata"] =True
|
||||
else:
|
||||
mentioned_people = message.get_people()
|
||||
text = "@"+screen_name+" "+mentioned_people+u" "+text
|
||||
if len(text) > 280 and message.message.get("long_tweet") == True:
|
||||
if message.image == None:
|
||||
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text)
|
||||
else:
|
||||
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1)
|
||||
params["status"] = text
|
||||
if message.image == None:
|
||||
params["call_name"] = "update_status"
|
||||
else:
|
||||
params["call_name"] = "update_status_with_media"
|
||||
params["media"] = message.file
|
||||
item = self.session.api_call(**params)
|
||||
# We will no longer will reuse the sent item from here as Streaming API should give us the new and correct item.
|
||||
# but in case we'd need it, just uncomment the following couple of lines and make sure we reduce the item correctly.
|
||||
# if item != None:
|
||||
# pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"])
|
||||
tweet_data = dict(text=message.message.text.GetValue(), attachments=message.attachments, poll_options=message.poll_options, poll_period=message.poll_period)
|
||||
call_threaded(self.session.reply, in_reply_to_status_id=id, text=message.message.text.GetValue(), attachments=message.attachments, exclude_reply_user_ids=message.get_ids())
|
||||
if hasattr(message.message, "destroy"): message.message.destroy()
|
||||
self.session.settings.write()
|
||||
|
||||
@@ -477,21 +425,17 @@ class BaseBuffer(base.Buffer):
|
||||
else:
|
||||
screen_name = self.session.get_user(tweet.user).screen_name
|
||||
users = utils.get_all_users(tweet, self.session)
|
||||
dm = messages.dm(self.session, _(u"Direct message to %s") % (screen_name,), _(u"New direct message"), users)
|
||||
if dm.message.get_response() == widgetUtils.OK:
|
||||
screen_name = dm.message.get("cb")
|
||||
dm = messages.dm(self.session, _("Direct message to %s") % (screen_name,), _("New direct message"), users)
|
||||
if dm.message.ShowModal() == widgetUtils.OK:
|
||||
screen_name = dm.message.cb.GetValue()
|
||||
user = self.session.get_user_by_screen_name(screen_name)
|
||||
recipient_id = user
|
||||
text = dm.message.get_text()
|
||||
val = self.session.api_call(call_name="send_direct_message", recipient_id=recipient_id, text=text)
|
||||
if val != None:
|
||||
sent_dms = self.session.db["sent_direct_messages"]
|
||||
if self.session.settings["general"]["reverse_timelines"] == False:
|
||||
sent_dms.append(val)
|
||||
else:
|
||||
sent_dms.insert(0, val)
|
||||
self.session.db["sent_direct_messages"] = sent_dms
|
||||
pub.sendMessage("sent-dm", data=val, user=self.session.db["user_name"])
|
||||
text = dm.message.text.GetValue()
|
||||
if len(dm.attachments) > 0:
|
||||
attachment = dm.attachments[0]
|
||||
else:
|
||||
attachment = None
|
||||
call_threaded(self.session.direct_message, text=text, recipient=recipient_id, attachment=attachment)
|
||||
if hasattr(dm.message, "destroy"): dm.message.destroy()
|
||||
|
||||
@_tweets_exist
|
||||
@@ -509,40 +453,20 @@ class BaseBuffer(base.Buffer):
|
||||
else:
|
||||
self._retweet_with_comment(tweet, id)
|
||||
|
||||
def _retweet_with_comment(self, tweet, id, comment=''):
|
||||
# If quoting a retweet, let's quote the original tweet instead the retweet.
|
||||
def _retweet_with_comment(self, tweet, id):
|
||||
if hasattr(tweet, "retweeted_status"):
|
||||
tweet = tweet.retweeted_status
|
||||
if hasattr(tweet, "full_text"):
|
||||
comments = tweet.full_text
|
||||
else:
|
||||
comments = tweet.text
|
||||
retweet = messages.tweet(self.session, _(u"Quote"), _(u"Add your comment to the tweet"), u"“@%s: %s ”" % (self.session.get_user(tweet.user).screen_name, comments), max=256, messageType="retweet")
|
||||
if comment != '':
|
||||
retweet.message.set_text(comment)
|
||||
if retweet.message.get_response() == widgetUtils.OK:
|
||||
text = retweet.message.get_text()
|
||||
text = text+" https://twitter.com/{0}/status/{1}".format(self.session.get_user(tweet.user).screen_name, id)
|
||||
if retweet.image == None:
|
||||
# We will no longer will reuse the sent item from here as Streaming API should give us the new and correct item.
|
||||
# but in case we'd need it, just uncomment the following couple of lines and make sure we reduce the item correctly.
|
||||
item = self.session.api_call(call_name="update_status", _sound="retweet_send.ogg", status=text, in_reply_to_status_id=id, tweet_mode="extended")
|
||||
# if item != None:
|
||||
# new_item = self.session.twitter.get_status(id=item.id, include_ext_alt_text=True, tweet_mode="extended")
|
||||
# pub.sendMessage("sent-tweet", data=new_item, user=self.session.db["user_name"])
|
||||
else:
|
||||
call_threaded(self.session.api_call, call_name="update_status", _sound="retweet_send.ogg", status=text, media=retweet.image)
|
||||
if hasattr(retweet.message, "destroy"): retweet.message.destroy()
|
||||
retweet = messages.tweet(session=self.session, title=_("Quote"), caption=_("Add your comment to the tweet"), max=256, thread_mode=False)
|
||||
if retweet.message.ShowModal() == widgetUtils.OK:
|
||||
text = retweet.message.text.GetValue()
|
||||
tweet_data = dict(text=text, attachments=retweet.attachments, poll_period=retweet.poll_period, poll_options=retweet.poll_options)
|
||||
tweet_data.update(quote_tweet_id=id)
|
||||
call_threaded(self.session.send_tweet, *[tweet_data])
|
||||
if hasattr(retweet.message, "destroy"):
|
||||
retweet.message.Destroy()
|
||||
|
||||
def _direct_retweet(self, id):
|
||||
item = self.session.api_call(call_name="retweet", _sound="retweet_send.ogg", id=id)
|
||||
# We will no longer will reuse the sent item from here as Streaming API should give us the new and correct item.
|
||||
# but in case we'd need it, just uncomment the following couple of lines and make sure we reduce the item correctly.
|
||||
# if item != None:
|
||||
# Retweets are returned as non-extended tweets, so let's get the object as extended
|
||||
# just before sending the event message. See https://github.com/manuelcortez/TWBlue/issues/253
|
||||
# item = self.session.twitter.get_status(id=item.id, include_ext_alt_text=True, tweet_mode="extended")
|
||||
# pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"])
|
||||
|
||||
def onFocus(self, *args, **kwargs):
|
||||
tweet = self.get_tweet()
|
||||
|
@@ -90,18 +90,12 @@ class DirectMessagesBuffer(base.BaseBuffer):
|
||||
def reply(self, *args, **kwargs):
|
||||
tweet = self.get_right_tweet()
|
||||
screen_name = self.session.get_user(tweet.message_create["sender_id"]).screen_name
|
||||
message = messages.reply(self.session, _(u"Mention"), _(u"Mention to %s") % (screen_name,), "@%s " % (screen_name,), [screen_name,])
|
||||
if message.message.get_response() == widgetUtils.OK:
|
||||
if config.app["app-settings"]["remember_mention_and_longtweet"]:
|
||||
config.app["app-settings"]["longtweet"] = message.message.long_tweet.GetValue()
|
||||
config.app.write()
|
||||
if message.image == None:
|
||||
item = self.session.api_call(call_name="update_status", _sound="reply_send.ogg", status=message.message.get_text(), tweet_mode="extended")
|
||||
if item != None:
|
||||
pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"])
|
||||
else:
|
||||
call_threaded(self.session.api_call, call_name="update_status_with_media", _sound="reply_send.ogg", status=message.message.get_text(), media=message.file)
|
||||
if hasattr(message.message, "destroy"): message.message.destroy()
|
||||
message = messages.reply(session=self.session, title=_("Mention"), caption=_("Mention to %s") % (screen_name,), text="@%s " % (screen_name,), thread_mode=False, users=[screen_name,])
|
||||
if message.message.ShowModal() == widgetUtils.OK:
|
||||
tweet_data = message.get_tweet_data()
|
||||
call_threaded(self.session.send_tweet, tweet_data)
|
||||
if hasattr(message.message, "destroy"):
|
||||
message.message.destroy()
|
||||
|
||||
def onFocus(self, *args, **kwargs):
|
||||
tweet = self.get_tweet()
|
||||
|
@@ -92,18 +92,12 @@ class PeopleBuffer(base.BaseBuffer):
|
||||
def reply(self, *args, **kwargs):
|
||||
tweet = self.get_right_tweet()
|
||||
screen_name = tweet.screen_name
|
||||
message = messages.reply(self.session, _(u"Mention"), _(u"Mention to %s") % (screen_name,), "@%s " % (screen_name,), [screen_name,])
|
||||
if message.message.get_response() == widgetUtils.OK:
|
||||
if config.app["app-settings"]["remember_mention_and_longtweet"]:
|
||||
config.app["app-settings"]["longtweet"] = message.message.long_tweet.GetValue()
|
||||
config.app.write()
|
||||
if message.image == None:
|
||||
item = self.session.api_call(call_name="update_status", _sound="reply_send.ogg", status=message.message.get_text(), tweet_mode="extended")
|
||||
if item != None:
|
||||
pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"])
|
||||
else:
|
||||
call_threaded(self.session.api_call, call_name="update_status_with_media", _sound="reply_send.ogg", status=message.message.get_text(), media=message.file)
|
||||
if hasattr(message.message, "destroy"): message.message.destroy()
|
||||
message = messages.tweet(session=self.session, title=_("Mention"), caption=_("Mention to %s") % (screen_name,), text="@%s " % (screen_name,), thread_mode=False)
|
||||
if message.message.ShowModal() == widgetUtils.OK:
|
||||
tweet_data = message.get_tweet_data()
|
||||
call_threaded(self.session.send_tweet, tweet_data)
|
||||
if hasattr(message.message, "destroy"):
|
||||
message.message.destroy()
|
||||
|
||||
def start_stream(self, mandatory=False, play_sound=True, avoid_autoreading=False):
|
||||
# starts stream every 3 minutes.
|
||||
|
@@ -4,7 +4,7 @@ import platform
|
||||
if platform.system() == "Windows":
|
||||
import wx
|
||||
from wxUI import buffers, commonMessageDialogs, menus
|
||||
from controller import user
|
||||
from controller import user, messages
|
||||
elif platform.system() == "Linux":
|
||||
from gi.repository import Gtk
|
||||
from gtkUI import buffers, commonMessageDialogs
|
||||
@@ -38,6 +38,18 @@ class TrendsBuffer(base.Buffer):
|
||||
self.get_formatted_message = self.get_message
|
||||
self.reply = self.search_topic
|
||||
|
||||
|
||||
def post_status(self, *args, **kwargs):
|
||||
title = _("Tweet")
|
||||
caption = _("Write the tweet here")
|
||||
tweet = messages.tweet(self.session, title, caption, "")
|
||||
response = tweet.message.ShowModal()
|
||||
if response == wx.ID_OK:
|
||||
tweet_data = tweet.get_tweet_data()
|
||||
call_threaded(self.session.send_tweet, *tweet_data)
|
||||
if hasattr(tweet.message, "destroy"):
|
||||
tweet.message.destroy()
|
||||
|
||||
def start_stream(self, mandatory=False, play_sound=True, avoid_autoreading=False):
|
||||
# starts stream every 3 minutes.
|
||||
current_time = time.time()
|
||||
@@ -119,21 +131,13 @@ class TrendsBuffer(base.Buffer):
|
||||
|
||||
def tweet_about_this_trend(self, *args, **kwargs):
|
||||
if self.buffer.list.get_count() == 0: return
|
||||
title = _(u"Tweet")
|
||||
caption = _(u"Write the tweet here")
|
||||
tweet = messages.tweet(self.session, title, caption, self.get_message()+ " ")
|
||||
tweet.message.set_cursor_at_end()
|
||||
if tweet.message.get_response() == widgetUtils.OK:
|
||||
text = tweet.message.get_text()
|
||||
if len(text) > 280 and tweet.message.get("long_tweet") == True:
|
||||
if tweet.image == None:
|
||||
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text)
|
||||
else:
|
||||
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1)
|
||||
if tweet.image == None:
|
||||
call_threaded(self.session.api_call, call_name="update_status", status=text)
|
||||
else:
|
||||
call_threaded(self.session.api_call, call_name="update_status_with_media", status=text, media=tweet.image)
|
||||
title = _("Tweet")
|
||||
caption = _("Write the tweet here")
|
||||
tweet = messages.tweet(session=self.session, title=title, caption=caption, text=self.get_message()+ " ")
|
||||
tweet.message.SetInsertionPoint(len(tweet.message.GetValue()))
|
||||
if tweet.message.ShowModal() == widgetUtils.OK:
|
||||
tweet_data = tweet.get_tweet_data()
|
||||
call_threaded(self.session.send_tweet, *tweet_data)
|
||||
if hasattr(tweet.message, "destroy"): tweet.message.destroy()
|
||||
|
||||
def show_menu_by_key(self, ev):
|
||||
|
@@ -1,123 +1,69 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import re
|
||||
import platform
|
||||
import os
|
||||
import arrow
|
||||
import languageHandler
|
||||
system = platform.system()
|
||||
import wx
|
||||
import widgetUtils
|
||||
import output
|
||||
import url_shortener
|
||||
import sound
|
||||
import config
|
||||
from pubsub import pub
|
||||
from twitter_text import parse_tweet
|
||||
if system == "Windows":
|
||||
from wxUI.dialogs import message, urlList
|
||||
from wxUI import commonMessageDialogs
|
||||
from extra import translator, SpellChecker, autocompletionUsers
|
||||
from extra.AudioUploader import audioUploader
|
||||
elif system == "Linux":
|
||||
from gtkUI.dialogs import message
|
||||
from wxUI.dialogs import twitterDialogs, urlList
|
||||
from wxUI import commonMessageDialogs
|
||||
from extra import translator, SpellChecker, autocompletionUsers
|
||||
from extra.AudioUploader import audioUploader
|
||||
from sessions.twitter import utils
|
||||
from . import attach
|
||||
|
||||
class basicTweet(object):
|
||||
""" This class handles the tweet main features. Other classes should derive from this class."""
|
||||
def __init__(self, session, title, caption, text, messageType="tweet", max=280, *args, **kwargs):
|
||||
def __init__(self, session, title, caption, text="", messageType="tweet", max=280, *args, **kwargs):
|
||||
super(basicTweet, self).__init__()
|
||||
self.max = max
|
||||
self.title = title
|
||||
self.session = session
|
||||
self.message = getattr(message, messageType)(title, caption, text, *args, **kwargs)
|
||||
self.message = getattr(twitterDialogs, messageType)(title=title, caption=caption, message=text, *args, **kwargs)
|
||||
self.message.text.SetValue(text)
|
||||
self.message.text.SetInsertionPoint(len(self.message.text.GetValue()))
|
||||
widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck)
|
||||
widgetUtils.connect_event(self.message.attach, widgetUtils.BUTTON_PRESSED, self.attach)
|
||||
widgetUtils.connect_event(self.message.add_audio, widgetUtils.BUTTON_PRESSED, self.attach)
|
||||
widgetUtils.connect_event(self.message.text, widgetUtils.ENTERED_TEXT, self.text_processor)
|
||||
widgetUtils.connect_event(self.message.shortenButton, widgetUtils.BUTTON_PRESSED, self.shorten)
|
||||
widgetUtils.connect_event(self.message.unshortenButton, widgetUtils.BUTTON_PRESSED, self.unshorten)
|
||||
widgetUtils.connect_event(self.message.translateButton, widgetUtils.BUTTON_PRESSED, self.translate)
|
||||
if hasattr(self.message, "long_tweet"):
|
||||
widgetUtils.connect_event(self.message.long_tweet, widgetUtils.CHECKBOX, self.text_processor)
|
||||
if config.app["app-settings"]["remember_mention_and_longtweet"]:
|
||||
self.message.long_tweet.SetValue(config.app["app-settings"]["longtweet"])
|
||||
widgetUtils.connect_event(self.message.translate, widgetUtils.BUTTON_PRESSED, self.translate)
|
||||
if hasattr(self.message, "add"):
|
||||
widgetUtils.connect_event(self.message.add, widgetUtils.BUTTON_PRESSED, self.on_attach)
|
||||
self.attachments = []
|
||||
|
||||
def translate(self, event=None):
|
||||
dlg = translator.gui.translateDialog()
|
||||
if dlg.get_response() == widgetUtils.OK:
|
||||
text_to_translate = self.message.get_text()
|
||||
text_to_translate = self.message.text.GetValue()
|
||||
language_dict = translator.translator.available_languages()
|
||||
for k in language_dict:
|
||||
if language_dict[k] == dlg.dest_lang.GetStringSelection():
|
||||
dst = k
|
||||
msg = translator.translator.translate(text=text_to_translate, target=dst)
|
||||
self.message.set_text(msg)
|
||||
self.message.text.ChangeValue(msg)
|
||||
self.message.text.SetInsertionPoint(len(self.message.text.GetValue()))
|
||||
self.text_processor()
|
||||
self.message.text_focus()
|
||||
self.message.text.SetFocus()
|
||||
output.speak(_(u"Translated"))
|
||||
else:
|
||||
return
|
||||
|
||||
def shorten(self, event=None):
|
||||
urls = utils.find_urls_in_text(self.message.get_text())
|
||||
if len(urls) == 0:
|
||||
output.speak(_(u"There's no URL to be shortened"))
|
||||
self.message.text_focus()
|
||||
elif len(urls) == 1:
|
||||
self.message.set_text(self.message.get_text().replace(urls[0], url_shortener.shorten(urls[0])))
|
||||
output.speak(_(u"URL shortened"))
|
||||
self.text_processor()
|
||||
self.message.text_focus()
|
||||
elif len(urls) > 1:
|
||||
list_urls = urlList.urlList()
|
||||
list_urls.populate_list(urls)
|
||||
if list_urls.get_response() == widgetUtils.OK:
|
||||
self.message.set_text(self.message.get_text().replace(urls[list_urls.get_item()], url_shortener.shorten(list_urls.get_string())))
|
||||
output.speak(_(u"URL shortened"))
|
||||
self.text_processor()
|
||||
self.message.text_focus()
|
||||
|
||||
def unshorten(self, event=None):
|
||||
urls = utils.find_urls_in_text(self.message.get_text())
|
||||
if len(urls) == 0:
|
||||
output.speak(_(u"There's no URL to be expanded"))
|
||||
self.message.text_focus()
|
||||
elif len(urls) == 1:
|
||||
self.message.set_text(self.message.get_text().replace(urls[0], url_shortener.unshorten(urls[0])))
|
||||
output.speak(_(u"URL expanded"))
|
||||
self.text_processor()
|
||||
self.message.text_focus()
|
||||
elif len(urls) > 1:
|
||||
list_urls = urlList.urlList()
|
||||
list_urls.populate_list(urls)
|
||||
if list_urls.get_response() == widgetUtils.OK:
|
||||
self.message.set_text(self.message.get_text().replace(urls[list_urls.get_item()], url_shortener.unshorten(list_urls.get_string())))
|
||||
output.speak(_(u"URL expanded"))
|
||||
self.text_processor()
|
||||
self.message.text_focus()
|
||||
|
||||
def text_processor(self, *args, **kwargs):
|
||||
if len(self.message.get_text()) > 1:
|
||||
self.message.enable_button("shortenButton")
|
||||
self.message.enable_button("unshortenButton")
|
||||
else:
|
||||
self.message.disable_button("shortenButton")
|
||||
self.message.disable_button("unshortenButton")
|
||||
if self.message.get("long_tweet") == False and hasattr(self, "max"):
|
||||
text = self.message.get_text()
|
||||
results = parse_tweet(text)
|
||||
self.message.set_title(_(u"%s - %s of %d characters") % (self.title, results.weightedLength, self.max))
|
||||
if results.weightedLength > self.max:
|
||||
self.session.sound.play("max_length.ogg")
|
||||
else:
|
||||
self.message.set_title(_(u"%s - %s characters") % (self.title, len(self.message.get_text())))
|
||||
text = self.message.text.GetValue()
|
||||
results = parse_tweet(text)
|
||||
self.message.SetTitle(_("%s - %s of %d characters") % (self.title, results.weightedLength, self.max))
|
||||
if results.weightedLength > self.max:
|
||||
self.session.sound.play("max_length.ogg")
|
||||
|
||||
def spellcheck(self, event=None):
|
||||
text = self.message.get_text()
|
||||
text = self.message.text.GetValue()
|
||||
checker = SpellChecker.spellchecker.spellChecker(text, "")
|
||||
if hasattr(checker, "fixed_text"):
|
||||
self.message.set_text(checker.fixed_text)
|
||||
self.message.text.ChangeValue(checker.fixed_text)
|
||||
self.text_processor()
|
||||
self.message.text_focus()
|
||||
self.message.text.SetFocus()
|
||||
|
||||
def attach(self, *args, **kwargs):
|
||||
def completed_callback(dlg):
|
||||
@@ -125,48 +71,170 @@ class basicTweet(object):
|
||||
pub.unsubscribe(dlg.uploaderDialog.update, "uploading")
|
||||
dlg.uploaderDialog.destroy()
|
||||
if "sndup.net/" in url:
|
||||
self.message.set_text(self.message.get_text()+url+" #audio")
|
||||
self.message.text.ChangeValue(self.message.text.GetValue()+url+" #audio")
|
||||
self.text_processor()
|
||||
else:
|
||||
commonMessageDialogs.common_error(url)
|
||||
|
||||
dlg.cleanup()
|
||||
dlg = audioUploader.audioUploader(self.session.settings, completed_callback)
|
||||
self.message.text_focus()
|
||||
self.message.text.SetFocus()
|
||||
|
||||
def can_attach(self):
|
||||
if len(self.attachments) == 0:
|
||||
return True
|
||||
elif len(self.attachments) == 1 and (self.attachments[0]["type"] == "video" or self.attachments[0]["type"] == "gif"):
|
||||
return False
|
||||
elif len(self.attachments) < 4:
|
||||
return True
|
||||
return False
|
||||
|
||||
def on_attach(self, *args, **kwargs):
|
||||
can_attach = self.can_attach()
|
||||
menu = self.message.attach_menu(can_attach)
|
||||
self.message.Bind(wx.EVT_MENU, self.on_attach_image, self.message.add_image)
|
||||
self.message.Bind(wx.EVT_MENU, self.on_attach_video, self.message.add_video)
|
||||
if hasattr(self.message, "add_poll"):
|
||||
self.message.Bind(wx.EVT_MENU, self.on_attach_poll, self.message.add_poll)
|
||||
self.message.PopupMenu(menu, self.message.add.GetPosition())
|
||||
|
||||
def on_attach_image(self, *args, **kwargs):
|
||||
can_attach = self.can_attach()
|
||||
video_or_gif_present = False
|
||||
for a in self.attachments:
|
||||
if a["type"] == "video" or a["type"] == "gif":
|
||||
video_or_gif = True
|
||||
break
|
||||
if can_attach == False or video_or_gif_present == True:
|
||||
return self.message.unable_to_attach_file()
|
||||
image, description = self.message.get_image()
|
||||
if image != None:
|
||||
if image.endswith("gif"):
|
||||
image_type = "gif"
|
||||
else:
|
||||
image_type = "photo"
|
||||
imageInfo = {"type": image_type, "file": image, "description": description}
|
||||
if len(self.attachments) > 0 and image_type == "gif":
|
||||
return self.message.unable_to_attach_file()
|
||||
self.attachments.append(imageInfo)
|
||||
self.message.add_item(item=[os.path.basename(imageInfo["file"]), imageInfo["type"], imageInfo["description"]])
|
||||
self.text_processor()
|
||||
|
||||
def on_attach_video(self, *args, **kwargs):
|
||||
if len(self.attachments) > 0:
|
||||
return self.message.unable_to_attach_file()
|
||||
video = self.message.get_video()
|
||||
if video != None:
|
||||
videoInfo = {"type": "video", "file": video, "description": ""}
|
||||
if len(self.attachments) > 0:
|
||||
return self.message.unable_to_attach_file()
|
||||
self.attachments.append(videoInfo)
|
||||
self.message.add_item(item=[os.path.basename(videoInfo["file"]), videoInfo["type"], videoInfo["description"]])
|
||||
self.text_processor()
|
||||
|
||||
def on_attach_poll(self, *args, **kwargs):
|
||||
dlg = twitterDialogs.poll()
|
||||
if dlg.ShowModal() == wx.ID_OK:
|
||||
self.poll_options = dlg.get_options()
|
||||
self.poll_period = 60*24*dlg.period.GetValue()
|
||||
dlg.Destroy()
|
||||
|
||||
def remove_attachment(self, *args, **kwargs):
|
||||
attachment = self.message.attachments.GetFocusedItem()
|
||||
if attachment > -1 and len(self.attachments) > attachment:
|
||||
self.attachments.pop(attachment)
|
||||
self.message.remove_item(list_type="attachment")
|
||||
self.text_processor()
|
||||
self.message.text.SetFocus()
|
||||
|
||||
class tweet(basicTweet):
|
||||
def __init__(self, session, title, caption, text, max=280, messageType="tweet", *args, **kwargs):
|
||||
def __init__(self, session, title, caption, text="", max=280, messageType="tweet", *args, **kwargs):
|
||||
self.thread = []
|
||||
self.poll_options = None
|
||||
self.poll_period = None
|
||||
super(tweet, self).__init__(session, title, caption, text, messageType, max, *args, **kwargs)
|
||||
self.image = None
|
||||
widgetUtils.connect_event(self.message.upload_image, widgetUtils.BUTTON_PRESSED, self.upload_image)
|
||||
widgetUtils.connect_event(self.message.autocompletionButton, widgetUtils.BUTTON_PRESSED, self.autocomplete_users)
|
||||
widgetUtils.connect_event(self.message.autocomplete_users, widgetUtils.BUTTON_PRESSED, self.autocomplete_users)
|
||||
if hasattr(self.message, "add_tweet"):
|
||||
widgetUtils.connect_event(self.message.add_tweet, widgetUtils.BUTTON_PRESSED, self.add_tweet)
|
||||
widgetUtils.connect_event(self.message.remove_tweet, widgetUtils.BUTTON_PRESSED, self.remove_tweet)
|
||||
widgetUtils.connect_event(self.message.remove_attachment, widgetUtils.BUTTON_PRESSED, self.remove_attachment)
|
||||
self.text_processor()
|
||||
|
||||
def upload_image(self, *args, **kwargs):
|
||||
a = attach.attach()
|
||||
if len(a.attachments) != 0:
|
||||
self.attachments = a.attachments
|
||||
|
||||
def autocomplete_users(self, *args, **kwargs):
|
||||
c = autocompletionUsers.completion.autocompletionUsers(self.message, self.session.session_id)
|
||||
c.show_menu()
|
||||
|
||||
def add_tweet(self, event, update_gui=True, *args, **kwargs):
|
||||
text = self.message.text.GetValue()
|
||||
attachments = self.attachments[::]
|
||||
tweetdata = dict(text=text, attachments=attachments, poll_options=self.poll_options, poll_period=self.poll_period)
|
||||
self.thread.append(tweetdata)
|
||||
self.attachments = []
|
||||
self.poll_options = None
|
||||
self.poll_period = None
|
||||
if update_gui:
|
||||
self.message.reset_controls()
|
||||
self.message.add_item(item=[text, len(attachments)], list_type="tweet")
|
||||
self.message.text.SetFocus()
|
||||
self.text_processor()
|
||||
|
||||
def get_tweet_data(self):
|
||||
self.add_tweet(event=None, update_gui=False)
|
||||
return self.thread
|
||||
|
||||
def text_processor(self, *args, **kwargs):
|
||||
super(tweet, self).text_processor(*args, **kwargs)
|
||||
if len(self.thread) > 0:
|
||||
self.message.tweets.Enable(True)
|
||||
self.message.remove_tweet.Enable(True)
|
||||
else:
|
||||
self.message.tweets.Enable(False)
|
||||
self.message.remove_tweet.Enable(False)
|
||||
if len(self.attachments) > 0:
|
||||
self.message.attachments.Enable(True)
|
||||
self.message.remove_attachment.Enable(True)
|
||||
else:
|
||||
self.message.attachments.Enable(False)
|
||||
self.message.remove_attachment.Enable(False)
|
||||
if hasattr(self.message, "add_tweet"):
|
||||
if len(self.message.text.GetValue()) > 0 or len(self.attachments) > 0:
|
||||
self.message.add_tweet.Enable(True)
|
||||
else:
|
||||
self.message.add_tweet.Enable(False)
|
||||
|
||||
def remove_tweet(self, *args, **kwargs):
|
||||
tweet = self.message.tweets.GetFocusedItem()
|
||||
if tweet > -1 and len(self.thread) > tweet:
|
||||
self.thread.pop(tweet)
|
||||
self.message.remove_item(list_type="tweet")
|
||||
self.text_processor()
|
||||
self.message.text.SetFocus()
|
||||
|
||||
|
||||
class reply(tweet):
|
||||
def __init__(self, session, title, caption, text, users=[], ids=[]):
|
||||
super(reply, self).__init__(session, title, caption, text, messageType="reply", users=users)
|
||||
self.ids = ids
|
||||
self.users = users
|
||||
if len(users) > 0:
|
||||
widgetUtils.connect_event(self.message.mentionAll, widgetUtils.CHECKBOX, self.mention_all)
|
||||
self.message.enable_button("mentionAll")
|
||||
widgetUtils.connect_event(self.message.mention_all, widgetUtils.CHECKBOX, self.mention_all)
|
||||
self.message.mention_all.Enable(True)
|
||||
if config.app["app-settings"]["remember_mention_and_longtweet"]:
|
||||
self.message.mentionAll.SetValue(config.app["app-settings"]["mention_all"])
|
||||
self.message.mention_all.SetValue(config.app["app-settings"]["mention_all"])
|
||||
self.mention_all()
|
||||
self.message.set_cursor_at_end()
|
||||
self.message.text.SetInsertionPoint(len(self.message.text.GetValue()))
|
||||
self.text_processor()
|
||||
|
||||
def text_processor(self, *args, **kwargs):
|
||||
super(tweet, self).text_processor(*args, **kwargs)
|
||||
if len(self.attachments) > 0:
|
||||
self.message.attachments.Enable(True)
|
||||
self.message.remove_attachment.Enable(True)
|
||||
else:
|
||||
self.message.attachments.Enable(False)
|
||||
self.message.remove_attachment.Enable(False)
|
||||
|
||||
def mention_all(self, *args, **kwargs):
|
||||
if self.message.mentionAll.GetValue() == True:
|
||||
if self.message.mention_all.GetValue() == True:
|
||||
for i in self.message.checkboxes:
|
||||
i.SetValue(True)
|
||||
i.Hide()
|
||||
@@ -176,10 +244,10 @@ class reply(tweet):
|
||||
i.Show()
|
||||
|
||||
def get_ids(self):
|
||||
excluded_ids = ""
|
||||
excluded_ids = []
|
||||
for i in range(0, len(self.message.checkboxes)):
|
||||
if self.message.checkboxes[i].GetValue() == False:
|
||||
excluded_ids = excluded_ids + "{0},".format(self.ids[i],)
|
||||
excluded_ids.append(self.ids[i])
|
||||
return excluded_ids
|
||||
|
||||
def get_people(self):
|
||||
@@ -190,20 +258,34 @@ class reply(tweet):
|
||||
return people
|
||||
|
||||
class dm(basicTweet):
|
||||
def __init__(self, session, title, caption, text):
|
||||
super(dm, self).__init__(session, title, caption, text, messageType="dm", max=10000)
|
||||
widgetUtils.connect_event(self.message.autocompletionButton, widgetUtils.BUTTON_PRESSED, self.autocomplete_users)
|
||||
def __init__(self, session, title, caption, users):
|
||||
super(dm, self).__init__(session, title, caption, messageType="dm", max=10000, users=users)
|
||||
widgetUtils.connect_event(self.message.autocomplete_users, widgetUtils.BUTTON_PRESSED, self.autocomplete_users)
|
||||
self.text_processor()
|
||||
widgetUtils.connect_event(self.message.cb, widgetUtils.ENTERED_TEXT, self.user_changed)
|
||||
|
||||
def user_changed(self, *args, **kwargs):
|
||||
self.title = _("Direct message to %s") % (self.message.get_user())
|
||||
self.title = _("Direct message to %s") % (self.message.cb.GetValue())
|
||||
self.text_processor()
|
||||
|
||||
def autocomplete_users(self, *args, **kwargs):
|
||||
c = autocompletionUsers.completion.autocompletionUsers(self.message, self.session.session_id)
|
||||
c.show_menu("dm")
|
||||
|
||||
def text_processor(self, *args, **kwargs):
|
||||
super(dm, self).text_processor(*args, **kwargs)
|
||||
if len(self.attachments) > 0:
|
||||
self.message.attachments.Enable(True)
|
||||
self.message.remove_attachment.Enable(True)
|
||||
else:
|
||||
self.message.attachments.Enable(False)
|
||||
self.message.remove_attachment.Enable(False)
|
||||
|
||||
def can_attach(self):
|
||||
if len(self.attachments) == 0:
|
||||
return True
|
||||
return False
|
||||
|
||||
class viewTweet(basicTweet):
|
||||
def __init__(self, tweet, tweetList, is_tweet=True, utc_offset=0, date="", item_url=""):
|
||||
""" This represents a tweet displayer. However it could be used for showing something wich is not a tweet, like a direct message or an event.
|
||||
@@ -264,29 +346,25 @@ class viewTweet(basicTweet):
|
||||
for z in tweet.retweeted_status.extended_entities["media"]:
|
||||
if "ext_alt_text" in z and z["ext_alt_text"] != None:
|
||||
image_description.append(z["ext_alt_text"])
|
||||
self.message = message.viewTweet(text, rt_count, favs_count, source, date)
|
||||
self.message = twitterDialogs.viewTweet(text, rt_count, favs_count, source, date)
|
||||
results = parse_tweet(text)
|
||||
self.message.set_title(results.weightedLength)
|
||||
[self.message.set_image_description(i) for i in image_description]
|
||||
else:
|
||||
self.title = _(u"View item")
|
||||
text = tweet
|
||||
self.message = message.viewNonTweet(text, date)
|
||||
self.message = twitterDialogs.viewNonTweet(text, date)
|
||||
widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck)
|
||||
if item_url != "":
|
||||
self.message.enable_button("share")
|
||||
widgetUtils.connect_event(self.message.share, widgetUtils.BUTTON_PRESSED, self.share)
|
||||
self.item_url = item_url
|
||||
widgetUtils.connect_event(self.message.translateButton, widgetUtils.BUTTON_PRESSED, self.translate)
|
||||
if self.contain_urls() == True:
|
||||
self.message.enable_button("unshortenButton")
|
||||
widgetUtils.connect_event(self.message.unshortenButton, widgetUtils.BUTTON_PRESSED, self.unshorten)
|
||||
self.message.get_response()
|
||||
self.message.ShowModal()
|
||||
|
||||
def contain_urls(self):
|
||||
if len(utils.find_urls_in_text(self.message.get_text())) > 0:
|
||||
return True
|
||||
return False
|
||||
# We won't need text_processor in this dialog, so let's avoid it.
|
||||
def text_processor(self):
|
||||
pass
|
||||
|
||||
def clear_text(self, text):
|
||||
urls = utils.find_urls_in_text(text)
|
||||
|
@@ -10,9 +10,9 @@ class autocompletionUsers(object):
|
||||
self.db = storage.storage(session_id)
|
||||
|
||||
def show_menu(self, mode="tweet"):
|
||||
position = self.window.get_position()
|
||||
position = self.window.text.GetInsertionPoint()
|
||||
if mode == "tweet":
|
||||
text = self.window.get_text()
|
||||
text = self.window.text.GetValue()
|
||||
text = text[:position]
|
||||
try:
|
||||
pattern = text.split()[-1]
|
||||
@@ -24,14 +24,14 @@ class autocompletionUsers(object):
|
||||
users = self.db.get_users(pattern[1:])
|
||||
if len(users) > 0:
|
||||
menu.append_options(users)
|
||||
self.window.popup_menu(menu)
|
||||
self.window.PopupMenu(menu, self.window.text.GetPosition())
|
||||
menu.destroy()
|
||||
else:
|
||||
output.speak(_(u"There are no results in your users database"))
|
||||
else:
|
||||
output.speak(_(u"Autocompletion only works for users."))
|
||||
elif mode == "dm":
|
||||
text = self.window.get_user()
|
||||
text = self.window.cb.GetValue()
|
||||
try:
|
||||
pattern = text.split()[-1]
|
||||
except IndexError:
|
||||
@@ -41,7 +41,7 @@ class autocompletionUsers(object):
|
||||
users = self.db.get_users(pattern)
|
||||
if len(users) > 0:
|
||||
menu.append_options(users)
|
||||
self.window.popup_menu(menu)
|
||||
self.window.PopupMenu(menu, self.window.text.GetPosition())
|
||||
menu.destroy()
|
||||
else:
|
||||
output.speak(_(u"There are no results in your users database"))
|
||||
|
Binary file not shown.
@@ -1,8 +1,8 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: TW Blue 0.94\n"
|
||||
"POT-Creation-Date: 2021-11-03 18:55+0100\n"
|
||||
"PO-Revision-Date: 2021-11-04 17:00+0100\n"
|
||||
"POT-Creation-Date: 2021-11-11 01:00+0100\n"
|
||||
"PO-Revision-Date: 2021-11-11 01:08+0100\n"
|
||||
"Last-Translator: Oreonan <corentin@progaccess.net>\n"
|
||||
"Language-Team: Oreonan <corentin@progaccess.net>\n"
|
||||
"Language: fr\n"
|
||||
@@ -16,10 +16,6 @@ msgstr ""
|
||||
"X-Poedit-SourceCharset: UTF-8\n"
|
||||
"X-Poedit-Bookmarks: -1,-1,-1,-1,-1,384,-1,-1,-1,-1\n"
|
||||
|
||||
#: ../src\controller\attach.py:25
|
||||
msgid "Photo"
|
||||
msgstr "Photo"
|
||||
|
||||
#: ../src\controller\buffers\base\base.py:91
|
||||
msgid "This action is not supported for this buffer"
|
||||
msgstr "Cette action n'est pas supportée pour ce tampon"
|
||||
@@ -98,78 +94,81 @@ msgstr "Abonnements de {username}"
|
||||
msgid "Unknown buffer"
|
||||
msgstr "Tampon inconnu"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:88
|
||||
#: ../src\controller\buffers\twitter\trends.py:122
|
||||
#: ../src\controller\messages.py:214 ../src\wxUI\buffers\base.py:25
|
||||
#: ../src\controller\buffers\twitter\base.py:87
|
||||
#: ../src\controller\buffers\twitter\trends.py:43
|
||||
#: ../src\controller\buffers\twitter\trends.py:134
|
||||
#: ../src\controller\messages.py:296 ../src\wxUI\buffers\base.py:25
|
||||
#: ../src\wxUI\buffers\events.py:15 ../src\wxUI\buffers\trends.py:18
|
||||
#: ../src\wxUI\dialogs\message.py:304 ../src\wxUI\sysTrayIcon.py:35
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:312
|
||||
#: ../src\wxUI\sysTrayIcon.py:35
|
||||
msgid "Tweet"
|
||||
msgstr "Tweet"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:89
|
||||
#: ../src\controller\buffers\twitter\trends.py:123
|
||||
#: ../src\controller\buffers\twitter\base.py:88
|
||||
#: ../src\controller\buffers\twitter\trends.py:44
|
||||
#: ../src\controller\buffers\twitter\trends.py:135
|
||||
msgid "Write the tweet here"
|
||||
msgstr "Écrivez le tweet ici"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:219
|
||||
#: ../src\controller\buffers\twitter\base.py:192
|
||||
msgid "New tweet in {0}"
|
||||
msgstr "Nouveau tweet dans {0}"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:222
|
||||
#: ../src\controller\buffers\twitter\base.py:195
|
||||
msgid "{0} new tweets in {1}."
|
||||
msgstr "{0} nouveau tweet dans {1}"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:261
|
||||
#: ../src\controller\buffers\twitter\base.py:234
|
||||
#: ../src\controller\buffers\twitter\directMessages.py:88
|
||||
#: ../src\controller\buffers\twitter\people.py:180
|
||||
#: ../src\controller\buffers\twitter\people.py:174
|
||||
msgid "%s items retrieved"
|
||||
msgstr "%s éléments récupérés"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:293
|
||||
#: ../src\controller\buffers\twitter\base.py:266
|
||||
#: ../src\controller\buffers\twitter\people.py:80
|
||||
msgid "This buffer is not a timeline; it can't be deleted."
|
||||
msgstr "Ce tampon n'est pas une chronologie ; Impossible de le supprimé."
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:430
|
||||
#: ../src\controller\buffers\twitter\base.py:402
|
||||
msgid "Reply to {arg0}"
|
||||
msgstr "Répondre à {arg0}"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:432
|
||||
#: ../src\controller\buffers\twitter\base.py:404
|
||||
#: ../src\keystrokeEditor\constants.py:11 ../src\wxUI\buffers\base.py:27
|
||||
msgid "Reply"
|
||||
msgstr "Répondre"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:433
|
||||
#: ../src\controller\buffers\twitter\base.py:405
|
||||
msgid "Reply to %s"
|
||||
msgstr "Répondre à %s"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:480
|
||||
#: ../src\controller\buffers\twitter\directMessages.py:130
|
||||
#: ../src\controller\buffers\twitter\base.py:428
|
||||
#: ../src\controller\buffers\twitter\directMessages.py:124
|
||||
msgid "New direct message"
|
||||
msgstr "Nouveau message"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:480
|
||||
#: ../src\controller\messages.py:200
|
||||
#: ../src\controller\buffers\twitter\base.py:428
|
||||
#: ../src\controller\messages.py:268
|
||||
msgid "Direct message to %s"
|
||||
msgstr "Message à %s"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:520
|
||||
#: ../src\controller\buffers\twitter\base.py:459
|
||||
msgid "Add your comment to the tweet"
|
||||
msgstr "Ajoutez votre commentaire pour le tweet"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:520
|
||||
#: ../src\controller\buffers\twitter\base.py:459
|
||||
msgid "Quote"
|
||||
msgstr "Citer"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:596
|
||||
#: ../src\controller\buffers\twitter\base.py:520
|
||||
msgid "Opening URL..."
|
||||
msgstr "Ouverture de l'URL..."
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:633
|
||||
#: ../src\controller\buffers\twitter\base.py:557
|
||||
msgid "User details"
|
||||
msgstr "Détails de l'utilisateur"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:654
|
||||
#: ../src\controller\buffers\twitter\base.py:578
|
||||
msgid "Opening item in web browser..."
|
||||
msgstr "Ouverture de l'élément dans le navigateur Web..."
|
||||
|
||||
@@ -184,15 +183,15 @@ msgstr "Mention pour %s"
|
||||
msgid "Mention"
|
||||
msgstr "Mention"
|
||||
|
||||
#: ../src\controller\buffers\twitter\directMessages.py:133
|
||||
#: ../src\controller\buffers\twitter\directMessages.py:127
|
||||
msgid "{0} new direct messages."
|
||||
msgstr "{0} nouveau message"
|
||||
|
||||
#: ../src\controller\buffers\twitter\directMessages.py:136
|
||||
#: ../src\controller\buffers\twitter\directMessages.py:130
|
||||
msgid "This action is not supported in the buffer yet."
|
||||
msgstr "Cette action n'est pas supportée dans le tampon actuel"
|
||||
|
||||
#: ../src\controller\buffers\twitter\directMessages.py:146
|
||||
#: ../src\controller\buffers\twitter\directMessages.py:140
|
||||
msgid ""
|
||||
"Getting more items cannot be done in this buffer. Use the direct messages "
|
||||
"buffer instead."
|
||||
@@ -200,11 +199,11 @@ msgstr ""
|
||||
"Récupérer plus d'élément est impossible dans ce tampon, utilisez le tampon "
|
||||
"des messages à la place."
|
||||
|
||||
#: ../src\controller\buffers\twitter\people.py:253
|
||||
#: ../src\controller\buffers\twitter\people.py:247
|
||||
msgid "{0} new followers."
|
||||
msgstr "{0} nouvel abonné"
|
||||
|
||||
#: ../src\controller\buffers\twitter\trends.py:146
|
||||
#: ../src\controller\buffers\twitter\trends.py:150
|
||||
msgid "This action is not supported in the buffer, yet."
|
||||
msgstr "Cette action n'est pas supportée pour le tampon actuel"
|
||||
|
||||
@@ -222,7 +221,7 @@ msgstr "Chronologies"
|
||||
|
||||
#: ../src\controller\mainController.py:359
|
||||
#: ../src\controller\mainController.py:883
|
||||
#: ../src\controller\mainController.py:1585
|
||||
#: ../src\controller\mainController.py:1582
|
||||
msgid "Timeline for {}"
|
||||
msgstr "Chronologie de {}"
|
||||
|
||||
@@ -232,7 +231,7 @@ msgstr "Chronologies des favoris"
|
||||
|
||||
#: ../src\controller\mainController.py:363
|
||||
#: ../src\controller\mainController.py:902
|
||||
#: ../src\controller\mainController.py:1587
|
||||
#: ../src\controller\mainController.py:1584
|
||||
msgid "Likes for {}"
|
||||
msgstr "Favoris de {}"
|
||||
|
||||
@@ -242,7 +241,7 @@ msgstr "Chronologies des abonnés"
|
||||
|
||||
#: ../src\controller\mainController.py:367
|
||||
#: ../src\controller\mainController.py:921
|
||||
#: ../src\controller\mainController.py:1589
|
||||
#: ../src\controller\mainController.py:1586
|
||||
msgid "Followers for {}"
|
||||
msgstr "Abonnés de {}"
|
||||
|
||||
@@ -252,7 +251,7 @@ msgstr "Chronologies des abonnements"
|
||||
|
||||
#: ../src\controller\mainController.py:371
|
||||
#: ../src\controller\mainController.py:940
|
||||
#: ../src\controller\mainController.py:1591
|
||||
#: ../src\controller\mainController.py:1588
|
||||
msgid "Friends for {}"
|
||||
msgstr "Abonnements de {}"
|
||||
|
||||
@@ -277,7 +276,7 @@ msgstr "Recherche de {}"
|
||||
|
||||
#: ../src\controller\mainController.py:381
|
||||
#: ../src\controller\mainController.py:982
|
||||
#: ../src\controller\mainController.py:1593
|
||||
#: ../src\controller\mainController.py:1590
|
||||
msgid "Trending topics for %s"
|
||||
msgstr "Tendances pour %s"
|
||||
|
||||
@@ -320,7 +319,7 @@ msgstr "Ajoute un alias pour l'utilisateur"
|
||||
msgid "Alias has been set correctly for {}."
|
||||
msgstr "L'alias pour {} a correctement été définie"
|
||||
|
||||
#: ../src\controller\mainController.py:829 ../src\controller\messages.py:245
|
||||
#: ../src\controller\mainController.py:829 ../src\controller\messages.py:327
|
||||
msgid "MMM D, YYYY. H:m"
|
||||
msgstr "D MMM YYYY à H:m"
|
||||
|
||||
@@ -410,72 +409,52 @@ msgstr "Tampon muet"
|
||||
msgid "Buffer mute off"
|
||||
msgstr "Tampon non muet"
|
||||
|
||||
#: ../src\controller\mainController.py:1545
|
||||
#: ../src\controller\mainController.py:1542
|
||||
msgid "Copied"
|
||||
msgstr "Copié"
|
||||
|
||||
#: ../src\controller\mainController.py:1575
|
||||
#: ../src\controller\mainController.py:1572
|
||||
msgid "Unable to update this buffer."
|
||||
msgstr "Impossible de mettre à jour ce tampon."
|
||||
|
||||
#: ../src\controller\mainController.py:1578
|
||||
#: ../src\controller\mainController.py:1575
|
||||
msgid "Updating buffer..."
|
||||
msgstr "Actualisation..."
|
||||
|
||||
#: ../src\controller\mainController.py:1581
|
||||
#: ../src\controller\mainController.py:1578
|
||||
msgid "{0} items retrieved"
|
||||
msgstr "{0} éléments récupérés"
|
||||
|
||||
#: ../src\controller\mainController.py:1600
|
||||
#: ../src\controller\mainController.py:1620
|
||||
#: ../src\controller\mainController.py:1597
|
||||
#: ../src\controller\mainController.py:1617
|
||||
msgid "Invalid buffer"
|
||||
msgstr "Tampon invalide"
|
||||
|
||||
#: ../src\controller\mainController.py:1611
|
||||
#: ../src\controller\mainController.py:1608
|
||||
msgid "Picture {0}"
|
||||
msgstr "Photo {0}"
|
||||
|
||||
#: ../src\controller\mainController.py:1612
|
||||
#: ../src\controller\mainController.py:1609
|
||||
msgid "Select the picture"
|
||||
msgstr "Sélectionner la photo"
|
||||
|
||||
#: ../src\controller\mainController.py:1631
|
||||
#: ../src\controller\mainController.py:1628
|
||||
msgid "Unable to extract text"
|
||||
msgstr "Impossible d'extraire le texte"
|
||||
|
||||
#: ../src\controller\messages.py:56
|
||||
#: ../src\controller\messages.py:49
|
||||
msgid "Translated"
|
||||
msgstr "Traduit"
|
||||
|
||||
#: ../src\controller\messages.py:63
|
||||
msgid "There's no URL to be shortened"
|
||||
msgstr "Aucune URL à réduire"
|
||||
|
||||
#: ../src\controller\messages.py:67 ../src\controller\messages.py:75
|
||||
msgid "URL shortened"
|
||||
msgstr "URL réduite"
|
||||
|
||||
#: ../src\controller\messages.py:82
|
||||
msgid "There's no URL to be expanded"
|
||||
msgstr "Aucune URL à élargir"
|
||||
|
||||
#: ../src\controller\messages.py:86 ../src\controller\messages.py:94
|
||||
msgid "URL expanded"
|
||||
msgstr "URL élargi"
|
||||
|
||||
#: ../src\controller\messages.py:108
|
||||
#: ../src\controller\messages.py:56
|
||||
msgid "%s - %s of %d characters"
|
||||
msgstr "%s - %s/%d caractères"
|
||||
|
||||
#: ../src\controller\messages.py:112
|
||||
msgid "%s - %s characters"
|
||||
msgstr "%s - %s caractères"
|
||||
|
||||
#: ../src\controller\messages.py:272
|
||||
#: ../src\controller\messages.py:354
|
||||
msgid "View item"
|
||||
msgstr "Voir l'élément"
|
||||
|
||||
#: ../src\controller\messages.py:301
|
||||
#: ../src\controller\messages.py:379
|
||||
msgid "Link copied to clipboard."
|
||||
msgstr "Lien copié dans le Presse-papiers"
|
||||
|
||||
@@ -666,7 +645,7 @@ msgstr "Arrêté"
|
||||
msgid "&Record"
|
||||
msgstr "&Enregistrer"
|
||||
|
||||
#: ../src\extra\AudioUploader\audioUploader.py:136 ../src\sound.py:148
|
||||
#: ../src\extra\AudioUploader\audioUploader.py:136 ../src\sound.py:147
|
||||
msgid "Playing..."
|
||||
msgstr "Lecture..."
|
||||
|
||||
@@ -718,6 +697,9 @@ msgid "%s seconds"
|
||||
msgstr "%s secondes"
|
||||
|
||||
#: ../src\extra\AudioUploader\wx_transfer_dialogs.py:15
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:36
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:173
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:258
|
||||
msgid "File"
|
||||
msgstr "Fichier"
|
||||
|
||||
@@ -1563,7 +1545,7 @@ msgid "New tweet"
|
||||
msgstr "Nouveau tweet"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:12 ../src\wxUI\buffers\base.py:26
|
||||
#: ../src\wxUI\commonMessageDialogs.py:10 ../src\wxUI\dialogs\message.py:126
|
||||
#: ../src\wxUI\commonMessageDialogs.py:10
|
||||
msgid "Retweet"
|
||||
msgstr "Retweet"
|
||||
|
||||
@@ -2009,15 +1991,17 @@ msgid "public"
|
||||
msgstr "public"
|
||||
|
||||
#: ../src\sessions\twitter\session.py:211
|
||||
#: ../src\sessions\twitter\session.py:238
|
||||
msgid "%s failed. Reason: %s"
|
||||
msgstr "%s erreur. Raison: %s"
|
||||
|
||||
#: ../src\sessions\twitter\session.py:217
|
||||
#: ../src\sessions\twitter\session.py:241
|
||||
msgid "%s succeeded."
|
||||
msgstr "%s réussi."
|
||||
|
||||
#: ../src\sessions\twitter\session.py:426
|
||||
#: ../src\sessions\twitter\session.py:504
|
||||
#: ../src\sessions\twitter\session.py:450
|
||||
#: ../src\sessions\twitter\session.py:528
|
||||
msgid "Deleted account"
|
||||
msgstr "Compte supprimé"
|
||||
|
||||
@@ -2045,7 +2029,7 @@ msgstr "Compte en cours d'autorisation..."
|
||||
msgid "Enter your PIN code here"
|
||||
msgstr "Entrer votre code PIN ici"
|
||||
|
||||
#: ../src\sound.py:161
|
||||
#: ../src\sound.py:160
|
||||
msgid "Stopped."
|
||||
msgstr "Arrêté."
|
||||
|
||||
@@ -2099,10 +2083,6 @@ msgstr ""
|
||||
msgid "Client"
|
||||
msgstr "Client"
|
||||
|
||||
#: ../src\wxUI\buffers\base.py:12
|
||||
msgid "Text"
|
||||
msgstr "Texte"
|
||||
|
||||
#: ../src\wxUI\buffers\base.py:12 ../src\wxUI\buffers\events.py:14
|
||||
msgid "Date"
|
||||
msgstr "Date"
|
||||
@@ -2114,6 +2094,11 @@ msgstr "Date"
|
||||
msgid "User"
|
||||
msgstr "Utilisateur"
|
||||
|
||||
#: ../src\wxUI\buffers\base.py:12
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:48
|
||||
msgid "Text"
|
||||
msgstr "Texte"
|
||||
|
||||
#: ../src\wxUI\buffers\base.py:28
|
||||
msgid "Direct message"
|
||||
msgstr "Message"
|
||||
@@ -2375,55 +2360,6 @@ msgstr ""
|
||||
"{0} a été quitté inopinément lors de sa dernière exécution. Si ce problème "
|
||||
"perciste, veuillez le signaler aux développeurs de {0}."
|
||||
|
||||
#: ../src\wxUI\dialogs\attach.py:10
|
||||
msgid "Add an attachment"
|
||||
msgstr "Ajouter un fichier"
|
||||
|
||||
#: ../src\wxUI\dialogs\attach.py:13
|
||||
msgid "Attachments"
|
||||
msgstr "Fichiers joints"
|
||||
|
||||
#: ../src\wxUI\dialogs\attach.py:14
|
||||
msgid "Title"
|
||||
msgstr "Titre"
|
||||
|
||||
#: ../src\wxUI\dialogs\attach.py:14
|
||||
msgid "Type"
|
||||
msgstr "Type"
|
||||
|
||||
#: ../src\wxUI\dialogs\attach.py:19
|
||||
msgid "Add attachments"
|
||||
msgstr "Joindre des fichiers"
|
||||
|
||||
#: ../src\wxUI\dialogs\attach.py:20
|
||||
msgid "&Photo"
|
||||
msgstr "&Image"
|
||||
|
||||
#: ../src\wxUI\dialogs\attach.py:21
|
||||
msgid "Remove attachment"
|
||||
msgstr "Supprimer le fichier joint"
|
||||
|
||||
#: ../src\wxUI\dialogs\attach.py:37 ../src\wxUI\dialogs\message.py:116
|
||||
#: ../src\wxUI\dialogs\message.py:175 ../src\wxUI\dialogs\message.py:235
|
||||
#: ../src\wxUI\dialogs\update_profile.py:82
|
||||
msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"
|
||||
msgstr "Fichiers image (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"
|
||||
|
||||
#: ../src\wxUI\dialogs\attach.py:37 ../src\wxUI\dialogs\message.py:116
|
||||
#: ../src\wxUI\dialogs\message.py:175 ../src\wxUI\dialogs\message.py:235
|
||||
#: ../src\wxUI\dialogs\update_profile.py:82
|
||||
msgid "Select the picture to be uploaded"
|
||||
msgstr "Sélectionnez la photo à charger"
|
||||
|
||||
#: ../src\wxUI\dialogs\attach.py:44
|
||||
msgid "please provide a description"
|
||||
msgstr "Veuillez fournir une description"
|
||||
|
||||
#: ../src\wxUI\dialogs\attach.py:44 ../src\wxUI\dialogs\lists.py:14
|
||||
#: ../src\wxUI\dialogs\lists.py:70
|
||||
msgid "Description"
|
||||
msgstr "Description"
|
||||
|
||||
#: ../src\wxUI\dialogs\configuration.py:15
|
||||
msgid "Language"
|
||||
msgstr "Langue"
|
||||
@@ -2811,6 +2747,14 @@ msgstr "Propriétaire"
|
||||
msgid "mode"
|
||||
msgstr "mode"
|
||||
|
||||
#: ../src\wxUI\dialogs\lists.py:14 ../src\wxUI\dialogs\lists.py:70
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:38
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:127
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:175
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:260
|
||||
msgid "Description"
|
||||
msgstr "Description"
|
||||
|
||||
#: ../src\wxUI\dialogs\lists.py:19 ../src\wxUI\dialogs\lists.py:62
|
||||
msgid "Create a new list"
|
||||
msgstr "Créer une nouvelle liste"
|
||||
@@ -2867,103 +2811,6 @@ msgstr "Sélectionnez une liste pour supprimer l'utilisateur"
|
||||
msgid "Do you really want to delete this list?"
|
||||
msgstr "Voulez-vous vraiment supprimer cette liste ?"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:73 ../src\wxUI\dialogs\message.py:254
|
||||
msgid "&Long tweet"
|
||||
msgstr "&Tweet long"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:74 ../src\wxUI\dialogs\message.py:133
|
||||
#: ../src\wxUI\dialogs\message.py:255
|
||||
msgid "&Upload image..."
|
||||
msgstr "&Joindre une image..."
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:75 ../src\wxUI\dialogs\message.py:134
|
||||
#: ../src\wxUI\dialogs\message.py:194 ../src\wxUI\dialogs\message.py:256
|
||||
#: ../src\wxUI\dialogs\message.py:359 ../src\wxUI\dialogs\message.py:435
|
||||
msgid "Check &spelling..."
|
||||
msgstr "Correction &orthographique..."
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:76 ../src\wxUI\dialogs\message.py:135
|
||||
#: ../src\wxUI\dialogs\message.py:195 ../src\wxUI\dialogs\message.py:257
|
||||
msgid "&Attach audio..."
|
||||
msgstr "&Joindre un audio..."
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:77 ../src\wxUI\dialogs\message.py:136
|
||||
#: ../src\wxUI\dialogs\message.py:196 ../src\wxUI\dialogs\message.py:258
|
||||
msgid "Sh&orten URL"
|
||||
msgstr "&Réduire URL"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:78 ../src\wxUI\dialogs\message.py:137
|
||||
#: ../src\wxUI\dialogs\message.py:197 ../src\wxUI\dialogs\message.py:259
|
||||
#: ../src\wxUI\dialogs\message.py:360 ../src\wxUI\dialogs\message.py:436
|
||||
msgid "&Expand URL"
|
||||
msgstr "&Élargir URL"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:81 ../src\wxUI\dialogs\message.py:140
|
||||
#: ../src\wxUI\dialogs\message.py:200 ../src\wxUI\dialogs\message.py:262
|
||||
#: ../src\wxUI\dialogs\message.py:362 ../src\wxUI\dialogs\message.py:438
|
||||
msgid "&Translate..."
|
||||
msgstr "&Traduire..."
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:82 ../src\wxUI\dialogs\message.py:141
|
||||
#: ../src\wxUI\dialogs\message.py:186 ../src\wxUI\dialogs\message.py:263
|
||||
msgid "Auto&complete users"
|
||||
msgstr "Sai&sie automatique utilisateurs"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:83 ../src\wxUI\dialogs\message.py:142
|
||||
#: ../src\wxUI\dialogs\message.py:201 ../src\wxUI\dialogs\message.py:264
|
||||
msgid "Sen&d"
|
||||
msgstr "Envoye&r"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:85 ../src\wxUI\dialogs\message.py:144
|
||||
#: ../src\wxUI\dialogs\message.py:203 ../src\wxUI\dialogs\message.py:266
|
||||
#: ../src\wxUI\dialogs\message.py:363 ../src\wxUI\dialogs\message.py:439
|
||||
msgid "C&lose"
|
||||
msgstr "F&ermer"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:184
|
||||
msgid "&Recipient"
|
||||
msgstr "&Destinataire"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:245
|
||||
msgid "&Mention to all"
|
||||
msgstr "&Répondre à tout le monde"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:299
|
||||
msgid "Tweet - %i characters "
|
||||
msgstr "Tweet - %i caractères "
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:316
|
||||
msgid "Image description"
|
||||
msgstr "Description de l'image"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:327
|
||||
msgid "Retweets: "
|
||||
msgstr "Retweets: "
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:332
|
||||
msgid "Likes: "
|
||||
msgstr "Favoris: "
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:337
|
||||
msgid "Source: "
|
||||
msgstr "Source: "
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:342 ../src\wxUI\dialogs\message.py:423
|
||||
msgid "Date: "
|
||||
msgstr "Date: "
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:357 ../src\wxUI\dialogs\message.py:433
|
||||
msgid "Copy link to clipboard"
|
||||
msgstr "Copier le lien dans le Presse-papiers"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:408
|
||||
msgid "View"
|
||||
msgstr "Voir"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:410
|
||||
msgid "Item"
|
||||
msgstr "Élément"
|
||||
|
||||
#: ../src\wxUI\dialogs\search.py:12
|
||||
msgid "Search on Twitter"
|
||||
msgstr "Rechercher sur Twitter"
|
||||
@@ -3045,6 +2892,225 @@ msgstr "Ville"
|
||||
msgid "&Location"
|
||||
msgstr "&Localisation"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:33
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:49
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:170
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:255
|
||||
msgid "Attachments"
|
||||
msgstr "Fichiers joints"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:37
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:174
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:259
|
||||
msgid "Type"
|
||||
msgstr "Type"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:40
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:177
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:262
|
||||
msgid "Delete attachment"
|
||||
msgstr "Supprimer la pièce jointe"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:45
|
||||
msgid "Added Tweets"
|
||||
msgstr "Tweets ajoutés"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:52
|
||||
msgid "Delete tweet"
|
||||
msgstr "Supprimer le tweet"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:57
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:192
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:267
|
||||
msgid "A&dd..."
|
||||
msgstr "&Ajouter"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:59
|
||||
msgid "Add t&weet"
|
||||
msgstr "A&jouter un tweet"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:62
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:194
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:269
|
||||
msgid "&Attach audio..."
|
||||
msgstr "&Joindre un audio..."
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:66
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:198
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:237
|
||||
msgid "Auto&complete users"
|
||||
msgstr "Sai&sie automatique utilisateurs"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:68
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:200
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:273
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:367
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:440
|
||||
msgid "Check &spelling..."
|
||||
msgstr "Correction &orthographique..."
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:70
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:202
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:275
|
||||
msgid "&Translate"
|
||||
msgstr "&Traduire"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:74
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:206
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:279
|
||||
msgid "Sen&d"
|
||||
msgstr "Envoye&r"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:118
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:220
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:299
|
||||
msgid "Image"
|
||||
msgstr "Image"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:120
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:222
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:301
|
||||
msgid "Video"
|
||||
msgstr "Vidéo"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:122
|
||||
msgid "Poll"
|
||||
msgstr "Sondage"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:127
|
||||
msgid "please provide a description"
|
||||
msgstr "Veuillez fournir une description"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:134
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:292
|
||||
#: ../src\wxUI\dialogs\update_profile.py:82
|
||||
msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"
|
||||
msgstr "Fichiers image (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:134
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:292
|
||||
#: ../src\wxUI\dialogs\update_profile.py:82
|
||||
msgid "Select the picture to be uploaded"
|
||||
msgstr "Sélectionnez la photo à charger"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:141
|
||||
msgid "Select the video to be uploaded"
|
||||
msgstr "Sélectionnez la vidéo à téléverser"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:141
|
||||
msgid "Video files (*.mp4)|*.mp4"
|
||||
msgstr "Fichiers vidéo (*.mp4)|*.mp4"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:147
|
||||
msgid "Error adding attachment"
|
||||
msgstr "Erreur à l'ajout de la pièce jointe"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:147
|
||||
msgid ""
|
||||
"It is not possible to add more attachments. Please make sure your tweet "
|
||||
"complies with Twitter'S attachment rules. You can add only one video or GIF "
|
||||
"in every tweet, and a maximum of 4 photos."
|
||||
msgstr ""
|
||||
"Il est impossible de joindre plus de contenu. Assurez-vous que votre tweet "
|
||||
"respecte les règles d'attachement de Twitter. Vous pouvez seulement inclure "
|
||||
"une vidéo ou un GIF par tweet, et 4 photos au maximum."
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:182
|
||||
msgid "&Mention to all"
|
||||
msgstr "&Répondre à tout le monde"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:235
|
||||
msgid "&Recipient"
|
||||
msgstr "&Destinataire"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:307
|
||||
msgid "Tweet - %i characters "
|
||||
msgstr "Tweet - %i caractères "
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:324
|
||||
msgid "Image description"
|
||||
msgstr "Description de l'image"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:335
|
||||
msgid "Retweets: "
|
||||
msgstr "Retweets: "
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:340
|
||||
msgid "Likes: "
|
||||
msgstr "Favoris: "
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:345
|
||||
msgid "Source: "
|
||||
msgstr "Source: "
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:350
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:428
|
||||
msgid "Date: "
|
||||
msgstr "Date: "
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:365
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:438
|
||||
msgid "Copy link to clipboard"
|
||||
msgstr "Copier le lien dans le Presse-papiers"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:368
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:443
|
||||
msgid "&Translate..."
|
||||
msgstr "&Traduire..."
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:369
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:444
|
||||
msgid "C&lose"
|
||||
msgstr "F&ermer"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:413
|
||||
msgid "View"
|
||||
msgstr "Voir"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:415
|
||||
msgid "Item"
|
||||
msgstr "Élément"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:441
|
||||
msgid "&Expand URL"
|
||||
msgstr "&Élargir URL"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:480
|
||||
msgid "Add a poll"
|
||||
msgstr "Ajouter un sondage"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:484
|
||||
msgid "Participation time (in days)"
|
||||
msgstr "Temps de participation (en jours)"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:491
|
||||
msgid "Choices"
|
||||
msgstr "Choix"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:495
|
||||
msgid "Option 1"
|
||||
msgstr "Option 1"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:501
|
||||
msgid "Option 2"
|
||||
msgstr "Option 2"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:507
|
||||
msgid "Option 3"
|
||||
msgstr "Option 3"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:513
|
||||
msgid "Option 4"
|
||||
msgstr "Option 4"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:540
|
||||
msgid "Not enough information"
|
||||
msgstr "Pas assez d'informations"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:540
|
||||
msgid "Please make sure you have provided at least two options for the poll."
|
||||
msgstr "Assurez-vous d'avoir spécifier au moins 2 options pour le sondage."
|
||||
|
||||
#: ../src\wxUI\dialogs\update_profile.py:10
|
||||
msgid "Update your profile"
|
||||
msgstr "Actualiser votre profil"
|
||||
|
Binary file not shown.
@@ -5,8 +5,8 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: TwBlue 0.80\n"
|
||||
"POT-Creation-Date: 2021-10-28 16:43+Central Europe Daylight Time\n"
|
||||
"PO-Revision-Date: 2021-10-28 17:03+0100\n"
|
||||
"POT-Creation-Date: 2021-11-11 01:16+0100\n"
|
||||
"PO-Revision-Date: 2021-11-11 01:30+0100\n"
|
||||
"Last-Translator: Nikola Jović <wwenikola123@gmail.com>\n"
|
||||
"Language-Team: Aleksandar Đurić <agasoft@gmail.com>\n"
|
||||
"Language: sr_RS@latin\n"
|
||||
@@ -18,10 +18,6 @@ msgstr ""
|
||||
"X-Poedit-Bookmarks: -1,442,-1,-1,-1,-1,-1,-1,-1,-1\n"
|
||||
"X-Poedit-SourceCharset: UTF-8\n"
|
||||
|
||||
#: ../src\controller\attach.py:25
|
||||
msgid "Photo"
|
||||
msgstr "Slika"
|
||||
|
||||
#: ../src\controller\buffers\base\base.py:91
|
||||
msgid "This action is not supported for this buffer"
|
||||
msgstr "Ova radnja nije podržana na ovom kanalu"
|
||||
@@ -100,101 +96,104 @@ msgstr "Prijatelji korisnika {username}"
|
||||
msgid "Unknown buffer"
|
||||
msgstr "Nepoznat kanal"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:88
|
||||
#: ../src\controller\buffers\twitter\trends.py:121
|
||||
#: ../src\controller\messages.py:214 ../src\wxUI\buffers\base.py:25
|
||||
#: ../src\controller\buffers\twitter\base.py:87
|
||||
#: ../src\controller\buffers\twitter\trends.py:43
|
||||
#: ../src\controller\buffers\twitter\trends.py:134
|
||||
#: ../src\controller\messages.py:296 ../src\wxUI\buffers\base.py:25
|
||||
#: ../src\wxUI\buffers\events.py:15 ../src\wxUI\buffers\trends.py:18
|
||||
#: ../src\wxUI\dialogs\message.py:304 ../src\wxUI\sysTrayIcon.py:35
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:312
|
||||
#: ../src\wxUI\sysTrayIcon.py:35
|
||||
msgid "Tweet"
|
||||
msgstr "Tvit"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:89
|
||||
#: ../src\controller\buffers\twitter\trends.py:122
|
||||
#: ../src\controller\buffers\twitter\base.py:88
|
||||
#: ../src\controller\buffers\twitter\trends.py:44
|
||||
#: ../src\controller\buffers\twitter\trends.py:135
|
||||
msgid "Write the tweet here"
|
||||
msgstr "Otkucajte tvit ovde:"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:219
|
||||
#: ../src\controller\buffers\twitter\base.py:192
|
||||
msgid "New tweet in {0}"
|
||||
msgstr "Novi tvit u kanalu {0}"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:222
|
||||
#: ../src\controller\buffers\twitter\base.py:195
|
||||
msgid "{0} new tweets in {1}."
|
||||
msgstr "{0} novih tvitova u kanalu {1}."
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:261
|
||||
#: ../src\controller\buffers\twitter\directMessages.py:87
|
||||
#: ../src\controller\buffers\twitter\people.py:180
|
||||
#: ../src\controller\buffers\twitter\base.py:234
|
||||
#: ../src\controller\buffers\twitter\directMessages.py:88
|
||||
#: ../src\controller\buffers\twitter\people.py:174
|
||||
msgid "%s items retrieved"
|
||||
msgstr "%s primljenih stavki"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:293
|
||||
#: ../src\controller\buffers\twitter\base.py:266
|
||||
#: ../src\controller\buffers\twitter\people.py:80
|
||||
msgid "This buffer is not a timeline; it can't be deleted."
|
||||
msgstr "Ovaj kanal nije vremenska linija i ne može biti izbrisan."
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:430
|
||||
#: ../src\controller\buffers\twitter\base.py:402
|
||||
msgid "Reply to {arg0}"
|
||||
msgstr "Odgovori {arg0}"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:432
|
||||
#: ../src\controller\buffers\twitter\base.py:404
|
||||
#: ../src\keystrokeEditor\constants.py:11 ../src\wxUI\buffers\base.py:27
|
||||
msgid "Reply"
|
||||
msgstr "Odgovori"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:433
|
||||
#: ../src\controller\buffers\twitter\base.py:405
|
||||
msgid "Reply to %s"
|
||||
msgstr "Odgovori %s"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:480
|
||||
#: ../src\controller\buffers\twitter\directMessages.py:129
|
||||
#: ../src\controller\buffers\twitter\base.py:428
|
||||
#: ../src\controller\buffers\twitter\directMessages.py:124
|
||||
msgid "New direct message"
|
||||
msgstr "Nova direktna poruka"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:480
|
||||
#: ../src\controller\messages.py:200
|
||||
#: ../src\controller\buffers\twitter\base.py:428
|
||||
#: ../src\controller\messages.py:268
|
||||
msgid "Direct message to %s"
|
||||
msgstr "Direktna poruka za %s"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:520
|
||||
#: ../src\controller\buffers\twitter\base.py:459
|
||||
msgid "Add your comment to the tweet"
|
||||
msgstr "Dodajte vaš komentar u tvit"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:520
|
||||
#: ../src\controller\buffers\twitter\base.py:459
|
||||
msgid "Quote"
|
||||
msgstr "Citiraj"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:596
|
||||
#: ../src\controller\buffers\twitter\base.py:520
|
||||
msgid "Opening URL..."
|
||||
msgstr "Otvaram vezu..."
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:633
|
||||
#: ../src\controller\buffers\twitter\base.py:557
|
||||
msgid "User details"
|
||||
msgstr "Podaci o korisniku"
|
||||
|
||||
#: ../src\controller\buffers\twitter\base.py:654
|
||||
#: ../src\controller\buffers\twitter\base.py:578
|
||||
msgid "Opening item in web browser..."
|
||||
msgstr "Otvaram stavku u Web pretraživaču..."
|
||||
|
||||
#: ../src\controller\buffers\twitter\directMessages.py:92
|
||||
#: ../src\controller\buffers\twitter\directMessages.py:93
|
||||
#: ../src\controller\buffers\twitter\people.py:95
|
||||
msgid "Mention to %s"
|
||||
msgstr "Spomeni %s"
|
||||
|
||||
#: ../src\controller\buffers\twitter\directMessages.py:92
|
||||
#: ../src\controller\buffers\twitter\directMessages.py:93
|
||||
#: ../src\controller\buffers\twitter\people.py:95
|
||||
#: ../src\wxUI\buffers\people.py:17
|
||||
msgid "Mention"
|
||||
msgstr "Spomeni"
|
||||
|
||||
#: ../src\controller\buffers\twitter\directMessages.py:132
|
||||
#: ../src\controller\buffers\twitter\directMessages.py:127
|
||||
msgid "{0} new direct messages."
|
||||
msgstr "{0} novih direktnih poruka."
|
||||
|
||||
#: ../src\controller\buffers\twitter\directMessages.py:135
|
||||
#: ../src\controller\buffers\twitter\directMessages.py:130
|
||||
msgid "This action is not supported in the buffer yet."
|
||||
msgstr "Ova radnja još uvek nije podržana na ovom kanalu."
|
||||
|
||||
#: ../src\controller\buffers\twitter\directMessages.py:145
|
||||
#: ../src\controller\buffers\twitter\directMessages.py:140
|
||||
msgid ""
|
||||
"Getting more items cannot be done in this buffer. Use the direct messages "
|
||||
"buffer instead."
|
||||
@@ -202,11 +201,11 @@ msgstr ""
|
||||
"Nemoguće preuzeti dodatne stavke za ovaj kanal. Umesto toga, koristite kanal "
|
||||
"direktne poruke."
|
||||
|
||||
#: ../src\controller\buffers\twitter\people.py:253
|
||||
#: ../src\controller\buffers\twitter\people.py:247
|
||||
msgid "{0} new followers."
|
||||
msgstr "{0} novih pratilaca."
|
||||
|
||||
#: ../src\controller\buffers\twitter\trends.py:145
|
||||
#: ../src\controller\buffers\twitter\trends.py:150
|
||||
msgid "This action is not supported in the buffer, yet."
|
||||
msgstr "Ova radnja još uvek nije podržana na ovom kanalu"
|
||||
|
||||
@@ -224,7 +223,7 @@ msgstr "Vremenske linije"
|
||||
|
||||
#: ../src\controller\mainController.py:359
|
||||
#: ../src\controller\mainController.py:883
|
||||
#: ../src\controller\mainController.py:1585
|
||||
#: ../src\controller\mainController.py:1582
|
||||
msgid "Timeline for {}"
|
||||
msgstr "Vremenska linija od {}"
|
||||
|
||||
@@ -234,7 +233,7 @@ msgstr "Vremenska linija omiljenih tvitova"
|
||||
|
||||
#: ../src\controller\mainController.py:363
|
||||
#: ../src\controller\mainController.py:902
|
||||
#: ../src\controller\mainController.py:1587
|
||||
#: ../src\controller\mainController.py:1584
|
||||
msgid "Likes for {}"
|
||||
msgstr "Sviđanja od {}"
|
||||
|
||||
@@ -244,7 +243,7 @@ msgstr "Vremenske linije pratilaca"
|
||||
|
||||
#: ../src\controller\mainController.py:367
|
||||
#: ../src\controller\mainController.py:921
|
||||
#: ../src\controller\mainController.py:1589
|
||||
#: ../src\controller\mainController.py:1586
|
||||
msgid "Followers for {}"
|
||||
msgstr "Pratioci od {}"
|
||||
|
||||
@@ -254,7 +253,7 @@ msgstr "Vremenske linije praćenih korisnika"
|
||||
|
||||
#: ../src\controller\mainController.py:371
|
||||
#: ../src\controller\mainController.py:940
|
||||
#: ../src\controller\mainController.py:1591
|
||||
#: ../src\controller\mainController.py:1588
|
||||
msgid "Friends for {}"
|
||||
msgstr "Prijatelji od {}"
|
||||
|
||||
@@ -279,6 +278,7 @@ msgstr "Pretraga za {}"
|
||||
|
||||
#: ../src\controller\mainController.py:381
|
||||
#: ../src\controller\mainController.py:982
|
||||
#: ../src\controller\mainController.py:1590
|
||||
msgid "Trending topics for %s"
|
||||
msgstr "Teme u trendu za %s"
|
||||
|
||||
@@ -321,7 +321,7 @@ msgstr "Dodaj nadimak za korisnika"
|
||||
msgid "Alias has been set correctly for {}."
|
||||
msgstr "Nadimak za {} je uspešno podešen."
|
||||
|
||||
#: ../src\controller\mainController.py:829 ../src\controller\messages.py:245
|
||||
#: ../src\controller\mainController.py:829 ../src\controller\messages.py:327
|
||||
msgid "MMM D, YYYY. H:m"
|
||||
msgstr "MMM D, YYYY. H:m"
|
||||
|
||||
@@ -410,72 +410,52 @@ msgstr "Utišavanje kanala uključeno"
|
||||
msgid "Buffer mute off"
|
||||
msgstr "Utišavanje kanala isključeno"
|
||||
|
||||
#: ../src\controller\mainController.py:1545
|
||||
#: ../src\controller\mainController.py:1542
|
||||
msgid "Copied"
|
||||
msgstr "Kopirano"
|
||||
|
||||
#: ../src\controller\mainController.py:1575
|
||||
#: ../src\controller\mainController.py:1572
|
||||
msgid "Unable to update this buffer."
|
||||
msgstr "Ne mogu da ažuriram ovaj kanal."
|
||||
|
||||
#: ../src\controller\mainController.py:1578
|
||||
#: ../src\controller\mainController.py:1575
|
||||
msgid "Updating buffer..."
|
||||
msgstr "Ažuriram kanal..."
|
||||
|
||||
#: ../src\controller\mainController.py:1581
|
||||
#: ../src\controller\mainController.py:1578
|
||||
msgid "{0} items retrieved"
|
||||
msgstr "{0} primljenih stavki"
|
||||
|
||||
#: ../src\controller\mainController.py:1598
|
||||
#: ../src\controller\mainController.py:1618
|
||||
#: ../src\controller\mainController.py:1597
|
||||
#: ../src\controller\mainController.py:1617
|
||||
msgid "Invalid buffer"
|
||||
msgstr "Nevažeći kanal"
|
||||
|
||||
#: ../src\controller\mainController.py:1609
|
||||
#: ../src\controller\mainController.py:1608
|
||||
msgid "Picture {0}"
|
||||
msgstr "Slika {0}"
|
||||
|
||||
#: ../src\controller\mainController.py:1610
|
||||
#: ../src\controller\mainController.py:1609
|
||||
msgid "Select the picture"
|
||||
msgstr "Izaberite sliku"
|
||||
|
||||
#: ../src\controller\mainController.py:1629
|
||||
#: ../src\controller\mainController.py:1628
|
||||
msgid "Unable to extract text"
|
||||
msgstr "Ne mogu da izdvojim tekst."
|
||||
|
||||
#: ../src\controller\messages.py:56
|
||||
#: ../src\controller\messages.py:49
|
||||
msgid "Translated"
|
||||
msgstr "Prevedeno"
|
||||
|
||||
#: ../src\controller\messages.py:63
|
||||
msgid "There's no URL to be shortened"
|
||||
msgstr "Nema veze koja bi mogla biti skraćena"
|
||||
|
||||
#: ../src\controller\messages.py:67 ../src\controller\messages.py:75
|
||||
msgid "URL shortened"
|
||||
msgstr "Veza je skraćena"
|
||||
|
||||
#: ../src\controller\messages.py:82
|
||||
msgid "There's no URL to be expanded"
|
||||
msgstr "Nema veze koja bi mogla biti proširena"
|
||||
|
||||
#: ../src\controller\messages.py:86 ../src\controller\messages.py:94
|
||||
msgid "URL expanded"
|
||||
msgstr "Veza je proširena"
|
||||
|
||||
#: ../src\controller\messages.py:108
|
||||
#: ../src\controller\messages.py:56
|
||||
msgid "%s - %s of %d characters"
|
||||
msgstr "%s - %s od %d znakova"
|
||||
|
||||
#: ../src\controller\messages.py:112
|
||||
msgid "%s - %s characters"
|
||||
msgstr "%s - %s znakova"
|
||||
|
||||
#: ../src\controller\messages.py:272
|
||||
#: ../src\controller\messages.py:354
|
||||
msgid "View item"
|
||||
msgstr "Prikaži stavku"
|
||||
|
||||
#: ../src\controller\messages.py:301
|
||||
#: ../src\controller\messages.py:379
|
||||
msgid "Link copied to clipboard."
|
||||
msgstr "Link kopiran u privremenu memoriju."
|
||||
|
||||
@@ -667,7 +647,7 @@ msgstr "Zaustavljeno"
|
||||
msgid "&Record"
|
||||
msgstr "&Snimi"
|
||||
|
||||
#: ../src\extra\AudioUploader\audioUploader.py:136 ../src\sound.py:148
|
||||
#: ../src\extra\AudioUploader\audioUploader.py:136 ../src\sound.py:147
|
||||
msgid "Playing..."
|
||||
msgstr "Reprodukujem..."
|
||||
|
||||
@@ -719,6 +699,9 @@ msgid "%s seconds"
|
||||
msgstr "%s sekundi"
|
||||
|
||||
#: ../src\extra\AudioUploader\wx_transfer_dialogs.py:15
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:36
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:173
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:258
|
||||
msgid "File"
|
||||
msgstr "Datoteka"
|
||||
|
||||
@@ -1486,7 +1469,7 @@ msgstr ""
|
||||
msgid "Send report"
|
||||
msgstr "Pošalji izveštaj"
|
||||
|
||||
#: ../src\issueReporter\wx_ui.py:75 ../src\wxUI\dialogs\filterDialogs.py:84
|
||||
#: ../src\issueReporter\wx_ui.py:75 ../src\wxUI\dialogs\filterDialogs.py:83
|
||||
#: ../src\wxUI\dialogs\find.py:23
|
||||
msgid "Cancel"
|
||||
msgstr "Otkaži"
|
||||
@@ -1560,7 +1543,7 @@ msgid "New tweet"
|
||||
msgstr "Novi tvit"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:12 ../src\wxUI\buffers\base.py:26
|
||||
#: ../src\wxUI\commonMessageDialogs.py:10 ../src\wxUI\dialogs\message.py:126
|
||||
#: ../src\wxUI\commonMessageDialogs.py:10
|
||||
msgid "Retweet"
|
||||
msgstr "Retvituj"
|
||||
|
||||
@@ -1773,7 +1756,7 @@ msgstr "Prečica"
|
||||
msgid "Action"
|
||||
msgstr "Radnja"
|
||||
|
||||
#: ../src\keystrokeEditor\wx_ui.py:18 ../src\wxUI\dialogs\filterDialogs.py:131
|
||||
#: ../src\keystrokeEditor\wx_ui.py:18 ../src\wxUI\dialogs\filterDialogs.py:135
|
||||
#: ../src\wxUI\dialogs\lists.py:20 ../src\wxUI\dialogs\userAliasDialogs.py:53
|
||||
msgid "Edit"
|
||||
msgstr "Izmeni"
|
||||
@@ -1823,7 +1806,7 @@ msgstr "Windows"
|
||||
msgid "Key"
|
||||
msgstr "Taster"
|
||||
|
||||
#: ../src\keystrokeEditor\wx_ui.py:71 ../src\wxUI\dialogs\filterDialogs.py:82
|
||||
#: ../src\keystrokeEditor\wx_ui.py:71 ../src\wxUI\dialogs\filterDialogs.py:80
|
||||
#: ../src\wxUI\dialogs\find.py:21 ../src\wxUI\dialogs\userAliasDialogs.py:23
|
||||
#: ../src\wxUI\dialogs\utils.py:36
|
||||
msgid "OK"
|
||||
@@ -1999,16 +1982,18 @@ msgstr "Privatno"
|
||||
msgid "public"
|
||||
msgstr "Javno"
|
||||
|
||||
#: ../src\sessions\twitter\session.py:209
|
||||
#: ../src\sessions\twitter\session.py:211
|
||||
#: ../src\sessions\twitter\session.py:238
|
||||
msgid "%s failed. Reason: %s"
|
||||
msgstr "%s nije uspelo. Razlog: %s"
|
||||
|
||||
#: ../src\sessions\twitter\session.py:215
|
||||
#: ../src\sessions\twitter\session.py:217
|
||||
#: ../src\sessions\twitter\session.py:241
|
||||
msgid "%s succeeded."
|
||||
msgstr "%s uspelo."
|
||||
|
||||
#: ../src\sessions\twitter\session.py:424
|
||||
#: ../src\sessions\twitter\session.py:502
|
||||
#: ../src\sessions\twitter\session.py:450
|
||||
#: ../src\sessions\twitter\session.py:528
|
||||
msgid "Deleted account"
|
||||
msgstr "Obrisan nalog"
|
||||
|
||||
@@ -2036,7 +2021,7 @@ msgstr "Autorizacija naloga..."
|
||||
msgid "Enter your PIN code here"
|
||||
msgstr "Ovde upišite vaš PIN kod"
|
||||
|
||||
#: ../src\sound.py:161
|
||||
#: ../src\sound.py:160
|
||||
msgid "Stopped."
|
||||
msgstr "Zaustavljeno"
|
||||
|
||||
@@ -2088,10 +2073,6 @@ msgstr ""
|
||||
msgid "Client"
|
||||
msgstr "Klijent"
|
||||
|
||||
#: ../src\wxUI\buffers\base.py:12
|
||||
msgid "Text"
|
||||
msgstr "Tekst"
|
||||
|
||||
#: ../src\wxUI\buffers\base.py:12 ../src\wxUI\buffers\events.py:14
|
||||
msgid "Date"
|
||||
msgstr "Datum"
|
||||
@@ -2103,6 +2084,11 @@ msgstr "Datum"
|
||||
msgid "User"
|
||||
msgstr "Korisnik"
|
||||
|
||||
#: ../src\wxUI\buffers\base.py:12
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:48
|
||||
msgid "Text"
|
||||
msgstr "Tekst"
|
||||
|
||||
#: ../src\wxUI\buffers\base.py:28
|
||||
msgid "Direct message"
|
||||
msgstr "Direktna poruka"
|
||||
@@ -2359,55 +2345,6 @@ msgstr ""
|
||||
"{0} je neočekivano zatvoren pri poslednjem pokretanju. Ako se problem "
|
||||
"nastavi, molimo prijavite ga{0} programerima."
|
||||
|
||||
#: ../src\wxUI\dialogs\attach.py:10
|
||||
msgid "Add an attachment"
|
||||
msgstr "Dodaj prilog"
|
||||
|
||||
#: ../src\wxUI\dialogs\attach.py:13
|
||||
msgid "Attachments"
|
||||
msgstr "Prilozi"
|
||||
|
||||
#: ../src\wxUI\dialogs\attach.py:14
|
||||
msgid "Title"
|
||||
msgstr "Naslov"
|
||||
|
||||
#: ../src\wxUI\dialogs\attach.py:14
|
||||
msgid "Type"
|
||||
msgstr "Vrsta"
|
||||
|
||||
#: ../src\wxUI\dialogs\attach.py:19
|
||||
msgid "Add attachments"
|
||||
msgstr "Dodaj priloge"
|
||||
|
||||
#: ../src\wxUI\dialogs\attach.py:20
|
||||
msgid "&Photo"
|
||||
msgstr "Slika"
|
||||
|
||||
#: ../src\wxUI\dialogs\attach.py:21
|
||||
msgid "Remove attachment"
|
||||
msgstr "Ukloni prilog"
|
||||
|
||||
#: ../src\wxUI\dialogs\attach.py:37 ../src\wxUI\dialogs\message.py:116
|
||||
#: ../src\wxUI\dialogs\message.py:175 ../src\wxUI\dialogs\message.py:235
|
||||
#: ../src\wxUI\dialogs\update_profile.py:82
|
||||
msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"
|
||||
msgstr "Datoteke sa slikama"
|
||||
|
||||
#: ../src\wxUI\dialogs\attach.py:37 ../src\wxUI\dialogs\message.py:116
|
||||
#: ../src\wxUI\dialogs\message.py:175 ../src\wxUI\dialogs\message.py:235
|
||||
#: ../src\wxUI\dialogs\update_profile.py:82
|
||||
msgid "Select the picture to be uploaded"
|
||||
msgstr "Izaberite sliku koju želite da otpremite"
|
||||
|
||||
#: ../src\wxUI\dialogs\attach.py:44
|
||||
msgid "please provide a description"
|
||||
msgstr "Molimo vas navedite opis:"
|
||||
|
||||
#: ../src\wxUI\dialogs\attach.py:44 ../src\wxUI\dialogs\lists.py:14
|
||||
#: ../src\wxUI\dialogs\lists.py:70
|
||||
msgid "Description"
|
||||
msgstr "Opis"
|
||||
|
||||
#: ../src\wxUI\dialogs\configuration.py:15
|
||||
msgid "Language"
|
||||
msgstr "Jezik"
|
||||
@@ -2544,7 +2481,7 @@ msgid "Status"
|
||||
msgstr "Status"
|
||||
|
||||
#: ../src\wxUI\dialogs\configuration.py:144
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:126
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:130
|
||||
msgid "Buffer"
|
||||
msgstr "Kanal"
|
||||
|
||||
@@ -2669,91 +2606,99 @@ msgstr "Dodaci"
|
||||
msgid "Save"
|
||||
msgstr "Sačuvaj"
|
||||
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:16
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:13
|
||||
msgid "Create a filter for this buffer"
|
||||
msgstr "Napravi filter za ovaj kanal"
|
||||
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:17
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:14
|
||||
msgid "Filter title"
|
||||
msgstr "Naziv filtera"
|
||||
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:26
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:126
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:24
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:130
|
||||
msgid "Filter by word"
|
||||
msgstr "Filtriraj na osnovu reči"
|
||||
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:27
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:25
|
||||
msgid "Ignore tweets wich contain the following word"
|
||||
msgstr "Zanemari tvitove koji sadrže sledeću reč"
|
||||
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:28
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:26
|
||||
msgid "Ignore tweets without the following word"
|
||||
msgstr "Zanemari tvitove bez sledeće reči"
|
||||
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:33
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:31
|
||||
msgid "word"
|
||||
msgstr "Reč"
|
||||
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:38
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:36
|
||||
msgid "Allow retweets"
|
||||
msgstr "Dozvoli retvitove"
|
||||
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:39
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:37
|
||||
msgid "Allow quoted tweets"
|
||||
msgstr "Dozvoli citirane tvitove"
|
||||
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:40
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:38
|
||||
msgid "Allow replies"
|
||||
msgstr "Dozvoli odgovore"
|
||||
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:48
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:46
|
||||
msgid "Use this term as a regular expression"
|
||||
msgstr "Koristi ovaj termin kao regulara nizraz"
|
||||
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:50
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:126
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:48
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:130
|
||||
msgid "Filter by language"
|
||||
msgstr "Filtriraj na osnovu jezika"
|
||||
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:51
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:49
|
||||
msgid "Load tweets in the following languages"
|
||||
msgstr "Učitaj tvitove na sledećim jezicima"
|
||||
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:52
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:50
|
||||
msgid "Ignore tweets in the following languages"
|
||||
msgstr "Zanemari tvitove na sledećim jezicima"
|
||||
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:53
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:51
|
||||
msgid "Don't filter by language"
|
||||
msgstr "Ne filtriraj na osnovu jezika"
|
||||
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:64
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:62
|
||||
msgid "Supported languages"
|
||||
msgstr "Podržani jezici"
|
||||
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:69
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:67
|
||||
msgid "Add selected language to filter"
|
||||
msgstr "Dodaj izabrani jezik u filter"
|
||||
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:73
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:71
|
||||
msgid "Selected languages"
|
||||
msgstr "Izabrani jezici"
|
||||
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:75
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:133 ../src\wxUI\dialogs\lists.py:21
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:73
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:137 ../src\wxUI\dialogs\lists.py:21
|
||||
#: ../src\wxUI\dialogs\lists.py:132 ../src\wxUI\dialogs\userAliasDialogs.py:57
|
||||
msgid "Remove"
|
||||
msgstr "Ukloni"
|
||||
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:123
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:120
|
||||
msgid "Missing filter name"
|
||||
msgstr "Ime filtera nedostaje"
|
||||
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:120
|
||||
msgid "You must define a name for the filter before creating it."
|
||||
msgstr "Morate upisati ime za filter pre nego što ga napravite."
|
||||
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:127
|
||||
msgid "Manage filters"
|
||||
msgstr "Upravljanje filterima"
|
||||
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:125
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:129
|
||||
msgid "Filters"
|
||||
msgstr "Filteri"
|
||||
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:126
|
||||
#: ../src\wxUI\dialogs\filterDialogs.py:130
|
||||
msgid "Filter"
|
||||
msgstr "Filter"
|
||||
|
||||
@@ -2785,6 +2730,14 @@ msgstr "Vlasnik"
|
||||
msgid "mode"
|
||||
msgstr "Način"
|
||||
|
||||
#: ../src\wxUI\dialogs\lists.py:14 ../src\wxUI\dialogs\lists.py:70
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:38
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:127
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:175
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:260
|
||||
msgid "Description"
|
||||
msgstr "Opis"
|
||||
|
||||
#: ../src\wxUI\dialogs\lists.py:19 ../src\wxUI\dialogs\lists.py:62
|
||||
msgid "Create a new list"
|
||||
msgstr "Stvori novu listu"
|
||||
@@ -2841,103 +2794,6 @@ msgstr "Izaberite listu sa koje želite da uklonite korisnika"
|
||||
msgid "Do you really want to delete this list?"
|
||||
msgstr "Želite li zaista da izbrišete ovu listu?"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:73 ../src\wxUI\dialogs\message.py:254
|
||||
msgid "&Long tweet"
|
||||
msgstr "Dug tvit"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:74 ../src\wxUI\dialogs\message.py:133
|
||||
#: ../src\wxUI\dialogs\message.py:255
|
||||
msgid "&Upload image..."
|
||||
msgstr "Otpremi sliku..."
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:75 ../src\wxUI\dialogs\message.py:134
|
||||
#: ../src\wxUI\dialogs\message.py:194 ../src\wxUI\dialogs\message.py:256
|
||||
#: ../src\wxUI\dialogs\message.py:359 ../src\wxUI\dialogs\message.py:435
|
||||
msgid "Check &spelling..."
|
||||
msgstr "Proveri pravopis..."
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:76 ../src\wxUI\dialogs\message.py:135
|
||||
#: ../src\wxUI\dialogs\message.py:195 ../src\wxUI\dialogs\message.py:257
|
||||
msgid "&Attach audio..."
|
||||
msgstr "Priloži zvučni zapis..."
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:77 ../src\wxUI\dialogs\message.py:136
|
||||
#: ../src\wxUI\dialogs\message.py:196 ../src\wxUI\dialogs\message.py:258
|
||||
msgid "Sh&orten URL"
|
||||
msgstr "Skrati vezu"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:78 ../src\wxUI\dialogs\message.py:137
|
||||
#: ../src\wxUI\dialogs\message.py:197 ../src\wxUI\dialogs\message.py:259
|
||||
#: ../src\wxUI\dialogs\message.py:360 ../src\wxUI\dialogs\message.py:436
|
||||
msgid "&Expand URL"
|
||||
msgstr "Proširi vezu"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:81 ../src\wxUI\dialogs\message.py:140
|
||||
#: ../src\wxUI\dialogs\message.py:200 ../src\wxUI\dialogs\message.py:262
|
||||
#: ../src\wxUI\dialogs\message.py:362 ../src\wxUI\dialogs\message.py:438
|
||||
msgid "&Translate..."
|
||||
msgstr "Prevedi..."
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:82 ../src\wxUI\dialogs\message.py:141
|
||||
#: ../src\wxUI\dialogs\message.py:186 ../src\wxUI\dialogs\message.py:263
|
||||
msgid "Auto&complete users"
|
||||
msgstr "&Automatsko dovršavanje"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:83 ../src\wxUI\dialogs\message.py:142
|
||||
#: ../src\wxUI\dialogs\message.py:201 ../src\wxUI\dialogs\message.py:264
|
||||
msgid "Sen&d"
|
||||
msgstr "Pošalji"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:85 ../src\wxUI\dialogs\message.py:144
|
||||
#: ../src\wxUI\dialogs\message.py:203 ../src\wxUI\dialogs\message.py:266
|
||||
#: ../src\wxUI\dialogs\message.py:363 ../src\wxUI\dialogs\message.py:439
|
||||
msgid "C&lose"
|
||||
msgstr "Zatvori"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:184
|
||||
msgid "&Recipient"
|
||||
msgstr "Primalac"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:245
|
||||
msgid "&Mention to all"
|
||||
msgstr "Spomeni sve"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:299
|
||||
msgid "Tweet - %i characters "
|
||||
msgstr "Tvit - %i znakova"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:316
|
||||
msgid "Image description"
|
||||
msgstr "Opis slike"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:327
|
||||
msgid "Retweets: "
|
||||
msgstr "Retvitova"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:332
|
||||
msgid "Likes: "
|
||||
msgstr "Sviđanja:"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:337
|
||||
msgid "Source: "
|
||||
msgstr "Izvor:"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:342 ../src\wxUI\dialogs\message.py:423
|
||||
msgid "Date: "
|
||||
msgstr "Datum:"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:357 ../src\wxUI\dialogs\message.py:433
|
||||
msgid "Copy link to clipboard"
|
||||
msgstr "Kopiraj link u privremenu memoriju"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:408
|
||||
msgid "View"
|
||||
msgstr "Vidi"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:410
|
||||
msgid "Item"
|
||||
msgstr "Stavka"
|
||||
|
||||
#: ../src\wxUI\dialogs\search.py:12
|
||||
msgid "Search on Twitter"
|
||||
msgstr "Pretraži ttwitter"
|
||||
@@ -3019,6 +2875,225 @@ msgstr "Gradu"
|
||||
msgid "&Location"
|
||||
msgstr "Mesto"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:33
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:49
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:170
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:255
|
||||
msgid "Attachments"
|
||||
msgstr "Prilozi"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:37
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:174
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:259
|
||||
msgid "Type"
|
||||
msgstr "Vrsta"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:40
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:177
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:262
|
||||
msgid "Delete attachment"
|
||||
msgstr "Ukloni prilog"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:45
|
||||
msgid "Added Tweets"
|
||||
msgstr "Dodati tvitovi"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:52
|
||||
msgid "Delete tweet"
|
||||
msgstr "Obriši tvit"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:57
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:192
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:267
|
||||
msgid "A&dd..."
|
||||
msgstr "&Dodaj..."
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:59
|
||||
msgid "Add t&weet"
|
||||
msgstr "Dodaj t&vit"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:62
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:194
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:269
|
||||
msgid "&Attach audio..."
|
||||
msgstr "Priloži zvučni zapis..."
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:66
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:198
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:237
|
||||
msgid "Auto&complete users"
|
||||
msgstr "&Automatsko dovršavanje"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:68
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:200
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:273
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:367
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:440
|
||||
msgid "Check &spelling..."
|
||||
msgstr "Proveri pravopis..."
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:70
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:202
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:275
|
||||
msgid "&Translate"
|
||||
msgstr "&Prevedi"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:74
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:206
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:279
|
||||
msgid "Sen&d"
|
||||
msgstr "Pošalji"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:118
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:220
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:299
|
||||
msgid "Image"
|
||||
msgstr "Slika"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:120
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:222
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:301
|
||||
msgid "Video"
|
||||
msgstr "Video"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:122
|
||||
msgid "Poll"
|
||||
msgstr "Anketa"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:127
|
||||
msgid "please provide a description"
|
||||
msgstr "Molimo vas navedite opis:"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:134
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:292
|
||||
#: ../src\wxUI\dialogs\update_profile.py:82
|
||||
msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"
|
||||
msgstr "Datoteke sa slikama"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:134
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:292
|
||||
#: ../src\wxUI\dialogs\update_profile.py:82
|
||||
msgid "Select the picture to be uploaded"
|
||||
msgstr "Izaberite sliku koju želite da otpremite"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:141
|
||||
msgid "Select the video to be uploaded"
|
||||
msgstr "Izaberite video zapis koji želite da otpremite"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:141
|
||||
msgid "Video files (*.mp4)|*.mp4"
|
||||
msgstr "Datoteke video zapisa (*.mp4)|*.mp4"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:147
|
||||
msgid "Error adding attachment"
|
||||
msgstr "Greška pri dodavanju priloga"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:147
|
||||
msgid ""
|
||||
"It is not possible to add more attachments. Please make sure your tweet "
|
||||
"complies with Twitter'S attachment rules. You can add only one video or GIF "
|
||||
"in every tweet, and a maximum of 4 photos."
|
||||
msgstr ""
|
||||
"Nije moguće dodati više priloga. Molimo uverite se da vaš tvit poštuje "
|
||||
"Twitter pravila o prilozima. Možete dodati samo jedan video ili GIF u svaki "
|
||||
"tvit, i najviše 4 slike."
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:182
|
||||
msgid "&Mention to all"
|
||||
msgstr "Spomeni sve"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:235
|
||||
msgid "&Recipient"
|
||||
msgstr "Primalac"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:307
|
||||
msgid "Tweet - %i characters "
|
||||
msgstr "Tvit - %i znakova"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:324
|
||||
msgid "Image description"
|
||||
msgstr "Opis slike"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:335
|
||||
msgid "Retweets: "
|
||||
msgstr "Retvitova"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:340
|
||||
msgid "Likes: "
|
||||
msgstr "Sviđanja:"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:345
|
||||
msgid "Source: "
|
||||
msgstr "Izvor:"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:350
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:428
|
||||
msgid "Date: "
|
||||
msgstr "Datum:"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:365
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:438
|
||||
msgid "Copy link to clipboard"
|
||||
msgstr "Kopiraj link u privremenu memoriju"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:368
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:443
|
||||
msgid "&Translate..."
|
||||
msgstr "Prevedi..."
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:369
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:444
|
||||
msgid "C&lose"
|
||||
msgstr "Zatvori"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:413
|
||||
msgid "View"
|
||||
msgstr "Vidi"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:415
|
||||
msgid "Item"
|
||||
msgstr "Stavka"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:441
|
||||
msgid "&Expand URL"
|
||||
msgstr "Proširi vezu"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:480
|
||||
msgid "Add a poll"
|
||||
msgstr "Dodaj anketu"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:484
|
||||
msgid "Participation time (in days)"
|
||||
msgstr "Vreme učešća (u danima)"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:491
|
||||
msgid "Choices"
|
||||
msgstr "Opcije"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:495
|
||||
msgid "Option 1"
|
||||
msgstr "Opcija 1"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:501
|
||||
msgid "Option 2"
|
||||
msgstr "Opcija 2"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:507
|
||||
msgid "Option 3"
|
||||
msgstr "Opcija 3"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:513
|
||||
msgid "Option 4"
|
||||
msgstr "Opcija 4"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:540
|
||||
msgid "Not enough information"
|
||||
msgstr "Nema dovoljno informacija"
|
||||
|
||||
#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:540
|
||||
msgid "Please make sure you have provided at least two options for the poll."
|
||||
msgstr "Molimo uverite se da ste ponudili bar dve opcije u anketi."
|
||||
|
||||
#: ../src\wxUI\dialogs\update_profile.py:10
|
||||
msgid "Update your profile"
|
||||
msgstr "Ažurirajte vaš profil"
|
||||
@@ -3435,6 +3510,42 @@ msgstr "Ažuriraj"
|
||||
msgid "Your {0} version is up to date"
|
||||
msgstr "Imate najnoviju verziju {0}."
|
||||
|
||||
#~ msgid "Photo"
|
||||
#~ msgstr "Slika"
|
||||
|
||||
#~ msgid "There's no URL to be shortened"
|
||||
#~ msgstr "Nema veze koja bi mogla biti skraćena"
|
||||
|
||||
#~ msgid "URL shortened"
|
||||
#~ msgstr "Veza je skraćena"
|
||||
|
||||
#~ msgid "There's no URL to be expanded"
|
||||
#~ msgstr "Nema veze koja bi mogla biti proširena"
|
||||
|
||||
#~ msgid "URL expanded"
|
||||
#~ msgstr "Veza je proširena"
|
||||
|
||||
#~ msgid "%s - %s characters"
|
||||
#~ msgstr "%s - %s znakova"
|
||||
|
||||
#~ msgid "Title"
|
||||
#~ msgstr "Naslov"
|
||||
|
||||
#~ msgid "Add attachments"
|
||||
#~ msgstr "Dodaj priloge"
|
||||
|
||||
#~ msgid "&Photo"
|
||||
#~ msgstr "Slika"
|
||||
|
||||
#~ msgid "&Long tweet"
|
||||
#~ msgstr "Dug tvit"
|
||||
|
||||
#~ msgid "&Upload image..."
|
||||
#~ msgstr "Otpremi sliku..."
|
||||
|
||||
#~ msgid "Sh&orten URL"
|
||||
#~ msgstr "Skrati vezu"
|
||||
|
||||
#~ msgid "Friends' Timelines"
|
||||
#~ msgstr "Vremenska linija prijatelja"
|
||||
|
||||
|
@@ -204,7 +204,7 @@ class Session(base.baseSession):
|
||||
except TweepyException as e:
|
||||
output.speak(str(e))
|
||||
val = None
|
||||
if type(e) != NotFound and type(e) != Forvidden:
|
||||
if type(e) != NotFound and type(e) != Forbidden:
|
||||
tries = tries+1
|
||||
time.sleep(5)
|
||||
elif report_failure:
|
||||
@@ -218,6 +218,30 @@ class Session(base.baseSession):
|
||||
if _sound != None: self.sound.play(_sound)
|
||||
return val
|
||||
|
||||
def api_call_v2(self, call_name, action="", _sound=None, report_success=False, report_failure=True, preexec_message="", *args, **kwargs):
|
||||
finished = False
|
||||
tries = 0
|
||||
if preexec_message:
|
||||
output.speak(preexec_message, True)
|
||||
while finished==False and tries < 25:
|
||||
try:
|
||||
val = getattr(self.twitter_v2, call_name)(*args, **kwargs)
|
||||
finished = True
|
||||
except TweepyException as e:
|
||||
log.exception("Error sending the tweet.")
|
||||
output.speak(str(e))
|
||||
val = None
|
||||
if type(e) != NotFound and type(e) != Forbidden:
|
||||
tries = tries+1
|
||||
time.sleep(5)
|
||||
elif report_failure:
|
||||
output.speak(_("%s failed. Reason: %s") % (action, str(e)))
|
||||
finished = True
|
||||
if report_success:
|
||||
output.speak(_("%s succeeded.") % action)
|
||||
if _sound != None: self.sound.play(_sound)
|
||||
return val
|
||||
|
||||
def search(self, name, *args, **kwargs):
|
||||
""" Search in twitter, passing args and kwargs as arguments to the Twython function."""
|
||||
tl = self.twitter.search_tweets(*args, **kwargs)
|
||||
@@ -590,4 +614,55 @@ class Session(base.baseSession):
|
||||
if self.logged == False:
|
||||
return
|
||||
if user != self.db["user_name"]:
|
||||
log.debug("Connected streaming endpoint on account {}".format(user))
|
||||
log.debug("Connected streaming endpoint on account {}".format(user))
|
||||
|
||||
def send_tweet(self, *tweets):
|
||||
""" Convenience function to send a thread. """
|
||||
in_reply_to_status_id = None
|
||||
for obj in tweets:
|
||||
# When quoting a tweet, the tweet_data dict might contain a parameter called quote_tweet_id. Let's add it, or None, so quotes will be posted successfully.
|
||||
if len(obj["attachments"]) == 0:
|
||||
item = self.api_call_v2(call_name="create_tweet", text=obj["text"], _sound="tweet_send.ogg", in_reply_to_tweet_id=in_reply_to_status_id, poll_duration_minutes=obj["poll_period"], poll_options=obj["poll_options"], quote_tweet_id=obj.get("quote_tweet_id"))
|
||||
in_reply_to_status_id = item.data["id"]
|
||||
else:
|
||||
media_ids = []
|
||||
for i in obj["attachments"]:
|
||||
img = self.api_call("media_upload", filename=i["file"])
|
||||
if i["type"] == "photo":
|
||||
self.api_call(call_name="create_media_metadata", media_id=img.media_id, alt_text=i["description"])
|
||||
media_ids.append(img.media_id)
|
||||
item = self.api_call_v2(call_name="create_tweet", status=obj["text"], _sound="tweet_send.ogg", in_reply_to_tweet_id=in_reply_to_status_id, media_ids=media_ids, poll_duration_minutes=obj["poll_period"], poll_options=obj["poll_options"], quote_tweet_id=obj.get("quote_tweet_id"))
|
||||
in_reply_to_status_id = item.data["id"]
|
||||
|
||||
def reply(self, text="", in_reply_to_status_id=None, attachments=[], *args, **kwargs):
|
||||
if len(attachments) == 0:
|
||||
item = self.api_call_v2(call_name="create_tweet", text=text, _sound="reply_send.ogg", in_reply_to_tweet_id=in_reply_to_status_id, *args, **kwargs)
|
||||
else:
|
||||
media_ids = []
|
||||
for i in attachments:
|
||||
img = self.api_call("media_upload", filename=i["file"])
|
||||
if i["type"] == "photo":
|
||||
self.api_call(call_name="create_media_metadata", media_id=img.media_id, alt_text=i["description"])
|
||||
media_ids.append(img.media_id)
|
||||
item = self.api_call(call_name="update_status", status=text, _sound="reply_send.ogg", tweet_mode="extended", in_reply_to_status_id=in_reply_to_status_id, media_ids=media_ids, *args, **kwargs)
|
||||
|
||||
def direct_message(self, text, recipient, attachment=None, *args, **kwargs):
|
||||
if attachment == None:
|
||||
item = self.api_call(call_name="send_direct_message", recipient_id=recipient, text=text)
|
||||
else:
|
||||
if attachment["type"] == "photo":
|
||||
media_category = "DmImage"
|
||||
elif attachment["type"] == "gif":
|
||||
media_category = "DmGif"
|
||||
elif attachment["type"] == "video":
|
||||
media_category = "DmVideo"
|
||||
media = self.api_call("media_upload", filename=attachment["file"], media_category=media_category)
|
||||
item = self.api_call(call_name="send_direct_message", recipient_id=recipient, text=text, attachment_type="media", attachment_media_id=media.media_id)
|
||||
if item != None:
|
||||
sent_dms = self.db["sent_direct_messages"]
|
||||
if self.settings["general"]["reverse_timelines"] == False:
|
||||
sent_dms.append(item)
|
||||
else:
|
||||
sent_dms.insert(0, item)
|
||||
self.db["sent_direct_messages"] = sent_dms
|
||||
pub.sendMessage("sent-dm", data=item, user=self.db["user_name"])
|
||||
|
@@ -1,5 +1,5 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import url_shortener, re
|
||||
import re
|
||||
import output
|
||||
import config
|
||||
import logging
|
||||
|
@@ -6,7 +6,6 @@ import subprocess
|
||||
import platform
|
||||
import tempfile
|
||||
import glob
|
||||
import url_shortener
|
||||
import audio_services
|
||||
import paths
|
||||
import sound_lib
|
||||
@@ -121,7 +120,7 @@ class URLStream(object):
|
||||
""" Takes an URL and prepares it to be streamed. This function will try to unshorten the passed URL and, if needed, to transform it into a valid URL."""
|
||||
log.debug("Preparing URL: %s" % (url,))
|
||||
self.prepared = False
|
||||
self.url = url_shortener.unshorten(url)
|
||||
self.url = url
|
||||
if self.url == None:
|
||||
self.url = url
|
||||
log.debug("Expanded URL: %s" % (self.url,))
|
||||
|
@@ -1,3 +0,0 @@
|
||||
from __future__ import unicode_literals
|
||||
from . import shorteners
|
||||
from . __main__ import *
|
@@ -1,46 +0,0 @@
|
||||
from __future__ import unicode_literals
|
||||
from functools import wraps
|
||||
from . import shorteners
|
||||
|
||||
|
||||
def service_selecter (func):
|
||||
@wraps(func)
|
||||
def wrapper (*args, **kwargs):
|
||||
tmp = dict(kwargs)
|
||||
if 'service' in tmp:
|
||||
del(tmp['service'])
|
||||
kwargs['service'] = find_service(kwargs['service'], **tmp) or default_service()
|
||||
else:
|
||||
kwargs['service'] = default_service()
|
||||
return func(*args, **kwargs)
|
||||
return wrapper
|
||||
|
||||
@service_selecter
|
||||
def shorten (url, service=None, **kwargs):
|
||||
return service(**kwargs).shorten(url)
|
||||
|
||||
|
||||
@service_selecter
|
||||
def unshorten (url, service=None, **kwargs):
|
||||
return service(**kwargs).unshorten(url)
|
||||
|
||||
|
||||
def default_service ():
|
||||
return shorteners.AcortameShortener
|
||||
|
||||
def find_service (service, **kwargs):
|
||||
for i in shorteners.__all__:
|
||||
obj = getattr(shorteners, i)(**kwargs)
|
||||
if obj.name.lower() == service.lower():
|
||||
return getattr(shorteners, i)
|
||||
|
||||
def list_services ():
|
||||
return [getattr(shorteners, i)().name for i in shorteners.__all__]
|
||||
|
||||
def unshorten_any (url):
|
||||
"""Unshortens an URL using any available unshortener. Check to see if unshortened URL was created by a shortener (nested) and unshorten if so."""
|
||||
unshortened_url = shorteners.URLShortener().unshorten(url)
|
||||
# None is returned if URL not unshortened
|
||||
if unshortened_url:
|
||||
return unshorten_any(unshortened_url)
|
||||
return url
|
@@ -1,11 +0,0 @@
|
||||
from __future__ import unicode_literals
|
||||
from .url_shortener import URLShortener
|
||||
from .hkcim import HKCShortener
|
||||
from . isgd import IsgdShortener
|
||||
from . onjme import OnjmeShortener
|
||||
from . tinyarrows import TinyArrowsShortener
|
||||
from . tinyurl import TinyurlShortener
|
||||
from . xedcc import XedccShortener
|
||||
from . clckru import ClckruShortener
|
||||
from . acortame import AcortameShortener
|
||||
__all__ = ["HKCShortener", "IsgdShortener", "OnjmeShortener", "TinyArrowsShortener", "TinyurlShortener", "XedccShortener", "ClckruShortener", "AcortameShortener"]
|
@@ -1,30 +0,0 @@
|
||||
from __future__ import unicode_literals
|
||||
from future import standard_library
|
||||
standard_library.install_aliases()
|
||||
from . url_shortener import URLShortener
|
||||
import requests
|
||||
import urllib.request, urllib.parse, urllib.error
|
||||
class AcortameShortener (URLShortener):
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.name = "acorta.me"
|
||||
super(AcortameShortener, self).__init__(*args, **kwargs)
|
||||
|
||||
def _shorten (self, url):
|
||||
answer = url
|
||||
api = requests.get ("https://acorta.me/api.php?action=shorturl&format=simple&url=" + urllib.parse.quote(url))
|
||||
if api.status_code == 200:
|
||||
answer = api.text
|
||||
return answer
|
||||
|
||||
def created_url (self, url):
|
||||
return 'acorta.me' in url
|
||||
|
||||
def unshorten (self, url):
|
||||
if not 'acorta.me' in url:
|
||||
#use generic expand method
|
||||
return super(AcortameShortener, self).unshorten(url)
|
||||
answer = url
|
||||
api = requests.get ("https://acorta.me/api.php?action=expand&format=simple&shorturl=" + urllib.parse.quote(url))
|
||||
if api.status_code == 200:
|
||||
answer = api.text
|
||||
return answer
|
@@ -1,22 +0,0 @@
|
||||
from __future__ import unicode_literals
|
||||
from future import standard_library
|
||||
standard_library.install_aliases()
|
||||
import urllib.request, urllib.parse, urllib.error
|
||||
import requests
|
||||
from . url_shortener import URLShortener
|
||||
|
||||
|
||||
class ClckruShortener (URLShortener):
|
||||
def __init__ (self, *args, **kwargs):
|
||||
self.name = "clck.ru"
|
||||
super(ClckruShortener, self).__init__(*args, **kwargs)
|
||||
|
||||
def _shorten (self, url):
|
||||
answer = url
|
||||
api = requests.get ("http://clck.ru/--?url=" + urllib.parse.quote(url))
|
||||
if api.status_code == 200:
|
||||
answer = api.text
|
||||
return answer
|
||||
|
||||
def created_url (self, url):
|
||||
return 'clck.ru' in url
|
@@ -1,21 +0,0 @@
|
||||
from __future__ import unicode_literals
|
||||
from future import standard_library
|
||||
standard_library.install_aliases()
|
||||
import urllib.request, urllib.parse, urllib.error
|
||||
import requests
|
||||
from . url_shortener import URLShortener
|
||||
|
||||
class HKCShortener (URLShortener):
|
||||
def __init__ (self, *args, **kwargs):
|
||||
self.name = "HKC.im"
|
||||
super(HKCShortener, self).__init__(*args, **kwargs)
|
||||
|
||||
def _shorten (self, url):
|
||||
answer = url
|
||||
api = requests.get ("http://hkc.im/yourls-api.php?action=shorturl&format=simple&url=" + urllib.parse.quote(url))
|
||||
if api.status_code == 200:
|
||||
answer = api.text
|
||||
return answer
|
||||
|
||||
def created_url (self, url):
|
||||
return 'hkc.im' in url.lower()
|
@@ -1,22 +0,0 @@
|
||||
from __future__ import unicode_literals
|
||||
from future import standard_library
|
||||
standard_library.install_aliases()
|
||||
import urllib.request, urllib.parse, urllib.error
|
||||
import requests
|
||||
from . url_shortener import URLShortener
|
||||
|
||||
|
||||
class IsgdShortener (URLShortener):
|
||||
def __init__ (self, *args, **kwargs):
|
||||
self.name = "Is.gd"
|
||||
super(IsgdShortener, self).__init__(*args, **kwargs)
|
||||
|
||||
def _shorten (self, url):
|
||||
answer = url
|
||||
api = requests.get ("http://is.gd/api.php?longurl=" + urllib.parse.quote(url))
|
||||
if api.status_code == 200:
|
||||
answer = api.text
|
||||
return answer
|
||||
|
||||
def created_url (self, url):
|
||||
return 'is.gd' in url
|
@@ -1,21 +0,0 @@
|
||||
from __future__ import unicode_literals
|
||||
from future import standard_library
|
||||
standard_library.install_aliases()
|
||||
import urllib.request, urllib.parse, urllib.error
|
||||
import requests
|
||||
from . url_shortener import URLShortener
|
||||
|
||||
class OnjmeShortener (URLShortener):
|
||||
def __init__ (self, *args, **kwargs):
|
||||
self.name = "Onj.me"
|
||||
super(OnjmeShortener, self).__init__(*args, **kwargs)
|
||||
|
||||
def _shorten (self, url):
|
||||
answer = url
|
||||
api = requests.get ("http://onj.me/yourls-api.php?action=shorturl&format=simple&url=" + urllib.parse.quote(url))
|
||||
if api.status_code == 200:
|
||||
answer = api.text
|
||||
return answer
|
||||
|
||||
def created_url (self, url):
|
||||
return 'onj.me' in url.lower()
|
@@ -1,21 +0,0 @@
|
||||
from __future__ import unicode_literals
|
||||
from future import standard_library
|
||||
standard_library.install_aliases()
|
||||
import urllib.request, urllib.parse, urllib.error
|
||||
import requests
|
||||
from . url_shortener import URLShortener
|
||||
|
||||
class TinyArrowsShortener (URLShortener):
|
||||
def __init__ (self, *args, **kwargs):
|
||||
self.name = "TinyArro.ws"
|
||||
super(TinyArrowsShortener, self).__init__(*args, **kwargs)
|
||||
|
||||
def _shorten (self, url):
|
||||
answer = url
|
||||
api = requests.get("http://tinyarro.ws/api-create.php?utfpure=1&url=%s" % urllib.parse.quote(url))
|
||||
if api.status_code == 200:
|
||||
answer = api.text
|
||||
return answer.decode('UTF-8')
|
||||
|
||||
def created_url(self, url):
|
||||
return "tinyarro.ws" in url
|
@@ -1,20 +0,0 @@
|
||||
from __future__ import unicode_literals
|
||||
from future import standard_library
|
||||
standard_library.install_aliases()
|
||||
from .url_shortener import URLShortener
|
||||
import requests
|
||||
import urllib.request, urllib.parse, urllib.error
|
||||
class TinyurlShortener (URLShortener):
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.name = "TinyURL.com"
|
||||
super(TinyurlShortener, self).__init__(*args, **kwargs)
|
||||
|
||||
def _shorten (self, url):
|
||||
answer = url
|
||||
api = requests.get ("http://tinyurl.com/api-create.php?url=" + urllib.parse.quote(url))
|
||||
if api.status_code == 200:
|
||||
answer = api.text
|
||||
return answer
|
||||
|
||||
def created_url (self, url):
|
||||
return 'tinyurl.com' in url
|
@@ -1,44 +0,0 @@
|
||||
from __future__ import unicode_literals
|
||||
from builtins import object
|
||||
import requests
|
||||
|
||||
class URLShortener (object):
|
||||
|
||||
def __init__ (self, *args, **kwargs):
|
||||
#Stub out arguments, silly object. :(
|
||||
return super(URLShortener, self).__init__()
|
||||
|
||||
def shorten (self, url):
|
||||
if self.created_url(url):
|
||||
return url
|
||||
else:
|
||||
return self._shorten(url)
|
||||
|
||||
def _shorten (self, url):
|
||||
raise NotImplementedError
|
||||
|
||||
def created_url (self, url):
|
||||
"""Returns a boolean indicating whether or not this shortener created a provided url"""
|
||||
raise NotImplementedError
|
||||
|
||||
def unshorten(self, url):
|
||||
try:
|
||||
r=requests.head(url)
|
||||
if 'location' in list(r.headers.keys()):
|
||||
if 'dropbox.com' in r.headers['location']:
|
||||
return handle_dropbox(r.headers['location'])
|
||||
else:
|
||||
return r.headers['location']
|
||||
else: # if the head method does not work, use get instead. Performance may decrease
|
||||
r=requests.get(url, allow_redirects=False, stream=True)
|
||||
# release the connection without downloading the content, we only need the response headers
|
||||
r.close()
|
||||
return r.headers['location']
|
||||
except:
|
||||
return url #we cannot expand
|
||||
|
||||
def handle_dropbox(url):
|
||||
if url.endswith("dl=1"):
|
||||
return url
|
||||
else:
|
||||
return url.replace("dl=0", "dl=1")
|
@@ -1,21 +0,0 @@
|
||||
from __future__ import unicode_literals
|
||||
from future import standard_library
|
||||
standard_library.install_aliases()
|
||||
import urllib.request, urllib.parse, urllib.error
|
||||
import requests
|
||||
from . url_shortener import URLShortener
|
||||
|
||||
class XedccShortener (URLShortener):
|
||||
def __init__ (self, *args, **kwargs):
|
||||
self.name = "Xed.cc"
|
||||
super(XedccShortener, self).__init__(*args, **kwargs)
|
||||
|
||||
def _shorten (self, url):
|
||||
answer = url
|
||||
api = requests.get ("http://xed.cc/yourls-api.php?action=shorturl&format=simple&url=" + urllib.parse.quote(url))
|
||||
if api.status_code == 200:
|
||||
answer = api.text
|
||||
return answer
|
||||
|
||||
def created_url (self, url):
|
||||
return 'xed.cc' in url.lower()
|
@@ -32,3 +32,5 @@ class trendsPanel(wx.Panel):
|
||||
else:
|
||||
self.list.select_item(0)
|
||||
|
||||
def set_focus_in_list(self):
|
||||
self.list.list.SetFocus()
|
||||
|
@@ -1,3 +1 @@
|
||||
from __future__ import absolute_import
|
||||
from __future__ import unicode_literals
|
||||
from . import baseDialog, trends, configuration, lists, message, search, find, show_user, update_profile, urlList, userSelection, utils, filterDialogs, userAliasDialogs
|
||||
from . import baseDialog, trends, configuration, lists, search, find, show_user, update_profile, urlList, userSelection, utils, filterDialogs, userAliasDialogs
|
||||
|
@@ -1,48 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
""" Attach dialog. Taken from socializer: https://github.com/manuelcortez/socializer"""
|
||||
from __future__ import unicode_literals
|
||||
import wx
|
||||
import widgetUtils
|
||||
from multiplatform_widgets import widgets
|
||||
|
||||
class attachDialog(widgetUtils.BaseDialog):
|
||||
def __init__(self):
|
||||
super(attachDialog, self).__init__(None, title=_(u"Add an attachment"))
|
||||
panel = wx.Panel(self)
|
||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
||||
lbl1 = wx.StaticText(panel, wx.ID_ANY, _(u"Attachments"))
|
||||
self.attachments = widgets.list(panel, _(u"Type"), _(u"Title"), style=wx.LC_REPORT)
|
||||
box = wx.BoxSizer(wx.HORIZONTAL)
|
||||
box.Add(lbl1, 0, wx.ALL, 5)
|
||||
box.Add(self.attachments.list, 0, wx.ALL, 5)
|
||||
sizer.Add(box, 0, wx.ALL, 5)
|
||||
static = wx.StaticBox(panel, label=_(u"Add attachments"))
|
||||
self.photo = wx.Button(panel, wx.ID_ANY, _(u"&Photo"))
|
||||
self.remove = wx.Button(panel, wx.ID_ANY, _(u"Remove attachment"))
|
||||
self.remove.Enable(False)
|
||||
btnsizer = wx.StaticBoxSizer(static, wx.HORIZONTAL)
|
||||
btnsizer.Add(self.photo, 0, wx.ALL, 5)
|
||||
sizer.Add(btnsizer, 0, wx.ALL, 5)
|
||||
ok = wx.Button(panel, wx.ID_OK)
|
||||
ok.SetDefault()
|
||||
cancelBtn = wx.Button(panel, wx.ID_CANCEL)
|
||||
btnSizer = wx.BoxSizer()
|
||||
btnSizer.Add(ok, 0, wx.ALL, 5)
|
||||
btnSizer.Add(cancelBtn, 0, wx.ALL, 5)
|
||||
sizer.Add(btnSizer, 0, wx.ALL, 5)
|
||||
panel.SetSizer(sizer)
|
||||
self.SetClientSize(sizer.CalcMin())
|
||||
|
||||
def get_image(self):
|
||||
openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
|
||||
if openFileDialog.ShowModal() == wx.ID_CANCEL:
|
||||
return (None, None)
|
||||
dsc = self.ask_description()
|
||||
return (openFileDialog.GetPath(), dsc)
|
||||
|
||||
def ask_description(self):
|
||||
dlg = wx.TextEntryDialog(self, _(u"please provide a description"), _(u"Description"))
|
||||
dlg.ShowModal()
|
||||
result = dlg.GetValue()
|
||||
dlg.Destroy()
|
||||
return result
|
@@ -1,471 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import wx
|
||||
import widgetUtils
|
||||
|
||||
class textLimited(widgetUtils.BaseDialog):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(textLimited, self).__init__(parent=None, *args, **kwargs)
|
||||
|
||||
def createTextArea(self, message="", text=""):
|
||||
if not hasattr(self, "panel"):
|
||||
self.panel = wx.Panel(self)
|
||||
self.label = wx.StaticText(self.panel, -1, message)
|
||||
self.SetTitle(str(len(text)))
|
||||
self.text = wx.TextCtrl(self.panel, -1, text, size=(439, -1),style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER)
|
||||
# font = self.text.GetFont()
|
||||
# dc = wx.WindowDC(self.text)
|
||||
# dc.SetFont(font)
|
||||
# x, y = dc.GetTextExtent("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
|
||||
# self.text.SetSize((x, y))
|
||||
self.Bind(wx.EVT_CHAR_HOOK, self.handle_keys, self.text)
|
||||
self.text.SetFocus()
|
||||
self.textBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
self.textBox.Add(self.label, 0, wx.ALL, 5)
|
||||
self.textBox.Add(self.text, 0, wx.ALL, 5)
|
||||
|
||||
def text_focus(self):
|
||||
self.text.SetFocus()
|
||||
|
||||
def get_text(self):
|
||||
return self.text.GetValue()
|
||||
|
||||
def set_text(self, text):
|
||||
return self.text.ChangeValue(text)
|
||||
|
||||
def set_title(self, new_title):
|
||||
return self.SetTitle(new_title)
|
||||
|
||||
def enable_button(self, buttonName):
|
||||
if hasattr(self, buttonName):
|
||||
return getattr(self, buttonName).Enable()
|
||||
|
||||
def disable_button(self, buttonName):
|
||||
if hasattr(self, buttonName):
|
||||
return getattr(self, buttonName).Disable()
|
||||
|
||||
def onSelect(self, ev):
|
||||
self.text.SelectAll()
|
||||
|
||||
def handle_keys(self, event):
|
||||
shift=event.ShiftDown()
|
||||
if event.GetKeyCode() == wx.WXK_RETURN and shift==False and hasattr(self,'okButton'):
|
||||
wx.PostEvent(self.okButton.GetEventHandler(), wx.PyCommandEvent(wx.EVT_BUTTON.typeId,wx.ID_OK))
|
||||
else:
|
||||
event.Skip()
|
||||
|
||||
def set_cursor_at_end(self):
|
||||
self.text.SetInsertionPoint(len(self.text.GetValue()))
|
||||
|
||||
def set_cursor_at_position(self, position):
|
||||
self.text.SetInsertionPoint(position)
|
||||
|
||||
def get_position(self):
|
||||
return self.text.GetInsertionPoint()
|
||||
|
||||
def popup_menu(self, menu):
|
||||
self.PopupMenu(menu, self.text.GetPosition())
|
||||
|
||||
class tweet(textLimited):
|
||||
def createControls(self, title, message, text):
|
||||
self.mainBox = wx.BoxSizer(wx.VERTICAL)
|
||||
self.createTextArea(message, text)
|
||||
self.mainBox.Add(self.textBox, 0, wx.ALL, 5)
|
||||
self.long_tweet = wx.CheckBox(self.panel, -1, _(u"&Long tweet"))
|
||||
self.upload_image = wx.Button(self.panel, -1, _(u"&Upload image..."), size=wx.DefaultSize)
|
||||
self.spellcheck = wx.Button(self.panel, -1, _("Check &spelling..."), size=wx.DefaultSize)
|
||||
self.attach = wx.Button(self.panel, -1, _(u"&Attach audio..."), size=wx.DefaultSize)
|
||||
self.shortenButton = wx.Button(self.panel, -1, _(u"Sh&orten URL"), size=wx.DefaultSize)
|
||||
self.unshortenButton = wx.Button(self.panel, -1, _(u"&Expand URL"), size=wx.DefaultSize)
|
||||
self.shortenButton.Disable()
|
||||
self.unshortenButton.Disable()
|
||||
self.translateButton = wx.Button(self.panel, -1, _(u"&Translate..."), size=wx.DefaultSize)
|
||||
self.autocompletionButton = wx.Button(self.panel, -1, _(u"Auto&complete users"))
|
||||
self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Sen&d"), size=wx.DefaultSize)
|
||||
self.okButton.SetDefault()
|
||||
cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize)
|
||||
self.buttonsBox1 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
self.buttonsBox1.Add(self.upload_image, 0, wx.ALL, 10)
|
||||
self.buttonsBox1.Add(self.spellcheck, 0, wx.ALL, 10)
|
||||
self.buttonsBox1.Add(self.attach, 0, wx.ALL, 10)
|
||||
self.mainBox.Add(self.buttonsBox1, 0, wx.ALL, 10)
|
||||
self.buttonsBox2 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
self.buttonsBox2.Add(self.shortenButton, 0, wx.ALL, 10)
|
||||
self.buttonsBox2.Add(self.unshortenButton, 0, wx.ALL, 10)
|
||||
self.buttonsBox2.Add(self.translateButton, 0, wx.ALL, 10)
|
||||
self.mainBox.Add(self.buttonsBox2, 0, wx.ALL, 10)
|
||||
self.ok_cancelSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
self.ok_cancelSizer.Add(self.autocompletionButton, 0, wx.ALL, 10)
|
||||
self.ok_cancelSizer.Add(self.okButton, 0, wx.ALL, 10)
|
||||
self.ok_cancelSizer.Add(cancelButton, 0, wx.ALL, 10)
|
||||
self.mainBox.Add(self.ok_cancelSizer)
|
||||
selectId = wx.ID_ANY
|
||||
self.Bind(wx.EVT_MENU, self.onSelect, id=selectId)
|
||||
self.accel_tbl = wx.AcceleratorTable([
|
||||
(wx.ACCEL_CTRL, ord('A'), selectId),
|
||||
])
|
||||
self.SetAcceleratorTable(self.accel_tbl)
|
||||
self.panel.SetSizer(self.mainBox)
|
||||
|
||||
def __init__(self, title, message, text, *args, **kwargs):
|
||||
super(tweet, self).__init__()
|
||||
self.shift=False
|
||||
self.createControls(message, title, text)
|
||||
self.SetClientSize(self.mainBox.CalcMin())
|
||||
|
||||
def get_image(self):
|
||||
openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
|
||||
if openFileDialog.ShowModal() == wx.ID_CANCEL:
|
||||
return None
|
||||
return open(openFileDialog.GetPath(), "rb")
|
||||
|
||||
|
||||
class retweet(tweet):
|
||||
def createControls(self, title, message, text):
|
||||
self.mainBox = wx.BoxSizer(wx.VERTICAL)
|
||||
self.createTextArea(message, "")
|
||||
label = wx.StaticText(self.panel, -1, _(u"Retweet"))
|
||||
self.text2 = wx.TextCtrl(self.panel, -1, text, size=(439, -1), style=wx.TE_MULTILINE|wx.TE_READONLY)
|
||||
self.retweetBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
self.retweetBox.Add(label, 0, wx.ALL, 5)
|
||||
self.retweetBox.Add(self.text2, 0, wx.ALL, 5)
|
||||
self.mainBox.Add(self.textBox, 0, wx.ALL, 5)
|
||||
self.mainBox.Add(self.retweetBox, 0, wx.ALL, 5)
|
||||
self.upload_image = wx.Button(self.panel, -1, _(u"&Upload image..."), size=wx.DefaultSize)
|
||||
self.spellcheck = wx.Button(self.panel, -1, _("Check &spelling..."), size=wx.DefaultSize)
|
||||
self.attach = wx.Button(self.panel, -1, _(u"&Attach audio..."), size=wx.DefaultSize)
|
||||
self.shortenButton = wx.Button(self.panel, -1, _(u"Sh&orten URL"), size=wx.DefaultSize)
|
||||
self.unshortenButton = wx.Button(self.panel, -1, _(u"&Expand URL"), size=wx.DefaultSize)
|
||||
self.shortenButton.Disable()
|
||||
self.unshortenButton.Disable()
|
||||
self.translateButton = wx.Button(self.panel, -1, _(u"&Translate..."), size=wx.DefaultSize)
|
||||
self.autocompletionButton = wx.Button(self.panel, -1, _(u"Auto&complete users"))
|
||||
self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Sen&d"), size=wx.DefaultSize)
|
||||
self.okButton.SetDefault()
|
||||
cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize)
|
||||
self.buttonsBox1 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
self.buttonsBox1.Add(self.upload_image, 0, wx.ALL, 10)
|
||||
self.buttonsBox1.Add(self.spellcheck, 0, wx.ALL, 10)
|
||||
self.buttonsBox1.Add(self.attach, 0, wx.ALL, 10)
|
||||
self.mainBox.Add(self.buttonsBox1, 0, wx.ALL, 10)
|
||||
self.buttonsBox2 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
self.buttonsBox2.Add(self.shortenButton, 0, wx.ALL, 10)
|
||||
self.buttonsBox2.Add(self.unshortenButton, 0, wx.ALL, 10)
|
||||
self.buttonsBox2.Add(self.translateButton, 0, wx.ALL, 10)
|
||||
self.mainBox.Add(self.buttonsBox2, 0, wx.ALL, 10)
|
||||
self.ok_cancelSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
self.ok_cancelSizer.Add(self.autocompletionButton, 0, wx.ALL, 10)
|
||||
self.ok_cancelSizer.Add(self.okButton, 0, wx.ALL, 10)
|
||||
self.ok_cancelSizer.Add(cancelButton, 0, wx.ALL, 10)
|
||||
self.mainBox.Add(self.ok_cancelSizer)
|
||||
selectId = wx.ID_ANY
|
||||
self.Bind(wx.EVT_MENU, self.onSelect, id=selectId)
|
||||
self.accel_tbl = wx.AcceleratorTable([
|
||||
(wx.ACCEL_CTRL, ord('A'), selectId),
|
||||
])
|
||||
self.SetAcceleratorTable(self.accel_tbl)
|
||||
self.panel.SetSizer(self.mainBox)
|
||||
|
||||
def __init__(self, title, message, text, *args, **kwargs):
|
||||
super(tweet, self).__init__()
|
||||
self.createControls(message, title, text)
|
||||
# self.onTimer(wx.EVT_CHAR_HOOK)
|
||||
self.SetClientSize(self.mainBox.CalcMin())
|
||||
|
||||
def get_image(self):
|
||||
openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
|
||||
if openFileDialog.ShowModal() == wx.ID_CANCEL:
|
||||
return None
|
||||
return open(openFileDialog.GetPath(), "rb")
|
||||
|
||||
class dm(textLimited):
|
||||
def createControls(self, title, message, users):
|
||||
self.panel = wx.Panel(self)
|
||||
self.mainBox = wx.BoxSizer(wx.VERTICAL)
|
||||
label = wx.StaticText(self.panel, -1, _(u"&Recipient"))
|
||||
self.cb = wx.ComboBox(self.panel, -1, choices=users, value=users[0], size=wx.DefaultSize)
|
||||
self.autocompletionButton = wx.Button(self.panel, -1, _(u"Auto&complete users"))
|
||||
self.createTextArea(message, text="")
|
||||
userBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
userBox.Add(label, 0, wx.ALL, 5)
|
||||
userBox.Add(self.cb, 0, wx.ALL, 5)
|
||||
userBox.Add(self.autocompletionButton, 0, wx.ALL, 5)
|
||||
self.mainBox.Add(userBox, 0, wx.ALL, 5)
|
||||
self.mainBox.Add(self.textBox, 0, wx.ALL, 5)
|
||||
self.spellcheck = wx.Button(self.panel, -1, _("Check &spelling..."), size=wx.DefaultSize)
|
||||
self.attach = wx.Button(self.panel, -1, _(u"&Attach audio..."), size=wx.DefaultSize)
|
||||
self.shortenButton = wx.Button(self.panel, -1, _(u"Sh&orten URL"), size=wx.DefaultSize)
|
||||
self.unshortenButton = wx.Button(self.panel, -1, _(u"&Expand URL"), size=wx.DefaultSize)
|
||||
self.shortenButton.Disable()
|
||||
self.unshortenButton.Disable()
|
||||
self.translateButton = wx.Button(self.panel, -1, _(u"&Translate..."), size=wx.DefaultSize)
|
||||
self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Sen&d"), size=wx.DefaultSize)
|
||||
self.okButton.SetDefault()
|
||||
cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize)
|
||||
self.buttonsBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
self.buttonsBox.Add(self.spellcheck, 0, wx.ALL, 5)
|
||||
self.buttonsBox.Add(self.attach, 0, wx.ALL, 5)
|
||||
self.mainBox.Add(self.buttonsBox, 0, wx.ALL, 5)
|
||||
self.buttonsBox1 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
self.buttonsBox1.Add(self.shortenButton, 0, wx.ALL, 5)
|
||||
self.buttonsBox1.Add(self.unshortenButton, 0, wx.ALL, 5)
|
||||
self.buttonsBox1.Add(self.translateButton, 0, wx.ALL, 5)
|
||||
self.mainBox.Add(self.buttonsBox1, 0, wx.ALL, 5)
|
||||
self.buttonsBox3 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
self.buttonsBox3.Add(self.okButton, 0, wx.ALL, 5)
|
||||
self.buttonsBox3.Add(cancelButton, 0, wx.ALL, 5)
|
||||
self.mainBox.Add(self.buttonsBox3, 0, wx.ALL, 5)
|
||||
self.panel.SetSizer(self.mainBox)
|
||||
self.SetClientSize(self.mainBox.CalcMin())
|
||||
|
||||
def __init__(self, title, message, users, *args, **kwargs):
|
||||
super(dm, self).__init__()
|
||||
self.createControls(title, message, users)
|
||||
# self.onTimer(wx.EVT_CHAR_HOOK)
|
||||
# self.SetClientSize(self.mainBox.CalcMin())
|
||||
|
||||
def get_user(self):
|
||||
return self.cb.GetValue()
|
||||
|
||||
def set_user(self, user):
|
||||
return self.cb.SetValue(user)
|
||||
|
||||
class reply(textLimited):
|
||||
|
||||
def get_image(self):
|
||||
openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
|
||||
if openFileDialog.ShowModal() == wx.ID_CANCEL:
|
||||
return None
|
||||
return open(openFileDialog.GetPath(), "rb")
|
||||
|
||||
def createControls(self, title, message, text):
|
||||
self.mainBox = wx.BoxSizer(wx.VERTICAL)
|
||||
self.createTextArea(message, text)
|
||||
self.mainBox.Add(self.textBox, 0, wx.ALL, 5)
|
||||
self.usersbox = wx.BoxSizer(wx.VERTICAL)
|
||||
self.mentionAll = wx.CheckBox(self.panel, -1, _(u"&Mention to all"), size=wx.DefaultSize)
|
||||
self.mentionAll.Disable()
|
||||
self.usersbox.Add(self.mentionAll, 0, wx.ALL, 5)
|
||||
self.checkboxes = []
|
||||
for i in self.users:
|
||||
user_checkbox = wx.CheckBox(self.panel, -1, "@"+i, size=wx.DefaultSize)
|
||||
self.checkboxes.append(user_checkbox)
|
||||
self.usersbox.Add(self.checkboxes[-1], 0, wx.ALL, 5)
|
||||
self.mainBox.Add(self.usersbox, 0, wx.ALL, 10)
|
||||
self.long_tweet = wx.CheckBox(self.panel, -1, _(u"&Long tweet"))
|
||||
self.upload_image = wx.Button(self.panel, -1, _(u"&Upload image..."), size=wx.DefaultSize)
|
||||
self.spellcheck = wx.Button(self.panel, -1, _("Check &spelling..."), size=wx.DefaultSize)
|
||||
self.attach = wx.Button(self.panel, -1, _(u"&Attach audio..."), size=wx.DefaultSize)
|
||||
self.shortenButton = wx.Button(self.panel, -1, _(u"Sh&orten URL"), size=wx.DefaultSize)
|
||||
self.unshortenButton = wx.Button(self.panel, -1, _(u"&Expand URL"), size=wx.DefaultSize)
|
||||
self.shortenButton.Disable()
|
||||
self.unshortenButton.Disable()
|
||||
self.translateButton = wx.Button(self.panel, -1, _(u"&Translate..."), size=wx.DefaultSize)
|
||||
self.autocompletionButton = wx.Button(self.panel, -1, _(u"Auto&complete users"))
|
||||
self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Sen&d"), size=wx.DefaultSize)
|
||||
self.okButton.SetDefault()
|
||||
cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize)
|
||||
self.buttonsBox1 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
self.buttonsBox1.Add(self.upload_image, 0, wx.ALL, 10)
|
||||
self.buttonsBox1.Add(self.spellcheck, 0, wx.ALL, 10)
|
||||
self.buttonsBox1.Add(self.attach, 0, wx.ALL, 10)
|
||||
self.mainBox.Add(self.buttonsBox1, 0, wx.ALL, 10)
|
||||
self.buttonsBox2 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
self.buttonsBox2.Add(self.shortenButton, 0, wx.ALL, 10)
|
||||
self.buttonsBox2.Add(self.unshortenButton, 0, wx.ALL, 10)
|
||||
self.buttonsBox2.Add(self.translateButton, 0, wx.ALL, 10)
|
||||
self.mainBox.Add(self.buttonsBox2, 0, wx.ALL, 10)
|
||||
self.ok_cancelSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
self.ok_cancelSizer.Add(self.autocompletionButton, 0, wx.ALL, 10)
|
||||
self.ok_cancelSizer.Add(self.okButton, 0, wx.ALL, 10)
|
||||
self.ok_cancelSizer.Add(cancelButton, 0, wx.ALL, 10)
|
||||
self.mainBox.Add(self.ok_cancelSizer, 0, wx.ALL, 10)
|
||||
selectId = wx.ID_ANY
|
||||
self.Bind(wx.EVT_MENU, self.onSelect, id=selectId)
|
||||
self.accel_tbl = wx.AcceleratorTable([
|
||||
(wx.ACCEL_CTRL, ord('A'), selectId),
|
||||
])
|
||||
self.SetAcceleratorTable(self.accel_tbl)
|
||||
self.panel.SetSizer(self.mainBox)
|
||||
|
||||
def __init__(self, title, message, text, users=[], *args, **kwargs):
|
||||
self.users = users
|
||||
super(reply, self).__init__()
|
||||
self.shift=False
|
||||
self.createControls(message, title, text)
|
||||
self.SetClientSize(self.mainBox.CalcMin())
|
||||
|
||||
class viewTweet(widgetUtils.BaseDialog):
|
||||
def set_title(self, lenght):
|
||||
self.SetTitle(_(u"Tweet - %i characters ") % (lenght,))
|
||||
|
||||
def __init__(self, text, rt_count, favs_count, source, date="", *args, **kwargs):
|
||||
super(viewTweet, self).__init__(None, size=(850,850))
|
||||
panel = wx.Panel(self)
|
||||
label = wx.StaticText(panel, -1, _(u"Tweet"))
|
||||
self.text = wx.TextCtrl(panel, -1, text, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180))
|
||||
dc = wx.WindowDC(self.text)
|
||||
dc.SetFont(self.text.GetFont())
|
||||
(x, y) = dc.GetMultiLineTextExtent("0"*140)
|
||||
self.text.SetSize((x, y))
|
||||
self.text.SetFocus()
|
||||
textBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
textBox.Add(label, 0, wx.ALL, 5)
|
||||
textBox.Add(self.text, 1, wx.EXPAND, 5)
|
||||
mainBox = wx.BoxSizer(wx.VERTICAL)
|
||||
mainBox.Add(textBox, 0, wx.ALL, 5)
|
||||
label2 = wx.StaticText(panel, -1, _(u"Image description"))
|
||||
self.image_description = wx.TextCtrl(panel, -1, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180))
|
||||
dc = wx.WindowDC(self.image_description)
|
||||
dc.SetFont(self.image_description.GetFont())
|
||||
(x, y) = dc.GetMultiLineTextExtent("0"*450)
|
||||
self.image_description.SetSize((x, y))
|
||||
self.image_description.Enable(False)
|
||||
iBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
iBox.Add(label2, 0, wx.ALL, 5)
|
||||
iBox.Add(self.image_description, 1, wx.EXPAND, 5)
|
||||
mainBox.Add(iBox, 0, wx.ALL, 5)
|
||||
rtCountLabel = wx.StaticText(panel, -1, _(u"Retweets: "))
|
||||
rtCount = wx.TextCtrl(panel, -1, rt_count, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE)
|
||||
rtBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
rtBox.Add(rtCountLabel, 0, wx.ALL, 5)
|
||||
rtBox.Add(rtCount, 0, wx.ALL, 5)
|
||||
favsCountLabel = wx.StaticText(panel, -1, _(u"Likes: "))
|
||||
favsCount = wx.TextCtrl(panel, -1, favs_count, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE)
|
||||
favsBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
favsBox.Add(favsCountLabel, 0, wx.ALL, 5)
|
||||
favsBox.Add(favsCount, 0, wx.ALL, 5)
|
||||
sourceLabel = wx.StaticText(panel, -1, _(u"Source: "))
|
||||
sourceTweet = wx.TextCtrl(panel, -1, source, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE)
|
||||
sourceBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
sourceBox.Add(sourceLabel, 0, wx.ALL, 5)
|
||||
sourceBox.Add(sourceTweet, 0, wx.ALL, 5)
|
||||
dateLabel = wx.StaticText(panel, -1, _(u"Date: "))
|
||||
dateTweet = wx.TextCtrl(panel, -1, date, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE)
|
||||
dc = wx.WindowDC(dateTweet)
|
||||
dc.SetFont(dateTweet.GetFont())
|
||||
(x, y) = dc.GetTextExtent("0"*100)
|
||||
dateTweet.SetSize((x, y))
|
||||
dateBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
dateBox.Add(dateLabel, 0, wx.ALL, 5)
|
||||
dateBox.Add(dateTweet, 0, wx.ALL, 5)
|
||||
infoBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
infoBox.Add(rtBox, 0, wx.ALL, 5)
|
||||
infoBox.Add(favsBox, 0, wx.ALL, 5)
|
||||
infoBox.Add(sourceBox, 0, wx.ALL, 5)
|
||||
mainBox.Add(infoBox, 0, wx.ALL, 5)
|
||||
mainBox.Add(dateBox, 0, wx.ALL, 5)
|
||||
self.share = wx.Button(panel, wx.ID_ANY, _("Copy link to clipboard"))
|
||||
self.share.Enable(False)
|
||||
self.spellcheck = wx.Button(panel, -1, _("Check &spelling..."), size=wx.DefaultSize)
|
||||
self.unshortenButton = wx.Button(panel, -1, _(u"&Expand URL"), size=wx.DefaultSize)
|
||||
self.unshortenButton.Disable()
|
||||
self.translateButton = wx.Button(panel, -1, _(u"&Translate..."), size=wx.DefaultSize)
|
||||
cancelButton = wx.Button(panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize)
|
||||
cancelButton.SetDefault()
|
||||
buttonsBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
buttonsBox.Add(self.share, 0, wx.ALL, 5)
|
||||
buttonsBox.Add(self.spellcheck, 0, wx.ALL, 5)
|
||||
buttonsBox.Add(self.unshortenButton, 0, wx.ALL, 5)
|
||||
buttonsBox.Add(self.translateButton, 0, wx.ALL, 5)
|
||||
buttonsBox.Add(cancelButton, 0, wx.ALL, 5)
|
||||
mainBox.Add(buttonsBox, 0, wx.ALL, 5)
|
||||
selectId = wx.ID_ANY
|
||||
self.Bind(wx.EVT_MENU, self.onSelect, id=selectId)
|
||||
self.accel_tbl = wx.AcceleratorTable([
|
||||
(wx.ACCEL_CTRL, ord('A'), selectId),
|
||||
])
|
||||
self.SetAcceleratorTable(self.accel_tbl)
|
||||
panel.SetSizer(mainBox)
|
||||
self.SetClientSize(mainBox.CalcMin())
|
||||
|
||||
def set_text(self, text):
|
||||
self.text.ChangeValue(text)
|
||||
|
||||
def get_text(self):
|
||||
return self.text.GetValue()
|
||||
|
||||
def set_image_description(self, desc):
|
||||
self.image_description.Enable(True)
|
||||
if len(self.image_description.GetValue()) == 0:
|
||||
self.image_description.SetValue(desc)
|
||||
else:
|
||||
self.image_description.SetValue(self.image_description.GetValue()+"\n"+desc)
|
||||
|
||||
def text_focus(self):
|
||||
self.text.SetFocus()
|
||||
|
||||
def onSelect(self, ev):
|
||||
self.text.SelectAll()
|
||||
|
||||
def enable_button(self, buttonName):
|
||||
if hasattr(self, buttonName):
|
||||
return getattr(self, buttonName).Enable()
|
||||
|
||||
class viewNonTweet(widgetUtils.BaseDialog):
|
||||
|
||||
def __init__(self, text, date="", *args, **kwargs):
|
||||
super(viewNonTweet, self).__init__(None, size=(850,850))
|
||||
self.SetTitle(_(u"View"))
|
||||
panel = wx.Panel(self)
|
||||
label = wx.StaticText(panel, -1, _(u"Item"))
|
||||
self.text = wx.TextCtrl(parent=panel, id=-1, value=text, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180))
|
||||
dc = wx.WindowDC(self.text)
|
||||
dc.SetFont(self.text.GetFont())
|
||||
(x, y) = dc.GetMultiLineTextExtent("0"*140)
|
||||
self.text.SetSize((x, y))
|
||||
self.text.SetFocus()
|
||||
textBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
textBox.Add(label, 0, wx.ALL, 5)
|
||||
textBox.Add(self.text, 1, wx.EXPAND, 5)
|
||||
mainBox = wx.BoxSizer(wx.VERTICAL)
|
||||
mainBox.Add(textBox, 0, wx.ALL, 5)
|
||||
if date != "":
|
||||
dateLabel = wx.StaticText(panel, -1, _(u"Date: "))
|
||||
date = wx.TextCtrl(panel, -1, date, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE)
|
||||
dc = wx.WindowDC(date)
|
||||
dc.SetFont(date.GetFont())
|
||||
(x, y) = dc.GetTextExtent("0"*100)
|
||||
date.SetSize((x, y))
|
||||
dateBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
dateBox.Add(dateLabel, 0, wx.ALL, 5)
|
||||
dateBox.Add(date, 0, wx.ALL, 5)
|
||||
mainBox.Add(dateBox, 0, wx.ALL, 5)
|
||||
self.share = wx.Button(panel, wx.ID_ANY, _("Copy link to clipboard"))
|
||||
self.share.Enable(False)
|
||||
self.spellcheck = wx.Button(panel, -1, _("Check &spelling..."), size=wx.DefaultSize)
|
||||
self.unshortenButton = wx.Button(panel, -1, _(u"&Expand URL"), size=wx.DefaultSize)
|
||||
self.unshortenButton.Disable()
|
||||
self.translateButton = wx.Button(panel, -1, _(u"&Translate..."), size=wx.DefaultSize)
|
||||
cancelButton = wx.Button(panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize)
|
||||
cancelButton.SetDefault()
|
||||
buttonsBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
buttonsBox.Add(self.share, 0, wx.ALL, 5)
|
||||
buttonsBox.Add(self.spellcheck, 0, wx.ALL, 5)
|
||||
buttonsBox.Add(self.unshortenButton, 0, wx.ALL, 5)
|
||||
buttonsBox.Add(self.translateButton, 0, wx.ALL, 5)
|
||||
buttonsBox.Add(cancelButton, 0, wx.ALL, 5)
|
||||
mainBox.Add(buttonsBox, 0, wx.ALL, 5)
|
||||
selectId = wx.ID_ANY
|
||||
self.Bind(wx.EVT_MENU, self.onSelect, id=selectId)
|
||||
self.accel_tbl = wx.AcceleratorTable([
|
||||
(wx.ACCEL_CTRL, ord('A'), selectId),
|
||||
])
|
||||
self.SetAcceleratorTable(self.accel_tbl)
|
||||
panel.SetSizer(mainBox)
|
||||
self.SetClientSize(mainBox.CalcMin())
|
||||
|
||||
def onSelect(self, ev):
|
||||
self.text.SelectAll()
|
||||
|
||||
def set_text(self, text):
|
||||
self.text.ChangeValue(text)
|
||||
|
||||
def get_text(self):
|
||||
return self.text.GetValue()
|
||||
|
||||
def text_focus(self):
|
||||
self.text.SetFocus()
|
||||
|
||||
def enable_button(self, buttonName):
|
||||
if hasattr(self, buttonName):
|
||||
return getattr(self, buttonName).Enable()
|
1
src/wxUI/dialogs/twitterDialogs/__init__.py
Normal file
1
src/wxUI/dialogs/twitterDialogs/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from .tweetDialogs import tweet, reply, dm, viewTweet, viewNonTweet, poll
|
542
src/wxUI/dialogs/twitterDialogs/tweetDialogs.py
Normal file
542
src/wxUI/dialogs/twitterDialogs/tweetDialogs.py
Normal file
@@ -0,0 +1,542 @@
|
||||
""" GUI dialogs for tweet writing and displaying. """
|
||||
import wx
|
||||
from typing import List
|
||||
|
||||
class tweet(wx.Dialog):
|
||||
def __init__(self, title: str, caption: str, message: str = "", max_length: int = 280, thread_mode: bool = True, *args, **kwds) -> None:
|
||||
""" Creates the basic Tweet dialog. This might be considered the base class for other dialogs.
|
||||
title str: title to be used in the dialog.
|
||||
caption str: This is the text to be placed alongside the text field.
|
||||
message str: Text to be inserted in the tweet.
|
||||
max_length int: Maximum amount of characters the tweet will accept. By default is 280 chahracters.
|
||||
thread_mode bool: If set to False, disables the button that allows to make threads by adding more tweets.
|
||||
"""
|
||||
super(tweet, self).__init__(parent=None, *args, **kwds)
|
||||
self.SetTitle(title)
|
||||
self.create_controls(max_length=max_length, caption=caption, message=message, thread_mode=thread_mode)
|
||||
|
||||
def create_controls(self, message: str, caption: str, max_length: int, thread_mode: bool) -> None:
|
||||
panel = wx.Panel(self)
|
||||
mainBox = wx.BoxSizer(wx.VERTICAL)
|
||||
text_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
mainBox.Add(text_sizer, 1, wx.EXPAND, 0)
|
||||
label_1 = wx.StaticText(panel, wx.ID_ANY, caption)
|
||||
text_sizer.Add(label_1, 0, 0, 0)
|
||||
self.text = wx.TextCtrl(panel, wx.ID_ANY, "", size=(444, -1), style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER)
|
||||
self.Bind(wx.EVT_CHAR_HOOK, self.handle_keys, self.text)
|
||||
text_sizer.Add(self.text, 1, wx.EXPAND, 0)
|
||||
list_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
mainBox.Add(list_sizer, 1, wx.EXPAND, 0)
|
||||
Attachment_sizer = wx.BoxSizer(wx.VERTICAL)
|
||||
list_sizer.Add(Attachment_sizer, 1, wx.EXPAND, 0)
|
||||
label_2 = wx.StaticText(panel, wx.ID_ANY, _("Attachments"))
|
||||
Attachment_sizer.Add(label_2, 0, 0, 0)
|
||||
self.attachments = wx.ListCtrl(panel, wx.ID_ANY, style=wx.BORDER_SUNKEN | wx.LC_HRULES | wx.LC_REPORT | wx.LC_SINGLE_SEL | wx.LC_VRULES)
|
||||
self.attachments.AppendColumn(_("File"))
|
||||
self.attachments.AppendColumn(_("Type"))
|
||||
self.attachments.AppendColumn(_("Description"))
|
||||
Attachment_sizer.Add(self.attachments, 1, wx.EXPAND, 0)
|
||||
self.remove_attachment = wx.Button(panel, wx.ID_ANY, _("Delete attachment"))
|
||||
self.remove_attachment.Enable(False)
|
||||
Attachment_sizer.Add(self.remove_attachment, 0, 0, 0)
|
||||
tweet_sizer = wx.BoxSizer(wx.VERTICAL)
|
||||
list_sizer.Add(tweet_sizer, 1, wx.EXPAND, 0)
|
||||
label_3 = wx.StaticText(panel, wx.ID_ANY, _("Added Tweets"))
|
||||
tweet_sizer.Add(label_3, 0, 0, 0)
|
||||
self.tweets = wx.ListCtrl(panel, wx.ID_ANY, style=wx.BORDER_SUNKEN | wx.LC_HRULES | wx.LC_REPORT | wx.LC_SINGLE_SEL | wx.LC_VRULES)
|
||||
self.tweets.AppendColumn(_("Text"))
|
||||
self.tweets.AppendColumn(_("Attachments"))
|
||||
self.tweets.Enable(False)
|
||||
tweet_sizer.Add(self.tweets, 1, wx.EXPAND, 0)
|
||||
self.remove_tweet = wx.Button(panel, wx.ID_ANY, _("Delete tweet"))
|
||||
self.remove_tweet.Enable(False)
|
||||
tweet_sizer.Add(self.remove_tweet, 0, 0, 0)
|
||||
btn_sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
mainBox.Add(btn_sizer_1, 1, wx.EXPAND, 0)
|
||||
self.add = wx.Button(panel, wx.ID_ANY, _("A&dd..."))
|
||||
btn_sizer_1.Add(self.add, 0, 0, 0)
|
||||
self.add_tweet = wx.Button(panel, wx.ID_ANY, _("Add t&weet"))
|
||||
self.add_tweet.Enable(thread_mode)
|
||||
btn_sizer_1.Add(self.add_tweet, 0, 0, 0)
|
||||
self.add_audio = wx.Button(panel, wx.ID_ANY, _("&Attach audio..."))
|
||||
btn_sizer_1.Add(self.add_audio, 0, 0, 0)
|
||||
btn_sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
mainBox.Add(btn_sizer_2, 1, wx.EXPAND, 0)
|
||||
self.autocomplete_users = wx.Button(panel, wx.ID_ANY, _("Auto&complete users"))
|
||||
btn_sizer_2.Add(self.autocomplete_users, 0, 0, 0)
|
||||
self.spellcheck = wx.Button(panel, wx.ID_ANY, _("Check &spelling..."))
|
||||
btn_sizer_2.Add(self.spellcheck, 0, 0, 0)
|
||||
self.translate = wx.Button(panel, wx.ID_ANY, _("&Translate"))
|
||||
btn_sizer_2.Add(self.translate, 0, 0, 0)
|
||||
ok_cancel_sizer = wx.StdDialogButtonSizer()
|
||||
mainBox.Add(ok_cancel_sizer, 0, wx.ALIGN_RIGHT | wx.ALL, 4)
|
||||
self.send = wx.Button(panel, wx.ID_OK, _("Sen&d"))
|
||||
self.send.SetDefault()
|
||||
ok_cancel_sizer.Add(self.send, 0, 0, 0)
|
||||
self.cancel = wx.Button(panel, wx.ID_CANCEL, "")
|
||||
ok_cancel_sizer.AddButton(self.cancel)
|
||||
ok_cancel_sizer.Realize()
|
||||
panel.SetSizer(mainBox)
|
||||
self.Fit()
|
||||
self.SetAffirmativeId(self.send.GetId())
|
||||
self.SetEscapeId(self.cancel.GetId())
|
||||
self.Layout()
|
||||
|
||||
def handle_keys(self, event: wx.Event, *args, **kwargs) -> None:
|
||||
""" Allows to react to certain keyboard events from the text control. """
|
||||
shift=event.ShiftDown()
|
||||
if event.GetKeyCode() == wx.WXK_RETURN and shift==False and hasattr(self,'send'):
|
||||
self.EndModal(wx.ID_OK)
|
||||
else:
|
||||
event.Skip()
|
||||
|
||||
def reset_controls(self) -> None:
|
||||
""" Resetss text control and attachments to their default, empty values. This is used while adding more tweets in a thread. """
|
||||
self.text.ChangeValue("")
|
||||
self.attachments.DeleteAllItems()
|
||||
|
||||
def add_item(self, list_type: str = "attachment", item: List[str] = []) -> None:
|
||||
""" Adds an item to a list control. Item should be a list with the same amount of items for each column present in the ListCtrl. """
|
||||
if list_type == "attachment":
|
||||
self.attachments.Append(item)
|
||||
else:
|
||||
self.tweets.Append(item)
|
||||
|
||||
def remove_item(self, list_type: str = "attachment") -> None:
|
||||
if list_type == "attachment":
|
||||
item = self.attachments.GetFocusedItem()
|
||||
if item > -1:
|
||||
self.attachments.DeleteItem(item)
|
||||
else:
|
||||
item = self.tweets.GetFocusedItem()
|
||||
if item > -1:
|
||||
self.tweets.DeleteItem(item)
|
||||
|
||||
def attach_menu(self, event=None, enabled=True, *args, **kwargs):
|
||||
menu = wx.Menu()
|
||||
self.add_image = menu.Append(wx.ID_ANY, _("Image"))
|
||||
self.add_image.Enable(enabled)
|
||||
self.add_video = menu.Append(wx.ID_ANY, _("Video"))
|
||||
self.add_video.Enable(enabled)
|
||||
self.add_poll = menu.Append(wx.ID_ANY, _("Poll"))
|
||||
self.add_poll.Enable(enabled)
|
||||
return menu
|
||||
|
||||
def ask_description(self):
|
||||
dlg = wx.TextEntryDialog(self, _(u"please provide a description"), _(u"Description"))
|
||||
dlg.ShowModal()
|
||||
result = dlg.GetValue()
|
||||
dlg.Destroy()
|
||||
return result
|
||||
|
||||
def get_image(self):
|
||||
openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
|
||||
if openFileDialog.ShowModal() == wx.ID_CANCEL:
|
||||
return (None, None)
|
||||
dsc = self.ask_description()
|
||||
return (openFileDialog.GetPath(), dsc)
|
||||
|
||||
def get_video(self):
|
||||
openFileDialog = wx.FileDialog(self, _("Select the video to be uploaded"), "", "", _("Video files (*.mp4)|*.mp4"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
|
||||
if openFileDialog.ShowModal() == wx.ID_CANCEL:
|
||||
return None
|
||||
return openFileDialog.GetPath()
|
||||
|
||||
def unable_to_attach_file(self, *args, **kwargs):
|
||||
return wx.MessageDialog(self, _("It is not possible to add more attachments. Please make sure your tweet complies with Twitter'S attachment rules. You can add only one video or GIF in every tweet, and a maximum of 4 photos."), _("Error adding attachment"), wx.ICON_ERROR).ShowModal()
|
||||
|
||||
class reply(tweet):
|
||||
|
||||
def __init__(self, users: List[str] = [], *args, **kwargs) -> None:
|
||||
self.users = users
|
||||
super(reply, self).__init__(*args, **kwargs)
|
||||
|
||||
def create_controls(self, message: str, caption: str, max_length: int, thread_mode: bool) -> None:
|
||||
panel = wx.Panel(self)
|
||||
mainBox = wx.BoxSizer(wx.VERTICAL)
|
||||
text_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
mainBox.Add(text_sizer, 1, wx.EXPAND, 0)
|
||||
label_1 = wx.StaticText(panel, wx.ID_ANY, caption)
|
||||
text_sizer.Add(label_1, 0, 0, 0)
|
||||
self.text = wx.TextCtrl(panel, wx.ID_ANY, "", size=(500, 200), style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER)
|
||||
self.Bind(wx.EVT_CHAR_HOOK, self.handle_keys, self.text)
|
||||
text_sizer.Add(self.text, 1, wx.EXPAND, 0)
|
||||
list_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
mainBox.Add(list_sizer, 1, wx.EXPAND, 0)
|
||||
Attachment_sizer = wx.BoxSizer(wx.VERTICAL)
|
||||
list_sizer.Add(Attachment_sizer, 1, wx.EXPAND, 0)
|
||||
label_2 = wx.StaticText(panel, wx.ID_ANY, _("Attachments"))
|
||||
Attachment_sizer.Add(label_2, 0, 0, 0)
|
||||
self.attachments = wx.ListCtrl(panel, wx.ID_ANY, style=wx.BORDER_SUNKEN | wx.LC_HRULES | wx.LC_REPORT | wx.LC_SINGLE_SEL | wx.LC_VRULES)
|
||||
self.attachments.AppendColumn(_("File"))
|
||||
self.attachments.AppendColumn(_("Type"))
|
||||
self.attachments.AppendColumn(_("Description"))
|
||||
Attachment_sizer.Add(self.attachments, 1, wx.EXPAND, 0)
|
||||
self.remove_attachment = wx.Button(panel, wx.ID_ANY, _("Delete attachment"))
|
||||
self.remove_attachment.Enable(False)
|
||||
Attachment_sizer.Add(self.remove_attachment, 0, 0, 0)
|
||||
user_sizer = wx.BoxSizer(wx.VERTICAL)
|
||||
list_sizer.Add(user_sizer, 0, 0, 0)
|
||||
self.mention_all = wx.CheckBox(panel, -1, _(u"&Mention to all"), size=wx.DefaultSize)
|
||||
self.mention_all.Disable()
|
||||
user_sizer.Add(self.mention_all, 0, wx.ALL, 5)
|
||||
self.checkboxes = []
|
||||
for i in self.users:
|
||||
user_checkbox = wx.CheckBox(panel, -1, "@"+i, size=wx.DefaultSize)
|
||||
self.checkboxes.append(user_checkbox)
|
||||
user_sizer.Add(self.checkboxes[-1], 0, wx.ALL, 5)
|
||||
btn_sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
mainBox.Add(btn_sizer_1, 1, wx.EXPAND, 0)
|
||||
self.add = wx.Button(panel, wx.ID_ANY, _("A&dd..."))
|
||||
btn_sizer_1.Add(self.add, 0, 0, 0)
|
||||
self.add_audio = wx.Button(panel, wx.ID_ANY, _("&Attach audio..."))
|
||||
btn_sizer_1.Add(self.add_audio, 0, 0, 0)
|
||||
btn_sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
mainBox.Add(btn_sizer_2, 1, wx.EXPAND, 0)
|
||||
self.autocomplete_users = wx.Button(panel, wx.ID_ANY, _("Auto&complete users"))
|
||||
btn_sizer_2.Add(self.autocomplete_users, 0, 0, 0)
|
||||
self.spellcheck = wx.Button(panel, wx.ID_ANY, _("Check &spelling..."))
|
||||
btn_sizer_2.Add(self.spellcheck, 0, 0, 0)
|
||||
self.translate = wx.Button(panel, wx.ID_ANY, _("&Translate"))
|
||||
btn_sizer_2.Add(self.translate, 0, 0, 0)
|
||||
ok_cancel_sizer = wx.StdDialogButtonSizer()
|
||||
mainBox.Add(ok_cancel_sizer, 0, wx.ALIGN_RIGHT | wx.ALL, 4)
|
||||
self.send = wx.Button(panel, wx.ID_OK, _("Sen&d"))
|
||||
self.send.SetDefault()
|
||||
ok_cancel_sizer.Add(self.send, 0, 0, 0)
|
||||
self.cancel = wx.Button(panel, wx.ID_CANCEL, "")
|
||||
ok_cancel_sizer.AddButton(self.cancel)
|
||||
ok_cancel_sizer.Realize()
|
||||
panel.SetSizer(mainBox)
|
||||
self.Fit()
|
||||
self.SetAffirmativeId(self.send.GetId())
|
||||
self.SetEscapeId(self.cancel.GetId())
|
||||
self.Layout()
|
||||
|
||||
def attach_menu(self, event=None, enabled=True, *args, **kwargs):
|
||||
menu = wx.Menu()
|
||||
self.add_image = menu.Append(wx.ID_ANY, _("Image"))
|
||||
self.add_image.Enable(enabled)
|
||||
self.add_video = menu.Append(wx.ID_ANY, _("Video"))
|
||||
self.add_video.Enable(enabled)
|
||||
return menu
|
||||
|
||||
class dm(tweet):
|
||||
|
||||
def __init__(self, users: List[str] = [], *args, **kwargs) -> None:
|
||||
self.users = users
|
||||
super(dm, self).__init__(*args, **kwargs)
|
||||
|
||||
def create_controls(self, message: str, caption: str, max_length: int, thread_mode: bool) -> None:
|
||||
panel = wx.Panel(self)
|
||||
mainBox = wx.BoxSizer(wx.VERTICAL)
|
||||
label_recipient = wx.StaticText(panel, -1, _("&Recipient"))
|
||||
self.cb = wx.ComboBox(panel, -1, choices=self.users, value=self.users[0], size=wx.DefaultSize)
|
||||
self.autocomplete_users = wx.Button(panel, -1, _(u"Auto&complete users"))
|
||||
recipient_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
recipient_sizer.Add(label_recipient, 0, 0, 0)
|
||||
recipient_sizer.Add(self.cb, 1, wx.EXPAND, 0)
|
||||
mainBox.Add(recipient_sizer, 0, wx.EXPAND, 0)
|
||||
text_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
mainBox.Add(text_sizer, 1, wx.EXPAND, 0)
|
||||
label_1 = wx.StaticText(panel, wx.ID_ANY, caption)
|
||||
text_sizer.Add(label_1, 0, 0, 0)
|
||||
self.text = wx.TextCtrl(panel, wx.ID_ANY, "", size=(500, 200), style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER)
|
||||
self.Bind(wx.EVT_CHAR_HOOK, self.handle_keys, self.text)
|
||||
self.text.SetFocus()
|
||||
text_sizer.Add(self.text, 1, wx.EXPAND, 0)
|
||||
list_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
mainBox.Add(list_sizer, 1, wx.EXPAND, 0)
|
||||
Attachment_sizer = wx.BoxSizer(wx.VERTICAL)
|
||||
list_sizer.Add(Attachment_sizer, 1, wx.EXPAND, 0)
|
||||
label_2 = wx.StaticText(panel, wx.ID_ANY, _("Attachments"))
|
||||
Attachment_sizer.Add(label_2, 0, 0, 0)
|
||||
self.attachments = wx.ListCtrl(panel, wx.ID_ANY, style=wx.BORDER_SUNKEN | wx.LC_HRULES | wx.LC_REPORT | wx.LC_SINGLE_SEL | wx.LC_VRULES)
|
||||
self.attachments.AppendColumn(_("File"))
|
||||
self.attachments.AppendColumn(_("Type"))
|
||||
self.attachments.AppendColumn(_("Description"))
|
||||
Attachment_sizer.Add(self.attachments, 1, wx.EXPAND, 0)
|
||||
self.remove_attachment = wx.Button(panel, wx.ID_ANY, _("Delete attachment"))
|
||||
self.remove_attachment.Enable(False)
|
||||
Attachment_sizer.Add(self.remove_attachment, 0, 0, 0)
|
||||
btn_sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
mainBox.Add(btn_sizer_1, 1, wx.EXPAND, 0)
|
||||
self.add = wx.Button(panel, wx.ID_ANY, _("A&dd..."))
|
||||
btn_sizer_1.Add(self.add, 0, 0, 0)
|
||||
self.add_audio = wx.Button(panel, wx.ID_ANY, _("&Attach audio..."))
|
||||
btn_sizer_1.Add(self.add_audio, 0, 0, 0)
|
||||
btn_sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
mainBox.Add(btn_sizer_2, 1, wx.EXPAND, 0)
|
||||
self.spellcheck = wx.Button(panel, wx.ID_ANY, _("Check &spelling..."))
|
||||
btn_sizer_2.Add(self.spellcheck, 0, 0, 0)
|
||||
self.translate = wx.Button(panel, wx.ID_ANY, _("&Translate"))
|
||||
btn_sizer_2.Add(self.translate, 0, 0, 0)
|
||||
ok_cancel_sizer = wx.StdDialogButtonSizer()
|
||||
mainBox.Add(ok_cancel_sizer, 0, wx.ALIGN_RIGHT | wx.ALL, 4)
|
||||
self.send = wx.Button(panel, wx.ID_OK, _("Sen&d"))
|
||||
self.send.SetDefault()
|
||||
ok_cancel_sizer.Add(self.send, 0, 0, 0)
|
||||
self.cancel = wx.Button(panel, wx.ID_CANCEL, "")
|
||||
ok_cancel_sizer.AddButton(self.cancel)
|
||||
ok_cancel_sizer.Realize()
|
||||
panel.SetSizer(mainBox)
|
||||
self.Fit()
|
||||
self.SetAffirmativeId(self.send.GetId())
|
||||
self.SetEscapeId(self.cancel.GetId())
|
||||
self.Layout()
|
||||
|
||||
def get_image(self):
|
||||
openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
|
||||
if openFileDialog.ShowModal() == wx.ID_CANCEL:
|
||||
return (None, None)
|
||||
return (openFileDialog.GetPath(), "")
|
||||
|
||||
def attach_menu(self, event=None, enabled=True, *args, **kwargs):
|
||||
menu = wx.Menu()
|
||||
self.add_image = menu.Append(wx.ID_ANY, _("Image"))
|
||||
self.add_image.Enable(enabled)
|
||||
self.add_video = menu.Append(wx.ID_ANY, _("Video"))
|
||||
self.add_video.Enable(enabled)
|
||||
return menu
|
||||
|
||||
class viewTweet(wx.Dialog):
|
||||
def set_title(self, lenght):
|
||||
self.SetTitle(_(u"Tweet - %i characters ") % (lenght,))
|
||||
|
||||
def __init__(self, text, rt_count, favs_count, source, date="", *args, **kwargs):
|
||||
super(viewTweet, self).__init__(None, size=(850,850))
|
||||
panel = wx.Panel(self)
|
||||
label = wx.StaticText(panel, -1, _(u"Tweet"))
|
||||
self.text = wx.TextCtrl(panel, -1, text, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180))
|
||||
dc = wx.WindowDC(self.text)
|
||||
dc.SetFont(self.text.GetFont())
|
||||
(x, y) = dc.GetMultiLineTextExtent("W"*280)
|
||||
self.text.SetSize((x, y))
|
||||
self.text.SetFocus()
|
||||
textBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
textBox.Add(label, 0, wx.ALL, 5)
|
||||
textBox.Add(self.text, 1, wx.EXPAND, 5)
|
||||
mainBox = wx.BoxSizer(wx.VERTICAL)
|
||||
mainBox.Add(textBox, 0, wx.ALL, 5)
|
||||
label2 = wx.StaticText(panel, -1, _(u"Image description"))
|
||||
self.image_description = wx.TextCtrl(panel, -1, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180))
|
||||
dc = wx.WindowDC(self.image_description)
|
||||
dc.SetFont(self.image_description.GetFont())
|
||||
(x, y) = dc.GetMultiLineTextExtent("0"*450)
|
||||
self.image_description.SetSize((x, y))
|
||||
self.image_description.Enable(False)
|
||||
iBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
iBox.Add(label2, 0, wx.ALL, 5)
|
||||
iBox.Add(self.image_description, 1, wx.EXPAND, 5)
|
||||
mainBox.Add(iBox, 0, wx.ALL, 5)
|
||||
rtCountLabel = wx.StaticText(panel, -1, _(u"Retweets: "))
|
||||
rtCount = wx.TextCtrl(panel, -1, rt_count, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE)
|
||||
rtBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
rtBox.Add(rtCountLabel, 0, wx.ALL, 5)
|
||||
rtBox.Add(rtCount, 0, wx.ALL, 5)
|
||||
favsCountLabel = wx.StaticText(panel, -1, _(u"Likes: "))
|
||||
favsCount = wx.TextCtrl(panel, -1, favs_count, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE)
|
||||
favsBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
favsBox.Add(favsCountLabel, 0, wx.ALL, 5)
|
||||
favsBox.Add(favsCount, 0, wx.ALL, 5)
|
||||
sourceLabel = wx.StaticText(panel, -1, _(u"Source: "))
|
||||
sourceTweet = wx.TextCtrl(panel, -1, source, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE)
|
||||
sourceBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
sourceBox.Add(sourceLabel, 0, wx.ALL, 5)
|
||||
sourceBox.Add(sourceTweet, 0, wx.ALL, 5)
|
||||
dateLabel = wx.StaticText(panel, -1, _(u"Date: "))
|
||||
dateTweet = wx.TextCtrl(panel, -1, date, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE)
|
||||
dc = wx.WindowDC(dateTweet)
|
||||
dc.SetFont(dateTweet.GetFont())
|
||||
(x, y) = dc.GetTextExtent("0"*100)
|
||||
dateTweet.SetSize((x, y))
|
||||
dateBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
dateBox.Add(dateLabel, 0, wx.ALL, 5)
|
||||
dateBox.Add(dateTweet, 0, wx.ALL, 5)
|
||||
infoBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
infoBox.Add(rtBox, 0, wx.ALL, 5)
|
||||
infoBox.Add(favsBox, 0, wx.ALL, 5)
|
||||
infoBox.Add(sourceBox, 0, wx.ALL, 5)
|
||||
mainBox.Add(infoBox, 0, wx.ALL, 5)
|
||||
mainBox.Add(dateBox, 0, wx.ALL, 5)
|
||||
self.share = wx.Button(panel, wx.ID_ANY, _("Copy link to clipboard"))
|
||||
self.share.Enable(False)
|
||||
self.spellcheck = wx.Button(panel, -1, _("Check &spelling..."), size=wx.DefaultSize)
|
||||
self.translateButton = wx.Button(panel, -1, _(u"&Translate..."), size=wx.DefaultSize)
|
||||
cancelButton = wx.Button(panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize)
|
||||
cancelButton.SetDefault()
|
||||
buttonsBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
buttonsBox.Add(self.share, 0, wx.ALL, 5)
|
||||
buttonsBox.Add(self.spellcheck, 0, wx.ALL, 5)
|
||||
buttonsBox.Add(self.translateButton, 0, wx.ALL, 5)
|
||||
buttonsBox.Add(cancelButton, 0, wx.ALL, 5)
|
||||
mainBox.Add(buttonsBox, 0, wx.ALL, 5)
|
||||
selectId = wx.ID_ANY
|
||||
self.Bind(wx.EVT_MENU, self.onSelect, id=selectId)
|
||||
self.accel_tbl = wx.AcceleratorTable([
|
||||
(wx.ACCEL_CTRL, ord('A'), selectId),
|
||||
])
|
||||
self.SetAcceleratorTable(self.accel_tbl)
|
||||
panel.SetSizer(mainBox)
|
||||
self.SetClientSize(mainBox.CalcMin())
|
||||
|
||||
def set_text(self, text):
|
||||
self.text.ChangeValue(text)
|
||||
|
||||
def get_text(self):
|
||||
return self.text.GetValue()
|
||||
|
||||
def set_image_description(self, desc):
|
||||
self.image_description.Enable(True)
|
||||
if len(self.image_description.GetValue()) == 0:
|
||||
self.image_description.SetValue(desc)
|
||||
else:
|
||||
self.image_description.SetValue(self.image_description.GetValue()+"\n"+desc)
|
||||
|
||||
def text_focus(self):
|
||||
self.text.SetFocus()
|
||||
|
||||
def onSelect(self, ev):
|
||||
self.text.SelectAll()
|
||||
|
||||
def enable_button(self, buttonName):
|
||||
if hasattr(self, buttonName):
|
||||
return getattr(self, buttonName).Enable()
|
||||
|
||||
class viewNonTweet(wx.Dialog):
|
||||
|
||||
def __init__(self, text, date="", *args, **kwargs):
|
||||
super(viewNonTweet, self).__init__(None, size=(850,850))
|
||||
self.SetTitle(_(u"View"))
|
||||
panel = wx.Panel(self)
|
||||
label = wx.StaticText(panel, -1, _(u"Item"))
|
||||
self.text = wx.TextCtrl(parent=panel, id=-1, value=text, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180))
|
||||
dc = wx.WindowDC(self.text)
|
||||
dc.SetFont(self.text.GetFont())
|
||||
(x, y) = dc.GetMultiLineTextExtent("0"*140)
|
||||
self.text.SetSize((x, y))
|
||||
self.text.SetFocus()
|
||||
textBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
textBox.Add(label, 0, wx.ALL, 5)
|
||||
textBox.Add(self.text, 1, wx.EXPAND, 5)
|
||||
mainBox = wx.BoxSizer(wx.VERTICAL)
|
||||
mainBox.Add(textBox, 0, wx.ALL, 5)
|
||||
if date != "":
|
||||
dateLabel = wx.StaticText(panel, -1, _(u"Date: "))
|
||||
date = wx.TextCtrl(panel, -1, date, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE)
|
||||
dc = wx.WindowDC(date)
|
||||
dc.SetFont(date.GetFont())
|
||||
(x, y) = dc.GetTextExtent("0"*100)
|
||||
date.SetSize((x, y))
|
||||
dateBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
dateBox.Add(dateLabel, 0, wx.ALL, 5)
|
||||
dateBox.Add(date, 0, wx.ALL, 5)
|
||||
mainBox.Add(dateBox, 0, wx.ALL, 5)
|
||||
self.share = wx.Button(panel, wx.ID_ANY, _("Copy link to clipboard"))
|
||||
self.share.Enable(False)
|
||||
self.spellcheck = wx.Button(panel, -1, _("Check &spelling..."), size=wx.DefaultSize)
|
||||
self.unshortenButton = wx.Button(panel, -1, _(u"&Expand URL"), size=wx.DefaultSize)
|
||||
self.unshortenButton.Disable()
|
||||
self.translateButton = wx.Button(panel, -1, _(u"&Translate..."), size=wx.DefaultSize)
|
||||
cancelButton = wx.Button(panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize)
|
||||
cancelButton.SetDefault()
|
||||
buttonsBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
buttonsBox.Add(self.share, 0, wx.ALL, 5)
|
||||
buttonsBox.Add(self.spellcheck, 0, wx.ALL, 5)
|
||||
buttonsBox.Add(self.unshortenButton, 0, wx.ALL, 5)
|
||||
buttonsBox.Add(self.translateButton, 0, wx.ALL, 5)
|
||||
buttonsBox.Add(cancelButton, 0, wx.ALL, 5)
|
||||
mainBox.Add(buttonsBox, 0, wx.ALL, 5)
|
||||
selectId = wx.ID_ANY
|
||||
self.Bind(wx.EVT_MENU, self.onSelect, id=selectId)
|
||||
self.accel_tbl = wx.AcceleratorTable([
|
||||
(wx.ACCEL_CTRL, ord('A'), selectId),
|
||||
])
|
||||
self.SetAcceleratorTable(self.accel_tbl)
|
||||
panel.SetSizer(mainBox)
|
||||
self.SetClientSize(mainBox.CalcMin())
|
||||
|
||||
def onSelect(self, ev):
|
||||
self.text.SelectAll()
|
||||
|
||||
def set_text(self, text):
|
||||
self.text.ChangeValue(text)
|
||||
|
||||
def get_text(self):
|
||||
return self.text.GetValue()
|
||||
|
||||
def text_focus(self):
|
||||
self.text.SetFocus()
|
||||
|
||||
def enable_button(self, buttonName):
|
||||
if hasattr(self, buttonName):
|
||||
return getattr(self, buttonName).Enable()
|
||||
|
||||
class poll(wx.Dialog):
|
||||
def __init__(self, *args, **kwds):
|
||||
super(poll, self).__init__(parent=None, id=wx.NewId(), title=_("Add a poll"))
|
||||
sizer_1 = wx.BoxSizer(wx.VERTICAL)
|
||||
period_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
sizer_1.Add(period_sizer, 1, wx.EXPAND, 0)
|
||||
label_period = wx.StaticText(self, wx.ID_ANY, _("Participation time (in days)"))
|
||||
period_sizer.Add(label_period, 0, 0, 0)
|
||||
self.period = wx.SpinCtrl(self, wx.ID_ANY)
|
||||
self.period.SetFocus()
|
||||
self.period.SetRange(1, 7)
|
||||
self.period.SetValue(7)
|
||||
period_sizer.Add(self.period, 0, 0, 0)
|
||||
sizer_2 = wx.StaticBoxSizer(wx.StaticBox(self, wx.ID_ANY, _("Choices")), wx.VERTICAL)
|
||||
sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
|
||||
option1_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
sizer_2.Add(option1_sizer, 1, wx.EXPAND, 0)
|
||||
label_2 = wx.StaticText(self, wx.ID_ANY, _("Option 1"))
|
||||
option1_sizer.Add(label_2, 0, 0, 0)
|
||||
self.option1 = wx.TextCtrl(self, wx.ID_ANY, "")
|
||||
self.option1.SetMaxLength(25)
|
||||
option1_sizer.Add(self.option1, 0, 0, 0)
|
||||
option2_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
sizer_2.Add(option2_sizer, 1, wx.EXPAND, 0)
|
||||
label_3 = wx.StaticText(self, wx.ID_ANY, _("Option 2"))
|
||||
option2_sizer.Add(label_3, 0, 0, 0)
|
||||
self.option2 = wx.TextCtrl(self, wx.ID_ANY, "")
|
||||
self.option2.SetMaxLength(25)
|
||||
option2_sizer.Add(self.option2, 0, 0, 0)
|
||||
option3_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
sizer_2.Add(option3_sizer, 1, wx.EXPAND, 0)
|
||||
label_4 = wx.StaticText(self, wx.ID_ANY, _("Option 3"))
|
||||
option3_sizer.Add(label_4, 0, 0, 0)
|
||||
self.option3 = wx.TextCtrl(self, wx.ID_ANY, "")
|
||||
self.option3.SetMaxLength(25)
|
||||
option3_sizer.Add(self.option3, 0, 0, 0)
|
||||
option4_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
sizer_2.Add(option4_sizer, 1, wx.EXPAND, 0)
|
||||
label_5 = wx.StaticText(self, wx.ID_ANY, _("Option 4"))
|
||||
option4_sizer.Add(label_5, 0, 0, 0)
|
||||
self.option4 = wx.TextCtrl(self, wx.ID_ANY, "")
|
||||
self.option4.SetMaxLength(25)
|
||||
option4_sizer.Add(self.option4, 0, 0, 0)
|
||||
btn_sizer = wx.StdDialogButtonSizer()
|
||||
sizer_1.Add(btn_sizer, 0, wx.ALIGN_RIGHT | wx.ALL, 4)
|
||||
self.button_OK = wx.Button(self, wx.ID_OK)
|
||||
self.button_OK.SetDefault()
|
||||
self.button_OK.Bind(wx.EVT_BUTTON, self.validate_data)
|
||||
btn_sizer.AddButton(self.button_OK)
|
||||
self.button_CANCEL = wx.Button(self, wx.ID_CANCEL, "")
|
||||
btn_sizer.AddButton(self.button_CANCEL)
|
||||
btn_sizer.Realize()
|
||||
self.SetSizer(sizer_1)
|
||||
sizer_1.Fit(self)
|
||||
self.SetAffirmativeId(self.button_OK.GetId())
|
||||
self.SetEscapeId(self.button_CANCEL.GetId())
|
||||
self.Layout()
|
||||
|
||||
def get_options(self):
|
||||
controls = [self.option1, self.option2, self.option3, self.option4]
|
||||
options = [option.GetValue() for option in controls if option.GetValue() != ""]
|
||||
return options
|
||||
|
||||
def validate_data(self, *args, **kwargs):
|
||||
options = self.get_options()
|
||||
if len(options) < 2:
|
||||
return wx.MessageDialog(self, _("Please make sure you have provided at least two options for the poll."), _("Not enough information"), wx.ICON_ERROR).ShowModal()
|
||||
self.EndModal(wx.ID_OK)
|
Reference in New Issue
Block a user