mirror of
https://github.com/MCV-Software/TWBlue.git
synced 2025-08-25 17:39:23 +00:00
Compare commits
39 Commits
v0.80
...
snapshot10
Author | SHA1 | Date | |
---|---|---|---|
a8f7477a1f | |||
9b6461e34e | |||
eed3f81cb8 | |||
e605c750b1 | |||
f49be6cfed | |||
696faed007 | |||
![]() |
46b46c4d6d | ||
![]() |
9cdccca5ff | ||
![]() |
564bee3850 | ||
![]() |
79e723f740 | ||
![]() |
08a2eca98d | ||
![]() |
c830d4b5b4 | ||
112391afeb | |||
![]() |
39e0431b97 | ||
071d75926b | |||
56b64e5c6d | |||
b8cfd60c9e | |||
691a9ae17d | |||
214b9a8809 | |||
e85f54e15c | |||
![]() |
d2245c33ce | ||
ff6695bba3 | |||
cdcdc86627 | |||
b4addf9329 | |||
9d0c9cfdb5 | |||
0afba81c71 | |||
0882e4707d | |||
78079e142f | |||
00a4203e1a | |||
c4fae3b70b | |||
b8dfa4a5e8 | |||
1ca1862a08 | |||
ba76c74324 | |||
![]() |
dda37f0083 | ||
65c353450e | |||
2bfb53abe1 | |||
ab08eada81 | |||
![]() |
5fcc1de9a5 | ||
![]() |
baeb0f7ae8 |
34
README.md
34
README.md
@@ -1,4 +1,4 @@
|
||||
TWBlue -
|
||||
TWBlue -
|
||||
======
|
||||
|
||||
Copyright (C) 2015. [Technow S.L.](https://www.technow.es)
|
||||
@@ -32,12 +32,11 @@ Although most dependencies can be found in the windows-dependencies directory, w
|
||||
|
||||
#### Dependencies packaged in windows installers
|
||||
|
||||
* [Python,](http://python.org) version 2.7.10
|
||||
* [Python,](http://python.org) version 2.7.11
|
||||
If you want to build both x86 and x64 binaries, you can install python x86 to C:\python27 and python x64 to C:\python27x64, for example.
|
||||
* [wxPython](http://www.wxpython.org) for Python 2.7, version 3.0.2.0
|
||||
* [Python windows extensions (pywin32)](http://www.sourceforge.net/projects/pywin32/) for python 2.7, build 219
|
||||
* [Pycurl](http://pycurl.sourceforge.net) 7.19.5.1 for Python 2.7: [32-bit downloads,](https://pypi.python.org/pypi/pycurl/7.19.5.1) [64-bit downloads](http://www.lfd.uci.edu/~gohlke/pythonlibs/)
|
||||
Note: the x64 version is in wheel format instead of executable installer, so you have to install it using pip. For example: C:\python27x64\scripts\pip install pycurl-7.19.5.1-cp27-none-win_amd64.whl
|
||||
* [Python windows extensions (pywin32)](http://www.sourceforge.net/projects/pywin32/) for python 2.7, build 220
|
||||
* [Pycurl](http://pycurl.sourceforge.net) 7.21.5 for Python 2.7: [downloads](https://pypi.python.org/pypi/pycurl/7.21.5)
|
||||
* [PyEnchant,](http://pythonhosted.org/pyenchant/) version 1.6.6.
|
||||
x64 version has been built by TWBlue developers, so you only will find it in windows-dependencies folder
|
||||
|
||||
@@ -68,14 +67,14 @@ setuptools install a script, called easy_install. You can find it in the python
|
||||
* future
|
||||
* pygeocoder
|
||||
* suds
|
||||
* arrow
|
||||
* goslate
|
||||
* arrow==0.6
|
||||
* markdown
|
||||
* pocket
|
||||
* winpaths
|
||||
* microsofttranslator
|
||||
|
||||
easy_install will automatically get the additional libraries that these packages need to work properly.
|
||||
Run the following command to quickly install and upgrade all packages and their dependencies:
|
||||
easy_install -Z --upgrade six configobj goslate markdown future pocket suds requests oauthlib requests-oauthlib pypubsub pygeocoder arrow python-dateutil futures
|
||||
easy_install -Z --upgrade six configobj goslate markdown future suds requests oauthlib requests-oauthlib pypubsub pygeocoder arrow python-dateutil futures markdown microsofttranslator
|
||||
|
||||
#### Other dependencies
|
||||
|
||||
@@ -90,6 +89,11 @@ This dependency has been built using pure basic 4.61. Its source can be found at
|
||||
|
||||
* [NSIS unicode,](http://www.scratchpaper.com/) version 2.46.5
|
||||
|
||||
#### Dependencies required to build the portableApps.com format archive
|
||||
|
||||
* [PortableApps.com Launcher,](http://portableapps.com/apps/development/portableapps.com_launcher) version 2.2
|
||||
* [PortableApps.com Installer,](http://portableapps.com/apps/development/portableapps.com_installer) version 3.0.20
|
||||
|
||||
### Running TW Blue from source
|
||||
|
||||
Now that you have installed all these packages, you can run TW Blue from source using a command prompt. Navigate to the repo's src directory, and type the following command:
|
||||
@@ -129,3 +133,15 @@ If you want to install TWBlue in your computer, you must create the installer fi
|
||||
### How to generate a translation template
|
||||
|
||||
Run the gen_pot.bat file, located in the tools directory. Your python installation must be in your path environment variable. The pot file will appear in the tools directory.
|
||||
|
||||
### How to build the portableApps.com archive
|
||||
|
||||
If you want to have TWBlue in your PortableApps.com platform, follow these steps:
|
||||
|
||||
* Navigate to the src directory, and create a binary version for x86: C:\python27\python setup.py py2exe
|
||||
* Move the dist directory to the misc\pa.c format\app folder in this repo, and rename it to twblue
|
||||
* Repeat these steps with Python for x64: C:\python27x64\python setup.py py2exe
|
||||
* Move the new dist directory to the misc\pa.c format\app folder, and rename it to twblue64
|
||||
* Run the PortableApps.com Launcher Generator, and follow the wizard. Choose the pa.c format folder and continue to generate the launcher. If the wizard is completed, you will see a file named TWBlue portable.exe inside the pa.c format folder.
|
||||
* Run the PortableApps.com Installer, and follow the wizard. As in the above step, choose the pa.c format folder. When it completes, you will see a file named TWBluePortable_x.y.paf.exe inside the misc folder, where x.y is the version number.
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
[Launch]
|
||||
ProgramExecutable=TWBlue\TWBlue.exe
|
||||
ProgramExecutable64=TWBlue64\TWBlue.exe
|
||||
CommandLineArguments=-p -d "%PAL:DataDir%"
|
||||
CommandLineArguments=-d "%PAL:DataDir%"
|
||||
SinglePortableAppInstance=true
|
||||
MinOS=XP
|
||||
SingleAppInstance=false
|
||||
|
@@ -3,9 +3,9 @@ Type=PortableApps.comFormat
|
||||
Version=3.0
|
||||
|
||||
[Details]
|
||||
Name=TWBlue portable
|
||||
Name=tw blue portable
|
||||
AppID=TWBluePortable
|
||||
Publisher=jmdaweb & TWBlue & PortableApps.com
|
||||
Publisher=jmdaweb & TW blue & PortableApps.com
|
||||
Homepage=PortableApps.com/TWBluePortable
|
||||
Category=Internet
|
||||
Description=A portable, fast and accessible Twitter client with many options.
|
||||
|
@@ -8,10 +8,14 @@ FINNISH=true
|
||||
FRENCH=true
|
||||
GALICIAN=true
|
||||
GERMAN=true
|
||||
CROATIAN=true
|
||||
HUNGARIAN=true
|
||||
ITALIAN=true
|
||||
JAPANESE=true
|
||||
POLISH=true
|
||||
PORTUGUESEBR=true
|
||||
ROMANIAN=true
|
||||
RUSSIAN=true
|
||||
SERBIAN=true
|
||||
SPANISHINTERNATIONAL=true
|
||||
TURKISH=true
|
||||
TURKISH=true
|
||||
|
@@ -2,7 +2,7 @@
|
||||
<html lang="en-US">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>TWBlue Portable Help</title>
|
||||
<title>tw blue Portable Help</title>
|
||||
<link rel="alternate" href="http://portableapps.com/feeds/general" type="application/rss+xml" title="PortableApps.com">
|
||||
<link rel="shortcut icon" href="Other/Help/Images/Favicon.ico">
|
||||
<style type="text/css">
|
||||
@@ -125,13 +125,13 @@
|
||||
<body>
|
||||
<div class="logo"><a href="http://portableapps.com/"><img src="Other/Help/Images/Help_Logo_Top.png" alt="PortableApps.com - Your Digital Life, Anywhere"></a></div>
|
||||
<div class="content">
|
||||
<h1 class="hastagline">TWBlue Portable Help</h1>
|
||||
<h1 class="hastagline">tw blue Portable Help</h1>
|
||||
<h2 class="tagline">A powerful and accessible Twitter client</h2>
|
||||
<p>TWBlue Portable is the TWBlue whatever it is packaged with a PortableApps.com launcher as a <a href="http://portableapps.com/about/what_is_a_portable_app">portable app</a>, so you can view and send tweets on your iPod, USB flash drive, portable hard drive, etc. It has all the same features as TWBlue, plus, it leaves no personal information behind on the machine you run it on, so you can take it with you wherever you go. <a href="http://twblue.es">Learn more about TWBlue...</a></p>
|
||||
<p>tw blue Portable is the tw blue whatever it is packaged with a PortableApps.com launcher as a <a href="http://portableapps.com/about/what_is_a_portable_app">portable app</a>, so you can view and send tweets on your iPod, USB flash drive, portable hard drive, etc. It has all the same features as tw blue, plus, it leaves no personal information behind on the machine you run it on, so you can take it with you wherever you go. <a href="http://twblue.es">Learn more about tw blue...</a></p>
|
||||
|
||||
<p><a href="http://portableapps.com/donate"><img src="Other/Help/Images/Donation_Button.png" style="vertical-align:middle" alt="Make a Donation"></a> - Support PortableApps.com's Hosting and Development</p>
|
||||
|
||||
<p><a href="http://portableapps.com/node/*Node ID*">Go to the TWBlue Portable Homepage >></a></p>
|
||||
<p><a href="http://portableapps.com/node/*Node ID*">Go to the tw blue Portable Homepage >></a></p>
|
||||
<p><a href="http://portableapps.com/">Get more portable apps at PortableApps.com</a></p>
|
||||
|
||||
<p>This software is OSI Certified Open Source Software. OSI Certified is a certification mark of the Open Source Initiative.</p>
|
||||
|
@@ -26,7 +26,6 @@ var StartMenuFolder
|
||||
!define MUI_FINISHPAGE_LINK "Visit TWBlue website"
|
||||
!define MUI_FINISHPAGE_LINK_LOCATION "http://twblue.es"
|
||||
!define MUI_FINISHPAGE_RUN "$INSTDIR\TWBlue.exe"
|
||||
!define MUI_FINISHPAGE_RUN_PARAMETERS "-i"
|
||||
!insertmacro MUI_PAGE_FINISH
|
||||
!insertmacro MUI_UNPAGE_CONFIRM
|
||||
!insertmacro MUI_UNPAGE_INSTFILES
|
||||
@@ -48,6 +47,7 @@ var StartMenuFolder
|
||||
!insertmacro MUI_LANGUAGE "Croatian"
|
||||
!insertmacro MUI_LANGUAGE "Japanese"
|
||||
!insertmacro MUI_LANGUAGE "SerbianLatin"
|
||||
!insertmacro MUI_LANGUAGE "Romanian"
|
||||
!insertmacro MUI_RESERVEFILE_LANGDLL
|
||||
Section
|
||||
SetShellVarContext All
|
||||
@@ -57,10 +57,10 @@ File /r TWBlue64\*
|
||||
${Else}
|
||||
File /r TWBlue\*
|
||||
${EndIf}
|
||||
CreateShortCut "$DESKTOP\TWBlue.lnk" "$INSTDIR\TWBlue.exe" "-i"
|
||||
CreateShortCut "$DESKTOP\TWBlue.lnk" "$INSTDIR\TWBlue.exe"
|
||||
!insertmacro MUI_STARTMENU_WRITE_BEGIN startmenu
|
||||
CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
|
||||
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\TWBlue.lnk" "$INSTDIR\TWBlue.exe" "-i"
|
||||
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\TWBlue.lnk" "$INSTDIR\TWBlue.exe"
|
||||
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\TWBlue on the web.lnk" "http://twblue.es"
|
||||
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
|
||||
!insertmacro MUI_STARTMENU_WRITE_END
|
||||
|
@@ -28,6 +28,8 @@ timelines = list(default=list())
|
||||
tweet_searches = list(default=list())
|
||||
lists = list(default=list())
|
||||
favourites_timelines = list(default=list())
|
||||
followers_timelines = list(default=list())
|
||||
friends_timelines = list(default=list())
|
||||
trending_topic_buffers = list(default=list())
|
||||
muted_buffers = list(default=list())
|
||||
autoread_buffers = list(default=list(mentions, direct_messages, events))
|
||||
|
@@ -1,11 +1,11 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
name = 'TWBlue'
|
||||
snapshot = False
|
||||
snapshot = True
|
||||
if snapshot == False:
|
||||
version = "0.80"
|
||||
update_url = 'http://twblue.es/updates/twblue_ngen.json'
|
||||
else:
|
||||
version = "10.97"
|
||||
version = "10.99"
|
||||
update_url = 'http://twblue.es/updates/snapshots_ngen.json'
|
||||
author = u"Manuel Cortéz"
|
||||
authorEmail = "manuel@manuelcortez.net"
|
||||
|
@@ -6,13 +6,7 @@ import application
|
||||
log = logging.getLogger("commandlineLauncher")
|
||||
|
||||
parser = argparse.ArgumentParser(description=application.name+" command line launcher")
|
||||
group = parser.add_mutually_exclusive_group()
|
||||
group.add_argument("-p", "--portable", help="Use " + application.name + " as a portable application.", action="store_true", default=True)
|
||||
group.add_argument("-i", "--installed", help="Use " + application.name + " as an installed application. Config files will be saved in the user data directory", action="store_true")
|
||||
parser.add_argument("-d", "--data-directory", action="store", dest="directory", help="Specifies the directory where " + application.name + " saves userdata.")
|
||||
args = parser.parse_args()
|
||||
log.debug("Starting " + application.name + " with the following arguments: installed = %s, portable = %s and directory = %s" % (args.installed, args.portable, args.directory))
|
||||
if args.installed == True: paths.mode = "installed"
|
||||
elif args.portable == True:
|
||||
paths.mode = "portable"
|
||||
if args.directory != None: paths.directory = args.directory
|
||||
log.debug("Starting " + application.name + " with the following arguments: directory = %s" % (args.directory))
|
||||
if args.directory != None: paths.directory = args.directory
|
||||
|
@@ -84,7 +84,9 @@ class bufferController(object):
|
||||
sound.URLPlayer.stream.volume = self.session.settings["sound"]["volume"]
|
||||
self.session.sound.play("volume_changed.ogg")
|
||||
|
||||
def start_stream(self):
|
||||
def start_stream(self, mandatory=False):
|
||||
if mandatory == True:
|
||||
output.speak(_(u"Unable to update this buffer."))
|
||||
pass
|
||||
|
||||
def get_more_items(self):
|
||||
@@ -272,10 +274,10 @@ class baseBufferController(bufferController):
|
||||
tweetsList.append(tweet)
|
||||
return (tweet, tweetsList)
|
||||
|
||||
def start_stream(self):
|
||||
def start_stream(self, mandatory=False):
|
||||
# starts stream every 3 minutes.
|
||||
current_time = time.time()
|
||||
if self.execution_time == 0 or current_time-self.execution_time >= 180:
|
||||
if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True:
|
||||
self.execution_time = current_time
|
||||
log.debug("Starting stream for buffer %s, account %s and type %s" % (self.name, self.account, self.type))
|
||||
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))
|
||||
@@ -283,9 +285,9 @@ class baseBufferController(bufferController):
|
||||
number_of_items = self.session.order_buffer(self.name, val)
|
||||
log.debug("Number of items retrieved: %d" % (number_of_items,))
|
||||
self.put_items_on_list(number_of_items)
|
||||
if self.sound == None: return
|
||||
if number_of_items > 0 and self.name != "sent_tweets" and self.name != "sent_direct_messages":
|
||||
if number_of_items > 0 and self.name != "sent_tweets" and self.name != "sent_direct_messages" and self.sound != None:
|
||||
self.session.sound.play(self.sound)
|
||||
return number_of_items
|
||||
|
||||
def get_more_items(self):
|
||||
elements = []
|
||||
@@ -481,7 +483,13 @@ class baseBufferController(bufferController):
|
||||
users = utils.get_all_users(tweet, self.session.db)
|
||||
dm = messages.dm(self.session, _(u"Direct message to %s") % (screen_name,), _(u"New direct message"), users)
|
||||
if dm.message.get_response() == widgetUtils.OK:
|
||||
call_threaded(self.session.api_call, call_name="send_direct_message", text=dm.message.get_text(), screen_name=dm.message.get("cb"))
|
||||
val = self.session.api_call(call_name="send_direct_message", text=dm.message.get_text(), screen_name=dm.message.get("cb"))
|
||||
if val != None:
|
||||
if self.session.settings["general"]["reverse_timelines"] == False:
|
||||
self.session.db["sent_direct_messages"].append(val)
|
||||
else:
|
||||
self.session.db["sent_direct_messages"].insert(0, val)
|
||||
pub.sendMessage("sent-dm", data=val, user=self.session.db["user_name"])
|
||||
if hasattr(dm.message, "destroy"): dm.message.destroy()
|
||||
|
||||
@_tweets_exist
|
||||
@@ -638,9 +646,9 @@ class listBufferController(baseBufferController):
|
||||
self.list_id = list_id
|
||||
self.kwargs["list_id"] = list_id
|
||||
|
||||
def start_stream(self):
|
||||
def start_stream(self, mandatory=False):
|
||||
self.get_user_ids()
|
||||
super(listBufferController, self).start_stream()
|
||||
super(listBufferController, self).start_stream(mandatory)
|
||||
|
||||
def get_user_ids(self):
|
||||
self.users = []
|
||||
@@ -714,7 +722,7 @@ class eventsBufferController(bufferController):
|
||||
|
||||
class peopleBufferController(baseBufferController):
|
||||
def __init__(self, parent, function, name, sessionObject, account, bufferType=None, *args, **kwargs):
|
||||
super(peopleBufferController, self).__init__(parent, function, name, sessionObject, account, bufferType="peoplePanel")
|
||||
super(peopleBufferController, self).__init__(parent, function, name, sessionObject, account, bufferType="peoplePanel", *args, **kwargs)
|
||||
log.debug("Initializing buffer %s, account %s" % (name, account,))
|
||||
self.compose_function = compose.compose_followers_list
|
||||
log.debug("Compose_function: %s" % (self.compose_function,))
|
||||
@@ -722,7 +730,25 @@ class peopleBufferController(baseBufferController):
|
||||
self.url = self.interact
|
||||
|
||||
def remove_buffer(self):
|
||||
return False
|
||||
if "-followers" in self.name:
|
||||
dlg = commonMessageDialogs.remove_buffer()
|
||||
if dlg == widgetUtils.YES:
|
||||
if self.name[:-10] in self.session.settings["other_buffers"]["followers_timelines"]:
|
||||
self.session.settings["other_buffers"]["followers_timelines"].remove(self.name[:-10])
|
||||
return True
|
||||
elif dlg == widgetUtils.NO:
|
||||
return False
|
||||
elif "-friends" in self.name:
|
||||
dlg = commonMessageDialogs.remove_buffer()
|
||||
if dlg == widgetUtils.YES:
|
||||
if self.name[:-8] in self.session.settings["other_buffers"]["friends_timelines"]:
|
||||
self.session.settings["other_buffers"]["friends_timelines"].remove(self.name[:-8])
|
||||
return True
|
||||
elif dlg == widgetUtils.NO:
|
||||
return False
|
||||
else:
|
||||
output.speak(_(u"This buffer is not a timeline; it can't be deleted."), True)
|
||||
return False
|
||||
|
||||
def onFocus(self, ev):
|
||||
pass
|
||||
@@ -744,19 +770,20 @@ class peopleBufferController(baseBufferController):
|
||||
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()
|
||||
|
||||
def start_stream(self):
|
||||
def start_stream(self, mandatory=False):
|
||||
# starts stream every 3 minutes.
|
||||
current_time = time.time()
|
||||
if self.execution_time == 0 or current_time-self.execution_time >= 180:
|
||||
if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True:
|
||||
self.execution_time = current_time
|
||||
log.debug("Starting stream for %s buffer, %s account" % (self.name, self.account,))
|
||||
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))
|
||||
val = self.session.get_cursored_stream(self.name, self.function, *self.args, **self.kwargs)
|
||||
self.put_items_on_list(val)
|
||||
return val
|
||||
|
||||
def get_more_items(self):
|
||||
try:
|
||||
items = self.session.get_more_items(self.function, users=True, name=self.name, count=self.session.settings["general"]["max_tweets_per_call"], cursor=self.session.db[self.name]["cursor"])
|
||||
items = self.session.get_more_items(self.function, users=True, name=self.name, count=self.session.settings["general"]["max_tweets_per_call"], cursor=self.session.db[self.name]["cursor"], *self.args, **self.kwargs)
|
||||
except TwythonError as e:
|
||||
output.speak(e.message, True)
|
||||
return
|
||||
@@ -841,10 +868,10 @@ class peopleBufferController(baseBufferController):
|
||||
pub.sendMessage("execute-action", action="user_details")
|
||||
|
||||
class searchBufferController(baseBufferController):
|
||||
def start_stream(self):
|
||||
def start_stream(self, mandatory=False):
|
||||
# starts stream every 3 minutes.
|
||||
current_time = time.time()
|
||||
if self.execution_time == 0 or current_time-self.execution_time >= 180:
|
||||
if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True:
|
||||
self.execution_time = current_time
|
||||
log.debug("Starting stream for %s buffer, %s account and %s type" % (self.name, self.account, self.type))
|
||||
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))
|
||||
@@ -857,6 +884,7 @@ class searchBufferController(baseBufferController):
|
||||
self.put_items_on_list(num)
|
||||
if num > 0:
|
||||
self.session.sound.play("search_updated.ogg")
|
||||
return num
|
||||
|
||||
def remove_buffer(self):
|
||||
dlg = commonMessageDialogs.remove_buffer()
|
||||
@@ -879,10 +907,10 @@ class searchPeopleBufferController(peopleBufferController):
|
||||
self.kwargs = kwargs
|
||||
self.function = function
|
||||
|
||||
def start_stream(self):
|
||||
def start_stream(self, mandatory=False):
|
||||
# starts stream every 3 minutes.
|
||||
current_time = time.time()
|
||||
if self.execution_time == 0 or current_time-self.execution_time >= 180:
|
||||
if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True:
|
||||
self.execution_time = current_time
|
||||
log.debug("starting stream for %s buffer, %s account and %s type" % (self.name, self.account, self.type))
|
||||
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))
|
||||
@@ -896,6 +924,7 @@ class searchPeopleBufferController(peopleBufferController):
|
||||
self.put_items_on_list(number_of_items)
|
||||
if number_of_items > 0:
|
||||
self.session.sound.play("search_updated.ogg")
|
||||
return number_of_items
|
||||
|
||||
def remove_buffer(self):
|
||||
dlg = commonMessageDialogs.remove_buffer()
|
||||
@@ -1052,13 +1081,14 @@ class conversationBufferController(searchBufferController):
|
||||
self.put_items_on_list(number_of_items)
|
||||
if number_of_items > 0:
|
||||
self.session.sound.play("search_updated.ogg")
|
||||
return number_of_items
|
||||
|
||||
def remove_buffer(self):
|
||||
dlg = commonMessageDialogs.remove_buffer()
|
||||
if dlg == widgetUtils.YES:
|
||||
self.timer.cancel()
|
||||
return True
|
||||
elif dlg == WidgetUtils.NO:
|
||||
elif dlg == widgetUtils.NO:
|
||||
return False
|
||||
|
||||
class pocketBufferController(baseBufferController):
|
||||
|
@@ -118,6 +118,7 @@ class Controller(object):
|
||||
pub.subscribe(self.manage_unblocked_user, "unblocked-user")
|
||||
pub.subscribe(self.manage_item_in_timeline, "item-in-timeline")
|
||||
pub.subscribe(self.manage_item_in_list, "item-in-list")
|
||||
pub.subscribe(self.restart_streams_, "restart_streams")
|
||||
widgetUtils.connect_event(self.view, widgetUtils.CLOSE_EVENT, self.exit_)
|
||||
|
||||
def bind_other_events(self):
|
||||
@@ -177,8 +178,10 @@ class Controller(object):
|
||||
widgetUtils.connect_event(self.view.nb, widgetUtils.NOTEBOOK_PAGE_CHANGED, self.buffer_changed)
|
||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.report_error, self.view.reportError)
|
||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.view_documentation, self.view.doc)
|
||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.view_changelog, self.view.changelog)
|
||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.add_to_list, self.view.addToList)
|
||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.remove_from_list, self.view.removeFromList)
|
||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.update_buffer, self.view.update_buffer)
|
||||
|
||||
def set_systray_icon(self):
|
||||
self.systrayIcon = sysTrayIcon.SysTrayIcon()
|
||||
@@ -344,6 +347,24 @@ class Controller(object):
|
||||
self.view.insert_buffer(tl.buffer, name=_(u"Likes for {}").format(i,), pos=self.view.search("favs_timelines", session.db["user_name"]))
|
||||
tl.timer = RepeatingTimer(300, tl.start_stream)
|
||||
tl.timer.start()
|
||||
followers_timelines = buffersController.emptyPanel(self.view.nb, "followers_timelines", session.db["user_name"])
|
||||
self.buffers.append(followers_timelines)
|
||||
self.view.insert_buffer(followers_timelines.buffer , name=_(u"Followers' Timelines"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
||||
for i in session.settings["other_buffers"]["followers_timelines"]:
|
||||
tl = buffersController.peopleBufferController(self.view.nb, "get_followers_list", "%s-followers" % (i,), session, session.db["user_name"], screen_name=i)
|
||||
self.buffers.append(tl)
|
||||
self.view.insert_buffer(tl.buffer, name=_(u"Followers for {}").format(i,), pos=self.view.search("favs_timelines", session.db["user_name"]))
|
||||
tl.timer = RepeatingTimer(300, tl.start_stream)
|
||||
tl.timer.start()
|
||||
friends_timelines = buffersController.emptyPanel(self.view.nb, "friends_timelines", session.db["user_name"])
|
||||
self.buffers.append(friends_timelines)
|
||||
self.view.insert_buffer(friends_timelines.buffer , name=_(u"Friends' Timelines"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
||||
for i in session.settings["other_buffers"]["friends_timelines"]:
|
||||
tl = buffersController.peopleBufferController(self.view.nb, "get_friends_list", "%s-friends" % (i,), session, session.db["user_name"], screen_name=i)
|
||||
self.buffers.append(tl)
|
||||
self.view.insert_buffer(tl.buffer, name=_(u"Friends for {}").format(i,), pos=self.view.search("favs_timelines", session.db["user_name"]))
|
||||
tl.timer = RepeatingTimer(300, tl.start_stream)
|
||||
tl.timer.start()
|
||||
lists = buffersController.emptyPanel(self.view.nb, "lists", session.db["user_name"])
|
||||
self.buffers.append(lists)
|
||||
self.view.insert_buffer(lists.buffer , name=_(u"Lists"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
||||
@@ -410,13 +431,14 @@ class Controller(object):
|
||||
if dlg.get("tweets") == True:
|
||||
if term not in buffer.session.settings["other_buffers"]["tweet_searches"]:
|
||||
buffer.session.settings["other_buffers"]["tweet_searches"].append(term)
|
||||
search = buffersController.searchBufferController(self.view.nb, "search", "%s-searchterm" % (term,), buffer.session, buffer.session.db["user_name"], bufferType="searchPanel", q=term, count=buffer.session.settings["general"]["max_tweets_per_call"])
|
||||
args = {"lang": dlg.get_language(), "result_type": dlg.get_result_type()}
|
||||
search = buffersController.searchBufferController(self.view.nb, "search", "%s-searchterm" % (term,), buffer.session, buffer.session.db["user_name"], bufferType="searchPanel", q=term, count=buffer.session.settings["general"]["max_tweets_per_call"], **args)
|
||||
else:
|
||||
log.error("A buffer for the %s search term is already created. You can't create a duplicate buffer." % (term,))
|
||||
return
|
||||
elif dlg.get("users") == True:
|
||||
search = buffersController.searchPeopleBufferController(self.view.nb, "search_users", "%s-searchUser" % (term,), buffer.session, buffer.session.db["user_name"], bufferType=None, q=term)
|
||||
search.start_stream()
|
||||
search.start_stream(mandatory=True)
|
||||
pos=self.view.search("searches", buffer.session.db["user_name"])
|
||||
self.insert_buffer(search, pos)
|
||||
self.view.insert_buffer(search.buffer, name=_(u"Search for {}").format(term), pos=pos)
|
||||
@@ -759,7 +781,8 @@ class Controller(object):
|
||||
return
|
||||
answer = commonMessageDialogs.protected_user()
|
||||
if answer == widgetUtils.NO: return
|
||||
if dlg.get_action() == "tweets":
|
||||
tl_type = dlg.get_action()
|
||||
if tl_type == "tweets":
|
||||
if usr["statuses_count"] == 0:
|
||||
commonMessageDialogs.no_tweets()
|
||||
return
|
||||
@@ -775,7 +798,7 @@ class Controller(object):
|
||||
buff.session.settings["other_buffers"]["timelines"].append(dlg.get_user())
|
||||
pub.sendMessage("restart-streams", streams=["timelinesStream"], session=buff.session)
|
||||
buff.session.sound.play("create_timeline.ogg")
|
||||
else:
|
||||
elif tl_type == "favourites":
|
||||
if usr["favourites_count"] == 0:
|
||||
commonMessageDialogs.no_favs()
|
||||
return
|
||||
@@ -792,6 +815,40 @@ class Controller(object):
|
||||
tl.timer.start()
|
||||
buff.session.settings["other_buffers"]["favourites_timelines"].append(dlg.get_user())
|
||||
buff.session.sound.play("create_timeline.ogg")
|
||||
elif tl_type == "followers":
|
||||
if usr["followers_count"] == 0:
|
||||
commonMessageDialogs.no_followers()
|
||||
return
|
||||
if dlg.get_user() in buff.session.settings["other_buffers"]["followers_timelines"]:
|
||||
commonMessageDialogs.timeline_exist()
|
||||
return
|
||||
tl = buffersController.peopleBufferController(self.view.nb, "get_followers_list", "%s-followers" % (dlg.get_user(),), buff.session, buff.session.db["user_name"], screen_name=dlg.get_user())
|
||||
pos=self.view.search("followers_timelines", buff.session.db["user_name"])
|
||||
self.insert_buffer(tl, pos+1)
|
||||
# self.buffers.insert(pos+1, tl)
|
||||
self.view.insert_buffer(buffer=tl.buffer, name=_(u"Followers for {}").format(dlg.get_user()), pos=pos)
|
||||
tl.start_stream()
|
||||
tl.timer = RepeatingTimer(300, tl.start_stream)
|
||||
tl.timer.start()
|
||||
buff.session.settings["other_buffers"]["followers_timelines"].append(dlg.get_user())
|
||||
buff.session.sound.play("create_timeline.ogg")
|
||||
|
||||
elif tl_type == "friends":
|
||||
if usr["friends_count"] == 0:
|
||||
commonMessageDialogs.no_friends()
|
||||
return
|
||||
if dlg.get_user() in buff.session.settings["other_buffers"]["friends_timelines"]:
|
||||
commonMessageDialogs.timeline_exist()
|
||||
return
|
||||
tl = buffersController.peopleBufferController(self.view.nb, "get_friends_list", "%s-friends" % (dlg.get_user(),), buff.session, buff.session.db["user_name"], screen_name=dlg.get_user())
|
||||
pos=self.view.search("friends_timelines", buff.session.db["user_name"])
|
||||
self.insert_buffer(tl, pos+1)
|
||||
self.view.insert_buffer(buffer=tl.buffer, name=_(u"Friends for {}").format(dlg.get_user()), pos=pos)
|
||||
tl.start_stream()
|
||||
tl.timer = RepeatingTimer(300, tl.start_stream)
|
||||
tl.timer.start()
|
||||
buff.session.settings["other_buffers"]["friends_timelines"].append(dlg.get_user())
|
||||
buff.session.sound.play("create_timeline.ogg")
|
||||
else:
|
||||
commonMessageDialogs.user_not_exist()
|
||||
|
||||
@@ -1391,6 +1448,11 @@ class Controller(object):
|
||||
webbrowser.open("manual.html")
|
||||
os.chdir("../../")
|
||||
|
||||
def view_changelog(self, *args, **kwargs):
|
||||
os.chdir("documentation")
|
||||
webbrowser.open("changelog.html")
|
||||
os.chdir("../")
|
||||
|
||||
def insert_buffer(self, buffer, position):
|
||||
self.buffers.insert(position, buffer)
|
||||
|
||||
@@ -1405,5 +1467,21 @@ class Controller(object):
|
||||
if hasattr(self, action):
|
||||
getattr(self, action)()
|
||||
|
||||
def restart_streams_(self, session):
|
||||
for i in self.buffers:
|
||||
if i.session != None and i.session.session_id == session:
|
||||
i.start_stream()
|
||||
|
||||
def __del__(self):
|
||||
config.app.write()
|
||||
config.app.write()
|
||||
|
||||
def update_buffer(self, *args, **kwargs):
|
||||
bf = self.get_current_buffer()
|
||||
if not hasattr(bf, "start_stream"):
|
||||
output.speak(_(u"Unable to update this buffer."))
|
||||
return
|
||||
else:
|
||||
output.speak(_(u"Updating buffer..."))
|
||||
n = bf.start_stream(mandatory=True)
|
||||
if n != None:
|
||||
output.speak(_(u"{0} items retrieved").format(n,))
|
@@ -1,4 +1,5 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import re
|
||||
import platform
|
||||
system = platform.system()
|
||||
import widgetUtils
|
||||
@@ -35,7 +36,7 @@ class basicTweet(object):
|
||||
def translate(self, event=None):
|
||||
dlg = translator.gui.translateDialog()
|
||||
if dlg.get_response() == widgetUtils.OK:
|
||||
text_to_translate = self.message.get_text().encode("utf-8")
|
||||
text_to_translate = self.message.get_text()
|
||||
source = [x[0] for x in translator.translator.available_languages()][dlg.get("source_lang")]
|
||||
dest = [x[0] for x in translator.translator.available_languages()][dlg.get("dest_lang")]
|
||||
msg = translator.translator.translate(text=text_to_translate, source=source, target=dest)
|
||||
@@ -173,13 +174,14 @@ class viewTweet(basicTweet):
|
||||
text = text + "@%s: %s\n" % (tweetList[i]["user"]["screen_name"], tweetList[i]["text"])
|
||||
rt_count = str(tweet["retweet_count"])
|
||||
favs_count = str(tweet["favorite_count"])
|
||||
source = str(re.sub(r"(?s)<.*?>", "", tweet["source"]))
|
||||
if text == "":
|
||||
if tweet.has_key("retweeted_status"):
|
||||
text = "rt @%s: %s" % (tweet["retweeted_status"]["user"]["screen_name"], tweet["retweeted_status"]["text"])
|
||||
else:
|
||||
text = tweet["text"]
|
||||
text = self.clear_text(text)
|
||||
self.message = message.viewTweet(text, rt_count, favs_count)
|
||||
self.message = message.viewTweet(text, rt_count, favs_count,source)
|
||||
self.message.set_title(len(text))
|
||||
else:
|
||||
text = tweet
|
||||
|
@@ -261,24 +261,24 @@ class accountSettingsController(globalSettingsController):
|
||||
if change == True:
|
||||
self.dialog.buffers.change_selected_item()
|
||||
|
||||
def manage_pocket(self, *args, **kwargs):
|
||||
if self.dialog.services.get_pocket_status() == _(u"Connect your Pocket account"):
|
||||
self.connect_pocket()
|
||||
else:
|
||||
self.disconnect_pocket()
|
||||
# def manage_pocket(self, *args, **kwargs):
|
||||
# if self.dialog.services.get_pocket_status() == _(u"Connect your Pocket account"):
|
||||
# self.connect_pocket()
|
||||
# else:
|
||||
# self.disconnect_pocket()
|
||||
|
||||
def connect_pocket(self):
|
||||
dlg = self.dialog.services.show_pocket_dialog()
|
||||
if dlg == widgetUtils.YES:
|
||||
request_token = pocket.Pocket.get_request_token(consumer_key=keys.keyring.get("pocket_consumer_key"), redirect_uri="http://127.0.0.1:8080")
|
||||
auth_url = pocket.Pocket.get_auth_url(code=request_token, redirect_uri="http://127.0.0.1:8080")
|
||||
webbrowser.open_new_tab(auth_url)
|
||||
httpd = BaseHTTPServer.HTTPServer(('127.0.0.1', 8080), authorisationHandler.handler)
|
||||
while authorisationHandler.logged == False:
|
||||
httpd.handle_request()
|
||||
user_credentials = pocket.Pocket.get_credentials(consumer_key=keys.keyring.get("pocket_consumer_key"), code=request_token)
|
||||
self.dialog.services.set_pocket(True)
|
||||
self.config["services"]["pocket_access_token"] = user_credentials["access_token"]
|
||||
# def connect_pocket(self):
|
||||
# dlg = self.dialog.services.show_pocket_dialog()
|
||||
# if dlg == widgetUtils.YES:
|
||||
# request_token = pocket.Pocket.get_request_token(consumer_key=keys.keyring.get("pocket_consumer_key"), redirect_uri="http://127.0.0.1:8080")
|
||||
# auth_url = pocket.Pocket.get_auth_url(code=request_token, redirect_uri="http://127.0.0.1:8080")
|
||||
# webbrowser.open_new_tab(auth_url)
|
||||
# httpd = BaseHTTPServer.HTTPServer(('127.0.0.1', 8080), authorisationHandler.handler)
|
||||
# while authorisationHandler.logged == False:
|
||||
# httpd.handle_request()
|
||||
# user_credentials = pocket.Pocket.get_credentials(consumer_key=keys.keyring.get("pocket_consumer_key"), code=request_token)
|
||||
# self.dialog.services.set_pocket(True)
|
||||
# self.config["services"]["pocket_access_token"] = user_credentials["access_token"]
|
||||
|
||||
def disconnect_dropbox(self):
|
||||
self.config["services"]["pocket_access_token"] = ""
|
||||
|
@@ -1,153 +1,10 @@
|
||||
# encoding: utf-8
|
||||
#
|
||||
# Copyright (C) 2013 Mesar Hameed <mhameed@src.gnome.org>
|
||||
# This file is covered by the GNU General Public License.
|
||||
# -*- coding: utf-8 -*-
|
||||
from microsofttranslator import Translator
|
||||
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import threading
|
||||
from time import sleep
|
||||
from random import randint
|
||||
import logging
|
||||
log = logging.getLogger("translator")
|
||||
import urllib2
|
||||
def translate(text="", source="auto", target="en"):
|
||||
t = Translator("twblue", "4KZA26GYIfmVAqQA/z16Hlucbg64hVSDTIpRjT2FqIU=")
|
||||
return t.translate(text, target)
|
||||
|
||||
# Each group has to be a class of possible breaking points for the writing script.
|
||||
# Usually this is the major syntax marks, such as:
|
||||
# full stop, comma, exclaim, question, etc.
|
||||
arabicBreaks = u'[،؛؟]'
|
||||
# Thanks to Talori in the NVDA irc room:
|
||||
# U+3000 to U+303F, U+FE10 to U+FE1F, U+FE30 to U+FE6F, U+FF01 to U+FF60
|
||||
chineseBreaks = u'[ -〿︐-︰-!-⦆]'
|
||||
latinBreaks = r'[.,!?;:\n]'
|
||||
splitReg = re.compile(u"{arabic}|{chinese}|{latin}".format(arabic=arabicBreaks, chinese=chineseBreaks, latin=latinBreaks))
|
||||
|
||||
def translate(text, source="auto", target="en"):
|
||||
if source == "": source = "auto"
|
||||
t = Translator(lang_from=source, lang_to=target, text=text)
|
||||
t.start()
|
||||
while t.isAlive():
|
||||
sleep(0.1)
|
||||
t.join()
|
||||
return t.translation
|
||||
|
||||
def splitChunks(text, chunksize):
|
||||
pos = 0
|
||||
potentialPos = 0
|
||||
for splitMark in splitReg.finditer(text):
|
||||
if (splitMark.start() - pos +1) < chunksize:
|
||||
potentialPos = splitMark.start()
|
||||
continue
|
||||
else:
|
||||
yield text[pos:potentialPos+1]
|
||||
pos = potentialPos + 1
|
||||
potentialPos = splitMark.start()
|
||||
yield text[pos:]
|
||||
|
||||
class Translator(threading.Thread):
|
||||
|
||||
def __init__(self, lang_from, lang_to, text, lang_swap=None, chunksize=350, *args, **kwargs):
|
||||
super(Translator, self).__init__(*args, **kwargs)
|
||||
self._stop = threading.Event()
|
||||
self.text = text
|
||||
self.chunksize = chunksize
|
||||
self.lang_to = lang_to
|
||||
self.lang_from = lang_from
|
||||
self.lang_swap = lang_swap
|
||||
self.translation = ''
|
||||
self.lang_translated = ''
|
||||
self.firstChunk = True
|
||||
|
||||
def stop(self):
|
||||
self._stop.set()
|
||||
|
||||
def run(self):
|
||||
for chunk in splitChunks(self.text, self.chunksize):
|
||||
# Make sure we don't send requests to google too often.
|
||||
# Try to simulate a human.
|
||||
if not self.firstChunk:
|
||||
sleep(randint(1, 10))
|
||||
req = self.buildRequest(chunk, self.lang_from, self.lang_to)
|
||||
try:
|
||||
response = urllib2.urlopen(req)
|
||||
translation, lang_translated = self.parseData(response)
|
||||
if self.firstChunk and self.lang_from == "auto" and lang_translated == self.lang_to and self.lang_swap is not None:
|
||||
self.lang_to = self.lang_swap
|
||||
self.firstChunk = False
|
||||
req = self.buildRequest(chunk.encode('utf-8'), self.lang_from, self.lang_to)
|
||||
response = urllib2.urlopen(req)
|
||||
translation, lang_translated = self.parseData(response)
|
||||
except Exception as e:
|
||||
log.exception("Can not translate text '%s'" %chunk)
|
||||
# We have probably been blocked, so stop trying to translate.
|
||||
raise e
|
||||
self.translation += translation
|
||||
# some adjustment, better to do on full text
|
||||
self.translation = self.fixNewlines(self.translation)
|
||||
self.lang_translated = lang_translated
|
||||
|
||||
def buildRequest(self, text, lang_from, lang_to):
|
||||
"""Build POST request which will be sent to Google."""
|
||||
urlTemplate = 'http://translate.google.com/translate_a/single?client=t&sl={lang_from}&tl={lang_to}&ie=utf-8&oe=utf-8&dt=t&dt=bd&tk='
|
||||
url = urlTemplate.format(lang_from=lang_from, lang_to=lang_to)
|
||||
header = {'User-agent': 'Mozilla/5.0', 'Content-Type': 'application/x-www-form-urlencoded'}
|
||||
data = 'text=%s' %urllib2.quote(text)
|
||||
req = urllib2.Request(url, data, header)
|
||||
return req
|
||||
|
||||
def parseData(self, response):
|
||||
"""Parse unstructured response."""
|
||||
data = response.readlines()[0]
|
||||
# get segments with couples ["translation","original text"]
|
||||
l1, l2 = data.split(']],', 1)
|
||||
translation = l1[3:]
|
||||
if l2.startswith('[[\"'):
|
||||
# get list of synonyms
|
||||
syn = l2[l2.find(',[')+1:l2.find(']')].split(',')
|
||||
temp = ', '.join([x.replace('\"', '') for x in syn])
|
||||
else:
|
||||
# get a list with each couple as item
|
||||
sentences = translation.split('],[')
|
||||
temp = ''
|
||||
# get translation, removing first char (quote symbol)
|
||||
for item in sentences:
|
||||
item = item.split('\",\"', 1)[0][1:]
|
||||
# join all translations
|
||||
temp = ' '.join([temp, item])
|
||||
translation = temp.decode('string-escape').decode('utf-8')
|
||||
translation = self.fixPunctuation(translation)
|
||||
# get the language of original text
|
||||
tempLang = data.partition(']],,\"')[2]
|
||||
lang = tempLang[:tempLang.find('\"')]
|
||||
if lang == '':
|
||||
lang = _("unavailable")
|
||||
return translation, lang
|
||||
|
||||
def fixPunctuation(self, translation):
|
||||
"""Clean text from space before punctuation symbol."""
|
||||
# list of potentially positions of spaces to remove
|
||||
spacePos = []
|
||||
for puncMark in splitReg.finditer(translation):
|
||||
spacePos.append(puncMark.start()-1)
|
||||
if len(spacePos) == 0:
|
||||
return translation
|
||||
fixedTranslation = ''
|
||||
for n in xrange(0,len(translation)):
|
||||
temp = translation[n]
|
||||
if n in spacePos and temp == ' ':
|
||||
continue
|
||||
else:
|
||||
fixedTranslation += temp
|
||||
return fixedTranslation
|
||||
|
||||
def fixNewlines(self, translation):
|
||||
"""Adjust newlines and (subsequent or double) spaces."""
|
||||
fixes = [('\r\n ', '\r\n'), ('\n ', '\r\n'), (' ', ' ')]
|
||||
for fix in fixes:
|
||||
translation = translation.replace(fix[0], fix[1])
|
||||
# first char is a space, so...
|
||||
return translation[1:]
|
||||
|
||||
languages = {
|
||||
"af": _(u"Afrikaans"),
|
||||
@@ -244,8 +101,8 @@ languages = {
|
||||
}
|
||||
|
||||
def available_languages():
|
||||
l = languages.keys()
|
||||
d = languages.values()
|
||||
l.insert(0, '')
|
||||
d.insert(0, _(u"autodetect"))
|
||||
return sorted(zip(l, d))
|
||||
l = languages.keys()
|
||||
d = languages.values()
|
||||
l.insert(0, '')
|
||||
d.insert(0, _(u"autodetect"))
|
||||
return sorted(zip(l, d))
|
||||
|
@@ -31,4 +31,5 @@ find = string(default="control+win+shift+/")
|
||||
check_for_updates = string(default="alt+win+u)
|
||||
list_manager = string(default="control+win+shift+l")
|
||||
configuration = string(default="control+win+o")
|
||||
accountConfiguration = string(default="control+win+shift+o")
|
||||
accountConfiguration = string(default="control+win+shift+o")
|
||||
update_buffer = string(default="control+win+shift+u")
|
@@ -50,4 +50,5 @@ get_trending_topics = string(default="control+win+shift+t")
|
||||
check_for_updates = string(default="control+win+u")
|
||||
list_manager = string(default="control+win+shift+l")
|
||||
configuration = string(default="control+win+o")
|
||||
accountConfiguration = string(default="control+win+shift+o")
|
||||
accountConfiguration = string(default="control+win+shift+o")
|
||||
update_buffer = string(default="control+win+shift+u")
|
@@ -30,8 +30,8 @@ volume_up = string(default="alt+win+shift+up")
|
||||
go_home = string(default="alt+win+home")
|
||||
volume_down = string(default="alt+win+shift+down")
|
||||
go_end = string(default="alt+win+end")
|
||||
go_page_up = string(default="alt+win+pageup")
|
||||
go_page_down = string(default="alt+win+pagedown")
|
||||
go_page_up = string(default="control+win+pageup")
|
||||
go_page_down = string(default="control+win+pagedown")
|
||||
update_profile = string(default="alt+win+p")
|
||||
delete = string(default="alt+win+delete")
|
||||
clear_buffer = string(default="alt+win+shift+delete")
|
||||
@@ -52,4 +52,5 @@ get_trending_topics = string(default="alt+win+t")
|
||||
check_for_updates = string(default="alt+win+u")
|
||||
list_manager = string(default="alt+win+shift+l")
|
||||
configuration = string(default="control+win+o")
|
||||
accountConfiguration = string(default="control+win+shift+o")
|
||||
accountConfiguration = string(default="control+win+shift+o")
|
||||
update_buffer = string(default="control+alt+shift+u")
|
@@ -53,4 +53,5 @@ get_trending_topics = string(default="control+win+t")
|
||||
check_for_updates = string(default="control+win+u")
|
||||
list_manager = string(default="control+win+shift+l")
|
||||
configuration = string(default="control+win+o")
|
||||
accountConfiguration = string(default="control+win+shift+o")
|
||||
accountConfiguration = string(default="control+win+shift+o")
|
||||
update_buffer = string(default="control+win+shift+u")
|
@@ -53,4 +53,5 @@ find = string(default="control+win+{")
|
||||
check_for_updates = string(default="control+win+u")
|
||||
list_manager = string(default="control+win+shift+l")
|
||||
configuration = string(default="control+win+o")
|
||||
accountConfiguration = string(default="control+win+shift+o")
|
||||
accountConfiguration = string(default="control+win+shift+o")
|
||||
update_buffer = string(default="control+win+shift+u")
|
@@ -50,4 +50,6 @@ actions = {
|
||||
"lists_manager": _(u"Opens the list manager, which allows you to create, edit, delete and open lists in buffers."),
|
||||
"configuration": _(u"Opens the global settings dialogue"),
|
||||
"accountConfiguration": _(u"Opens the account settings dialogue"),
|
||||
"audio": _(u"Try to play an audio file"),
|
||||
"update_buffer": _(u"Updates the buffer and retrieves possible lost items there."),
|
||||
}
|
@@ -37,13 +37,10 @@ class KeystrokeEditor(object):
|
||||
|
||||
def get_edited_keystroke(self, dialog):
|
||||
keys = []
|
||||
if dialog.get("win") == False:
|
||||
wx_ui.no_win_message()
|
||||
return
|
||||
if dialog.get("control") == True:
|
||||
keys.append("control")
|
||||
# if dialog.get("win") == True:
|
||||
keys.append("win")
|
||||
if dialog.get("win") == True:
|
||||
keys.append("win")
|
||||
if dialog.get("alt") == True:
|
||||
keys.append("alt")
|
||||
if dialog.get("shift") == True:
|
||||
|
@@ -32,7 +32,7 @@ def load_library(library, x86_path='.', x64_path='.', *args, **kwargs):
|
||||
loaded = _do_load(lib, *args, **kwargs)
|
||||
if loaded is not None:
|
||||
return loaded
|
||||
raise LibraryLoadError('unable to load %r. Provided library path: %r' % (library, path))
|
||||
raise LibraryLoadError('unable to load %r. Provided library path: %r' % (library, lib))
|
||||
|
||||
def _do_load(file, *args, **kwargs):
|
||||
loader = TYPES[platform.system()]['loader']
|
||||
|
Binary file not shown.
@@ -1,9 +1,9 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: TW Blue 0.80\n"
|
||||
"POT-Creation-Date: 2015-11-06 08:10+Hora estndar central (Mxico)\n"
|
||||
"PO-Revision-Date: 2015-10-03 13:03+0200\n"
|
||||
"Last-Translator: José Manuel Delicado Alcolea <jmdaweb@hotmail.com>\n"
|
||||
"POT-Creation-Date: 2016-01-19 12:41+0100\n"
|
||||
"PO-Revision-Date: 2016-01-19 12:41+0100\n"
|
||||
"Last-Translator: Sukil Etxenike <sukiletxe@yahoo.es>\n"
|
||||
"Language-Team: Sukil Etxenike Arizaleta <sukiletxe@yahoo.es>\n"
|
||||
"Language: eu\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -116,7 +116,7 @@ msgstr "Bidalitako txioak"
|
||||
#: ../src\controller\mainController.py:1277
|
||||
#: ../src\wxUI\dialogs\userSelection.py:20
|
||||
msgid "Likes"
|
||||
msgstr ""
|
||||
msgstr "Gustukoak"
|
||||
|
||||
#: ../src\controller\mainController.py:314
|
||||
#: ../src\controller\mainController.py:1282
|
||||
@@ -153,15 +153,13 @@ msgid "Timeline for {}"
|
||||
msgstr "{}(r)en denbora lerroa"
|
||||
|
||||
#: ../src\controller\mainController.py:340
|
||||
#, fuzzy
|
||||
msgid "Likes timelines"
|
||||
msgstr "Gogokoen denbora lerroa"
|
||||
msgstr "Gustukoen denbora lerroa"
|
||||
|
||||
#: ../src\controller\mainController.py:344
|
||||
#: ../src\controller\mainController.py:789
|
||||
#, fuzzy
|
||||
msgid "Likes for {}"
|
||||
msgstr "{}(r)en zerrrenda"
|
||||
msgstr "{}(r)en gustukoak"
|
||||
|
||||
#: ../src\controller\mainController.py:349 ../src\wxUI\dialogs\lists.py:12
|
||||
msgid "Lists"
|
||||
@@ -421,9 +419,8 @@ msgid "Tweets: %s\n"
|
||||
msgstr "Txioak: %s\n"
|
||||
|
||||
#: ../src\controller\user.py:98
|
||||
#, fuzzy
|
||||
msgid "Likes: %s"
|
||||
msgstr "Gogokoak: %s"
|
||||
msgstr "Gustukoak: %s"
|
||||
|
||||
#: ../src\controller\userActionsController.py:75
|
||||
msgid "You can't ignore direct messages"
|
||||
@@ -594,14 +591,12 @@ msgid "Error."
|
||||
msgstr "Errorea."
|
||||
|
||||
#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:10
|
||||
#, fuzzy
|
||||
msgid "Tweet liked."
|
||||
msgstr "Txio bat jaso da"
|
||||
msgstr "Txio bat gustukoetara gehitu da"
|
||||
|
||||
#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:11
|
||||
#, fuzzy
|
||||
msgid "Likes buffer updated."
|
||||
msgstr "Gogokoen bufferra eguneratu da."
|
||||
msgstr "Gustukoen bufferra eguneratu da."
|
||||
|
||||
#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:12
|
||||
msgid "Geotweet."
|
||||
@@ -816,7 +811,6 @@ msgid "{0}'s database of users has been updated."
|
||||
msgstr "{0}-ren erabiltzaileen datu-basea eguneratua izan da."
|
||||
|
||||
#: ../src\extra\translator\translator.py:124
|
||||
#, fuzzy
|
||||
msgid "unavailable"
|
||||
msgstr "Ez dago erabilgarri"
|
||||
|
||||
@@ -1378,14 +1372,12 @@ msgid "Send direct message"
|
||||
msgstr "Zuzeneko mezua bidali"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:14
|
||||
#, fuzzy
|
||||
msgid "Like a tweet"
|
||||
msgstr "Txio berri bat"
|
||||
msgstr "Txio bat gustukoetara gehitu"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:15
|
||||
#, fuzzy
|
||||
msgid "Unlike a tweet"
|
||||
msgstr "Txio berri bat"
|
||||
msgstr "Txio bat gustukoetatik kendu"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:16
|
||||
msgid "Open the user actions dialogue"
|
||||
@@ -1520,25 +1512,24 @@ msgid "View conversation"
|
||||
msgstr "Elkarrizketa ikusi"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:49
|
||||
#, fuzzy
|
||||
msgid "Check and download updates"
|
||||
msgstr "E&guneratzeak bilatu"
|
||||
msgstr "Eguneratzeak bilatu eta jaitsi"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:50
|
||||
msgid ""
|
||||
"Opens the list manager, which allows you to create, edit, delete and open "
|
||||
"lists in buffers."
|
||||
msgstr ""
|
||||
"Zerrenden kudeatzailea irekitzen du. Kudeatzaileak zerrendak sortzea, "
|
||||
"editatzea, ezabatzea eta bufferretan irekitzea ahalbidetzen du"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:51
|
||||
#, fuzzy
|
||||
msgid "Opens the global settings dialogue"
|
||||
msgstr "Ekintzen dialogoa ireki"
|
||||
msgstr "Ezarpen globalen elkarrizketa-koadroa ireki"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:52
|
||||
#, fuzzy
|
||||
msgid "Opens the account settings dialogue"
|
||||
msgstr "Ekintzen dialogoa ireki"
|
||||
msgstr "Kontuaren ezarpenen elkarrizketa-koadroa ireki"
|
||||
|
||||
#: ../src\keystrokeEditor\wx_ui.py:8
|
||||
msgid "Keystroke editor"
|
||||
@@ -1741,24 +1732,20 @@ msgid "You've unfollowed %s (@%s)"
|
||||
msgstr "Orain ez duzu %s (@%s) jarraitzen"
|
||||
|
||||
#: ../src\twitter\compose.py:126
|
||||
#, fuzzy
|
||||
msgid "You've liked: %s, %s"
|
||||
msgstr "%s blokeatu duzu."
|
||||
msgstr "Gustukoetara gehitu duzu: %s, %s"
|
||||
|
||||
#: ../src\twitter\compose.py:128
|
||||
#, fuzzy
|
||||
msgid "%s(@%s) has liked: %s"
|
||||
msgstr "Orain %s(e)k (@%s) jarraitzen zaitu"
|
||||
msgstr "%s(e)k (@%s) gustukoetara gehitu du: %s"
|
||||
|
||||
#: ../src\twitter\compose.py:130
|
||||
#, fuzzy
|
||||
msgid "You've unliked: %s, %s"
|
||||
msgstr "%s desblokeatu duzu"
|
||||
msgstr "Gustukoetatik kendu duzu: %s"
|
||||
|
||||
#: ../src\twitter\compose.py:131
|
||||
#, fuzzy
|
||||
msgid "%s(@%s) has unliked: %s"
|
||||
msgstr "Orain %s(e)k (@%s) jarraitzen zaitu"
|
||||
msgstr "%s(e)k (@%s) gustukoetatik kendu du: %s"
|
||||
|
||||
#: ../src\twitter\compose.py:133
|
||||
msgid "You've created the list %s"
|
||||
@@ -2055,13 +2042,12 @@ msgid "Warning"
|
||||
msgstr "Abisua"
|
||||
|
||||
#: ../src\wxUI\commonMessageDialogs.py:50
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"This is a protected user account, you need to follow this user to view their "
|
||||
"tweets or likes."
|
||||
msgstr ""
|
||||
"Kontu hau babestutako erabiltzaile batena da. Kontua jarraitu behar duzu "
|
||||
"bere txioak eta gogokoak ikusteko."
|
||||
"bere txioak eta gustukoak ikusteko."
|
||||
|
||||
#: ../src\wxUI\commonMessageDialogs.py:53
|
||||
msgid ""
|
||||
@@ -2484,7 +2470,7 @@ msgstr "Bertxioak:"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:268
|
||||
msgid "Likes: "
|
||||
msgstr ""
|
||||
msgstr "Gogokoak:"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:318
|
||||
msgid "View"
|
||||
@@ -2612,11 +2598,11 @@ msgstr "E&rantzun"
|
||||
|
||||
#: ../src\wxUI\menus.py:11 ../src\wxUI\view.py:30
|
||||
msgid "&Like"
|
||||
msgstr ""
|
||||
msgstr "Gustukoetara &gehitu"
|
||||
|
||||
#: ../src\wxUI\menus.py:13 ../src\wxUI\view.py:31
|
||||
msgid "&Unlike"
|
||||
msgstr ""
|
||||
msgstr "Gustukoetatik &kendu"
|
||||
|
||||
#: ../src\wxUI\menus.py:15 ../src\wxUI\menus.py:33 ../src\wxUI\menus.py:49
|
||||
msgid "&Open URL"
|
||||
@@ -2765,9 +2751,8 @@ msgid "R&emove from list"
|
||||
msgstr "Zerrendatik &kendu"
|
||||
|
||||
#: ../src\wxUI\view.py:46
|
||||
#, fuzzy
|
||||
msgid "V&iew likes"
|
||||
msgstr "&Zerrendak ikusi"
|
||||
msgstr "&Gustukoak ikusi"
|
||||
|
||||
#: ../src\wxUI\view.py:50
|
||||
msgid "New &trending topics buffer..."
|
||||
|
Binary file not shown.
@@ -6,7 +6,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: TW Blue 0.80\n"
|
||||
"POT-Creation-Date: 2015-11-06 08:10+Hora estndar central (Mxico)\n"
|
||||
"PO-Revision-Date: 2015-10-03 13:02+0200\n"
|
||||
"PO-Revision-Date: 2015-12-10 13:12+0300\n"
|
||||
"Last-Translator: José Manuel Delicado Alcolea <jmdaweb@hotmail.com>\n"
|
||||
"Language-Team: Mohammed Al Shara <mohammed@atexplorer.com>\n"
|
||||
"Language: ar\n"
|
||||
@@ -14,7 +14,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: pygettext.py 1.5\n"
|
||||
"X-Generator: Poedit 1.8.5\n"
|
||||
"X-Generator: Poedit 1.6.11\n"
|
||||
"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
|
||||
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n"
|
||||
"X-Poedit-Bookmarks: -1,-1,-1,-1,-1,-1,409,-1,-1,-1\n"
|
||||
@@ -123,7 +123,7 @@ msgstr "تغريدة جديدة"
|
||||
#: ../src\controller\mainController.py:1277
|
||||
#: ../src\wxUI\dialogs\userSelection.py:20
|
||||
msgid "Likes"
|
||||
msgstr ""
|
||||
msgstr "إعجابات"
|
||||
|
||||
#: ../src\controller\mainController.py:314
|
||||
#: ../src\controller\mainController.py:1282
|
||||
@@ -213,7 +213,7 @@ msgstr "إفراغ السياق الزمني"
|
||||
|
||||
#: ../src\controller\mainController.py:452
|
||||
msgid "{0} not found."
|
||||
msgstr ""
|
||||
msgstr "{0} لم يتم العثور عليه"
|
||||
|
||||
#: ../src\controller\mainController.py:485
|
||||
#: ../src\controller\mainController.py:500
|
||||
@@ -223,7 +223,7 @@ msgstr "إختر المستخدم"
|
||||
|
||||
#: ../src\controller\mainController.py:808
|
||||
msgid "Conversation with {0}"
|
||||
msgstr ""
|
||||
msgstr "محادثة مع {0}"
|
||||
|
||||
#: ../src\controller\mainController.py:852
|
||||
#: ../src\controller\mainController.py:871
|
||||
@@ -254,7 +254,7 @@ msgstr "%s فارغة"
|
||||
|
||||
#: ../src\controller\mainController.py:1012
|
||||
msgid "{0}: This account is not logged into Twitter."
|
||||
msgstr ""
|
||||
msgstr "{0}: هذا الحساب لم يقم بتسجيل الدخول لتويتر."
|
||||
|
||||
#: ../src\controller\mainController.py:1018
|
||||
#: ../src\controller\mainController.py:1039
|
||||
@@ -264,7 +264,7 @@ msgstr "%s, %sالخاصة ب%s"
|
||||
|
||||
#: ../src\controller\mainController.py:1033
|
||||
msgid "{0}: This account is not logged into twitter."
|
||||
msgstr ""
|
||||
msgstr "{0}: هذا الحساب لم يقم بتسجيل الدخول لتويتر."
|
||||
|
||||
#: ../src\controller\mainController.py:1134
|
||||
msgid "One mention from %s "
|
||||
@@ -277,7 +277,7 @@ msgstr "تغريدة واحدة من %s"
|
||||
|
||||
#: ../src\controller\mainController.py:1307
|
||||
msgid "This list is already opened"
|
||||
msgstr ""
|
||||
msgstr "هذه القائمة تم فتحها من قبل"
|
||||
|
||||
#: ../src\controller\mainController.py:1366
|
||||
msgid "The auto-reading of new tweets is enabled for this buffer"
|
||||
@@ -294,7 +294,7 @@ msgstr "مدير الجلسة"
|
||||
|
||||
#: ../src\controller\mainController.py:1378
|
||||
msgid "Session mute off"
|
||||
msgstr ""
|
||||
msgstr "تم إلغائ كتم الجلسة هذه"
|
||||
|
||||
#: ../src\controller\mainController.py:1385
|
||||
msgid "Buffer mute on"
|
||||
@@ -598,11 +598,11 @@ msgstr "تم إيقاف تشغيل المقطع الصوتي"
|
||||
|
||||
#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:5
|
||||
msgid "User timeline buffer created."
|
||||
msgstr ""
|
||||
msgstr "تم إنشاء صفحة بالسياق الزمني للمستخدم."
|
||||
|
||||
#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:6
|
||||
msgid "Buffer destroied."
|
||||
msgstr ""
|
||||
msgstr "تم حذف الصفحة."
|
||||
|
||||
#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:7
|
||||
#, fuzzy
|
||||
@@ -675,7 +675,7 @@ msgstr "لقد قمت بإعادة التغريد"
|
||||
|
||||
#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:21
|
||||
msgid "Search buffer updated."
|
||||
msgstr ""
|
||||
msgstr "تم تحديث صفحة البحث."
|
||||
|
||||
#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:22
|
||||
msgid "Tweet received."
|
||||
@@ -688,11 +688,11 @@ msgstr "التغريدات"
|
||||
|
||||
#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:24
|
||||
msgid "Trending topics buffer updated."
|
||||
msgstr ""
|
||||
msgstr "تم تحديث صفحة المواضيع المشهورة."
|
||||
|
||||
#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:25
|
||||
msgid "New tweet in user timeline buffer."
|
||||
msgstr ""
|
||||
msgstr "تغريدة جديدة في صفحة السياق الزمني للمستخدم."
|
||||
|
||||
#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:26
|
||||
#, fuzzy
|
||||
@@ -713,11 +713,11 @@ msgstr "إضغط مفتاح الدخول لسماع الصوت"
|
||||
|
||||
#: ../src\extra\SpellChecker\spellchecker.py:45
|
||||
msgid "Misspelled word: %s"
|
||||
msgstr ""
|
||||
msgstr "خطء إملائي في الكلمة: %s"
|
||||
|
||||
#: ../src\extra\SpellChecker\wx_ui.py:26
|
||||
msgid "Misspelled word"
|
||||
msgstr ""
|
||||
msgstr "كلمة فيها خطء إملائي"
|
||||
|
||||
#: ../src\extra\SpellChecker\wx_ui.py:31
|
||||
msgid "Context"
|
||||
@@ -760,7 +760,7 @@ msgstr "خطء"
|
||||
|
||||
#: ../src\extra\SpellChecker\wx_ui.py:79
|
||||
msgid "Spell check complete."
|
||||
msgstr ""
|
||||
msgstr "تم إنهاء التدقيق الإملائي."
|
||||
|
||||
#: ../src\extra\autocompletionUsers\completion.py:20
|
||||
#: ../src\extra\autocompletionUsers\completion.py:38
|
||||
@@ -1400,11 +1400,11 @@ msgstr "إذهب إلى التبويبة القادمة"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:7
|
||||
msgid "Focus the next session"
|
||||
msgstr ""
|
||||
msgstr "إنتقل للجلسة التالية."
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:8
|
||||
msgid "Focus the previous session"
|
||||
msgstr ""
|
||||
msgstr "إنتقل للجلسة السابقة."
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:9
|
||||
#, fuzzy
|
||||
@@ -1452,15 +1452,15 @@ msgstr "إفتح سياق المستخدم"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:21
|
||||
msgid "Destroy buffer"
|
||||
msgstr ""
|
||||
msgstr "إحذف الصفحة"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:22
|
||||
msgid "Interact with the currently focused tweet."
|
||||
msgstr ""
|
||||
msgstr "التفاعل مع التغريدة المختارة حاليا"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:23
|
||||
msgid "Open URL"
|
||||
msgstr ""
|
||||
msgstr "إفتح الرابط"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:24
|
||||
msgid "Increase volume by 5%"
|
||||
@@ -1472,19 +1472,19 @@ msgstr "إنقاص علو الصوت %5"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:26
|
||||
msgid "Jump to the first element of a buffer"
|
||||
msgstr ""
|
||||
msgstr "القفز إلى أول عنصر في الصفحة"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:27
|
||||
msgid "Jump to the last element of the current buffer"
|
||||
msgstr ""
|
||||
msgstr "القفز إلى آخر عنصر في الصفحة الحالية"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:28
|
||||
msgid "Jump 20 elements up in the current buffer"
|
||||
msgstr ""
|
||||
msgstr "القفز إلى 20 عنصر للأعلى في الصفحة الحالية"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:29
|
||||
msgid "Jump 20 elements down in the current buffer"
|
||||
msgstr ""
|
||||
msgstr "القفز إلى 20 عنصر أسفل في الصفحة الحالية"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:30
|
||||
msgid "Edit profile"
|
||||
@@ -1492,7 +1492,7 @@ msgstr "حرر ملفك الشخصي"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:31
|
||||
msgid "Delete a tweet or direct message"
|
||||
msgstr ""
|
||||
msgstr "إحذف تغريدة أو رسالة مباشرة"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:32
|
||||
#, fuzzy
|
||||
@@ -1501,7 +1501,7 @@ msgstr "إفراغ السياق الزمني"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:33
|
||||
msgid "Repeat last item"
|
||||
msgstr ""
|
||||
msgstr "إعد العنصر الأخير"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:34
|
||||
msgid "Copy to clipboard"
|
||||
@@ -1522,7 +1522,7 @@ msgstr "كتم / إلغاء كتم الصفحة الفعالة"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:38
|
||||
msgid "Mute/unmute the current session"
|
||||
msgstr ""
|
||||
msgstr "كتم / إلغاء الكتم للجلسة الحالية"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:39
|
||||
#, fuzzy
|
||||
@@ -1549,7 +1549,7 @@ msgstr "إظهار القوائم لمستخدم محدد"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:44
|
||||
msgid "load previous items"
|
||||
msgstr ""
|
||||
msgstr "حمل العناصر السابقة"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:45
|
||||
#, fuzzy
|
||||
@@ -1568,7 +1568,7 @@ msgstr "إعرض المواضيع المتداولة"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:48
|
||||
msgid "View conversation"
|
||||
msgstr ""
|
||||
msgstr "إعرض المحادثة"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:49
|
||||
#, fuzzy
|
||||
@@ -1580,6 +1580,7 @@ msgid ""
|
||||
"Opens the list manager, which allows you to create, edit, delete and open "
|
||||
"lists in buffers."
|
||||
msgstr ""
|
||||
"تفتح مدير القوائم والذي يمكنك من إنشاء وتحرير وحذف وفتح القوائم والصفحات."
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:51
|
||||
#, fuzzy
|
||||
@@ -1614,7 +1615,7 @@ msgstr "حرر"
|
||||
|
||||
#: ../src\keystrokeEditor\wx_ui.py:20
|
||||
msgid "Execute action"
|
||||
msgstr ""
|
||||
msgstr "ينفذ المهمة"
|
||||
|
||||
#: ../src\keystrokeEditor\wx_ui.py:21 ../src\wxUI\dialogs\configuration.py:349
|
||||
#: ../src\wxUI\dialogs\message.py:84 ../src\wxUI\dialogs\message.py:144
|
||||
@@ -1723,10 +1724,12 @@ msgid ""
|
||||
"The request to authorize your Twitter account will be opened in your "
|
||||
"browser. You only need to do this once. Would you like to continue?"
|
||||
msgstr ""
|
||||
"سوف يفتح متصفح للسماح للبرنامج بالدخول على حساب تويتر الخاص بك. أنت تحتاج أن "
|
||||
"تفعل هذا مرة واحدة. هل ترغب بالمتابعة؟"
|
||||
|
||||
#: ../src\sessionmanager\wxUI.py:51
|
||||
msgid "Authorized account %d"
|
||||
msgstr ""
|
||||
msgstr "تم التصريح للحساب %d"
|
||||
|
||||
#: ../src\sessionmanager\wxUI.py:57
|
||||
msgid "Invalid user token"
|
||||
@@ -1736,7 +1739,7 @@ msgstr "مفتاح العبور ر غير صحيح"
|
||||
msgid ""
|
||||
"Your access token is invalid or the authorization has failed. Please try "
|
||||
"again."
|
||||
msgstr ""
|
||||
msgstr "هناك مشكلة في التصريح. يرجى المحاولة مرة أخرى."
|
||||
|
||||
#: ../src\sessionmanager\wxUI.py:63
|
||||
#, fuzzy
|
||||
@@ -1745,7 +1748,7 @@ msgstr "هل أنت متأكد من رغبتك بإزالة هذذ الحساب"
|
||||
|
||||
#: ../src\sound.py:136
|
||||
msgid "Stopped."
|
||||
msgstr ""
|
||||
msgstr "تم الإيقاف."
|
||||
|
||||
#: ../src\twitter\compose.py:41 ../src\twitter\compose.py:96
|
||||
#: ../src\twitter\compose.py:105
|
||||
@@ -1948,7 +1951,8 @@ msgid "Date"
|
||||
msgstr "تاريخ"
|
||||
|
||||
#: ../src\wxUI\buffers\base.py:11 ../src\wxUI\buffers\people.py:10
|
||||
#: ../src\wxUI\buffers\user_searches.py:9 ../src\wxUI\dialogs\userActions.py:10
|
||||
#: ../src\wxUI\buffers\user_searches.py:9
|
||||
#: ../src\wxUI\dialogs\userActions.py:10
|
||||
#: ../src\wxUI\dialogs\userSelection.py:10 ../src\wxUI\dialogs\utils.py:30
|
||||
msgid "User"
|
||||
msgstr "المستخدم"
|
||||
@@ -2739,42 +2743,36 @@ msgid "&Show item"
|
||||
msgstr "&إعرض العنصر"
|
||||
|
||||
#: ../src\wxUI\sysTrayIcon.py:34 ../src\wxUI\view.py:22
|
||||
#, fuzzy
|
||||
msgid "&Global settings"
|
||||
msgstr "تم تشغيل الكتم الكلي."
|
||||
msgstr "&الإعدادات العامة"
|
||||
|
||||
#: ../src\wxUI\sysTrayIcon.py:35 ../src\wxUI\view.py:21
|
||||
msgid "Account se&ttings"
|
||||
msgstr ""
|
||||
|
||||
#: ../src\wxUI\sysTrayIcon.py:36
|
||||
#, fuzzy
|
||||
msgid "Update &profile"
|
||||
msgstr "حدث ملفك الشخصي"
|
||||
msgstr "حدث &ملفك الشخصي"
|
||||
|
||||
#: ../src\wxUI\sysTrayIcon.py:37
|
||||
#, fuzzy
|
||||
msgid "&Show / hide"
|
||||
msgstr "الإظهار او الإخفاء"
|
||||
msgstr "&الإظهار او الإخفاء"
|
||||
|
||||
#: ../src\wxUI\sysTrayIcon.py:38 ../src\wxUI\view.py:61
|
||||
msgid "&Documentation"
|
||||
msgstr "دليل المستخدم"
|
||||
|
||||
#: ../src\wxUI\sysTrayIcon.py:40
|
||||
#, fuzzy
|
||||
msgid "Check for &updates"
|
||||
msgstr "فحص التحديثات الجديدة"
|
||||
msgstr "فحص &التحديثات الجديدة"
|
||||
|
||||
#: ../src\wxUI\sysTrayIcon.py:41
|
||||
#, fuzzy
|
||||
msgid "&Exit"
|
||||
msgstr "الخروج"
|
||||
msgstr "&الخروج"
|
||||
|
||||
#: ../src\wxUI\view.py:15
|
||||
#, fuzzy
|
||||
msgid "&Manage accounts"
|
||||
msgstr "حساب جديد"
|
||||
msgstr "&إدر الحسابات"
|
||||
|
||||
#: ../src\wxUI\view.py:16
|
||||
msgid "&Update profile"
|
||||
@@ -2883,9 +2881,8 @@ msgid "&Report an error"
|
||||
msgstr "إبلغ عن عطل"
|
||||
|
||||
#: ../src\wxUI\view.py:67
|
||||
#, fuzzy
|
||||
msgid "{0}'s &website"
|
||||
msgstr "موقع TW Blue الإلكتروني"
|
||||
msgstr "&website الخاص ب{0} "
|
||||
|
||||
#: ../src\wxUI\view.py:68
|
||||
msgid "About &{0}"
|
||||
|
Binary file not shown.
@@ -2,7 +2,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: TW Blue 0.80\n"
|
||||
"POT-Creation-Date: 2015-11-06 08:10+Hora estndar central (Mxico)\n"
|
||||
"PO-Revision-Date: 2015-11-16 21:55+0200\n"
|
||||
"PO-Revision-Date: 2015-11-29 17:17+0200\n"
|
||||
"Last-Translator: José Manuel Delicado Alcolea <jmdaweb@hotmail.com>\n"
|
||||
"Language-Team: Jani Kinnunen <jani.kinnunen@wippies.fi>\n"
|
||||
"Language: fi\n"
|
||||
@@ -1845,7 +1845,7 @@ msgid ""
|
||||
"Changes:\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"Uusi versio (%s) on saatavilla. Haluatko ladata sen nyt?\n"
|
||||
"Uusi %sN versio on saatavilla. Haluatko ladata sen nyt?\n"
|
||||
"\n"
|
||||
" %sn versio: %s\n"
|
||||
"\n"
|
||||
@@ -2832,7 +2832,7 @@ msgstr "Päivitä"
|
||||
|
||||
#: ../src\wxUI\view.py:181
|
||||
msgid "Your {0} version is up to date"
|
||||
msgstr "Käyttämäsi {0}-versio on ajan tasalla."
|
||||
msgstr "Käyttämäsi {0}n versio on ajan tasalla."
|
||||
|
||||
#~ msgid "Favourites"
|
||||
#~ msgstr "Suosikit"
|
||||
|
Binary file not shown.
@@ -2,14 +2,14 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: TW Blue 0.80\n"
|
||||
"POT-Creation-Date: 2015-11-06 08:10+Hora estndar central (Mxico)\n"
|
||||
"PO-Revision-Date: 2015-10-03 13:11+0200\n"
|
||||
"PO-Revision-Date: 2015-12-07 10:36+0100\n"
|
||||
"Last-Translator: José Manuel Delicado Alcolea <jmdaweb@hotmail.com>\n"
|
||||
"Language-Team: Juan Buño <jcbsua@gmail.com>\n"
|
||||
"Language: gl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 1.8.5\n"
|
||||
"X-Generator: Poedit 1.6.11\n"
|
||||
"X-Poedit-KeywordsList: _;gettext;gettext_noop\n"
|
||||
"X-Poedit-Basepath: .\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -116,7 +116,7 @@ msgstr "Enviar chíos"
|
||||
#: ../src\controller\mainController.py:1277
|
||||
#: ../src\wxUI\dialogs\userSelection.py:20
|
||||
msgid "Likes"
|
||||
msgstr ""
|
||||
msgstr "Marcados como Gústame"
|
||||
|
||||
#: ../src\controller\mainController.py:314
|
||||
#: ../src\controller\mainController.py:1282
|
||||
@@ -153,15 +153,13 @@ msgid "Timeline for {}"
|
||||
msgstr "Liña temporal para {0}"
|
||||
|
||||
#: ../src\controller\mainController.py:340
|
||||
#, fuzzy
|
||||
msgid "Likes timelines"
|
||||
msgstr "Liñas temporais de favoritos"
|
||||
msgstr "Liñas temporais de marcados como gústame"
|
||||
|
||||
#: ../src\controller\mainController.py:344
|
||||
#: ../src\controller\mainController.py:789
|
||||
#, fuzzy
|
||||
msgid "Likes for {}"
|
||||
msgstr "Lista para {}"
|
||||
msgstr "Chíos que me gustan para {}"
|
||||
|
||||
#: ../src\controller\mainController.py:349 ../src\wxUI\dialogs\lists.py:12
|
||||
msgid "Lists"
|
||||
@@ -420,9 +418,8 @@ msgid "Tweets: %s\n"
|
||||
msgstr "Chíos: %s\n"
|
||||
|
||||
#: ../src\controller\user.py:98
|
||||
#, fuzzy
|
||||
msgid "Likes: %s"
|
||||
msgstr "Favoritos: %s"
|
||||
msgstr "Marcados como gústame: %s"
|
||||
|
||||
#: ../src\controller\userActionsController.py:75
|
||||
msgid "You can't ignore direct messages"
|
||||
@@ -593,14 +590,12 @@ msgid "Error."
|
||||
msgstr "Erro"
|
||||
|
||||
#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:10
|
||||
#, fuzzy
|
||||
msgid "Tweet liked."
|
||||
msgstr "Chío recibido."
|
||||
msgstr "Chío marcado como gústame."
|
||||
|
||||
#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:11
|
||||
#, fuzzy
|
||||
msgid "Likes buffer updated."
|
||||
msgstr "Búfer Favoritos actualizado."
|
||||
msgstr "Búfer de marcados como gústame actualizado."
|
||||
|
||||
#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:12
|
||||
msgid "Geotweet."
|
||||
@@ -816,7 +811,6 @@ msgid "{0}'s database of users has been updated."
|
||||
msgstr "Actualizouse a base de dados de usuarios do {0}'"
|
||||
|
||||
#: ../src\extra\translator\translator.py:124
|
||||
#, fuzzy
|
||||
msgid "unavailable"
|
||||
msgstr "Non dispoñible"
|
||||
|
||||
@@ -1375,14 +1369,12 @@ msgid "Send direct message"
|
||||
msgstr "Enviar mensaxe directa"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:14
|
||||
#, fuzzy
|
||||
msgid "Like a tweet"
|
||||
msgstr "Novo chío"
|
||||
msgstr "Gústame un chío"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:15
|
||||
#, fuzzy
|
||||
msgid "Unlike a tweet"
|
||||
msgstr "Novo chío"
|
||||
msgstr "Non me gusta un chío"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:16
|
||||
msgid "Open the user actions dialogue"
|
||||
@@ -1518,25 +1510,24 @@ msgid "View conversation"
|
||||
msgstr "Ver conversación"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:49
|
||||
#, fuzzy
|
||||
msgid "Check and download updates"
|
||||
msgstr "Comprobar &actualizacións"
|
||||
msgstr "Comprobar e descargar actualizacións"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:50
|
||||
msgid ""
|
||||
"Opens the list manager, which allows you to create, edit, delete and open "
|
||||
"lists in buffers."
|
||||
msgstr ""
|
||||
"Abre o xestor de listas, o que che permite crear, editar, eliminar e abrir "
|
||||
"listas nos búferes."
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:51
|
||||
#, fuzzy
|
||||
msgid "Opens the global settings dialogue"
|
||||
msgstr "Abrir o diálogo de accións do Usuario"
|
||||
msgstr "Abre o diálogo de opcións blobais"
|
||||
|
||||
#: ../src\keystrokeEditor\constants.py:52
|
||||
#, fuzzy
|
||||
msgid "Opens the account settings dialogue"
|
||||
msgstr "Abrir o diálogo de accións do Usuario"
|
||||
msgstr "Abre o diálogo de opcións da conta"
|
||||
|
||||
#: ../src\keystrokeEditor\wx_ui.py:8
|
||||
msgid "Keystroke editor"
|
||||
@@ -1739,24 +1730,20 @@ msgid "You've unfollowed %s (@%s)"
|
||||
msgstr "deixaches de seguir a %s(@%s)"
|
||||
|
||||
#: ../src\twitter\compose.py:126
|
||||
#, fuzzy
|
||||
msgid "You've liked: %s, %s"
|
||||
msgstr "Bloqueaches a %s"
|
||||
msgstr "Marcaches como gústame: %s, %s"
|
||||
|
||||
#: ../src\twitter\compose.py:128
|
||||
#, fuzzy
|
||||
msgid "%s(@%s) has liked: %s"
|
||||
msgstr "%s(@%s) comezou a seguirte"
|
||||
msgstr "%s(@%s) marcouse como gústame: %s"
|
||||
|
||||
#: ../src\twitter\compose.py:130
|
||||
#, fuzzy
|
||||
msgid "You've unliked: %s, %s"
|
||||
msgstr "Desbloqueaches a %s"
|
||||
msgstr "Marcaches como non me gusta: %s, %s"
|
||||
|
||||
#: ../src\twitter\compose.py:131
|
||||
#, fuzzy
|
||||
msgid "%s(@%s) has unliked: %s"
|
||||
msgstr "%s(@%s) comezou a seguirte"
|
||||
msgstr "%s(@%s) marcouse como non me gusta: %s"
|
||||
|
||||
#: ../src\twitter\compose.py:133
|
||||
msgid "You've created the list %s"
|
||||
@@ -1899,7 +1886,8 @@ msgid "Date"
|
||||
msgstr "Data"
|
||||
|
||||
#: ../src\wxUI\buffers\base.py:11 ../src\wxUI\buffers\people.py:10
|
||||
#: ../src\wxUI\buffers\user_searches.py:9 ../src\wxUI\dialogs\userActions.py:10
|
||||
#: ../src\wxUI\buffers\user_searches.py:9
|
||||
#: ../src\wxUI\dialogs\userActions.py:10
|
||||
#: ../src\wxUI\dialogs\userSelection.py:10 ../src\wxUI\dialogs\utils.py:30
|
||||
msgid "User"
|
||||
msgstr "Usuario"
|
||||
@@ -2051,13 +2039,12 @@ msgid "Warning"
|
||||
msgstr "Precaución"
|
||||
|
||||
#: ../src\wxUI\commonMessageDialogs.py:50
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"This is a protected user account, you need to follow this user to view their "
|
||||
"tweets or likes."
|
||||
msgstr ""
|
||||
"Esta é unha conta de usuario protexida, necesitas seguir a este usuario para "
|
||||
"ver os seus chíos ou favoritos."
|
||||
"ver os seus chíos ou marcados como gústame."
|
||||
|
||||
#: ../src\wxUI\commonMessageDialogs.py:53
|
||||
msgid ""
|
||||
@@ -2481,7 +2468,7 @@ msgstr "Rechouchíos: "
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:268
|
||||
msgid "Likes: "
|
||||
msgstr ""
|
||||
msgstr "Marcados como gústame:"
|
||||
|
||||
#: ../src\wxUI\dialogs\message.py:318
|
||||
msgid "View"
|
||||
@@ -2609,11 +2596,11 @@ msgstr "&Responder"
|
||||
|
||||
#: ../src\wxUI\menus.py:11 ../src\wxUI\view.py:30
|
||||
msgid "&Like"
|
||||
msgstr ""
|
||||
msgstr "&´Gústame"
|
||||
|
||||
#: ../src\wxUI\menus.py:13 ../src\wxUI\view.py:31
|
||||
msgid "&Unlike"
|
||||
msgstr ""
|
||||
msgstr "&Non me gusta"
|
||||
|
||||
#: ../src\wxUI\menus.py:15 ../src\wxUI\menus.py:33 ../src\wxUI\menus.py:49
|
||||
msgid "&Open URL"
|
||||
@@ -2762,9 +2749,8 @@ msgid "R&emove from list"
|
||||
msgstr "&Quitar de listaxe"
|
||||
|
||||
#: ../src\wxUI\view.py:46
|
||||
#, fuzzy
|
||||
msgid "V&iew likes"
|
||||
msgstr "&Ver listaxes"
|
||||
msgstr "&Ver marcados como gústame"
|
||||
|
||||
#: ../src\wxUI\view.py:50
|
||||
msgid "New &trending topics buffer..."
|
||||
|
Binary file not shown.
@@ -5,8 +5,8 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: TWBlue 0.80\n"
|
||||
"POT-Creation-Date: 2015-11-06 08:10+Hora estndar central (Mxico)\n"
|
||||
"PO-Revision-Date: 2015-11-27 12:04+0100\n"
|
||||
"POT-Creation-Date: 2015-11-06 08:10+Hora estándar central (México)\n"
|
||||
"PO-Revision-Date: 2016-01-19 22:01+0100\n"
|
||||
"Last-Translator: José Manuel Delicado Alcolea <jmdaweb@hotmail.com>\n"
|
||||
"Language-Team: Zvonimir Stanečić\n"
|
||||
"Language: hr\n"
|
||||
|
Binary file not shown.
@@ -6,7 +6,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"POT-Creation-Date: 2015-11-06 08:10+Hora estndar central (Mxico)\n"
|
||||
"PO-Revision-Date: 2015-11-28 13:13+0900\n"
|
||||
"PO-Revision-Date: 2015-12-05 20:49+0900\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
"Language: ja_JP\n"
|
||||
@@ -1612,7 +1612,7 @@ msgstr "ユーザーのデフォルト"
|
||||
|
||||
#: ../src\sessionmanager\session.py:189
|
||||
msgid "%s failed. Reason: %s"
|
||||
msgstr "%sに失敗。理由:%s"
|
||||
msgstr "%s"
|
||||
|
||||
#: ../src\sessionmanager\session.py:195
|
||||
msgid "%s succeeded."
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -2,14 +2,14 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: TW Blue 0.80\n"
|
||||
"POT-Creation-Date: 2015-11-06 08:10+Hora estándar central (México)\n"
|
||||
"PO-Revision-Date: 2015-11-21 13:46+0200\n"
|
||||
"PO-Revision-Date: 2015-12-06 13:56+0200\n"
|
||||
"Last-Translator: Burak <burakyuksek252@hotmail.com>\n"
|
||||
"Language-Team: Burak <burakyuksek252@hotmail.com>\n"
|
||||
"Language: tr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 1.7.1\n"
|
||||
"X-Generator: Poedit 1.6.11\n"
|
||||
"X-Poedit-KeywordsList: _;gettext;gettext_noop\n"
|
||||
"X-Poedit-Basepath: .\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
@@ -1951,7 +1951,9 @@ msgstr "Çıkış"
|
||||
|
||||
#: ../src\wxUI\commonMessageDialogs.py:19
|
||||
msgid " {0} must be restarted for these changes to take effect."
|
||||
msgstr "Değişikliklerin uygulanması için {0} yeniden başlatılması gerekir."
|
||||
msgstr ""
|
||||
"Değişikliklerin uygulanması için {0} programının yeniden başlatılması "
|
||||
"gerekir."
|
||||
|
||||
#: ../src\wxUI\commonMessageDialogs.py:19
|
||||
msgid "Restart {0} "
|
||||
|
@@ -14,6 +14,9 @@ if system == "Windows":
|
||||
sys.stderr = open(os.path.join(os.getenv("temp"), "stderr.log"), "w")
|
||||
import languageHandler
|
||||
import paths
|
||||
#check if TWBlue is installed (Windows only)
|
||||
if os.path.exists(paths.app_path(u"Uninstall.exe")):
|
||||
paths.mode="installed"
|
||||
import commandline
|
||||
import config
|
||||
import sound
|
||||
|
@@ -7,7 +7,7 @@ from platform_utils import paths as paths_
|
||||
|
||||
from functools import wraps
|
||||
|
||||
mode = None
|
||||
mode = "portable"
|
||||
directory = None
|
||||
|
||||
log = logging.getLogger("paths")
|
||||
@@ -55,7 +55,8 @@ def data_path(app_name='TW blue'):
|
||||
# data_path = os.path.join(shlobj.SHGetFolderPath(0, shlobj.CSIDL_APPDATA), app_name)
|
||||
# else:
|
||||
if platform.system() == "Windows":
|
||||
data_path = os.path.join(os.getenv("AppData"), app_name)
|
||||
import winpaths
|
||||
data_path = os.path.join(winpaths.get_appdata(), app_name)
|
||||
else:
|
||||
data_path = os.path.join(os.environ['HOME'], ".%s" % app_name)
|
||||
if not os.path.exists(data_path):
|
||||
|
@@ -32,7 +32,7 @@ def load_library(library, x86_path='.', x64_path='.', *args, **kwargs):
|
||||
loaded = _do_load(lib, *args, **kwargs)
|
||||
if loaded is not None:
|
||||
return loaded
|
||||
raise LibraryLoadError('unable to load %r. Provided library path: %r' % (library, path))
|
||||
raise LibraryLoadError('unable to load %r. Provided library path: %r' % (library, lib))
|
||||
|
||||
def _do_load(file, *args, **kwargs):
|
||||
loader = TYPES[platform.system()]['loader']
|
||||
|
@@ -194,6 +194,7 @@ class Session(object):
|
||||
if report_success:
|
||||
output.speak(_("%s succeeded.") % action)
|
||||
if _sound != None: self.sound.play(_sound)
|
||||
return val
|
||||
|
||||
def search(self, name, *args, **kwargs):
|
||||
tl = self.twitter.twitter.search(*args, **kwargs)
|
||||
@@ -278,8 +279,7 @@ class Session(object):
|
||||
tl = self.call_paged(function, sinze_id=last_id, *args, **kwargs)
|
||||
self.order_buffer(name, tl)
|
||||
|
||||
@_require_login
|
||||
def get_cursored_stream(self, name, function, items="users", *args, **kwargs):
|
||||
def get_cursored_stream(self, name, function, items="users", get_previous=False, *args, **kwargs):
|
||||
|
||||
""" Gets items for API calls that require using cursors to paginate the results.
|
||||
name str: Name to save it in the database.
|
||||
@@ -289,7 +289,7 @@ class Session(object):
|
||||
|
||||
items_ = []
|
||||
try:
|
||||
if self.db[name].has_key("cursor"):
|
||||
if self.db[name].has_key("cursor") and get_previous:
|
||||
cursor = self.db[name]["cursor"]
|
||||
else:
|
||||
cursor = -1
|
||||
@@ -352,7 +352,7 @@ class Session(object):
|
||||
self.logged = False
|
||||
self.twitter = twitter.twitter.twitter()
|
||||
self.login(False)
|
||||
# pub.sendMessage("streamError", session=self.session_id)
|
||||
pub.sendMessage("restart_streams", session=self.session_id)
|
||||
if self.reconnection_function_active == True: return
|
||||
self.reconnection_function_active = True
|
||||
if not hasattr(self, "main_stream"):
|
||||
|
@@ -2,6 +2,7 @@
|
||||
import shutil
|
||||
import widgetUtils
|
||||
import platform
|
||||
import output
|
||||
if platform.system() == "Windows":
|
||||
import wxUI as view
|
||||
from controller import settings
|
||||
|
64
src/setup.py
64
src/setup.py
@@ -28,22 +28,22 @@ from glob import glob
|
||||
import wx
|
||||
|
||||
def get_architecture_files():
|
||||
if platform.architecture()[0][:2] == "32":
|
||||
return [
|
||||
if platform.architecture()[0][:2] == "32":
|
||||
return [
|
||||
("", ["../windows-dependencies/x86/oggenc2.exe", "../windows-dependencies/x86/bootstrap.exe"]),
|
||||
("Microsoft.VC90.CRT", glob("../windows-dependencies/x86/Microsoft.VC90.CRT/*")),
|
||||
("Microsoft.VC90.MFC", glob("../windows-dependencies/x86/Microsoft.VC90.MFC/*")),]
|
||||
elif platform.architecture()[0][:2] == "64":
|
||||
return [
|
||||
elif platform.architecture()[0][:2] == "64":
|
||||
return [
|
||||
("", ["../windows-dependencies/x64/oggenc2.exe", "../windows-dependencies/x86/bootstrap.exe"]),
|
||||
("Microsoft.VC90.CRT", glob("../windows-dependencies/x64/Microsoft.VC90.CRT/*")),
|
||||
("Microsoft.VC90.MFC", glob("../windows-dependencies/x64/Microsoft.VC90.MFC/*")),]
|
||||
|
||||
def get_data():
|
||||
import accessible_output2
|
||||
import sound_lib
|
||||
import enchant
|
||||
return [
|
||||
import accessible_output2
|
||||
import sound_lib
|
||||
import enchant
|
||||
return [
|
||||
("", ["conf.defaults", "app-configuration.defaults", "icon.ico"]),
|
||||
("requests", ["cacert.pem"]),
|
||||
("accessible_output2/lib", glob("accessible_output2/lib/*.dll")),
|
||||
@@ -52,33 +52,33 @@ def get_data():
|
||||
]+get_sounds()+get_locales()+get_documentation()+sound_lib.find_datafiles()+accessible_output2.find_datafiles()+enchant.utils.win32_data_files()+get_architecture_files()+wx_files()
|
||||
|
||||
def get_documentation ():
|
||||
answer = []
|
||||
depth = 6
|
||||
for root, dirs, files in os.walk('documentation'):
|
||||
if depth == 0:
|
||||
break
|
||||
new = (root, glob(os.path.join(root, "*.html")))
|
||||
answer.append(new)
|
||||
depth -= 1
|
||||
return answer
|
||||
answer = []
|
||||
depth = 6
|
||||
for root, dirs, files in os.walk('documentation'):
|
||||
if depth == 0:
|
||||
break
|
||||
new = (root, glob(os.path.join(root, "*.html")))
|
||||
answer.append(new)
|
||||
depth -= 1
|
||||
return answer
|
||||
|
||||
def get_sounds():
|
||||
answer = []
|
||||
depth = 6
|
||||
for root, dirs, files in os.walk('sounds'):
|
||||
if depth == 0:
|
||||
break
|
||||
new = (root, glob(os.path.join(root, "*.ogg")))
|
||||
answer.append(new)
|
||||
depth -= 1
|
||||
return answer
|
||||
answer = []
|
||||
depth = 6
|
||||
for root, dirs, files in os.walk('sounds'):
|
||||
if depth == 0:
|
||||
break
|
||||
new = (root, glob(os.path.join(root, "*.ogg")))
|
||||
answer.append(new)
|
||||
depth -= 1
|
||||
return answer
|
||||
|
||||
def get_locales():
|
||||
answer = []
|
||||
for root, dirs, files in os.walk('locales'):
|
||||
new = (root, glob(os.path.join(root, '*.mo')))
|
||||
answer.append(new)
|
||||
return answer
|
||||
answer = []
|
||||
for root, dirs, files in os.walk('locales'):
|
||||
new = (root, glob(os.path.join(root, '*.mo')))
|
||||
answer.append(new)
|
||||
return answer
|
||||
|
||||
def wx_files():
|
||||
wxDir=wx.__path__[0]
|
||||
@@ -99,7 +99,7 @@ def wx_files():
|
||||
return list(localeMoFiles)
|
||||
|
||||
if __name__ == '__main__':
|
||||
setup(
|
||||
setup(
|
||||
name = application.name,
|
||||
author = application.author,
|
||||
author_email = application.authorEmail,
|
||||
|
@@ -14,6 +14,8 @@ system = platform.system()
|
||||
from mysc.repeating_timer import RepeatingTimer
|
||||
from mysc.thread_utils import call_threaded
|
||||
import application
|
||||
import tempfile
|
||||
import glob
|
||||
URLPlayer = None
|
||||
|
||||
def setup():
|
||||
|
1
src/sound_lib/external/__init__.py
vendored
1
src/sound_lib/external/__init__.py
vendored
@@ -4,5 +4,6 @@ import platform
|
||||
if platform.system() != 'Darwin':
|
||||
import sound_lib.external.pybass_aac
|
||||
import sound_lib.external.pybass_alac
|
||||
import sound_lib.external.pybassopus
|
||||
import sound_lib.external.pybassflac
|
||||
import sound_lib.external.pybassmidi
|
||||
|
47
src/sound_lib/external/pybassopus.py
vendored
Normal file
47
src/sound_lib/external/pybassopus.py
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
# Copyright(c) Max Kolosov 2009 maxkolosov@inbox.ru
|
||||
# http://vosolok2008.narod.ru
|
||||
# BSD license
|
||||
|
||||
__version__ = '0.1'
|
||||
__versionTime__ = '2009-11-15'
|
||||
__author__ = 'Max Kolosov <maxkolosov@inbox.ru>'
|
||||
__doc__ = '''
|
||||
pybassflac.py - is ctypes python module for
|
||||
BASSFLAC - extension to the BASS audio library,
|
||||
enabling the playing of FLAC (Free Lossless Audio Codec) encoded files.
|
||||
'''
|
||||
|
||||
import os, sys, ctypes, pybass
|
||||
from paths import x86_path, x64_path
|
||||
import libloader
|
||||
|
||||
bassopus_module = libloader.load_library('bassopus', x86_path=x86_path, x64_path=x64_path)
|
||||
func_type = libloader.get_functype()
|
||||
#Register the plugin with the Bass plugin system.
|
||||
pybass.BASS_PluginLoad(libloader.find_library_path('bassopus', x86_path=x86_path, x64_path=x64_path), 0)
|
||||
|
||||
QWORD = pybass.QWORD
|
||||
HSTREAM = pybass.HSTREAM
|
||||
DOWNLOADPROC = pybass.DOWNLOADPROC
|
||||
BASS_FILEPROCS = pybass.BASS_FILEPROCS
|
||||
|
||||
# BASS_CHANNELINFO type
|
||||
BASS_CTYPE_STREAM_OPUS = 0x11200
|
||||
|
||||
|
||||
#HSTREAM BASSOPUSDEF(BASS_OPUS_StreamCreateFile)(BOOL mem, const void *file, QWORD offset, QWORD length, DWORD flags);
|
||||
BASS_OPUS_StreamCreateFile = func_type(HSTREAM, ctypes.c_byte, ctypes.c_void_p, QWORD, QWORD, ctypes.c_ulong)(('BASS_OPUS_StreamCreateFile', bassopus_module))
|
||||
#HSTREAM BASSFLACDEF(BASS_FLAC_StreamCreateURL)(const char *url, DWORD offset, DWORD flags, DOWNLOADPROC *proc, void *user);
|
||||
BASS_OPUS_StreamCreateURL = func_type(HSTREAM, ctypes.c_char_p, ctypes.c_ulong, ctypes.c_ulong, DOWNLOADPROC, ctypes.c_void_p)(('BASS_OPUS_StreamCreateURL', bassopus_module))
|
||||
#HSTREAM BASSFLACDEF(BASS_FLAC_StreamCreateFileUser)(DWORD system, DWORD flags, const BASS_FILEPROCS *procs, void *user);
|
||||
BASS_OPUS_StreamCreateFileUser = func_type(HSTREAM, ctypes.c_ulong, ctypes.c_ulong, ctypes.POINTER(BASS_FILEPROCS), ctypes.c_void_p)(('BASS_OPUS_StreamCreateFileUser', bassopus_module))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if not pybass.BASS_Init(-1, 44100, 0, 0, 0):
|
||||
print 'BASS_Init error', pybass.get_error_description(pybass.BASS_ErrorGetCode())
|
||||
else:
|
||||
handle = BASS_OPUS_StreamCreateFile(False, 'test.opus', 0, 0, 0)
|
||||
pybass.play_handle(handle)
|
||||
if not pybass.BASS_Free():
|
||||
print 'BASS_Free error', pybass.get_error_description(pybass.BASS_ErrorGetCode())
|
BIN
src/sound_lib/lib/x64/bassopus.dll
Normal file
BIN
src/sound_lib/lib/x64/bassopus.dll
Normal file
Binary file not shown.
BIN
src/sound_lib/lib/x64/libbassopus.dylib
Normal file
BIN
src/sound_lib/lib/x64/libbassopus.dylib
Normal file
Binary file not shown.
BIN
src/sound_lib/lib/x64/libbassopus.so
Normal file
BIN
src/sound_lib/lib/x64/libbassopus.so
Normal file
Binary file not shown.
BIN
src/sound_lib/lib/x86/bassopus.dll
Normal file
BIN
src/sound_lib/lib/x86/bassopus.dll
Normal file
Binary file not shown.
BIN
src/sound_lib/lib/x86/libbassopus.dylib
Normal file
BIN
src/sound_lib/lib/x86/libbassopus.dylib
Normal file
Binary file not shown.
BIN
src/sound_lib/lib/x86/libbassopus.so
Normal file
BIN
src/sound_lib/lib/x86/libbassopus.so
Normal file
Binary file not shown.
@@ -5,14 +5,14 @@ from .channel import Channel
|
||||
class Music(Channel):
|
||||
|
||||
def __init__(self, mem=False, file=None, offset=0, length=0, flags=0, freq=0):
|
||||
handle = BASS_MusicLoad(mem, file, offset, length, flags, freq)
|
||||
handle = pybass.BASS_MusicLoad(mem, file, offset, length, flags, freq)
|
||||
super(Music, self).__init__(handle)
|
||||
self.add_attributes_to_mapping(
|
||||
music_amplify=pybass.BASS_ATTRIB_MUSIC_AMPLIFY,
|
||||
music_bpm = BASS_ATTRIB_MUSIC_BPM,
|
||||
music_pansep=BASS_ATTRIB_MUSIC_PANSEP,
|
||||
music_speed=BASS_ATTRIB_MUSIC_SPEED,
|
||||
music_vol_chan=BASS_ATTRIB_MUSIC_VOL_CHAN,
|
||||
music_vol_global=BASS_ATTRIB_MUSIC_VOL_GLOBAL,
|
||||
music_vol_inst=BASS_ATTRIB_MUSIC_VOL_INST,
|
||||
music_bpm = pybass.BASS_ATTRIB_MUSIC_BPM,
|
||||
music_pansep=pybass.BASS_ATTRIB_MUSIC_PANSEP,
|
||||
music_speed=pybass.BASS_ATTRIB_MUSIC_SPEED,
|
||||
music_vol_chan=pybass.BASS_ATTRIB_MUSIC_VOL_CHAN,
|
||||
music_vol_global=pybass.BASS_ATTRIB_MUSIC_VOL_GLOBAL,
|
||||
music_vol_inst=pybass.BASS_ATTRIB_MUSIC_VOL_INST,
|
||||
)
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -87,11 +87,11 @@ class streamer(TwythonStreamer):
|
||||
pub.sendMessage("mention", data=data, user=self.get_user())
|
||||
|
||||
def process_dm(self, data):
|
||||
if self.session.db["user_name"] == data["direct_message"]["sender"]["screen_name"]:
|
||||
d = self.put_data("sent_direct_messages", data["direct_message"])
|
||||
if d != False:
|
||||
pub.sendMessage("sent-dm", data=data["direct_message"], user=self.get_user())
|
||||
else:
|
||||
if self.session.db["user_name"] != data["direct_message"]["sender"]["screen_name"]:
|
||||
# d = self.put_data("sent_direct_messages", data["direct_message"])
|
||||
# if d != False:
|
||||
# pub.sendMessage("sent-dm", data=data["direct_message"], user=self.get_user())
|
||||
# else:
|
||||
d = self.put_data("direct_messages", data["direct_message"])
|
||||
if d != False:
|
||||
pub.sendMessage("direct-message", data=data["direct_message"], user=self.get_user())
|
||||
|
@@ -58,3 +58,9 @@ def no_tweets():
|
||||
|
||||
def no_favs():
|
||||
return wx.MessageDialog(None, _(u"This user has no favorited tweets. {0} can't create a timeline.").format(application.name), _(u"Error"), wx.ICON_ERROR).ShowModal()
|
||||
|
||||
def no_followers():
|
||||
return wx.MessageDialog(None, _(u"This user has no followers. {0} can't create a timeline.").format(application.name), _(u"Error"), wx.ICON_ERROR).ShowModal()
|
||||
|
||||
def no_friends():
|
||||
return wx.MessageDialog(None, _(u"This user has no friends. {0} can't create a timeline.").format(application.name), _(u"Error"), wx.ICON_ERROR).ShowModal()
|
||||
|
@@ -245,7 +245,7 @@ class viewTweet(widgetUtils.BaseDialog):
|
||||
def set_title(self, lenght):
|
||||
self.SetTitle(_(u"Tweet - %i characters ") % (lenght,))
|
||||
|
||||
def __init__(self, text, rt_count, favs_count):
|
||||
def __init__(self, text, rt_count, favs_count,source):
|
||||
super(viewTweet, self).__init__(None, size=(850,850))
|
||||
panel = wx.Panel(self)
|
||||
label = wx.StaticText(panel, -1, _(u"Tweet"))
|
||||
@@ -270,9 +270,15 @@ class viewTweet(widgetUtils.BaseDialog):
|
||||
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)
|
||||
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)
|
||||
self.spellcheck = wx.Button(panel, -1, _("Spelling correction"), size=wx.DefaultSize)
|
||||
self.unshortenButton = wx.Button(panel, -1, _(u"Expand URL"), size=wx.DefaultSize)
|
||||
|
@@ -1,6 +1,8 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import widgetUtils
|
||||
import baseDialog
|
||||
import wx
|
||||
from extra import translator
|
||||
|
||||
class searchDialog(baseDialog.BaseWXDialog):
|
||||
def __init__(self, value=""):
|
||||
@@ -17,10 +19,27 @@ class searchDialog(baseDialog.BaseWXDialog):
|
||||
sizer.Add(self.term, 0, wx.ALL, 5)
|
||||
self.tweets = wx.RadioButton(panel, -1, _(u"Tweets"), style=wx.RB_GROUP)
|
||||
self.users = wx.RadioButton(panel, -1, _(u"Users"))
|
||||
widgetUtils.connect_event(self.tweets, widgetUtils.RADIOBUTTON, self.show_advanced_search)
|
||||
widgetUtils.connect_event(self.users, widgetUtils.RADIOBUTTON, self.hide_advanced_search)
|
||||
radioSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
radioSizer.Add(self.tweets, 0, wx.ALL, 5)
|
||||
radioSizer.Add(self.users, 0, wx.ALL, 5)
|
||||
sizer.Add(radioSizer, 0, wx.ALL, 5)
|
||||
lang = wx.StaticText(panel, -1, _(u"Language for results: "))
|
||||
langs = [x[1] for x in translator.translator.available_languages()]
|
||||
langs[:] = langs[1:]
|
||||
langs.insert(0, _(u"any"))
|
||||
self.lang = wx.ComboBox(panel, -1, choices=langs, value=langs[0], style = wx.CB_READONLY)
|
||||
langBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
langBox.Add(lang, 0, wx.ALL, 5)
|
||||
langBox.Add(self.lang, 0, wx.ALL, 5)
|
||||
sizer.Add(langBox, 0, wx.ALL, 5)
|
||||
resulttype = wx.StaticText(panel, -1, _(U"Results type: "))
|
||||
self.resultstype = wx.ComboBox(panel, -1, choices=[_(u"Mixed"), _(u"Recent"), _(u"Popular")], value=_(u"Mixed"), style=wx.CB_READONLY)
|
||||
rBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
rBox.Add(resulttype, 0, wx.ALL, 5)
|
||||
rBox.Add(self.resultstype, 0, wx.ALL, 5)
|
||||
sizer.Add(rBox, 0, wx.ALL, 5)
|
||||
ok = wx.Button(panel, wx.ID_OK, _(u"OK"))
|
||||
ok.SetDefault()
|
||||
cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Close"))
|
||||
@@ -29,4 +48,21 @@ class searchDialog(baseDialog.BaseWXDialog):
|
||||
btnsizer.Add(cancel, 0, wx.ALL, 5)
|
||||
sizer.Add(btnsizer, 0, wx.ALL, 5)
|
||||
panel.SetSizer(sizer)
|
||||
self.SetClientSize(sizer.CalcMin())
|
||||
self.SetClientSize(sizer.CalcMin())
|
||||
|
||||
def get_language(self):
|
||||
return [x[0] for x in translator.translator.available_languages()][self.lang.GetSelection()]
|
||||
|
||||
def get_result_type(self):
|
||||
r = self.resultstype.GetValue()
|
||||
if r == _(u"Mixed"): return "mixed"
|
||||
elif r == _(u"Recent"): return "recent"
|
||||
elif r == _(u"Popular"): return "popular"
|
||||
|
||||
def hide_advanced_search(self, *args, **kwargs):
|
||||
self.lang.Hide()
|
||||
self.resultstype.Hide()
|
||||
|
||||
def show_advanced_search(self, *args, **kwargs):
|
||||
self.lang.Show()
|
||||
self.resultstype.Show()
|
||||
|
@@ -18,11 +18,15 @@ class selectUserDialog(wx.Dialog):
|
||||
label2 = wx.StaticText(panel, -1, _(u"Buffer type"))
|
||||
self.tweets = wx.RadioButton(panel, -1, _(u"Tweets"), style=wx.RB_GROUP)
|
||||
self.favourites = wx.RadioButton(panel, -1, _(u"Likes"))
|
||||
self.followers = wx.RadioButton(panel, -1, _(u"Followers"))
|
||||
self.friends = wx.RadioButton(panel, -1, _(u"Friends"))
|
||||
self.setup_default(default)
|
||||
hSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
hSizer.Add(label2, 0, wx.ALL, 5)
|
||||
actionSizer.Add(self.tweets, 0, wx.ALL, 5)
|
||||
actionSizer.Add(self.favourites, 0, wx.ALL, 5)
|
||||
actionSizer.Add(self.followers, 0, wx.ALL, 5)
|
||||
actionSizer.Add(self.friends, 0, wx.ALL, 5)
|
||||
hSizer.Add(actionSizer, 0, wx.ALL, 5)
|
||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
||||
ok = wx.Button(panel, wx.ID_OK, _(u"OK"))
|
||||
@@ -39,6 +43,8 @@ class selectUserDialog(wx.Dialog):
|
||||
def get_action(self):
|
||||
if self.tweets.GetValue() == True: return "tweets"
|
||||
elif self.favourites.GetValue() == True: return "favourites"
|
||||
elif self.followers.GetValue() == True: return "followers"
|
||||
elif self.friends.GetValue() == True: return "friends"
|
||||
|
||||
def setup_default(self, default):
|
||||
if default == "tweets":
|
||||
|
@@ -47,6 +47,7 @@ class mainFrame(wx.Frame):
|
||||
|
||||
# buffer menu
|
||||
buffer = wx.Menu()
|
||||
self.update_buffer = buffer.Append(wx.NewId(), _(u"&Update buffer"))
|
||||
self.trends = buffer.Append(wx.NewId(), _(u"New &trending topics buffer..."))
|
||||
self.find = buffer.Append(wx.NewId(), _(u"Find a string in the currently focused buffer..."))
|
||||
self.load_previous_items = buffer.Append(wx.NewId(), _(u"&Load previous items"))
|
||||
@@ -61,7 +62,6 @@ class mainFrame(wx.Frame):
|
||||
self.doc = help.Append(-1, _(u"&Documentation"))
|
||||
self.sounds_tutorial = help.Append(wx.NewId(), _(u"Sounds &tutorial"))
|
||||
self.changelog = help.Append(wx.NewId(), _(u"&What's new in this version?"))
|
||||
self.changelog.Enable(False)
|
||||
self.check_for_updates = help.Append(wx.NewId(), _(u"&Check for updates"))
|
||||
self.reportError = help.Append(wx.NewId(), _(u"&Report an error"))
|
||||
self.visit_website = help.Append(-1, _(u"{0}'s &website").format(application.name,))
|
||||
|
Submodule windows-dependencies updated: 571c37bbc1...a8a89ce8c2
Reference in New Issue
Block a user