mirror of
https://github.com/MCV-Software/TWBlue.git
synced 2025-08-26 18:09:21 +00:00
Compare commits
250 Commits
snapshot9.
...
v0.84
Author | SHA1 | Date | |
---|---|---|---|
14b2189840 | |||
16a94aded1 | |||
![]() |
d352aaeaac | ||
![]() |
9250aad80b | ||
![]() |
6e9be63029 | ||
92d8c7257e | |||
![]() |
6a265f0203 | ||
![]() |
b30a0ac25b | ||
![]() |
212f49df08 | ||
2c58645e02 | |||
e11a727a77 | |||
![]() |
d2123fdab7 | ||
45263732b8 | |||
d50e8e2798 | |||
![]() |
990ddf64f5 | ||
ff529eacb4 | |||
![]() |
238607bbe7 | ||
0aa51d9529 | |||
3815ce0a67 | |||
5e91808b73 | |||
08259cdf16 | |||
0bbb3afde0 | |||
3c0110528f | |||
18b52e8909 | |||
037cfec91a | |||
695b35031e | |||
f9d869e824 | |||
c1c001ad96 | |||
d768afc329 | |||
![]() |
4186f1a3e6 | ||
![]() |
2eac158a39 | ||
1ee629d731 | |||
5590ab47ee | |||
b555ed736c | |||
da39f40048 | |||
b1cf1c5590 | |||
48232a6cf8 | |||
3bc92af55f | |||
![]() |
5e9218b072 | ||
![]() |
65f860ceef | ||
![]() |
b9b8145bca | ||
![]() |
7fab6bcf54 | ||
![]() |
7ad5e6fa37 | ||
![]() |
f6fec67d52 | ||
![]() |
b3cac85c4e | ||
![]() |
ff49bd2488 | ||
![]() |
45f23a4c8a | ||
![]() |
a67a5e6264 | ||
8988d63f33 | |||
2268619101 | |||
a312b7f63c | |||
92d803717f | |||
2124f6c60b | |||
29c87dbd3f | |||
1ea3c5d23b | |||
![]() |
547f9393b9 | ||
![]() |
16b34c827b | ||
![]() |
56f0f37f39 | ||
3e9143d607 | |||
da07859138 | |||
dfc2b605f5 | |||
8badd3987a | |||
7139a2bcb3 | |||
c4e2c3b57a | |||
ed95270d3b | |||
edd45a1adf | |||
f24d5fec4e | |||
a9b47bb1a4 | |||
8849ce9039 | |||
![]() |
8b4f16ef84 | ||
dbbe6c0600 | |||
3caef5fc81 | |||
7cd58708cc | |||
0814af3bf4 | |||
72ba5a74f5 | |||
cbc301141e | |||
f466516289 | |||
4eef236b1c | |||
![]() |
ce00083aa2 | ||
![]() |
f92e05ce72 | ||
c02a11f269 | |||
![]() |
c79e659b74 | ||
da8009aea0 | |||
2778d2e85d | |||
ce9a50903c | |||
9a7d39c125 | |||
89759e7d49 | |||
7ca9d42f5f | |||
![]() |
6a6bec880c | ||
7b22c7d0f8 | |||
058866831b | |||
229f698e72 | |||
32067d3171 | |||
a8f7477a1f | |||
9b6461e34e | |||
eed3f81cb8 | |||
e605c750b1 | |||
f49be6cfed | |||
696faed007 | |||
![]() |
70169a2a4a | ||
![]() |
46b46c4d6d | ||
![]() |
0875b7ef92 | ||
![]() |
9cdccca5ff | ||
![]() |
e3e4fa42db | ||
![]() |
6e0c6de0af | ||
![]() |
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 | ||
333158a7be | |||
f24c0955ce | |||
67412125df | |||
f8e14d7040 | |||
4532cf867a | |||
79d2f70be9 | |||
b4eb11a6de | |||
45f663a462 | |||
5b8ce7757c | |||
e47e0ba3f5 | |||
105debe4da | |||
a053788cce | |||
6d578d5203 | |||
21aacfc2af | |||
93dc3ad646 | |||
8e67ed025c | |||
fa1b8bfde3 | |||
7dfe2cbb5c | |||
880c421f3e | |||
e1b8d49af5 | |||
e1d14b8c27 | |||
594b0cd546 | |||
fe9f724673 | |||
6a4a3cc94e | |||
![]() |
af41dcfc4e | ||
31611d8429 | |||
7ed44c839e | |||
503c65692d | |||
f76b86b24d | |||
1f96e71b63 | |||
![]() |
cc249fe1a7 | ||
![]() |
268bd35f3a | ||
![]() |
0307c0abe3 | ||
![]() |
adf062f654 | ||
70b5f25cf0 | |||
2b65b89afb | |||
44e8ed6456 | |||
792655e299 | |||
0f56d8cdd4 | |||
6c47dd2fa9 | |||
![]() |
49073bc151 | ||
![]() |
336acd9860 | ||
4daeeb7beb | |||
408ff50404 | |||
148c5176c6 | |||
bdb9de863f | |||
ce1f8b2cc3 | |||
5933323beb | |||
22b1b0a149 | |||
e71afeb10f | |||
98f026156d | |||
cbee57aa30 | |||
fd9e4dc05d | |||
6022cecad1 | |||
89e39e2168 | |||
a69bf99c1a | |||
d34ef81324 | |||
a3c050195a | |||
3623eafacd | |||
![]() |
2bd3f0a1d1 | ||
f1f828522e | |||
51e4898346 | |||
c4478198b6 | |||
f468924b85 | |||
158b48e4d5 | |||
756a58e443 | |||
85ce5b0791 | |||
![]() |
e534d1cd20 | ||
2d35304ef0 | |||
4f0e6d758b | |||
bd4aa89c2b | |||
b046360293 | |||
6971fb3999 | |||
7b840f29c4 | |||
71fed7300b | |||
57315c3b6e | |||
3d3abc90e1 | |||
de7882e4cf | |||
![]() |
10190d61c0 | ||
bb6fa7cb46 | |||
80cb70c9a6 | |||
77d51aa51a | |||
![]() |
ebb4e22d02 | ||
4344a0df0c | |||
34ad0c5e47 | |||
704ade560a | |||
a4892cf847 | |||
e59661775a | |||
53a9f04155 | |||
100f483a86 | |||
bad468560a | |||
eb0cf62a54 | |||
a016932ac7 | |||
1706414171 | |||
5f963aa66b | |||
25578e4fc6 | |||
faec92ce6c | |||
313e725ff2 | |||
3f82a51ef9 | |||
d26ab9b910 | |||
aa42e056c0 | |||
fa6592ed1a | |||
11b06accbb | |||
![]() |
915eb5802f | ||
![]() |
4e943c7bee | ||
![]() |
692d75562e | ||
4cce6d4318 | |||
e55e15466d | |||
370340de0b | |||
10bc483887 | |||
f66b2ccbad | |||
6460c20a97 | |||
9f2c240fc1 | |||
a4cbbfcb9f |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -17,3 +17,4 @@ src/Microsoft.VC90.MFC
|
|||||||
src/launcher.bat
|
src/launcher.bat
|
||||||
src/sounds/iOs
|
src/sounds/iOs
|
||||||
release-snapshot/
|
release-snapshot/
|
||||||
|
src/com_cache/
|
6
COPYING
Normal file
6
COPYING
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Tw Blue is free software, licensed under the GNU GPL license, either version 2 or, at your option, any later version. You can view the license in the file named license.txt, or online at http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
|
||||||
|
Copyright © 2013-2015. Manuel Cortéz
|
||||||
|
|
||||||
|
Documentation is written by Sukil Etxenike, Brian Hartgen and Bill Dengler, covered by the Creative Commons Attribution-NonCommercial-ShareAlike 2.5 license. You can read the license at https://creativecommons.org/licenses/by-nc-sa/2.5/
|
||||||
|
|
||||||
|
The accessible_output2, audio_services, keyboard_handler, libloader, platform_utils and sound_lib modules are written by Christofer Toth and modified by the TWBlue Team, released under a MIT license. You can get the original modules at http://hg.q-continuum.net.
|
67
README.md
67
README.md
@@ -1,13 +1,12 @@
|
|||||||
TWBlue -
|
TWBlue -
|
||||||
======
|
======
|
||||||
|
|
||||||
Copyright (C) 2015. [Technow S.L.](https://www.technow.es)
|
Copyright (C) 2016. [Technow S.L.](https://www.technow.es)
|
||||||
|
|
||||||
TW Blue is an app designed to use Twitter simply and efficiently while using minimal system resources.
|
TW Blue is an app designed to use Twitter simply and efficiently while using minimal system resources.
|
||||||
With this app you’ll have access to twitter features such as:
|
With this app you’ll have access to twitter features such as:
|
||||||
|
|
||||||
* Create, reply to, retweet and delete tweets,
|
* Create, reply to, like, retweet and delete tweets,
|
||||||
* Add and remove tweets from favourites,
|
|
||||||
* Send and delete direct messages,
|
* Send and delete direct messages,
|
||||||
* See your friends and followers,
|
* See your friends and followers,
|
||||||
* Follow, unfollow, block and report users as spam,
|
* Follow, unfollow, block and report users as spam,
|
||||||
@@ -18,9 +17,9 @@ With this app you’ll have access to twitter features such as:
|
|||||||
|
|
||||||
See [TWBlue's webpage](http://twblue.es) for more details.
|
See [TWBlue's webpage](http://twblue.es) for more details.
|
||||||
|
|
||||||
## Using TWBlue from sources
|
## Running TWBlue from source
|
||||||
|
|
||||||
This document describes how to run tw blue from source, and, after that, how to build a binary version, which doesn't need Python and the other dependencies to run.
|
This document describes how to run tw blue from source and how to build a binary version which doesn't need Python and the other dependencies to run.
|
||||||
|
|
||||||
### Required dependencies.
|
### Required dependencies.
|
||||||
|
|
||||||
@@ -32,12 +31,10 @@ Although most dependencies can be found in the windows-dependencies directory, w
|
|||||||
|
|
||||||
#### Dependencies packaged in windows installers
|
#### 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.
|
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
|
* [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
|
* [Python windows extensions (pywin32)](http://www.sourceforge.net/projects/pywin32/) for python 2.7, build 220
|
||||||
* [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
|
|
||||||
* [PyEnchant,](http://pythonhosted.org/pyenchant/) version 1.6.6.
|
* [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
|
x64 version has been built by TWBlue developers, so you only will find it in windows-dependencies folder
|
||||||
|
|
||||||
@@ -49,7 +46,7 @@ To build a binary version:
|
|||||||
|
|
||||||
#### Dependencies that must be installed using easy_install
|
#### Dependencies that must be installed using easy_install
|
||||||
|
|
||||||
setuptools install a script, called easy_install. You can find it in the python scripts directory. To install packages using easy_install, you have to navigate to the scripts directory using a command prompt, for example:
|
setuptools installs a script, called easy_install. You can find it in the python scripts directory. To install packages using easy_install, you have to navigate to the scripts directory using a command prompt, for example:
|
||||||
|
|
||||||
cd C:\python27x64\scripts
|
cd C:\python27x64\scripts
|
||||||
|
|
||||||
@@ -65,14 +62,18 @@ setuptools install a script, called easy_install. You can find it in the python
|
|||||||
* pypubsub
|
* pypubsub
|
||||||
* configobj
|
* configobj
|
||||||
* requests-oauthlib
|
* requests-oauthlib
|
||||||
|
* requests-toolbelt
|
||||||
* future
|
* future
|
||||||
* pygeocoder
|
* pygeocoder
|
||||||
* suds
|
* suds
|
||||||
* arrow
|
* arrow==0.6
|
||||||
* goslate
|
|
||||||
* markdown
|
* markdown
|
||||||
|
* winpaths
|
||||||
|
* microsofttranslator
|
||||||
|
|
||||||
easy_install will automatically get the additional libraries that these packages need to work properly.
|
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 suds requests oauthlib requests-oauthlib requests-toolbelt pypubsub pygeocoder arrow==0.6 python-dateutil futures markdown microsofttranslator winpaths
|
||||||
|
|
||||||
#### Other dependencies
|
#### Other dependencies
|
||||||
|
|
||||||
@@ -87,6 +88,14 @@ 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
|
* [NSIS unicode,](http://www.scratchpaper.com/) version 2.46.5
|
||||||
|
|
||||||
|
#### Dependencies required to build the portableApps.com format archive
|
||||||
|
|
||||||
|
* [NSIS Unicode Portable,](http://portableapps.com/apps/development/nsis_portable) version 2.46.5 rev 3
|
||||||
|
* [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.1.3
|
||||||
|
|
||||||
|
Important! Install these 3 apps into the same folder, otherwise you won't be able to build the pa.c version. For example: D:\portableApps\NSISPortable, D:\PortableApps\PortableApps.com installer, ...
|
||||||
|
|
||||||
### Running TW Blue from source
|
### 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:
|
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:
|
||||||
@@ -95,9 +104,16 @@ Now that you have installed all these packages, you can run TW Blue from source
|
|||||||
|
|
||||||
If necessary, change the first part of the command to reflect the location of your python executable. You can run TW Blue using python x86 and x64
|
If necessary, change the first part of the command to reflect the location of your python executable. You can run TW Blue using python x86 and x64
|
||||||
|
|
||||||
|
### Generating the documentation
|
||||||
|
|
||||||
|
To generate the documentation in html format, navigate to the doc folder inside this repo. After that, run this command:
|
||||||
|
python generator.py
|
||||||
|
The documentation will be generated, placing each language in a separate folder in the doc directory. Move these folders (for example de, en, es, fr, it, ...) to src/documentation, creating the directory if necesary.
|
||||||
|
Also, copy the license.txt located in the root of the repo to the documentation folder.
|
||||||
|
|
||||||
### Building a binary version
|
### Building a binary version
|
||||||
|
|
||||||
A binary version doesn't need python and the other dependencies to run, it's the same version that you will find on the TW Blue website if you download the zip files.
|
A binary version doesn't need python and the other dependencies to run, it's the same version that you will find on the TW Blue website if you download the zip files or the snapshot versions.
|
||||||
|
|
||||||
To build it, run the following command from the src folder:
|
To build it, run the following command from the src folder:
|
||||||
|
|
||||||
@@ -105,6 +121,29 @@ To build it, run the following command from the src folder:
|
|||||||
|
|
||||||
You will find the binaries in the dist directory.
|
You will find the binaries in the dist directory.
|
||||||
|
|
||||||
|
### Building an installer
|
||||||
|
|
||||||
|
If you want to install TWBlue on your computer, you must create the installer first. 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 scripts 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 scripts folder, and rename it to twblue64
|
||||||
|
* Go to the scripts folder, right click on the twblue.nsi file, and choose compyle unicode NSIS script
|
||||||
|
* This may take a while. After the process, you will find the installer in the scripts folder
|
||||||
|
|
||||||
### How to generate a translation template
|
### 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.
|
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 on 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.
|
||||||
|
|
||||||
|
@@ -34,3 +34,12 @@ Holly Scott-Gardner
|
|||||||
Anibal Hernández
|
Anibal Hernández
|
||||||
Sussan Leiva
|
Sussan Leiva
|
||||||
Brian Hartgen
|
Brian Hartgen
|
||||||
|
PEDRO REINA COLOBON
|
||||||
|
Moora-Moora Arrilla
|
||||||
|
Blake Oliver
|
||||||
|
Steffen Schultz
|
||||||
|
Riku
|
||||||
|
Burak Yüksek
|
||||||
|
florian Ionașcu
|
||||||
|
Christian Leo Mameli
|
||||||
|
Natalia Hedlund (Наталья Хедлунд)
|
@@ -2,6 +2,17 @@
|
|||||||
name = 'TWBlue'
|
name = 'TWBlue'
|
||||||
snapshot = False
|
snapshot = False
|
||||||
if snapshot == False:
|
if snapshot == False:
|
||||||
version = "0.80"
|
version = "0.84"
|
||||||
|
update_url = 'http://twblue.es/updates/twblue_ngen.json'
|
||||||
|
mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/stable.json'
|
||||||
else:
|
else:
|
||||||
version = "7"
|
version = "10.99"
|
||||||
|
update_url = 'http://twblue.es/updates/snapshots_ngen.json'
|
||||||
|
mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/snapshots.json'
|
||||||
|
author = u"Manuel Cortéz"
|
||||||
|
authorEmail = "manuel@manuelcortez.net"
|
||||||
|
copyright = u"Copyright (C) 2015, Technow S.L. \nCopyright (C) 2013-2015, Manuel cortéz."
|
||||||
|
description = unicode(name+" is an app designed to use Twitter simply and efficiently while using minimal system resources. This app provides access to most Twitter features.")
|
||||||
|
translators = [u"Bryner Villalobos, Bill Dengler (English)", u"Mohammed Al Shara (Arabic)", u"Joan Rabat, Juan Carlos Rivilla (Catalan)", u"Manuel cortéz (Spanish)", u"Sukil Etxenike Arizaleta (Basque)", u"Jani Kinnunen (finnish)", u"Rémy Ruiz (French)", u"Juan Buño (Galician)", u"Steffen Schultz (German)", u"Robert Osztolykan (Hungarian)", u"Paweł Masarczyk (Polish)", u"Odenilton Júnior Santos (Portuguese)", u"Alexander Jaszyn (Russian)", u"Burak (Turkish)"]
|
||||||
|
url = u"http://twblue.es"
|
||||||
|
report_bugs_url = "http://twblue.es/bugs/api/soap/mantisconnect.php?wsdl"
|
@@ -7,7 +7,7 @@ languageHandler.setLanguage("en")
|
|||||||
import strings
|
import strings
|
||||||
|
|
||||||
# the list of supported language codes of TW Blue
|
# the list of supported language codes of TW Blue
|
||||||
languages = ["en", "es", "fr", "de", "it"]
|
languages = ["en", "es", "fr", "de", "it", "gl", "ja", "ru", "ro"]
|
||||||
#"eu", "ar", "ca", "es", "fi", "fr", "gl", "hu", "it", "pl", "pt", "ru", "tr"]
|
#"eu", "ar", "ca", "es", "fi", "fr", "gl", "hu", "it", "pl", "pt", "ru", "tr"]
|
||||||
|
|
||||||
def generate_document(language):
|
def generate_document(language):
|
||||||
|
Binary file not shown.
@@ -5,8 +5,8 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: TWBlue Documentation\n"
|
"Project-Id-Version: TWBlue Documentation\n"
|
||||||
"POT-Creation-Date: 2015-07-03 17:23+Hora de verano central (Mxico)\n"
|
"POT-Creation-Date: 2016-03-31 16:51+Hora de verano romance\n"
|
||||||
"PO-Revision-Date: 2015-07-07 19:07+0200\n"
|
"PO-Revision-Date: 2016-07-31 18:23+0200\n"
|
||||||
"Last-Translator: Steffen Schultz <schulle3o@yahoo.de>\n"
|
"Last-Translator: Steffen Schultz <schulle3o@yahoo.de>\n"
|
||||||
"Language-Team: Steffen Schultz <schulle3o@yahoo.de>\n"
|
"Language-Team: Steffen Schultz <schulle3o@yahoo.de>\n"
|
||||||
"Language: de\n"
|
"Language: de\n"
|
||||||
@@ -14,7 +14,7 @@ msgstr ""
|
|||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Generated-By: pygettext.py 1.5\n"
|
"Generated-By: pygettext.py 1.5\n"
|
||||||
"X-Generator: Poedit 1.8.2\n"
|
"X-Generator: Poedit 1.8.8\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
#: ../doc\languageHandler.py:97
|
#: ../doc\languageHandler.py:97
|
||||||
@@ -53,7 +53,7 @@ msgstr "Dokumentation für TWBlue - {0}"
|
|||||||
#: ../doc\strings.py:378 ../doc\strings.py:381 ../doc\strings.py:384
|
#: ../doc\strings.py:378 ../doc\strings.py:381 ../doc\strings.py:384
|
||||||
#: ../doc\strings.py:387 ../doc\strings.py:390 ../doc\strings.py:393
|
#: ../doc\strings.py:387 ../doc\strings.py:390 ../doc\strings.py:393
|
||||||
#: ../doc\strings.py:396 ../doc\strings.py:399 ../doc\strings.py:402
|
#: ../doc\strings.py:396 ../doc\strings.py:399 ../doc\strings.py:402
|
||||||
#: ../doc\strings.py:405 ../doc\strings.py:421 ../doc\strings.py:424
|
#: ../doc\strings.py:405 ../doc\strings.py:426 ../doc\strings.py:429
|
||||||
msgid "\n"
|
msgid "\n"
|
||||||
msgstr "\n"
|
msgstr "\n"
|
||||||
|
|
||||||
@@ -741,7 +741,7 @@ msgstr "* Globale Einstellungen: Konfiguriert programmweite Einstellungen."
|
|||||||
|
|
||||||
#: ../doc\strings.py:166
|
#: ../doc\strings.py:166
|
||||||
msgid ""
|
msgid ""
|
||||||
"* Quit: asks whether you want to exit the program. If the answer is yes, it "
|
"* Exit: asks whether you want to exit the program. If the answer is yes, it "
|
||||||
"closes the application. If you do not want to be asked for confirmation "
|
"closes the application. If you do not want to be asked for confirmation "
|
||||||
"before exiting, uncheck the checkbox from the global settings dialogue box."
|
"before exiting, uncheck the checkbox from the global settings dialogue box."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1757,8 +1757,8 @@ msgstr ""
|
|||||||
"Dengler](https://twitter.com/codeofdusk)."
|
"Dengler](https://twitter.com/codeofdusk)."
|
||||||
|
|
||||||
#: ../doc\strings.py:408
|
#: ../doc\strings.py:408
|
||||||
msgid "* Arabic: Mohammed Al Shara."
|
msgid "* Arabic: [Mohammed Al Shara](https://twitter.com/mohammed0204)."
|
||||||
msgstr "* Arabisch: Mohammed Al Shara."
|
msgstr "* Arabisch: [Mohammed Al Shara](https://twitter.com/mohammed0204)."
|
||||||
|
|
||||||
#: ../doc\strings.py:409
|
#: ../doc\strings.py:409
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -1777,42 +1777,66 @@ msgid "* Basque: [Sukil Etxenike](https://twitter.com/sukil2011)."
|
|||||||
msgstr "* Baskisch: [Sukil Etxenike](https://twitter.com/sukil2011)."
|
msgstr "* Baskisch: [Sukil Etxenike](https://twitter.com/sukil2011)."
|
||||||
|
|
||||||
#: ../doc\strings.py:412
|
#: ../doc\strings.py:412
|
||||||
msgid "* Finnish: Jani Kinnunen."
|
msgid "* Finnish: [Jani Kinnunen](https://twitter.com/jani_kinnunen)."
|
||||||
msgstr "* Finnisch: Jani Kinnunen."
|
msgstr "* Finnisch: [Jani Kinnunen](https://twitter.com/jani_kinnunen)."
|
||||||
|
|
||||||
#: ../doc\strings.py:413
|
#: ../doc\strings.py:413
|
||||||
msgid "* French: Rémi Ruiz."
|
msgid "* French: [Rémi Ruiz](https://twitter.com/blindhelp38)."
|
||||||
msgstr "* Französisch: Rémi Ruiz."
|
msgstr "* Französisch: [Rémi Ruiz](https://twitter.com/blindhelp38)."
|
||||||
|
|
||||||
#: ../doc\strings.py:414
|
#: ../doc\strings.py:414
|
||||||
msgid "* Galician: [Alba Kinteiro](https://twitter.com/albasmileforeve)."
|
msgid "* Galician: [Juan Buño](https://twitter.com/Quetzatl_)."
|
||||||
msgstr "* Galizisch: [Alba Kinteiro](https://twitter.com/albasmileforeve)."
|
msgstr "* Galizisch: [Juan Buño](https://twitter.com/Quetzatl_)."
|
||||||
|
|
||||||
#: ../doc\strings.py:415
|
#: ../doc\strings.py:415
|
||||||
msgid "* German: Steffen Schultz."
|
msgid "* German: [Steffen Schultz](https://twitter.com/schulle4u)."
|
||||||
msgstr "* Deutsch: [Steffen Schultz](https://twitter.com/schulle4u)."
|
msgstr "* Deutsch: [Steffen Schultz](https://twitter.com/schulle4u)."
|
||||||
|
|
||||||
#: ../doc\strings.py:416
|
#: ../doc\strings.py:416
|
||||||
|
msgid "* Croatian: [Zvonimir Stanečić](https://twitter.com/zvonimirek222)."
|
||||||
|
msgstr "* Kroatisch: [Zvonimir Stanečić](https://twitter.com/zvonimirek222)."
|
||||||
|
|
||||||
|
#: ../doc\strings.py:417
|
||||||
msgid "* Hungarian: Robert Osztolykan."
|
msgid "* Hungarian: Robert Osztolykan."
|
||||||
msgstr "* Ungarisch: Robert Osztolykan."
|
msgstr "* Ungarisch: Robert Osztolykan."
|
||||||
|
|
||||||
#: ../doc\strings.py:417
|
|
||||||
msgid "* Polish: Pawel Masarczyk."
|
|
||||||
msgstr "* Polnisch: Pawel Masarczyk."
|
|
||||||
|
|
||||||
#: ../doc\strings.py:418
|
#: ../doc\strings.py:418
|
||||||
msgid "* Portuguese: Odenilton Júnior Santos."
|
msgid "* Italian: [Christian Leo Mameli](https://twitter.com/llajta2012)."
|
||||||
msgstr "* Portugiesisch: Odenilton Júnior Santos."
|
msgstr "* Italienisch: [Christian Leo Mameli](https://twitter.com/llajta2012)."
|
||||||
|
|
||||||
#: ../doc\strings.py:419
|
#: ../doc\strings.py:419
|
||||||
msgid "* Russian: Alexander Jaszyn."
|
msgid "* Japanese: [Riku](https://twitter.com/riku_sub001)"
|
||||||
msgstr "* Russisch: Alexander Jaszyn."
|
msgstr "* Japanisch: [Riku](https://twitter.com/riku_sub001)"
|
||||||
|
|
||||||
#: ../doc\strings.py:420
|
#: ../doc\strings.py:420
|
||||||
msgid "* Turkish: Burak."
|
msgid "* Polish: [Pawel Masarczyk.](https://twitter.com/Piciok)"
|
||||||
msgstr "* Türkisch: Burak."
|
msgstr "* Polnisch: [Pawel Masarczyk.](https://twitter.com/Piciok)"
|
||||||
|
|
||||||
|
#: ../doc\strings.py:421
|
||||||
|
msgid "* Portuguese: Odenilton Júnior Santos."
|
||||||
|
msgstr "* Portuguese: Odenilton Júnior Santos."
|
||||||
|
|
||||||
|
#: ../doc\strings.py:422
|
||||||
|
msgid ""
|
||||||
|
"* Romanian: [Florian Ionașcu](https://twitter.com/7ro) and [Răzvan Ciule]"
|
||||||
|
"(https://twitter.com/pilgrim89)"
|
||||||
|
msgstr ""
|
||||||
|
"* Rumänisch: [Florian Ionașcu](https://twitter.com/7ro) and [Răzvan Ciule]"
|
||||||
|
"(https://twitter.com/pilgrim89)"
|
||||||
|
|
||||||
#: ../doc\strings.py:423
|
#: ../doc\strings.py:423
|
||||||
|
msgid "* Russian: [Александр Яшин](https://twitter.com/radovest)."
|
||||||
|
msgstr "* Russisch: [Александр Яшин](https://twitter.com/radovest)."
|
||||||
|
|
||||||
|
#: ../doc\strings.py:424
|
||||||
|
msgid "* Serbian: [Aleksandar Đurić](https://twitter.com/sokodtreshnje)"
|
||||||
|
msgstr "* Serbisch: [Aleksandar Đurić](https://twitter.com/sokodtreshnje)"
|
||||||
|
|
||||||
|
#: ../doc\strings.py:425
|
||||||
|
msgid "* Turkish: [Burak Yüksek](https://twitter.com/burakyuksek)."
|
||||||
|
msgstr "* Türkisch: [Burak Yüksek](https://twitter.com/burakyuksek)."
|
||||||
|
|
||||||
|
#: ../doc\strings.py:428
|
||||||
msgid ""
|
msgid ""
|
||||||
"Many thanks also to the people who worked on the documentation. Initially, "
|
"Many thanks also to the people who worked on the documentation. Initially, "
|
||||||
"[Manuel Cortez](https://twitter.com/manuelcortez00) did the documentation in "
|
"[Manuel Cortez](https://twitter.com/manuelcortez00) did the documentation in "
|
||||||
@@ -1834,10 +1858,32 @@ msgstr ""
|
|||||||
"und erhielt weitere Korrekturen durch [Brian Hartgen](https://twitter.com/"
|
"und erhielt weitere Korrekturen durch [Brian Hartgen](https://twitter.com/"
|
||||||
"brianhartgen) und [Bill Dengler](https://twitter.com/codeofdusk)."
|
"brianhartgen) und [Bill Dengler](https://twitter.com/codeofdusk)."
|
||||||
|
|
||||||
#: ../doc\strings.py:426
|
#: ../doc\strings.py:431
|
||||||
msgid "---"
|
msgid "---"
|
||||||
msgstr "---"
|
msgstr "---"
|
||||||
|
|
||||||
#: ../doc\strings.py:427
|
#: ../doc\strings.py:432
|
||||||
msgid "Copyright © 2013-2015. Manuel Cortéz"
|
msgid "Copyright © 2013-2015. Manuel Cortéz"
|
||||||
msgstr "Copyright © 2013-2015. Manuel Cortéz"
|
msgstr "Copyright © 2013-2015. Manuel Cortéz"
|
||||||
|
|
||||||
|
#~ msgid "* Polish: Pawel Masarczyk."
|
||||||
|
#~ msgstr "* Polnisch: Pawel Masarczyk."
|
||||||
|
|
||||||
|
#~ msgid "* Arabic: Mohammed Al Shara."
|
||||||
|
#~ msgstr "* Arabisch: Mohammed Al Shara."
|
||||||
|
|
||||||
|
#~ msgid "* Finnish: Jani Kinnunen."
|
||||||
|
#~ msgstr "* Finnisch: Jani Kinnunen."
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
#~ msgid "* French: Rémi Ruiz."
|
||||||
|
#~ msgstr "* Französisch: R\\303\\251mi Ruiz."
|
||||||
|
|
||||||
|
#~ msgid "* German: Steffen Schultz."
|
||||||
|
#~ msgstr "* Deutsch: [Steffen Schultz](https://twitter.com/schulle4u)."
|
||||||
|
|
||||||
|
#~ msgid "* Russian: Alexander Jaszyn."
|
||||||
|
#~ msgstr "* Russisch: Alexander Jaszyn."
|
||||||
|
|
||||||
|
#~ msgid "* Turkish: Burak."
|
||||||
|
#~ msgstr "* Türkisch: Burak."
|
||||||
|
Binary file not shown.
@@ -5,8 +5,8 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: twblue-documentation 0.46\n"
|
"Project-Id-Version: twblue-documentation 0.46\n"
|
||||||
"POT-Creation-Date: 2015-07-03 17:23+Hora de verano central (México)\n"
|
"POT-Creation-Date: 2016-03-31 16:51+Hora de verano romance\n"
|
||||||
"PO-Revision-Date: 2015-07-03 17:49-0600\n"
|
"PO-Revision-Date: 2016-07-31 18:23+0200\n"
|
||||||
"Last-Translator: Manuel Cortéz <manuel@manuelcortez.net>\n"
|
"Last-Translator: Manuel Cortéz <manuel@manuelcortez.net>\n"
|
||||||
"Language-Team: Spanish <manuel@manuelcortez.net>\n"
|
"Language-Team: Spanish <manuel@manuelcortez.net>\n"
|
||||||
"Language: es\n"
|
"Language: es\n"
|
||||||
@@ -14,7 +14,7 @@ msgstr ""
|
|||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Generated-By: pygettext.py 1.5\n"
|
"Generated-By: pygettext.py 1.5\n"
|
||||||
"X-Generator: Poedit 1.6.7\n"
|
"X-Generator: Poedit 1.8.8\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
"X-Poedit-SourceCharset: UTF-8\n"
|
"X-Poedit-SourceCharset: UTF-8\n"
|
||||||
|
|
||||||
@@ -54,7 +54,7 @@ msgstr "Documentación para TWBlue {0}"
|
|||||||
#: ../doc\strings.py:378 ../doc\strings.py:381 ../doc\strings.py:384
|
#: ../doc\strings.py:378 ../doc\strings.py:381 ../doc\strings.py:384
|
||||||
#: ../doc\strings.py:387 ../doc\strings.py:390 ../doc\strings.py:393
|
#: ../doc\strings.py:387 ../doc\strings.py:390 ../doc\strings.py:393
|
||||||
#: ../doc\strings.py:396 ../doc\strings.py:399 ../doc\strings.py:402
|
#: ../doc\strings.py:396 ../doc\strings.py:399 ../doc\strings.py:402
|
||||||
#: ../doc\strings.py:405 ../doc\strings.py:421 ../doc\strings.py:424
|
#: ../doc\strings.py:405 ../doc\strings.py:426 ../doc\strings.py:429
|
||||||
msgid "\n"
|
msgid "\n"
|
||||||
msgstr "\n"
|
msgstr "\n"
|
||||||
|
|
||||||
@@ -776,7 +776,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: ../doc\strings.py:166
|
#: ../doc\strings.py:166
|
||||||
msgid ""
|
msgid ""
|
||||||
"* Quit: asks whether you want to exit the program. If the answer is yes, it "
|
"* Exit: asks whether you want to exit the program. If the answer is yes, it "
|
||||||
"closes the application. If you do not want to be asked for confirmation "
|
"closes the application. If you do not want to be asked for confirmation "
|
||||||
"before exiting, uncheck the checkbox from the global settings dialogue box."
|
"before exiting, uncheck the checkbox from the global settings dialogue box."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1822,8 +1822,8 @@ msgstr ""
|
|||||||
"Dengler](https://twitter.com/codeofdusk)."
|
"Dengler](https://twitter.com/codeofdusk)."
|
||||||
|
|
||||||
#: ../doc\strings.py:408
|
#: ../doc\strings.py:408
|
||||||
msgid "* Arabic: Mohammed Al Shara."
|
msgid "* Arabic: [Mohammed Al Shara](https://twitter.com/mohammed0204)."
|
||||||
msgstr "* Árabe: Mohammed Al Shara."
|
msgstr "* Árabe: [Mohammed Al Shara](https://twitter.com/mohammed0204)."
|
||||||
|
|
||||||
#: ../doc\strings.py:409
|
#: ../doc\strings.py:409
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -1841,42 +1841,66 @@ msgid "* Basque: [Sukil Etxenike](https://twitter.com/sukil2011)."
|
|||||||
msgstr "* Vasco: [Sukil Etxenike](https://twitter.com/sukil2011)."
|
msgstr "* Vasco: [Sukil Etxenike](https://twitter.com/sukil2011)."
|
||||||
|
|
||||||
#: ../doc\strings.py:412
|
#: ../doc\strings.py:412
|
||||||
msgid "* Finnish: Jani Kinnunen."
|
msgid "* Finnish: [Jani Kinnunen](https://twitter.com/jani_kinnunen)."
|
||||||
msgstr "* Finés: Jani Kinnunen."
|
msgstr "* Finés: [Jani Kinnunen](https://twitter.com/jani_kinnunen)."
|
||||||
|
|
||||||
#: ../doc\strings.py:413
|
#: ../doc\strings.py:413
|
||||||
msgid "* French: Rémi Ruiz."
|
msgid "* French: [Rémi Ruiz](https://twitter.com/blindhelp38)."
|
||||||
msgstr "* Francés: Rémy Ruiz."
|
msgstr "* Francés: [Rémi Ruiz](https://twitter.com/blindhelp38)."
|
||||||
|
|
||||||
#: ../doc\strings.py:414
|
#: ../doc\strings.py:414
|
||||||
msgid "* Galician: [Alba Kinteiro](https://twitter.com/albasmileforeve)."
|
msgid "* Galician: [Juan Buño](https://twitter.com/Quetzatl_)."
|
||||||
msgstr "* Gallego: [Alba Kinteiro](https://twitter.com/albasmileforeve)."
|
msgstr "* Gallego: [Juan Buño](https://twitter.com/Quetzatl_)."
|
||||||
|
|
||||||
#: ../doc\strings.py:415
|
#: ../doc\strings.py:415
|
||||||
msgid "* German: Steffen Schultz."
|
msgid "* German: [Steffen Schultz](https://twitter.com/schulle4u)."
|
||||||
msgstr "* Alemán: Steffen Schultz."
|
msgstr "* Alemán: [Steffen Schultz](https://twitter.com/schulle4u)."
|
||||||
|
|
||||||
#: ../doc\strings.py:416
|
#: ../doc\strings.py:416
|
||||||
|
msgid "* Croatian: [Zvonimir Stanečić](https://twitter.com/zvonimirek222)."
|
||||||
|
msgstr "* Croata: [Zvonimir Stanečić](https://twitter.com/zvonimirek222)."
|
||||||
|
|
||||||
|
#: ../doc\strings.py:417
|
||||||
msgid "* Hungarian: Robert Osztolykan."
|
msgid "* Hungarian: Robert Osztolykan."
|
||||||
msgstr "* Húngaro: Robert Osztolykan."
|
msgstr "* Húngaro: Robert Osztolykan."
|
||||||
|
|
||||||
#: ../doc\strings.py:417
|
|
||||||
msgid "* Polish: Pawel Masarczyk."
|
|
||||||
msgstr "* Polaco: Pawel Masarczyk."
|
|
||||||
|
|
||||||
#: ../doc\strings.py:418
|
#: ../doc\strings.py:418
|
||||||
|
msgid "* Italian: [Christian Leo Mameli](https://twitter.com/llajta2012)."
|
||||||
|
msgstr "* Italiano: [Christian Leo Mameli](https://twitter.com/llajta2012)."
|
||||||
|
|
||||||
|
#: ../doc\strings.py:419
|
||||||
|
msgid "* Japanese: [Riku](https://twitter.com/riku_sub001)"
|
||||||
|
msgstr "* Japonés: [Riku](https://twitter.com/riku_sub001)."
|
||||||
|
|
||||||
|
#: ../doc\strings.py:420
|
||||||
|
msgid "* Polish: [Pawel Masarczyk.](https://twitter.com/Piciok)"
|
||||||
|
msgstr "* Polaco: [Pawel Masarczyk.](https://twitter.com/Piciok)"
|
||||||
|
|
||||||
|
#: ../doc\strings.py:421
|
||||||
msgid "* Portuguese: Odenilton Júnior Santos."
|
msgid "* Portuguese: Odenilton Júnior Santos."
|
||||||
msgstr "* Portugués: Odenilton Júnior Santos."
|
msgstr "* Portugués: Odenilton Júnior Santos."
|
||||||
|
|
||||||
#: ../doc\strings.py:419
|
#: ../doc\strings.py:422
|
||||||
msgid "* Russian: Alexander Jaszyn."
|
msgid ""
|
||||||
msgstr "* Ruso: Alexander Jaszyn."
|
"* Romanian: [Florian Ionașcu](https://twitter.com/7ro) and [Răzvan Ciule]"
|
||||||
|
"(https://twitter.com/pilgrim89)"
|
||||||
#: ../doc\strings.py:420
|
msgstr ""
|
||||||
msgid "* Turkish: Burak."
|
"* Rumano: [Florian Ionașcu](https://twitter.com/7ro) y [Răzvan Ciule]"
|
||||||
msgstr "* Turco: Burak."
|
"(https://twitter.com/pilgrim89)"
|
||||||
|
|
||||||
#: ../doc\strings.py:423
|
#: ../doc\strings.py:423
|
||||||
|
msgid "* Russian: [Александр Яшин](https://twitter.com/radovest)."
|
||||||
|
msgstr "* Ruso: [Александр Яшин](https://twitter.com/radovest)."
|
||||||
|
|
||||||
|
#: ../doc\strings.py:424
|
||||||
|
msgid "* Serbian: [Aleksandar Đurić](https://twitter.com/sokodtreshnje)"
|
||||||
|
msgstr "* Serbio: [Aleksandar Đurić](https://twitter.com/sokodtreshnje)"
|
||||||
|
|
||||||
|
#: ../doc\strings.py:425
|
||||||
|
msgid "* Turkish: [Burak Yüksek](https://twitter.com/burakyuksek)."
|
||||||
|
msgstr "* Turco: [Burak Yüksek](https://twitter.com/burakyuksek)."
|
||||||
|
|
||||||
|
#: ../doc\strings.py:428
|
||||||
msgid ""
|
msgid ""
|
||||||
"Many thanks also to the people who worked on the documentation. Initially, "
|
"Many thanks also to the people who worked on the documentation. Initially, "
|
||||||
"[Manuel Cortez](https://twitter.com/manuelcortez00) did the documentation in "
|
"[Manuel Cortez](https://twitter.com/manuelcortez00) did the documentation in "
|
||||||
@@ -1898,14 +1922,35 @@ msgstr ""
|
|||||||
"com/sukil2011), con algunas valiosas correcciones por [Brian Hartgen]"
|
"com/sukil2011), con algunas valiosas correcciones por [Brian Hartgen]"
|
||||||
"(https://twitter.com/brianhartgen)."
|
"(https://twitter.com/brianhartgen)."
|
||||||
|
|
||||||
#: ../doc\strings.py:426
|
#: ../doc\strings.py:431
|
||||||
msgid "---"
|
msgid "---"
|
||||||
msgstr "---"
|
msgstr "---"
|
||||||
|
|
||||||
#: ../doc\strings.py:427
|
#: ../doc\strings.py:432
|
||||||
msgid "Copyright © 2013-2015. Manuel Cortéz"
|
msgid "Copyright © 2013-2015. Manuel Cortéz"
|
||||||
msgstr "Copyright © 2013-2015. Manuel Cortéz"
|
msgstr "Copyright © 2013-2015. Manuel Cortéz"
|
||||||
|
|
||||||
|
#~ msgid "* Polish: Pawel Masarczyk."
|
||||||
|
#~ msgstr "* Polaco: Pawel Masarczyk."
|
||||||
|
|
||||||
|
#~ msgid "* Arabic: Mohammed Al Shara."
|
||||||
|
#~ msgstr "* Árabe: Mohammed Al Shara."
|
||||||
|
|
||||||
|
#~ msgid "* Finnish: Jani Kinnunen."
|
||||||
|
#~ msgstr "* Finés: Jani Kinnunen."
|
||||||
|
|
||||||
|
#~ msgid "* French: Rémi Ruiz."
|
||||||
|
#~ msgstr "* Francés: Rémy Ruiz."
|
||||||
|
|
||||||
|
#~ msgid "* German: Steffen Schultz."
|
||||||
|
#~ msgstr "* Alemán: Steffen Schultz."
|
||||||
|
|
||||||
|
#~ msgid "* Russian: Alexander Jaszyn."
|
||||||
|
#~ msgstr "* Ruso: Alexander Jaszyn."
|
||||||
|
|
||||||
|
#~ msgid "* Turkish: Burak."
|
||||||
|
#~ msgstr "* Turco: Burak."
|
||||||
|
|
||||||
#~ msgid "## TWBlue's interfaces"
|
#~ msgid "## TWBlue's interfaces"
|
||||||
#~ msgstr "## Interfaces de TWBlue"
|
#~ msgstr "## Interfaces de TWBlue"
|
||||||
|
|
||||||
|
Binary file not shown.
@@ -5,8 +5,8 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: TW Blue documentation 0.80\n"
|
"Project-Id-Version: TW Blue documentation 0.80\n"
|
||||||
"POT-Creation-Date: 2015-06-28 13:59+Hora de verano central (México)\n"
|
"POT-Creation-Date: 2016-03-31 16:51+Hora de verano romance\n"
|
||||||
"PO-Revision-Date: 2015-07-01 22:57+0100\n"
|
"PO-Revision-Date: 2016-04-02 18:32+0100\n"
|
||||||
"Last-Translator: Rémy Ruiz <remyruiz@gmail.com>\n"
|
"Last-Translator: Rémy Ruiz <remyruiz@gmail.com>\n"
|
||||||
"Language-Team: Rémy Ruiz <remyruiz@gmail.com>\n"
|
"Language-Team: Rémy Ruiz <remyruiz@gmail.com>\n"
|
||||||
"Language: fr\n"
|
"Language: fr\n"
|
||||||
@@ -54,7 +54,7 @@ msgstr "Documentation pour TWBlue - {0}"
|
|||||||
#: ../doc\strings.py:378 ../doc\strings.py:381 ../doc\strings.py:384
|
#: ../doc\strings.py:378 ../doc\strings.py:381 ../doc\strings.py:384
|
||||||
#: ../doc\strings.py:387 ../doc\strings.py:390 ../doc\strings.py:393
|
#: ../doc\strings.py:387 ../doc\strings.py:390 ../doc\strings.py:393
|
||||||
#: ../doc\strings.py:396 ../doc\strings.py:399 ../doc\strings.py:402
|
#: ../doc\strings.py:396 ../doc\strings.py:399 ../doc\strings.py:402
|
||||||
#: ../doc\strings.py:405 ../doc\strings.py:421 ../doc\strings.py:424
|
#: ../doc\strings.py:405 ../doc\strings.py:426 ../doc\strings.py:429
|
||||||
msgid "\n"
|
msgid "\n"
|
||||||
msgstr "\n"
|
msgstr "\n"
|
||||||
|
|
||||||
@@ -109,7 +109,7 @@ msgid "* Tweet, reply to, retweet and delete tweets,"
|
|||||||
msgstr "* Écrire, répondre, retwitter et supprimer les tweets,"
|
msgstr "* Écrire, répondre, retwitter et supprimer les tweets,"
|
||||||
|
|
||||||
#: ../doc\strings.py:29
|
#: ../doc\strings.py:29
|
||||||
msgid "* Mark and unmark a tweet as a favourite,"
|
msgid "* Mark and unmark a tweet as favourite,"
|
||||||
msgstr "* Marquer comme favori, supprimer des favoris un tweet,"
|
msgstr "* Marquer comme favori, supprimer des favoris un tweet,"
|
||||||
|
|
||||||
#: ../doc\strings.py:30
|
#: ../doc\strings.py:30
|
||||||
@@ -121,15 +121,15 @@ msgid "* See your friends and followers,"
|
|||||||
msgstr "* Voir ceux qui vous suivent et ceux que vous suivez,"
|
msgstr "* Voir ceux qui vous suivent et ceux que vous suivez,"
|
||||||
|
|
||||||
#: ../doc\strings.py:32
|
#: ../doc\strings.py:32
|
||||||
msgid "* Follow, unfollow, report as spam and block a user,"
|
msgid "* Follow, unfollow, report and block a user,"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Suivre, ne pas suivre, signaler comme spam ou bloquer un utilisateur,"
|
"* Suivre, ne pas suivre, signaler comme spam ou bloquer un utilisateur,"
|
||||||
|
|
||||||
#: ../doc\strings.py:33
|
#: ../doc\strings.py:33
|
||||||
msgid "* Open a user's timeline to see only their tweets,"
|
msgid "* Open a user's timeline to see their tweets separately,"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Ouvrir une chronologie pour un utilisateur spécifique, ce qui permet de "
|
"* Ouvrir une chronologie d'un utilisateur, ce qui permet de lire tous les "
|
||||||
"lire tous les tweets d'un utilisateur dans une seule liste,"
|
"tweets de cet utilisateur uniquement,"
|
||||||
|
|
||||||
#: ../doc\strings.py:34
|
#: ../doc\strings.py:34
|
||||||
msgid "* Open URLs from a tweet or direct message,"
|
msgid "* Open URLs from a tweet or direct message,"
|
||||||
@@ -199,7 +199,7 @@ msgstr ""
|
|||||||
"que vous aurez besoin de votre nom d'utilisateur et un mot de passe pour "
|
"que vous aurez besoin de votre nom d'utilisateur et un mot de passe pour "
|
||||||
"donner la permission à TWBlue à utiliser votre compte. Nous vous suggérons "
|
"donner la permission à TWBlue à utiliser votre compte. Nous vous suggérons "
|
||||||
"que vous choisissez un nom d'utilisateur qui est facile à retenir pour vous "
|
"que vous choisissez un nom d'utilisateur qui est facile à retenir pour vous "
|
||||||
"et vos futurs folowers."
|
"et vos futurs abonnés."
|
||||||
|
|
||||||
#: ../doc\strings.py:51
|
#: ../doc\strings.py:51
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -237,25 +237,25 @@ msgstr ""
|
|||||||
|
|
||||||
#: ../doc\strings.py:60
|
#: ../doc\strings.py:60
|
||||||
msgid ""
|
msgid ""
|
||||||
"TWBlue allows you to monitor several Twitter accounts simultaneously. The "
|
"You can log into several Twitter accounts simultaneously. The program refers "
|
||||||
"program refers to each Twitter account you have configured as a \"Session\". "
|
"to each Twitter account you have configured as a \"Session\". If this is the "
|
||||||
"If this is the first time you have launched TWBlue, and if no Twitter "
|
"first time you have launched TWBlue, and if no Twitter session exists, you "
|
||||||
"session exists, you will see the Session Manager. This dialogue box allows "
|
"will see the Session Manager. This dialogue box allows you to authorise as "
|
||||||
"you to authorise as many accounts as you wish. If you press the Tab key to "
|
"many accounts as you wish. If you press the Tab key to reach the \"new "
|
||||||
"reach the \"new account\" button and activate it by pressing the Space Bar, "
|
"account\" button and activate it by pressing the Space Bar, a dialogue box "
|
||||||
"a dialogue box will advise you that your default internet browser will be "
|
"will advise you that your default internet browser will be opened in order "
|
||||||
"opened in order to authorise the application and you will be asked if you "
|
"to authorise the application and you will be asked if you would like to "
|
||||||
"would like to continue. Activate the \"yes\" Button by pressing the letter "
|
"continue. Activate the \"yes\" Button by pressing the letter \"Y\" so the "
|
||||||
"\"Y\" so the process may start."
|
"process may start."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"TWBlue vous permet d'utiliser plusieurs comptes Twitter en même temps. Le "
|
"Vous pouvez vous connecter à plusieurs comptes Twitter en même temps. Le "
|
||||||
"programme fait référence à chaque compte que vous avez configuré comme "
|
"programme fait référence à chaque compte que vous avez configuré comme "
|
||||||
"\"Session\". Si c'est la première fois que vous ouvrez TWBlue, ou si vous "
|
"\"Session\". Si c'est la première fois que vous ouvrez TWBlue, ou si vous "
|
||||||
"n'avez pas configuré avant une session, vous pourrez voir le Gestionnaire de "
|
"n'avez pas configuré avant une session, vous pourrez voir le Gestionnaire de "
|
||||||
"session. Cette boîte de dialogue vous permet d'autoriser tous les comptes "
|
"session. Cette boîte de dialogue vous permet d'autoriser tous les comptes "
|
||||||
"que vous voulez. Si vous appuyez sur le bouton \"Nouveau compte\", un "
|
"que vous voulez. Si vous appuyez sur le bouton \"Nouveau compte\", un "
|
||||||
"message vous informera que votre navigateur s'ouvrira pour autoriser "
|
"message vous informera que votre navigateur s'ouvrira pour autoriser "
|
||||||
"l'application. Appuyez sur \"Oui\" pour démarrer le processus."
|
"l'application. Appuyez sur \"oui\" pour démarrer le processus."
|
||||||
|
|
||||||
#: ../doc\strings.py:63
|
#: ../doc\strings.py:63
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -287,7 +287,7 @@ msgstr ""
|
|||||||
#: ../doc\strings.py:69
|
#: ../doc\strings.py:69
|
||||||
msgid ""
|
msgid ""
|
||||||
"To start running TWBlue, press the Ok button in the Session Manager "
|
"To start running TWBlue, press the Ok button in the Session Manager "
|
||||||
"dialogue. By default, TWBlue starts all the configured sessions "
|
"dialogue. By default, the program starts all the configured sessions "
|
||||||
"automatically, however, you can change this behavior."
|
"automatically, however, you can change this behavior."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Pour démmarer TWBlue, appuyez sur le bouton OK dans le Gestionnaire de "
|
"Pour démmarer TWBlue, appuyez sur le bouton OK dans le Gestionnaire de "
|
||||||
@@ -335,16 +335,16 @@ msgid ""
|
|||||||
"A buffer is a list of items to manage the data which arrives from Twitter, "
|
"A buffer is a list of items to manage the data which arrives from Twitter, "
|
||||||
"after being processed by the application. When you configure a new session "
|
"after being processed by the application. When you configure a new session "
|
||||||
"on TWBlue and start it, many buffers are created. Each of them may contain "
|
"on TWBlue and start it, many buffers are created. Each of them may contain "
|
||||||
"some of the items which TWBlue works with: Tweets, direct messages, users, "
|
"some of the items which this program works with: Tweets, direct messages, "
|
||||||
"trends or events. According to the buffer you are focusing, you will be able "
|
"users, trends or events. According to the buffer you are focusing, you will "
|
||||||
"to do different actions with these items."
|
"be able to do different actions with these items."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Un tampon est une liste d'éléments pour gérer l'information qui vient de "
|
"Un tampon est une liste d'éléments pour gérer l'information qui vient de "
|
||||||
"Twitter, après d'avoir été traité par l'application. Lorsque vous configurez "
|
"Twitter, après d'avoir été traité par l'application. Lorsque vous configurez "
|
||||||
"et démarrez une session dans TWBlue, il crée quelques tampons. Chacun "
|
"et démarrez une session dans TWBlue, il crée quelques tampons. Chacun "
|
||||||
"d'entre eux peut contenir des éléments qui fonctionnent avec TWBlue: Tuits, "
|
"d'entre eux peut contenir des éléments qui fonctionnent avec le programme: "
|
||||||
"messages directs, utilisateurs, tendances ou événements. Selon le tampon "
|
"Tuits, messages directs, utilisateurs, tendances ou événements. Selon le "
|
||||||
"dans lequelle vous vous trouvez, vous serez en mesure d'effectuer des "
|
"tampon dans lequelle vous vous trouvez, vous serez en mesure d'effectuer des "
|
||||||
"actions différentes avec ses éléments."
|
"actions différentes avec ses éléments."
|
||||||
|
|
||||||
#: ../doc\strings.py:90
|
#: ../doc\strings.py:90
|
||||||
@@ -407,17 +407,18 @@ msgstr ""
|
|||||||
|
|
||||||
#: ../doc\strings.py:99
|
#: ../doc\strings.py:99
|
||||||
msgid ""
|
msgid ""
|
||||||
"* Followers: when users follow you, you'll be able to see them on this list, "
|
"* Followers: when users follow you, you'll be able to see them on this "
|
||||||
"with some of their account details."
|
"buffer, with some of their account details."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Followers: Lorsque les utilisateurs suivent votre compte, vous les verrez "
|
"* Abonnés: Lorsque les utilisateurs suivent votre compte, vous les verrez "
|
||||||
"dans cette liste, ainsi que quelques informations sur leur compte Twitter."
|
"dans cette liste, ainsi que quelques informations sur leur compte Twitter."
|
||||||
|
|
||||||
#: ../doc\strings.py:100
|
#: ../doc\strings.py:100
|
||||||
msgid ""
|
msgid ""
|
||||||
"* Friends: the same as the previous list, but these are the users you follow."
|
"* Friends: the same as the previous buffer, but these are the users you "
|
||||||
|
"follow."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Following: Même que pour la liste précédente, mais ce sont les "
|
"* Abonnements: Même que pour la liste précédente, mais ce sont les "
|
||||||
"utilisateurs que vous suivez."
|
"utilisateurs que vous suivez."
|
||||||
|
|
||||||
#: ../doc\strings.py:101
|
#: ../doc\strings.py:101
|
||||||
@@ -438,7 +439,7 @@ msgid ""
|
|||||||
"* Events: An event is anything that happens on Twitter, such as when someone "
|
"* Events: An event is anything that happens on Twitter, such as when someone "
|
||||||
"follows you, when someone adds or removes one of your tweets from their "
|
"follows you, when someone adds or removes one of your tweets from their "
|
||||||
"favourites list, or when you subscribe to a list. There are many more, but "
|
"favourites list, or when you subscribe to a list. There are many more, but "
|
||||||
"TWBlue shows the most common ones in the events buffer so that you can "
|
"the program shows the most common ones in the events buffer so that you can "
|
||||||
"easily keep track of what is happening on your account."
|
"easily keep track of what is happening on your account."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Événements: Un événement dans TW Blue est \"quelque chose\" qui se passe "
|
"* Événements: Un événement dans TW Blue est \"quelque chose\" qui se passe "
|
||||||
@@ -446,13 +447,13 @@ msgstr ""
|
|||||||
"enregistré les événements les plus courants (par exemple. Ont vous a "
|
"enregistré les événements les plus courants (par exemple. Ont vous a "
|
||||||
"commencé à suivre, ont vous a marqués ou supprimé un tweet des favoris, vous "
|
"commencé à suivre, ont vous a marqués ou supprimé un tweet des favoris, vous "
|
||||||
"vous êtes abonné à une liste). Ils sont comme des petites notifications qui "
|
"vous êtes abonné à une liste). Ils sont comme des petites notifications qui "
|
||||||
"envoie Twitter et TWBlue l'organise dans une liste afin que vous ne manquez "
|
"envoie Twitter et le programme l'organise dans une liste afin que vous ne "
|
||||||
"pas ce qui s'est passé avec votre compte."
|
"manquez pas ce qui s'est passé avec votre compte."
|
||||||
|
|
||||||
#: ../doc\strings.py:103
|
#: ../doc\strings.py:103
|
||||||
msgid ""
|
msgid ""
|
||||||
"* Lists: A list is similar to a user timeline, except that you can "
|
"* Lists: A list is similar to a user timeline, except that you can configure "
|
||||||
"configure it to contain tweets from multiple users."
|
"it to contain tweets from multiple users."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Listes: Une liste ressemble à une chronologie, mais constitué des tweets "
|
"* Listes: Une liste ressemble à une chronologie, mais constitué des tweets "
|
||||||
"de chaque utilisateur qui en fait partie."
|
"de chaque utilisateur qui en fait partie."
|
||||||
@@ -468,11 +469,11 @@ msgstr ""
|
|||||||
|
|
||||||
#: ../doc\strings.py:105
|
#: ../doc\strings.py:105
|
||||||
msgid ""
|
msgid ""
|
||||||
"* User favourites: You can have TWBlue create a buffer containing tweets "
|
"* User favourites: You can have the program create a buffer containing "
|
||||||
"favourited by a particular user."
|
"tweets favourited by a particular user."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Favoris d'un utilisateur: TWBlue peut créer des tampons vous montrant les "
|
"* Favoris d'un utilisateur: Le programme peut créer des tampons vous "
|
||||||
"tweets qu'un utilisateur a marqués comme favoris."
|
"montrant les tweets qu'un utilisateur a marqués comme favoris."
|
||||||
|
|
||||||
#: ../doc\strings.py:106
|
#: ../doc\strings.py:106
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -518,9 +519,9 @@ msgid ""
|
|||||||
"the home and sent timelines, from users' timelines or from lists), the "
|
"the home and sent timelines, from users' timelines or from lists), the "
|
||||||
"sender of the focused direct message (if from the received or sent direct "
|
"sender of the focused direct message (if from the received or sent direct "
|
||||||
"message buffers) or in the focused user (if from the followers' or friends' "
|
"message buffers) or in the focused user (if from the followers' or friends' "
|
||||||
"buffer). If one of those dialogue boxes is opened from a tweet, and if "
|
"buffer). If one of those dialogue boxes is opened from a tweet, and if there "
|
||||||
"there are more users mentioned in it, you can use the arrow keys to switch "
|
"are more users mentioned in it, you can use the arrow keys to switch between "
|
||||||
"between them. Alternatively, you can also type a username."
|
"them. Alternatively, you can also type a username."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Ces zones d'édition acceptent un nom d'utilisateur Twitter (sans l'arobase). "
|
"Ces zones d'édition acceptent un nom d'utilisateur Twitter (sans l'arobase). "
|
||||||
"Ils sont présents dans les boîtes de dialogues pour envoyer des messages "
|
"Ils sont présents dans les boîtes de dialogues pour envoyer des messages "
|
||||||
@@ -528,19 +529,19 @@ msgstr ""
|
|||||||
"Ces boîtes de dialogues seront abordées ultérieurement. La valeur initiale "
|
"Ces boîtes de dialogues seront abordées ultérieurement. La valeur initiale "
|
||||||
"de ces zones dépend de l'endroit où ils ont été ouverts. Ces zones sont "
|
"de ces zones dépend de l'endroit où ils ont été ouverts. Ces zones sont "
|
||||||
"automatiquement remplis avec le nom d'utilisateur du tweet actuel (s'il est "
|
"automatiquement remplis avec le nom d'utilisateur du tweet actuel (s'il est "
|
||||||
"ouvert à partir du tampon principal ou envoyés d'une chronologie d'un "
|
"ouvert à partir du tampon principal ou envoyés, d'une chronologie d'un "
|
||||||
"utilisateur ou une liste), l'utilisateur qui a envoyé le message direct "
|
"utilisateur ou une liste), l'utilisateur qui a envoyé le message direct "
|
||||||
"actuel (s'il est ouvert à partir du tampon de messages directs ou de "
|
"actuel (s'il est ouvert à partir du tampon de messages directs ou de "
|
||||||
"messages directs envoyé) ou de l'utilisateur actuel (à partir du tampon des "
|
"messages directs envoyés) ou de l'utilisateur actuel (à partir du tampon des "
|
||||||
"following ou de followers). Si une de ces boîtes de dialogue est ouvert "
|
"abonnements ou des abonnés). Si une de ces boîtes de dialogue est ouvert "
|
||||||
"depuis un tweet et s'il n'y a plus d'un utilisateur mentionné, vous pouvez "
|
"depuis un tweet et si il y a plus d'un utilisateur mentionné, vous pouvez "
|
||||||
"utiliser les flèches haut/bas pour basculer entre eux. Alternativement, vous "
|
"utiliser les flèches haut/bas pour basculer entre eux. Alternativement, vous "
|
||||||
"pouvez entrer manuellement les utilisateurs de Twitter dans la zone "
|
"pouvez entrer manuellement les utilisateurs de Twitter dans la zone "
|
||||||
"d'édition."
|
"d'édition."
|
||||||
|
|
||||||
#: ../doc\strings.py:116
|
#: ../doc\strings.py:116
|
||||||
msgid "## TWBlue's interfaces"
|
msgid "## The program's interfaces"
|
||||||
msgstr "## Interfaces de TWBlue"
|
msgstr "## Les interfaces du programme"
|
||||||
|
|
||||||
#: ../doc\strings.py:119
|
#: ../doc\strings.py:119
|
||||||
msgid "### The graphical user interface (GUI)"
|
msgid "### The graphical user interface (GUI)"
|
||||||
@@ -662,8 +663,8 @@ msgstr ""
|
|||||||
"l'utilisateur (par exemple: @utilisateur), donc il suffit d'écrire le "
|
"l'utilisateur (par exemple: @utilisateur), donc il suffit d'écrire le "
|
||||||
"message que vous souhaitez répondre. Si dans le tweet il y a plus d'un "
|
"message que vous souhaitez répondre. Si dans le tweet il y a plus d'un "
|
||||||
"utilisateur mentionné, appuyez sur Maj+Tab et cliquez sur le bouton "
|
"utilisateur mentionné, appuyez sur Maj+Tab et cliquez sur le bouton "
|
||||||
"Mentionner à tous. Lorsque vous êtes dans la liste des following ou "
|
"Mentionner à tous. Lorsque vous êtes dans la liste des abonnements ou "
|
||||||
"followers, ce bouton s'appellera Mention à la place."
|
"abonnés, ce bouton s'appellera Mention à la place."
|
||||||
|
|
||||||
#: ../doc\strings.py:143
|
#: ../doc\strings.py:143
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -695,7 +696,7 @@ msgstr ""
|
|||||||
"chronologie principal, mentions, envoyés, favoris et la chronologie de "
|
"chronologie principal, mentions, envoyés, favoris et la chronologie de "
|
||||||
"l'utilisateur vous verrez quatre boutons ; alors que dans la liste des "
|
"l'utilisateur vous verrez quatre boutons ; alors que dans la liste des "
|
||||||
"messages directs seulement sera disponible le bouton Message Direct et "
|
"messages directs seulement sera disponible le bouton Message Direct et "
|
||||||
"Tweet, et dans les listes following et followers, s'affichera le bouton "
|
"Tweet, et dans les listes abonnements et abonnés, s'affichera le bouton "
|
||||||
"Tweet et celle du Message direct à côté de Mention."
|
"Tweet et celle du Message direct à côté de Mention."
|
||||||
|
|
||||||
#: ../doc\strings.py:149
|
#: ../doc\strings.py:149
|
||||||
@@ -778,11 +779,10 @@ msgstr ""
|
|||||||
#: ../doc\strings.py:163
|
#: ../doc\strings.py:163
|
||||||
msgid ""
|
msgid ""
|
||||||
"* Edit keystrokes: this opens a dialogue where you can see and edit the "
|
"* Edit keystrokes: this opens a dialogue where you can see and edit the "
|
||||||
"shortcuts relative to the invisible interface."
|
"shortcuts used in the invisible interface."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Modifier les raccourcis clavier: Cela ouvre une boîte de dialogue où vous "
|
"* Modifier les raccourcis clavier: Cela ouvre une boîte de dialogue où vous "
|
||||||
"pouvez voir et modifier les raccourcis relatif à l'interface invisible de "
|
"pouvez voir et modifier les raccourcis pour l'interface invisible de TWBlue."
|
||||||
"TWBlue."
|
|
||||||
|
|
||||||
#: ../doc\strings.py:164
|
#: ../doc\strings.py:164
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -802,15 +802,14 @@ msgstr ""
|
|||||||
|
|
||||||
#: ../doc\strings.py:166
|
#: ../doc\strings.py:166
|
||||||
msgid ""
|
msgid ""
|
||||||
"* Quit: asks whether you want to exit the program. If the answer is yes, it "
|
"* Exit: asks whether you want to exit the program. If the answer is yes, it "
|
||||||
"closes the application. If you wish TWBlue not to ask you for confirmation "
|
"closes the application. If you do not want to be asked for confirmation "
|
||||||
"before exiting, uncheck the checkbox from the global settings dialogue box."
|
"before exiting, uncheck the checkbox from the global settings dialogue box."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Sortir: Il vous demande si vous souhaitez sortir ou non du programme. Si "
|
"* Sortir: Il vous demande si vous souhaitez sortir du programme. Si la "
|
||||||
"la réponse est oui, Il ferme l'application. Si vous ne souhaitez pas que "
|
"réponse est oui, Il ferme l'application. Si vous ne souhaitez pas qu'il vous "
|
||||||
"TWBlue vous demande toujours avant de sortir, vous pouvez configurer cette "
|
"demande une confirmation avant de sortir, décochez la case à cocher dans la "
|
||||||
"option en décochant la case correspondante dans la boîte de dialogue "
|
"boîte de dialogue Paramètres globaux."
|
||||||
"Paramètres globaux."
|
|
||||||
|
|
||||||
#: ../doc\strings.py:169
|
#: ../doc\strings.py:169
|
||||||
msgid "##### Tweet menu"
|
msgid "##### Tweet menu"
|
||||||
@@ -849,14 +848,14 @@ msgid ""
|
|||||||
"only edit box with the information in the focused item and a close button."
|
"only edit box with the information in the focused item and a close button."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Voir tweet: Ouvre une boîte de dialogue où vous pouvez lire le tweet, "
|
"* Voir tweet: Ouvre une boîte de dialogue où vous pouvez lire le tweet, "
|
||||||
"message direct, following ou follower sur lequel vous êtes actuellement. "
|
"message direct, abonnements ou abonnés sur lequel vous êtes actuellement. "
|
||||||
"Vous pouvez lire le texte avec les touches fléchées. C'est une boîte de "
|
"Vous pouvez lire le texte avec les touches fléchées. C'est une boîte de "
|
||||||
"dialogue très similaire à celle utilisée pour écrire un nouveau tweet, à "
|
"dialogue très similaire à celle utilisée pour écrire un nouveau tweet, à "
|
||||||
"l'exception que pour cette boîte de dialogue il ne s'affichent pas les "
|
"l'exception que pour cette boîte de dialogue il ne s'affichent pas les "
|
||||||
"paramètres pour la saisie automatique, le chargement de fichiers audio et "
|
"paramètres pour la saisie automatique, le chargement de fichiers audio et "
|
||||||
"images. Toutefois, il comprend deux compteurs qui permettent de connaître le "
|
"images. Toutefois, il comprend deux compteurs qui permettent de connaître le "
|
||||||
"nombre de fois où le tweet a été retweeté et marqué comme favori. Si vous "
|
"nombre de fois où le tweet a été retweeté et marqué comme favori. Si vous "
|
||||||
"êtes dans la liste de followers et following, la boîte de dialogue "
|
"êtes dans la liste des abonnés et abonnements, la boîte de dialogue "
|
||||||
"seulement affiche les informations de l'utilisateur et d'un bouton pour "
|
"seulement affiche les informations de l'utilisateur et d'un bouton pour "
|
||||||
"Fermer."
|
"Fermer."
|
||||||
|
|
||||||
@@ -864,13 +863,14 @@ msgstr ""
|
|||||||
msgid ""
|
msgid ""
|
||||||
"* View address: If the selected tweet has geographical information, TWBlue "
|
"* View address: If the selected tweet has geographical information, TWBlue "
|
||||||
"may display a dialogue box where you can read the tweet address. This "
|
"may display a dialogue box where you can read the tweet address. This "
|
||||||
"address is retrieved by sending the geographical coordinates of the tweet "
|
"address is retrieved by sending the geographical coordinates of the tweet to "
|
||||||
"to Google maps."
|
"Google maps."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Voir adresse: Si le Tweet sélectionné il contien des informations "
|
"* Voir adresse: Si le Tweet sélectionné il contien des informations "
|
||||||
"géographiques, TWBlue peut afficher une boîte de dialogue où vous pouvez "
|
"géographiques, TWBlue peut afficher une boîte de dialogue où vous pouvez "
|
||||||
"lire l'adresse d'où vous avez écrit le tweet. L'adresse est obtenue en "
|
"lire l'adresse d'où vous avez écrit le tweet. L'adresse est obtenue en "
|
||||||
"envoyant les coordonnées géographiques du tweet aux services de Google maps."
|
"envoyant les coordonnées géographiques du tweet que vous avez écrit aux "
|
||||||
|
"services de Google maps."
|
||||||
|
|
||||||
#: ../doc\strings.py:177
|
#: ../doc\strings.py:177
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -906,7 +906,7 @@ msgstr ""
|
|||||||
"* Actions: Ouvre une boîte de dialogue où vous pouvez interagir avec un "
|
"* Actions: Ouvre une boîte de dialogue où vous pouvez interagir avec un "
|
||||||
"utilisateur. Cette boîte de dialogue vous placera par défaut le nom "
|
"utilisateur. Cette boîte de dialogue vous placera par défaut le nom "
|
||||||
"d'utilisateur du tweet ou message direct sur lequel vous étiez lorsque vous "
|
"d'utilisateur du tweet ou message direct sur lequel vous étiez lorsque vous "
|
||||||
"l'avez ouvert ou dans le cas des following et followers, l'utilisateur "
|
"l'avez ouvert ou dans le cas des abonnements et abonnés, l'utilisateur "
|
||||||
"actuellement sélectionné. Si vous le souhaitez, vous pouvez manuellement "
|
"actuellement sélectionné. Si vous le souhaitez, vous pouvez manuellement "
|
||||||
"modifier l'utilisateur. La boîte de dialogue comporte les options suivantes:"
|
"modifier l'utilisateur. La boîte de dialogue comporte les options suivantes:"
|
||||||
|
|
||||||
@@ -928,8 +928,8 @@ msgstr ""
|
|||||||
#: ../doc\strings.py:186
|
#: ../doc\strings.py:186
|
||||||
msgid ""
|
msgid ""
|
||||||
" * Unfollow: Stops following a user, which causes you not being able to "
|
" * Unfollow: Stops following a user, which causes you not being able to "
|
||||||
"see his/her tweets on your main timeline neither exchanging direct "
|
"see his/her tweets on your main timeline neither exchanging direct messages, "
|
||||||
"messages, unless they have enabled receiving direct messages from anyone."
|
"unless they have enabled receiving direct messages from anyone."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Ne pas suivre: Laissez de suivre l'utilisateur, ce qui signifie que vous "
|
"* Ne pas suivre: Laissez de suivre l'utilisateur, ce qui signifie que vous "
|
||||||
"ne verrez pas ces tweets dans votre chronologie principale, et sauf si vous "
|
"ne verrez pas ces tweets dans votre chronologie principale, et sauf si vous "
|
||||||
@@ -986,7 +986,7 @@ msgstr ""
|
|||||||
msgid ""
|
msgid ""
|
||||||
"* View timeline: Lets you open a user's timeline by choosing the user in a "
|
"* View timeline: Lets you open a user's timeline by choosing the user in a "
|
||||||
"dialog box. It is created when you press enter. If you invoke this option "
|
"dialog box. It is created when you press enter. If you invoke this option "
|
||||||
"relative to a user that has no tweets, the program will fail. If you try "
|
"relative to a user that has no tweets, the operation will fail. If you try "
|
||||||
"creating an existing timeline the program will warn you and will not create "
|
"creating an existing timeline the program will warn you and will not create "
|
||||||
"it again."
|
"it again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1029,8 +1029,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: ../doc\strings.py:198
|
#: ../doc\strings.py:198
|
||||||
msgid ""
|
msgid ""
|
||||||
"* Show user profile: opens a dialogue with the profile of the specified "
|
"* Show user profile: opens a dialogue with the profile of the specified user."
|
||||||
"user."
|
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Voir le profil de l'utilisateur: Ouvre une boîte de dialogue qui vous "
|
"* Voir le profil de l'utilisateur: Ouvre une boîte de dialogue qui vous "
|
||||||
"permet de sélectionner l'utilisateur auquel vous souhaitez voir le profil."
|
"permet de sélectionner l'utilisateur auquel vous souhaitez voir le profil."
|
||||||
@@ -1052,7 +1051,7 @@ msgid ""
|
|||||||
"* New trending topics buffer: This opens a buffer to get the worlwide "
|
"* New trending topics buffer: This opens a buffer to get the worlwide "
|
||||||
"trending topics or those of a country or a city. You'll be able to select "
|
"trending topics or those of a country or a city. You'll be able to select "
|
||||||
"from a dialogue box if you wish to retrieve countries' trends, cities' "
|
"from a dialogue box if you wish to retrieve countries' trends, cities' "
|
||||||
"trends or worldwide trends (this options is in the cities' list) and choose "
|
"trends or worldwide trends (this option is in the cities' list) and choose "
|
||||||
"one from the selected list. The trending topics buffer will be created once "
|
"one from the selected list. The trending topics buffer will be created once "
|
||||||
"the \"OK\" button has been activated within the dialogue box. Remember this "
|
"the \"OK\" button has been activated within the dialogue box. Remember this "
|
||||||
"kind of buffer will be updated every five minutes."
|
"kind of buffer will be updated every five minutes."
|
||||||
@@ -1060,11 +1059,12 @@ msgstr ""
|
|||||||
"* Nouveau tampon de tendances: Cela ouvre un tampon depuis lequel vous "
|
"* Nouveau tampon de tendances: Cela ouvre un tampon depuis lequel vous "
|
||||||
"pouvez faire un suivi de les 10 tendances d'une ville ou d'un pays du "
|
"pouvez faire un suivi de les 10 tendances d'une ville ou d'un pays du "
|
||||||
"monde. Une boîte de dialogue s'affiche à partir de laquelle vous pouvez "
|
"monde. Une boîte de dialogue s'affiche à partir de laquelle vous pouvez "
|
||||||
"sélectionner si vous voulez voir les tendances pour un pays, une ville ou "
|
"sélectionner si vous voulez voir les tendances pour un pays, les tendances "
|
||||||
"les tendances mondiales (cette option est dans la liste des villes, par "
|
"pour une ville ou les tendances mondiales (cette option est dans la liste "
|
||||||
"exemple Worldwhide). Le tampon sera créé une fois que vous sélectionnez "
|
"des villes, comme Worldwhide par exemple). Le tampon sera créé une fois que "
|
||||||
"votre pays ou la ville et vous appuyez sur le bouton \"OK\". \" N'oubliez "
|
"vous sélectionnez votre pays ou la ville et vous appuyez sur le bouton \"OK"
|
||||||
"pas que ce type de tampon est mis à jour toutes les cinq minutes."
|
"\". \" N'oubliez pas que ce type de tampon est mis à jour toutes les cinq "
|
||||||
|
"minutes."
|
||||||
|
|
||||||
#: ../doc\strings.py:206
|
#: ../doc\strings.py:206
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -1072,7 +1072,7 @@ msgid ""
|
|||||||
"buffer."
|
"buffer."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* charger des éléments plus anciens: Cela permet de récupérer plus de "
|
"* charger des éléments plus anciens: Cela permet de récupérer plus de "
|
||||||
"tweets, messages directs, following ou followers depuis le tampon actuel."
|
"tweets, messages directs, abonnements ou abonnés depuis le tampon actuel."
|
||||||
|
|
||||||
#: ../doc\strings.py:207
|
#: ../doc\strings.py:207
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -1186,8 +1186,8 @@ msgid ""
|
|||||||
"works directly with screen readers such as JAWS for Windows, NVDA and System "
|
"works directly with screen readers such as JAWS for Windows, NVDA and System "
|
||||||
"Access. This interface is disabled by default, but you can enable it by "
|
"Access. This interface is disabled by default, but you can enable it by "
|
||||||
"pressing Control + M. It works similarly to TheQube and Chicken Nugget. Its "
|
"pressing Control + M. It works similarly to TheQube and Chicken Nugget. Its "
|
||||||
"shortcuts are similar to those found in these two clients. In addition, "
|
"shortcuts are similar to those found in these two clients. In addition, the "
|
||||||
"TWBlue has builtin support for the keymaps for these applications, "
|
"program has builtin support for the keymaps for these applications, "
|
||||||
"configurable through the global settings dialogue. By default, you cannot "
|
"configurable through the global settings dialogue. By default, you cannot "
|
||||||
"use this interface's shortcuts in the GUI, but you can configure this in the "
|
"use this interface's shortcuts in the GUI, but you can configure this in the "
|
||||||
"global settings dialogue."
|
"global settings dialogue."
|
||||||
@@ -1197,11 +1197,12 @@ msgstr ""
|
|||||||
"NVDA et System Access. Cette interface est désactivée par défaut, mais vous "
|
"NVDA et System Access. Cette interface est désactivée par défaut, mais vous "
|
||||||
"pouvez l'activer en appuyant sur Contrôle+M. Il fonctionne de manière "
|
"pouvez l'activer en appuyant sur Contrôle+M. Il fonctionne de manière "
|
||||||
"similaire à TheQube et Chicken Nugget. Ses raccourcis sont semblables à ceux "
|
"similaire à TheQube et Chicken Nugget. Ses raccourcis sont semblables à ceux "
|
||||||
"trouvés dans ces deux clients. En outre, TWBlue inclut le support pour les "
|
"trouvés dans ces deux clients. En outre, le programme inclut le support pour "
|
||||||
"configurations clavier pour ces clients, configurables par l'intermédiaire "
|
"les configurations clavier pour ces clients, configurables par "
|
||||||
"de la boîte de dialogue Paramètres Globaux. Par défaut, vous ne pouvez pas "
|
"l'intermédiaire de la boîte de dialogue Paramètres Globaux. Par défaut, vous "
|
||||||
"utiliser les raccourcis de cette interface dans l'interface graphique, mais "
|
"ne pouvez pas utiliser les raccourcis de cette interface dans l'interface "
|
||||||
"vous pouvez configurer cela dans la boîte de dialogue Paramètres Globaux."
|
"graphique, mais vous pouvez configurer cela dans la boîte de dialogue "
|
||||||
|
"Paramètres Globaux."
|
||||||
|
|
||||||
#: ../doc\strings.py:231
|
#: ../doc\strings.py:231
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -1265,8 +1266,8 @@ msgid "* Control + Shift + V: Show tweet."
|
|||||||
msgstr " Contrôle+Maj+V: Voir Tweet."
|
msgstr " Contrôle+Maj+V: Voir Tweet."
|
||||||
|
|
||||||
#: ../doc\strings.py:251
|
#: ../doc\strings.py:251
|
||||||
msgid "* Control + Q: Quit TWBlue."
|
msgid "* Control + Q: Quit this program."
|
||||||
msgstr "* Contrôle+Q: Sortir de TWBlue."
|
msgstr "* Contrôle+Q: Sortir du programme."
|
||||||
|
|
||||||
#: ../doc\strings.py:252
|
#: ../doc\strings.py:252
|
||||||
msgid "* Control + I: Open user timeline."
|
msgid "* Control + I: Open user timeline."
|
||||||
@@ -1492,15 +1493,15 @@ msgstr ""
|
|||||||
|
|
||||||
#: ../doc\strings.py:306
|
#: ../doc\strings.py:306
|
||||||
msgid "* Control + Windows + G: Get geolocation."
|
msgid "* Control + Windows + G: Get geolocation."
|
||||||
msgstr "* Contrôle+Windows+G: Obtenir la géolocalisation."
|
msgstr "* Contrôle+Windows+G: Obtenir la localisation géographique."
|
||||||
|
|
||||||
#: ../doc\strings.py:307
|
#: ../doc\strings.py:307
|
||||||
msgid ""
|
msgid ""
|
||||||
"* Control + Windows + Shift + G: Display the tweet's geolocation in a "
|
"* Control + Windows + Shift + G: Display the tweet's geolocation in a "
|
||||||
"dialogue."
|
"dialogue."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Contrôle+Windows+Maj+G: Afficher la géolocalisation du tweet dans une "
|
"* Contrôle+Windows+Maj+G: Afficher la localisation géographique du tweet "
|
||||||
"boîte de dialogue."
|
"dans une boîte de dialogue."
|
||||||
|
|
||||||
#: ../doc\strings.py:308
|
#: ../doc\strings.py:308
|
||||||
msgid "* Control + Windows + T: Create a trending topics' buffer."
|
msgid "* Control + Windows + T: Create a trending topics' buffer."
|
||||||
@@ -1513,17 +1514,17 @@ msgstr ""
|
|||||||
"actuel."
|
"actuel."
|
||||||
|
|
||||||
#: ../doc\strings.py:312
|
#: ../doc\strings.py:312
|
||||||
msgid "## Configuring TWBlue"
|
msgid "## Configuration"
|
||||||
msgstr "## Configurer TWBlue"
|
msgstr "## Configuration"
|
||||||
|
|
||||||
#: ../doc\strings.py:313
|
#: ../doc\strings.py:313
|
||||||
msgid ""
|
msgid ""
|
||||||
"As described above, TWBlue has two configuration dialogues, the global "
|
"As described above, this application has two configuration dialogues, the "
|
||||||
"settings dialogue and the account settings dialogue."
|
"global settings dialogue and the account settings dialogue."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Comme décrit ci-dessus, TWBlue a deux boîtes de dialogues de configuration, "
|
"Comme décrit ci-dessus, l'application a deux boîtes de dialogues de "
|
||||||
"la boîte de dialogue Paramètres Globaux et la boîte de dialogue Paramètres "
|
"configuration, la boîte de dialogue Paramètres Globaux et la boîte de "
|
||||||
"du compte."
|
"dialogue Paramètres du compte."
|
||||||
|
|
||||||
#: ../doc\strings.py:316
|
#: ../doc\strings.py:316
|
||||||
msgid "### The account settings dialogue"
|
msgid "### The account settings dialogue"
|
||||||
@@ -1543,30 +1544,30 @@ msgstr ""
|
|||||||
"comportement de la base de données pour la saisie automatique des "
|
"comportement de la base de données pour la saisie automatique des "
|
||||||
"utilisateurs. Vous pouvez ajouter des utilisateurs manuellement ou de "
|
"utilisateurs. Vous pouvez ajouter des utilisateurs manuellement ou de "
|
||||||
"permettre à TWBlue d'ajouter à tous les utilisateurs qui se trouvent dans "
|
"permettre à TWBlue d'ajouter à tous les utilisateurs qui se trouvent dans "
|
||||||
"votre tampon de followers, following ou les deux."
|
"votre tampon des abonnés, abonnements ou les deux."
|
||||||
|
|
||||||
#: ../doc\strings.py:323
|
#: ../doc\strings.py:323
|
||||||
msgid ""
|
msgid ""
|
||||||
"* Relative timestamps: Allows you to configure whether TWBlue will calculate "
|
"* Relative timestamps: Allows you to configure whether the application will "
|
||||||
"the time the tweet or direct message was sent or received based on the "
|
"calculate the time the tweet or direct message was sent or received based on "
|
||||||
"current time, or simply say the time it was received or sent."
|
"the current time, or simply say the time it was received or sent."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Temps relatifs: Vous pouvez configurer si vous voulez que TWBlue calcule "
|
"* Temps relatifs: Vous pouvez configurer si vous voulez que le programme "
|
||||||
"l'heure du tweet ou message direct qui a été envoyé ou a été reçu (il ya 2 "
|
"calcule l'heure du tweet ou message direct qui a été envoyé ou a été reçu "
|
||||||
"jours, une semaine, deux mois, etc.). ou si vous souhaitez uniquement être "
|
"(il ya 2 jours, une semaine, deux mois, etc.). ou si vous souhaitez "
|
||||||
"informer de la date et l'heure que le tweet a été publié."
|
"uniquement être informer de la date et l'heure que le tweet a été publié."
|
||||||
|
|
||||||
#: ../doc\strings.py:324
|
#: ../doc\strings.py:324
|
||||||
msgid ""
|
msgid ""
|
||||||
"* API calls: Allows you to adjust the number of API calls to send to Twitter "
|
"* API calls: Allows you to adjust the number of API calls to be made to "
|
||||||
"by TWBlue."
|
"Twitter by this program."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Appels à l'API: Vous pouvez configurer le nombre d'appels à l'API pour "
|
"* Appels à l'API: Vous pouvez configurer le nombre d'appels à l'API pour "
|
||||||
"envoyer à Twitter par TWBlue."
|
"envoyer à Twitter par le programme."
|
||||||
|
|
||||||
#: ../doc\strings.py:325
|
#: ../doc\strings.py:325
|
||||||
msgid ""
|
msgid ""
|
||||||
"* Items on each API calls: Allows you to specify how many items should be "
|
"* Items on each API call: Allows you to specify how many items should be "
|
||||||
"retrieved from Twitter for each API call (default and maximum is 200)."
|
"retrieved from Twitter for each API call (default and maximum is 200)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Éléments pour chaque appel à l'API: Vous permet de spécifier combien "
|
"* Éléments pour chaque appel à l'API: Vous permet de spécifier combien "
|
||||||
@@ -1587,8 +1588,8 @@ msgstr ""
|
|||||||
#: ../doc\strings.py:327
|
#: ../doc\strings.py:327
|
||||||
msgid ""
|
msgid ""
|
||||||
"* Retweet mode: Allows you to specify the behaviour when posting a retweet: "
|
"* Retweet mode: Allows you to specify the behaviour when posting a retweet: "
|
||||||
"you can choose between retweeting with a comment, retweeting without "
|
"you can choose between retweeting with a comment, retweeting without comment "
|
||||||
"comment or being asked."
|
"or being asked."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Mode retweet: Vous permet de spécifier le comportement de TWBlue lorsque "
|
"* Mode retweet: Vous permet de spécifier le comportement de TWBlue lorsque "
|
||||||
"vous publier un retweet: vous pouvez choisir entre: Demander, Retweet avec "
|
"vous publier un retweet: vous pouvez choisir entre: Demander, Retweet avec "
|
||||||
@@ -1627,10 +1628,11 @@ msgid "#### The ignored clients tab"
|
|||||||
msgstr "#### L'onglet Clients ignorés"
|
msgstr "#### L'onglet Clients ignorés"
|
||||||
|
|
||||||
#: ../doc\strings.py:340
|
#: ../doc\strings.py:340
|
||||||
msgid "In this tab, you can add and remove clients to be ignored by TWBlue."
|
msgid ""
|
||||||
|
"In this tab, you can add and remove clients to be ignored by the program."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Dans cet onglet, vous pouvez ajouter et supprimer des clients qui seront "
|
"Dans cet onglet, vous pouvez ajouter et supprimer des clients qui seront "
|
||||||
"ignorés par TWBlue."
|
"ignorés par le programme."
|
||||||
|
|
||||||
#: ../doc\strings.py:343
|
#: ../doc\strings.py:343
|
||||||
msgid "#### Sound tab"
|
msgid "#### Sound tab"
|
||||||
@@ -1639,11 +1641,11 @@ msgstr "#### Onglet Audio"
|
|||||||
#: ../doc\strings.py:346
|
#: ../doc\strings.py:346
|
||||||
msgid ""
|
msgid ""
|
||||||
"In this tab, you can adjust the sound volume, select the input and output "
|
"In this tab, you can adjust the sound volume, select the input and output "
|
||||||
"device and set the soundpack used by TWBlue."
|
"device and set the soundpack used by the program."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Dans cet onglet, vous pouvez ajuster le volume audio, Sélectionnez le "
|
"Dans cet onglet, vous pouvez ajuster le volume audio, Sélectionnez le "
|
||||||
"périphérique d'entrée et de sortie et établir le paquet de sons que TWBlue "
|
"périphérique d'entrée et de sortie et établir le paquet de sons que le "
|
||||||
"utilisera pour la session en cours."
|
"programme utilisera pour la session en cours."
|
||||||
|
|
||||||
#: ../doc\strings.py:349
|
#: ../doc\strings.py:349
|
||||||
msgid "#### Audio service tab"
|
msgid "#### Audio service tab"
|
||||||
@@ -1653,7 +1655,7 @@ msgstr "#### Onglet Services audio"
|
|||||||
msgid ""
|
msgid ""
|
||||||
"In this tab, you can enter your SndUp API key (if you have one) to upload "
|
"In this tab, you can enter your SndUp API key (if you have one) to upload "
|
||||||
"audio to SndUp with your account. Note that if account credentials are not "
|
"audio to SndUp with your account. Note that if account credentials are not "
|
||||||
"specified you will upload announimously."
|
"specified you will upload anonimously."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Dans cet onglet, vous pouvez entrer votre API Key de SndUp (dans le cas que "
|
"Dans cet onglet, vous pouvez entrer votre API Key de SndUp (dans le cas que "
|
||||||
"vous en avez un) pour charger de l'audio à ce service avec votre compte. "
|
"vous en avez un) pour charger de l'audio à ce service avec votre compte. "
|
||||||
@@ -1674,10 +1676,10 @@ msgstr ""
|
|||||||
|
|
||||||
#: ../doc\strings.py:364
|
#: ../doc\strings.py:364
|
||||||
msgid ""
|
msgid ""
|
||||||
"* Language: This allows you to change the language of TWBlue. Currently "
|
"* Language: This allows you to change the language of this program. "
|
||||||
"supported languages are arabic, Catalan, German, English, Spanish, Basque, "
|
"Currently supported languages are arabic, Catalan, German, English, Spanish, "
|
||||||
"Finnish, French, Galician, Croatian, Hungarian, Italian, Polish, Portuguese, "
|
"Basque, Finnish, French, Galician, Croatian, Hungarian, Italian, Polish, "
|
||||||
"Russian and Turkish."
|
"Portuguese, Russian and Turkish."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Langue: Cela vous permet de changer la langue montrer dans l'interface et "
|
"* Langue: Cela vous permet de changer la langue montrer dans l'interface et "
|
||||||
"la documentation du client. Jusqu'à présent, les langues disponibles sont "
|
"la documentation du client. Jusqu'à présent, les langues disponibles sont "
|
||||||
@@ -1686,8 +1688,8 @@ msgstr ""
|
|||||||
|
|
||||||
#: ../doc\strings.py:365
|
#: ../doc\strings.py:365
|
||||||
msgid ""
|
msgid ""
|
||||||
"* Ask before exiting TWBlue: This checkbox allows you to control whether "
|
"* Ask before exiting TWBlue: This checkbox allows you to control whetherthe "
|
||||||
"TWBlue will ask for confirmation before exiting."
|
"program will ask for confirmation before exiting."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Demander avant de sortir de TWBlue: Cette case à cocher contrôle si TWBlue "
|
"* Demander avant de sortir de TWBlue: Cette case à cocher contrôle si TWBlue "
|
||||||
"vous demandera confirmation avant d'être fermé."
|
"vous demandera confirmation avant d'être fermé."
|
||||||
@@ -1695,7 +1697,8 @@ msgstr ""
|
|||||||
#: ../doc\strings.py:366
|
#: ../doc\strings.py:366
|
||||||
msgid ""
|
msgid ""
|
||||||
"* Play a sound when TWBlue launches: This checkbox allows you to configure "
|
"* Play a sound when TWBlue launches: This checkbox allows you to configure "
|
||||||
"whether TWBlue will play a sound when it has finished loading the buffers."
|
"whether the application will play a sound when it has finished loading the "
|
||||||
|
"buffers."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Lire un son lorsque TWBlue démarre: Cette case à cocher vous permet de "
|
"* Lire un son lorsque TWBlue démarre: Cette case à cocher vous permet de "
|
||||||
"contrôler si TWBlue va jouer un son lorsqu'il a terminé de charger tous les "
|
"contrôler si TWBlue va jouer un son lorsqu'il a terminé de charger tous les "
|
||||||
@@ -1713,8 +1716,8 @@ msgstr ""
|
|||||||
#: ../doc\strings.py:368
|
#: ../doc\strings.py:368
|
||||||
msgid ""
|
msgid ""
|
||||||
"* Use the invisible interface's shortcuts in the GUI: As the invisible "
|
"* Use the invisible interface's shortcuts in the GUI: As the invisible "
|
||||||
"interface and the Graphical User Interface have their own shortcuts, you "
|
"interface and the Graphical User Interface have their own shortcuts, you may "
|
||||||
"may want to use the invisible interface's keystrokes all the time. If this "
|
"want to use the invisible interface's keystrokes all the time. If this "
|
||||||
"option is checked, the invisible interface's shortcuts will be usable in the "
|
"option is checked, the invisible interface's shortcuts will be usable in the "
|
||||||
"GUI."
|
"GUI."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1746,20 +1749,20 @@ msgstr ""
|
|||||||
|
|
||||||
#: ../doc\strings.py:371
|
#: ../doc\strings.py:371
|
||||||
msgid ""
|
msgid ""
|
||||||
"* Keymap: This option allows you to change the keymap used by TWBlue in the "
|
"* Keymap: This option allows you to change the keymap used by the program in "
|
||||||
"invisible interface. The shipped keymaps are Default, Qwitter, TheQube and "
|
"the invisible interface. The shipped keymaps are Default, Qwitter, Windows "
|
||||||
"Chicken Nugget. The keymaps are in the \"keymaps\" folder, and you can "
|
"10 and Chicken Nugget. The keymaps are in the \"keymaps\" folder, and you "
|
||||||
"create new ones. Just create a new \".keymap\" file and change the "
|
"can create new ones. Just create a new \".keymap\" file and change the "
|
||||||
"keystrokes associated with the actions, as it is done in the shipped keymaps."
|
"keystrokes associated with the actions, as it is done in the shipped keymaps."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Configuration clavier: Cette option vous permet de modifier la "
|
"* Configuration clavier: Cette option vous permet de modifier la "
|
||||||
"configuration clavier utilisée par TWBlue dans l'interface invisible. Les "
|
"configuration clavier utilisée dans l'interface invisible. Les "
|
||||||
"configurations clavier disponibles sont par défaut, Qwitter, TheQube et "
|
"configurations clavier disponibles sont Default, Qwitter, TheQube et Chicken "
|
||||||
"Chicken Nugget. Les configurations clavier se trouvent dans le dossier "
|
"Nugget. Les configurations clavier se trouvent dans le dossier \"keymaps\", "
|
||||||
"\"keymaps\", et vous pouvez créer les vôtres. Il suffit de créer un nouveau "
|
"et vous pouvez créer les vôtres. Il suffit de créer un nouveau fichier avec "
|
||||||
"fichier avec l'extension \".keymap\" et modifier les raccourcis clavier "
|
"l'extension \".keymap\" et modifier les raccourcis clavier associées à des "
|
||||||
"associées à des actions, comme il est fait dans les configurations clavier "
|
"actions, comme il est fait dans les configurations clavier qui sont inclus "
|
||||||
"qui sont inclus avec TWBlue."
|
"avec TWBlue."
|
||||||
|
|
||||||
#: ../doc\strings.py:374
|
#: ../doc\strings.py:374
|
||||||
msgid "#### Proxi tab"
|
msgid "#### Proxi tab"
|
||||||
@@ -1780,13 +1783,15 @@ msgstr "## Licence, code source et dons"
|
|||||||
|
|
||||||
#: ../doc\strings.py:383
|
#: ../doc\strings.py:383
|
||||||
msgid ""
|
msgid ""
|
||||||
"Tw Blue is under the GNU GPL license, version 2. You can view the license in "
|
"Tw Blue is free software, licensed under the GNU GPL license, either version "
|
||||||
"the file named license.txt, or online at <http://www.gnu.org/licenses/old-"
|
"2 or, at your option, any later version. You can view the license in the "
|
||||||
|
"file named license.txt, or online at <http://www.gnu.org/licenses/old-"
|
||||||
"licenses/gpl-2.0.html>."
|
"licenses/gpl-2.0.html>."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"TwBlue est sous license GPL (General Public License) GNU, version 2. Vous "
|
"TwBlue est un logiciel libre, distribué sous license GPL (General Public "
|
||||||
"pouvez afficher la licence dans le fichier nommé license.txt, ou en ligne à "
|
"License) GNU, soit la version 2, ou, à votre convenance, toute version "
|
||||||
"<http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>."
|
"ultérieure. Vous pouvez afficher la licence dans le fichier nommé license."
|
||||||
|
"txt, ou en ligne à <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>."
|
||||||
|
|
||||||
#: ../doc\strings.py:386
|
#: ../doc\strings.py:386
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -1832,8 +1837,8 @@ msgstr "## Crédits"
|
|||||||
msgid ""
|
msgid ""
|
||||||
"TWBlue is developed and mantained by [Manuel Cortéz](https://twitter.com/"
|
"TWBlue is developed and mantained by [Manuel Cortéz](https://twitter.com/"
|
||||||
"manuelcortez00), [José Manuel Delicado](https://twitter.com/jmdaweb), and "
|
"manuelcortez00), [José Manuel Delicado](https://twitter.com/jmdaweb), and "
|
||||||
"[Bill Dengler](https://twitter.com/codeofdusk). It's suppported and "
|
"[Bill Dengler](https://twitter.com/codeofdusk). It's supported and sponsored "
|
||||||
"sponsored by [Technow S. L.](https://twitter.com/technow)"
|
"by [Technow S. L.](https://twitter.com/technow)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"TWBlue est développé et maintenu par [Manuel Cortéz](https://twitter.com/"
|
"TWBlue est développé et maintenu par [Manuel Cortéz](https://twitter.com/"
|
||||||
"manuelcortez00), [José Manuel Delicado](https://twitter.com/jmdaweb), et "
|
"manuelcortez00), [José Manuel Delicado](https://twitter.com/jmdaweb), et "
|
||||||
@@ -1857,8 +1862,8 @@ msgstr ""
|
|||||||
"Dengler](https://twitter.com/codeofdusk)."
|
"Dengler](https://twitter.com/codeofdusk)."
|
||||||
|
|
||||||
#: ../doc\strings.py:408
|
#: ../doc\strings.py:408
|
||||||
msgid "* Arabic: Mohammed Al Shara."
|
msgid "* Arabic: [Mohammed Al Shara](https://twitter.com/mohammed0204)."
|
||||||
msgstr "* Arabe: Mohammed Al Shara."
|
msgstr "* Arabe: [Mohammed Al Shara](https://twitter.com/mohammed0204)."
|
||||||
|
|
||||||
#: ../doc\strings.py:409
|
#: ../doc\strings.py:409
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -1877,42 +1882,66 @@ msgid "* Basque: [Sukil Etxenike](https://twitter.com/sukil2011)."
|
|||||||
msgstr "* Basque: [Sukil Etxenike](https://twitter.com/sukil2011)."
|
msgstr "* Basque: [Sukil Etxenike](https://twitter.com/sukil2011)."
|
||||||
|
|
||||||
#: ../doc\strings.py:412
|
#: ../doc\strings.py:412
|
||||||
msgid "* Finnish: Jani Kinnunen."
|
msgid "* Finnish: [Jani Kinnunen](https://twitter.com/jani_kinnunen)."
|
||||||
msgstr "* Finnois: Jani Kinnunen."
|
msgstr "* Finnois: [Jani Kinnunen](https://twitter.com/jani_kinnunen)."
|
||||||
|
|
||||||
#: ../doc\strings.py:413
|
#: ../doc\strings.py:413
|
||||||
msgid "* French: Rémi Ruiz."
|
msgid "* French: [Rémi Ruiz](https://twitter.com/blindhelp38)."
|
||||||
msgstr "* Français: Rémy Ruiz"
|
msgstr "* Français: [Rémy Ruiz](https://twitter.com/blindhelp38)."
|
||||||
|
|
||||||
#: ../doc\strings.py:414
|
#: ../doc\strings.py:414
|
||||||
msgid "* Galician: [Alba Kinteiro](https://twitter.com/albasmileforeve)."
|
msgid "* Galician: [Juan Buño](https://twitter.com/Quetzatl_)."
|
||||||
msgstr "* Galicien: [Alba Kinteiro](https://twitter.com/albasmileforeve)."
|
msgstr "* Galicien: [Juan Buño](https://twitter.com/Quetzatl_)."
|
||||||
|
|
||||||
#: ../doc\strings.py:415
|
#: ../doc\strings.py:415
|
||||||
msgid "* German: Steffen Schultz."
|
msgid "* German: [Steffen Schultz](https://twitter.com/schulle4u)."
|
||||||
msgstr "*Allemand: Steffen Schultz."
|
msgstr "* Allemand: [Steffen Schultz](https://twitter.com/schulle4u)."
|
||||||
|
|
||||||
#: ../doc\strings.py:416
|
#: ../doc\strings.py:416
|
||||||
|
msgid "* Croatian: [Zvonimir Stanečić](https://twitter.com/zvonimirek222)."
|
||||||
|
msgstr "* Croate: [Zvonimir Stanečić](https://twitter.com/zvonimirek222)."
|
||||||
|
|
||||||
|
#: ../doc\strings.py:417
|
||||||
msgid "* Hungarian: Robert Osztolykan."
|
msgid "* Hungarian: Robert Osztolykan."
|
||||||
msgstr "* Hongrois: Robert Osztolykan."
|
msgstr "* Hongrois: Robert Osztolykan."
|
||||||
|
|
||||||
#: ../doc\strings.py:417
|
|
||||||
msgid "* Polish: Pawel Masarczyk."
|
|
||||||
msgstr "* Polonais: Pawel Masarczyk."
|
|
||||||
|
|
||||||
#: ../doc\strings.py:418
|
#: ../doc\strings.py:418
|
||||||
|
msgid "* Italian: [Christian Leo Mameli](https://twitter.com/llajta2012)."
|
||||||
|
msgstr "* Italien: [Christian Leo Mameli](https://twitter.com/llajta2012)."
|
||||||
|
|
||||||
|
#: ../doc\strings.py:419
|
||||||
|
msgid "* Japanese: [Riku](https://twitter.com/riku_sub001)"
|
||||||
|
msgstr "* Japonais: [Riku](https://twitter.com/riku_sub001)"
|
||||||
|
|
||||||
|
#: ../doc\strings.py:420
|
||||||
|
msgid "* Polish: [Pawel Masarczyk.](https://twitter.com/Piciok)"
|
||||||
|
msgstr "* Polonais: [Pawel Masarczyk.](https://twitter.com/Piciok)"
|
||||||
|
|
||||||
|
#: ../doc\strings.py:421
|
||||||
msgid "* Portuguese: Odenilton Júnior Santos."
|
msgid "* Portuguese: Odenilton Júnior Santos."
|
||||||
msgstr "* Portugais: Odenilton Júnior Santos."
|
msgstr "* Portugais: Odenilton Júnior Santos."
|
||||||
|
|
||||||
#: ../doc\strings.py:419
|
#: ../doc\strings.py:422
|
||||||
msgid "* Russian: Alexander Jaszyn."
|
msgid ""
|
||||||
msgstr "* Russe: Alexander Jaszyn."
|
"* Romanian: [Florian Ionașcu](https://twitter.com/7ro) and [Răzvan Ciule]"
|
||||||
|
"(https://twitter.com/pilgrim89)"
|
||||||
#: ../doc\strings.py:420
|
msgstr ""
|
||||||
msgid "* Turkish: Burak."
|
"* Roumain: [Florian Ionașcu](https://twitter.com/7ro) and [Răzvan Ciule]"
|
||||||
msgstr "* Turc: Burak."
|
"(https://twitter.com/pilgrim89)"
|
||||||
|
|
||||||
#: ../doc\strings.py:423
|
#: ../doc\strings.py:423
|
||||||
|
msgid "* Russian: [Александр Яшин](https://twitter.com/radovest)."
|
||||||
|
msgstr "* Russe: [Александр Яшин](https://twitter.com/radovest)."
|
||||||
|
|
||||||
|
#: ../doc\strings.py:424
|
||||||
|
msgid "* Serbian: [Aleksandar Đurić](https://twitter.com/sokodtreshnje)"
|
||||||
|
msgstr "* Serbe: [Aleksandar Đurić](https://twitter.com/sokodtreshnje)"
|
||||||
|
|
||||||
|
#: ../doc\strings.py:425
|
||||||
|
msgid "* Turkish: [Burak Yüksek](https://twitter.com/burakyuksek)."
|
||||||
|
msgstr "* Turc: [Burak Yüksek](https://twitter.com/burakyuksek)."
|
||||||
|
|
||||||
|
#: ../doc\strings.py:428
|
||||||
msgid ""
|
msgid ""
|
||||||
"Many thanks also to the people who worked on the documentation. Initially, "
|
"Many thanks also to the people who worked on the documentation. Initially, "
|
||||||
"[Manuel Cortez](https://twitter.com/manuelcortez00) did the documentation in "
|
"[Manuel Cortez](https://twitter.com/manuelcortez00) did the documentation in "
|
||||||
@@ -1922,7 +1951,7 @@ msgid ""
|
|||||||
"twitter.com/anibalmetal), and [Holly Scott-Gardner](https://twitter.com/"
|
"twitter.com/anibalmetal), and [Holly Scott-Gardner](https://twitter.com/"
|
||||||
"holly1994). It was updated by [Sukil Etxenike](https://twitter.com/"
|
"holly1994). It was updated by [Sukil Etxenike](https://twitter.com/"
|
||||||
"sukil2011), with some valuable corrections by [Brian Hartgen](https://"
|
"sukil2011), with some valuable corrections by [Brian Hartgen](https://"
|
||||||
"twitter.com/brianhartgen)."
|
"twitter.com/brianhartgen) and [Bill Dengler](https://twitter.com/codeofdusk)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Merci beaucoup aussi à les personnes qui ont travaillé sur la documentation. "
|
"Merci beaucoup aussi à les personnes qui ont travaillé sur la documentation. "
|
||||||
"Au départ, [Manuel Cortez](https://twitter.com/manuelcortez00) a fait la "
|
"Au départ, [Manuel Cortez](https://twitter.com/manuelcortez00) a fait la "
|
||||||
@@ -1932,16 +1961,41 @@ msgstr ""
|
|||||||
"Hernandez](https://twitter.com/anibalmetal), et [Holly Scott-Gardner]"
|
"Hernandez](https://twitter.com/anibalmetal), et [Holly Scott-Gardner]"
|
||||||
"(https://twitter.com/holly1994). Il a été mis à jour par [Sukil Etxenike]"
|
"(https://twitter.com/holly1994). Il a été mis à jour par [Sukil Etxenike]"
|
||||||
"(https://twitter.com/sukil2011), avec quelques corrections précieuses par "
|
"(https://twitter.com/sukil2011), avec quelques corrections précieuses par "
|
||||||
"[Brian Hartgen](https://twitter.com/brianhartgen)."
|
"[Brian Hartgen](https://twitter.com/brianhartgen) et [Bill Dengler](https://"
|
||||||
|
"twitter.com/codeofdusk)."
|
||||||
|
|
||||||
#: ../doc\strings.py:426
|
#: ../doc\strings.py:431
|
||||||
msgid "---"
|
msgid "---"
|
||||||
msgstr "---"
|
msgstr "---"
|
||||||
|
|
||||||
#: ../doc\strings.py:427
|
#: ../doc\strings.py:432
|
||||||
msgid "Copyright © 2013-2015. Manuel Cortéz"
|
msgid "Copyright © 2013-2015. Manuel Cortéz"
|
||||||
msgstr "Copyright © 2013-2015. Manuel Cortéz"
|
msgstr "Copyright © 2013-2015. Manuel Cortéz"
|
||||||
|
|
||||||
|
#~ msgid "* Polish: Pawel Masarczyk."
|
||||||
|
#~ msgstr "* Polonais: Pawel Masarczyk."
|
||||||
|
|
||||||
|
#~ msgid "* Arabic: Mohammed Al Shara."
|
||||||
|
#~ msgstr "* Arabe: Mohammed Al Shara."
|
||||||
|
|
||||||
|
#~ msgid "* Finnish: Jani Kinnunen."
|
||||||
|
#~ msgstr "* Finnois: Jani Kinnunen."
|
||||||
|
|
||||||
|
#~ msgid "* French: Rémi Ruiz."
|
||||||
|
#~ msgstr "* Français: Rémy Ruiz."
|
||||||
|
|
||||||
|
#~ msgid "* German: Steffen Schultz."
|
||||||
|
#~ msgstr "*Allemand: Steffen Schultz."
|
||||||
|
|
||||||
|
#~ msgid "* Russian: Alexander Jaszyn."
|
||||||
|
#~ msgstr "* Russe: Alexander Jaszyn."
|
||||||
|
|
||||||
|
#~ msgid "* Turkish: Burak."
|
||||||
|
#~ msgstr "* Turc: Burak."
|
||||||
|
|
||||||
|
#~ msgid "## TWBlue's interfaces"
|
||||||
|
#~ msgstr "## Interfaces de TWBlue"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid ""
|
#~ msgid ""
|
||||||
#~ "In order to use an application like TW Blue which allows you to manage "
|
#~ "In order to use an application like TW Blue which allows you to manage "
|
||||||
@@ -2094,9 +2148,6 @@ msgstr "Copyright © 2013-2015. Manuel Cortéz"
|
|||||||
#~ msgid "Paste the verification code, and press the enter key. "
|
#~ msgid "Paste the verification code, and press the enter key. "
|
||||||
#~ msgstr "Collez le code de vérification et appuyez sur la touche Entrée."
|
#~ msgstr "Collez le code de vérification et appuyez sur la touche Entrée."
|
||||||
|
|
||||||
#~ msgid "## The program's interface {#interface}"
|
|
||||||
#~ msgstr "## L'interface du programme {#interface}"
|
|
||||||
|
|
||||||
#~ msgid ""
|
#~ msgid ""
|
||||||
#~ "Elements on the lists may be tweets, direct messages or users. TW Blue "
|
#~ "Elements on the lists may be tweets, direct messages or users. TW Blue "
|
||||||
#~ "creates different tabs for each list, which can be sent tweets, main "
|
#~ "creates different tabs for each list, which can be sent tweets, main "
|
||||||
|
BIN
doc/locales/gl/lc_messages/twblue-documentation.mo
Normal file
BIN
doc/locales/gl/lc_messages/twblue-documentation.mo
Normal file
Binary file not shown.
2616
doc/locales/gl/lc_messages/twblue-documentation.po
Normal file
2616
doc/locales/gl/lc_messages/twblue-documentation.po
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -5,8 +5,8 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: TW Blue documentation 0.46\n"
|
"Project-Id-Version: TW Blue documentation 0.46\n"
|
||||||
"POT-Creation-Date: 2015-07-03 17:23+Hora de verano central (Mxico)\n"
|
"POT-Creation-Date: 2016-03-31 16:51+Hora de verano romance\n"
|
||||||
"PO-Revision-Date: 2015-07-04 19:56+0100\n"
|
"PO-Revision-Date: 2016-06-06 14:11+0100\n"
|
||||||
"Last-Translator: Chris Leo Mameli <llajta2012@gmail.com>\n"
|
"Last-Translator: Chris Leo Mameli <llajta2012@gmail.com>\n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
"Language: it\n"
|
"Language: it\n"
|
||||||
@@ -54,7 +54,7 @@ msgstr "Guida per TWBlue - {0}"
|
|||||||
#: ../doc\strings.py:378 ../doc\strings.py:381 ../doc\strings.py:384
|
#: ../doc\strings.py:378 ../doc\strings.py:381 ../doc\strings.py:384
|
||||||
#: ../doc\strings.py:387 ../doc\strings.py:390 ../doc\strings.py:393
|
#: ../doc\strings.py:387 ../doc\strings.py:390 ../doc\strings.py:393
|
||||||
#: ../doc\strings.py:396 ../doc\strings.py:399 ../doc\strings.py:402
|
#: ../doc\strings.py:396 ../doc\strings.py:399 ../doc\strings.py:402
|
||||||
#: ../doc\strings.py:405 ../doc\strings.py:421 ../doc\strings.py:424
|
#: ../doc\strings.py:405 ../doc\strings.py:426 ../doc\strings.py:429
|
||||||
msgid "\n"
|
msgid "\n"
|
||||||
msgstr "\n"
|
msgstr "\n"
|
||||||
|
|
||||||
@@ -156,10 +156,11 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Twitter è un social network o strumento di micro-blogging che consente di "
|
"Twitter è un social network o strumento di micro-blogging che consente di "
|
||||||
"pubblicare gli aggiornamenti di stato delle vostre attività in 140 caratteri "
|
"pubblicare gli aggiornamenti di stato delle vostre attività in 140 caratteri "
|
||||||
"o meno. Twitter is a way for friends, family and co-workers to communicate "
|
"o meno. È un modo per comunicare con amici, parenti, colleghi e rimanere in "
|
||||||
"and stay connected through the exchange of quick, frequent messages. You can "
|
"contatto attraverso lo scambio frequente e rapido di messaggi. È possibile "
|
||||||
"restrict delivery of updates to those in your circle of friends or, by "
|
"limitare la visualizzazione degli aggiornamenti alla tua cerchia di amici o, "
|
||||||
"default, allow anyone to access them."
|
"modificando come impostazione predefinita, consentire a chiunque di "
|
||||||
|
"accedervi."
|
||||||
|
|
||||||
#: ../doc\strings.py:45
|
#: ../doc\strings.py:45
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -235,16 +236,16 @@ msgid ""
|
|||||||
"continue. Activate the \"yes\" Button by pressing the letter \"Y\" so the "
|
"continue. Activate the \"yes\" Button by pressing the letter \"Y\" so the "
|
||||||
"process may start."
|
"process may start."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"TWBlue consente di monitorare più account Twitter. Il programma fa "
|
"TWBlue consente di gestire più account Twitter. Il programma fa riferimento "
|
||||||
"riferimento a ogni account Twitter che è stato configurato come una "
|
"a ogni account Twitter che è stato configurato come una \"Sessione\". Se "
|
||||||
"\"Sessione\". Se questa è la prima volta che avete avviato TWBlue, e se "
|
"questa è la prima volta che avete avviato TWBlue, e se nessuna sessione "
|
||||||
"nessuna sessione esiste, verrà visualizzato il gestore sessione. Questa "
|
"esiste, verrà visualizzato il gestore sessione. Questa finestra di dialogo "
|
||||||
"finestra di dialogo consente di autorizzare l'account che si desidera. Se si "
|
"consente di autorizzare l'account che si desidera. Se si preme il tasto Tab "
|
||||||
"preme il tasto Tab fino al pulsante \"Nuovo account\" e lo attivate con la "
|
"fino al pulsante \"Nuovo account\" e lo attivate con la barra spaziatrice, "
|
||||||
"barra spaziatrice, una finestra di dialogo vi informerà che il browser "
|
"una finestra di dialogo vi informerà che si aprirà il browser internet "
|
||||||
"internet predefinito sarà aperto al fine di autorizzare l'applicazione e vi "
|
"predefinito al fine di autorizzare l'applicazione e vi verrà chiesto se si "
|
||||||
"verrà chiesto se si desidera continuare. Attivare il pulsante \"Si\" con la "
|
"desidera continuare. Attivare il pulsante \"Si\" con la lettera \"S\" in "
|
||||||
"lettera \"S\" in modo che il processo può iniziare."
|
"modo che il processo possa iniziare."
|
||||||
|
|
||||||
#: ../doc\strings.py:63
|
#: ../doc\strings.py:63
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -296,9 +297,8 @@ msgid ""
|
|||||||
"sound, and the screen reader will say \"ready\" (this behaviour can be "
|
"sound, and the screen reader will say \"ready\" (this behaviour can be "
|
||||||
"configured)."
|
"configured)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Se tutto è andato a buon fine, l'applicazione riproduce un set di suoni che "
|
"Al termine del processo, si udirà un altro suono di avvio e lo Screen Reader "
|
||||||
"confermano che si stanno aggiornando i tuoi dati.Al termine, si udirà un "
|
"annuncerà \"Pronto!\"."
|
||||||
"altro suono di avvio e lo Screen Reader annuncerà \"Pronto!\"."
|
|
||||||
|
|
||||||
#: ../doc\strings.py:78
|
#: ../doc\strings.py:78
|
||||||
msgid "## General concepts"
|
msgid "## General concepts"
|
||||||
@@ -345,9 +345,8 @@ msgid ""
|
|||||||
"* Home: this shows all the tweets on the main timeline. These are the tweets "
|
"* Home: this shows all the tweets on the main timeline. These are the tweets "
|
||||||
"by users you follow."
|
"by users you follow."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Cronologia principale: quì verranno visualizzati i Tweet nella linea "
|
"* Cronologia principale: quì verranno visualizzati i Tweet della Cronologia "
|
||||||
"temporale principale. Sono i Tweet degli utenti che stiamo seguendo "
|
"principale. Sono i Tweet degli utenti che stiamo seguendo attualmente."
|
||||||
"attualmente."
|
|
||||||
|
|
||||||
#: ../doc\strings.py:94
|
#: ../doc\strings.py:94
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -645,12 +644,12 @@ msgid ""
|
|||||||
"and mention buttons will be available."
|
"and mention buttons will be available."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Si noti che i pulsanti appariranno a seconda delle azioni che possono essere "
|
"Si noti che i pulsanti appariranno a seconda delle azioni che possono essere "
|
||||||
"eseguite nel buffer focalizzato. Per esempio, nella linea temporale "
|
"eseguite nel buffer focalizzato. Per esempio, nella Cronologia principale e "
|
||||||
"principale e specifica, menzioni, inviati, e preferiti verranno visualizzati "
|
"specifica, menzioni, inviati, e preferiti verranno visualizzati i quattro "
|
||||||
"i quattro pulsanti comuni. Invece nella scheda messaggi Diretti saranno "
|
"pulsanti comuni. Invece nella scheda messaggi Diretti saranno presenti i "
|
||||||
"presenti i pulsanti \"Messaggio Diretto\" e \"tweet\", mentre negli elenchi "
|
"pulsanti \"Messaggio Diretto\" e \"tweet\", mentre negli elenchi dei "
|
||||||
"dei follower o following appare il pulsante \"Twit\" e \"Messaggio Diretto\" "
|
"follower o following appare il pulsante \"Twit\" e \"Messaggio Diretto\" più "
|
||||||
"con quello \"Menziona\"."
|
"quello \"Menziona\"."
|
||||||
|
|
||||||
#: ../doc\strings.py:149
|
#: ../doc\strings.py:149
|
||||||
msgid "#### Menus"
|
msgid "#### Menus"
|
||||||
@@ -752,12 +751,13 @@ msgstr ""
|
|||||||
|
|
||||||
#: ../doc\strings.py:166
|
#: ../doc\strings.py:166
|
||||||
msgid ""
|
msgid ""
|
||||||
"* Quit: asks whether you want to exit the program. If the answer is yes, it "
|
"* Exit: asks whether you want to exit the program. If the answer is yes, it "
|
||||||
"closes the application. If you do not want to be asked for confirmation "
|
"closes the application. If you do not want to be asked for confirmation "
|
||||||
"before exiting, uncheck the checkbox from the global settings dialogue box."
|
"before exiting, uncheck the checkbox from the global settings dialogue box."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Esci: apre una finestra di dialogo per la conferma in caso si vuol uscire "
|
"* Esci: apre una finestra di dialogo per la conferma in caso si vuol uscire "
|
||||||
"dal programma."
|
"dal programma. Una volta premuto il pulsante ok verrà chiusa l'applicazione. "
|
||||||
|
"Per non richiedere più la conferma, impostare dalle impostazioni generali."
|
||||||
|
|
||||||
#: ../doc\strings.py:169
|
#: ../doc\strings.py:169
|
||||||
msgid "##### Tweet menu"
|
msgid "##### Tweet menu"
|
||||||
@@ -1635,7 +1635,7 @@ msgid ""
|
|||||||
"option is checked, the invisible interface's shortcuts will be usable in the "
|
"option is checked, the invisible interface's shortcuts will be usable in the "
|
||||||
"GUI."
|
"GUI."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"* Utilizza i comandi per l'interfaccia invisibile nella interfaccia grafica: "
|
"* Utilizza i comandi per l'interfaccia invisibile nell'interfaccia grafica: "
|
||||||
"Poiché l'interfaccia invisibile e l'interfaccia grafica utente hanno comandi "
|
"Poiché l'interfaccia invisibile e l'interfaccia grafica utente hanno comandi "
|
||||||
"propri, si potrebbe voler usare i comandi dell'interfaccia invisibile "
|
"propri, si potrebbe voler usare i comandi dell'interfaccia invisibile "
|
||||||
"sempre. Se questa opzione è attivata, i comandi dell'interfaccia invisibile "
|
"sempre. Se questa opzione è attivata, i comandi dell'interfaccia invisibile "
|
||||||
@@ -1768,8 +1768,8 @@ msgstr ""
|
|||||||
"Dengler](https://twitter.com/codeofdusk)."
|
"Dengler](https://twitter.com/codeofdusk)."
|
||||||
|
|
||||||
#: ../doc\strings.py:408
|
#: ../doc\strings.py:408
|
||||||
msgid "* Arabic: Mohammed Al Shara."
|
msgid "* Arabic: [Mohammed Al Shara](https://twitter.com/mohammed0204)."
|
||||||
msgstr "* Arabo: Mohammed Al Shara."
|
msgstr "* Arabo: [Mohammed Al Shara](https://twitter.com/mohammed0204)."
|
||||||
|
|
||||||
#: ../doc\strings.py:409
|
#: ../doc\strings.py:409
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -1788,42 +1788,66 @@ msgid "* Basque: [Sukil Etxenike](https://twitter.com/sukil2011)."
|
|||||||
msgstr "* Basco: [Sukil Etxenike](https://twitter.com/sukil2011)."
|
msgstr "* Basco: [Sukil Etxenike](https://twitter.com/sukil2011)."
|
||||||
|
|
||||||
#: ../doc\strings.py:412
|
#: ../doc\strings.py:412
|
||||||
msgid "* Finnish: Jani Kinnunen."
|
msgid "* Finnish: [Jani Kinnunen](https://twitter.com/jani_kinnunen)."
|
||||||
msgstr "* Finlandese: Jani Kinnunen."
|
msgstr "* Finlandese: [Jani Kinnunen](https://twitter.com/jani_kinnunen)."
|
||||||
|
|
||||||
#: ../doc\strings.py:413
|
#: ../doc\strings.py:413
|
||||||
msgid "* French: Rémi Ruiz."
|
msgid "* French: [Rémi Ruiz](https://twitter.com/blindhelp38)."
|
||||||
msgstr "* Francese: Rémi Ruiz."
|
msgstr "* Francese: [Rémi Ruiz](https://twitter.com/blindhelp38)."
|
||||||
|
|
||||||
#: ../doc\strings.py:414
|
#: ../doc\strings.py:414
|
||||||
msgid "* Galician: [Alba Kinteiro](https://twitter.com/albasmileforeve)."
|
msgid "* Galician: [Juan Buño](https://twitter.com/Quetzatl_)."
|
||||||
msgstr "* Galiziano: [Alba Kinteiro](https://twitter.com/albasmileforeve)."
|
msgstr "* Galiziano: [Juan Buño](https://twitter.com/Quetzatl_)."
|
||||||
|
|
||||||
#: ../doc\strings.py:415
|
#: ../doc\strings.py:415
|
||||||
msgid "* German: Steffen Schultz."
|
msgid "* German: [Steffen Schultz](https://twitter.com/schulle4u)."
|
||||||
msgstr "* Tedesco: Steffen Schultz."
|
msgstr "* Tedesco: [Steffen Schultz](https://twitter.com/schulle4u)."
|
||||||
|
|
||||||
#: ../doc\strings.py:416
|
#: ../doc\strings.py:416
|
||||||
|
msgid "* Croatian: [Zvonimir Stanečić](https://twitter.com/zvonimirek222)."
|
||||||
|
msgstr "* Croato: [Zvonimir Stanečić](https://twitter.com/zvonimirek222)."
|
||||||
|
|
||||||
|
#: ../doc\strings.py:417
|
||||||
msgid "* Hungarian: Robert Osztolykan."
|
msgid "* Hungarian: Robert Osztolykan."
|
||||||
msgstr "* Ungherese: Robert Osztolykan."
|
msgstr "* Ungherese: Robert Osztolykan."
|
||||||
|
|
||||||
#: ../doc\strings.py:417
|
|
||||||
msgid "* Polish: Pawel Masarczyk."
|
|
||||||
msgstr "* Polacco: Pawel Masarczyk."
|
|
||||||
|
|
||||||
#: ../doc\strings.py:418
|
#: ../doc\strings.py:418
|
||||||
|
msgid "* Italian: [Christian Leo Mameli](https://twitter.com/llajta2012)."
|
||||||
|
msgstr "* Italiano: [Christian Leo Mameli](https://twitter.com/llajta2012)."
|
||||||
|
|
||||||
|
#: ../doc\strings.py:419
|
||||||
|
msgid "* Japanese: [Riku](https://twitter.com/riku_sub001)"
|
||||||
|
msgstr "* Giapponese: [Riku](https://twitter.com/riku_sub001)"
|
||||||
|
|
||||||
|
#: ../doc\strings.py:420
|
||||||
|
msgid "* Polish: [Pawel Masarczyk.](https://twitter.com/Piciok)"
|
||||||
|
msgstr "* Polacco: [Pawel Masarczyk.](https://twitter.com/Piciok)"
|
||||||
|
|
||||||
|
#: ../doc\strings.py:421
|
||||||
msgid "* Portuguese: Odenilton Júnior Santos."
|
msgid "* Portuguese: Odenilton Júnior Santos."
|
||||||
msgstr "* Portoghese: Odenilton Júnior Santos."
|
msgstr "* Portoghese: Odenilton Júnior Santos."
|
||||||
|
|
||||||
#: ../doc\strings.py:419
|
#: ../doc\strings.py:422
|
||||||
msgid "* Russian: Alexander Jaszyn."
|
msgid ""
|
||||||
msgstr "* Russo: Alexander Jaszyn."
|
"* Romanian: [Florian Ionașcu](https://twitter.com/7ro) and [Răzvan Ciule]"
|
||||||
|
"(https://twitter.com/pilgrim89)"
|
||||||
#: ../doc\strings.py:420
|
msgstr ""
|
||||||
msgid "* Turkish: Burak."
|
"* Romeno: [Florian Ionașcu](https://twitter.com/7ro) and [Răzvan Ciule]"
|
||||||
msgstr "* Turco: Burak."
|
"(https://twitter.com/pilgrim89)"
|
||||||
|
|
||||||
#: ../doc\strings.py:423
|
#: ../doc\strings.py:423
|
||||||
|
msgid "* Russian: [Александр Яшин](https://twitter.com/radovest)."
|
||||||
|
msgstr "* Russo: [Александр Яшин](https://twitter.com/radovest)."
|
||||||
|
|
||||||
|
#: ../doc\strings.py:424
|
||||||
|
msgid "* Serbian: [Aleksandar Đurić](https://twitter.com/sokodtreshnje)"
|
||||||
|
msgstr "* Serbo: [Aleksandar Đurić](https://twitter.com/sokodtreshnje)"
|
||||||
|
|
||||||
|
#: ../doc\strings.py:425
|
||||||
|
msgid "* Turkish: [Burak Yüksek](https://twitter.com/burakyuksek)."
|
||||||
|
msgstr "* Turco: [Burak Yüksek](https://twitter.com/burakyuksek)."
|
||||||
|
|
||||||
|
#: ../doc\strings.py:428
|
||||||
msgid ""
|
msgid ""
|
||||||
"Many thanks also to the people who worked on the documentation. Initially, "
|
"Many thanks also to the people who worked on the documentation. Initially, "
|
||||||
"[Manuel Cortez](https://twitter.com/manuelcortez00) did the documentation in "
|
"[Manuel Cortez](https://twitter.com/manuelcortez00) did the documentation in "
|
||||||
@@ -1844,16 +1868,37 @@ msgstr ""
|
|||||||
"Gardner](https://twitter.com/holly1994). E aggiornato da [Sukil Etxenike]"
|
"Gardner](https://twitter.com/holly1994). E aggiornato da [Sukil Etxenike]"
|
||||||
"(https://twitter.com/sukil2011), con alcune correzioni di [Brian Hartgen]"
|
"(https://twitter.com/sukil2011), con alcune correzioni di [Brian Hartgen]"
|
||||||
"(https://twitter.com/brianhartgen) e [Bill Dengler](https://twitter.com/"
|
"(https://twitter.com/brianhartgen) e [Bill Dengler](https://twitter.com/"
|
||||||
"codeofdusk).."
|
"codeofdusk)"
|
||||||
|
|
||||||
#: ../doc\strings.py:426
|
#: ../doc\strings.py:431
|
||||||
msgid "---"
|
msgid "---"
|
||||||
msgstr "---"
|
msgstr "---"
|
||||||
|
|
||||||
#: ../doc\strings.py:427
|
#: ../doc\strings.py:432
|
||||||
msgid "Copyright © 2013-2015. Manuel Cortéz"
|
msgid "Copyright © 2013-2015. Manuel Cortéz"
|
||||||
msgstr "Copyright ©2013-2015. Manuel Cortéz"
|
msgstr "Copyright ©2013-2015. Manuel Cortéz"
|
||||||
|
|
||||||
|
#~ msgid "* Polish: Pawel Masarczyk."
|
||||||
|
#~ msgstr "* Polacco: Pawel Masarczyk."
|
||||||
|
|
||||||
|
#~ msgid "* Arabic: Mohammed Al Shara."
|
||||||
|
#~ msgstr "* Arabo: Mohammed Al Shara."
|
||||||
|
|
||||||
|
#~ msgid "* Finnish: Jani Kinnunen."
|
||||||
|
#~ msgstr "* Finlandese: Jani Kinnunen."
|
||||||
|
|
||||||
|
#~ msgid "* French: Rémi Ruiz."
|
||||||
|
#~ msgstr "* Francese: Rémi Ruiz."
|
||||||
|
|
||||||
|
#~ msgid "* German: Steffen Schultz."
|
||||||
|
#~ msgstr "* Tedesco: Steffen Schultz."
|
||||||
|
|
||||||
|
#~ msgid "* Russian: Alexander Jaszyn."
|
||||||
|
#~ msgstr "* Russo: Alexander Jaszyn."
|
||||||
|
|
||||||
|
#~ msgid "* Turkish: Burak."
|
||||||
|
#~ msgstr "* Turco: Burak."
|
||||||
|
|
||||||
#~ msgid "## TWBlue's interfaces"
|
#~ msgid "## TWBlue's interfaces"
|
||||||
#~ msgstr "## Le interfaccie TWBlue"
|
#~ msgstr "## Le interfaccie TWBlue"
|
||||||
|
|
||||||
|
BIN
doc/locales/ja/lc_messages/twblue-documentation.mo
Normal file
BIN
doc/locales/ja/lc_messages/twblue-documentation.mo
Normal file
Binary file not shown.
1668
doc/locales/ja/lc_messages/twblue-documentation.po
Normal file
1668
doc/locales/ja/lc_messages/twblue-documentation.po
Normal file
File diff suppressed because it is too large
Load Diff
BIN
doc/locales/ro/LC_MESSAGES/twblue-documentation.mo
Normal file
BIN
doc/locales/ro/LC_MESSAGES/twblue-documentation.mo
Normal file
Binary file not shown.
2581
doc/locales/ro/LC_MESSAGES/twblue-documentation.po
Normal file
2581
doc/locales/ro/LC_MESSAGES/twblue-documentation.po
Normal file
File diff suppressed because it is too large
Load Diff
BIN
doc/locales/ru/lc_messages/twblue-documentation.mo
Normal file
BIN
doc/locales/ru/lc_messages/twblue-documentation.mo
Normal file
Binary file not shown.
1683
doc/locales/ru/lc_messages/twblue-documentation.po
Normal file
1683
doc/locales/ru/lc_messages/twblue-documentation.po
Normal file
File diff suppressed because it is too large
Load Diff
@@ -163,7 +163,7 @@ documentation.append(_(u"""* Lists Manager: This dialogue box allows you to mana
|
|||||||
documentation.append(_(u"""* Edit keystrokes: this opens a dialogue where you can see and edit the shortcuts used in the invisible interface."""))
|
documentation.append(_(u"""* Edit keystrokes: this opens a dialogue where you can see and edit the shortcuts used in the invisible interface."""))
|
||||||
documentation.append(_(u"""* Account settings: Opens a dialogue box which lets you customize settings for the current account."""))
|
documentation.append(_(u"""* Account settings: Opens a dialogue box which lets you customize settings for the current account."""))
|
||||||
documentation.append(_(u"""* Global settings: Opens a dialogue which lets you configure settings for the entire application."""))
|
documentation.append(_(u"""* Global settings: Opens a dialogue which lets you configure settings for the entire application."""))
|
||||||
documentation.append(_(u"""* Quit: asks whether you want to exit the program. If the answer is yes, it closes the application. If you do not want to be asked for confirmation before exiting, uncheck the checkbox from the global settings dialogue box."""))
|
documentation.append(_(u"""* Exit: asks whether you want to exit the program. If the answer is yes, it closes the application. If you do not want to be asked for confirmation before exiting, uncheck the checkbox from the global settings dialogue box."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""##### Tweet menu"""))
|
documentation.append(_(u"""##### Tweet menu"""))
|
||||||
@@ -405,19 +405,24 @@ documentation.append(_(u"""We would also like to thank the translators of TWBlue
|
|||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""* English: [Bryner Villalobos](https://twitter.com/Bry_StarkCR) and [Bill Dengler](https://twitter.com/codeofdusk)."""))
|
documentation.append(_(u"""* English: [Bryner Villalobos](https://twitter.com/Bry_StarkCR) and [Bill Dengler](https://twitter.com/codeofdusk)."""))
|
||||||
documentation.append(_(u"""* Arabic: Mohammed Al Shara."""))
|
documentation.append(_(u"""* Arabic: [Mohammed Al Shara](https://twitter.com/mohammed0204)."""))
|
||||||
documentation.append(_(u"""* Catalan: [Joan Rabat](https://twitter.com/joanrabat) and Juan Carlos Rivilla."""))
|
documentation.append(_(u"""* Catalan: [Joan Rabat](https://twitter.com/joanrabat) and Juan Carlos Rivilla."""))
|
||||||
documentation.append(_(u"""* Spanish: [Manuel Cortéz](https://twitter.com/manuelcortez00)."""))
|
documentation.append(_(u"""* Spanish: [Manuel Cortéz](https://twitter.com/manuelcortez00)."""))
|
||||||
documentation.append(_(u"""* Basque: [Sukil Etxenike](https://twitter.com/sukil2011)."""))
|
documentation.append(_(u"""* Basque: [Sukil Etxenike](https://twitter.com/sukil2011)."""))
|
||||||
documentation.append(_(u"""* Finnish: Jani Kinnunen."""))
|
documentation.append(_(u"""* Finnish: [Jani Kinnunen](https://twitter.com/jani_kinnunen)."""))
|
||||||
documentation.append(_(u"""* French: Rémi Ruiz."""))
|
documentation.append(_(u"""* French: [Rémi Ruiz](https://twitter.com/blindhelp38)."""))
|
||||||
documentation.append(_(u"""* Galician: [Alba Kinteiro](https://twitter.com/albasmileforeve)."""))
|
documentation.append(_(u"""* Galician: [Juan Buño](https://twitter.com/Quetzatl_)."""))
|
||||||
documentation.append(_(u"""* German: Steffen Schultz."""))
|
documentation.append(_(u"""* German: [Steffen Schultz](https://twitter.com/schulle4u)."""))
|
||||||
|
documentation.append(_(u"""* Croatian: [Zvonimir Stanečić](https://twitter.com/zvonimirek222)."""))
|
||||||
documentation.append(_(u"""* Hungarian: Robert Osztolykan."""))
|
documentation.append(_(u"""* Hungarian: Robert Osztolykan."""))
|
||||||
documentation.append(_(u"""* Polish: Pawel Masarczyk."""))
|
documentation.append(_(u"""* Italian: [Christian Leo Mameli](https://twitter.com/llajta2012)."""))
|
||||||
|
documentation.append(_(u"""* Japanese: [Riku](https://twitter.com/riku_sub001)"""))
|
||||||
|
documentation.append(_(u"""* Polish: [Pawel Masarczyk.](https://twitter.com/Piciok)"""))
|
||||||
documentation.append(_(u"""* Portuguese: Odenilton Júnior Santos."""))
|
documentation.append(_(u"""* Portuguese: Odenilton Júnior Santos."""))
|
||||||
documentation.append(_(u"""* Russian: Alexander Jaszyn."""))
|
documentation.append(_(u"""* Romanian: [Florian Ionașcu](https://twitter.com/7ro) and [Răzvan Ciule](https://twitter.com/pilgrim89)"""))
|
||||||
documentation.append(_(u"""* Turkish: Burak."""))
|
documentation.append(_(u"""* Russian: [Александр Яшин](https://twitter.com/radovest)."""))
|
||||||
|
documentation.append(_(u"""* Serbian: [Aleksandar Đurić](https://twitter.com/sokodtreshnje)"""))
|
||||||
|
documentation.append(_(u"""* Turkish: [Burak Yüksek](https://twitter.com/burakyuksek)."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""Many thanks also to the people who worked on the documentation. Initially, [Manuel Cortez](https://twitter.com/manuelcortez00) did the documentation in Spanish, and translated to English by [Bryner Villalobos](https://twitter.com/Bry_StarkCR), [Robert Spangler](https://twitter.com/glasscity1837), [Sussan Rey](https://twitter.com/sussanrey17), [Anibal Hernandez](https://twitter.com/anibalmetal), and [Holly Scott-Gardner](https://twitter.com/holly1994). It was updated by [Sukil Etxenike](https://twitter.com/sukil2011), with some valuable corrections by [Brian Hartgen](https://twitter.com/brianhartgen) and [Bill Dengler](https://twitter.com/codeofdusk)."""))
|
documentation.append(_(u"""Many thanks also to the people who worked on the documentation. Initially, [Manuel Cortez](https://twitter.com/manuelcortez00) did the documentation in Spanish, and translated to English by [Bryner Villalobos](https://twitter.com/Bry_StarkCR), [Robert Spangler](https://twitter.com/glasscity1837), [Sussan Rey](https://twitter.com/sussanrey17), [Anibal Hernandez](https://twitter.com/anibalmetal), and [Holly Scott-Gardner](https://twitter.com/holly1994). It was updated by [Sukil Etxenike](https://twitter.com/sukil2011), with some valuable corrections by [Brian Hartgen](https://twitter.com/brianhartgen) and [Bill Dengler](https://twitter.com/codeofdusk)."""))
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
[Launch]
|
[Launch]
|
||||||
ProgramExecutable=TWBlue\TWBlue.exe
|
ProgramExecutable=TWBlue\TWBlue.exe
|
||||||
ProgramExecutable64=TWBlue64\TWBlue.exe
|
ProgramExecutable64=TWBlue64\TWBlue.exe
|
||||||
CommandLineArguments=-p -d "%PAL:DataDir%"
|
CommandLineArguments=-d "%PAL:DataDir%"
|
||||||
SinglePortableAppInstance=true
|
SinglePortableAppInstance=true
|
||||||
MinOS=XP
|
MinOS=XP
|
||||||
SingleAppInstance=false
|
SingleAppInstance=false
|
||||||
|
@@ -1,11 +1,11 @@
|
|||||||
[Format]
|
[Format]
|
||||||
Type=PortableApps.comFormat
|
Type=PortableApps.comFormat
|
||||||
Version=3.0
|
Version=3.3
|
||||||
|
|
||||||
[Details]
|
[Details]
|
||||||
Name=TWBlue portable
|
Name=tw blue portable
|
||||||
AppID=TWBluePortable
|
AppID=TWBluePortable
|
||||||
Publisher=jmdaweb & TWBlue & PortableApps.com
|
Publisher=jmdaweb & TW blue & PortableApps.com
|
||||||
Homepage=PortableApps.com/TWBluePortable
|
Homepage=PortableApps.com/TWBluePortable
|
||||||
Category=Internet
|
Category=Internet
|
||||||
Description=A portable, fast and accessible Twitter client with many options.
|
Description=A portable, fast and accessible Twitter client with many options.
|
||||||
@@ -20,8 +20,8 @@ CommercialUse=true
|
|||||||
EULAVersion=2
|
EULAVersion=2
|
||||||
|
|
||||||
[Version]
|
[Version]
|
||||||
PackageVersion=0.80.0.0
|
PackageVersion=0.84.0.0
|
||||||
DisplayVersion=0.80
|
DisplayVersion=0.84
|
||||||
|
|
||||||
[Control]
|
[Control]
|
||||||
Icons=1
|
Icons=1
|
||||||
|
@@ -8,10 +8,14 @@ FINNISH=true
|
|||||||
FRENCH=true
|
FRENCH=true
|
||||||
GALICIAN=true
|
GALICIAN=true
|
||||||
GERMAN=true
|
GERMAN=true
|
||||||
|
CROATIAN=true
|
||||||
HUNGARIAN=true
|
HUNGARIAN=true
|
||||||
ITALIAN=true
|
ITALIAN=true
|
||||||
|
JAPANESE=true
|
||||||
POLISH=true
|
POLISH=true
|
||||||
PORTUGUESEBR=true
|
PORTUGUESEBR=true
|
||||||
|
ROMANIAN=true
|
||||||
RUSSIAN=true
|
RUSSIAN=true
|
||||||
|
SERBIAN=true
|
||||||
SPANISHINTERNATIONAL=true
|
SPANISHINTERNATIONAL=true
|
||||||
TURKISH=true
|
TURKISH=true
|
@@ -2,7 +2,7 @@
|
|||||||
<html lang="en-US">
|
<html lang="en-US">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<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="alternate" href="http://portableapps.com/feeds/general" type="application/rss+xml" title="PortableApps.com">
|
||||||
<link rel="shortcut icon" href="Other/Help/Images/Favicon.ico">
|
<link rel="shortcut icon" href="Other/Help/Images/Favicon.ico">
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
@@ -125,13 +125,13 @@
|
|||||||
<body>
|
<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="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">
|
<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>
|
<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/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><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>
|
<p>This software is OSI Certified Open Source Software. OSI Certified is a certification mark of the Open Source Initiative.</p>
|
||||||
|
@@ -12,10 +12,10 @@ SetCompress auto
|
|||||||
SetCompressor /solid lzma
|
SetCompressor /solid lzma
|
||||||
SetDatablockOptimize on
|
SetDatablockOptimize on
|
||||||
VIAddVersionKey ProductName "TWBlue"
|
VIAddVersionKey ProductName "TWBlue"
|
||||||
VIAddVersionKey LegalCopyright "Copyright 2015 Manuel Cortéz."
|
VIAddVersionKey LegalCopyright "Copyright 2016 Manuel Cortéz."
|
||||||
VIAddVersionKey ProductVersion "0.80"
|
VIAddVersionKey ProductVersion "0.84"
|
||||||
VIAddVersionKey FileVersion "0.80"
|
VIAddVersionKey FileVersion "0.84"
|
||||||
VIProductVersion "0.80.0.0"
|
VIProductVersion "0.84.0.0"
|
||||||
!insertmacro MUI_PAGE_WELCOME
|
!insertmacro MUI_PAGE_WELCOME
|
||||||
!define MUI_LICENSEPAGE_RADIOBUTTONS
|
!define MUI_LICENSEPAGE_RADIOBUTTONS
|
||||||
!insertmacro MUI_PAGE_LICENSE "license.txt"
|
!insertmacro MUI_PAGE_LICENSE "license.txt"
|
||||||
@@ -26,7 +26,6 @@ var StartMenuFolder
|
|||||||
!define MUI_FINISHPAGE_LINK "Visit TWBlue website"
|
!define MUI_FINISHPAGE_LINK "Visit TWBlue website"
|
||||||
!define MUI_FINISHPAGE_LINK_LOCATION "http://twblue.es"
|
!define MUI_FINISHPAGE_LINK_LOCATION "http://twblue.es"
|
||||||
!define MUI_FINISHPAGE_RUN "$INSTDIR\TWBlue.exe"
|
!define MUI_FINISHPAGE_RUN "$INSTDIR\TWBlue.exe"
|
||||||
!define MUI_FINISHPAGE_RUN_PARAMETERS "-i"
|
|
||||||
!insertmacro MUI_PAGE_FINISH
|
!insertmacro MUI_PAGE_FINISH
|
||||||
!insertmacro MUI_UNPAGE_CONFIRM
|
!insertmacro MUI_UNPAGE_CONFIRM
|
||||||
!insertmacro MUI_UNPAGE_INSTFILES
|
!insertmacro MUI_UNPAGE_INSTFILES
|
||||||
@@ -45,6 +44,10 @@ var StartMenuFolder
|
|||||||
!insertmacro MUI_LANGUAGE "Galician"
|
!insertmacro MUI_LANGUAGE "Galician"
|
||||||
!insertmacro MUI_LANGUAGE "Catalan"
|
!insertmacro MUI_LANGUAGE "Catalan"
|
||||||
!insertmacro MUI_LANGUAGE "Basque"
|
!insertmacro MUI_LANGUAGE "Basque"
|
||||||
|
!insertmacro MUI_LANGUAGE "Croatian"
|
||||||
|
!insertmacro MUI_LANGUAGE "Japanese"
|
||||||
|
!insertmacro MUI_LANGUAGE "SerbianLatin"
|
||||||
|
!insertmacro MUI_LANGUAGE "Romanian"
|
||||||
!insertmacro MUI_RESERVEFILE_LANGDLL
|
!insertmacro MUI_RESERVEFILE_LANGDLL
|
||||||
Section
|
Section
|
||||||
SetShellVarContext All
|
SetShellVarContext All
|
||||||
@@ -54,10 +57,10 @@ File /r TWBlue64\*
|
|||||||
${Else}
|
${Else}
|
||||||
File /r TWBlue\*
|
File /r TWBlue\*
|
||||||
${EndIf}
|
${EndIf}
|
||||||
CreateShortCut "$DESKTOP\TWBlue.lnk" "$INSTDIR\TWBlue.exe" "-i"
|
CreateShortCut "$DESKTOP\TWBlue.lnk" "$INSTDIR\TWBlue.exe"
|
||||||
!insertmacro MUI_STARTMENU_WRITE_BEGIN startmenu
|
!insertmacro MUI_STARTMENU_WRITE_BEGIN startmenu
|
||||||
CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
|
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\TWBlue on the web.lnk" "http://twblue.es"
|
||||||
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
|
CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
|
||||||
!insertmacro MUI_STARTMENU_WRITE_END
|
!insertmacro MUI_STARTMENU_WRITE_END
|
||||||
@@ -66,10 +69,10 @@ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "D
|
|||||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "UninstallString" '"$INSTDIR\uninstall.exe"'
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "UninstallString" '"$INSTDIR\uninstall.exe"'
|
||||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall" "InstallLocation" $INSTDIR
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall" "InstallLocation" $INSTDIR
|
||||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall" "Publisher" "Manuel Cortéz"
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall" "Publisher" "Manuel Cortéz"
|
||||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "DisplayVersion" "0.80"
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "DisplayVersion" "0.84"
|
||||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "URLInfoAbout" "http://twblue.es"
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "URLInfoAbout" "http://twblue.es"
|
||||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "VersionMajor" 0
|
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "VersionMajor" 0
|
||||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "VersionMinor" 80
|
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "VersionMinor" 84
|
||||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "NoModify" 1
|
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "NoModify" 1
|
||||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "NoRepair" 1
|
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "NoRepair" 1
|
||||||
SectionEnd
|
SectionEnd
|
||||||
|
@@ -28,6 +28,8 @@ timelines = list(default=list())
|
|||||||
tweet_searches = list(default=list())
|
tweet_searches = list(default=list())
|
||||||
lists = list(default=list())
|
lists = list(default=list())
|
||||||
favourites_timelines = list(default=list())
|
favourites_timelines = list(default=list())
|
||||||
|
followers_timelines = list(default=list())
|
||||||
|
friends_timelines = list(default=list())
|
||||||
trending_topic_buffers = list(default=list())
|
trending_topic_buffers = list(default=list())
|
||||||
muted_buffers = list(default=list())
|
muted_buffers = list(default=list())
|
||||||
autoread_buffers = list(default=list(mentions, direct_messages, events))
|
autoread_buffers = list(default=list(mentions, direct_messages, events))
|
||||||
@@ -36,6 +38,4 @@ autoread_buffers = list(default=list(mentions, direct_messages, events))
|
|||||||
spelling_language = string(default="")
|
spelling_language = string(default="")
|
||||||
save_followers_in_autocompletion_db = boolean(default=False)
|
save_followers_in_autocompletion_db = boolean(default=False)
|
||||||
save_friends_in_autocompletion_db = boolean(default=False)
|
save_friends_in_autocompletion_db = boolean(default=False)
|
||||||
|
twishort_enabled = boolean(default=False)
|
||||||
[services]
|
|
||||||
pocket_access_token = string(default="")
|
|
||||||
|
@@ -1,19 +1,23 @@
|
|||||||
|
from __future__ import absolute_import
|
||||||
import ctypes
|
import ctypes
|
||||||
import os
|
import os
|
||||||
import types
|
import types
|
||||||
from platform_utils import paths
|
from platform_utils import paths
|
||||||
|
|
||||||
def load_library(libname):
|
def load_library(libname, cdll=False):
|
||||||
if paths.is_frozen():
|
if paths.is_frozen():
|
||||||
libfile = os.path.join(paths.embedded_data_path(), 'accessible_output2', 'lib', libname)
|
libfile = os.path.join(paths.embedded_data_path(), 'accessible_output2', 'lib', libname)
|
||||||
else:
|
else:
|
||||||
libfile = os.path.join(paths.module_path(), 'lib', libname)
|
libfile = os.path.join(paths.module_path(), 'lib', libname)
|
||||||
|
if cdll:
|
||||||
|
return ctypes.cdll[libfile]
|
||||||
|
else:
|
||||||
return ctypes.windll[libfile]
|
return ctypes.windll[libfile]
|
||||||
|
|
||||||
def get_output_classes():
|
def get_output_classes():
|
||||||
import outputs
|
from . import outputs
|
||||||
module_type = types.ModuleType
|
module_type = types.ModuleType
|
||||||
classes = [m.output_class for m in outputs.__dict__.itervalues() if type(m) == module_type and hasattr(m, 'output_class')]
|
classes = [m.output_class for m in outputs.__dict__.values() if type(m) == module_type and hasattr(m, 'output_class')]
|
||||||
return sorted(classes, key=lambda c: c.priority)
|
return sorted(classes, key=lambda c: c.priority)
|
||||||
|
|
||||||
def find_datafiles():
|
def find_datafiles():
|
||||||
|
Binary file not shown.
Binary file not shown.
@@ -1,16 +1,20 @@
|
|||||||
|
from __future__ import absolute_import
|
||||||
import platform
|
import platform
|
||||||
if platform.system() == 'Windows':
|
if platform.system() == 'Windows':
|
||||||
import nvda
|
from . import nvda
|
||||||
import jaws
|
from . import jaws
|
||||||
import sapi5
|
from . import sapi5
|
||||||
import window_eyes
|
from . import window_eyes
|
||||||
import system_access
|
from . import system_access
|
||||||
import dolphin
|
from . import dolphin
|
||||||
import pc_talker
|
from . import pc_talker
|
||||||
#import sapi4
|
#import sapi4
|
||||||
elif platform.system() == "Darwin":
|
|
||||||
import voiceover
|
|
||||||
elif platform.system() == "Linux":
|
|
||||||
import speechDispatcher
|
|
||||||
|
|
||||||
import auto
|
if platform.system() == 'Darwin':
|
||||||
|
from . import voiceover
|
||||||
|
from . import say
|
||||||
|
|
||||||
|
if platform.system() == 'Linux':
|
||||||
|
from . import e_speak
|
||||||
|
|
||||||
|
from . import auto
|
||||||
|
@@ -1,17 +1,10 @@
|
|||||||
import platform
|
from __future__ import absolute_import
|
||||||
import accessible_output2
|
import accessible_output2
|
||||||
from base import Output, OutputError
|
from .base import Output, OutputError
|
||||||
|
|
||||||
class Auto(Output):
|
class Auto(Output):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
if platform.system() == "Darwin":
|
|
||||||
import voiceover
|
|
||||||
self.outputs = [voiceover.VoiceOver()]
|
|
||||||
elif platform.system() == "Linux":
|
|
||||||
import speechDispatcher
|
|
||||||
self.outputs = [speechDispatcher.SpeechDispatcher()]
|
|
||||||
elif platform.system() == "Windows":
|
|
||||||
output_classes = accessible_output2.get_output_classes()
|
output_classes = accessible_output2.get_output_classes()
|
||||||
self.outputs = []
|
self.outputs = []
|
||||||
for output in output_classes:
|
for output in output_classes:
|
||||||
@@ -40,3 +33,8 @@ class Auto(Output):
|
|||||||
output = self.get_first_available_output()
|
output = self.get_first_available_output()
|
||||||
if output:
|
if output:
|
||||||
output.speak(*args, **kwargs)
|
output.speak(*args, **kwargs)
|
||||||
|
|
||||||
|
def is_system_output(self):
|
||||||
|
output = self.get_first_available_output()
|
||||||
|
if output:
|
||||||
|
return output.is_system_output()
|
||||||
|
@@ -5,27 +5,43 @@ class OutputError(Exception):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
class Output(object):
|
class Output(object):
|
||||||
name = "Unnamed Output" #The name of this output
|
name = "Unnamed Output"
|
||||||
lib32 = None #name of 32-bit lib
|
lib32 = None
|
||||||
lib64 = None #name of 64-bit lib
|
lib64 = None
|
||||||
priority = 100 #Where to sort in the list of available outputs for automaticly speaking
|
argtypes = {}
|
||||||
|
cdll = False
|
||||||
|
priority = 100
|
||||||
|
system_output = False
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
is_32bit = platform.architecture()[0] == "32bit"
|
self.is_32bit = platform.architecture()[0] == "32bit"
|
||||||
if self.lib32 and is_32bit:
|
if self.lib32 and self.is_32bit:
|
||||||
self.lib = load_library(self.lib32)
|
self.lib = load_library(self.lib32, cdll=self.cdll)
|
||||||
elif self.lib64:
|
elif self.lib64:
|
||||||
self.lib = load_library(self.lib64)
|
self.lib = load_library(self.lib64, cdll=self.cdll)
|
||||||
|
else:
|
||||||
|
self.lib = None
|
||||||
|
if self.lib is not None:
|
||||||
|
for func in self.argtypes:
|
||||||
|
try:
|
||||||
|
getattr(self.lib, func).argtypes = self.argtypes[func]
|
||||||
|
except AttributeError:
|
||||||
|
pass
|
||||||
|
|
||||||
def output(self, text, **options):
|
def output(self, text, **options):
|
||||||
output = False
|
output = False
|
||||||
if hasattr(self, 'speak') and callable(self.speak):
|
if self.speak(text, **options):
|
||||||
self.speak(text, **options)
|
|
||||||
output = True
|
output = True
|
||||||
if hasattr(self, 'braille') and callable(self.braille):
|
if self.braille(text, **options):
|
||||||
self.braille(text, **options)
|
|
||||||
output = True
|
output = True
|
||||||
if not output:
|
if not output:
|
||||||
raise RuntimeError("Output %r does not have any method defined to output" % self)
|
raise RuntimeError("Output %r does not have any method defined to output" % self)
|
||||||
|
|
||||||
|
def is_system_output(self):
|
||||||
|
return self.system_output
|
||||||
|
|
||||||
|
def speak(self, **optiont):
|
||||||
|
return False
|
||||||
|
|
||||||
|
def braille(self, *args, **options):
|
||||||
|
return False
|
||||||
|
@@ -1,19 +1,25 @@
|
|||||||
|
from __future__ import absolute_import
|
||||||
import os
|
import os
|
||||||
|
import ctypes
|
||||||
|
|
||||||
from base import Output
|
from .base import Output
|
||||||
|
|
||||||
class Dolphin (Output):
|
class Dolphin (Output):
|
||||||
"""Supports dolphin products."""
|
"""Supports dolphin products."""
|
||||||
|
|
||||||
name = 'Dolphin'
|
name = 'Dolphin'
|
||||||
lib32 = 'dolapi.dll'
|
lib32 = 'dolapi.dll'
|
||||||
|
argtypes = {
|
||||||
|
'DolAccess_Command': (ctypes.c_wchar_p, ctypes.c_int, ctypes.c_int),
|
||||||
|
'DolAccess_Action': (ctypes.c_int,),
|
||||||
|
}
|
||||||
|
|
||||||
def speak(self, text, interrupt=0):
|
def speak(self, text, interrupt=0):
|
||||||
if interrupt:
|
if interrupt:
|
||||||
self.silence()
|
self.silence()
|
||||||
#If we don't call this, the API won't let us speak.
|
#If we don't call this, the API won't let us speak.
|
||||||
if self.is_active():
|
if self.is_active():
|
||||||
self.lib.DolAccess_Command(unicode(text), (len(text)*2)+2, 1)
|
self.lib.DolAccess_Command(text, (len(text)*2)+2, 1)
|
||||||
|
|
||||||
def silence(self):
|
def silence(self):
|
||||||
self.lib.DolAccess_Action(141)
|
self.lib.DolAccess_Action(141)
|
||||||
|
31
src/accessible_output2/outputs/e_speak.py
Normal file
31
src/accessible_output2/outputs/e_speak.py
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
from __future__ import absolute_import
|
||||||
|
from .base import Output
|
||||||
|
|
||||||
|
try:
|
||||||
|
import espeak.core
|
||||||
|
except:
|
||||||
|
raise RuntimeError("Cannot find espeak.core. Please install python-espeak")
|
||||||
|
|
||||||
|
class ESpeak(Output):
|
||||||
|
"""Speech output supporting ESpeak on Linux
|
||||||
|
Note this requires python-espeak to be installed
|
||||||
|
This can be done on Debian distros by using apt-get install python-espeak
|
||||||
|
Or through this tarball: https://launchpad.net/python-espeak
|
||||||
|
"""
|
||||||
|
name = "Linux ESpeak"
|
||||||
|
|
||||||
|
def is_active(self):
|
||||||
|
try:
|
||||||
|
import espeak.core
|
||||||
|
except:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
def speak(self, text, interrupt = 0):
|
||||||
|
if interrupt:
|
||||||
|
self.silence()
|
||||||
|
espeak.core.synth(text)
|
||||||
|
def silence(self):
|
||||||
|
espeak.core.cancel()
|
||||||
|
|
||||||
|
output_class = ESpeak
|
@@ -1,8 +1,9 @@
|
|||||||
|
from __future__ import absolute_import
|
||||||
import win32gui
|
import win32gui
|
||||||
from libloader.com import load_com
|
from libloader.com import load_com
|
||||||
import pywintypes
|
import pywintypes
|
||||||
|
|
||||||
from base import Output, OutputError
|
from .base import Output, OutputError
|
||||||
|
|
||||||
class Jaws (Output):
|
class Jaws (Output):
|
||||||
"""Output supporting the Jaws for Windows screen reader."""
|
"""Output supporting the Jaws for Windows screen reader."""
|
||||||
|
@@ -1,15 +1,21 @@
|
|||||||
|
from __future__ import absolute_import
|
||||||
import os
|
import os
|
||||||
import platform
|
import platform
|
||||||
|
import ctypes
|
||||||
|
|
||||||
from platform_utils import paths
|
from platform_utils import paths
|
||||||
from libloader import load_library
|
from libloader import load_library
|
||||||
from base import Output
|
from .base import Output
|
||||||
|
|
||||||
class NVDA(Output):
|
class NVDA(Output):
|
||||||
"""Supports The NVDA screen reader"""
|
"""Supports The NVDA screen reader"""
|
||||||
name = "NVDA"
|
name = "NVDA"
|
||||||
lib32 = 'nvdaControllerClient32.dll'
|
lib32 = 'nvdaControllerClient32.dll'
|
||||||
lib64 = 'nvdaControllerClient64.dll'
|
lib64 = 'nvdaControllerClient64.dll'
|
||||||
|
argtypes = {
|
||||||
|
'nvdaController_brailleMessage': (ctypes.c_wchar_p,),
|
||||||
|
'nvdaController_speakText': (ctypes.c_wchar_p,),
|
||||||
|
}
|
||||||
|
|
||||||
def is_active(self):
|
def is_active(self):
|
||||||
try:
|
try:
|
||||||
@@ -18,12 +24,12 @@ class NVDA(Output):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
def braille(self, text, **options):
|
def braille(self, text, **options):
|
||||||
self.lib.nvdaController_brailleMessage(unicode(text))
|
self.lib.nvdaController_brailleMessage(text)
|
||||||
|
|
||||||
def speak(self, text, interrupt=False):
|
def speak(self, text, interrupt=False):
|
||||||
if interrupt:
|
if interrupt:
|
||||||
self.silence()
|
self.silence()
|
||||||
self.lib.nvdaController_speakText(unicode(text))
|
self.lib.nvdaController_speakText(text)
|
||||||
|
|
||||||
def silence(self):
|
def silence(self):
|
||||||
self.lib.nvdaController_cancelSpeech()
|
self.lib.nvdaController_cancelSpeech()
|
||||||
|
@@ -1,14 +1,19 @@
|
|||||||
|
from __future__ import absolute_import
|
||||||
import ctypes
|
import ctypes
|
||||||
from base import Output
|
from .base import Output
|
||||||
|
|
||||||
class PCTalker(Output):
|
class PCTalker(Output):
|
||||||
lib32 = 'pctkusr.dll'
|
lib32 = 'pctkusr.dll'
|
||||||
lib64 = 'pctkusr64.dll'
|
lib64 = 'pctkusr64.dll'
|
||||||
|
cdll = True
|
||||||
|
argtypes = {
|
||||||
|
'PCTKPRead': (ctypes.c_char_p, ctypes.c_int, ctypes.c_int)
|
||||||
|
}
|
||||||
|
|
||||||
def speak(self, text, interrupt=False):
|
def speak(self, text, interrupt=False):
|
||||||
if interrupt:
|
if interrupt:
|
||||||
self.silence()
|
self.silence()
|
||||||
self.lib.PCTKPRead(text.encode('cp932', 'replace'))
|
self.lib.PCTKPRead(text.encode('cp932', 'replace'), 0, 1)
|
||||||
|
|
||||||
def silence(self):
|
def silence(self):
|
||||||
self.lib.PCTKVReset()
|
self.lib.PCTKVReset()
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
|
from __future__ import absolute_import
|
||||||
|
from builtins import range
|
||||||
from libloader.com import load_com
|
from libloader.com import load_com
|
||||||
from base import Output
|
from .base import Output
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
@@ -1,12 +1,19 @@
|
|||||||
# -*- coding: utf-8 -*-
|
from __future__ import absolute_import
|
||||||
import config
|
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
from libloader.com import load_com
|
from libloader.com import load_com
|
||||||
from base import Output, OutputError
|
from .base import Output, OutputError
|
||||||
import pywintypes
|
import pywintypes
|
||||||
import logging
|
import logging
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
SVSFDefault = 0
|
||||||
|
SVSFlagsAsync = 1
|
||||||
|
SVSFPurgeBeforeSpeak = 2
|
||||||
|
SVSFIsFilename = 4
|
||||||
|
SVSFIsXML = 8
|
||||||
|
SVSFIsNotXML = 16
|
||||||
|
SVSFPersistXML = 32
|
||||||
|
|
||||||
class SAPI5(Output):
|
class SAPI5(Output):
|
||||||
has_volume = True
|
has_volume = True
|
||||||
has_rate = True
|
has_rate = True
|
||||||
@@ -19,9 +26,9 @@ class SAPI5(Output):
|
|||||||
max_volume = 100
|
max_volume = 100
|
||||||
name = "sapi5"
|
name = "sapi5"
|
||||||
priority = 101
|
priority = 101
|
||||||
|
system_output = True
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
if config.app["app-settings"]["voice_enabled"] == False: raise OutputError
|
|
||||||
try:
|
try:
|
||||||
self.object = load_com("SAPI.SPVoice")
|
self.object = load_com("SAPI.SPVoice")
|
||||||
self._voices = self._available_voices()
|
self._voices = self._available_voices()
|
||||||
@@ -36,14 +43,14 @@ class SAPI5(Output):
|
|||||||
return _voices
|
return _voices
|
||||||
|
|
||||||
def list_voices(self):
|
def list_voices(self):
|
||||||
return self.available_voices.keys()
|
return list(self._voices.keys())
|
||||||
|
|
||||||
def get_voice(self):
|
def get_voice(self):
|
||||||
return self.object.Voice.GetDescription()
|
return self.object.Voice.GetDescription()
|
||||||
|
|
||||||
def set_voice(self, value):
|
def set_voice(self, value):
|
||||||
log.debug("Setting SAPI5 voice to \"%s\"" % value)
|
log.debug("Setting SAPI5 voice to \"%s\"" % value)
|
||||||
self.object.Voice = self.available_voices[value]
|
self.object.Voice = self._voices[value]
|
||||||
# For some reason SAPI5 does not reset audio after changing the voice
|
# For some reason SAPI5 does not reset audio after changing the voice
|
||||||
# By setting the audio device after changing voices seems to fix this
|
# By setting the audio device after changing voices seems to fix this
|
||||||
# This was noted from information at:
|
# This was noted from information at:
|
||||||
@@ -75,10 +82,10 @@ class SAPI5(Output):
|
|||||||
self.silence()
|
self.silence()
|
||||||
# We need to do the pitch in XML here
|
# We need to do the pitch in XML here
|
||||||
textOutput = "<pitch absmiddle=\"%d\">%s</pitch>" % (round(self._pitch), text.replace("<", "<"))
|
textOutput = "<pitch absmiddle=\"%d\">%s</pitch>" % (round(self._pitch), text.replace("<", "<"))
|
||||||
self.object.Speak(textOutput, 1|8)
|
self.object.Speak(textOutput, SVSFlagsAsync | SVSFIsXML)
|
||||||
|
|
||||||
def silence(self):
|
def silence(self):
|
||||||
self.object.Speak("", 3)
|
self.object.Speak("", SVSFlagsAsync | SVSFPurgeBeforeSpeak)
|
||||||
|
|
||||||
def is_active(self):
|
def is_active(self):
|
||||||
if self.object:
|
if self.object:
|
||||||
|
21
src/accessible_output2/outputs/say.py
Normal file
21
src/accessible_output2/outputs/say.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
from __future__ import absolute_import
|
||||||
|
import os
|
||||||
|
from .base import Output
|
||||||
|
|
||||||
|
class AppleSay(Output):
|
||||||
|
"""Speech output supporting the Apple Say subsystem."""
|
||||||
|
name = 'Apple Say'
|
||||||
|
def __init__(self, voice = 'Alex', rate = '300'):
|
||||||
|
self.voice = voice
|
||||||
|
self.rate = rate
|
||||||
|
super(AppleSay, self).__init__()
|
||||||
|
def is_active(self):
|
||||||
|
return not os.system('which say')
|
||||||
|
def speak(self, text, interrupt = 0):
|
||||||
|
if interrupt:
|
||||||
|
self.silence()
|
||||||
|
os.system('say -v %s -r %s "%s" &' % (self.voice, self.rate, text))
|
||||||
|
def silence(self):
|
||||||
|
os.system('killall say')
|
||||||
|
|
||||||
|
output_class = AppleSay
|
@@ -1,29 +0,0 @@
|
|||||||
from base import Output, OutputError
|
|
||||||
import atexit
|
|
||||||
import application
|
|
||||||
class SpeechDispatcher(Output):
|
|
||||||
"""Supports speech dispatcher on Linux.
|
|
||||||
Note that this module will use the configuration of speech dispatcher, the user will need to configure the voice, language, punctuation and rate before using this module.
|
|
||||||
"""
|
|
||||||
name = 'SpeechDispatcher'
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super(SpeechDispatcher, self).__init__(*args, **kwargs)
|
|
||||||
try:
|
|
||||||
import speechd
|
|
||||||
self.spd = speechd.SSIPClient(application.name)
|
|
||||||
except ImportError:
|
|
||||||
raise OutputError
|
|
||||||
atexit.register(self.on_exit_event)
|
|
||||||
|
|
||||||
def speak(self, text, interupt=False):
|
|
||||||
if interupt == True:
|
|
||||||
self.spd.cancel()
|
|
||||||
self.spd.speak(text)
|
|
||||||
|
|
||||||
def is_active(self):
|
|
||||||
return True
|
|
||||||
|
|
||||||
def on_exit_event(self):
|
|
||||||
self.spd.close()
|
|
||||||
del self.spd
|
|
@@ -1,18 +0,0 @@
|
|||||||
# Copyright (C) 2001, 2002 Brailcom, o.p.s.
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
|
|
||||||
from .client import *
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@@ -1 +0,0 @@
|
|||||||
SPD_SPAWN_CMD = "/usr/bin/speech-dispatcher"
|
|
@@ -1,18 +1,24 @@
|
|||||||
from base import Output
|
from __future__ import absolute_import
|
||||||
|
import ctypes
|
||||||
|
from .base import Output
|
||||||
|
|
||||||
class SystemAccess (Output):
|
class SystemAccess (Output):
|
||||||
"""Supports System Access and System Access Mobile"""
|
"""Supports System Access and System Access Mobile"""
|
||||||
|
|
||||||
name = "System Access"
|
name = "System Access"
|
||||||
lib32 = 'saapi32.dll'
|
lib32 = 'saapi32.dll'
|
||||||
|
argtypes = {
|
||||||
|
'SA_BrlShowTextW': (ctypes.c_wchar_p,),
|
||||||
|
'SA_SayW': (ctypes.c_wchar_p,),
|
||||||
|
}
|
||||||
priority = 99
|
priority = 99
|
||||||
|
|
||||||
def braille(self, text, **options):
|
def braille(self, text, **options):
|
||||||
self.lib.SA_BrlShowTextW(unicode(text))
|
self.lib.SA_BrlShowTextW(text)
|
||||||
|
|
||||||
def speak(self, text, interrupt=False):
|
def speak(self, text, interrupt=False):
|
||||||
if self.is_active():
|
if self.is_active():
|
||||||
self.dll.SA_SayW(unicode(text))
|
self.dll.SA_SayW(str(text))
|
||||||
|
|
||||||
def is_active(self):
|
def is_active(self):
|
||||||
try:
|
try:
|
||||||
|
@@ -1,23 +1 @@
|
|||||||
from base import Output, OutputError
|
from __future__ import absolute_import
|
||||||
|
|
||||||
class VoiceOver (Output):
|
|
||||||
"""Supports the VoiceOver screenreader on the Mac.
|
|
||||||
|
|
||||||
Note that this will also output as a message to the braille display if VoiceOver is used with braille.
|
|
||||||
Calling this module could cause VoiceOver to be started.
|
|
||||||
"""
|
|
||||||
name = 'VoiceOver'
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super(VoiceOver, self).__init__(*args, **kwargs)
|
|
||||||
try:
|
|
||||||
from appscript import app
|
|
||||||
self.app = app('VoiceOver')
|
|
||||||
except ImportError:
|
|
||||||
raise OutputError
|
|
||||||
|
|
||||||
def speak(self, text, interupt=False):
|
|
||||||
self.app.output(text)
|
|
||||||
|
|
||||||
def is_active(self):
|
|
||||||
return True
|
|
@@ -1,6 +1,7 @@
|
|||||||
|
from __future__ import absolute_import
|
||||||
import win32gui
|
import win32gui
|
||||||
from libloader.com import load_com
|
from libloader.com import load_com
|
||||||
from base import Output, OutputError
|
from .base import Output, OutputError
|
||||||
import pywintypes
|
import pywintypes
|
||||||
|
|
||||||
class WindowEyes (Output):
|
class WindowEyes (Output):
|
||||||
|
@@ -8,12 +8,14 @@ language = string(default="system")
|
|||||||
hide_gui = boolean(default=False)
|
hide_gui = boolean(default=False)
|
||||||
voice_enabled = boolean(default=False)
|
voice_enabled = boolean(default=False)
|
||||||
ask_at_exit = boolean(default=True)
|
ask_at_exit = boolean(default=True)
|
||||||
handle_longtweets = boolean(default=False)
|
handle_longtweets = boolean(default=True)
|
||||||
use_invisible_keyboard_shorcuts = boolean(default=True)
|
use_invisible_keyboard_shorcuts = boolean(default=True)
|
||||||
play_ready_sound = boolean(default=True)
|
play_ready_sound = boolean(default=True)
|
||||||
speak_ready_msg = boolean(default=True)
|
speak_ready_msg = boolean(default=True)
|
||||||
log_level = string(default="error")
|
log_level = string(default="error")
|
||||||
load_keymap = string(default="default.keymap")
|
load_keymap = string(default="default.keymap")
|
||||||
|
donation_dialog_displayed = boolean(default=False)
|
||||||
|
check_for_updates = boolean(default=True)
|
||||||
|
|
||||||
[proxy]
|
[proxy]
|
||||||
server = string(default="")
|
server = string(default="")
|
||||||
|
@@ -1,16 +1,18 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
name = 'TWBlue'
|
name = 'TWBlue'
|
||||||
snapshot = True
|
snapshot = False
|
||||||
if snapshot == False:
|
if snapshot == False:
|
||||||
version = "0.80"
|
version = "0.84"
|
||||||
update_url = 'http://twblue.es/updates/twblue_ngen.json'
|
update_url = 'http://twblue.es/updates/twblue_ngen.json'
|
||||||
|
mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/stable.json'
|
||||||
else:
|
else:
|
||||||
version = "9.9"
|
version = "10.99"
|
||||||
update_url = 'http://twblue.es/updates/snapshots_ngen.json'
|
update_url = 'http://twblue.es/updates/snapshots_ngen.json'
|
||||||
author = u"Manuel Cortéz, Bill Dengler"
|
mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/snapshots.json'
|
||||||
|
author = u"Manuel Cortéz"
|
||||||
authorEmail = "manuel@manuelcortez.net"
|
authorEmail = "manuel@manuelcortez.net"
|
||||||
copyright = u"Copyright (C) 2015, Technow S.L. \nCopyright (C) 2015, Bill Dengler\nCopyright (C) 2013-2015, Manuel cortéz."
|
copyright = u"Copyright (C) 2015, Technow S.L. \nCopyright (C) 2013-2015, Manuel cortéz."
|
||||||
description = unicode(name+" is an app designed to use Twitter simply and efficiently while using minimal system resources. This app provides access to most Twitter features.")
|
description = unicode(name+" is an app designed to use Twitter simply and efficiently while using minimal system resources. This app provides access to most Twitter features.")
|
||||||
translators = [u"Bryner Villalobos, Bill Dengler (English)", u"Mohammed Al Shara (Arabic)", u"Joan Rabat, Juan Carlos Rivilla (Catalan)", u"Manuel cortéz (Spanish)", u"Sukil Etxenike Arizaleta (Basque)", u"Jani Kinnunen (finnish)", u"Rémy Ruiz (French)", u"Alba Quinteiro (Galician)", u"Steffen Schultz (German)", u"Robert Osztolykan (Hungarian)", u"Paweł Masarczyk (Polish)", u"Odenilton Júnior Santos (Portuguese)", u"Alexander Jaszyn (Russian)", u"Burak (Turkish)"]
|
translators = [u"Bryner Villalobos, Bill Dengler (English)", u"Mohammed Al Shara (Arabic)", u"Joan Rabat, Juan Carlos Rivilla (Catalan)", u"Manuel cortéz (Spanish)", u"Sukil Etxenike Arizaleta (Basque)", u"Jani Kinnunen (finnish)", u"Rémy Ruiz (French)", u"Juan Buño (Galician)", u"Steffen Schultz (German)", u"Robert Osztolykan (Hungarian)", u"Paweł Masarczyk (Polish)", u"Odenilton Júnior Santos (Portuguese)", u"Alexander Jaszyn (Russian)", u"Burak (Turkish)"]
|
||||||
url = u"http://twblue.es"
|
url = u"http://twblue.es"
|
||||||
report_bugs_url = "http://twblue.es/bugs/api/soap/mantisconnect.php?wsdl"
|
report_bugs_url = "http://twblue.es/bugs/api/soap/mantisconnect.php?wsdl"
|
@@ -10,7 +10,7 @@ def convert_audioboom(url):
|
|||||||
audio_id = url.split('.com/')[-1]
|
audio_id = url.split('.com/')[-1]
|
||||||
return 'https://audioboom.com/%s.mp3' % audio_id
|
return 'https://audioboom.com/%s.mp3' % audio_id
|
||||||
|
|
||||||
@matches_url ('http://soundcloud.com/')
|
@matches_url ('https://soundcloud.com/')
|
||||||
def convert_soundcloud (url):
|
def convert_soundcloud (url):
|
||||||
client_id = "df8113ca95c157b6c9731f54b105b473"
|
client_id = "df8113ca95c157b6c9731f54b105b473"
|
||||||
permalink = urllib.urlopen ('http://api.soundcloud.com/resolve.json?client_id=%s&url=%s' %(client_id, url))
|
permalink = urllib.urlopen ('http://api.soundcloud.com/resolve.json?client_id=%s&url=%s' %(client_id, url))
|
||||||
|
4966
src/cacert.pem
4966
src/cacert.pem
File diff suppressed because it is too large
Load Diff
@@ -6,13 +6,7 @@ import application
|
|||||||
log = logging.getLogger("commandlineLauncher")
|
log = logging.getLogger("commandlineLauncher")
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description=application.name+" command line launcher")
|
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.")
|
parser.add_argument("-d", "--data-directory", action="store", dest="directory", help="Specifies the directory where " + application.name + " saves userdata.")
|
||||||
args = parser.parse_args()
|
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))
|
log.debug("Starting " + application.name + " with the following arguments: directory = %s" % (args.directory))
|
||||||
if args.installed == True: paths.mode = "installed"
|
|
||||||
elif args.portable == True:
|
|
||||||
paths.mode = "portable"
|
|
||||||
if args.directory != None: paths.directory = args.directory
|
if args.directory != None: paths.directory = args.directory
|
||||||
|
@@ -16,4 +16,4 @@ def setup ():
|
|||||||
app = config_utils.load_config(paths.config_path(MAINFILE), paths.app_path(MAINSPEC))
|
app = config_utils.load_config(paths.config_path(MAINFILE), paths.app_path(MAINSPEC))
|
||||||
log.debug("Loading keymap...")
|
log.debug("Loading keymap...")
|
||||||
global keymap
|
global keymap
|
||||||
keymap = config_utils.load_config(paths.app_path("keymaps/"+app['app-settings']['load_keymap']), paths.app_path('keymaps/base.template'))
|
keymap = config_utils.load_config(paths.config_path("keymap.keymap"), paths.app_path("keymaps/"+app['app-settings']['load_keymap']))
|
||||||
|
@@ -3,6 +3,9 @@ from configobj import ConfigObj, ParseError
|
|||||||
from validate import Validator, ValidateError
|
from validate import Validator, ValidateError
|
||||||
import os
|
import os
|
||||||
import string
|
import string
|
||||||
|
from logging import getLogger
|
||||||
|
log = getLogger("config_utils")
|
||||||
|
|
||||||
class ConfigLoadError(Exception): pass
|
class ConfigLoadError(Exception): pass
|
||||||
|
|
||||||
def load_config(config_path, configspec_path=None, *args, **kwargs):
|
def load_config(config_path, configspec_path=None, *args, **kwargs):
|
||||||
@@ -14,10 +17,12 @@ def load_config(config_path, configspec_path=None, *args, **kwargs):
|
|||||||
except ParseError:
|
except ParseError:
|
||||||
raise ConfigLoadError("Unable to load %r" % config_path)
|
raise ConfigLoadError("Unable to load %r" % config_path)
|
||||||
validator = Validator()
|
validator = Validator()
|
||||||
validated = config.validate(validator, copy=True)
|
validated = config.validate(validator, preserve_errors=False, copy=True)
|
||||||
if validated == True:
|
if validated == True:
|
||||||
config.write()
|
config.write()
|
||||||
return config
|
return config
|
||||||
|
else:
|
||||||
|
log.exception("Error in config file: {0}".format(validated,))
|
||||||
|
|
||||||
def is_blank(arg):
|
def is_blank(arg):
|
||||||
"Check if a line is blank."
|
"Check if a line is blank."
|
||||||
@@ -25,6 +30,7 @@ def is_blank(arg):
|
|||||||
if c not in string.whitespace:
|
if c not in string.whitespace:
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def get_keys(path):
|
def get_keys(path):
|
||||||
"Gets the keys of a configobj config file."
|
"Gets the keys of a configobj config file."
|
||||||
res=[]
|
res=[]
|
||||||
|
38
src/controller/attach.py
Normal file
38
src/controller/attach.py
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import os
|
||||||
|
import widgetUtils
|
||||||
|
import logging
|
||||||
|
from wxUI.dialogs import attach as gui
|
||||||
|
log = logging.getLogger("controller.attach")
|
||||||
|
|
||||||
|
class attach(object):
|
||||||
|
def __init__(self):
|
||||||
|
self.attachments = list()
|
||||||
|
self.dialog = gui.attachDialog()
|
||||||
|
widgetUtils.connect_event(self.dialog.photo, widgetUtils.BUTTON_PRESSED, self.upload_image)
|
||||||
|
widgetUtils.connect_event(self.dialog.remove, widgetUtils.BUTTON_PRESSED, self.remove_attachment)
|
||||||
|
self.dialog.get_response()
|
||||||
|
log.debug("Attachments controller started.")
|
||||||
|
|
||||||
|
def upload_image(self, *args, **kwargs):
|
||||||
|
image, description = self.dialog.get_image()
|
||||||
|
if image != None:
|
||||||
|
imageInfo = {"type": "photo", "file": image, "description": description}
|
||||||
|
log.debug("Image data to upload: %r" % (imageInfo,))
|
||||||
|
self.attachments.append(imageInfo)
|
||||||
|
info = [_(u"Photo"), description]
|
||||||
|
self.dialog.attachments.insert_item(False, *info)
|
||||||
|
self.dialog.remove.Enable(True)
|
||||||
|
|
||||||
|
def remove_attachment(self, *args, **kwargs):
|
||||||
|
current_item = self.dialog.attachments.get_selected()
|
||||||
|
log.debug("Removing item %d" % (current_item,))
|
||||||
|
if current_item == -1: current_item = 0
|
||||||
|
self.attachments.pop(current_item)
|
||||||
|
self.dialog.attachments.remove_item(current_item)
|
||||||
|
self.check_remove_status()
|
||||||
|
log.debug("Removed")
|
||||||
|
|
||||||
|
def check_remove_status(self):
|
||||||
|
if len(self.attachments) == 0 and self.dialog.attachments.get_count() == 0:
|
||||||
|
self.dialog.remove.Enable(False)
|
@@ -1,8 +1,9 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
import time
|
||||||
import platform
|
import platform
|
||||||
if platform.system() == "Windows":
|
if platform.system() == "Windows":
|
||||||
import wx
|
import wx
|
||||||
from wxUI import buffers, dialogs, commonMessageDialogs
|
from wxUI import buffers, dialogs, commonMessageDialogs, menus
|
||||||
import user
|
import user
|
||||||
elif platform.system() == "Linux":
|
elif platform.system() == "Linux":
|
||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
@@ -42,11 +43,13 @@ class bufferController(object):
|
|||||||
self.account = ""
|
self.account = ""
|
||||||
self.needs_init = True
|
self.needs_init = True
|
||||||
self.invisible = False # False if the buffer will be ignored on the invisible interface.
|
self.invisible = False # False if the buffer will be ignored on the invisible interface.
|
||||||
|
self.execution_time = 0
|
||||||
|
|
||||||
def clear_list(self): pass
|
def clear_list(self): pass
|
||||||
|
|
||||||
|
|
||||||
def get_event(self, ev):
|
def get_event(self, ev):
|
||||||
|
""" Catches key presses in the WX interface and generate the corresponding event names."""
|
||||||
if ev.GetKeyCode() == wx.WXK_RETURN and ev.ControlDown(): event = "audio"
|
if ev.GetKeyCode() == wx.WXK_RETURN and ev.ControlDown(): event = "audio"
|
||||||
elif ev.GetKeyCode() == wx.WXK_RETURN: event = "url"
|
elif ev.GetKeyCode() == wx.WXK_RETURN: event = "url"
|
||||||
elif ev.GetKeyCode() == wx.WXK_F5: event = "volume_down"
|
elif ev.GetKeyCode() == wx.WXK_F5: event = "volume_down"
|
||||||
@@ -82,7 +85,9 @@ class bufferController(object):
|
|||||||
sound.URLPlayer.stream.volume = self.session.settings["sound"]["volume"]
|
sound.URLPlayer.stream.volume = self.session.settings["sound"]["volume"]
|
||||||
self.session.sound.play("volume_changed.ogg")
|
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
|
pass
|
||||||
|
|
||||||
def get_more_items(self):
|
def get_more_items(self):
|
||||||
@@ -95,7 +100,9 @@ class bufferController(object):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
def remove_item(self, item):
|
def remove_item(self, item):
|
||||||
|
f = self.buffer.list.get_selected()
|
||||||
self.buffer.list.remove_item(item)
|
self.buffer.list.remove_item(item)
|
||||||
|
self.buffer.list.select_item(f)
|
||||||
|
|
||||||
def bind_events(self):
|
def bind_events(self):
|
||||||
pass
|
pass
|
||||||
@@ -127,20 +134,37 @@ class bufferController(object):
|
|||||||
def post_tweet(self, *args, **kwargs):
|
def post_tweet(self, *args, **kwargs):
|
||||||
title = _(u"Tweet")
|
title = _(u"Tweet")
|
||||||
caption = _(u"Write the tweet here")
|
caption = _(u"Write the tweet here")
|
||||||
tweet = messages.tweet(self.session, title, caption, "")
|
tweet = messages.tweet(self.session, title, caption, "", twishort_enabled=self.session.settings["mysc"]["twishort_enabled"])
|
||||||
if tweet.message.get_response() == widgetUtils.OK:
|
if tweet.message.get_response() == widgetUtils.OK:
|
||||||
|
self.session.settings["mysc"]["twishort_enabled"] = tweet.message.long_tweet.GetValue()
|
||||||
text = tweet.message.get_text()
|
text = tweet.message.get_text()
|
||||||
if len(text) > 140 and tweet.message.get("long_tweet") == True:
|
if len(text) > 140 and tweet.message.get("long_tweet") == True:
|
||||||
if tweet.image == None:
|
if not hasattr(tweet, "attachments"):
|
||||||
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text)
|
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text)
|
||||||
else:
|
else:
|
||||||
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1)
|
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1)
|
||||||
if tweet.image == None:
|
if not hasattr(tweet, "attachments") or len(tweet.attachments) == 0:
|
||||||
call_threaded(self.session.api_call, call_name="update_status", status=text)
|
call_threaded(self.session.api_call, call_name="update_status", status=text)
|
||||||
else:
|
else:
|
||||||
call_threaded(self.session.api_call, call_name="update_status_with_media", status=text, media=tweet.image)
|
call_threaded(self.post_with_media, text=text, attachments=tweet.attachments)
|
||||||
if hasattr(tweet.message, "destroy"): tweet.message.destroy()
|
if hasattr(tweet.message, "destroy"): tweet.message.destroy()
|
||||||
|
|
||||||
|
def post_with_media(self, text, attachments):
|
||||||
|
media_ids = []
|
||||||
|
for i in attachments:
|
||||||
|
photo = open(i["file"], "rb")
|
||||||
|
img = self.session.twitter.twitter.upload_media(media=photo)
|
||||||
|
self.session.twitter.twitter.set_description(media_id=img["media_id"], alt_text=dict(text=i["description"]))
|
||||||
|
media_ids.append(img["media_id"])
|
||||||
|
self.session.twitter.twitter.update_status(status=text, media_ids=media_ids)
|
||||||
|
|
||||||
|
def save_positions(self):
|
||||||
|
try:
|
||||||
|
self.session.db[self.name+"_pos"]=self.buffer.list.get_selected()
|
||||||
|
except AttributeError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class accountPanel(bufferController):
|
class accountPanel(bufferController):
|
||||||
def __init__(self, parent, name, account, account_id):
|
def __init__(self, parent, name, account, account_id):
|
||||||
super(accountPanel, self).__init__(parent, None, name)
|
super(accountPanel, self).__init__(parent, None, name)
|
||||||
@@ -188,7 +212,7 @@ class accountPanel(bufferController):
|
|||||||
|
|
||||||
class emptyPanel(bufferController):
|
class emptyPanel(bufferController):
|
||||||
def __init__(self, parent, name, account):
|
def __init__(self, parent, name, account):
|
||||||
super(emptyPanel, self).__init__(parent, None, name)
|
super(emptyPanel, self).__init__(parent=parent)
|
||||||
log.debug("Initializing buffer %s, account %s" % (name, account,))
|
log.debug("Initializing buffer %s, account %s" % (name, account,))
|
||||||
self.buffer = buffers.emptyPanel(parent, name)
|
self.buffer = buffers.emptyPanel(parent, name)
|
||||||
self.type = self.buffer.type
|
self.type = self.buffer.type
|
||||||
@@ -223,28 +247,36 @@ class baseBufferController(bufferController):
|
|||||||
return self.get_message()
|
return self.get_message()
|
||||||
|
|
||||||
def get_message(self):
|
def get_message(self):
|
||||||
return " ".join(self.compose_function(self.get_right_tweet(), self.session.db, self.session.settings["general"]["relative_times"]))
|
tweet = self.get_right_tweet()
|
||||||
|
return " ".join(self.compose_function(tweet, self.session.db, self.session.settings["general"]["relative_times"]))
|
||||||
|
|
||||||
def get_full_tweet(self):
|
def get_full_tweet(self):
|
||||||
tweet = self.get_right_tweet()
|
tweet = self.get_right_tweet()
|
||||||
tweetsList = []
|
tweetsList = []
|
||||||
tweet_id = tweet["id"]
|
tweet_id = tweet["id"]
|
||||||
uri = None
|
message = None
|
||||||
if tweet.has_key("long_uri"):
|
if tweet.has_key("message"):
|
||||||
uri = tweet["long_uri"]
|
message = tweet["message"]
|
||||||
try:
|
try:
|
||||||
tweet = self.session.twitter.twitter.show_status(id=tweet_id)
|
tweet = self.session.twitter.twitter.show_status(id=tweet_id, include_ext_alt_text=True)
|
||||||
|
urls = utils.find_urls_in_text(tweet["text"])
|
||||||
|
for url in range(0, len(urls)):
|
||||||
|
try: tweet["text"] = tweet["text"].replace(urls[url], tweet["entities"]["urls"][url]["expanded_url"])
|
||||||
|
except IndexError: pass
|
||||||
except TwythonError as e:
|
except TwythonError as e:
|
||||||
utils.twitter_error(e)
|
utils.twitter_error(e)
|
||||||
return
|
return
|
||||||
if uri != None:
|
if message != None:
|
||||||
tweet["text"] = twishort.get_full_text(uri)
|
tweet["message"] = message
|
||||||
l = tweets.is_long(tweet)
|
l = tweets.is_long(tweet)
|
||||||
while l != False:
|
while l != False:
|
||||||
tweetsList.append(tweet)
|
tweetsList.append(tweet)
|
||||||
id = tweets.get_id(l)
|
|
||||||
try:
|
try:
|
||||||
tweet = self.session.twitter.twitter.show_status(id=id)
|
tweet = self.session.twitter.twitter.show_status(id=l, include_ext_alt_text=True)
|
||||||
|
urls = utils.find_urls_in_text(tweet["text"])
|
||||||
|
for url in range(0, len(urls)):
|
||||||
|
try: tweet["text"] = tweet["text"].replace(urls[url], tweet["entities"]["urls"][url]["expanded_url"])
|
||||||
|
except IndexError: pass
|
||||||
except TwythonError as e:
|
except TwythonError as e:
|
||||||
utils.twitter_error(e)
|
utils.twitter_error(e)
|
||||||
return
|
return
|
||||||
@@ -253,16 +285,20 @@ class baseBufferController(bufferController):
|
|||||||
tweetsList.append(tweet)
|
tweetsList.append(tweet)
|
||||||
return (tweet, tweetsList)
|
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 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("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))
|
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))
|
||||||
val = self.session.call_paged(self.function, *self.args, **self.kwargs)
|
val = self.session.call_paged(self.function, *self.args, **self.kwargs)
|
||||||
number_of_items = self.session.order_buffer(self.name, val)
|
number_of_items = self.session.order_buffer(self.name, val)
|
||||||
log.debug("Number of items retrieved: %d" % (number_of_items,))
|
log.debug("Number of items retrieved: %d" % (number_of_items,))
|
||||||
self.put_items_on_list(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" and self.sound != None:
|
||||||
if number_of_items > 0 and self.name != "sent_tweets" and self.name != "sent_direct_messages":
|
|
||||||
self.session.sound.play(self.sound)
|
self.session.sound.play(self.sound)
|
||||||
|
return number_of_items
|
||||||
|
|
||||||
def get_more_items(self):
|
def get_more_items(self):
|
||||||
elements = []
|
elements = []
|
||||||
@@ -275,7 +311,9 @@ class baseBufferController(bufferController):
|
|||||||
except TwythonError as e:
|
except TwythonError as e:
|
||||||
output.speak(e.message, True)
|
output.speak(e.message, True)
|
||||||
for i in items:
|
for i in items:
|
||||||
if utils.is_allowed(i, self.session.settings["twitter"]["ignored_clients"]) == True:
|
if utils.is_allowed(i, self.session.settings["twitter"]["ignored_clients"]) == True and utils.find_item(i["id"], self.session.db[self.name]) == None:
|
||||||
|
i = self.session.check_quoted_status(i)
|
||||||
|
i = self.session.check_long_tweet(i)
|
||||||
elements.append(i)
|
elements.append(i)
|
||||||
if self.session.settings["general"]["reverse_timelines"] == False:
|
if self.session.settings["general"]["reverse_timelines"] == False:
|
||||||
self.session.db[self.name].insert(0, i)
|
self.session.db[self.name].insert(0, i)
|
||||||
@@ -301,6 +339,7 @@ class baseBufferController(bufferController):
|
|||||||
if dlg == widgetUtils.YES:
|
if dlg == widgetUtils.YES:
|
||||||
if self.name[:-9] in self.session.settings["other_buffers"]["timelines"]:
|
if self.name[:-9] in self.session.settings["other_buffers"]["timelines"]:
|
||||||
self.session.settings["other_buffers"]["timelines"].remove(self.name[:-9])
|
self.session.settings["other_buffers"]["timelines"].remove(self.name[:-9])
|
||||||
|
self.session.db.pop(self.name)
|
||||||
return True
|
return True
|
||||||
elif dlg == widgetUtils.NO:
|
elif dlg == widgetUtils.NO:
|
||||||
return False
|
return False
|
||||||
@@ -309,6 +348,7 @@ class baseBufferController(bufferController):
|
|||||||
if dlg == widgetUtils.YES:
|
if dlg == widgetUtils.YES:
|
||||||
if self.name[:-9] in self.session.settings["other_buffers"]["favourites_timelines"]:
|
if self.name[:-9] in self.session.settings["other_buffers"]["favourites_timelines"]:
|
||||||
self.session.settings["other_buffers"]["favourites_timelines"].remove(self.name[:-9])
|
self.session.settings["other_buffers"]["favourites_timelines"].remove(self.name[:-9])
|
||||||
|
self.session.db.pop(self.name)
|
||||||
return True
|
return True
|
||||||
elif dlg == widgetUtils.NO:
|
elif dlg == widgetUtils.NO:
|
||||||
return False
|
return False
|
||||||
@@ -316,7 +356,15 @@ class baseBufferController(bufferController):
|
|||||||
output.speak(_(u"This buffer is not a timeline; it can't be deleted."), True)
|
output.speak(_(u"This buffer is not a timeline; it can't be deleted."), True)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def remove_tweet(self, id):
|
||||||
|
if type(self.session.db[self.name]) == dict: return
|
||||||
|
for i in xrange(0, len(self.session.db[self.name])):
|
||||||
|
if self.session.db[self.name][i]["id"] == id:
|
||||||
|
self.session.db[self.name].pop(i)
|
||||||
|
self.remove_item(i)
|
||||||
|
|
||||||
def put_items_on_list(self, number_of_items):
|
def put_items_on_list(self, number_of_items):
|
||||||
|
if number_of_items == 0: return
|
||||||
log.debug("The list contains %d items " % (self.buffer.list.get_count(),))
|
log.debug("The list contains %d items " % (self.buffer.list.get_count(),))
|
||||||
log.debug("Putting %d items on the list" % (number_of_items,))
|
log.debug("Putting %d items on the list" % (number_of_items,))
|
||||||
if self.buffer.list.get_count() == 0:
|
if self.buffer.list.get_count() == 0:
|
||||||
@@ -326,11 +374,14 @@ class baseBufferController(bufferController):
|
|||||||
self.buffer.set_position(self.session.settings["general"]["reverse_timelines"])
|
self.buffer.set_position(self.session.settings["general"]["reverse_timelines"])
|
||||||
elif self.buffer.list.get_count() > 0:
|
elif self.buffer.list.get_count() > 0:
|
||||||
if self.session.settings["general"]["reverse_timelines"] == False:
|
if self.session.settings["general"]["reverse_timelines"] == False:
|
||||||
for i in self.session.db[self.name][:number_of_items]:
|
items = self.session.db[self.name][len(self.session.db[self.name])-number_of_items:]
|
||||||
|
for i in items:
|
||||||
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"])
|
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"])
|
||||||
self.buffer.list.insert_item(False, *tweet)
|
self.buffer.list.insert_item(False, *tweet)
|
||||||
else:
|
else:
|
||||||
for i in self.session.db[self.name][0:number_of_items]:
|
items = self.session.db[self.name][0:number_of_items]
|
||||||
|
items.reverse()
|
||||||
|
for i in items:
|
||||||
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"])
|
tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"])
|
||||||
self.buffer.list.insert_item(True, *tweet)
|
self.buffer.list.insert_item(True, *tweet)
|
||||||
log.debug("Now the list contains %d items " % (self.buffer.list.get_count(),))
|
log.debug("Now the list contains %d items " % (self.buffer.list.get_count(),))
|
||||||
@@ -344,8 +395,8 @@ class baseBufferController(bufferController):
|
|||||||
if self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False:
|
if self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False:
|
||||||
output.speak(" ".join(tweet[:2]))
|
output.speak(" ".join(tweet[:2]))
|
||||||
#Improve performance on Windows
|
#Improve performance on Windows
|
||||||
if platform.system() == "Windows":
|
# if platform.system() == "Windows":
|
||||||
call_threaded(utils.is_audio,item)
|
# call_threaded(utils.is_audio,item)
|
||||||
|
|
||||||
def bind_events(self):
|
def bind_events(self):
|
||||||
log.debug("Binding events...")
|
log.debug("Binding events...")
|
||||||
@@ -356,6 +407,61 @@ class baseBufferController(bufferController):
|
|||||||
widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.retweet, self.buffer.retweet)
|
widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.retweet, self.buffer.retweet)
|
||||||
widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.direct_message, self.buffer.dm)
|
widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.direct_message, self.buffer.dm)
|
||||||
widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.reply, self.buffer.reply)
|
widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.reply, self.buffer.reply)
|
||||||
|
# Replace for the correct way in other platforms.
|
||||||
|
widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_ITEM_RIGHT_CLICK, self.show_menu)
|
||||||
|
widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_KEY_DOWN, self.show_menu_by_key)
|
||||||
|
|
||||||
|
def show_menu(self, ev, pos=0, *args, **kwargs):
|
||||||
|
if self.buffer.list.get_count() == 0: return
|
||||||
|
if self.name == "sent_tweets" or self.name == "sent_direct_messages":
|
||||||
|
menu = menus.sentPanelMenu()
|
||||||
|
elif self.name == "direct_messages":
|
||||||
|
menu = menus.dmPanelMenu()
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.direct_message, menuitem=menu.reply)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.user_actions, menuitem=menu.userActions)
|
||||||
|
else:
|
||||||
|
menu = menus.basePanelMenu()
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.reply, menuitem=menu.reply)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.user_actions, menuitem=menu.userActions)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.retweet, menuitem=menu.retweet)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.fav, menuitem=menu.fav)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.unfav, menuitem=menu.unfav)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.url_, menuitem=menu.openUrl)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.audio, menuitem=menu.play)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.view, menuitem=menu.view)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.copy, menuitem=menu.copy)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.destroy_status, menuitem=menu.remove)
|
||||||
|
if pos != 0:
|
||||||
|
self.buffer.PopupMenu(menu, pos)
|
||||||
|
else:
|
||||||
|
self.buffer.PopupMenu(menu, ev.GetPosition())
|
||||||
|
|
||||||
|
def view(self, *args, **kwargs):
|
||||||
|
pub.sendMessage("execute-action", action="view_item")
|
||||||
|
|
||||||
|
def copy(self, *args, **kwargs):
|
||||||
|
pub.sendMessage("execute-action", action="copy_to_clipboard")
|
||||||
|
|
||||||
|
def user_actions(self, *args, **kwargs):
|
||||||
|
pub.sendMessage("execute-action", action="follow")
|
||||||
|
|
||||||
|
def fav(self, *args, **kwargs):
|
||||||
|
pub.sendMessage("execute-action", action="add_to_favourites")
|
||||||
|
|
||||||
|
def unfav(self, *args, **kwargs):
|
||||||
|
pub.sendMessage("execute-action", action="remove_from_favourites")
|
||||||
|
|
||||||
|
def delete_item_(self, *args, **kwargs):
|
||||||
|
pub.sendMessage("execute-action", action="delete_item")
|
||||||
|
|
||||||
|
def url_(self, *args, **kwargs):
|
||||||
|
self.url()
|
||||||
|
|
||||||
|
def show_menu_by_key(self, ev):
|
||||||
|
if self.buffer.list.get_count() == 0:
|
||||||
|
return
|
||||||
|
if ev.GetKeyCode() == wx.WXK_WINDOWS_MENU:
|
||||||
|
self.show_menu(widgetUtils.MENU, pos=self.buffer.list.list.GetPosition())
|
||||||
|
|
||||||
def get_tweet(self):
|
def get_tweet(self):
|
||||||
if self.session.db[self.name][self.buffer.list.get_selected()].has_key("retweeted_status"):
|
if self.session.db[self.name][self.buffer.list.get_selected()].has_key("retweeted_status"):
|
||||||
@@ -374,8 +480,9 @@ class baseBufferController(bufferController):
|
|||||||
screen_name = tweet["user"]["screen_name"]
|
screen_name = tweet["user"]["screen_name"]
|
||||||
id = tweet["id"]
|
id = tweet["id"]
|
||||||
users = utils.get_all_mentioned(tweet, self.session.db)
|
users = utils.get_all_mentioned(tweet, self.session.db)
|
||||||
message = messages.reply(self.session, _(u"Reply"), _(u"Reply to %s") % (screen_name,), "@%s " % (screen_name,), users)
|
message = messages.reply(self.session, _(u"Reply"), _(u"Reply to %s") % (screen_name,), "@%s " % (screen_name,), twishort_enabled=self.session.settings["mysc"]["twishort_enabled"], users=users)
|
||||||
if message.message.get_response() == widgetUtils.OK:
|
if message.message.get_response() == widgetUtils.OK:
|
||||||
|
self.session.settings["mysc"]["twishort_enabled"] = message.message.long_tweet.GetValue()
|
||||||
text = message.message.get_text()
|
text = message.message.get_text()
|
||||||
if len(text) > 140 and message.message.get("long_tweet") == True:
|
if len(text) > 140 and message.message.get("long_tweet") == True:
|
||||||
if message.image == None:
|
if message.image == None:
|
||||||
@@ -402,7 +509,13 @@ class baseBufferController(bufferController):
|
|||||||
users = utils.get_all_users(tweet, self.session.db)
|
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)
|
dm = messages.dm(self.session, _(u"Direct message to %s") % (screen_name,), _(u"New direct message"), users)
|
||||||
if dm.message.get_response() == widgetUtils.OK:
|
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()
|
if hasattr(dm.message, "destroy"): dm.message.destroy()
|
||||||
|
|
||||||
@_tweets_exist
|
@_tweets_exist
|
||||||
@@ -421,7 +534,7 @@ class baseBufferController(bufferController):
|
|||||||
self._retweet_with_comment(tweet, id)
|
self._retweet_with_comment(tweet, id)
|
||||||
|
|
||||||
def _retweet_with_comment(self, tweet, id, comment=''):
|
def _retweet_with_comment(self, tweet, id, comment=''):
|
||||||
retweet = messages.tweet(self.session, _(u"Retweet"), _(u"Add your comment to the tweet"), u"“@%s: %s ”" % (tweet["user"]["screen_name"], tweet["text"]), max=116-len("@%s " % (tweet["user"]["screen_name"],)), messageType="retweet")
|
retweet = messages.tweet(self.session, _(u"Retweet"), _(u"Add your comment to the tweet"), u"“@%s: %s ”" % (tweet["user"]["screen_name"], tweet["text"]), max=116, messageType="retweet", twishort_enabled=self.session.settings["mysc"]["twishort_enabled"])
|
||||||
if comment != '':
|
if comment != '':
|
||||||
retweet.message.set_text(comment)
|
retweet.message.set_text(comment)
|
||||||
if retweet.message.get_response() == widgetUtils.OK:
|
if retweet.message.get_response() == widgetUtils.OK:
|
||||||
@@ -455,11 +568,10 @@ class baseBufferController(bufferController):
|
|||||||
self.session.sound.play("audio.ogg")
|
self.session.sound.play("audio.ogg")
|
||||||
if utils.is_geocoded(tweet):
|
if utils.is_geocoded(tweet):
|
||||||
self.session.sound.play("geo.ogg")
|
self.session.sound.play("geo.ogg")
|
||||||
self.session.db[str(self.name+"_pos")]=self.buffer.list.get_selected()
|
|
||||||
|
|
||||||
@_tweets_exist
|
# @_tweets_exist
|
||||||
def audio(self,url=''):
|
def audio(self, url='', *args, **kwargs):
|
||||||
if hasattr(sound.URLPlayer,'stream'):
|
if hasattr(sound.URLPlayer,'stream') and sound.URLPlayer.stream.is_playing == True:
|
||||||
return sound.URLPlayer.stop_audio(delete=True)
|
return sound.URLPlayer.stop_audio(delete=True)
|
||||||
tweet = self.get_tweet()
|
tweet = self.get_tweet()
|
||||||
if tweet == None: return
|
if tweet == None: return
|
||||||
@@ -478,8 +590,8 @@ class baseBufferController(bufferController):
|
|||||||
except:
|
except:
|
||||||
log.error("Exception while executing audio method.")
|
log.error("Exception while executing audio method.")
|
||||||
|
|
||||||
@_tweets_exist
|
# @_tweets_exist
|
||||||
def url(self,url='',announce=True):
|
def url(self, url='', announce=True, *args, **kwargs):
|
||||||
if url == '':
|
if url == '':
|
||||||
tweet = self.get_tweet()
|
tweet = self.get_tweet()
|
||||||
urls = utils.find_urls(tweet)
|
urls = utils.find_urls(tweet)
|
||||||
@@ -533,6 +645,26 @@ class baseBufferController(bufferController):
|
|||||||
user.profileController(session=self.session, user=dlg.get_user())
|
user.profileController(session=self.session, user=dlg.get_user())
|
||||||
if hasattr(dlg, "destroy"): dlg.destroy()
|
if hasattr(dlg, "destroy"): dlg.destroy()
|
||||||
|
|
||||||
|
def get_quoted_tweet(self, tweet):
|
||||||
|
# try:
|
||||||
|
quoted_tweet = self.session.twitter.twitter.show_status(id=tweet["id"])
|
||||||
|
urls = utils.find_urls_in_text(quoted_tweet["text"])
|
||||||
|
for url in range(0, len(urls)):
|
||||||
|
try: quoted_tweet["text"] = quoted_tweet["text"].replace(urls[url], quoted_tweet["entities"]["urls"][url]["expanded_url"])
|
||||||
|
except IndexError: pass
|
||||||
|
# except TwythonError as e:
|
||||||
|
# utils.twitter_error(e)
|
||||||
|
# return
|
||||||
|
l = tweets.is_long(quoted_tweet)
|
||||||
|
id = tweets.get_id(l)
|
||||||
|
# try:
|
||||||
|
original_tweet = self.session.twitter.twitter.show_status(id=id)
|
||||||
|
urls = utils.find_urls_in_text(original_tweet["text"])
|
||||||
|
for url in range(0, len(urls)):
|
||||||
|
try: original_tweet["text"] = original_tweet["text"].replace(urls[url], original_tweet["entities"]["urls"][url]["expanded_url"])
|
||||||
|
except IndexError: pass
|
||||||
|
return compose.compose_quoted_tweet(quoted_tweet, original_tweet, self.session.db, self.session.settings["general"]["relative_times"])
|
||||||
|
|
||||||
class listBufferController(baseBufferController):
|
class listBufferController(baseBufferController):
|
||||||
def __init__(self, parent, function, name, sessionObject, account, sound=None, bufferType=None, list_id=None, *args, **kwargs):
|
def __init__(self, parent, function, name, sessionObject, account, sound=None, bufferType=None, list_id=None, *args, **kwargs):
|
||||||
super(listBufferController, self).__init__(parent, function, name, sessionObject, account, sound=None, bufferType=None, *args, **kwargs)
|
super(listBufferController, self).__init__(parent, function, name, sessionObject, account, sound=None, bufferType=None, *args, **kwargs)
|
||||||
@@ -540,9 +672,9 @@ class listBufferController(baseBufferController):
|
|||||||
self.list_id = list_id
|
self.list_id = list_id
|
||||||
self.kwargs["list_id"] = list_id
|
self.kwargs["list_id"] = list_id
|
||||||
|
|
||||||
def start_stream(self):
|
def start_stream(self, mandatory=False):
|
||||||
self.get_user_ids()
|
self.get_user_ids()
|
||||||
super(listBufferController, self).start_stream()
|
super(listBufferController, self).start_stream(mandatory)
|
||||||
|
|
||||||
def get_user_ids(self):
|
def get_user_ids(self):
|
||||||
self.users = []
|
self.users = []
|
||||||
@@ -558,6 +690,7 @@ class listBufferController(baseBufferController):
|
|||||||
if dlg == widgetUtils.YES:
|
if dlg == widgetUtils.YES:
|
||||||
if self.name[:-5] in self.session.settings["other_buffers"]["lists"]:
|
if self.name[:-5] in self.session.settings["other_buffers"]["lists"]:
|
||||||
self.session.settings["other_buffers"]["lists"].remove(self.name[:-5])
|
self.session.settings["other_buffers"]["lists"].remove(self.name[:-5])
|
||||||
|
self.session.db.pop(self.name)
|
||||||
return True
|
return True
|
||||||
elif dlg == widgetUtils.NO:
|
elif dlg == widgetUtils.NO:
|
||||||
return False
|
return False
|
||||||
@@ -597,9 +730,26 @@ class eventsBufferController(bufferController):
|
|||||||
if dlg == widgetUtils.YES:
|
if dlg == widgetUtils.YES:
|
||||||
self.buffer.list.clear()
|
self.buffer.list.clear()
|
||||||
|
|
||||||
|
def show_menu(self, ev, pos=0, *args, **kwargs):
|
||||||
|
if self.buffer.list.get_count() == 0: return
|
||||||
|
menu = menus.eventsPanelMenu()
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.view, menuitem=menu.view)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.copy, menuitem=menu.copy)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.destroy_status, menuitem=menu.remove)
|
||||||
|
if pos != 0:
|
||||||
|
self.buffer.PopupMenu(menu, pos)
|
||||||
|
else:
|
||||||
|
self.buffer.PopupMenu(menu, ev.GetPosition())
|
||||||
|
|
||||||
|
def view(self, *args, **kwargs):
|
||||||
|
pub.sendMessage("execute-action", action="view_item")
|
||||||
|
|
||||||
|
def copy(self, *args, **kwargs):
|
||||||
|
pub.sendMessage("execute-action", action="copy_to_clipboard")
|
||||||
|
|
||||||
class peopleBufferController(baseBufferController):
|
class peopleBufferController(baseBufferController):
|
||||||
def __init__(self, parent, function, name, sessionObject, account, bufferType=None, *args, **kwargs):
|
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,))
|
log.debug("Initializing buffer %s, account %s" % (name, account,))
|
||||||
self.compose_function = compose.compose_followers_list
|
self.compose_function = compose.compose_followers_list
|
||||||
log.debug("Compose_function: %s" % (self.compose_function,))
|
log.debug("Compose_function: %s" % (self.compose_function,))
|
||||||
@@ -607,6 +757,26 @@ class peopleBufferController(baseBufferController):
|
|||||||
self.url = self.interact
|
self.url = self.interact
|
||||||
|
|
||||||
def remove_buffer(self):
|
def remove_buffer(self):
|
||||||
|
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])
|
||||||
|
self.session.db.pop(self.name)
|
||||||
|
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])
|
||||||
|
self.session.db.pop(self.name)
|
||||||
|
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
|
return False
|
||||||
|
|
||||||
def onFocus(self, ev):
|
def onFocus(self, ev):
|
||||||
@@ -629,17 +799,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)
|
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()
|
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 or mandatory==True:
|
||||||
|
self.execution_time = current_time
|
||||||
log.debug("Starting stream for %s buffer, %s account" % (self.name, self.account,))
|
log.debug("Starting stream for %s buffer, %s account" % (self.name, self.account,))
|
||||||
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))
|
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))
|
||||||
val = self.session.get_cursored_stream(self.name, self.function, *self.args, **self.kwargs)
|
val = self.session.get_cursored_stream(self.name, self.function, *self.args, **self.kwargs)
|
||||||
# self.session.order_cursored_buffer(self.name, self.session.db[self.name])
|
|
||||||
# log.debug("Number of items retrieved: %d" % (val,))
|
|
||||||
self.put_items_on_list(val)
|
self.put_items_on_list(val)
|
||||||
|
return val
|
||||||
|
|
||||||
def get_more_items(self):
|
def get_more_items(self):
|
||||||
try:
|
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:
|
except TwythonError as e:
|
||||||
output.speak(e.message, True)
|
output.speak(e.message, True)
|
||||||
return
|
return
|
||||||
@@ -675,7 +848,7 @@ class peopleBufferController(baseBufferController):
|
|||||||
# self.buffer.set_list_position()
|
# self.buffer.set_list_position()
|
||||||
elif self.buffer.list.get_count() > 0:
|
elif self.buffer.list.get_count() > 0:
|
||||||
if self.session.settings["general"]["reverse_timelines"] == False:
|
if self.session.settings["general"]["reverse_timelines"] == False:
|
||||||
for i in self.session.db[self.name]["items"][:number_of_items]:
|
for i in self.session.db[self.name]["items"][len(self.session.db[self.name]["items"])-number_of_items:]:
|
||||||
tweet = self.compose_function(i, self.session.db)
|
tweet = self.compose_function(i, self.session.db)
|
||||||
self.buffer.list.insert_item(False, *tweet)
|
self.buffer.list.insert_item(False, *tweet)
|
||||||
else:
|
else:
|
||||||
@@ -707,8 +880,28 @@ class peopleBufferController(baseBufferController):
|
|||||||
def interact(self):
|
def interact(self):
|
||||||
user.profileController(self.session, user=self.get_right_tweet()["screen_name"])
|
user.profileController(self.session, user=self.get_right_tweet()["screen_name"])
|
||||||
|
|
||||||
|
def show_menu(self, ev, pos=0, *args, **kwargs):
|
||||||
|
menu = menus.peoplePanelMenu()
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.direct_message, menuitem=menu.reply)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.user_actions, menuitem=menu.userActions)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.details, menuitem=menu.details)
|
||||||
|
# widgetUtils.connect_event(menu, widgetUtils.MENU, self.lists, menuitem=menu.lists)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.view, menuitem=menu.view)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.copy, menuitem=menu.copy)
|
||||||
|
if pos != 0:
|
||||||
|
self.buffer.PopupMenu(menu, pos)
|
||||||
|
else:
|
||||||
|
self.buffer.PopupMenu(menu, ev.GetPosition())
|
||||||
|
|
||||||
|
def details(self, *args, **kwargs):
|
||||||
|
pub.sendMessage("execute-action", action="user_details")
|
||||||
|
|
||||||
class searchBufferController(baseBufferController):
|
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 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("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))
|
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))
|
||||||
log.debug("Function: %s" % (self.function,))
|
log.debug("Function: %s" % (self.function,))
|
||||||
@@ -720,6 +913,7 @@ class searchBufferController(baseBufferController):
|
|||||||
self.put_items_on_list(num)
|
self.put_items_on_list(num)
|
||||||
if num > 0:
|
if num > 0:
|
||||||
self.session.sound.play("search_updated.ogg")
|
self.session.sound.play("search_updated.ogg")
|
||||||
|
return num
|
||||||
|
|
||||||
def remove_buffer(self):
|
def remove_buffer(self):
|
||||||
dlg = commonMessageDialogs.remove_buffer()
|
dlg = commonMessageDialogs.remove_buffer()
|
||||||
@@ -727,6 +921,7 @@ class searchBufferController(baseBufferController):
|
|||||||
if self.name[:-11] in self.session.settings["other_buffers"]["tweet_searches"]:
|
if self.name[:-11] in self.session.settings["other_buffers"]["tweet_searches"]:
|
||||||
self.session.settings["other_buffers"]["tweet_searches"].remove(self.name[:-11])
|
self.session.settings["other_buffers"]["tweet_searches"].remove(self.name[:-11])
|
||||||
self.timer.cancel()
|
self.timer.cancel()
|
||||||
|
self.session.db.pop(self.name)
|
||||||
return True
|
return True
|
||||||
elif dlg == widgetUtils.NO:
|
elif dlg == widgetUtils.NO:
|
||||||
return False
|
return False
|
||||||
@@ -742,7 +937,11 @@ class searchPeopleBufferController(peopleBufferController):
|
|||||||
self.kwargs = kwargs
|
self.kwargs = kwargs
|
||||||
self.function = function
|
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 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("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))
|
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))
|
||||||
log.debug("Function: %s" % (self.function,))
|
log.debug("Function: %s" % (self.function,))
|
||||||
@@ -755,6 +954,7 @@ class searchPeopleBufferController(peopleBufferController):
|
|||||||
self.put_items_on_list(number_of_items)
|
self.put_items_on_list(number_of_items)
|
||||||
if number_of_items > 0:
|
if number_of_items > 0:
|
||||||
self.session.sound.play("search_updated.ogg")
|
self.session.sound.play("search_updated.ogg")
|
||||||
|
return number_of_items
|
||||||
|
|
||||||
def remove_buffer(self):
|
def remove_buffer(self):
|
||||||
dlg = commonMessageDialogs.remove_buffer()
|
dlg = commonMessageDialogs.remove_buffer()
|
||||||
@@ -762,6 +962,7 @@ class searchPeopleBufferController(peopleBufferController):
|
|||||||
if self.name[:-11] in self.session.settings["other_buffers"]["tweet_searches"]:
|
if self.name[:-11] in self.session.settings["other_buffers"]["tweet_searches"]:
|
||||||
self.session.settings["other_buffers"]["tweet_searches"].remove(self.name[:-11])
|
self.session.settings["other_buffers"]["tweet_searches"].remove(self.name[:-11])
|
||||||
self.timer.cancel()
|
self.timer.cancel()
|
||||||
|
self.session.db.pop(self.name)
|
||||||
return True
|
return True
|
||||||
elif dlg == widgetUtils.NO:
|
elif dlg == widgetUtils.NO:
|
||||||
return False
|
return False
|
||||||
@@ -783,8 +984,13 @@ class trendsBufferController(bufferController):
|
|||||||
self.buffer.name = name
|
self.buffer.name = name
|
||||||
self.compose_function = self.compose_function_
|
self.compose_function = self.compose_function_
|
||||||
self.get_formatted_message = self.get_message
|
self.get_formatted_message = self.get_message
|
||||||
|
self.reply = self.search_topic
|
||||||
|
|
||||||
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 or mandatory == True:
|
||||||
|
self.execution_time = current_time
|
||||||
try:
|
try:
|
||||||
data = self.session.call_paged("get_place_trends", id=self.trendsFor)
|
data = self.session.call_paged("get_place_trends", id=self.trendsFor)
|
||||||
except:
|
except:
|
||||||
@@ -809,10 +1015,11 @@ class trendsBufferController(bufferController):
|
|||||||
def bind_events(self):
|
def bind_events(self):
|
||||||
log.debug("Binding events...")
|
log.debug("Binding events...")
|
||||||
self.buffer.list.list.Bind(wx.EVT_CHAR_HOOK, self.get_event)
|
self.buffer.list.list.Bind(wx.EVT_CHAR_HOOK, self.get_event)
|
||||||
# widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.post_tweet, self.buffer.tweet)
|
widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.tweet_about_this_trend, self.buffer.tweetTrendBtn)
|
||||||
# widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.retweet, self.buffer.retweet)
|
widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.post_tweet, self.buffer.tweet)
|
||||||
# widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.direct_message, self.buffer.dm)
|
widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_ITEM_RIGHT_CLICK, self.show_menu)
|
||||||
# widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.reply, self.buffer.reply)
|
widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_KEY_DOWN, self.show_menu_by_key)
|
||||||
|
widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.search_topic, self.buffer.search_topic)
|
||||||
|
|
||||||
def get_message(self):
|
def get_message(self):
|
||||||
return self.compose_function(self.trends[self.buffer.list.get_selected()])[0]
|
return self.compose_function(self.trends[self.buffer.list.get_selected()])[0]
|
||||||
@@ -823,16 +1030,68 @@ class trendsBufferController(bufferController):
|
|||||||
if self.name[:-3] in self.session.settings["other_buffers"]["trending_topic_buffers"]:
|
if self.name[:-3] in self.session.settings["other_buffers"]["trending_topic_buffers"]:
|
||||||
self.session.settings["other_buffers"]["trending_topic_buffers"].remove(self.name[:-3])
|
self.session.settings["other_buffers"]["trending_topic_buffers"].remove(self.name[:-3])
|
||||||
self.timer.cancel()
|
self.timer.cancel()
|
||||||
|
self.session.db.pop(self.name)
|
||||||
return True
|
return True
|
||||||
elif dlg == widgetUtils.NO:
|
elif dlg == widgetUtils.NO:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def interact(self, *args, **kwargs):
|
def url(self, *args, **kwargs):
|
||||||
self.searchfunction(value=self.get_message())
|
self.tweet_about_this_trend()
|
||||||
|
|
||||||
|
def search_topic(self, *args, **kwargs):
|
||||||
|
topic = self.trends[self.buffer.list.get_selected()]["name"]
|
||||||
|
pub.sendMessage("search", term=topic)
|
||||||
|
|
||||||
|
def show_menu(self, ev, pos=0, *args, **kwargs):
|
||||||
|
menu = menus.trendsPanelMenu()
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.search_topic, menuitem=menu.search_topic)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.tweet_about_this_trend, menuitem=menu.tweetThisTrend)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.view, menuitem=menu.view)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.copy, menuitem=menu.copy)
|
||||||
|
if pos != 0:
|
||||||
|
self.buffer.PopupMenu(menu, pos)
|
||||||
|
else:
|
||||||
|
self.buffer.PopupMenu(menu, ev.GetPosition())
|
||||||
|
|
||||||
|
def view(self, *args, **kwargs):
|
||||||
|
pub.sendMessage("execute-action", action="view_item")
|
||||||
|
|
||||||
|
def copy(self, *args, **kwargs):
|
||||||
|
pub.sendMessage("execute-action", action="copy_to_clipboard")
|
||||||
|
|
||||||
|
def tweet_about_this_trend(self, *args, **kwargs):
|
||||||
|
if self.buffer.list.get_count() == 0: return
|
||||||
|
title = _(u"Tweet")
|
||||||
|
caption = _(u"Write the tweet here")
|
||||||
|
tweet = messages.tweet(self.session, title, caption, self.get_message()+ " ", twishort_enabled=self.session.settings["mysc"]["twishort_enabled"])
|
||||||
|
tweet.message.set_cursor_at_end()
|
||||||
|
if tweet.message.get_response() == widgetUtils.OK:
|
||||||
|
self.session.settings["mysc"]["twishort_enabled"] = tweet.message.long_tweet.GetValue()
|
||||||
|
text = tweet.message.get_text()
|
||||||
|
if len(text) > 140 and tweet.message.get("long_tweet") == True:
|
||||||
|
if tweet.image == None:
|
||||||
|
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text)
|
||||||
|
else:
|
||||||
|
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1)
|
||||||
|
if tweet.image == None:
|
||||||
|
call_threaded(self.session.api_call, call_name="update_status", status=text)
|
||||||
|
else:
|
||||||
|
call_threaded(self.session.api_call, call_name="update_status_with_media", status=text, media=tweet.image)
|
||||||
|
if hasattr(tweet.message, "destroy"): tweet.message.destroy()
|
||||||
|
|
||||||
|
def show_menu_by_key(self, ev):
|
||||||
|
if self.buffer.list.get_count() == 0:
|
||||||
|
return
|
||||||
|
if ev.GetKeyCode() == wx.WXK_WINDOWS_MENU:
|
||||||
|
self.show_menu(widgetUtils.MENU, pos=self.buffer.list.list.GetPosition())
|
||||||
|
|
||||||
class conversationBufferController(searchBufferController):
|
class conversationBufferController(searchBufferController):
|
||||||
|
|
||||||
def start_stream(self, start=False):
|
def start_stream(self, start=False, mandatory=False):
|
||||||
|
# starts stream every 3 minutes.
|
||||||
|
current_time = time.time()
|
||||||
|
if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory == True:
|
||||||
|
self.execution_time = current_time
|
||||||
if start == True:
|
if start == True:
|
||||||
self.statuses = []
|
self.statuses = []
|
||||||
self.ids = []
|
self.ids = []
|
||||||
@@ -840,7 +1099,10 @@ class conversationBufferController(searchBufferController):
|
|||||||
self.ids.append(self.tweet["id"])
|
self.ids.append(self.tweet["id"])
|
||||||
tweet = self.tweet
|
tweet = self.tweet
|
||||||
while tweet["in_reply_to_status_id"] != None:
|
while tweet["in_reply_to_status_id"] != None:
|
||||||
|
try:
|
||||||
tweet = self.session.twitter.twitter.show_status(id=tweet["in_reply_to_status_id"])
|
tweet = self.session.twitter.twitter.show_status(id=tweet["in_reply_to_status_id"])
|
||||||
|
except TwythonError as err:
|
||||||
|
break
|
||||||
self.statuses.insert(0, tweet)
|
self.statuses.insert(0, tweet)
|
||||||
self.ids.append(tweet["id"])
|
self.ids.append(tweet["id"])
|
||||||
if tweet["in_reply_to_status_id"] == None:
|
if tweet["in_reply_to_status_id"] == None:
|
||||||
@@ -857,6 +1119,15 @@ class conversationBufferController(searchBufferController):
|
|||||||
self.put_items_on_list(number_of_items)
|
self.put_items_on_list(number_of_items)
|
||||||
if number_of_items > 0:
|
if number_of_items > 0:
|
||||||
self.session.sound.play("search_updated.ogg")
|
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:
|
||||||
|
return False
|
||||||
|
|
||||||
class pocketBufferController(baseBufferController):
|
class pocketBufferController(baseBufferController):
|
||||||
def __init__(self, parent, name, sessionObject, account, sound=None, function=None, bufferType=None, *args, **kwargs):
|
def __init__(self, parent, name, sessionObject, account, sound=None, function=None, bufferType=None, *args, **kwargs):
|
||||||
|
7
src/controller/filters.py
Normal file
7
src/controller/filters.py
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from wxUI.dialogs import filters
|
||||||
|
|
||||||
|
class filterController(object):
|
||||||
|
def __init__(self):
|
||||||
|
self.dialog = filters.filterDialog()
|
||||||
|
self.dialog.get_response()
|
@@ -15,19 +15,30 @@ class listsController(object):
|
|||||||
self.dialog.populate_list(self.get_all_lists())
|
self.dialog.populate_list(self.get_all_lists())
|
||||||
widgetUtils.connect_event(self.dialog.createBtn, widgetUtils.BUTTON_PRESSED, self.create_list)
|
widgetUtils.connect_event(self.dialog.createBtn, widgetUtils.BUTTON_PRESSED, self.create_list)
|
||||||
widgetUtils.connect_event(self.dialog.editBtn, widgetUtils.BUTTON_PRESSED, self.edit_list)
|
widgetUtils.connect_event(self.dialog.editBtn, widgetUtils.BUTTON_PRESSED, self.edit_list)
|
||||||
|
widgetUtils.connect_event(self.dialog.deleteBtn, widgetUtils.BUTTON_PRESSED, self.remove_list)
|
||||||
widgetUtils.connect_event(self.dialog.view, widgetUtils.BUTTON_PRESSED, self.open_list_as_buffer)
|
widgetUtils.connect_event(self.dialog.view, widgetUtils.BUTTON_PRESSED, self.open_list_as_buffer)
|
||||||
|
widgetUtils.connect_event(self.dialog.deleteBtn, widgetUtils.BUTTON_PRESSED, self.remove_list)
|
||||||
|
else:
|
||||||
|
self.dialog = lists.userListViewer(user)
|
||||||
|
self.dialog.populate_list(self.get_user_lists(user))
|
||||||
|
widgetUtils.connect_event(self.dialog.createBtn, widgetUtils.BUTTON_PRESSED, self.subscribe)
|
||||||
|
widgetUtils.connect_event(self.dialog.deleteBtn, widgetUtils.BUTTON_PRESSED, self.unsubscribe)
|
||||||
self.dialog.get_response()
|
self.dialog.get_response()
|
||||||
|
|
||||||
def get_all_lists(self):
|
def get_all_lists(self):
|
||||||
return [compose.compose_list(item) for item in self.session.db["lists"]]
|
return [compose.compose_list(item) for item in self.session.db["lists"]]
|
||||||
|
|
||||||
|
def get_user_lists(self, user):
|
||||||
|
self.lists = self.session.twitter.twitter.show_lists(reverse=True, screen_name=user)
|
||||||
|
return [compose.compose_list(item) for item in self.lists]
|
||||||
|
|
||||||
def create_list(self, *args, **kwargs):
|
def create_list(self, *args, **kwargs):
|
||||||
dialog = lists.createListDialog()
|
dialog = lists.createListDialog()
|
||||||
if dialog.get_response() == widgetUtils.OK:
|
if dialog.get_response() == widgetUtils.OK:
|
||||||
name = dialog.get("name")
|
name = dialog.get("name")
|
||||||
description = dialog.get("description")
|
description = dialog.get("description")
|
||||||
p = dialog.get("public")
|
p = dialog.get("public")
|
||||||
if public == True:
|
if p == True:
|
||||||
mode = "public"
|
mode = "public"
|
||||||
else:
|
else:
|
||||||
mode = "private"
|
mode = "private"
|
||||||
@@ -73,4 +84,23 @@ class listsController(object):
|
|||||||
def open_list_as_buffer(self, *args, **kwargs):
|
def open_list_as_buffer(self, *args, **kwargs):
|
||||||
if self.dialog.lista.get_count() == 0: return
|
if self.dialog.lista.get_count() == 0: return
|
||||||
list = self.session.db["lists"][self.dialog.get_item()]
|
list = self.session.db["lists"][self.dialog.get_item()]
|
||||||
pub.sendMessage("create-new-buffer", buffer="list", account=self.session.db["user_name"], create=list["slug"])
|
pub.sendMessage("create-new-buffer", buffer="list", account=self.session.db["user_name"], create=list["name"])
|
||||||
|
|
||||||
|
def subscribe(self, *args, **kwargs):
|
||||||
|
if self.dialog.lista.get_count() == 0: return
|
||||||
|
list_id = self.lists[self.dialog.get_item()]["id"]
|
||||||
|
try:
|
||||||
|
list = self.session.twitter.twitter.subscribe_to_list(list_id=list_id)
|
||||||
|
item = utils.find_item(list["id"], self.session.db["lists"])
|
||||||
|
self.session.db["lists"].append(list)
|
||||||
|
except TwythonError as e:
|
||||||
|
output.speak("error %s: %s" % (e.status_code, e.msg))
|
||||||
|
|
||||||
|
def unsubscribe(self, *args, **kwargs):
|
||||||
|
if self.dialog.lista.get_count() == 0: return
|
||||||
|
list_id = self.lists[self.dialog.get_item()]["id"]
|
||||||
|
try:
|
||||||
|
list = self.session.twitter.twitter.unsubscribe_from_list(list_id=list_id)
|
||||||
|
self.session.db["lists"].remove(list)
|
||||||
|
except TwythonError as e:
|
||||||
|
output.speak("error %s: %s" % (e.status_code, e.msg))
|
||||||
|
@@ -90,12 +90,14 @@ class Controller(object):
|
|||||||
""" Gets the last valid buffer for an account.
|
""" Gets the last valid buffer for an account.
|
||||||
account str: A twitter username.
|
account str: A twitter username.
|
||||||
The last valid buffer is the last buffer that contains a session object assigned."""
|
The last valid buffer is the last buffer that contains a session object assigned."""
|
||||||
|
# results = self.get_buffers_for_account(account)
|
||||||
results = self.get_buffers_for_account(account)
|
results = self.get_buffers_for_account(account)
|
||||||
return self.view.search(results[-1].name, results[-1].account)
|
return self.view.search(results[-1].name, results[-1].account)
|
||||||
|
|
||||||
def get_buffers_for_account(self, account):
|
def get_buffers_for_account(self, account):
|
||||||
results = []
|
results = []
|
||||||
[results.append(i) for i in self.buffers if i.account == account and i.invisible == True]
|
buffers = self.view.get_buffers()
|
||||||
|
[results.append(self.search_buffer(i.name, i.account)) for i in buffers if i.account == account and (i.type != "account")]
|
||||||
return results
|
return results
|
||||||
|
|
||||||
def bind_stream_events(self):
|
def bind_stream_events(self):
|
||||||
@@ -116,6 +118,8 @@ class Controller(object):
|
|||||||
pub.subscribe(self.manage_unblocked_user, "unblocked-user")
|
pub.subscribe(self.manage_unblocked_user, "unblocked-user")
|
||||||
pub.subscribe(self.manage_item_in_timeline, "item-in-timeline")
|
pub.subscribe(self.manage_item_in_timeline, "item-in-timeline")
|
||||||
pub.subscribe(self.manage_item_in_list, "item-in-list")
|
pub.subscribe(self.manage_item_in_list, "item-in-list")
|
||||||
|
pub.subscribe(self.restart_streams_, "restart_streams")
|
||||||
|
pub.subscribe(self.on_tweet_deleted, "tweet-deleted")
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.CLOSE_EVENT, self.exit_)
|
widgetUtils.connect_event(self.view, widgetUtils.CLOSE_EVENT, self.exit_)
|
||||||
|
|
||||||
def bind_other_events(self):
|
def bind_other_events(self):
|
||||||
@@ -126,7 +130,8 @@ class Controller(object):
|
|||||||
pub.subscribe(self.manage_stream_errors, "stream-error")
|
pub.subscribe(self.manage_stream_errors, "stream-error")
|
||||||
pub.subscribe(self.create_new_buffer, "create-new-buffer")
|
pub.subscribe(self.create_new_buffer, "create-new-buffer")
|
||||||
pub.subscribe(self.restart_streams, "restart-streams")
|
pub.subscribe(self.restart_streams, "restart-streams")
|
||||||
|
pub.subscribe(self.execute_action, "execute-action")
|
||||||
|
pub.subscribe(self.search_topic, "search")
|
||||||
if system == "Windows":
|
if system == "Windows":
|
||||||
pub.subscribe(self.invisible_shorcuts_changed, "invisible-shorcuts-changed")
|
pub.subscribe(self.invisible_shorcuts_changed, "invisible-shorcuts-changed")
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.show_hide, menuitem=self.view.show_hide)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.show_hide, menuitem=self.view.show_hide)
|
||||||
@@ -154,7 +159,9 @@ class Controller(object):
|
|||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.delete, self.view.delete)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.delete, self.view.delete)
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.follow, menuitem=self.view.follow)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.follow, menuitem=self.view.follow)
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.send_dm, self.view.dm)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.send_dm, self.view.dm)
|
||||||
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.view_user_lists, menuitem=self.view.viewLists)
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.get_more_items, menuitem=self.view.load_previous_items)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.get_more_items, menuitem=self.view.load_previous_items)
|
||||||
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.view_user_lists, menuitem=self.view.viewLists)
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.clear_buffer, menuitem=self.view.clear)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.clear_buffer, menuitem=self.view.clear)
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.remove_buffer, self.view.deleteTl)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.remove_buffer, self.view.deleteTl)
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.check_for_updates, self.view.check_for_updates)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.check_for_updates, self.view.check_for_updates)
|
||||||
@@ -172,6 +179,10 @@ class Controller(object):
|
|||||||
widgetUtils.connect_event(self.view.nb, widgetUtils.NOTEBOOK_PAGE_CHANGED, self.buffer_changed)
|
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.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_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):
|
def set_systray_icon(self):
|
||||||
self.systrayIcon = sysTrayIcon.SysTrayIcon()
|
self.systrayIcon = sysTrayIcon.SysTrayIcon()
|
||||||
@@ -181,6 +192,7 @@ class Controller(object):
|
|||||||
widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.update_profile, menuitem=self.systrayIcon.update_profile)
|
widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.update_profile, menuitem=self.systrayIcon.update_profile)
|
||||||
widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.show_hide, menuitem=self.systrayIcon.show_hide)
|
widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.show_hide, menuitem=self.systrayIcon.show_hide)
|
||||||
widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.check_for_updates, menuitem=self.systrayIcon.check_for_updates)
|
widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.check_for_updates, menuitem=self.systrayIcon.check_for_updates)
|
||||||
|
widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.view_documentation, menuitem=self.systrayIcon.doc)
|
||||||
widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.exit, menuitem=self.systrayIcon.exit)
|
widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.exit, menuitem=self.systrayIcon.exit)
|
||||||
widgetUtils.connect_event(self.systrayIcon, widgetUtils.TASKBAR_LEFT_CLICK, self.taskbar_left_click)
|
widgetUtils.connect_event(self.systrayIcon, widgetUtils.TASKBAR_LEFT_CLICK, self.taskbar_left_click)
|
||||||
widgetUtils.connect_event(self.systrayIcon, widgetUtils.TASKBAR_RIGHT_CLICK, self.taskbar_right_click)
|
widgetUtils.connect_event(self.systrayIcon, widgetUtils.TASKBAR_RIGHT_CLICK, self.taskbar_right_click)
|
||||||
@@ -233,7 +245,6 @@ class Controller(object):
|
|||||||
self.create_ignored_session_buffer(session_.sessions[i])
|
self.create_ignored_session_buffer(session_.sessions[i])
|
||||||
continue
|
continue
|
||||||
self.create_buffers(session_.sessions[i])
|
self.create_buffers(session_.sessions[i])
|
||||||
self.set_buffer_positions(session_.sessions[i])
|
|
||||||
|
|
||||||
# Connection checker executed each minute.
|
# Connection checker executed each minute.
|
||||||
self.checker_function = RepeatingTimer(60, self.check_connection)
|
self.checker_function = RepeatingTimer(60, self.check_connection)
|
||||||
@@ -244,6 +255,7 @@ class Controller(object):
|
|||||||
for i in session_.sessions:
|
for i in session_.sessions:
|
||||||
if session_.sessions[i].is_logged == False: continue
|
if session_.sessions[i].is_logged == False: continue
|
||||||
self.start_buffers(session_.sessions[i])
|
self.start_buffers(session_.sessions[i])
|
||||||
|
self.set_buffer_positions(session_.sessions[i])
|
||||||
if config.app["app-settings"]["play_ready_sound"] == True:
|
if config.app["app-settings"]["play_ready_sound"] == True:
|
||||||
session_.sessions[session_.sessions.keys()[0]].sound.play("ready.ogg")
|
session_.sessions[session_.sessions.keys()[0]].sound.play("ready.ogg")
|
||||||
if config.app["app-settings"]["speak_ready_msg"] == True:
|
if config.app["app-settings"]["speak_ready_msg"] == True:
|
||||||
@@ -261,6 +273,7 @@ class Controller(object):
|
|||||||
for i in session_.sessions:
|
for i in session_.sessions:
|
||||||
if session_.sessions[i].session_id == session_id: session = session_.sessions[i]
|
if session_.sessions[i].session_id == session_id: session = session_.sessions[i]
|
||||||
session.login()
|
session.login()
|
||||||
|
session.db = dict()
|
||||||
self.create_buffers(session, False)
|
self.create_buffers(session, False)
|
||||||
self.start_buffers(session)
|
self.start_buffers(session)
|
||||||
|
|
||||||
@@ -284,11 +297,11 @@ class Controller(object):
|
|||||||
self.buffers.append(mentions)
|
self.buffers.append(mentions)
|
||||||
self.view.insert_buffer(mentions.buffer, name=_(u"Mentions"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
self.view.insert_buffer(mentions.buffer, name=_(u"Mentions"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
||||||
elif i == 'dm':
|
elif i == 'dm':
|
||||||
dm = buffersController.baseBufferController(self.view.nb, "get_direct_messages", "direct_messages", session, session.db["user_name"], bufferType="dmPanel", sound="dm_received.ogg")
|
dm = buffersController.baseBufferController(self.view.nb, "get_direct_messages", "direct_messages", session, session.db["user_name"], bufferType="dmPanel", sound="dm_received.ogg", full_text=True)
|
||||||
self.buffers.append(dm)
|
self.buffers.append(dm)
|
||||||
self.view.insert_buffer(dm.buffer, name=_(u"Direct messages"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
self.view.insert_buffer(dm.buffer, name=_(u"Direct messages"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
||||||
elif i == 'sent_dm':
|
elif i == 'sent_dm':
|
||||||
sent_dm = buffersController.baseBufferController(self.view.nb, "get_sent_messages", "sent_direct_messages", session, session.db["user_name"], bufferType="dmPanel")
|
sent_dm = buffersController.baseBufferController(self.view.nb, "get_sent_messages", "sent_direct_messages", session, session.db["user_name"], bufferType="dmPanel", full_text=True)
|
||||||
self.buffers.append(sent_dm)
|
self.buffers.append(sent_dm)
|
||||||
self.view.insert_buffer(sent_dm.buffer, name=_(u"Sent direct messages"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
self.view.insert_buffer(sent_dm.buffer, name=_(u"Sent direct messages"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
||||||
elif i == 'sent_tweets':
|
elif i == 'sent_tweets':
|
||||||
@@ -299,7 +312,7 @@ class Controller(object):
|
|||||||
favourites = buffersController.baseBufferController(self.view.nb, "get_favorites", "favourites", session, session.db["user_name"])
|
favourites = buffersController.baseBufferController(self.view.nb, "get_favorites", "favourites", session, session.db["user_name"])
|
||||||
self.buffers.append(favourites)
|
self.buffers.append(favourites)
|
||||||
|
|
||||||
self.view.insert_buffer(favourites.buffer, name=_(u"Favourites"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
self.view.insert_buffer(favourites.buffer, name=_(u"Likes"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
||||||
elif i == 'followers':
|
elif i == 'followers':
|
||||||
followers = buffersController.peopleBufferController(self.view.nb, "get_followers_list", "followers", session, session.db["user_name"], screen_name=session.db["user_name"])
|
followers = buffersController.peopleBufferController(self.view.nb, "get_followers_list", "followers", session, session.db["user_name"], screen_name=session.db["user_name"])
|
||||||
self.buffers.append(followers)
|
self.buffers.append(followers)
|
||||||
@@ -329,11 +342,29 @@ class Controller(object):
|
|||||||
self.view.insert_buffer(tl.buffer, name=_(u"Timeline for {}").format(i,), pos=self.view.search("timelines", session.db["user_name"]))
|
self.view.insert_buffer(tl.buffer, name=_(u"Timeline for {}").format(i,), pos=self.view.search("timelines", session.db["user_name"]))
|
||||||
favs_timelines = buffersController.emptyPanel(self.view.nb, "favs_timelines", session.db["user_name"])
|
favs_timelines = buffersController.emptyPanel(self.view.nb, "favs_timelines", session.db["user_name"])
|
||||||
self.buffers.append(favs_timelines)
|
self.buffers.append(favs_timelines)
|
||||||
self.view.insert_buffer(favs_timelines.buffer , name=_(u"Favourites timelines"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
self.view.insert_buffer(favs_timelines.buffer , name=_(u"Likes timelines"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
||||||
for i in session.settings["other_buffers"]["favourites_timelines"]:
|
for i in session.settings["other_buffers"]["favourites_timelines"]:
|
||||||
tl = buffersController.baseBufferController(self.view.nb, "get_favorites", "%s-favorite" % (i,), session, session.db["user_name"], bufferType=None, screen_name=i)
|
tl = buffersController.baseBufferController(self.view.nb, "get_favorites", "%s-favorite" % (i,), session, session.db["user_name"], bufferType=None, screen_name=i)
|
||||||
self.buffers.append(tl)
|
self.buffers.append(tl)
|
||||||
self.view.insert_buffer(tl.buffer, name=_(u"Favourites timeline for {}").format(i,), pos=self.view.search("favs_timelines", session.db["user_name"]))
|
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 = RepeatingTimer(300, tl.start_stream)
|
||||||
tl.timer.start()
|
tl.timer.start()
|
||||||
lists = buffersController.emptyPanel(self.view.nb, "lists", session.db["user_name"])
|
lists = buffersController.emptyPanel(self.view.nb, "lists", session.db["user_name"])
|
||||||
@@ -358,40 +389,27 @@ class Controller(object):
|
|||||||
buffer.start_stream()
|
buffer.start_stream()
|
||||||
buffer.searchfunction = self.search
|
buffer.searchfunction = self.search
|
||||||
self.buffers.append(buffer)
|
self.buffers.append(buffer)
|
||||||
self.view.insert_buffer(buffer.buffer, name=_(u"Trending topics for %s") % (buffer.name_), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
|
||||||
buffer.timer = RepeatingTimer(300, buffer.start_stream)
|
buffer.timer = RepeatingTimer(300, buffer.start_stream)
|
||||||
buffer.timer.start()
|
buffer.timer.start()
|
||||||
|
self.view.insert_buffer(buffer.buffer, name=_(u"Trending topics for %s") % (buffer.name_), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
||||||
|
|
||||||
def set_buffer_positions(self,session):
|
def set_buffer_positions(self,session):
|
||||||
"Sets positions for buffers if values exist in the database."
|
"Sets positions for buffers if values exist in the database."
|
||||||
for i in self.buffers:
|
for i in self.buffers:
|
||||||
if str(i.name+"_pos") in session.db and hasattr(i.buffer,'list'):
|
if i.account == session.db["user_name"] and session.db.has_key(i.name+"_pos") and hasattr(i.buffer,'list'):
|
||||||
i.buffer.list.select_item(session.db[str(i.name+"_pos")])
|
i.buffer.list.select_item(session.db[str(i.name+"_pos")])
|
||||||
|
|
||||||
def logout_account(self, session_id):
|
def logout_account(self, session_id):
|
||||||
for i in session_.sessions:
|
for i in session_.sessions:
|
||||||
if session_.sessions[i].session_id == session_id: session = session_.sessions[i]
|
if session_.sessions[i].session_id == session_id: session = session_.sessions[i]
|
||||||
user = session.db["user_name"]
|
user = session.db["user_name"]
|
||||||
self.destroy_buffer("home_timeline", user)
|
delete_buffers = []
|
||||||
self.destroy_buffer("mentions", user)
|
for i in self.buffers:
|
||||||
self.destroy_buffer("direct_messages", user)
|
if i.account == user and i.name != user:
|
||||||
self.destroy_buffer("sent_direct_messages", user)
|
delete_buffers.append(i.name)
|
||||||
self.destroy_buffer("sent_tweets", user)
|
for i in delete_buffers:
|
||||||
self.destroy_buffer("favourites", user)
|
self.destroy_buffer(i, user)
|
||||||
self.destroy_buffer("followers", user)
|
session.db = None
|
||||||
self.destroy_buffer("friends", user)
|
|
||||||
self.destroy_buffer("blocked", user)
|
|
||||||
self.destroy_buffer("muted", user)
|
|
||||||
self.destroy_buffer("events", user)
|
|
||||||
self.destroy_buffer("timelines", user)
|
|
||||||
for i in session.settings["other_buffers"]["timelines"]:
|
|
||||||
self.destroy_buffer("%s-timeline" % (i,), user)
|
|
||||||
self.destroy_buffer("favs_timelines", user)
|
|
||||||
self.destroy_buffer("searches", user)
|
|
||||||
for i in session.settings["other_buffers"]["tweet_searches"]:
|
|
||||||
self.destroy_buffer("%s-searchterm" % (i,), user)
|
|
||||||
for i in session.settings["other_buffers"]["trending_topic_buffers"]:
|
|
||||||
self.destroy_buffer("%s_tt" % (i,), user)
|
|
||||||
|
|
||||||
def destroy_buffer(self, buffer_name, account):
|
def destroy_buffer(self, buffer_name, account):
|
||||||
buffer = self.search_buffer(buffer_name, account)
|
buffer = self.search_buffer(buffer_name, account)
|
||||||
@@ -402,7 +420,10 @@ class Controller(object):
|
|||||||
self.buffers.remove(buffer)
|
self.buffers.remove(buffer)
|
||||||
del buffer
|
del buffer
|
||||||
|
|
||||||
def search(self, value="", *args, **kwargs):
|
def search_topic(self, term):
|
||||||
|
self.search(value=term)
|
||||||
|
|
||||||
|
def search(self, event=None, value="", *args, **kwargs):
|
||||||
""" Searches words or users in twitter. This creates a new buffer containing the search results."""
|
""" Searches words or users in twitter. This creates a new buffer containing the search results."""
|
||||||
log.debug("Creating a new search...")
|
log.debug("Creating a new search...")
|
||||||
dlg = dialogs.search.searchDialog(value)
|
dlg = dialogs.search.searchDialog(value)
|
||||||
@@ -412,13 +433,14 @@ class Controller(object):
|
|||||||
if dlg.get("tweets") == True:
|
if dlg.get("tweets") == True:
|
||||||
if term not in buffer.session.settings["other_buffers"]["tweet_searches"]:
|
if term not in buffer.session.settings["other_buffers"]["tweet_searches"]:
|
||||||
buffer.session.settings["other_buffers"]["tweet_searches"].append(term)
|
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:
|
else:
|
||||||
log.error("A buffer for the %s search term is already created. You can't create a duplicate buffer." % (term,))
|
log.error("A buffer for the %s search term is already created. You can't create a duplicate buffer." % (term,))
|
||||||
return
|
return
|
||||||
elif dlg.get("users") == True:
|
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 = 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"])
|
pos=self.view.search("searches", buffer.session.db["user_name"])
|
||||||
self.insert_buffer(search, pos)
|
self.insert_buffer(search, pos)
|
||||||
self.view.insert_buffer(search.buffer, name=_(u"Search for {}").format(term), pos=pos)
|
self.view.insert_buffer(search.buffer, name=_(u"Search for {}").format(term), pos=pos)
|
||||||
@@ -476,8 +498,20 @@ class Controller(object):
|
|||||||
buffer = self.get_best_buffer()
|
buffer = self.get_best_buffer()
|
||||||
SoundsTutorial.soundsTutorial(buffer.session)
|
SoundsTutorial.soundsTutorial(buffer.session)
|
||||||
|
|
||||||
def view_user_lists(self, users):
|
def view_user_lists(self, *args, **kwargs):
|
||||||
pass
|
buff = self.get_best_buffer()
|
||||||
|
if not hasattr(buff, "get_right_tweet"): return
|
||||||
|
tweet = buff.get_right_tweet()
|
||||||
|
if buff.type != "people":
|
||||||
|
users = utils.get_all_users(tweet, buff.session.db)
|
||||||
|
else:
|
||||||
|
users = [tweet["screen_name"]]
|
||||||
|
dlg = dialogs.utils.selectUserDialog(_(u"Select the user"), users)
|
||||||
|
if dlg.get_response() == widgetUtils.OK:
|
||||||
|
user = dlg.get_user()
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
l = listsController.listsController(buff.session, user=user)
|
||||||
|
|
||||||
def add_to_list(self, *args, **kwargs):
|
def add_to_list(self, *args, **kwargs):
|
||||||
buff = self.get_best_buffer()
|
buff = self.get_best_buffer()
|
||||||
@@ -506,8 +540,32 @@ class Controller(object):
|
|||||||
except TwythonError as e:
|
except TwythonError as e:
|
||||||
output.speak("error %s: %s" % (e.error_code, e.msg))
|
output.speak("error %s: %s" % (e.error_code, e.msg))
|
||||||
|
|
||||||
def remove_from_list(self, user):
|
def remove_from_list(self, *args, **kwargs):
|
||||||
pass
|
buff = self.get_best_buffer()
|
||||||
|
if not hasattr(buff, "get_right_tweet"): return
|
||||||
|
tweet = buff.get_right_tweet()
|
||||||
|
if buff.type != "people":
|
||||||
|
users = utils.get_all_users(tweet, buff.session.db)
|
||||||
|
else:
|
||||||
|
users = [tweet["screen_name"]]
|
||||||
|
dlg = dialogs.utils.selectUserDialog(_(u"Select the user"), users)
|
||||||
|
if dlg.get_response() == widgetUtils.OK:
|
||||||
|
user = dlg.get_user()
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
dlg = dialogs.lists.removeUserListDialog()
|
||||||
|
dlg.populate_list([compose.compose_list(item) for item in buff.session.db["lists"]])
|
||||||
|
if dlg.get_response() == widgetUtils.OK:
|
||||||
|
try:
|
||||||
|
list = buff.session.twitter.twitter.delete_list_member(list_id=buff.session.db["lists"][dlg.get_item()]["id"], screen_name=user)
|
||||||
|
older_list = utils.find_item(buff.session.db["lists"][dlg.get_item()]["id"], buff.session.db["lists"])
|
||||||
|
listBuffer = self.search_buffer("%s-list" % (buff.session.db["lists"][dlg.get_item()]["name"].lower()), buff.session.db["user_name"])
|
||||||
|
if listBuffer != None: listBuffer.get_user_ids()
|
||||||
|
buff.session.db["lists"].pop(older_list)
|
||||||
|
buff.session.db["lists"].append(list)
|
||||||
|
if listBuffer != None: pub.sendMessage("restart-streams", streams=["timelinesStream"], session=buff.session)
|
||||||
|
except TwythonError as e:
|
||||||
|
output.speak("error %s: %s" % (e.error_code, e.msg))
|
||||||
|
|
||||||
def list_manager(self, *args, **kwargs):
|
def list_manager(self, *args, **kwargs):
|
||||||
s = self.get_best_buffer().session
|
s = self.get_best_buffer().session
|
||||||
@@ -559,6 +617,7 @@ class Controller(object):
|
|||||||
self.exit_()
|
self.exit_()
|
||||||
|
|
||||||
def exit_(self, *args, **kwargs):
|
def exit_(self, *args, **kwargs):
|
||||||
|
for i in self.buffers: i.save_positions()
|
||||||
log.debug("Exiting...")
|
log.debug("Exiting...")
|
||||||
log.debug("Saving global configuration...")
|
log.debug("Saving global configuration...")
|
||||||
config.app.write()
|
config.app.write()
|
||||||
@@ -696,6 +755,9 @@ class Controller(object):
|
|||||||
msg = messages.viewTweet(tweet, tweetsList)
|
msg = messages.viewTweet(tweet, tweetsList)
|
||||||
elif buffer.type == "account" or buffer.type == "empty":
|
elif buffer.type == "account" or buffer.type == "empty":
|
||||||
return
|
return
|
||||||
|
elif buffer.name == "sent_tweets":
|
||||||
|
tweet, tweetsList = buffer.get_full_tweet()
|
||||||
|
msg = messages.viewTweet(tweet, tweetsList)
|
||||||
else:
|
else:
|
||||||
non_tweet = buffer.get_formatted_message()
|
non_tweet = buffer.get_formatted_message()
|
||||||
msg = messages.viewTweet(non_tweet, [], False)
|
msg = messages.viewTweet(non_tweet, [], False)
|
||||||
@@ -713,8 +775,7 @@ class Controller(object):
|
|||||||
users = [tweet["screen_name"]]
|
users = [tweet["screen_name"]]
|
||||||
dlg = dialogs.userSelection.selectUserDialog(users=users, default=default)
|
dlg = dialogs.userSelection.selectUserDialog(users=users, default=default)
|
||||||
if dlg.get_response() == widgetUtils.OK:
|
if dlg.get_response() == widgetUtils.OK:
|
||||||
buffer = self.get_best_buffer()
|
usr = utils.if_user_exists(buff.session.twitter.twitter, dlg.get_user())
|
||||||
usr = utils.if_user_exists(buffer.session.twitter.twitter, dlg.get_user())
|
|
||||||
if usr != None:
|
if usr != None:
|
||||||
if usr["protected"] == True:
|
if usr["protected"] == True:
|
||||||
if usr["following"] == False:
|
if usr["following"] == False:
|
||||||
@@ -722,33 +783,74 @@ class Controller(object):
|
|||||||
return
|
return
|
||||||
answer = commonMessageDialogs.protected_user()
|
answer = commonMessageDialogs.protected_user()
|
||||||
if answer == widgetUtils.NO: return
|
if answer == widgetUtils.NO: return
|
||||||
if dlg.get_action() == "tweets":
|
tl_type = dlg.get_action()
|
||||||
if dlg.get_user() in buffer.session.settings["other_buffers"]["timelines"]:
|
if tl_type == "tweets":
|
||||||
|
if usr["statuses_count"] == 0:
|
||||||
|
commonMessageDialogs.no_tweets()
|
||||||
|
return
|
||||||
|
if dlg.get_user() in buff.session.settings["other_buffers"]["timelines"]:
|
||||||
commonMessageDialogs.timeline_exist()
|
commonMessageDialogs.timeline_exist()
|
||||||
return
|
return
|
||||||
tl = buffersController.baseBufferController(self.view.nb, "get_user_timeline", "%s-timeline" % (dlg.get_user(),), buffer.session, buffer.session.db["user_name"], bufferType=None, screen_name=dlg.get_user())
|
tl = buffersController.baseBufferController(self.view.nb, "get_user_timeline", "%s-timeline" % (dlg.get_user(),), buff.session, buff.session.db["user_name"], bufferType=None, screen_name=dlg.get_user())
|
||||||
tl.start_stream()
|
tl.start_stream()
|
||||||
pos=self.view.search("timelines", buffer.session.db["user_name"])
|
pos=self.view.search("timelines", buff.session.db["user_name"])
|
||||||
self.insert_buffer(tl, pos)
|
self.insert_buffer(tl, pos+1)
|
||||||
# self.buffers.insert(pos+1, tl)
|
# self.buffers.insert(pos+1, tl)
|
||||||
self.view.insert_buffer(tl.buffer, name=_(u"Timeline for {}").format(dlg.get_user()), pos=pos)
|
self.view.insert_buffer(tl.buffer, name=_(u"Timeline for {}").format(dlg.get_user()), pos=pos)
|
||||||
buffer.session.settings["other_buffers"]["timelines"].append(dlg.get_user())
|
buff.session.settings["other_buffers"]["timelines"].append(dlg.get_user())
|
||||||
pub.sendMessage("restart-streams", streams=["timelinesStream"], session=buffer.session)
|
pub.sendMessage("restart-streams", streams=["timelinesStream"], session=buff.session)
|
||||||
buffer.session.sound.play("create_timeline.ogg")
|
buff.session.sound.play("create_timeline.ogg")
|
||||||
else:
|
elif tl_type == "favourites":
|
||||||
if dlg.get_user() in buffer.session.settings["other_buffers"]["favourites_timelines"]:
|
if usr["favourites_count"] == 0:
|
||||||
|
commonMessageDialogs.no_favs()
|
||||||
|
return
|
||||||
|
if dlg.get_user() in buff.session.settings["other_buffers"]["favourites_timelines"]:
|
||||||
commonMessageDialogs.timeline_exist()
|
commonMessageDialogs.timeline_exist()
|
||||||
return
|
return
|
||||||
tl = buffersController.baseBufferController(self.view.nb, "get_favorites", "%s-favorite" % (dlg.get_user(),), buffer.session, buffer.session.db["user_name"], bufferType=None, screen_name=dlg.get_user())
|
tl = buffersController.baseBufferController(self.view.nb, "get_favorites", "%s-favorite" % (dlg.get_user(),), buff.session, buff.session.db["user_name"], bufferType=None, screen_name=dlg.get_user())
|
||||||
pos=self.view.search("favs_timelines", buffer.session.db["user_name"])
|
pos=self.view.search("favs_timelines", buff.session.db["user_name"])
|
||||||
self.insert_buffer(tl, pos)
|
self.insert_buffer(tl, pos+1)
|
||||||
# self.buffers.insert(pos+1, tl)
|
# self.buffers.insert(pos+1, tl)
|
||||||
self.view.insert_buffer(buffer=tl.buffer, name=_(u"Favourites timeline for {}").format(dlg.get_user()), pos=pos)
|
self.view.insert_buffer(buffer=tl.buffer, name=_(u"Likes for {}").format(dlg.get_user()), pos=pos)
|
||||||
tl.start_stream()
|
tl.start_stream()
|
||||||
tl.timer = RepeatingTimer(300, tl.start_stream)
|
tl.timer = RepeatingTimer(300, tl.start_stream)
|
||||||
tl.timer.start()
|
tl.timer.start()
|
||||||
buffer.session.settings["other_buffers"]["favourites_timelines"].append(dlg.get_user())
|
buff.session.settings["other_buffers"]["favourites_timelines"].append(dlg.get_user())
|
||||||
buffer.session.sound.play("create_timeline.ogg")
|
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:
|
else:
|
||||||
commonMessageDialogs.user_not_exist()
|
commonMessageDialogs.user_not_exist()
|
||||||
|
|
||||||
@@ -823,7 +925,7 @@ class Controller(object):
|
|||||||
x = tweet["coordinates"]["coordinates"][0]
|
x = tweet["coordinates"]["coordinates"][0]
|
||||||
y = tweet["coordinates"]["coordinates"][1]
|
y = tweet["coordinates"]["coordinates"][1]
|
||||||
address = geocoder.reverse_geocode(y, x)
|
address = geocoder.reverse_geocode(y, x)
|
||||||
dlg = messages.viewTweet(address[0].__str__(), False)
|
dlg = commonMessageDialogs.view_geodata(address[0].__str__())
|
||||||
else:
|
else:
|
||||||
output.speak(_(u"There are no coordinates in this tweet"))
|
output.speak(_(u"There are no coordinates in this tweet"))
|
||||||
except GeocoderError:
|
except GeocoderError:
|
||||||
@@ -920,13 +1022,11 @@ class Controller(object):
|
|||||||
|
|
||||||
def left(self, *args, **kwargs):
|
def left(self, *args, **kwargs):
|
||||||
buff = self.view.get_current_buffer_pos()
|
buff = self.view.get_current_buffer_pos()
|
||||||
print buff
|
|
||||||
buffer = self.get_current_buffer()
|
buffer = self.get_current_buffer()
|
||||||
if not hasattr(buffer.buffer, "list"):
|
if not hasattr(buffer.buffer, "list"):
|
||||||
output.speak(_(u"No session is currently in focus. Focus a session with the next or previous session shortcut."), True)
|
output.speak(_(u"No session is currently in focus. Focus a session with the next or previous session shortcut."), True)
|
||||||
return
|
return
|
||||||
if buff == self.get_first_buffer(buffer.account) or buff == 0:
|
if buff == self.get_first_buffer(buffer.account) or buff == 0:
|
||||||
print "This is the last buffer"
|
|
||||||
self.view.change_buffer(self.get_last_buffer(buffer.account))
|
self.view.change_buffer(self.get_last_buffer(buffer.account))
|
||||||
else:
|
else:
|
||||||
self.view.change_buffer(buff-1)
|
self.view.change_buffer(buff-1)
|
||||||
@@ -1177,7 +1277,7 @@ class Controller(object):
|
|||||||
buffer = self.search_buffer("%s-timeline" % (who,), user)
|
buffer = self.search_buffer("%s-timeline" % (who,), user)
|
||||||
if buffer == None: return
|
if buffer == None: return
|
||||||
play_sound = "tweet_timeline.ogg"
|
play_sound = "tweet_timeline.ogg"
|
||||||
if "%s-timeline" % (who,) not in buffer.session.settings["other_buffers"]["muted_buffers"]:
|
if "%s-timeline" % (who,) not in buffer.session.settings["other_buffers"]["muted_buffers"] and buffer.session.settings["sound"]["session_mute"] == False:
|
||||||
self.notify(buffer.session, play_sound=play_sound)
|
self.notify(buffer.session, play_sound=play_sound)
|
||||||
output.speak(_(u"One tweet from %s") % (data["user"]["name"]))
|
output.speak(_(u"One tweet from %s") % (data["user"]["name"]))
|
||||||
buffer.add_new_item(data)
|
buffer.add_new_item(data)
|
||||||
@@ -1185,8 +1285,8 @@ class Controller(object):
|
|||||||
def manage_item_in_list(self, data, user, where):
|
def manage_item_in_list(self, data, user, where):
|
||||||
buffer = self.search_buffer("%s" % (where,), user)
|
buffer = self.search_buffer("%s" % (where,), user)
|
||||||
if buffer == None: return
|
if buffer == None: return
|
||||||
play_sound = "tweet_timeline.ogg"
|
play_sound = "list_tweet.ogg"
|
||||||
if "%s" % (where,) not in buffer.session.settings["other_buffers"]["muted_buffers"]:
|
if "%s" % (where,) not in buffer.session.settings["other_buffers"]["muted_buffers"] and buffer.session.settings["sound"]["session_mute"] == False:
|
||||||
self.notify(buffer.session, play_sound=play_sound)
|
self.notify(buffer.session, play_sound=play_sound)
|
||||||
output.speak(_(u"One tweet from %s") % (data["user"]["name"]))
|
output.speak(_(u"One tweet from %s") % (data["user"]["name"]))
|
||||||
buffer.add_new_item(data)
|
buffer.add_new_item(data)
|
||||||
@@ -1199,10 +1299,26 @@ class Controller(object):
|
|||||||
log.debug("Starting the streaming endpoint")
|
log.debug("Starting the streaming endpoint")
|
||||||
session.start_streaming()
|
session.start_streaming()
|
||||||
|
|
||||||
|
def set_positions(self):
|
||||||
|
for i in session_.sessions:
|
||||||
|
self.set_buffer_positions(i)
|
||||||
|
|
||||||
def manage_stream_errors(self, session):
|
def manage_stream_errors(self, session):
|
||||||
log.error("An error ocurred with the stream for the %s session. It will be destroyed" % (session,))
|
log.error(" Restarting %s session streams. It will be destroyed" % (session,))
|
||||||
s = session_.sessions[session]
|
s = session_.sessions[session]
|
||||||
s.listen_stream_error()
|
if hasattr(s, "main_stream"):
|
||||||
|
s.main_stream.disconnect()
|
||||||
|
log.error("main stream disconnected")
|
||||||
|
del s.main_stream
|
||||||
|
if hasattr(s, "timelinesStream"):
|
||||||
|
s.timelinesStream.disconnect()
|
||||||
|
del s.timelinesStream
|
||||||
|
s.counter = 0
|
||||||
|
# s.reconnection_function_active = False
|
||||||
|
# for i in self.buffers:
|
||||||
|
# if i.invisible == True and i.session.session_id == s.session_id and i.type != "people":
|
||||||
|
# i.start_stream()
|
||||||
|
# s.listen_stream_error()
|
||||||
|
|
||||||
def check_connection(self):
|
def check_connection(self):
|
||||||
for i in session_.sessions:
|
for i in session_.sessions:
|
||||||
@@ -1215,7 +1331,7 @@ class Controller(object):
|
|||||||
if buffer == "favourites":
|
if buffer == "favourites":
|
||||||
favourites = buffersController.baseBufferController(self.view.nb, "get_favorites", "favourites", buff.session, buff.session.db["user_name"])
|
favourites = buffersController.baseBufferController(self.view.nb, "get_favorites", "favourites", buff.session, buff.session.db["user_name"])
|
||||||
self.buffers.append(favourites)
|
self.buffers.append(favourites)
|
||||||
self.view.insert_buffer(favourites.buffer, name=_(u"Favourites"), pos=self.view.search(buff.session.db["user_name"], buff.session.db["user_name"]))
|
self.view.insert_buffer(favourites.buffer, name=_(u"Likes"), pos=self.view.search(buff.session.db["user_name"], buff.session.db["user_name"]))
|
||||||
favourites.start_stream()
|
favourites.start_stream()
|
||||||
if buffer == "followers":
|
if buffer == "followers":
|
||||||
followers = buffersController.peopleBufferController(self.view.nb, "get_followers_list", "followers", buff.session, buff.session.db["user_name"], screen_name=buff.session.db["user_name"])
|
followers = buffersController.peopleBufferController(self.view.nb, "get_followers_list", "followers", buff.session, buff.session.db["user_name"], screen_name=buff.session.db["user_name"])
|
||||||
@@ -1249,7 +1365,8 @@ class Controller(object):
|
|||||||
return
|
return
|
||||||
tl = buffersController.listBufferController(self.view.nb, "get_list_statuses", create+"-list", buff.session, buff.session.db["user_name"], bufferType=None, list_id=utils.find_list(create, buff.session.db["lists"]))
|
tl = buffersController.listBufferController(self.view.nb, "get_list_statuses", create+"-list", buff.session, buff.session.db["user_name"], bufferType=None, list_id=utils.find_list(create, buff.session.db["lists"]))
|
||||||
buff.session.lists.append(tl)
|
buff.session.lists.append(tl)
|
||||||
self.buffers.append(tl)
|
pos=self.view.search("lists", buff.session.db["user_name"])
|
||||||
|
self.insert_buffer(tl, pos)
|
||||||
self.view.insert_buffer(tl.buffer, name=_(u"List for {}").format(create), pos=self.view.search("lists", buff.session.db["user_name"]))
|
self.view.insert_buffer(tl.buffer, name=_(u"List for {}").format(create), pos=self.view.search("lists", buff.session.db["user_name"]))
|
||||||
tl.start_stream()
|
tl.start_stream()
|
||||||
buff.session.settings["other_buffers"]["lists"].append(create)
|
buff.session.settings["other_buffers"]["lists"].append(create)
|
||||||
@@ -1333,29 +1450,46 @@ class Controller(object):
|
|||||||
webbrowser.open("manual.html")
|
webbrowser.open("manual.html")
|
||||||
os.chdir("../../")
|
os.chdir("../../")
|
||||||
|
|
||||||
|
def view_changelog(self, *args, **kwargs):
|
||||||
|
os.chdir("documentation")
|
||||||
|
webbrowser.open("changelog.html")
|
||||||
|
os.chdir("../")
|
||||||
|
|
||||||
def insert_buffer(self, buffer, position):
|
def insert_buffer(self, buffer, position):
|
||||||
# print ref_buf.name, ref_buf.account
|
self.buffers.insert(position, buffer)
|
||||||
# if ref_buf.account != buffer.account or ref_buf.type == "account" or type(ref_buf) == buffers.emptyPanel:
|
|
||||||
buffers = self.get_buffers_for_account(buffer.account)
|
def copy_to_clipboard(self, *args, **kwargs):
|
||||||
# ref_buf = self.buffers[position+1]
|
output.copy(self.get_current_buffer().get_message())
|
||||||
empty = True
|
output.speak(_(u"Copied"))
|
||||||
for i in buffers[position+1:]:
|
|
||||||
if i.type == "account" or i.invisible == False:
|
def repeat_item(self, *args, **kwargs):
|
||||||
empty = True
|
output.speak(self.get_current_buffer().get_message())
|
||||||
else:
|
|
||||||
empty = False
|
def execute_action(self, action):
|
||||||
if empty == True:
|
if hasattr(self, action):
|
||||||
self.buffers.append(buffer)
|
getattr(self, action)()
|
||||||
print "account"
|
|
||||||
else:
|
def restart_streams_(self, session):
|
||||||
self.buffers.insert(position+1, buffer)
|
|
||||||
for i in self.buffers:
|
for i in self.buffers:
|
||||||
print i.name, i.account
|
if i.session != None and i.session.session_id == session:
|
||||||
|
i.start_stream()
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
config.app.write()
|
config.app.write()
|
||||||
|
|
||||||
def change_buffer(self, bufferPosition):
|
def update_buffer(self, *args, **kwargs):
|
||||||
buff = self.buffers[bufferPosition]
|
bf = self.get_current_buffer()
|
||||||
newPos = self.view.search(buff.name, buff.account)
|
if not hasattr(bf, "start_stream"):
|
||||||
self.view.change_buffer(newPos)
|
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,))
|
||||||
|
|
||||||
|
def on_tweet_deleted(self, data):
|
||||||
|
id = data["delete"]["status"]["id"]
|
||||||
|
for i in self.buffers:
|
||||||
|
if hasattr(i, "remove_tweet") and hasattr(i, "name"):
|
||||||
|
i.remove_tweet(id)
|
@@ -1,5 +1,7 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
import re
|
||||||
import platform
|
import platform
|
||||||
|
import attach
|
||||||
system = platform.system()
|
system = platform.system()
|
||||||
import widgetUtils
|
import widgetUtils
|
||||||
import output
|
import output
|
||||||
@@ -25,20 +27,24 @@ class basicTweet(object):
|
|||||||
widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck)
|
widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck)
|
||||||
widgetUtils.connect_event(self.message.attach, widgetUtils.BUTTON_PRESSED, self.attach)
|
widgetUtils.connect_event(self.message.attach, widgetUtils.BUTTON_PRESSED, self.attach)
|
||||||
# if system == "Windows":
|
# if system == "Windows":
|
||||||
|
# if messageType != "dm":
|
||||||
widgetUtils.connect_event(self.message.text, widgetUtils.ENTERED_TEXT, self.text_processor)
|
widgetUtils.connect_event(self.message.text, widgetUtils.ENTERED_TEXT, self.text_processor)
|
||||||
self.text_processor()
|
|
||||||
widgetUtils.connect_event(self.message.shortenButton, widgetUtils.BUTTON_PRESSED, self.shorten)
|
widgetUtils.connect_event(self.message.shortenButton, widgetUtils.BUTTON_PRESSED, self.shorten)
|
||||||
widgetUtils.connect_event(self.message.unshortenButton, widgetUtils.BUTTON_PRESSED, self.unshorten)
|
widgetUtils.connect_event(self.message.unshortenButton, widgetUtils.BUTTON_PRESSED, self.unshorten)
|
||||||
widgetUtils.connect_event(self.message.translateButton, widgetUtils.BUTTON_PRESSED, self.translate)
|
widgetUtils.connect_event(self.message.translateButton, widgetUtils.BUTTON_PRESSED, self.translate)
|
||||||
|
if hasattr(self.message, "long_tweet"):
|
||||||
|
widgetUtils.connect_event(self.message.long_tweet, widgetUtils.CHECKBOX, self.text_processor)
|
||||||
|
self.attachments = []
|
||||||
|
|
||||||
def translate(self, event=None):
|
def translate(self, event=None):
|
||||||
dlg = translator.gui.translateDialog()
|
dlg = translator.gui.translateDialog()
|
||||||
if dlg.get_response() == widgetUtils.OK:
|
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")]
|
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")]
|
dest = [x[0] for x in translator.translator.available_languages()][dlg.get("dest_lang")]
|
||||||
msg = translator.translator.translate(text_to_translate, source, dest)
|
msg = translator.translator.translate(text=text_to_translate, source=source, target=dest)
|
||||||
self.message.set_text(msg)
|
self.message.set_text(msg)
|
||||||
|
self.text_processor()
|
||||||
self.message.text_focus()
|
self.message.text_focus()
|
||||||
output.speak(_(u"Translated"))
|
output.speak(_(u"Translated"))
|
||||||
else:
|
else:
|
||||||
@@ -52,6 +58,7 @@ class basicTweet(object):
|
|||||||
elif len(urls) == 1:
|
elif len(urls) == 1:
|
||||||
self.message.set_text(self.message.get_text().replace(urls[0], url_shortener.shorten(urls[0])))
|
self.message.set_text(self.message.get_text().replace(urls[0], url_shortener.shorten(urls[0])))
|
||||||
output.speak(_(u"URL shortened"))
|
output.speak(_(u"URL shortened"))
|
||||||
|
self.text_processor()
|
||||||
self.message.text_focus()
|
self.message.text_focus()
|
||||||
elif len(urls) > 1:
|
elif len(urls) > 1:
|
||||||
list_urls = urlList.urlList()
|
list_urls = urlList.urlList()
|
||||||
@@ -59,6 +66,7 @@ class basicTweet(object):
|
|||||||
if list_urls.get_response() == widgetUtils.OK:
|
if list_urls.get_response() == widgetUtils.OK:
|
||||||
self.message.set_text(self.message.get_text().replace(urls[list_urls.get_item()], url_shortener.shorten(list_urls.get_string())))
|
self.message.set_text(self.message.get_text().replace(urls[list_urls.get_item()], url_shortener.shorten(list_urls.get_string())))
|
||||||
output.speak(_(u"URL shortened"))
|
output.speak(_(u"URL shortened"))
|
||||||
|
self.text_processor()
|
||||||
self.message.text_focus()
|
self.message.text_focus()
|
||||||
|
|
||||||
def unshorten(self, event=None):
|
def unshorten(self, event=None):
|
||||||
@@ -69,6 +77,7 @@ class basicTweet(object):
|
|||||||
elif len(urls) == 1:
|
elif len(urls) == 1:
|
||||||
self.message.set_text(self.message.get_text().replace(urls[0], url_shortener.unshorten(urls[0])))
|
self.message.set_text(self.message.get_text().replace(urls[0], url_shortener.unshorten(urls[0])))
|
||||||
output.speak(_(u"URL expanded"))
|
output.speak(_(u"URL expanded"))
|
||||||
|
self.text_processor()
|
||||||
self.message.text_focus()
|
self.message.text_focus()
|
||||||
elif len(urls) > 1:
|
elif len(urls) > 1:
|
||||||
list_urls = urlList.urlList()
|
list_urls = urlList.urlList()
|
||||||
@@ -76,6 +85,7 @@ class basicTweet(object):
|
|||||||
if list_urls.get_response() == widgetUtils.OK:
|
if list_urls.get_response() == widgetUtils.OK:
|
||||||
self.message.set_text(self.message.get_text().replace(urls[list_urls.get_item()], url_shortener.unshorten(list_urls.get_string())))
|
self.message.set_text(self.message.get_text().replace(urls[list_urls.get_item()], url_shortener.unshorten(list_urls.get_string())))
|
||||||
output.speak(_(u"URL expanded"))
|
output.speak(_(u"URL expanded"))
|
||||||
|
self.text_processor()
|
||||||
self.message.text_focus()
|
self.message.text_focus()
|
||||||
|
|
||||||
def text_processor(self, *args, **kwargs):
|
def text_processor(self, *args, **kwargs):
|
||||||
@@ -97,59 +107,64 @@ class basicTweet(object):
|
|||||||
checker = SpellChecker.spellchecker.spellChecker(text, "")
|
checker = SpellChecker.spellchecker.spellChecker(text, "")
|
||||||
if hasattr(checker, "fixed_text"):
|
if hasattr(checker, "fixed_text"):
|
||||||
self.message.set_text(checker.fixed_text)
|
self.message.set_text(checker.fixed_text)
|
||||||
|
self.text_processor()
|
||||||
|
self.message.text_focus()
|
||||||
|
|
||||||
def attach(self, *args, **kwargs):
|
def attach(self, *args, **kwargs):
|
||||||
def completed_callback():
|
def completed_callback(dlg):
|
||||||
url = dlg.uploaderFunction.get_url()
|
url = dlg.uploaderFunction.get_url()
|
||||||
pub.unsubscribe(dlg.uploaderDialog.update, "uploading")
|
pub.unsubscribe(dlg.uploaderDialog.update, "uploading")
|
||||||
dlg.uploaderDialog.destroy()
|
dlg.uploaderDialog.destroy()
|
||||||
if url != 0:
|
if url != 0:
|
||||||
self.message.set_text(self.message.get_text()+url+" #audio")
|
self.message.set_text(self.message.get_text()+url+" #audio")
|
||||||
|
self.text_processor()
|
||||||
else:
|
else:
|
||||||
output.speak(_(u"Unable to upload the audio"))
|
output.speak(_(u"Unable to upload the audio"))
|
||||||
dlg.cleanup()
|
dlg.cleanup()
|
||||||
dlg = audioUploader.audioUploader(self.session.settings, completed_callback)
|
dlg = audioUploader.audioUploader(self.session.settings, completed_callback)
|
||||||
|
self.message.text_focus()
|
||||||
|
|
||||||
class tweet(basicTweet):
|
class tweet(basicTweet):
|
||||||
def __init__(self, session, title, caption, text, messageType="tweet", max=140):
|
def __init__(self, session, title, caption, text, twishort_enabled, messageType="tweet", max=140):
|
||||||
super(tweet, self).__init__(session, title, caption, text, messageType, max)
|
super(tweet, self).__init__(session, title, caption, text, messageType, max)
|
||||||
self.image = None
|
self.image = None
|
||||||
widgetUtils.connect_event(self.message.upload_image, widgetUtils.BUTTON_PRESSED, self.upload_image)
|
widgetUtils.connect_event(self.message.upload_image, widgetUtils.BUTTON_PRESSED, self.upload_image)
|
||||||
widgetUtils.connect_event(self.message.autocompletionButton, widgetUtils.BUTTON_PRESSED, self.autocomplete_users)
|
widgetUtils.connect_event(self.message.autocompletionButton, widgetUtils.BUTTON_PRESSED, self.autocomplete_users)
|
||||||
|
if twishort_enabled == False:
|
||||||
|
try: self.message.long_tweet.SetValue(False)
|
||||||
|
except AttributeError: pass
|
||||||
|
self.text_processor()
|
||||||
|
|
||||||
def upload_image(self, *args, **kwargs):
|
def upload_image(self, *args, **kwargs):
|
||||||
if self.message.get("upload_image") == _(u"Discard image"):
|
a = attach.attach()
|
||||||
del self.image
|
if len(a.attachments) != 0:
|
||||||
self.image = None
|
self.attachments = a.attachments
|
||||||
output.speak(_(u"Discarded"))
|
|
||||||
self.message.set("upload_image", _(u"Upload a picture"))
|
|
||||||
else:
|
|
||||||
self.image = self.message.get_image()
|
|
||||||
if self.image != None:
|
|
||||||
self.message.set("upload_image", _(u"Discard image"))
|
|
||||||
|
|
||||||
def autocomplete_users(self, *args, **kwargs):
|
def autocomplete_users(self, *args, **kwargs):
|
||||||
c = autocompletionUsers.completion.autocompletionUsers(self.message, self.session.session_id)
|
c = autocompletionUsers.completion.autocompletionUsers(self.message, self.session.session_id)
|
||||||
c.show_menu()
|
c.show_menu()
|
||||||
|
|
||||||
class reply(tweet):
|
class reply(tweet):
|
||||||
def __init__(self, session, title, caption, text, users=None):
|
def __init__(self, session, title, caption, text, twishort_enabled, users=None):
|
||||||
super(reply, self).__init__(session, title, caption, text, messageType="reply")
|
super(reply, self).__init__(session, title, caption, text, twishort_enabled, messageType="reply")
|
||||||
self.users = users
|
self.users = users
|
||||||
if self.users != None and len(self.users) > 1:
|
if self.users != None and len(self.users) > 1:
|
||||||
widgetUtils.connect_event(self.message.mentionAll, widgetUtils.BUTTON_PRESSED, self.mention_all)
|
widgetUtils.connect_event(self.message.mentionAll, widgetUtils.BUTTON_PRESSED, self.mention_all)
|
||||||
self.message.enable_button("mentionAll")
|
self.message.enable_button("mentionAll")
|
||||||
self.message.set_cursor_at_end()
|
self.message.set_cursor_at_end()
|
||||||
|
self.text_processor()
|
||||||
|
|
||||||
def mention_all(self, *args, **kwargs):
|
def mention_all(self, *args, **kwargs):
|
||||||
self.message.set_text(self.message.get_text()+self.users)
|
self.message.set_text(self.message.get_text()+self.users)
|
||||||
self.message.set_cursor_at_end()
|
self.message.set_cursor_at_end()
|
||||||
self.message.text_focus()
|
self.message.text_focus()
|
||||||
|
self.text_processor()
|
||||||
|
|
||||||
class dm(basicTweet):
|
class dm(basicTweet):
|
||||||
def __init__(self, session, title, caption, text):
|
def __init__(self, session, title, caption, text):
|
||||||
super(dm, self).__init__(session, title, caption, text, messageType="dm")
|
super(dm, self).__init__(session, title, caption, text, messageType="dm", max=10000)
|
||||||
widgetUtils.connect_event(self.message.autocompletionButton, widgetUtils.BUTTON_PRESSED, self.autocomplete_users)
|
widgetUtils.connect_event(self.message.autocompletionButton, widgetUtils.BUTTON_PRESSED, self.autocomplete_users)
|
||||||
|
self.text_processor()
|
||||||
|
|
||||||
def autocomplete_users(self, *args, **kwargs):
|
def autocomplete_users(self, *args, **kwargs):
|
||||||
c = autocompletionUsers.completion.autocompletionUsers(self.message, self.session.session_id)
|
c = autocompletionUsers.completion.autocompletionUsers(self.message, self.session.session_id)
|
||||||
@@ -157,22 +172,56 @@ class dm(basicTweet):
|
|||||||
|
|
||||||
class viewTweet(basicTweet):
|
class viewTweet(basicTweet):
|
||||||
def __init__(self, tweet, tweetList, is_tweet=True):
|
def __init__(self, tweet, tweetList, is_tweet=True):
|
||||||
|
""" This represents a tweet displayer. However it could be used for showing something wich is not a tweet, like a direct message or an event.
|
||||||
|
param tweet: A dictionary that represents a full tweet or a string for non-tweets.
|
||||||
|
param tweetList: If is_tweet is set to True, this could be a list of quoted tweets.
|
||||||
|
param is_tweet: True or false, depending wether the passed object is a tweet or not."""
|
||||||
if is_tweet == True:
|
if is_tweet == True:
|
||||||
|
image_description = []
|
||||||
text = ""
|
text = ""
|
||||||
for i in xrange(0, len(tweetList)):
|
for i in xrange(0, len(tweetList)):
|
||||||
if tweetList[i].has_key("retweeted_status"):
|
# tweets with message keys are longer tweets, the message value is the full messaje taken from twishort.
|
||||||
text = text + "rt @%s: %s\n\n" % (tweetList[i]["retweeted_status"]["user"]["screen_name"], tweetList[i]["retweeted_status"]["text"])
|
if tweetList[i].has_key("message") and tweetList[i]["is_quote_status"] == False:
|
||||||
|
value = "message"
|
||||||
else:
|
else:
|
||||||
text = text + "@%s: %s\n\n" % (tweetList[i]["user"]["screen_name"], tweetList[i]["text"])
|
value = "text"
|
||||||
|
if tweetList[i].has_key("retweeted_status") and tweetList[i]["is_quote_status"] == False:
|
||||||
|
if tweetList[i].has_key("message") == False:
|
||||||
|
text = text + "rt @%s: %s\n" % (tweetList[i]["retweeted_status"]["user"]["screen_name"], tweetList[i]["retweeted_status"]["text"])
|
||||||
|
else:
|
||||||
|
text = text + "rt @%s: %s\n" % (tweetList[i]["retweeted_status"]["user"]["screen_name"], tweetList[i][value])
|
||||||
|
else:
|
||||||
|
text = text + " @%s: %s\n" % (tweetList[i]["user"]["screen_name"], tweetList[i][value])
|
||||||
|
# tweets with extended_entities could include image descriptions.
|
||||||
|
if tweetList[i].has_key("extended_entities") and tweetList[i]["extended_entities"].has_key("media"):
|
||||||
|
for z in tweetList[i]["extended_entities"]["media"]:
|
||||||
|
if z.has_key("ext_alt_text") and z["ext_alt_text"] != None:
|
||||||
|
image_description.append(z["ext_alt_text"])
|
||||||
|
# set rt and likes counters.
|
||||||
rt_count = str(tweet["retweet_count"])
|
rt_count = str(tweet["retweet_count"])
|
||||||
favs_count = str(tweet["favorite_count"])
|
favs_count = str(tweet["favorite_count"])
|
||||||
|
# Gets the client from where this tweet was made.
|
||||||
|
source = str(re.sub(r"(?s)<.*?>", "", tweet["source"].encode("utf-8")))
|
||||||
if text == "":
|
if text == "":
|
||||||
|
if tweet.has_key("message"):
|
||||||
|
value = "message"
|
||||||
|
else:
|
||||||
|
value = "text"
|
||||||
if tweet.has_key("retweeted_status"):
|
if tweet.has_key("retweeted_status"):
|
||||||
|
if tweet.has_key("message") == False:
|
||||||
text = "rt @%s: %s" % (tweet["retweeted_status"]["user"]["screen_name"], tweet["retweeted_status"]["text"])
|
text = "rt @%s: %s" % (tweet["retweeted_status"]["user"]["screen_name"], tweet["retweeted_status"]["text"])
|
||||||
else:
|
else:
|
||||||
text = tweet["text"]
|
text = "rt @%s: %s" % (tweet["retweeted_status"]["user"]["screen_name"], tweet[value])
|
||||||
self.message = message.viewTweet(text, rt_count, favs_count)
|
else:
|
||||||
|
text = tweet[value]
|
||||||
|
text = self.clear_text(text)
|
||||||
|
if tweet.has_key("extended_entities") and tweet["extended_entities"].has_key("media"):
|
||||||
|
for z in tweet["extended_entities"]["media"]:
|
||||||
|
if z.has_key("ext_alt_text") and z["ext_alt_text"] != None:
|
||||||
|
image_description.append(z["ext_alt_text"])
|
||||||
|
self.message = message.viewTweet(text, rt_count, favs_count, source.decode("utf-8"))
|
||||||
self.message.set_title(len(text))
|
self.message.set_title(len(text))
|
||||||
|
[self.message.set_image_description(i) for i in image_description]
|
||||||
else:
|
else:
|
||||||
text = tweet
|
text = tweet
|
||||||
self.message = message.viewNonTweet(text)
|
self.message = message.viewNonTweet(text)
|
||||||
@@ -187,3 +236,10 @@ class viewTweet(basicTweet):
|
|||||||
if len(utils.find_urls_in_text(self.message.get_text())) > 0:
|
if len(utils.find_urls_in_text(self.message.get_text())) > 0:
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def clear_text(self, text):
|
||||||
|
urls = utils.find_urls_in_text(text)
|
||||||
|
for i in urls:
|
||||||
|
if "https://twitter.com/" in i:
|
||||||
|
text = text.replace(i, "\n")
|
||||||
|
return text
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import os
|
import os
|
||||||
import webbrowser
|
import webbrowser
|
||||||
import pocket
|
#import pocket
|
||||||
import sound_lib
|
import sound_lib
|
||||||
import paths
|
import paths
|
||||||
import widgetUtils
|
import widgetUtils
|
||||||
@@ -15,7 +15,7 @@ from extra.autocompletionUsers import settings
|
|||||||
from pubsub import pub
|
from pubsub import pub
|
||||||
import logging
|
import logging
|
||||||
import config_utils
|
import config_utils
|
||||||
from pocket_utils import authorisationHandler
|
#from pocket_utils import authorisationHandler
|
||||||
import BaseHTTPServer
|
import BaseHTTPServer
|
||||||
log = logging.getLogger("Settings")
|
log = logging.getLogger("Settings")
|
||||||
import keys
|
import keys
|
||||||
@@ -34,7 +34,7 @@ class globalSettingsController(object):
|
|||||||
if ".keymap" not in i:
|
if ".keymap" not in i:
|
||||||
continue
|
continue
|
||||||
try:
|
try:
|
||||||
res[config_utils.load_config(paths.app_path('keymaps/'+i))['info']['name']]=i
|
res[i[:-7]] =i
|
||||||
except:
|
except:
|
||||||
log.exception("Exception while loading keymap " + i)
|
log.exception("Exception while loading keymap " + i)
|
||||||
return res
|
return res
|
||||||
@@ -64,11 +64,13 @@ class globalSettingsController(object):
|
|||||||
self.dialog.set_value("general", "use_invisible_shorcuts", config.app["app-settings"]["use_invisible_keyboard_shorcuts"])
|
self.dialog.set_value("general", "use_invisible_shorcuts", config.app["app-settings"]["use_invisible_keyboard_shorcuts"])
|
||||||
self.dialog.set_value("general", "disable_sapi5", config.app["app-settings"]["voice_enabled"])
|
self.dialog.set_value("general", "disable_sapi5", config.app["app-settings"]["voice_enabled"])
|
||||||
self.dialog.set_value("general", "hide_gui", config.app["app-settings"]["hide_gui"])
|
self.dialog.set_value("general", "hide_gui", config.app["app-settings"]["hide_gui"])
|
||||||
|
self.dialog.set_value("general", "check_for_updates", config.app["app-settings"]["check_for_updates"])
|
||||||
self.dialog.create_proxy()
|
self.dialog.create_proxy()
|
||||||
self.dialog.set_value("proxy", "server", config.app["proxy"]["server"])
|
self.dialog.set_value("proxy", "server", config.app["proxy"]["server"])
|
||||||
self.dialog.set_value("proxy", "port", config.app["proxy"]["port"])
|
self.dialog.set_value("proxy", "port", config.app["proxy"]["port"])
|
||||||
self.dialog.set_value("proxy", "user", config.app["proxy"]["user"])
|
self.dialog.set_value("proxy", "user", config.app["proxy"]["user"])
|
||||||
self.dialog.set_value("proxy", "password", config.app["proxy"]["password"])
|
self.dialog.set_value("proxy", "password", config.app["proxy"]["password"])
|
||||||
|
|
||||||
self.dialog.realize()
|
self.dialog.realize()
|
||||||
self.response = self.dialog.get_response()
|
self.response = self.dialog.get_response()
|
||||||
|
|
||||||
@@ -79,6 +81,8 @@ class globalSettingsController(object):
|
|||||||
self.needs_restart = True
|
self.needs_restart = True
|
||||||
if self.kmnames[self.dialog.general.km.GetSelection()] != config.app["app-settings"]["load_keymap"]:
|
if self.kmnames[self.dialog.general.km.GetSelection()] != config.app["app-settings"]["load_keymap"]:
|
||||||
config.app["app-settings"]["load_keymap"] =self.kmnames[self.dialog.general.km.GetSelection()]
|
config.app["app-settings"]["load_keymap"] =self.kmnames[self.dialog.general.km.GetSelection()]
|
||||||
|
kmFile = open(paths.config_path("keymap.keymap"), "w")
|
||||||
|
kmFile.close()
|
||||||
self.needs_restart = True
|
self.needs_restart = True
|
||||||
|
|
||||||
if config.app["app-settings"]["use_invisible_keyboard_shorcuts"] != self.dialog.get_value("general", "use_invisible_shorcuts"):
|
if config.app["app-settings"]["use_invisible_keyboard_shorcuts"] != self.dialog.get_value("general", "use_invisible_shorcuts"):
|
||||||
@@ -90,6 +94,7 @@ class globalSettingsController(object):
|
|||||||
config.app["app-settings"]["handle_longtweets"] = self.dialog.get_value("general", "handle_longtweets")
|
config.app["app-settings"]["handle_longtweets"] = self.dialog.get_value("general", "handle_longtweets")
|
||||||
config.app["app-settings"]["play_ready_sound"] = self.dialog.get_value("general", "play_ready_sound")
|
config.app["app-settings"]["play_ready_sound"] = self.dialog.get_value("general", "play_ready_sound")
|
||||||
config.app["app-settings"]["speak_ready_msg"] = self.dialog.get_value("general", "speak_ready_msg")
|
config.app["app-settings"]["speak_ready_msg"] = self.dialog.get_value("general", "speak_ready_msg")
|
||||||
|
config.app["app-settings"]["check_for_updates"] = self.dialog.get_value("general", "check_for_updates")
|
||||||
if config.app["proxy"]["server"] != self.dialog.get_value("proxy", "server") or config.app["proxy"]["port"] != self.dialog.get_value("proxy", "port") or config.app["proxy"]["user"] != self.dialog.get_value("proxy", "user") or config.app["proxy"]["password"] != self.dialog.get_value("proxy", "password"):
|
if config.app["proxy"]["server"] != self.dialog.get_value("proxy", "server") or config.app["proxy"]["port"] != self.dialog.get_value("proxy", "port") or config.app["proxy"]["user"] != self.dialog.get_value("proxy", "user") or config.app["proxy"]["password"] != self.dialog.get_value("proxy", "password"):
|
||||||
if self.is_started == True:
|
if self.is_started == True:
|
||||||
self.needs_restart = True
|
self.needs_restart = True
|
||||||
@@ -145,11 +150,11 @@ class accountSettingsController(globalSettingsController):
|
|||||||
self.dialog.set_value("sound", "session_mute", self.config["sound"]["session_mute"])
|
self.dialog.set_value("sound", "session_mute", self.config["sound"]["session_mute"])
|
||||||
self.dialog.set_value("sound", "soundpack", self.config["sound"]["current_soundpack"])
|
self.dialog.set_value("sound", "soundpack", self.config["sound"]["current_soundpack"])
|
||||||
self.dialog.create_services()
|
self.dialog.create_services()
|
||||||
if self.config["services"]["pocket_access_token"] == "":
|
# if self.config["services"]["pocket_access_token"] == "":
|
||||||
self.dialog.services.set_pocket(False)
|
# self.dialog.services.set_pocket(False)
|
||||||
else:
|
# else:
|
||||||
self.dialog.services.set_pocket(True)
|
# self.dialog.services.set_pocket(True)
|
||||||
widgetUtils.connect_event(self.dialog.services.pocketBtn, widgetUtils.BUTTON_PRESSED, self.manage_pocket)
|
# widgetUtils.connect_event(self.dialog.services.pocketBtn, widgetUtils.BUTTON_PRESSED, self.manage_pocket)
|
||||||
self.dialog.set_value("services", "apiKey", self.config["sound"]["sndup_api_key"])
|
self.dialog.set_value("services", "apiKey", self.config["sound"]["sndup_api_key"])
|
||||||
self.dialog.realize()
|
self.dialog.realize()
|
||||||
self.dialog.set_title(_(u"Account settings for %s") % (self.user,))
|
self.dialog.set_title(_(u"Account settings for %s") % (self.user,))
|
||||||
@@ -259,24 +264,24 @@ class accountSettingsController(globalSettingsController):
|
|||||||
if change == True:
|
if change == True:
|
||||||
self.dialog.buffers.change_selected_item()
|
self.dialog.buffers.change_selected_item()
|
||||||
|
|
||||||
def manage_pocket(self, *args, **kwargs):
|
# def manage_pocket(self, *args, **kwargs):
|
||||||
if self.dialog.services.get_pocket_status() == _(u"Connect your Pocket account"):
|
# if self.dialog.services.get_pocket_status() == _(u"Connect your Pocket account"):
|
||||||
self.connect_pocket()
|
# self.connect_pocket()
|
||||||
else:
|
# else:
|
||||||
self.disconnect_pocket()
|
# self.disconnect_pocket()
|
||||||
|
|
||||||
def connect_pocket(self):
|
# def connect_pocket(self):
|
||||||
dlg = self.dialog.services.show_pocket_dialog()
|
# dlg = self.dialog.services.show_pocket_dialog()
|
||||||
if dlg == widgetUtils.YES:
|
# 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")
|
# 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")
|
# auth_url = pocket.Pocket.get_auth_url(code=request_token, redirect_uri="http://127.0.0.1:8080")
|
||||||
webbrowser.open_new_tab(auth_url)
|
# webbrowser.open_new_tab(auth_url)
|
||||||
httpd = BaseHTTPServer.HTTPServer(('127.0.0.1', 8080), authorisationHandler.handler)
|
# httpd = BaseHTTPServer.HTTPServer(('127.0.0.1', 8080), authorisationHandler.handler)
|
||||||
while authorisationHandler.logged == False:
|
# while authorisationHandler.logged == False:
|
||||||
httpd.handle_request()
|
# httpd.handle_request()
|
||||||
user_credentials = pocket.Pocket.get_credentials(consumer_key=keys.keyring.get("pocket_consumer_key"), code=request_token)
|
# user_credentials = pocket.Pocket.get_credentials(consumer_key=keys.keyring.get("pocket_consumer_key"), code=request_token)
|
||||||
self.dialog.services.set_pocket(True)
|
# self.dialog.services.set_pocket(True)
|
||||||
self.config["services"]["pocket_access_token"] = user_credentials["access_token"]
|
# self.config["services"]["pocket_access_token"] = user_credentials["access_token"]
|
||||||
|
|
||||||
def disconnect_dropbox(self):
|
def disconnect_dropbox(self):
|
||||||
self.config["services"]["pocket_access_token"] = ""
|
self.config["services"]["pocket_access_token"] = ""
|
||||||
|
@@ -31,6 +31,8 @@ class profileController(object):
|
|||||||
|
|
||||||
def get_data(self, screen_name):
|
def get_data(self, screen_name):
|
||||||
self.data = self.session.twitter.twitter.show_user(screen_name=screen_name)
|
self.data = self.session.twitter.twitter.show_user(screen_name=screen_name)
|
||||||
|
if screen_name != self.session.db["user_name"]:
|
||||||
|
self.friendship_status = self.session.twitter.twitter.show_friendship(source_screen_name=self.session.db["user_name"], target_screen_name=screen_name)
|
||||||
|
|
||||||
def fill_profile_fields(self):
|
def fill_profile_fields(self):
|
||||||
self.dialog.set_name(self.data["name"])
|
self.dialog.set_name(self.data["name"])
|
||||||
@@ -90,12 +92,23 @@ class profileController(object):
|
|||||||
if self.data["protected"] == True: protected = _(u"Yes")
|
if self.data["protected"] == True: protected = _(u"Yes")
|
||||||
else: protected = _(u"No")
|
else: protected = _(u"No")
|
||||||
string = string+ _(u"Protected: %s\n") % (protected)
|
string = string+ _(u"Protected: %s\n") % (protected)
|
||||||
|
if hasattr(self, "friendship_status"):
|
||||||
|
relation = False
|
||||||
|
friendship = "Relationship: "
|
||||||
|
if self.friendship_status["relationship"]["target"]["followed_by"]:
|
||||||
|
friendship += _(u"You follow {0}. ").format(self.data["name"],)
|
||||||
|
relation = True
|
||||||
|
if self.friendship_status["relationship"]["target"]["following"]:
|
||||||
|
friendship += _(u"{0} is following you.").format(self.data["name"],)
|
||||||
|
relation = True
|
||||||
|
if relation == True:
|
||||||
|
string = string+friendship+"\n"
|
||||||
string = string+_(u"Followers: %s\n Friends: %s\n") % (self.data["followers_count"], self.data["friends_count"])
|
string = string+_(u"Followers: %s\n Friends: %s\n") % (self.data["followers_count"], self.data["friends_count"])
|
||||||
if self.data["verified"] == True: verified = _(u"Yes")
|
if self.data["verified"] == True: verified = _(u"Yes")
|
||||||
else: verified = _(u"No")
|
else: verified = _(u"No")
|
||||||
string = string+ _(u"Verified: %s\n") % (verified)
|
string = string+ _(u"Verified: %s\n") % (verified)
|
||||||
string = string+ _(u"Tweets: %s\n") % (self.data["statuses_count"])
|
string = string+ _(u"Tweets: %s\n") % (self.data["statuses_count"])
|
||||||
string = string+ _(u"Favourites: %s") % (self.data["favourites_count"])
|
string = string+ _(u"Likes: %s") % (self.data["favourites_count"])
|
||||||
return string
|
return string
|
||||||
|
|
||||||
def visit_url(self, *args, **kwargs):
|
def visit_url(self, *args, **kwargs):
|
||||||
|
@@ -1,10 +1,11 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from wxUI.dialogs import userActions
|
|
||||||
from pubsub import pub
|
|
||||||
import re
|
import re
|
||||||
import widgetUtils
|
import widgetUtils
|
||||||
import output
|
import output
|
||||||
|
from wxUI.dialogs import userActions
|
||||||
|
from pubsub import pub
|
||||||
from twython import TwythonError
|
from twython import TwythonError
|
||||||
|
from extra import autocompletionUsers
|
||||||
|
|
||||||
class userActionsController(object):
|
class userActionsController(object):
|
||||||
def __init__(self, buffer, users=[], default="follow"):
|
def __init__(self, buffer, users=[], default="follow"):
|
||||||
@@ -12,9 +13,14 @@ class userActionsController(object):
|
|||||||
self.buffer = buffer
|
self.buffer = buffer
|
||||||
self.session = buffer.session
|
self.session = buffer.session
|
||||||
self.dialog = userActions.UserActionsDialog(users, default)
|
self.dialog = userActions.UserActionsDialog(users, default)
|
||||||
|
widgetUtils.connect_event(self.dialog.autocompletion, widgetUtils.BUTTON_PRESSED, self.autocomplete_users)
|
||||||
if self.dialog.get_response() == widgetUtils.OK:
|
if self.dialog.get_response() == widgetUtils.OK:
|
||||||
self.process_action()
|
self.process_action()
|
||||||
|
|
||||||
|
def autocomplete_users(self, *args, **kwargs):
|
||||||
|
c = autocompletionUsers.completion.autocompletionUsers(self.dialog, self.session.session_id)
|
||||||
|
c.show_menu("dm")
|
||||||
|
|
||||||
def process_action(self):
|
def process_action(self):
|
||||||
action = self.dialog.get_action()
|
action = self.dialog.get_action()
|
||||||
user = self.dialog.get_user()
|
user = self.dialog.get_user()
|
||||||
|
@@ -57,27 +57,25 @@ class audioUploader(object):
|
|||||||
url = base_url + '?apikey=' + self.config['sound']['sndup_api_key']
|
url = base_url + '?apikey=' + self.config['sound']['sndup_api_key']
|
||||||
else:
|
else:
|
||||||
url = base_url
|
url = base_url
|
||||||
self.uploaderFunction = transfer.Upload(field='file', url=url, filename=self.file, completed_callback=completed_callback)
|
|
||||||
elif self.dialog.get("services") == "TwUp":
|
elif self.dialog.get("services") == "TwUp":
|
||||||
url = "http://api.twup.me/post.json"
|
url = "http://api.twup.me/post.json"
|
||||||
self.uploaderFunction = transfer.Upload(field='file', url=url, filename=self.file, completed_callback=completed_callback)
|
self.uploaderFunction = transfer.Upload(obj=self, field='file', url=url, filename=self.file, completed_callback=completed_callback)
|
||||||
pub.subscribe(self.uploaderDialog.update, "uploading")
|
pub.subscribe(self.uploaderDialog.update, "uploading")
|
||||||
self.uploaderDialog.get_response()
|
self.uploaderDialog.get_response(self.uploaderFunction.perform_threaded)
|
||||||
self.uploaderFunction.perform_threaded()
|
|
||||||
|
|
||||||
def get_available_services(self):
|
def get_available_services(self):
|
||||||
services = []
|
services = []
|
||||||
services.append("TwUp")
|
|
||||||
services.append("SNDUp")
|
services.append("SNDUp")
|
||||||
|
services.append("TwUp")
|
||||||
return services
|
return services
|
||||||
|
|
||||||
def on_pause(self, *args, **kwargs):
|
def on_pause(self, *args, **kwargs):
|
||||||
if self.dialog.get("pause") == _(u"Pause"):
|
if self.dialog.get("pause") == _(u"Pause"):
|
||||||
self.recording.pause()
|
self.recording.pause()
|
||||||
self.dialog.set("pause", _(u"Resume"))
|
self.dialog.set("pause", _(u"&Resume"))
|
||||||
elif self.dialog.get("pause") == _(u"Resume"):
|
elif self.dialog.get("pause") == _(u"Resume"):
|
||||||
self.recording.play()
|
self.recording.play()
|
||||||
self.dialog.set("pause", _(U"Pause"))
|
self.dialog.set("pause", _(U"&Pause"))
|
||||||
|
|
||||||
def on_record(self, *args, **kwargs):
|
def on_record(self, *args, **kwargs):
|
||||||
if self.recording != None:
|
if self.recording != None:
|
||||||
@@ -92,7 +90,7 @@ class audioUploader(object):
|
|||||||
self.file = tempfile.mktemp(suffix='.wav')
|
self.file = tempfile.mktemp(suffix='.wav')
|
||||||
self.recording = sound.recording(self.file)
|
self.recording = sound.recording(self.file)
|
||||||
self.recording.play()
|
self.recording.play()
|
||||||
self.dialog.set("record", _(u"Stop"))
|
self.dialog.set("record", _(u"&Stop"))
|
||||||
output.speak(_(u"Recording"))
|
output.speak(_(u"Recording"))
|
||||||
|
|
||||||
def stop_recording(self):
|
def stop_recording(self):
|
||||||
@@ -100,11 +98,11 @@ class audioUploader(object):
|
|||||||
self.recording.free()
|
self.recording.free()
|
||||||
output.speak(_(u"Stopped"))
|
output.speak(_(u"Stopped"))
|
||||||
self.recorded = True
|
self.recorded = True
|
||||||
self.dialog.set("record", _(u"Record"))
|
self.dialog.set("record", _(u"&Record"))
|
||||||
self.file_attached()
|
self.file_attached()
|
||||||
|
|
||||||
def file_attached(self):
|
def file_attached(self):
|
||||||
self.dialog.set("pause", _(u"Pause"))
|
self.dialog.set("pause", _(u"&Pause"))
|
||||||
self.dialog.disable_control("record")
|
self.dialog.disable_control("record")
|
||||||
self.dialog.enable_control("play")
|
self.dialog.enable_control("play")
|
||||||
self.dialog.enable_control("discard")
|
self.dialog.enable_control("discard")
|
||||||
@@ -116,6 +114,7 @@ class audioUploader(object):
|
|||||||
if self.playing:
|
if self.playing:
|
||||||
self._stop()
|
self._stop()
|
||||||
if self.recording != None:
|
if self.recording != None:
|
||||||
|
self.cleanup()
|
||||||
self.dialog.disable_control("attach")
|
self.dialog.disable_control("attach")
|
||||||
self.dialog.disable_control("play")
|
self.dialog.disable_control("play")
|
||||||
self.file = None
|
self.file = None
|
||||||
@@ -137,11 +136,11 @@ class audioUploader(object):
|
|||||||
# try:
|
# try:
|
||||||
self.playing = sound_lib.stream.FileStream(file=unicode(self.file), flags=sound_lib.stream.BASS_UNICODE)
|
self.playing = sound_lib.stream.FileStream(file=unicode(self.file), flags=sound_lib.stream.BASS_UNICODE)
|
||||||
self.playing.play()
|
self.playing.play()
|
||||||
self.dialog.set("play", _(u"Stop"))
|
self.dialog.set("play", _(u"&Stop"))
|
||||||
try:
|
try:
|
||||||
while self.playing.is_playing:
|
while self.playing.is_playing:
|
||||||
pass
|
pass
|
||||||
self.dialog.set("play", _(u"Play"))
|
self.dialog.set("play", _(u"&Play"))
|
||||||
self.playing.free()
|
self.playing.free()
|
||||||
self.playing = None
|
self.playing = None
|
||||||
except:
|
except:
|
||||||
@@ -151,7 +150,7 @@ class audioUploader(object):
|
|||||||
output.speak(_(u"Stopped"))
|
output.speak(_(u"Stopped"))
|
||||||
self.playing.stop()
|
self.playing.stop()
|
||||||
self.playing.free()
|
self.playing.free()
|
||||||
self.dialog.set("play", _(u"Play"))
|
self.dialog.set("play", _(u"&Play"))
|
||||||
self.playing = None
|
self.playing = None
|
||||||
|
|
||||||
def postprocess(self):
|
def postprocess(self):
|
||||||
@@ -174,10 +173,6 @@ class audioUploader(object):
|
|||||||
os.remove(self.file)
|
os.remove(self.file)
|
||||||
if hasattr(self, 'wav_file'):
|
if hasattr(self, 'wav_file'):
|
||||||
os.remove(self.wav_file)
|
os.remove(self.wav_file)
|
||||||
del(self.wav_file)
|
|
||||||
if hasattr(self, 'wav_file') and os.path.exists(self.file):
|
|
||||||
os.remove(self.file)
|
|
||||||
|
|
||||||
|
|
||||||
def on_attach_exists(self, *args, **kwargs):
|
def on_attach_exists(self, *args, **kwargs):
|
||||||
self.file = self.dialog.get_file()
|
self.file = self.dialog.get_file()
|
||||||
|
@@ -1,45 +1,43 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import pycurl
|
|
||||||
import sys
|
import sys
|
||||||
import threading
|
import threading
|
||||||
import time
|
import time
|
||||||
import json
|
|
||||||
import logging
|
import logging
|
||||||
from utils import *
|
from utils import convert_bytes
|
||||||
from pubsub import pub
|
from pubsub import pub
|
||||||
|
|
||||||
log = logging.getLogger("extra.AudioUploader.transfer")
|
log = logging.getLogger("extra.AudioUploader.transfer")
|
||||||
class Transfer(object):
|
from requests_toolbelt.multipart.encoder import MultipartEncoder, MultipartEncoderMonitor
|
||||||
|
import requests
|
||||||
def __init__(self, url=None, filename=None, follow_location=True, completed_callback=None, verbose=False, *args, **kwargs):
|
import os
|
||||||
|
class Upload(object):
|
||||||
|
def __init__(self, field=None, obj=None, url=None, filename=None, follow_location=True, completed_callback=None, verbose=False, *args, **kwargs):
|
||||||
|
super(Upload, self).__init__(*args, **kwargs)
|
||||||
self.url=url
|
self.url=url
|
||||||
self.filename=filename
|
self.filename=filename
|
||||||
log.debug("Uploading audio to %s, filename %s" % (url, filename))
|
log.debug("Uploading audio to %s, filename %s" % (url, filename))
|
||||||
self.curl = pycurl.Curl()
|
|
||||||
self.start_time = None
|
self.start_time = None
|
||||||
self.completed_callback = completed_callback
|
self.completed_callback = completed_callback
|
||||||
self.background_thread = None
|
self.background_thread = None
|
||||||
self.transfer_rate = 0
|
self.transfer_rate = 0
|
||||||
self.curl.setopt(self.curl.PROGRESSFUNCTION, self.progress_callback)
|
self.local_filename=os.path.basename(self.filename)
|
||||||
self.curl.setopt(self.curl.URL, url)
|
if isinstance(self.local_filename, unicode):
|
||||||
self.curl.setopt(self.curl.NOPROGRESS, 0)
|
self.local_filename=self.local_filename.encode(sys.getfilesystemencoding())
|
||||||
self.curl.setopt(self.curl.HTTP_VERSION, self.curl.CURL_HTTP_VERSION_1_0)
|
self.m = MultipartEncoder(fields={field:(self.local_filename, open(self.filename, 'rb'), "application/octet-stream")})
|
||||||
self.curl.setopt(self.curl.FOLLOWLOCATION, int(follow_location))
|
self.monitor = MultipartEncoderMonitor(self.m, self.progress_callback)
|
||||||
self.curl.setopt(self.curl.VERBOSE, int(verbose))
|
self.response=None
|
||||||
super(Transfer, self).__init__(*args, **kwargs)
|
self.obj=obj
|
||||||
|
self.follow_location=follow_location
|
||||||
|
#the verbose parameter is deprecated and will be removed soon
|
||||||
|
|
||||||
def elapsed_time(self):
|
def elapsed_time(self):
|
||||||
if not self.start_time:
|
if not self.start_time:
|
||||||
return 0
|
return 0
|
||||||
return time.time() - self.start_time
|
return time.time() - self.start_time
|
||||||
|
|
||||||
def progress_callback(self, down_total, down_current, up_total, up_current):
|
def progress_callback(self, monitor):
|
||||||
progress = {}
|
progress = {}
|
||||||
progress["total"] = up_total
|
progress["total"] = monitor.len
|
||||||
progress["current"] = up_current
|
progress["current"] = monitor.bytes_read
|
||||||
# else:
|
|
||||||
# print "Killed function"
|
|
||||||
# return
|
|
||||||
if progress["current"] == 0:
|
if progress["current"] == 0:
|
||||||
progress["percent"] = 0
|
progress["percent"] = 0
|
||||||
self.transfer_rate = 0
|
self.transfer_rate = 0
|
||||||
@@ -56,51 +54,18 @@ class Transfer(object):
|
|||||||
def perform_transfer(self):
|
def perform_transfer(self):
|
||||||
log.debug("starting upload...")
|
log.debug("starting upload...")
|
||||||
self.start_time = time.time()
|
self.start_time = time.time()
|
||||||
self.curl.perform()
|
self.response=requests.post(url=self.url, data=self.monitor, headers={"Content-Type":self.m.content_type}, allow_redirects=self.follow_location, stream=True)
|
||||||
self.curl.close()
|
|
||||||
log.debug("Upload finished.")
|
log.debug("Upload finished.")
|
||||||
self.complete_transfer()
|
self.complete_transfer()
|
||||||
|
|
||||||
def perform_threaded(self):
|
def perform_threaded(self, *args, **kwargs):
|
||||||
self.background_thread = threading.Thread(target=self.perform_transfer)
|
self.background_thread = threading.Thread(target=self.perform_transfer)
|
||||||
self.background_thread.daemon = True
|
self.background_thread.daemon = True
|
||||||
self.background_thread.start()
|
self.background_thread.start()
|
||||||
|
|
||||||
def complete_transfer(self):
|
def complete_transfer(self):
|
||||||
if callable(self.completed_callback):
|
if callable(self.completed_callback):
|
||||||
self.curl.close()
|
self.completed_callback(self.obj)
|
||||||
self.completed_callback()
|
|
||||||
|
|
||||||
class Upload(Transfer):
|
|
||||||
|
|
||||||
def __init__(self, field=None, filename=None, *args, **kwargs):
|
|
||||||
super(Upload, self).__init__(filename=filename, *args, **kwargs)
|
|
||||||
self.response = dict()
|
|
||||||
self.curl.setopt(self.curl.POST, 1)
|
|
||||||
if isinstance(filename, unicode):
|
|
||||||
local_filename = filename.encode(sys.getfilesystemencoding())
|
|
||||||
else:
|
|
||||||
local_filename = filename
|
|
||||||
self.curl.setopt(self.curl.HTTPPOST, [(field, (self.curl.FORM_FILE, local_filename, self.curl.FORM_FILENAME, filename.encode("utf-8")))])
|
|
||||||
self.curl.setopt(self.curl.HEADERFUNCTION, self.header_callback)
|
|
||||||
self.curl.setopt(self.curl.WRITEFUNCTION, self.body_callback)
|
|
||||||
|
|
||||||
def header_callback(self, content):
|
|
||||||
self.response['header'] = content
|
|
||||||
|
|
||||||
def body_callback(self, content):
|
|
||||||
self.response['body'] = content
|
|
||||||
|
|
||||||
def get_url(self):
|
def get_url(self):
|
||||||
return json.loads(self.response['body'])['url']
|
return self.response.json()['url']
|
||||||
|
|
||||||
class Download(Transfer):
|
|
||||||
|
|
||||||
def __init__(self, follow_location=True, *args, **kwargs):
|
|
||||||
super(Download, self).__init__(*args, **kwargs)
|
|
||||||
self.download_file = open(self.filename, 'wb')
|
|
||||||
self.curl.setopt(self.curl.WRITEFUNCTION, self.download_file.write)
|
|
||||||
|
|
||||||
def complete_transfer(self):
|
|
||||||
self.download_file.close()
|
|
||||||
super(DownloadDialog, self).complete_transfer()
|
|
||||||
|
@@ -3,10 +3,10 @@ import wx
|
|||||||
from utils import *
|
from utils import *
|
||||||
import widgetUtils
|
import widgetUtils
|
||||||
|
|
||||||
class TransferDialog(widgetUtils.BaseDialog):
|
class UploadDialog(widgetUtils.BaseDialog):
|
||||||
|
|
||||||
def __init__(self, filename, *args, **kwargs):
|
def __init__(self, filename, *args, **kwargs):
|
||||||
super(TransferDialog, self).__init__(parent=None, id=wx.NewId(), *args, **kwargs)
|
super(UploadDialog, self).__init__(parent=None, id=wx.NewId(), *args, **kwargs)
|
||||||
self.pane = wx.Panel(self)
|
self.pane = wx.Panel(self)
|
||||||
self.progress_bar = wx.Gauge(parent=self.pane)
|
self.progress_bar = wx.Gauge(parent=self.pane)
|
||||||
fileBox = wx.BoxSizer(wx.HORIZONTAL)
|
fileBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
@@ -56,18 +56,6 @@ class TransferDialog(widgetUtils.BaseDialog):
|
|||||||
def create_buttons(self):
|
def create_buttons(self):
|
||||||
self.cancel_button = wx.Button(parent=self.pane, id=wx.ID_CANCEL)
|
self.cancel_button = wx.Button(parent=self.pane, id=wx.ID_CANCEL)
|
||||||
|
|
||||||
def get_response(self):
|
def get_response(self, fn):
|
||||||
self.Show()
|
wx.CallAfter(fn, 0.01)
|
||||||
|
self.ShowModal()
|
||||||
def destroy(self):
|
|
||||||
self.Destroy()
|
|
||||||
|
|
||||||
class UploadDialog(TransferDialog):
|
|
||||||
|
|
||||||
def __init__(self, filename=None, *args, **kwargs):
|
|
||||||
super(UploadDialog, self).__init__(filename=filename, *args, **kwargs)
|
|
||||||
|
|
||||||
class DownloadDialog(TransferDialog):
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super(Download, self).__init__(*args, **kwargs)
|
|
||||||
|
@@ -31,14 +31,14 @@ class audioDialog(widgetUtils.BaseDialog):
|
|||||||
btnSizer = wx.BoxSizer(wx.HORIZONTAL)
|
btnSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
btnSizer2 = wx.BoxSizer(wx.HORIZONTAL)
|
btnSizer2 = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
|
|
||||||
self.play = wx.Button(panel, -1, _(u"Play"))
|
self.play = wx.Button(panel, -1, _(u"&Play"))
|
||||||
self.play.Disable()
|
self.play.Disable()
|
||||||
self.pause = wx.Button(panel, -1, _(u"Pause"))
|
self.pause = wx.Button(panel, -1, _(u"&Pause"))
|
||||||
self.pause.Disable()
|
self.pause.Disable()
|
||||||
self.record = wx.Button(panel, -1, _(u"Record"))
|
self.record = wx.Button(panel, -1, _(u"&Record"))
|
||||||
self.record.SetFocus()
|
self.record.SetFocus()
|
||||||
self.attach_exists = wx.Button(panel, -1, _(u"Add an existing file"))
|
self.attach_exists = wx.Button(panel, -1, _(u"&Add an existing file"))
|
||||||
self.discard = wx.Button(panel, -1, _(u"Discard"))
|
self.discard = wx.Button(panel, -1, _(u"&Discard"))
|
||||||
self.discard.Disable()
|
self.discard.Disable()
|
||||||
label = wx.StaticText(panel, -1, _(u"Upload to"))
|
label = wx.StaticText(panel, -1, _(u"Upload to"))
|
||||||
self.services = wx.ComboBox(panel, -1, choices=services, value=services[0], style=wx.CB_READONLY)
|
self.services = wx.ComboBox(panel, -1, choices=services, value=services[0], style=wx.CB_READONLY)
|
||||||
@@ -47,7 +47,7 @@ class audioDialog(widgetUtils.BaseDialog):
|
|||||||
servicesBox.Add(self.services, 0, wx.ALL, 5)
|
servicesBox.Add(self.services, 0, wx.ALL, 5)
|
||||||
self.attach = wx.Button(panel, wx.ID_OK, _(u"Attach"))
|
self.attach = wx.Button(panel, wx.ID_OK, _(u"Attach"))
|
||||||
self.attach.Disable()
|
self.attach.Disable()
|
||||||
cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Cancel"))
|
cancel = wx.Button(panel, wx.ID_CANCEL, _(u"&Cancel"))
|
||||||
btnSizer.Add(self.play, 0, wx.ALL, 5)
|
btnSizer.Add(self.play, 0, wx.ALL, 5)
|
||||||
btnSizer.Add(self.pause, 0, wx.ALL, 5)
|
btnSizer.Add(self.pause, 0, wx.ALL, 5)
|
||||||
btnSizer.Add(self.record, 0, wx.ALL, 5)
|
btnSizer.Add(self.record, 0, wx.ALL, 5)
|
||||||
|
@@ -7,8 +7,8 @@ actions = reverse_sort.reverse_sort([ ("audio", _(u"Audio tweet.")),
|
|||||||
("dm_received", _(u"Direct message received.")),
|
("dm_received", _(u"Direct message received.")),
|
||||||
("dm_sent", _(u"Direct message sent.")),
|
("dm_sent", _(u"Direct message sent.")),
|
||||||
("error", _(u"Error.")),
|
("error", _(u"Error.")),
|
||||||
("favourite", _(u"Tweet favourited.")),
|
("favourite", _(u"Tweet liked.")),
|
||||||
("favourites_timeline_updated", _(u"Favourites buffer updated.")),
|
("favourites_timeline_updated", _(u"Likes buffer updated.")),
|
||||||
("geo", _(u"Geotweet.")),
|
("geo", _(u"Geotweet.")),
|
||||||
("limit", _(u"Boundary reached.")),
|
("limit", _(u"Boundary reached.")),
|
||||||
("list_tweet", _(u"List updated.")),
|
("list_tweet", _(u"List updated.")),
|
||||||
|
@@ -1,9 +1,10 @@
|
|||||||
#!/usr/bin/env python
|
# -*- coding: utf-8 -*-
|
||||||
import goslate
|
from microsofttranslator import Translator
|
||||||
|
|
||||||
|
def translate(text="", source="auto", target="en"):
|
||||||
|
t = Translator("twblue", "4KZA26GYIfmVAqQA/z16Hlucbg64hVSDTIpRjT2FqIU=")
|
||||||
|
return t.translate(text, target)
|
||||||
|
|
||||||
def translate(text, source_lang, target_lang):
|
|
||||||
gs = goslate.Goslate()
|
|
||||||
return gs.translate(text, target_lang, source_lang)
|
|
||||||
|
|
||||||
languages = {
|
languages = {
|
||||||
"af": _(u"Afrikaans"),
|
"af": _(u"Afrikaans"),
|
||||||
|
@@ -4,9 +4,10 @@ import sys
|
|||||||
import fix_arrow # A few new locales for Three languages in arrow.
|
import fix_arrow # A few new locales for Three languages in arrow.
|
||||||
import fix_urllib3_warnings # Avoiding some SSL warnings related to Twython.
|
import fix_urllib3_warnings # Avoiding some SSL warnings related to Twython.
|
||||||
import fix_win32com
|
import fix_win32com
|
||||||
|
import fix_requests #fix cacert.pem location for TWBlue binary copies
|
||||||
def setup():
|
def setup():
|
||||||
fix_arrow.fix()
|
fix_arrow.fix()
|
||||||
if hasattr(sys, "frozen"):
|
if hasattr(sys, "frozen"):
|
||||||
fix_win32com.fix()
|
fix_win32com.fix()
|
||||||
|
fix_requests.fix()
|
||||||
fix_urllib3_warnings.fix()
|
fix_urllib3_warnings.fix()
|
@@ -11,9 +11,17 @@ def fix():
|
|||||||
locales.BasqueLocale = BasqueLocale
|
locales.BasqueLocale = BasqueLocale
|
||||||
locales.TurkishLocale.names[-1] = "tr_tr"
|
locales.TurkishLocale.names[-1] = "tr_tr"
|
||||||
locales.ArabicLocale.names[-1] = "ar_eg"
|
locales.ArabicLocale.names[-1] = "ar_eg"
|
||||||
|
# insert a modified function so if there is no language available in arrow, returns English locale.
|
||||||
|
locales.get_locale = get_locale
|
||||||
# We need to reassign the locales list for updating the list with our new contents.
|
# We need to reassign the locales list for updating the list with our new contents.
|
||||||
locales._locales = locales._map_locales()
|
locales._locales = locales._map_locales()
|
||||||
|
|
||||||
|
def get_locale(name):
|
||||||
|
locale_cls = locales._locales.get(name.lower())
|
||||||
|
if locale_cls is None:
|
||||||
|
return locales.EnglishLocale()
|
||||||
|
return locale_cls()
|
||||||
|
|
||||||
class CatalaLocale(Locale):
|
class CatalaLocale(Locale):
|
||||||
names = ['ca', 'ca_ca']
|
names = ['ca', 'ca_ca']
|
||||||
past = 'Fa {0}'
|
past = 'Fa {0}'
|
||||||
@@ -67,11 +75,13 @@ class GalicianLocale(Locale):
|
|||||||
class BasqueLocale(Locale):
|
class BasqueLocale(Locale):
|
||||||
names = ['eu', 'eu_eu']
|
names = ['eu', 'eu_eu']
|
||||||
past = 'duela {0}'
|
past = 'duela {0}'
|
||||||
future = '{0}' # I don't know what's the right phrase in Basque for the future.
|
future = '{0} igarota'
|
||||||
|
|
||||||
timeframes = {
|
timeframes = {
|
||||||
'now': 'Orain',
|
'now': 'Orain',
|
||||||
'seconds': 'segundu',
|
# 'second': 'segundu bat',
|
||||||
|
'seconds': 'segundu batzuk', # without specifying a number.
|
||||||
|
#'seconds': '{0} segundu', # specifying a number
|
||||||
'minute': 'minutu bat',
|
'minute': 'minutu bat',
|
||||||
'minutes': '{0} minutu',
|
'minutes': '{0} minutu',
|
||||||
'hour': 'ordu bat',
|
'hour': 'ordu bat',
|
||||||
|
10
src/fixes/fix_requests.py
Normal file
10
src/fixes/fix_requests.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
from requests import certs, utils, adapters
|
||||||
|
import paths
|
||||||
|
|
||||||
|
def patched_where():
|
||||||
|
return paths.app_path(u"cacert.pem")
|
||||||
|
|
||||||
|
def fix():
|
||||||
|
certs.where=patched_where
|
||||||
|
utils.DEFAULT_CA_BUNDLE_PATH=patched_where()
|
||||||
|
adapters.DEFAULT_CA_BUNDLE_PATH=patched_where()
|
@@ -1,5 +1,24 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from requests.packages import urllib3
|
from requests.packages import urllib3
|
||||||
|
from requests.packages.urllib3 import fields
|
||||||
|
import six
|
||||||
|
import urllib
|
||||||
|
|
||||||
def fix():
|
def fix():
|
||||||
urllib3.disable_warnings()
|
urllib3.disable_warnings()
|
||||||
|
fields.format_header_param=patched_format_header_param
|
||||||
|
|
||||||
|
def patched_format_header_param(name, value):
|
||||||
|
if not any(ch in value for ch in '"\\\r\n'):
|
||||||
|
result = '%s="%s"' % (name, value)
|
||||||
|
try:
|
||||||
|
result.encode('ascii')
|
||||||
|
except (UnicodeEncodeError, UnicodeDecodeError):
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
return result
|
||||||
|
if not six.PY3 and isinstance(value, six.text_type): # Python 2:
|
||||||
|
value = value.encode('utf-8')
|
||||||
|
value=urllib.quote(value, safe='')
|
||||||
|
value = '%s=%s' % (name, value)
|
||||||
|
return value
|
||||||
|
@@ -1,6 +1,4 @@
|
|||||||
import win32com.client
|
import win32com.client
|
||||||
|
|
||||||
|
|
||||||
def fix():
|
def fix():
|
||||||
if win32com.client.gencache.is_readonly == True:
|
if win32com.client.gencache.is_readonly == True:
|
||||||
win32com.client.gencache.is_readonly = False
|
win32com.client.gencache.is_readonly = False
|
||||||
|
@@ -47,7 +47,7 @@ class reportBug(object):
|
|||||||
issue.project.name = application.name
|
issue.project.name = application.name
|
||||||
issue.project.id = 0
|
issue.project.id = 0
|
||||||
issue.summary = self.dialog.get("summary"),
|
issue.summary = self.dialog.get("summary"),
|
||||||
issue.description = "Reported by @%s\n\n" % (self.user_name) + self.dialog.get("description")
|
issue.description = "Reported by @%s on version %s (snapshot = %s)\n\n" % (self.user_name, application.version, application.snapshot) + self.dialog.get("description")
|
||||||
# to do: Create getters for category, severity and reproducibility in wx_UI.
|
# to do: Create getters for category, severity and reproducibility in wx_UI.
|
||||||
issue.category = constants.categories[self.dialog.category.GetSelection()]
|
issue.category = constants.categories[self.dialog.category.GetSelection()]
|
||||||
issue.reproducibility.name = constants.reproducibilities[self.dialog.reproducibility.GetSelection()]
|
issue.reproducibility.name = constants.reproducibilities[self.dialog.reproducibility.GetSelection()]
|
||||||
|
35
src/keymaps/Chicken Nugget.keymap
Normal file
35
src/keymaps/Chicken Nugget.keymap
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
[info]
|
||||||
|
name = string(default="Chicken Nugget")
|
||||||
|
desc = string(default="Remaps TWBlue shortcuts to their equivalents in Christopher Toth's Chicken Nugget Twitter client.")
|
||||||
|
author = string(default="Bill Dengler <codeofdusk@gmail.com>")
|
||||||
|
|
||||||
|
[keymap]
|
||||||
|
up = string(default="control+win+up")
|
||||||
|
down = string(default="control+win+down")
|
||||||
|
left = string(default="control+win+left")
|
||||||
|
right = string(default="control+win+right")
|
||||||
|
open_conversation = string(default="control+win+c")
|
||||||
|
show_hide = string(default="control+win+w")
|
||||||
|
post_tweet = string(default="control+win+t")
|
||||||
|
post_reply = string(default="control+win+r")
|
||||||
|
post_retweet = string(default="control+win+shift+t")
|
||||||
|
send_dm = string(default="control+win+d")
|
||||||
|
user_details = string(default="control+win+shift+u")
|
||||||
|
exit = string(default="control+win+q")
|
||||||
|
open_timeline = string(default="control+win+u")
|
||||||
|
remove_buffer = string(default="control+win+back")
|
||||||
|
audio = string(default="control+win+return")
|
||||||
|
url = string(default="control+win+b")
|
||||||
|
go_home = string(default="control+win+home")
|
||||||
|
go_end = string(default="control+win+end")
|
||||||
|
delete = string(default="control+win+delete")
|
||||||
|
clear_buffer = string(default="control+win+shift+delete")
|
||||||
|
repeat_item = string(default="control+win+space")
|
||||||
|
copy_to_clipboard = string(default="control+win+shift+c")
|
||||||
|
search = string(default="control+win+/")
|
||||||
|
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")
|
||||||
|
update_buffer = string(default="control+win+shift+u")
|
@@ -1,30 +0,0 @@
|
|||||||
[info]
|
|
||||||
name = Chicken Nugget
|
|
||||||
desc = Remaps TWBlue shortcuts to their equivalents in Christopher Toth's Chicken Nugget Twitter client.
|
|
||||||
author = Bill Dengler <codeofdusk@gmail.com>
|
|
||||||
|
|
||||||
[keymap]
|
|
||||||
up = control+win+up
|
|
||||||
down = control+win+down
|
|
||||||
left = control+win+left
|
|
||||||
right = control+win+right
|
|
||||||
open_conversation = control+win+c
|
|
||||||
show_hide = control+win+w
|
|
||||||
post_tweet = control+win+t
|
|
||||||
post_reply = control+win+r
|
|
||||||
post_retweet = control+win+shift+t
|
|
||||||
send_dm = control+win+d
|
|
||||||
user_details = control+win+shift+u
|
|
||||||
exit = control+win+q
|
|
||||||
open_timeline = control+win+u
|
|
||||||
remove_buffer = control+win+backspace
|
|
||||||
audio = control+win+return
|
|
||||||
secondary_interact = control+win+b
|
|
||||||
go_home = control+win+home
|
|
||||||
go_end = control+win+end
|
|
||||||
delete = control+win+delete
|
|
||||||
clear_buffer = control+win+shift+delete
|
|
||||||
repeat_item = control+win+space
|
|
||||||
copy_to_clipboard = control+win+shift+c
|
|
||||||
search = control+win+/
|
|
||||||
find = control+win+shift+/
|
|
@@ -1,48 +1,54 @@
|
|||||||
[info]
|
[info]
|
||||||
name = Qwitter
|
name = string(default="Qwitter")
|
||||||
desc = A keymap which emulates Qwitter as closely as possible.
|
desc = string(default="A keymap which emulates Qwitter as closely as possible.")
|
||||||
author = Bill Dengler <codeofdusk@gmail.com>
|
author = string(default="Bill Dengler <codeofdusk@gmail.com>")
|
||||||
|
|
||||||
[keymap]
|
[keymap]
|
||||||
up = control+win+up
|
up = string(default="control+win+up")
|
||||||
down = control+win+down
|
down = string(default="control+win+down")
|
||||||
left = control+win+left
|
left = string(default="control+win+left")
|
||||||
right = control+win+right
|
right = string(default="control+win+right")
|
||||||
next_account = control+win+shift+right
|
next_account = string(default="control+win+shift+right")
|
||||||
previous_account = control+win+shift+left
|
previous_account = string(default="control+win+shift+left")
|
||||||
show_hide = control+win+w
|
show_hide = string(default="control+win+w")
|
||||||
post_tweet = control+win+n
|
post_tweet = string(default="control+win+n")
|
||||||
post_reply = control+win+r
|
post_reply = string(default="control+win+r")
|
||||||
post_retweet = control+win+shift+r
|
post_retweet = string(default="control+win+shift+r")
|
||||||
send_dm = control+win+d
|
send_dm = string(default="control+win+d")
|
||||||
add_to_favourites = alt+win+f
|
add_to_favourites = string(default="alt+win+f")
|
||||||
remove_from_favourites = alt+shift+win+f
|
remove_from_favourites = string(default="alt+shift+win+f")
|
||||||
follow = control+win+l
|
follow = string(default="control+win+l")
|
||||||
user_details = control+win+shift+;
|
user_details = string(default="control+win+shift+;")
|
||||||
view_item = control+win+v
|
view_item = string(default="control+win+v")
|
||||||
exit = control+win+f4
|
exit = string(default="control+win+f4")
|
||||||
open_timeline = control+win+i
|
open_timeline = string(default="control+win+i")
|
||||||
remove_buffer = "control+win+'"
|
remove_buffer = '''string(default="control+win+'")'''
|
||||||
audio = control+win+return
|
url = string(default="control+win+return")
|
||||||
volume_up = control+win+alt+up
|
audio = string(default="control+win+shift+return")
|
||||||
volume_down = control+win+alt+down
|
volume_up = string(default="control+win+alt+up")
|
||||||
go_home = control+win+home
|
volume_down = string(default="control+win+alt+down")
|
||||||
go_end = control+win+end
|
go_home = string(default="control+win+home")
|
||||||
go_page_up = control+win+pageup
|
go_end = string(default="control+win+end")
|
||||||
go_page_down = control+win+pagedown
|
go_page_up = string(default="control+win+pageup")
|
||||||
update_profile = control+win+shift+p
|
go_page_down = string(default="control+win+pagedown")
|
||||||
delete = control+win+delete
|
update_profile = string(default="control+win+shift+p")
|
||||||
clear_buffer = control+win+shift+delete
|
delete = string(default="control+win+delete")
|
||||||
repeat_item = control+win+space
|
clear_buffer = string(default="control+win+shift+delete")
|
||||||
copy_to_clipboard = control+win+shift+c
|
repeat_item = string(default="control+win+space")
|
||||||
add_to_list = control+win+alt+l
|
copy_to_clipboard = string(default="control+win+shift+c")
|
||||||
remove_from_list = control+win+alt+shift+l
|
add_to_list = string(default="control+win+alt+l")
|
||||||
toggle_buffer_mute = control+win+alt+m
|
remove_from_list = string(default="control+win+alt+shift+l")
|
||||||
toggle_session_mute = control+win+m
|
toggle_buffer_mute = string(default="control+win+alt+m")
|
||||||
search = control+win+/
|
toggle_session_mute = string(default="control+win+m")
|
||||||
find = control+win+shift+/
|
search = string(default="control+win+/")
|
||||||
edit_keystrokes = control+win+k
|
find = string(default="control+win+shift+/")
|
||||||
view_user_lists = win+alt+shift+l
|
edit_keystrokes = string(default="control+win+k")
|
||||||
reverse_geocode = control+win+g
|
view_user_lists = string(default="win+alt+shift+l")
|
||||||
view_reverse_geocode = control+win+shift+g
|
reverse_geocode = string(default="control+win+g")
|
||||||
get_trending_topics = control+win+shift+t
|
view_reverse_geocode = string(default="control+win+shift+g")
|
||||||
|
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")
|
||||||
|
update_buffer = string(default="control+win+shift+u")
|
@@ -1,52 +0,0 @@
|
|||||||
[info]
|
|
||||||
name = Windows 10 (experimental)
|
|
||||||
desc = A keymap with remapped modifiers for Windows 10 compatibility.
|
|
||||||
author = Bill Dengler <codeofdusk@gmail.com>
|
|
||||||
|
|
||||||
[keymap]
|
|
||||||
up = alt+win+up
|
|
||||||
down = alt+win+down
|
|
||||||
left = alt+win+left
|
|
||||||
right = alt+win+right
|
|
||||||
next_account = alt+win+shift+right
|
|
||||||
previous_account = alt+win+shift+left
|
|
||||||
open_conversation = alt+win+c
|
|
||||||
show_hide = alt+win+w
|
|
||||||
post_tweet = alt+win+n
|
|
||||||
post_reply = alt+win+r
|
|
||||||
post_retweet = alt+win+shift+r
|
|
||||||
send_dm = alt+win+d
|
|
||||||
add_to_favourites = alt+win+f
|
|
||||||
remove_from_favourites = alt+shift+win+f
|
|
||||||
follow = alt+win+s
|
|
||||||
user_details = alt+win+shift+n
|
|
||||||
view_item = alt+win+v
|
|
||||||
exit = alt+win+f4
|
|
||||||
open_timeline = alt+win+i
|
|
||||||
remove_buffer = alt+win+shift+i
|
|
||||||
audio = alt+win+return
|
|
||||||
secondary_interact = alt+shift+win+return
|
|
||||||
|
|
||||||
volume_up = alt+win+shift+up
|
|
||||||
go_home = alt+win+home
|
|
||||||
volume_down = alt+win+shift+down
|
|
||||||
go_end = alt+win+end
|
|
||||||
go_page_up = alt+win+pageup
|
|
||||||
go_page_down = alt+win+pagedown
|
|
||||||
update_profile = alt+win+p
|
|
||||||
delete = alt+win+delete
|
|
||||||
clear_buffer = alt+win+shift+delete
|
|
||||||
repeat_item = alt+win+space
|
|
||||||
copy_to_clipboard = alt+win+shift+c
|
|
||||||
add_to_list = alt+win+a
|
|
||||||
remove_from_list = alt+win+shift+a
|
|
||||||
toggle_buffer_mute = alt+win+shift+m
|
|
||||||
toggle_session_mute = alt+win+m
|
|
||||||
toggle_autoread = alt+win+e
|
|
||||||
search = alt+win+-
|
|
||||||
edit_keystrokes = alt+win+k
|
|
||||||
view_user_lists = alt+win+l
|
|
||||||
get_more_items = alt+win+pageup
|
|
||||||
reverse_geocode = alt+win+g
|
|
||||||
view_reverse_geocode = alt+win+shift+g
|
|
||||||
get_trending_topics = alt+win+t
|
|
56
src/keymaps/Windows 10.keymap
Normal file
56
src/keymaps/Windows 10.keymap
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
[info]
|
||||||
|
name = string(default="Windows 10")
|
||||||
|
desc = string(default="A keymap with remapped modifiers for Windows 10 compatibility.")
|
||||||
|
author = string(default="Bill Dengler <codeofdusk@gmail.com>")
|
||||||
|
|
||||||
|
[keymap]
|
||||||
|
up = string(default="alt+win+up")
|
||||||
|
down = string(default="alt+win+down")
|
||||||
|
left = string(default="alt+win+left")
|
||||||
|
right = string(default="alt+win+right")
|
||||||
|
next_account = string(default="alt+win+shift+right")
|
||||||
|
previous_account = string(default="alt+win+shift+left")
|
||||||
|
open_conversation = string(default="alt+win+c")
|
||||||
|
show_hide = string(default="alt+win+w")
|
||||||
|
post_tweet = string(default="alt+win+n")
|
||||||
|
post_reply = string(default="control+win+r")
|
||||||
|
post_retweet = string(default="alt+win+shift+r")
|
||||||
|
send_dm = string(default="alt+win+d")
|
||||||
|
add_to_favourites = string(default="alt+win+f")
|
||||||
|
remove_from_favourites = string(default="alt+shift+win+f")
|
||||||
|
follow = string(default="alt+win+s")
|
||||||
|
user_details = string(default="alt+win+shift+n")
|
||||||
|
view_item = string(default="alt+win+v")
|
||||||
|
exit = string(default="alt+win+f4")
|
||||||
|
open_timeline = string(default="alt+win+i")
|
||||||
|
remove_buffer = string(default="alt+win+shift+i")
|
||||||
|
url = string(default="alt+win+return")
|
||||||
|
audio = string(default="alt+shift+win+return")
|
||||||
|
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="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")
|
||||||
|
repeat_item = string(default="alt+win+space")
|
||||||
|
copy_to_clipboard = string(default="alt+win+shift+c")
|
||||||
|
add_to_list = string(default="alt+win+a")
|
||||||
|
remove_from_list = string(default="alt+win+shift+a")
|
||||||
|
toggle_buffer_mute = string(default="alt+win+shift+m")
|
||||||
|
toggle_session_mute = string(default="alt+win+m")
|
||||||
|
toggle_autoread = string(default="alt+win+e")
|
||||||
|
search = string(default="alt+win+-")
|
||||||
|
edit_keystrokes = string(default="alt+win+k")
|
||||||
|
view_user_lists = string(default="alt+win+l")
|
||||||
|
get_more_items = string(default="alt+win+pageup")
|
||||||
|
reverse_geocode = string(default="alt+win+g")
|
||||||
|
view_reverse_geocode = string(default="alt+win+shift+g")
|
||||||
|
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")
|
||||||
|
update_buffer = string(default="control+alt+shift+u")
|
@@ -50,3 +50,8 @@ get_more_items = string(default="alt+win+pageup")
|
|||||||
reverse_geocode = string(default="control+win+g")
|
reverse_geocode = string(default="control+win+g")
|
||||||
view_reverse_geocode = string(default="control+win+shift+g")
|
view_reverse_geocode = string(default="control+win+shift+g")
|
||||||
get_trending_topics = string(default="control+win+t")
|
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")
|
||||||
|
update_buffer = string(default="control+win+shift+u")
|
@@ -1,54 +1,57 @@
|
|||||||
[info]
|
[info]
|
||||||
name = Default
|
name = string(default="Default")
|
||||||
desc = TWBlue's default keymap.
|
desc = string(default="TWBlue's default keymap.")
|
||||||
author = Bill Dengler <codeofdusk@gmail.com>
|
author = string(default="Bill Dengler <codeofdusk@gmail.com>")
|
||||||
|
|
||||||
[keymap]
|
[keymap]
|
||||||
up = control+win+up
|
up = string(default="control+win+up")
|
||||||
down = control+win+down
|
down = string(default="control+win+down")
|
||||||
left = control+win+left
|
left = string(default="control+win+left")
|
||||||
right = control+win+right
|
right = string(default="control+win+right")
|
||||||
next_account = control+win+shift+right
|
next_account = string(default="control+win+shift+right")
|
||||||
previous_account = control+win+shift+left
|
previous_account = string(default="control+win+shift+left")
|
||||||
open_conversation = control+win+c
|
open_conversation = string(default="control+win+c")
|
||||||
show_hide = control+win+m
|
show_hide = string(default="control+win+m")
|
||||||
post_tweet = control+win+n
|
post_tweet = string(default="control+win+n")
|
||||||
post_reply = control+win+r
|
post_reply = string(default="control+win+r")
|
||||||
post_retweet = control+win+shift+r
|
post_retweet = string(default="control+win+shift+r")
|
||||||
send_dm = control+win+d
|
send_dm = string(default="control+win+d")
|
||||||
add_to_favourites = alt+win+f
|
add_to_favourites = string(default="alt+win+f")
|
||||||
remove_from_favourites = alt+shift+win+f
|
remove_from_favourites = string(default="alt+shift+win+f")
|
||||||
follow = control+win+s
|
follow = string(default="control+win+s")
|
||||||
user_details = control+win+alt+n
|
user_details = string(default="control+win+alt+n")
|
||||||
view_item = control+win+v
|
view_item = string(default="control+win+v")
|
||||||
exit = control+win+f4
|
exit = string(default="control+win+f4")
|
||||||
open_timeline = control+win+i
|
open_timeline = string(default="control+win+i")
|
||||||
remove_buffer = control+win+shift+i
|
remove_buffer = string(default="control+win+shift+i")
|
||||||
audio = control+alt+win+return
|
audio = string(default="control+alt+win+return")
|
||||||
url = control+win+return
|
url = string(default="control+win+return")
|
||||||
volume_up = control+win+alt+up
|
volume_up = string(default="control+win+alt+up")
|
||||||
volume_down = control+win+alt+down
|
volume_down = string(default="control+win+alt+down")
|
||||||
go_home = control+win+home
|
go_home = string(default="control+win+home")
|
||||||
go_end = control+win+end
|
go_end = string(default="control+win+end")
|
||||||
go_page_up = control+win+pageup
|
go_page_up = string(default="control+win+pageup")
|
||||||
go_page_down = control+win+pagedown
|
go_page_down = string(default="control+win+pagedown")
|
||||||
update_profile = alt+win+p
|
update_profile = string(default="alt+win+p")
|
||||||
delete = control+win+delete
|
delete = string(default="control+win+delete")
|
||||||
clear_buffer = control+win+shift+delete
|
clear_buffer = string(default="control+win+shift+delete")
|
||||||
repeat_item = control+win+space
|
repeat_item = string(default="control+win+space")
|
||||||
copy_to_clipboard = control+win+c
|
copy_to_clipboard = string(default="control+win+shift+c")
|
||||||
add_to_list = control+win+a
|
add_to_list = string(default="control+win+a")
|
||||||
remove_from_list = control+win+shift+a
|
remove_from_list = string(default="control+win+shift+a")
|
||||||
toggle_buffer_mute = control+win+shift+m
|
toggle_buffer_mute = string(default="control+win+shift+m")
|
||||||
toggle_session_mute = alt+win+m
|
toggle_session_mute = string(default="alt+win+m")
|
||||||
toggle_autoread = control+win+e
|
toggle_autoread = string(default="control+win+e")
|
||||||
search = control+win+-
|
search = string(default="control+win+-")
|
||||||
edit_keystrokes = control+win+k
|
edit_keystrokes = string(default="control+win+k")
|
||||||
view_user_lists = control+win+l
|
view_user_lists = string(default="control+win+l")
|
||||||
get_more_items = alt+win+pageup
|
get_more_items = string(default="alt+win+pageup")
|
||||||
reverse_geocode = control+win+g
|
reverse_geocode = string(default="control+win+g")
|
||||||
view_reverse_geocode = control+win+shift+g
|
view_reverse_geocode = string(default="control+win+shift+g")
|
||||||
get_trending_topics = control+win+t
|
get_trending_topics = string(default="control+win+t")
|
||||||
find = control+win+{
|
find = string(default="control+win+{")
|
||||||
secondary_interact = control+win+alt+return
|
check_for_updates = string(default="control+win+u")
|
||||||
interact = control+win+return
|
list_manager = string(default="control+win+shift+l")
|
||||||
|
configuration = string(default="control+win+o")
|
||||||
|
accountConfiguration = string(default="control+win+shift+o")
|
||||||
|
update_buffer = string(default="control+win+shift+u")
|
@@ -5,10 +5,17 @@ import exceptions
|
|||||||
from ctypes import c_char_p
|
from ctypes import c_char_p
|
||||||
from libloader import load_library
|
from libloader import load_library
|
||||||
import paths
|
import paths
|
||||||
|
#if application.snapshot == True:
|
||||||
|
# if platform.architecture()[0][:2] == "32":
|
||||||
|
# lib = load_library("snapshot_api_keys32", x86_path=paths.app_path("keys/lib"))
|
||||||
|
# else:
|
||||||
|
# lib = load_library("snapshot_api_keys64", x64_path=paths.app_path("keys/lib"))
|
||||||
|
#else:
|
||||||
if platform.architecture()[0][:2] == "32":
|
if platform.architecture()[0][:2] == "32":
|
||||||
lib = load_library("api_keys32", x86_path=paths.app_path("keys/lib"))
|
lib = load_library("stable_api_keys32", x86_path=paths.app_path("keys/lib"))
|
||||||
else:
|
else:
|
||||||
lib = load_library("api_keys64", x64_path=paths.app_path("keys/lib"))
|
lib = load_library("stable_api_keys64", x64_path=paths.app_path("keys/lib"))
|
||||||
|
|
||||||
# import linuxKeys
|
# import linuxKeys
|
||||||
# lib = linuxKeys
|
# lib = linuxKeys
|
||||||
|
|
||||||
|
Binary file not shown.
BIN
src/keys/lib/snapshot_api_keys32.dll
Normal file
BIN
src/keys/lib/snapshot_api_keys32.dll
Normal file
Binary file not shown.
Binary file not shown.
BIN
src/keys/lib/stable_api_keys32.dll
Normal file
BIN
src/keys/lib/stable_api_keys32.dll
Normal file
Binary file not shown.
BIN
src/keys/lib/stable_api_keys64.dll
Normal file
BIN
src/keys/lib/stable_api_keys64.dll
Normal file
Binary file not shown.
@@ -11,8 +11,8 @@ actions = {
|
|||||||
"post_reply": _(u"Reply"),
|
"post_reply": _(u"Reply"),
|
||||||
"post_retweet": _(u"Retweet"),
|
"post_retweet": _(u"Retweet"),
|
||||||
"send_dm": _(u"Send direct message"),
|
"send_dm": _(u"Send direct message"),
|
||||||
"add_to_favourites": _(u"Mark as favourite"),
|
"add_to_favourites": _(u"Like a tweet"),
|
||||||
"remove_from_favourites": _(u"Remove from favourites"),
|
"remove_from_favourites": _(u"Unlike a tweet"),
|
||||||
"follow": _(u"Open the user actions dialogue"),
|
"follow": _(u"Open the user actions dialogue"),
|
||||||
"user_details": _(u"See user details"),
|
"user_details": _(u"See user details"),
|
||||||
"view_item": _(u"Show tweet"),
|
"view_item": _(u"Show tweet"),
|
||||||
@@ -46,4 +46,10 @@ actions = {
|
|||||||
"view_reverse_geocode": _(u"Display the tweet's geolocation in a dialog"),
|
"view_reverse_geocode": _(u"Display the tweet's geolocation in a dialog"),
|
||||||
"get_trending_topics": _(u"Create a trending topics buffer"),
|
"get_trending_topics": _(u"Create a trending topics buffer"),
|
||||||
"open_conversation": _(u"View conversation"),
|
"open_conversation": _(u"View conversation"),
|
||||||
|
"check_for_updates": _(u"Check and download updates"),
|
||||||
|
"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."),
|
||||||
}
|
}
|
@@ -3,6 +3,7 @@ import widgetUtils
|
|||||||
import config
|
import config
|
||||||
import wx_ui
|
import wx_ui
|
||||||
import constants
|
import constants
|
||||||
|
from pubsub import pub
|
||||||
|
|
||||||
class KeystrokeEditor(object):
|
class KeystrokeEditor(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -14,6 +15,7 @@ class KeystrokeEditor(object):
|
|||||||
self.hold_map = self.map.copy()
|
self.hold_map = self.map.copy()
|
||||||
self.dialog.put_keystrokes(constants.actions, self.map)
|
self.dialog.put_keystrokes(constants.actions, self.map)
|
||||||
widgetUtils.connect_event(self.dialog.edit, widgetUtils.BUTTON_PRESSED, self.edit_keystroke)
|
widgetUtils.connect_event(self.dialog.edit, widgetUtils.BUTTON_PRESSED, self.edit_keystroke)
|
||||||
|
widgetUtils.connect_event(self.dialog.execute, widgetUtils.BUTTON_PRESSED, self.execute_action)
|
||||||
self.dialog.get_response()
|
self.dialog.get_response()
|
||||||
|
|
||||||
def edit_keystroke(self, *args, **kwargs):
|
def edit_keystroke(self, *args, **kwargs):
|
||||||
@@ -35,12 +37,9 @@ class KeystrokeEditor(object):
|
|||||||
|
|
||||||
def get_edited_keystroke(self, dialog):
|
def get_edited_keystroke(self, dialog):
|
||||||
keys = []
|
keys = []
|
||||||
if dialog.get("win") == False:
|
|
||||||
wx_ui.no_win_message()
|
|
||||||
return
|
|
||||||
if dialog.get("control") == True:
|
if dialog.get("control") == True:
|
||||||
keys.append("control")
|
keys.append("control")
|
||||||
# if dialog.get("win") == True:
|
if dialog.get("win") == True:
|
||||||
keys.append("win")
|
keys.append("win")
|
||||||
if dialog.get("alt") == True:
|
if dialog.get("alt") == True:
|
||||||
keys.append("alt")
|
keys.append("alt")
|
||||||
@@ -52,3 +51,7 @@ class KeystrokeEditor(object):
|
|||||||
wx_ui.no_key()
|
wx_ui.no_key()
|
||||||
return
|
return
|
||||||
return "+".join(keys)
|
return "+".join(keys)
|
||||||
|
|
||||||
|
def execute_action(self, *args, **kwargs):
|
||||||
|
action = self.dialog.actions[self.dialog.get_action()]
|
||||||
|
pub.sendMessage("execute-action", action=action)
|
@@ -13,18 +13,20 @@ class keystrokeEditorDialog(baseDialog.BaseWXDialog):
|
|||||||
self.keys = widgets.list(self, _(u"Action"), _(u"Keystroke"), style=wx.LC_REPORT|wx.LC_SINGLE_SEL, size=(400, 450))
|
self.keys = widgets.list(self, _(u"Action"), _(u"Keystroke"), style=wx.LC_REPORT|wx.LC_SINGLE_SEL, size=(400, 450))
|
||||||
self.keys.list.SetFocus()
|
self.keys.list.SetFocus()
|
||||||
firstSizer = wx.BoxSizer(wx.HORIZONTAL)
|
firstSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
firstSizer.Add(keysText)
|
firstSizer.Add(keysText, 0, wx.ALL, 5)
|
||||||
firstSizer.Add(self.keys.list)
|
firstSizer.Add(self.keys.list, 0, wx.ALL, 5)
|
||||||
self.edit = wx.Button(panel, -1, _(u"Edit"))
|
self.edit = wx.Button(panel, -1, _(u"Edit"))
|
||||||
self.edit.SetDefault()
|
self.edit.SetDefault()
|
||||||
|
self.execute = wx.Button(panel, -1, _(u"Execute action"))
|
||||||
close = wx.Button(panel, wx.ID_CANCEL, _(u"Close"))
|
close = wx.Button(panel, wx.ID_CANCEL, _(u"Close"))
|
||||||
secondSizer = wx.BoxSizer(wx.HORIZONTAL)
|
secondSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
secondSizer.Add(self.edit)
|
secondSizer.Add(self.edit, 0, wx.ALL, 5)
|
||||||
secondSizer.Add(close)
|
secondSizer.Add(self.execute, 0, wx.ALL, 5)
|
||||||
sizer.Add(firstSizer)
|
secondSizer.Add(close, 0, wx.ALL, 5)
|
||||||
sizer.Add(secondSizer)
|
sizer.Add(firstSizer, 0, wx.ALL, 5)
|
||||||
panel.SetSizerAndFit(sizer)
|
sizer.Add(secondSizer, 0, wx.ALL, 5)
|
||||||
|
panel.SetSizer(sizer)
|
||||||
|
self.SetClientSize(sizer.CalcMin())
|
||||||
|
|
||||||
def put_keystrokes(self, actions, keystrokes):
|
def put_keystrokes(self, actions, keystrokes):
|
||||||
for i in keystrokes:
|
for i in keystrokes:
|
||||||
|
@@ -69,6 +69,8 @@ def getLanguageDescription(language):
|
|||||||
"ar":pgettext("languageName","Arabic"),
|
"ar":pgettext("languageName","Arabic"),
|
||||||
"ne":pgettext("languageName","Nepali"),
|
"ne":pgettext("languageName","Nepali"),
|
||||||
"sr":pgettext("languageName","Serbian (Latin)"),
|
"sr":pgettext("languageName","Serbian (Latin)"),
|
||||||
|
"ja":pgettext("languageName","Japanese"),
|
||||||
|
"ro":pgettext("languageName","Romanian"),
|
||||||
}.get(language,None)
|
}.get(language,None)
|
||||||
return desc
|
return desc
|
||||||
|
|
||||||
@@ -195,10 +197,14 @@ def langToWindowsLocale(lang):
|
|||||||
"gl": "glc",
|
"gl": "glc",
|
||||||
"eu": "euq",
|
"eu": "euq",
|
||||||
"hu": "hun",
|
"hu": "hun",
|
||||||
|
"hr": "hrv",
|
||||||
"it": "ita",
|
"it": "ita",
|
||||||
|
"ja": "jpn",
|
||||||
"pl": "plk",
|
"pl": "plk",
|
||||||
"pt": "ptb",
|
"pt": "ptb",
|
||||||
|
"ro": "rom",
|
||||||
"ru": "rus",
|
"ru": "rus",
|
||||||
"tr": "trk"
|
"tr": "trk",
|
||||||
|
"sr": "eng",
|
||||||
}
|
}
|
||||||
return languages[lang]
|
return languages[lang]
|
||||||
|
@@ -1,13 +1,26 @@
|
|||||||
from pywintypes import com_error
|
from pywintypes import com_error
|
||||||
|
import win32com
|
||||||
|
import paths
|
||||||
|
win32com.__gen_path__=paths.com_path()
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
sys.path.append(os.path.join(win32com.__gen_path__, "."))
|
||||||
from win32com.client import gencache
|
from win32com.client import gencache
|
||||||
|
fixed=False
|
||||||
|
|
||||||
def prepare_gencache():
|
def prepare_gencache():
|
||||||
gencache.is_readonly = False
|
gencache.is_readonly = False
|
||||||
gencache.GetGeneratePath()
|
gencache.GetGeneratePath()
|
||||||
|
|
||||||
|
def patched_getmodule(modname):
|
||||||
|
mod=__import__(modname)
|
||||||
|
return sys.modules[modname]
|
||||||
|
|
||||||
def load_com(*names):
|
def load_com(*names):
|
||||||
|
global fixed
|
||||||
|
if fixed==False:
|
||||||
|
gencache._GetModule=patched_getmodule
|
||||||
|
fixed=True
|
||||||
result = None
|
result = None
|
||||||
for name in names:
|
for name in names:
|
||||||
try:
|
try:
|
||||||
|
@@ -32,7 +32,7 @@ def load_library(library, x86_path='.', x64_path='.', *args, **kwargs):
|
|||||||
loaded = _do_load(lib, *args, **kwargs)
|
loaded = _do_load(lib, *args, **kwargs)
|
||||||
if loaded is not None:
|
if loaded is not None:
|
||||||
return loaded
|
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):
|
def _do_load(file, *args, **kwargs):
|
||||||
loader = TYPES[platform.system()]['loader']
|
loader = TYPES[platform.system()]['loader']
|
||||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user