Compare commits

...

127 Commits

Author SHA1 Message Date
a8f7477a1f new snapshot 2016-02-02 09:38:43 -06:00
9b6461e34e Updated translations 2016-02-02 09:37:06 -06:00
eed3f81cb8 Added a changelog html file 2016-02-02 09:30:13 -06:00
e605c750b1 Spell checker: Now it should work with the default language setting 2016-02-02 09:29:35 -06:00
f49be6cfed Merge branch 'next-gen' of https://github.com/manuelcortez/TWBlue into next-gen 2016-02-02 09:09:56 -06:00
696faed007 Fixed a bug in the spell checker 2016-02-02 09:07:40 -06:00
Jose Manuel Delicado
46b46c4d6d Some important code fixes 2016-01-30 17:14:41 +01:00
Jose Manuel Delicado
9cdccca5ff Updated Windows dependencies with the new pa.c installer 3.1.1 2016-01-21 14:00:21 +01:00
Jose Manuel Delicado
564bee3850 Updated Windows dependencies. Updated readme with information about the new pywin32 and pycurl releases 2016-01-20 20:52:44 +01:00
Jose Manuel Delicado
79e723f740 Updated windows dependencies. Run git submodule update. 2016-01-20 20:28:54 +01:00
Jose Manuel Delicado
08a2eca98d Main.py: check if Uninstall.exe exists before importing commandline and other modules 2016-01-20 09:18:27 +01:00
Jose Manuel Delicado
c830d4b5b4 The -i and -p switches aren't required anymore on installed and portable versions 2016-01-19 19:52:09 +01:00
112391afeb Merge pull request #68 from masonasons/next-gen
Trimmed the sounds in the soundpack.
2016-01-11 13:41:06 -06:00
masonasons
39e0431b97 Trimmed the beginnings of the sounds in the Default soundpack 2016-01-09 01:01:20 -06:00
071d75926b Opus support for TWBlue. Code by @masonasons 2016-01-09 00:46:33 -06:00
56b64e5c6d Added source in view tweet dialogue. @masonasons 2016-01-09 00:45:52 -06:00
b8cfd60c9e bugfix 2016-01-09 00:25:28 -06:00
691a9ae17d Fixed remove_buffer and load_previous_items for friends and users timelines 2015-12-29 08:31:13 -06:00
214b9a8809 Fixed a bug with the restart_stream function 2015-12-28 09:05:09 -06:00
e85f54e15c Merge pull request #67 from Oliver2213/update-readme
Update the "upgrade all" command to include missing dependencies
2015-12-27 11:09:59 -06:00
blake oliver
d2245c33ce Update the "upgrade all" command to include missing dependencies 2015-12-27 11:43:25 -05:00
ff6695bba3 Added ANY in the language list for tweet searches 2015-12-27 00:03:15 -06:00
cdcdc86627 Changed go_page_up and go_page_down in the win10 default keymap 2015-12-26 23:39:31 -06:00
b4addf9329 Add update buffer option to the menu bar 2015-12-26 23:34:19 -06:00
9d0c9cfdb5 Don't get new items for people buffers 2015-12-26 23:28:46 -06:00
0afba81c71 Update buffers by pressing ctrl+win+shift+u; workaround for dm issues 2015-12-26 09:02:08 -06:00
0882e4707d Removed an unneeded import in translator module 2015-12-23 09:52:32 -06:00
78079e142f Changed handlers for sent direct messages 2015-12-23 09:51:09 -06:00
00a4203e1a Switched to the microsoft translator 2015-12-23 09:48:50 -06:00
c4fae3b70b Windows key is no longer required in keymap editor 2015-12-17 08:28:20 -06:00
b8dfa4a5e8 added audio playback to the keymap editor 2015-12-16 20:16:18 -06:00
1ca1862a08 Merge branch 'next-gen' of https://github.com/manuelcortez/TWBlue into next-gen 2015-12-16 16:40:30 -06:00
ba76c74324 Minor changes in session controller 2015-12-16 16:32:58 -06:00
Jose Manuel Delicado
dda37f0083 Updated windows dependencies. Run git submodule update before submiting new commits. Updated readme.md with information about the portableapps.com format. 2015-12-14 13:46:55 +01:00
65c353450e Improvements in the tweets' searched 2015-12-09 17:25:46 -06:00
2bfb53abe1 Added showing followers and friends timelines 2015-12-09 11:51:37 -06:00
ab08eada81 Fixed TWBlue in non-ascii paths 2015-12-09 10:05:17 -06:00
Jose Manuel Delicado
5fcc1de9a5 Updated windows dependencies, remember to run git submodule update after pulling the repository! Removed wheel information about pycurl in readme and updated download links 2015-11-30 17:38:58 +01:00
Jose Manuel Delicado
baeb0f7ae8 Updated pa.c format to version 0.80, added romanian language to the installer 2015-11-30 11:50:59 +01:00
333158a7be New stable version 2015-11-29 20:32:08 -06:00
f24c0955ce ADded libraries for the new stable version. 2015-11-28 10:24:16 -06:00
67412125df Removed pocket related things 2015-11-28 09:54:58 -06:00
f8e14d7040 Added new languages to the doc generator 2015-11-28 09:47:24 -06:00
4532cf867a Undated translations for documentation 2015-11-28 09:46:09 -06:00
79d2f70be9 Added romanian translation. Updated translations 2015-11-28 09:40:16 -06:00
b4eb11a6de Some list improvements 2015-11-27 09:17:14 -06:00
45f663a462 Updated documentation with translators list 2015-11-27 09:16:48 -06:00
5b8ce7757c Modified translators list 2015-11-27 08:24:28 -06:00
e47e0ba3f5 Added more detailed information about licenses 2015-11-27 08:05:41 -06:00
105debe4da Fixed duplicated streams. Removed unneeded code for connection checkers 2015-11-23 10:30:23 -06:00
a053788cce Added code for the future romanian translation 2015-11-23 09:35:21 -06:00
6d578d5203 Fixed a bug with twishort in the longtweets handler 2015-11-18 09:26:07 -06:00
21aacfc2af NEw version 10.96 2015-11-06 09:00:47 -06:00
93dc3ad646 New snapshot 2015-11-03 10:13:09 -06:00
8e67ed025c Changed favourites for likes 2015-11-03 10:07:06 -06:00
fa1b8bfde3 Added more keystrokes to the invisible interface 2015-11-03 09:02:19 -06:00
7dfe2cbb5c Lists should work 2015-11-03 05:56:57 -06:00
880c421f3e added check for updates to the invisible interface 2015-11-03 05:25:03 -06:00
e1b8d49af5 manage_stream_errors will only delete the stream objects 2015-11-03 04:42:38 -06:00
e1d14b8c27 Now conversation buffers are removed properly 2015-11-03 04:41:01 -06:00
594b0cd546 Translator is working properly again 2015-11-03 04:40:05 -06:00
fe9f724673 Updated accessible_output2. Add mac and a better linux support 2015-11-03 04:38:59 -06:00
6a4a3cc94e Cache com saved in data directory. Translation service restored 2015-10-31 20:57:21 -06:00
Jose Manuel Delicado
af41dcfc4e com.py: use config_path instead of data_path. Paths.py: some strings weren't appended as unicode 2015-10-24 23:01:23 +02:00
31611d8429 Merge branch 'next-gen' of https://github.com/manuelcortez/TWBlue into next-gen 2015-10-23 11:37:43 -05:00
7ed44c839e New snapshot 2015-10-23 11:36:36 -05:00
503c65692d FFix for creating favourites timelines 2015-10-23 11:33:56 -05:00
f76b86b24d A sound bugfix 2015-10-23 11:29:59 -05:00
1f96e71b63 workaround for duplicated tweets 2015-10-23 11:28:54 -05:00
Jose Manuel Delicado
cc249fe1a7 Added japanese, croatian and serbian (latin) languages to the installer 2015-10-19 12:47:52 +02:00
Jose Manuel Delicado
268bd35f3a Updated windows dependencies. Remember to run git submodule update before submiting new commits 2015-10-19 10:52:05 +02:00
Jose Manuel Delicado
0307c0abe3 Fixed com cache error 2015-10-18 22:18:43 +02:00
Jose Manuel Delicado
adf062f654 Now com cache is stored in the config folder, so program files folder keeps untouched on installed copies. Updated contributors in application.py, fixed spelling in some comments in main.py 2015-10-18 12:19:43 +02:00
70b5f25cf0 New snapshot 2015-10-15 08:55:54 -05:00
2b65b89afb Disabled translation service 2015-10-15 08:54:30 -05:00
44e8ed6456 Removed send errors in some functions 2015-10-14 20:38:42 -05:00
792655e299 Improved stream reconnection 2015-10-14 17:30:41 -05:00
0f56d8cdd4 Quoted tweets again 2015-10-14 17:07:57 -05:00
6c47dd2fa9 Some fixes for URL Player 2015-10-14 17:07:30 -05:00
Jose Manuel Delicado
49073bc151 Added new packages to readme.md. Now setup.py adds wx localization files to the binary version. 2015-10-04 18:15:09 +02:00
Jose Manuel Delicado
336acd9860 updated translations 2015-10-03 13:25:23 +02:00
4daeeb7beb Disable some things before snapshot 2015-10-03 05:12:22 -05:00
408ff50404 New snapshot 2015-10-03 04:55:02 -05:00
148c5176c6 Reverted quoted tweets support 2015-10-03 04:34:43 -05:00
bdb9de863f A fw bugfixes 2015-10-02 15:52:08 -05:00
ce1f8b2cc3 New snapshot 2015-09-29 09:39:47 -05:00
5933323beb Updated translation templates 2015-09-29 09:38:39 -05:00
22b1b0a149 Added posibility for search a term in trending topics 2015-09-29 09:37:04 -05:00
e71afeb10f View other user's lists is implemented 2015-09-29 09:22:19 -05:00
98f026156d Fixed search in application menu 2015-09-29 08:42:04 -05:00
cbee57aa30 Quoted tweets support in buffers 2015-09-29 08:38:05 -05:00
fd9e4dc05d New snapshot 2015-09-23 10:01:43 -05:00
6022cecad1 Added japanese, croatian and serbian 2015-09-23 10:01:22 -05:00
89e39e2168 Double tweets should be ignored in streams 2015-09-23 10:01:00 -05:00
a69bf99c1a If there is no locale for language, use English in arrow 2015-09-23 10:00:14 -05:00
d34ef81324 Updated locales 2015-09-23 09:59:34 -05:00
a3c050195a Twishort retweets are displayed as espected 2015-09-17 09:00:30 -05:00
3623eafacd handle_longtweets is enabled by default 2015-09-17 08:59:59 -05:00
Sukil Etxenike
2bd3f0a1d1 Updated docs with contributors 2015-09-06 23:09:14 +02:00
f1f828522e Translation templates updated 2015-09-05 11:46:34 -05:00
51e4898346 Add shorcuts to the audio upload dialogue 2015-09-05 11:42:47 -05:00
c4478198b6 NEw snapshot 2015-08-31 11:18:10 -05:00
f468924b85 Merge branch 'next-gen' of https://github.com/manuelcortez/TWBlue into next-gen 2015-08-31 11:03:54 -05:00
158b48e4d5 Add and remove user to list are implemented in GUI 2015-08-31 10:08:34 -05:00
756a58e443 New timeline sound is played again 2015-08-31 08:42:28 -05:00
85ce5b0791 Trending topics now have their names at startup 2015-08-31 08:15:37 -05:00
Jose Manuel Delicado
e534d1cd20 Updated readme. 2015-08-28 11:47:54 +02:00
2d35304ef0 New snapshot 2015-08-27 08:13:01 -05:00
4f0e6d758b Restores buffer positions at startup using cached database 2015-08-25 13:37:31 -05:00
bd4aa89c2b Added text_focus() in some actions to the tweet dialogue 2015-08-24 10:00:34 -05:00
b046360293 Added right click menu in buffers 2015-08-24 09:54:15 -05:00
6971fb3999 Bugfix in retweet with comment 2015-08-21 09:55:05 -05:00
7b840f29c4 Keystroke editor can execute the actions directly 2015-08-21 09:51:01 -05:00
71fed7300b IF there are no tweets or favs, the timeline is not created 2015-08-21 09:12:54 -05:00
57315c3b6e open_timeline() cleaned 2015-08-21 08:57:15 -05:00
3d3abc90e1 Expanded URL are displayed in the view tweet dialogue 2015-08-20 17:57:06 -05:00
de7882e4cf Logout session improvements 2015-08-20 17:32:27 -05:00
jmdaweb
10190d61c0 Fixed windows dependencies submodule. Please, don't forget to run git submodule update before sending a commit or pull request. 2015-08-19 13:38:10 +02:00
bb6fa7cb46 logout() now removes database for the session 2015-08-19 05:28:56 -05:00
80cb70c9a6 Merge branch 'next-gen' of https://github.com/manuelcortez/TWBlue into next-gen 2015-08-18 08:05:21 -05:00
77d51aa51a New snapshot 2015-08-18 08:04:58 -05:00
jmdaweb
ebb4e22d02 Updated Windows dependencies. Now wx buttons and messages should be localized. 2015-08-16 15:42:17 +02:00
4344a0df0c Get full text for dm buffers 2015-08-12 17:21:00 -05:00
34ad0c5e47 Reconnecting streams every 5 mins 2015-08-12 16:43:23 -05:00
704ade560a Increasing character limit for direct messages 2015-08-12 15:57:29 -05:00
a4892cf847 TWBlue does not change the current session in invisible interface 2015-08-11 08:58:11 -05:00
e59661775a Updated translations 2015-08-10 09:49:16 -05:00
172 changed files with 32358 additions and 23951 deletions

6
COPYING Normal file
View 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.

View File

@@ -1,4 +1,4 @@
TWBlue - TWBlue -
====== ======
Copyright (C) 2015. [Technow S.L.](https://www.technow.es) Copyright (C) 2015. [Technow S.L.](https://www.technow.es)
@@ -32,14 +32,13 @@ 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/) * [Pycurl](http://pycurl.sourceforge.net) 7.21.5 for Python 2.7: [downloads](https://pypi.python.org/pypi/pycurl/7.21.5)
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 TW Blue 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
The windows installers are available only in the windows-dependencies folder The windows installers are available only in the windows-dependencies folder
@@ -68,11 +67,14 @@ setuptools install a script, called easy_install. You can find it in the python
* 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 pypubsub pygeocoder arrow python-dateutil futures markdown microsofttranslator
#### Other dependencies #### Other dependencies
@@ -87,6 +89,11 @@ This dependency has been built using pure basic 4.61. Its source can be found at
* [NSIS unicode,](http://www.scratchpaper.com/) version 2.46.5 * [NSIS unicode,](http://www.scratchpaper.com/) version 2.46.5
#### Dependencies required to build the portableApps.com format archive
* [PortableApps.com Launcher,](http://portableapps.com/apps/development/portableapps.com_launcher) version 2.2
* [PortableApps.com Installer,](http://portableapps.com/apps/development/portableapps.com_installer) version 3.0.20
### Running TW Blue from source ### 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 +102,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 +119,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 in 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 in your PortableApps.com platform, follow these steps:
* Navigate to the src directory, and create a binary version for x86: C:\python27\python setup.py py2exe
* Move the dist directory to the misc\pa.c format\app folder in this repo, and rename it to twblue
* Repeat these steps with Python for x64: C:\python27x64\python setup.py py2exe
* Move the new dist directory to the misc\pa.c format\app folder, and rename it to twblue64
* Run the PortableApps.com Launcher Generator, and follow the wizard. Choose the pa.c format folder and continue to generate the launcher. If the wizard is completed, you will see a file named TWBlue portable.exe inside the pa.c format folder.
* Run the PortableApps.com Installer, and follow the wizard. As in the above step, choose the pa.c format folder. When it completes, you will see a file named TWBluePortable_x.y.paf.exe inside the misc folder, where x.y is the version number.

View File

@@ -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"]
#"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):

View File

@@ -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: 2015-11-27 08:24+Hora estándar central (México)\n"
"PO-Revision-Date: 2015-07-07 19:07+0200\n" "PO-Revision-Date: 2015-11-28 15:57+0100\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"
@@ -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."

View File

@@ -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: 2015-11-27 08:24+Hora estándar central (México)\n"
"PO-Revision-Date: 2015-07-03 17:49-0600\n" "PO-Revision-Date: 2015-11-27 08:30-0600\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.6.11\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"

184
doc/locales/fr/changes.html Normal file
View File

@@ -0,0 +1,184 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta name="generator" content="pandoc" />
<title>Liste des Changements</title>
<style type="text/css">code{white-space: pre;}</style>
</head>
<body>
<div id="header">
<h1 class="title">Liste des Changements</h1>
</div>
<h1 id="attention">Attention !</h1>
<p>Avant de poursuivre l'essai du programme, il est considéré que c'est une version de développement. Plus précisément, la version 0.42. Cela signifie qu'il n'est pas seulement possible de trouver des erreurs, mais que vous les trouverez. L'idée est de signaler le plus d'erreurs possibles afin qu'ils puisse être résolus pour les prochaines alphas.</p>
<p>Voici la liste des changements dans le programme. Si vous voulez lire comment l'utiliser, <a href="manual.html">voir ce document.</a> Si vous voyez un lien avec un signe dièse (#) et un code qui commence par plusieurs numéro, vous voyez une erreur qui a été signalé dans le Système de suivi d'incidences. N'hésitez pas à publier vos propres erreurs et demandes d'améliorations et nouvelles fonctionnalités à travers de cet outils, disponible dans le menu Aide de TW Blue.</p>
<h2 id="changements-ajouter-dans-cette-nouvelle-version">Changements ajouter dans cette nouvelle version</h2>
<ul>
<li>Correction d'une erreur qu'elle ne permettait pas d'afficher les listes avec des accents ou des caractères spéciaux dans un tampon.</li>
<li>Maintenant TW blue ne devrait pas actualiser les Tweets soudainement.</li>
<li>Maintenant TW blue supporte l'option &quot;muet&quot; de Twitter. Lorsque cette option est activée pour un utilisateur, vous ne pouvez pas voir ces tweets ni ces mentions, mais vous le suivez toujours, et vous serez en mesure de être en contact avec lui à travers de message direct. Ceci est différent de la fonction Bloquer ou Ne pas suivre, avec cette option l'utilisateur sera pas au courant que vous avez activée l'option muet. sette option se trouvent dans la boîte de dialogue des actions utilisateur de l'interface invisible, ou dans le menu Utilisateur de l'interface graphique.</li>
<li>Un onglet &quot;Audio&quot; a été ajoutée dans la boîte de dialogue de configuration qui vous permet de sélectionner les périphériques d'entrée et de sortie, régler le volume et activer/ désactiver tous les sons pour TW Blue. D'autres options ont été déplacées depuis l'onglet &quot;Général&quot; vers l'onglet &quot;Audio&quot;.</li>
<li>Le fichier de configuration a été repensé. La plupart des options devront être reconfigurés à nouveau.</li>
<li>Vous pouvez maintenant désactiver SAPI5 afin qu'il n'intervienne pas s'il n'y a aucun lecteur d'écran supporté en cours d'exécution.</li>
<li>Dans l'onglet Général, Vous pouvez modifier manuellement la langue. Tw Blue reqiere redémarré.</li>
<li>Maintenant il y a une nouvelle boîte de dialogue où vous pouvez apprendre les différents sons de TW Blue.</li>
<li>Il est possible maintenant de désactiver le son et notification d'un tampon. Le reste du client fonctionnera correctement. Appuyez sur Contrôle+Windows+Maj+m (interface invisible) ou le sélectionnez depuis le menu &quot;Tampon&quot; (interface visible) pour basculer entre cette fonctionnalité.</li>
<li>Vous pouvez maintenant rechercher par utilisateur et par tweets. Les recherches de tweets sont sauvegardées dans la configuration, tandis que ceux des utilisateurs seront supprimer lors de la fermeture. Appuyez sur Ctrl+Windows+- (tiret) (interface invisible) ou le sélectionnez depuis le menu &quot;Application&quot; (interface visible).</li>
<li>Vous pouvez ouvrir le tampon pour voir les favoris d'un utilisateur dans le menu &quot;Utilisateur&quot;.</li>
<li>Maintenant avec Contrôle+Windows+Maj+Flèche Haut / Bas (dans l'interface graphique) et Contrôle+Windows+Flèche Haut / Bas (dans l'interface invisible), vous pouvez aller au tweet précédent ou suivant dans la conversation. Pour que cela fonctionne les tweets de la conversation doivent être dans la chronologie principale.</li>
<li>Au cours d'un enregistrement audio pour ajouter, maintenant vous pouvez mettre en pause ou reprendre l'enregistrement pour sauter des parties qui peuvent générer un audio très long.</li>
<li>Il est maintenant possible de charger de l'audio vers Dropbox. Pour configurer le service aller dans l'onglet &quot;Services audio&quot; dans la boîte de dialogue de Configuration.</li>
<li>Maintenant que vous pouvez charger de l'audio vers Dropbox, dans la boîte de dialogue pour ajouter un audio vous pouvez sélectionner le service auquelle vous souhaitez charger.</li>
<li>Maintenant il comprend une boîte de dialogue pour la correction orthographique pour les tweets ou messages. Les langues actuellement disponibles sont: Espagnol, Anglais, Portugais, Russe et Polonais. La langue sera sélectionnée automatiquement selon la configuration de TW Blue.</li>
<li>Ajouter la lecture automatique des Tweets pour un tampon. L'activation de cette fonctionnalité peut faire que TW Blue lit automatiquement les tweets lors de l'arrivée dans les tampons qui ont cette option activée. Appuyez sur Contrôle+Windows+e pour basculer entre cette fonction.</li>
<li>Dans la boîte de dialogue de Configuration maintenant vous pouvez spécifiez si vous voulez que TW Blue démarre avec l'interface invisible.</li>
<li>Les URLs s'affiche dans leur version originale. Uniquement les photos de Twitter ils apparaissent toujours comme réduites, et celles qui ont été réduites manuellement avant de les envoyer dans un tweet.</li>
</ul>
<h2 id="changements-ajouter-dans-la-version-0.40">Changements ajouter dans la version 0.40</h2>
<ul>
<li>Vous pouvez changer entre les différents paquets de sons utilisé par TW Blue et de créer vos propres sons. Chaque paquet doit être dans un répertoire par séparé dans le dossier sounds. Pour modifier le paquet de sons vous pouvez le sélectionner dans la boîte de dialogue de configuration.</li>
<li>Les fichiers audio doivent être au format OGG.</li>
<li>TW Blue doit être maintenant en mesure de fermer correctement.</li>
<li>L'heure est écrit tenant en compte le format 12 heures (AM /P M).</li>
<li>L'heure est écrit d'accord au fuseau horaire que vous avez défini dans votre compte Twitter.</li>
<li>Ajout de nouvelles traductions en Portugais, Polonais et Russe. Merci les gars !</li>
<li>TW Blue supprime de la configuration la chronologie de l'utilisateur qui ont changé leur noms ou supprimer leurs comptes Twitter.</li>
<li>Maintenant est gérés la grande majorité des événements dans Twitter avec le tampon des événements.</li>
<li>Il est maintenant possible de voir le texte des événements avec Contrôle+Maj+V (GUI) ou Contrôle+Windows+V (interface invisible).</li>
<li>Gestionnaire de listes: Vous pouvez créer, modifier, supprimer, afficher une liste comme tampon dans TW Blue, ajouter et supprimer des membres d'une liste.</li>
<li>Maintenant, si au démarrage de TW Blue il tente de charger une chronologie qui n'existe pas, automatiquement il la supprime de la configuration et il continue à charger normalement.</li>
<li>Seuls seront chargées jusqu'à 400 following et followers pour éviter les problèmes avec l'API. Elle sera corrigée dans les versions futures.</li>
<li>Pour le mode invisible, il inclus des raccourcis pour réentendre le tweet sur lequel vous êtes (Contrôle+Windows+espace) et pour copier le message dans le presse-papiers (Contrôle+Windows+c).</li>
</ul>
<h2 id="changements-ajouter-dans-la-version-0.38">Changements ajouter dans la version 0.38</h2>
<ul>
<li>Correction d'une erreur qui empêchait en donnant l'ordre de fermer.</li>
<li>Maintenant les tweets ne finissent pas par un point obligatoirement. Si le programme détecte que le tweet se termine par une lettre ou un chiffre, il va placez un point automatiquement. Si ce n'est pas le cas, il va laisser le texte tel qu'il est.</li>
<li>Il est maintenant possible de charger des images aux tweets et réponses. Veuillez noter que la taille des images est mis en place par twitter.</li>
<li>Pour se déplacer vers la gauche ou vers la droite en utilisant le mode invisible, maintenant il s'annonce uniquement des informations de la position dans la liste d'éléments.</li>
<li>TW Blue devrait maintenant fonctionner pour Windows XP au moment de la demande d'autorisation pour l'application.</li>
<li>Ajouté une nouvelle option dans la boîte de dialogue de configuration qui vous permet de revenir à vos tampons. Cela signifie que vous pouvez choisir si vous voulez voir les tweets comme jusqu'à maintenant, ou que les plus nouveaux soit placés vers le haut et les anciens vers le bas.</li>
<li>Maintenant les photos peuvent être chargées aux profil de Twitter, disponible à partir de la boîte de dialogue Mettre à jour votre profil.</li>
<li>Ajouté un tampon d'événements, où ils sont stockés pour le moment quelques événements qui se déroulent dans Twitter, comme suivre ou faire que quelqu'un vous suivent, marquer un favori, que un de vos tweet soit marqué comme favoris, Etc. Vous pouvez activer et désactiver ce tampon de la boîte de dialogue de configuration.</li>
<li>Maintenant, vous pouvez supprimer des chronologies déjà créé qui ne contiennent pas des tweets, et il ne sera pas permit de créer des chronologies pour les utilisateurs sans tweets.</li>
<li>L'interface de l'application est traduisible. Maintenant, n'importe quel utilisateur peut faire leurs propres traductions en différentes langues.</li>
</ul>
<h2 id="changements-ajouter-dans-la-version-0.36">Changements ajouter dans la version 0.36</h2>
<ul>
<li>Les utilisateurs brésiliens pourront voir quelques messages en Portugais. (Usuários brasileiros poderão ver algumas mensagens em Português).</li>
<li>Correction d'une erreur qui fait que quelques sons ils peuvent s'entendre et d'autres non. Maintenant, ils devraient s'entendre tous.</li>
<li>La réconnexion aussi a reçu une correction, parce que parfois, il s'effectué de façon incorrecte et il devait s'ouvrir à nouveau l'application.</li>
<li>Maintenant TW Blue permet de supprimer uniquement les chronologies avec la commande correspondante. Avant il s'affichées la boîte de dialogue peu importe dans quel tampon vous aviez été.</li>
<li>Vous êtes en mesure à nouveau de voir les détails des utilisateurs avec la touche Entrée étant dans le tampon pour les following ou followers.</li>
<li>À partir de cette version, il n'y a pas de support pour les bases de données.</li>
<li>Vous entendrez une notification vocale lorsque quelqu'un marque comme favori un de vos tweets.</li>
<li>Les following et followers sont déjà mis à jour.</li>
<li>lorsque vous suivez quelqu'un, il ne se produit aucune erreur Si ne sont pas affichées les following. C'est la même chose avec les followers.</li>
<li>Vous pouvez effacer un tampon en appuyant sur Maj+Supprimer dans la fenêtre visible, et Contrôle+Windows+Maj+Supprimer dans la fenêtre invisible. Ceci va vider tous les tweets dans le tampon courant.</li>
</ul>
<h2 id="changements-ajouter-dans-la-version-0.35">Changements ajouter dans la version 0.35</h2>
<ul>
<li>Il existe un site Web officiel pour le programme, aller sur <a href="http://twblue.com.mx">twblue.com.mx.</a> Dans cet espace, vous trouverez le système de suivi d'erreurs, le blog avec les dernières nouvelles, et la dernière version disponible.</li>
<li>TW Blue il annonce lorsque vous êtes mentionné, et lorsque vous obtenez un message direct.</li>
<li>Jaws il ne dit pas le raccourci clavier qui est appuyé dans le mode invisible. <a href="http://twblue.a12x.net/errores/view.php?id=11">#11</a></li>
<li>Dans le mode invisible, les commandes Contrôle+Windows+Origine, Contrôle+Windows+Fin, Contrôle+Windows+Page Suivante et Contrôle+Windows+Page Précédente va aller vers le haut de la liste, vers la fin, 20 éléments vers le bas et 20 éléments vers le haut respectivement. <a href="http://twblue.a12x.net/errores/view.php?id=10">#10,</a> <a href="http://twblue.a12x.net/errores/view.php?id=21">#21,</a> <a href="http://twblue.a12x.net/errores/view.php?id=22">#22</a></li>
<li>Maintenant vous pouvez lire l'audios d'Audiobook.</li>
<li>Maintenant, le flux doit être connecté une fois que la machine revient d'une suspension.</li>
<li>Il est possible d'enregistrer de l'audio ou charger fichiers sur SndUp.net. Si vous êtes inscrit dans cette page, vous pouvez mettre dans la configuration votre API Key pour que les fichiers se charge sur votre nom. Vous pouvez charger des fichiers Wav, OGG et MP3. Les fichiers wav ils seront récodifier en OGG.</li>
<li>Si vous n'utilisez aucun lecteur d'écran, quelques actions de TW blue utilisent la synthèse vocale SAPI5.</li>
<li>Il existe une version pour les architectures de 64 Bits. Merci à <span class="citation">[@jmdaweb]</span>(https://twitter.com/jmdaweb) pour prendre le travail de faire fonctionner l'application dans cette architecture et la préparez pour sa distribution.</li>
<li>Changement dans les sons du client. Merci à <span class="citation">[@guilevi_es]</span>(https://twitter.com/guilevi_es) pour la collaboration avec le paquet de sons.</li>
<li>Quelques messages du programme peuvent être traduits. Dans des futures versions la totalité de l'interface sera internationalisé.</li>
<li>Et quelques correction d'erreur en plus (<a href="http://twblue.com.mx/errores/view.php?id=5">#5,</a> <a href="http://twblue.com.mx/errores/view.php?id=7">#7,</a> <a href="http://twblue.com.mx/errores/view.php?id=8">#8,</a> <a href="http://twblue.com.mx/errores/view.php?id=9">#9,</a> <a href="http://twblue.com.mx/errores/view.php?id=12">#12,</a>)</li>
</ul>
<h2 id="changements-ajouter-dans-la-version-0.3">Changements ajouter dans la version 0.3</h2>
<ul>
<li>Maintenant vous pouvez mettre à jour votre profil à partir de TW Blue. <a href="http://twblue.a12x.net/issues/view.php?id=19">#19</a></li>
<li>Maintenant vous pouvez créer les chronologies à nouveau et ils ne donne pas de problèmes. <a href="http://twblue.a12x.net/issues/view.php?id=24">#24</a></li>
<li>Maintenant les fichiers d'erreur sont enregistrés dans le répertoire &quot;logs&quot;.</li>
<li>Lorsque vous créez une chronologie, il sera mis à jour en temps réel dès le début au lieu de le mettre à jour toutes les 2 minutes.</li>
<li>Vous pouvez maintenant demander davantage d'appels à l'API qui fonctionnera pour obtenir 200 tweets chaqu'une. Un appel est équivalent à 200 éléments de la liste principal, mentions, messages directs, favoris et chronologies. Dans le fichier de configuration Vous pouvez modifier l'option dans [twitter]/max_api_calls. Il est recommandé de ne pas demander à Twitter plus de 2 appels à l'API, ou sinon vous arriverez bientôt à la limite des appels autorisés et l'application échouera.</li>
<li>Lorsque vous répondez à un Tweet, c'est envoyé comme réponse au même et pas comme s'il s'agissait d'un nouveau tweet.</li>
<li>L'ancien système de rapport d'erreurs il a dû être changée. À partir de cette version, vous pouvez signaler des erreurs, directement depuis l'application. L'option Signaler une erreur ouvrira une boîte de dialogue qui vous demande des détails sur votre erreur et il va envoyer le rapport automatiquement.</li>
<li>Ils sont déjà supprimées les following lorsque ils ne suivent pas un utilisateur.</li>
<li>Aussi les favoris, au moment de retirer un tweet comme favori, il exécutent le changement.</li>
<li>Ajouté une boîte de dialogue de configuration qui permet de contrôler le nombre d'appels à l'API à exécuter, si oui ou non utiliser des bases de données, et masquer ou afficher les listes de following, followers et favoris.</li>
<li>En mentionnant les tweets, les guillemets qui entourent le message maintenant sont séparés par un espace de la dernière lettre. Il en est ainsi parce qu'avant, lorsque il y avait une URL, il causé que les guillemets facent partie de l'URL en envoyant vers des sites inexistants.</li>
<li>Améliorations avec quelques chronologies. Vous pouvez maintenant enregistrer une chronologie sans problèmes. Il ne devrait pas faire des erreurs.</li>
<li>Maintenant, l'audio est joué seulement avec Contrôle+Entrée, tandis que l'URL s'ouvrira avec la touche Entrée.</li>
<li>Le flux tentera de se reconnecter à l'échec de la connexion internet.</li>
<li>Maintenant depuis les followers et following on peut mentionner un utilisateur.</li>
<li>Maintenant il est fournit un mode &quot;invisible&quot;. Sous le menu &quot;Application&quot;, dans l'option &quot;Masquer la fenêtre&quot; ou en appuyant sur Contrôle+M. Pour afficher la fenêtre à nouveau appuyez sur Contrôle+Windows+M.</li>
</ul>
<h2 id="changements-ajouter-dans-la-version-0.025">Changements ajouter dans la version 0.025</h2>
<p>Veuillez noter que lorsque un utilisateur vous ne sui pas ou vous ne suivez pas quelqu'un d'autre, la liste des following ou des followers il ne sera pas mis à jour pour le moment. Lorsque vous redémarrez le programme, si les informations son correctes ils seront afficher.</p>
<ul>
<li>Correction d'une erreur qui rendait impossible de fermer l'application jusqu'à ce que le programme a annoncé qu'elle était prête. <a href="http://twblue.a12x.net/issues/view.php?id=17">#17</a> y <a href="http://twblue.a12x.net/issues/view.php?id=18">#18</a></li>
<li>Changé la façon d'organiser les chronologies dans la configuration. Il est nécessaire de les recréer.</li>
<li>Maintenant, vous pouvez envoyer un message direct aux following et followers en utilisant le bouton. Cela ne fonctionnait pas dans la version 0.02 et 0.021.</li>
<li>Vous pouvez augmenter et diminuer le volume depuis la liste des followers et following.</li>
<li>Dans la boîte de dialogue pour écrire un tweet peut être maintenant traduit le message à l'aide de Google Traductor. Une boîte de dialogue s'affiche pour demander les langues source et destination.</li>
<li>Le menu fichier contient l'option Sortir.</li>
<li>À partir de cette version ils se jouera uniquement les fichiers de'audio en appuyant sur Entrée s'ils contienne le hashtag #audio.</li>
<li>Vous pouvez essayer de jouer une URL quelconque sans qui comporte le hashtag #audio en appuyant sur Contrôle+Entrée. Cette commande va tenter de reproduire la première URL trouvée.</li>
<li>A été amélioré le moteur de recherche d'URLS, en rendant plus rapide la fonction et maintenant, devrait être capable de détecter toutes les URLS. <a href="http://twblue.a12x.net/issues/view.php?id=21">#21</a></li>
<li>Maintenant, la boîte de dialogue qui s'affiche pour sélectionner l'utilisateur que vous souhaitez afficher les détails permet en plus de le sélectionner dans une liste, écrire le nom de l'utilisateur que vous souhaitez.</li>
</ul>
<h2 id="changements-ajouter-dans-la-version-0.02-et-0.021">Changements ajouter dans la version 0.02 et 0.021</h2>
<ul>
<li>Le message qui se reproduicé lorsque vous suivez un utilisateur maintenant dit &quot;maintenant vous suivez à x utilisateur&quot; en lieu de &quot;maintenant vous ne suivez pas à x utilisateur&quot;. <a href="http://twblue.a12x.net/issues/view.php?id=5">#5</a></li>
<li>Lorsque vous sorter une boîte de dialogue vous demandera si vous voulez le faire. Maintenant vous sorter d'une façon beaucoup plus proprement du programme, empêchant plusieurs erreurs pendant la fermeture.</li>
<li>Changement des sons pour les dm entrant et sortant. Merci à <span class="citation">[@marcedsosa]</span>(https://twitter.com/marcedsosa) pour les nouveaux sons.</li>
<li>Le Nom d'utilisateur de twitter il se lit dans le titre de la fenêtre.</li>
<li>Les sons du programme aussi peuvent lire le volume depuis la configuration. Le module de sons devrait prendre moins de temps pour reproduire plusieurs des sons de l'application.</li>
<li>Les actions d'augmenter et de diminuer le volume ils reproduisent un son indiquant que tant forts ça sonne.</li>
<li>Il n'affichent plus les mentions de personnes qui ne vous suivent pas dans votre chronologie principal. <a href="http://twblue.a12x.net/issues/view.php?id=1">#1</a></li>
<li>Vous pouvez maintenant supprimer les tweets et les messages directs. Vous ne pouvez supprimer que les tweets que vous avez écrit.</li>
<li>Correction d'une erreur qui empêchait de charger correctement les différentes listes si dans quelques une d'elles ils n'y avait aucun tweet, utilisateur ou message direct. Ceci affectant surtout les comptes avec 0 favoris, 0 tweets, 0 envoyés ou 0 messages directes. <a href="http://twblue.a12x.net/issues/view.php?id=2">#2</a></li>
<li>Maintenant à chaque fois qu'une nouvelle version est disponible, vous serez informé de cela. Si vous avez accès pour le télécharger, le programme va télécharger et copier tout ce dont vous avez besoin.</li>
<li>Maintenant, vous pouvez obtenir la liste complète des following et followers.</li>
<li>Ajouter la date du dernier tweet des followers et following.</li>
<li>Les following et followers sont maintenant mis à jour en temps réel. (ToDo: Les following et followers ils ne montrent pas la date de ces dernier tweet lorsque une mise à jour est faite en temps réel. Ils le font lors du rechargement une fois redémarrée l'application).</li>
<li>L'ordre des onglets il a changé. Maintenant ils sont classés en commençant par Principal, Mentions, Messages directs et Envoyés.</li>
<li>Maintenant dans la liste de tweets envoyés les messages directs sont affichés lorsque le flux est chargé pour la première fois. Ceci ne était pas le cas et si l'utilisateur envoyés un DM à partir d'un autre client lorsque Tw Blue n'était pas ouvert, lors de l'ouverture de l'application il ne montré pas la dite DM. <a href="http://twblue.a12x.net/issues/view.php?id=8">#8</a></li>
<li>Con Control+A, se puede seleccionar todo el texto de un mensaje. Funciona con Jaws y NVDA.</li>
<li>Il y a des raccourcis clavier (détaillés dans la <a href="leeme.html">Documentation)</a> pour un grand nombre d'actions qui peut faire le programme.</li>
<li>Maintenant TW Blue détecte plus d'audio dans les URLS qui vienne dans les retweets, et des audio partagé à partir de Dropbox. <a href="http://twblue.a12x.net/issues/view.php?id=3">#3</a></li>
<li>Inclut la documentation pour l'application et les crédits.</li>
<li>Si la connexion internet s'arrête de fonctionner, le flux va essayer de se reconnecter pendant 30 minutes.</li>
<li>On a écrit un document qui détaille comment utiliser le programme.</li>
<li>Il a été ouvert le <a href="http://twblue.a12x.net/issues/">Système de suivi d'incidents</a> où les utilisateurs peuvent signaler des erreurs et si vous le souhaitez, vous pouvez apporter de nouvelles idées pour le développement de l'application. Il existe un accès direct au formulaire réservée au rapport d'incidents dans le menu Aide.</li>
<li>Il y a maintenant des crédits à partir de la version actuelle.</li>
<li>Ajout d'une option dans menu Utilisateur pour afficher les détails. Cela fonctionne également si vous appuyez sur entrer sur un following ou follower.</li>
</ul>
<h2 id="changements-ajouter-dans-la-version-prealpha1">Changements ajouter dans la version Prealpha1</h2>
<p>Veuillez noter que dans cette version les following et les followers ne sont pas mis à jour automatiquement. Cela s'ajoutera à une autre version. Vous ne pouvez pas également supprimer des tweet, ou DM. Tous les tweets, messages directs, mentions, favoris, followers et following lors de la mise à jour seront télécharger un maximum de 200. Bientôt ils s'ajouteront plus à la quantité lors des mises à jour. Ici les changements à partir de la première version.</p>
<ul>
<li>La date il s'affiche bien, selon le fuseau horaire de l'utilisateur.</li>
<li>Maintenant, le curseur est placé au début lorsque vous allez à répondre ou faire un retweet.</li>
<li>Si vous appuyez sur contrôle + E dans les zones d'édition, l'intégralité du message sera sélectionné.</li>
<li>Quelques corrections pour la gestion des chronologies (j'ai besoin d'apporter des améliorations dans la façon de gérer cela).</li>
<li>Les favoris sont mises à jour en temps réel.</li>
<li>Vous entendrez un son lorsque vous passez par un tweet qui pourrait contenir un audio jouable.</li>
<li>Supporte la lecture audio avec le hashtag #audio et une URL. Appuyez sur Entrée pour entendre la chanson. Appuyez sur F5 pour diminuer le volume de 5%, ou f6 pour augmenter d'un 5%. Si vous souhaitez arrêter la lecture, aller où il y a une audio, puis appuyez sur Entrée. Si le programme est incapable de reproduire quelque chose, il vous avertira. Le volume de la musique (pas pour les sons du programme pour l'instant) est enregistré dans la configuration, et le programme va le mémorisé pour la prochaine fois que vous jouez quelque chose.</li>
<li>Vous pouvez voir les 200 premiers following et followers avec leurs noms d'utilisateur, nom réel et un peu d'informations utiles. Dans des futures versions vous pourrez tout voir si vous avez plus de 200. Veuillez noter que il y a des actions que vous ne pouvez pas faire avec ces utilisateurs dans la liste (par exemple, répondre ou retweet, parce qu'ils ne sont pas des tweets, sont utilisateurs), Mais oui, vous pouvez les suivre, ne pas les suivre, et faire presque tout (moins envoyer DM pour l'instant) ce que vous pourriez faire dans le menu Utilisateur.</li>
</ul>
<p>Maintenant, il faut l'utiliser et le tester et lorsque vous trouvez une erreur, s'il vous plaît veuillez regarder dans le dossier de l'application, puis il doit générer un fichier avec le nom du fichier exécutable, mais avec une extension .log à la fin. Eh bien, c'est vital pour moi de savoir où le programme a été cassé, et vous devriez être reconnaissant si vous me l'envoyer ainsi qu'une description de ce qui était plus ou moins ce qu'ils faisaient quand l'application fait ce qu'il avait à faire. Par exemple, « j'ai essayé de m'envoyer un DM, mais la boîte de dialogue de message direct jamais elle a été ouverte&quot;. Si vous pouvez le charger vers un serveur de stockage (comme Dropbox,](https://www.dropbox.com) par exemple), et me l'envoyer soit en mentionnant à <span class="citation">[@tw_blue2]</span>(https://twitter.com/tw_blue2) ou à <span class="citation">[@manuelcortez00,]</span>(https://twitter.com/manuelcortez00) ce serait formidable.</p>
<p>Merci infiniment de l'essayer !</p>
<h2 id="nouveautés-dans-la-version-prealpha-0">Nouveautés dans la version prealpha 0</h2>
<ul>
<li>Faire des tweets, répondre aux tweets des autres, mentionner tous les utilisateurs, lorsque il y a plus d'un dans le tweet, retweet ce qui vous plaît, ajouter ou non un commentaire au retweet et les supprimez.</li>
<li>Ajouter ou supprimer des favoris un tweet.</li>
<li>Réduire et élargir une URL lorsque vous écrivez un tweet ou dm (vous pouvez sélectionner quelle URL vous souhaitez réduire et élargir à partir d'une liste lorsque ils sont plus d'une).</li>
<li>Ouvrir un navigateur Web avec l'URL venant dans le tweet, en appuyant sur Entrée. Lorsque il y a plusieurs URLs, vous verrez une liste où on vous demandera la quelles vous voulez.</li>
<li>Utilisateurs: Vous pouvez Suivre, Ne pas suivre, Signaler comme spam, Bloquer et Envoyer un message direct aux utilisateurs.</li>
<li>Vous pouvez ouvrir et supprimer des chronologies individuels pour chaque utilisateur.</li>
<li>Vous pourrez aussi voir vos favoris.</li>
<li>Et pour l'instant, à moins qu'il m'arrive d'oublier quelque chose, c'est tout.</li>
</ul>
<hr />
<p>Copyright © 2013-2014, Manuel Cortéz</p>
</body>
</html>

178
doc/locales/fr/changes.md Normal file
View File

@@ -0,0 +1,178 @@
% Liste des Changements
#Attention !
Avant de poursuivre l'essai du programme, il est considéré que c'est une version de développement. Plus précisément, la version 0.42. Cela signifie qu'il n'est pas seulement possible de trouver des erreurs, mais que vous les trouverez. L'idée est de signaler le plus d'erreurs possibles afin qu'ils puisse être résolus pour les prochaines alphas.
Voici la liste des changements dans le programme. Si vous voulez lire comment l'utiliser, [voir ce document.](manual.html) Si vous voyez un lien avec un signe dièse (#) et un code qui commence par plusieurs numéro, vous voyez une erreur qui a été signalé dans le Système de suivi d'incidences. N'hésitez pas à publier vos propres erreurs et demandes d'améliorations et nouvelles fonctionnalités à travers de cet outils, disponible dans le menu Aide de TW Blue.
## Changements ajouter dans cette nouvelle version
* Correction d'une erreur qu'elle ne permettait pas d'afficher les listes avec des accents ou des caractères spéciaux dans un tampon.
* Maintenant TW blue ne devrait pas actualiser les Tweets soudainement.
* Maintenant TW blue supporte l'option "muet" de Twitter. Lorsque cette option est activée pour un utilisateur, vous ne pouvez pas voir ces tweets ni ces mentions, mais vous le suivez toujours, et vous serez en mesure de être en contact avec lui à travers de message direct. Ceci est différent de la fonction Bloquer ou Ne pas suivre, avec cette option l'utilisateur sera pas au courant que vous avez activée l'option muet. sette option se trouvent dans la boîte de dialogue des actions utilisateur de l'interface invisible, ou dans le menu Utilisateur de l'interface graphique.
* Un onglet "Audio" a été ajoutée dans la boîte de dialogue de configuration qui vous permet de sélectionner les périphériques d'entrée et de sortie, régler le volume et activer/ désactiver tous les sons pour TW Blue. D'autres options ont été déplacées depuis l'onglet "Général" vers l'onglet "Audio".
* Le fichier de configuration a été repensé. La plupart des options devront être reconfigurés à nouveau.
* Vous pouvez maintenant désactiver SAPI5 afin qu'il n'intervienne pas s'il n'y a aucun lecteur d'écran supporté en cours d'exécution.
* Dans l'onglet Général, Vous pouvez modifier manuellement la langue. Tw Blue reqiere redémarré.
* Maintenant il y a une nouvelle boîte de dialogue où vous pouvez apprendre les différents sons de TW Blue.
* Il est possible maintenant de désactiver le son et notification d'un tampon. Le reste du client fonctionnera correctement. Appuyez sur Contrôle+Windows+Maj+m (interface invisible) ou le sélectionnez depuis le menu "Tampon" (interface visible) pour basculer entre cette fonctionnalité.
* Vous pouvez maintenant rechercher par utilisateur et par tweets. Les recherches de tweets sont sauvegardées dans la configuration, tandis que ceux des utilisateurs seront supprimer lors de la fermeture. Appuyez sur Ctrl+Windows+- (tiret) (interface invisible) ou le sélectionnez depuis le menu "Application" (interface visible).
* Vous pouvez ouvrir le tampon pour voir les favoris d'un utilisateur dans le menu "Utilisateur".
* Maintenant avec Contrôle+Windows+Maj+Flèche Haut / Bas (dans l'interface graphique) et Contrôle+Windows+Flèche Haut / Bas (dans l'interface invisible), vous pouvez aller au tweet précédent ou suivant dans la conversation. Pour que cela fonctionne les tweets de la conversation doivent être dans la chronologie principale.
* Au cours d'un enregistrement audio pour ajouter, maintenant vous pouvez mettre en pause ou reprendre l'enregistrement pour sauter des parties qui peuvent générer un audio très long.
* Il est maintenant possible de charger de l'audio vers Dropbox. Pour configurer le service aller dans l'onglet "Services audio" dans la boîte de dialogue de Configuration.
* Maintenant que vous pouvez charger de l'audio vers Dropbox, dans la boîte de dialogue pour ajouter un audio vous pouvez sélectionner le service auquelle vous souhaitez charger.
* Maintenant il comprend une boîte de dialogue pour la correction orthographique pour les tweets ou messages. Les langues actuellement disponibles sont: Espagnol, Anglais, Portugais, Russe et Polonais. La langue sera sélectionnée automatiquement selon la configuration de TW Blue.
* Ajouter la lecture automatique des Tweets pour un tampon. L'activation de cette fonctionnalité peut faire que TW Blue lit automatiquement les tweets lors de l'arrivée dans les tampons qui ont cette option activée. Appuyez sur Contrôle+Windows+e pour basculer entre cette fonction.
* Dans la boîte de dialogue de Configuration maintenant vous pouvez spécifiez si vous voulez que TW Blue démarre avec l'interface invisible.
* Les URLs s'affiche dans leur version originale. Uniquement les photos de Twitter ils apparaissent toujours comme réduites, et celles qui ont été réduites manuellement avant de les envoyer dans un tweet.
## Changements ajouter dans la version 0.40
* Vous pouvez changer entre les différents paquets de sons utilisé par TW Blue et de créer vos propres sons. Chaque paquet doit être dans un répertoire par séparé dans le dossier sounds. Pour modifier le paquet de sons vous pouvez le sélectionner dans la boîte de dialogue de configuration.
* Les fichiers audio doivent être au format OGG.
* TW Blue doit être maintenant en mesure de fermer correctement.
* L'heure est écrit tenant en compte le format 12 heures (AM /P M).
* L'heure est écrit d'accord au fuseau horaire que vous avez défini dans votre compte Twitter.
* Ajout de nouvelles traductions en Portugais, Polonais et Russe. Merci les gars !
* TW Blue supprime de la configuration la chronologie de l'utilisateur qui ont changé leur noms ou supprimer leurs comptes Twitter.
* Maintenant est gérés la grande majorité des événements dans Twitter avec le tampon des événements.
* Il est maintenant possible de voir le texte des événements avec Contrôle+Maj+V (GUI) ou Contrôle+Windows+V (interface invisible).
* Gestionnaire de listes: Vous pouvez créer, modifier, supprimer, afficher une liste comme tampon dans TW Blue, ajouter et supprimer des membres d'une liste.
* Maintenant, si au démarrage de TW Blue il tente de charger une chronologie qui n'existe pas, automatiquement il la supprime de la configuration et il continue à charger normalement.
* Seuls seront chargées jusqu'à 400 following et followers pour éviter les problèmes avec l'API. Elle sera corrigée dans les versions futures.
* Pour le mode invisible, il inclus des raccourcis pour réentendre le tweet sur lequel vous êtes (Contrôle+Windows+espace) et pour copier le message dans le presse-papiers (Contrôle+Windows+c).
## Changements ajouter dans la version 0.38
* Correction d'une erreur qui empêchait en donnant l'ordre de fermer.
* Maintenant les tweets ne finissent pas par un point obligatoirement. Si le programme détecte que le tweet se termine par une lettre ou un chiffre, il va placez un point automatiquement. Si ce n'est pas le cas, il va laisser le texte tel qu'il est.
* Il est maintenant possible de charger des images aux tweets et réponses. Veuillez noter que la taille des images est mis en place par twitter.
* Pour se déplacer vers la gauche ou vers la droite en utilisant le mode invisible, maintenant il s'annonce uniquement des informations de la position dans la liste d'éléments.
* TW Blue devrait maintenant fonctionner pour Windows XP au moment de la demande d'autorisation pour l'application.
* Ajouté une nouvelle option dans la boîte de dialogue de configuration qui vous permet de revenir à vos tampons. Cela signifie que vous pouvez choisir si vous voulez voir les tweets comme jusqu'à maintenant, ou que les plus nouveaux soit placés vers le haut et les anciens vers le bas.
* Maintenant les photos peuvent être chargées aux profil de Twitter, disponible à partir de la boîte de dialogue Mettre à jour votre profil.
* Ajouté un tampon d'événements, où ils sont stockés pour le moment quelques événements qui se déroulent dans Twitter, comme suivre ou faire que quelqu'un vous suivent, marquer un favori, que un de vos tweet soit marqué comme favoris, Etc. Vous pouvez activer et désactiver ce tampon de la boîte de dialogue de configuration.
* Maintenant, vous pouvez supprimer des chronologies déjà créé qui ne contiennent pas des tweets, et il ne sera pas permit de créer des chronologies pour les utilisateurs sans tweets.
* L'interface de l'application est traduisible. Maintenant, n'importe quel utilisateur peut faire leurs propres traductions en différentes langues.
## Changements ajouter dans la version 0.36
* Les utilisateurs brésiliens pourront voir quelques messages en Portugais. (Usuários brasileiros poderão ver algumas mensagens em Português).
* Correction d'une erreur qui fait que quelques sons ils peuvent s'entendre et d'autres non. Maintenant, ils devraient s'entendre tous.
* La réconnexion aussi a reçu une correction, parce que parfois, il s'effectué de façon incorrecte et il devait s'ouvrir à nouveau l'application.
* Maintenant TW Blue permet de supprimer uniquement les chronologies avec la commande correspondante. Avant il s'affichées la boîte de dialogue peu importe dans quel tampon vous aviez été.
* Vous êtes en mesure à nouveau de voir les détails des utilisateurs avec la touche Entrée étant dans le tampon pour les following ou followers.
* À partir de cette version, il n'y a pas de support pour les bases de données.
* Vous entendrez une notification vocale lorsque quelqu'un marque comme favori un de vos tweets.
* Les following et followers sont déjà mis à jour.
* lorsque vous suivez quelqu'un, il ne se produit aucune erreur Si ne sont pas affichées les following. C'est la même chose avec les followers.
* Vous pouvez effacer un tampon en appuyant sur Maj+Supprimer dans la fenêtre visible, et Contrôle+Windows+Maj+Supprimer dans la fenêtre invisible. Ceci va vider tous les tweets dans le tampon courant.
## Changements ajouter dans la version 0.35
* Il existe un site Web officiel pour le programme, aller sur [twblue.com.mx.](http://twblue.com.mx) Dans cet espace, vous trouverez le système de suivi d'erreurs, le blog avec les dernières nouvelles, et la dernière version disponible.
* TW Blue il annonce lorsque vous êtes mentionné, et lorsque vous obtenez un message direct.
* Jaws il ne dit pas le raccourci clavier qui est appuyé dans le mode invisible. [#11](http://twblue.a12x.net/errores/view.php?id=11)
* Dans le mode invisible, les commandes Contrôle+Windows+Origine, Contrôle+Windows+Fin, Contrôle+Windows+Page Suivante et Contrôle+Windows+Page Précédente va aller vers le haut de la liste, vers la fin, 20 éléments vers le bas et 20 éléments vers le haut respectivement. [#10,](http://twblue.a12x.net/errores/view.php?id=10) [#21,](http://twblue.a12x.net/errores/view.php?id=21) [#22](http://twblue.a12x.net/errores/view.php?id=22)
* Maintenant vous pouvez lire l'audios d'Audiobook.
* Maintenant, le flux doit être connecté une fois que la machine revient d'une suspension.
* Il est possible d'enregistrer de l'audio ou charger fichiers sur SndUp.net. Si vous êtes inscrit dans cette page, vous pouvez mettre dans la configuration votre API Key pour que les fichiers se charge sur votre nom. Vous pouvez charger des fichiers Wav, OGG et MP3. Les fichiers wav ils seront récodifier en OGG.
* Si vous n'utilisez aucun lecteur d'écran, quelques actions de TW blue utilisent la synthèse vocale SAPI5.
* Il existe une version pour les architectures de 64 Bits. Merci à [@jmdaweb](https://twitter.com/jmdaweb) pour prendre le travail de faire fonctionner l'application dans cette architecture et la préparez pour sa distribution.
* Changement dans les sons du client. Merci à [@guilevi_es](https://twitter.com/guilevi_es) pour la collaboration avec le paquet de sons.
* Quelques messages du programme peuvent être traduits. Dans des futures versions la totalité de l'interface sera internationalisé.
* Et quelques correction d'erreur en plus ([#5,](http://twblue.com.mx/errores/view.php?id=5) [#7,](http://twblue.com.mx/errores/view.php?id=7) [#8,](http://twblue.com.mx/errores/view.php?id=8) [#9,](http://twblue.com.mx/errores/view.php?id=9) [#12,](http://twblue.com.mx/errores/view.php?id=12))
## Changements ajouter dans la version 0.3
* Maintenant vous pouvez mettre à jour votre profil à partir de TW Blue. [#19](http://twblue.a12x.net/issues/view.php?id=19)
* Maintenant vous pouvez créer les chronologies à nouveau et ils ne donne pas de problèmes. [#24](http://twblue.a12x.net/issues/view.php?id=24)
* Maintenant les fichiers d'erreur sont enregistrés dans le répertoire "logs".
* Lorsque vous créez une chronologie, il sera mis à jour en temps réel dès le début au lieu de le mettre à jour toutes les 2 minutes.
* Vous pouvez maintenant demander davantage d'appels à l'API qui fonctionnera pour obtenir 200 tweets chaqu'une. Un appel est équivalent à 200 éléments de la liste principal, mentions, messages directs, favoris et chronologies. Dans le fichier de configuration Vous pouvez modifier l'option dans [twitter]/max_api_calls. Il est recommandé de ne pas demander à Twitter plus de 2 appels à l'API, ou sinon vous arriverez bientôt à la limite des appels autorisés et l'application échouera.
* Lorsque vous répondez à un Tweet, c'est envoyé comme réponse au même et pas comme s'il s'agissait d'un nouveau tweet.
* L'ancien système de rapport d'erreurs il a dû être changée. À partir de cette version, vous pouvez signaler des erreurs, directement depuis l'application. L'option Signaler une erreur ouvrira une boîte de dialogue qui vous demande des détails sur votre erreur et il va envoyer le rapport automatiquement.
* Ils sont déjà supprimées les following lorsque ils ne suivent pas un utilisateur.
* Aussi les favoris, au moment de retirer un tweet comme favori, il exécutent le changement.
* Ajouté une boîte de dialogue de configuration qui permet de contrôler le nombre d'appels à l'API à exécuter, si oui ou non utiliser des bases de données, et masquer ou afficher les listes de following, followers et favoris.
* En mentionnant les tweets, les guillemets qui entourent le message maintenant sont séparés par un espace de la dernière lettre. Il en est ainsi parce qu'avant, lorsque il y avait une URL, il causé que les guillemets facent partie de l'URL en envoyant vers des sites inexistants.
* Améliorations avec quelques chronologies. Vous pouvez maintenant enregistrer une chronologie sans problèmes. Il ne devrait pas faire des erreurs.
* Maintenant, l'audio est joué seulement avec Contrôle+Entrée, tandis que l'URL s'ouvrira avec la touche Entrée.
* Le flux tentera de se reconnecter à l'échec de la connexion internet.
* Maintenant depuis les followers et following on peut mentionner un utilisateur.
* Maintenant il est fournit un mode "invisible". Sous le menu "Application", dans l'option "Masquer la fenêtre" ou en appuyant sur Contrôle+M. Pour afficher la fenêtre à nouveau appuyez sur Contrôle+Windows+M.
## Changements ajouter dans la version 0.025
Veuillez noter que lorsque un utilisateur vous ne sui pas ou vous ne suivez pas quelqu'un d'autre, la liste des following ou des followers il ne sera pas mis à jour pour le moment. Lorsque vous redémarrez le programme, si les informations son correctes ils seront afficher.
* Correction d'une erreur qui rendait impossible de fermer l'application jusqu'à ce que le programme a annoncé qu'elle était prête. [#17](http://twblue.a12x.net/issues/view.php?id=17) y [#18](http://twblue.a12x.net/issues/view.php?id=18)
* Changé la façon d'organiser les chronologies dans la configuration. Il est nécessaire de les recréer.
* Maintenant, vous pouvez envoyer un message direct aux following et followers en utilisant le bouton. Cela ne fonctionnait pas dans la version 0.02 et 0.021.
* Vous pouvez augmenter et diminuer le volume depuis la liste des followers et following.
* Dans la boîte de dialogue pour écrire un tweet peut être maintenant traduit le message à l'aide de Google Traductor. Une boîte de dialogue s'affiche pour demander les langues source et destination.
* Le menu fichier contient l'option Sortir.
* À partir de cette version ils se jouera uniquement les fichiers de'audio en appuyant sur Entrée s'ils contienne le hashtag #audio.
* Vous pouvez essayer de jouer une URL quelconque sans qui comporte le hashtag #audio en appuyant sur Contrôle+Entrée. Cette commande va tenter de reproduire la première URL trouvée.
* A été amélioré le moteur de recherche d'URLS, en rendant plus rapide la fonction et maintenant, devrait être capable de détecter toutes les URLS. [#21](http://twblue.a12x.net/issues/view.php?id=21)
* Maintenant, la boîte de dialogue qui s'affiche pour sélectionner l'utilisateur que vous souhaitez afficher les détails permet en plus de le sélectionner dans une liste, écrire le nom de l'utilisateur que vous souhaitez.
## Changements ajouter dans la version 0.02 et 0.021
* Le message qui se reproduicé lorsque vous suivez un utilisateur maintenant dit "maintenant vous suivez à x utilisateur" en lieu de "maintenant vous ne suivez pas à x utilisateur". [#5](http://twblue.a12x.net/issues/view.php?id=5)
* Lorsque vous sorter une boîte de dialogue vous demandera si vous voulez le faire. Maintenant vous sorter d'une façon beaucoup plus proprement du programme, empêchant plusieurs erreurs pendant la fermeture.
* Changement des sons pour les dm entrant et sortant. Merci à [@marcedsosa](https://twitter.com/marcedsosa) pour les nouveaux sons.
* Le Nom d'utilisateur de twitter il se lit dans le titre de la fenêtre.
* Les sons du programme aussi peuvent lire le volume depuis la configuration. Le module de sons devrait prendre moins de temps pour reproduire plusieurs des sons de l'application.
* Les actions d'augmenter et de diminuer le volume ils reproduisent un son indiquant que tant forts ça sonne.
* Il n'affichent plus les mentions de personnes qui ne vous suivent pas dans votre chronologie principal. [#1](http://twblue.a12x.net/issues/view.php?id=1)
* Vous pouvez maintenant supprimer les tweets et les messages directs. Vous ne pouvez supprimer que les tweets que vous avez écrit.
* Correction d'une erreur qui empêchait de charger correctement les différentes listes si dans quelques une d'elles ils n'y avait aucun tweet, utilisateur ou message direct. Ceci affectant surtout les comptes avec 0 favoris, 0 tweets, 0 envoyés ou 0 messages directes. [#2](http://twblue.a12x.net/issues/view.php?id=2)
* Maintenant à chaque fois qu'une nouvelle version est disponible, vous serez informé de cela. Si vous avez accès pour le télécharger, le programme va télécharger et copier tout ce dont vous avez besoin.
* Maintenant, vous pouvez obtenir la liste complète des following et followers.
* Ajouter la date du dernier tweet des followers et following.
* Les following et followers sont maintenant mis à jour en temps réel. (ToDo: Les following et followers ils ne montrent pas la date de ces dernier tweet lorsque une mise à jour est faite en temps réel. Ils le font lors du rechargement une fois redémarrée l'application).
* L'ordre des onglets il a changé. Maintenant ils sont classés en commençant par Principal, Mentions, Messages directs et Envoyés.
* Maintenant dans la liste de tweets envoyés les messages directs sont affichés lorsque le flux est chargé pour la première fois. Ceci ne était pas le cas et si l'utilisateur envoyés un DM à partir d'un autre client lorsque Tw Blue n'était pas ouvert, lors de l'ouverture de l'application il ne montré pas la dite DM. [#8](http://twblue.a12x.net/issues/view.php?id=8)
* Con Control+A, se puede seleccionar todo el texto de un mensaje. Funciona con Jaws y NVDA.
* Il y a des raccourcis clavier (détaillés dans la [Documentation)](leeme.html) pour un grand nombre d'actions qui peut faire le programme.
* Maintenant TW Blue détecte plus d'audio dans les URLS qui vienne dans les retweets, et des audio partagé à partir de Dropbox. [#3](http://twblue.a12x.net/issues/view.php?id=3)
* Inclut la documentation pour l'application et les crédits.
* Si la connexion internet s'arrête de fonctionner, le flux va essayer de se reconnecter pendant 30 minutes.
* On a écrit un document qui détaille comment utiliser le programme.
* Il a été ouvert le [Système de suivi d'incidents](http://twblue.a12x.net/issues/) où les utilisateurs peuvent signaler des erreurs et si vous le souhaitez, vous pouvez apporter de nouvelles idées pour le développement de l'application. Il existe un accès direct au formulaire réservée au rapport d'incidents dans le menu Aide.
* Il y a maintenant des crédits à partir de la version actuelle.
* Ajout d'une option dans menu Utilisateur pour afficher les détails. Cela fonctionne également si vous appuyez sur entrer sur un following ou follower.
## Changements ajouter dans la version Prealpha1
Veuillez noter que dans cette version les following et les followers ne sont pas mis à jour automatiquement. Cela s'ajoutera à une autre version. Vous ne pouvez pas également supprimer des tweet, ou DM. Tous les tweets, messages directs, mentions, favoris, followers et following lors de la mise à jour seront télécharger un maximum de 200. Bientôt ils s'ajouteront plus à la quantité lors des mises à jour. Ici les changements à partir de la première version.
* La date il s'affiche bien, selon le fuseau horaire de l'utilisateur.
* Maintenant, le curseur est placé au début lorsque vous allez à répondre ou faire un retweet.
* Si vous appuyez sur contrôle + E dans les zones d'édition, l'intégralité du message sera sélectionné.
* Quelques corrections pour la gestion des chronologies (j'ai besoin d'apporter des améliorations dans la façon de gérer cela).
* Les favoris sont mises à jour en temps réel.
* Vous entendrez un son lorsque vous passez par un tweet qui pourrait contenir un audio jouable.
* Supporte la lecture audio avec le hashtag #audio et une URL. Appuyez sur Entrée pour entendre la chanson. Appuyez sur F5 pour diminuer le volume de 5%, ou f6 pour augmenter d'un 5%. Si vous souhaitez arrêter la lecture, aller où il y a une audio, puis appuyez sur Entrée. Si le programme est incapable de reproduire quelque chose, il vous avertira. Le volume de la musique (pas pour les sons du programme pour l'instant) est enregistré dans la configuration, et le programme va le mémorisé pour la prochaine fois que vous jouez quelque chose.
* Vous pouvez voir les 200 premiers following et followers avec leurs noms d'utilisateur, nom réel et un peu d'informations utiles. Dans des futures versions vous pourrez tout voir si vous avez plus de 200. Veuillez noter que il y a des actions que vous ne pouvez pas faire avec ces utilisateurs dans la liste (par exemple, répondre ou retweet, parce qu'ils ne sont pas des tweets, sont utilisateurs), Mais oui, vous pouvez les suivre, ne pas les suivre, et faire presque tout (moins envoyer DM pour l'instant) ce que vous pourriez faire dans le menu Utilisateur.
Maintenant, il faut l'utiliser et le tester et lorsque vous trouvez une erreur, s'il vous plaît veuillez regarder dans le dossier de l'application, puis il doit générer un fichier avec le nom du fichier exécutable, mais avec une extension .log à la fin. Eh bien, c'est vital pour moi de savoir où le programme a été cassé, et vous devriez être reconnaissant si vous me l'envoyer ainsi qu'une description de ce qui était plus ou moins ce qu'ils faisaient quand l'application fait ce qu'il avait à faire. Par exemple, « j'ai essayé de m'envoyer un DM, mais la boîte de dialogue de message direct jamais elle a été ouverte". Si vous pouvez le charger vers un serveur de stockage (comme Dropbox,](https://www.dropbox.com) par exemple), et me l'envoyer soit en mentionnant à [@tw_blue2](https://twitter.com/tw_blue2) ou à [@manuelcortez00,](https://twitter.com/manuelcortez00) ce serait formidable.
Merci infiniment de l'essayer !
## Nouveautés dans la version prealpha 0
* Faire des tweets, répondre aux tweets des autres, mentionner tous les utilisateurs, lorsque il y a plus d'un dans le tweet, retweet ce qui vous plaît, ajouter ou non un commentaire au retweet et les supprimez.
* Ajouter ou supprimer des favoris un tweet.
* Réduire et élargir une URL lorsque vous écrivez un tweet ou dm (vous pouvez sélectionner quelle URL vous souhaitez réduire et élargir à partir d'une liste lorsque ils sont plus d'une).
* Ouvrir un navigateur Web avec l'URL venant dans le tweet, en appuyant sur Entrée. Lorsque il y a plusieurs URLs, vous verrez une liste où on vous demandera la quelles vous voulez.
* Utilisateurs: Vous pouvez Suivre, Ne pas suivre, Signaler comme spam, Bloquer et Envoyer un message direct aux utilisateurs.
* Vous pouvez ouvrir et supprimer des chronologies individuels pour chaque utilisateur.
* Vous pourrez aussi voir vos favoris.
* Et pour l'instant, à moins qu'il m'arrive d'oublier quelque chose, c'est tout.
---
Copyright © 2013-2014, Manuel Cortéz

View File

@@ -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: 2015-11-27 08:24+Hora estándar central (México)\n"
"PO-Revision-Date: 2015-07-01 22:57+0100\n" "PO-Revision-Date: 2015-11-27 18:45+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,"
@@ -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 "
@@ -306,7 +306,7 @@ msgstr ""
#: ../doc\strings.py:75 #: ../doc\strings.py:75
msgid "" msgid ""
"When the process is finished, by default the program will play another " "When the process is finished, by default the program will play another "
"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 ""
"Lorsque le processus est terminé, le programme jouera un autre son, et le " "Lorsque le processus est terminé, le programme jouera un autre son, et le "
@@ -334,22 +334,22 @@ msgstr "### Tampon"
msgid "" 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
msgid "" msgid ""
"The following is a description for every one of TWBlue's buffers and the " "The following is a description for every one of TWBlue's buffers and the "
"kind of items they work with." "kind of items they work with."
msgstr "" msgstr ""
"Voici une description pour chaque tampon et les différents types d'éléments " "Voici une description pour chaque tampon et les différents types d'éléments "
@@ -394,7 +394,7 @@ msgstr ""
"directs qui ont été envoyés depuis votre compte." "directs qui ont été envoyés depuis votre compte."
#: ../doc\strings.py:97 #: ../doc\strings.py:97
msgid "* Sent tweets: this shows all the tweets sent from your account." msgid "* Sent tweets: this shows all the tweets sent from your account."
msgstr "" msgstr ""
"* Tweets envoyés: Dans cette liste il s'affiche tous les tweets qui ont été " "* Tweets envoyés: Dans cette liste il s'affiche tous les tweets qui ont été "
"envoyés depuis votre compte." "envoyés depuis votre compte."
@@ -407,22 +407,23 @@ 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 " "* Followers: 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 " "* Following: 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
msgid "" msgid ""
"* User timelines: these are buffers you may create. They contain only the " "* User timelines: these are buffers you may create. They contain only the "
"tweets by a specific user. They're used so you can see the tweets by a " "tweets by a specific user. They're used so you can see the tweets by a "
"single person and you don't want to look all over your timeline. You may " "single person and you don't want to look all over your timeline. You may "
"create as many as you like." "create as many as you like."
@@ -437,22 +438,22 @@ msgstr ""
msgid "" 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 TWBlue est \"quelque chose\" qui se passe " "* Événements: Un événement dans TW Blue est \"quelque chose\" qui se passe "
"sur Twitter. Dans la chronologie des événements, vous pourrez voir " "sur Twitter. Dans la chronologie des événements, vous pourrez voir "
"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 ""
@@ -491,7 +492,7 @@ msgid ""
"you can press Control + Enter or Control + Windows + Alt + Enter to play it, " "you can press Control + Enter or Control + Windows + Alt + Enter to play it, "
"respectively. TWBlue will play a sound if the tweet contains the #audio " "respectively. TWBlue will play a sound if the tweet contains the #audio "
"hashtag, but there may be tweets which contain audio without this. Finally, " "hashtag, but there may be tweets which contain audio without this. Finally, "
"if a tweet contains geographical information, you can press Control + " "if a tweet contains geographical information, you can press Control + "
"Windows + G in the invisible interface to retrieve it." "Windows + G in the invisible interface to retrieve it."
msgstr "" msgstr ""
"Si un Tweet contient une adresse URL, vous pouvez appuyer sur Entrée dans " "Si un Tweet contient une adresse URL, vous pouvez appuyer sur Entrée dans "
@@ -511,16 +512,16 @@ msgstr "### Zones d'édition pour un nom d'utilisateur"
#: ../doc\strings.py:115 #: ../doc\strings.py:115
msgid "" msgid ""
"These fields accept a Twitter username (without the at sign) as the input. " "These fields accept a Twitter username (without the at sign) as the input. "
"They are present in the send direct message and the user actions dialogue " "They are present in the send direct message and the user actions dialogue "
"boxes. Those dialogues will be discussed later. The initial value of these " "boxes. Those dialogues will be discussed later. The initial value of these "
"fields depends on where they were opened from. They are prepopulated with " "fields depends on where they were opened from. They are prepopulated with "
"the username of the sender of the focused tweet (if they were opened from " "the username of the sender of the focused tweet (if they were opened from "
"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 " "following ou de followers). 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)"
@@ -599,10 +600,10 @@ msgstr "#### Boutons dans l'application"
#: ../doc\strings.py:140 #: ../doc\strings.py:140
msgid "" msgid ""
"* Tweet: this button opens up a dialogue box to write your tweet. The " "* Tweet: this button opens up a dialogue box to write your tweet. The "
"message must not exceed 140 characters. If you write past this limit, a " "message must not exceed 140 characters. If you write past this limit, a "
"sound will play to warn you. Note that the character count is displayed in " "sound will play to warn you. Note that the character count is displayed in "
"the title bar. You may use the shorten and expand URL buttons to comply with " "the title bar. You may use the shorten and expand URL buttons to comply with "
"the character limit. You can upload a picture, check spelling, attach audio " "the character limit. You can upload a picture, check spelling, attach audio "
"or translate your message by selecting one of the available buttons in the " "or translate your message by selecting one of the available buttons in the "
"dialogue box. In addition, you can autocomplete the entering of users by " "dialogue box. In addition, you can autocomplete the entering of users by "
"pressing Alt + A or the button for that purpose if you have the database of " "pressing Alt + A or the button for that purpose if you have the database of "
@@ -634,7 +635,7 @@ msgid ""
"it, if you haven't configured the application not to do so, you'll be asked " "it, if you haven't configured the application not to do so, you'll be asked "
"if you want to add a comment or simply send it as written. If you choose to " "if you want to add a comment or simply send it as written. If you choose to "
"add a comment, and if the original tweet plus the comment exceeds 140 " "add a comment, and if the original tweet plus the comment exceeds 140 "
"characters, you will be asked if you want to post it as a comment with a " "characters, you will be asked if you want to post it as a comment with a "
"mention to the original user and a link to the originating tweet." "mention to the original user and a link to the originating tweet."
msgstr "" msgstr ""
"* Retuit: Ce bouton s'occupe de retwitter le tweet que vous lisez. En " "* Retuit: Ce bouton s'occupe de retwitter le tweet que vous lisez. En "
@@ -734,7 +735,7 @@ msgstr ""
#: ../doc\strings.py:159 #: ../doc\strings.py:159
msgid "" msgid ""
"* Update profile: opens a dialogue where you can update your information on " "* Update profile: opens a dialogue where you can update your information on "
"Twitter: name, location, website and bio. If you have already set this up " "Twitter: name, location, website and bio. If you have already set this up "
"the fields will be prefilled with the existing information. Also, you can " "the fields will be prefilled with the existing information. Also, you can "
"upload a photo to your profile." "upload a photo to your profile."
@@ -765,9 +766,9 @@ msgstr ""
#: ../doc\strings.py:162 #: ../doc\strings.py:162
msgid "" msgid ""
"* Lists Manager: This dialogue box allows you to manage your Twitter lists. " "* Lists Manager: This dialogue box allows you to manage your Twitter lists. "
"In order to use them, you must first create them. Here, you can view, edit, " "In order to use them, you must first create them. Here, you can view, edit, "
"create, delete or, optionally, open them in buffers similar to user " "create, delete or, optionally, open them in buffers similar to user "
"timelines." "timelines."
msgstr "" msgstr ""
"* Gestionnaire de listes: Afin d'utiliser les listes de Twitter, vous devez " "* Gestionnaire de listes: Afin d'utiliser les listes de Twitter, vous devez "
@@ -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"
@@ -831,7 +830,7 @@ msgstr ""
#: ../doc\strings.py:174 #: ../doc\strings.py:174
msgid "" msgid ""
"* Remove from favourites: removes the tweet from your favourites, but not " "* Remove from favourites: removes the tweet from your favourites, but not "
"from Twitter." "from Twitter."
msgstr "" msgstr ""
"* Supprimer des favoris: Supprime un tweet de vos favoris. Cela ne signifie " "* Supprimer des favoris: Supprime un tweet de vos favoris. Cela ne signifie "
@@ -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 ""
@@ -912,7 +912,7 @@ msgstr ""
#: ../doc\strings.py:185 #: ../doc\strings.py:185
msgid "" msgid ""
" * Follow: Follows a user. This means you'll see his/her tweets on your " " * Follow: Follows a user. This means you'll see his/her tweets on your "
"home timeline, and if he/she also follows you, you'll be able to exchange " "home timeline, and if he/she also follows you, you'll be able to exchange "
"direct messages. You may also send / receive direct messages from each other " "direct messages. You may also send / receive direct messages from each other "
"if you have configured the option to allow direct messages from anyone." "if you have configured the option to allow direct messages from anyone."
@@ -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."
@@ -1050,9 +1049,9 @@ msgstr "##### Menu Tampon"
#: ../doc\strings.py:205 #: ../doc\strings.py:205
msgid "" 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 ""
@@ -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."
@@ -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"
@@ -1547,26 +1548,26 @@ msgstr ""
#: ../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 "
@@ -1586,9 +1587,9 @@ 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 "
@@ -1597,7 +1598,7 @@ msgstr ""
#: ../doc\strings.py:328 #: ../doc\strings.py:328
msgid "" msgid ""
"* Number of items per buffer to cache in database: This allows you to " "* Number of items per buffer to cache in database: This allows you to "
"specify how many items TWBlue should cache in a database. You can type any " "specify how many items TWBlue should cache in a database. You can type any "
"number, 0 to cache all items, or leave blank to disable caching entirely." "number, 0 to cache all items, or leave blank to disable caching entirely."
msgstr "" msgstr ""
"* Nombre d'éléments par tampon en cache dans la base de données: Cela vous " "* Nombre d'éléments par tampon en cache dans la base de données: Cela vous "
@@ -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 ""
@@ -1813,7 +1818,7 @@ msgid ""
"If you still have questions after reading this document, if you wish to " "If you still have questions after reading this document, if you wish to "
"collaborate to the project in some other way, or if you simply want to get " "collaborate to the project in some other way, or if you simply want to get "
"in touch with the application developer, follow the Twitter account " "in touch with the application developer, follow the Twitter account "
"[@tw_blue2](https://twitter.com/tw_blue2) or [@manuelcortez00.](https://" "[@tw_blue2](https://twitter.com/tw_blue2) or [@manuelcortez00.](https://"
"twitter.com/manuelcortez00) You can also visit [our website](http://twblue." "twitter.com/manuelcortez00) You can also visit [our website](http://twblue."
"es)" "es)"
msgstr "" msgstr ""
@@ -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 "

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -5,16 +5,16 @@
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: 2015-11-27 08:24+Hora estándar central (México)\n"
"PO-Revision-Date: 2015-07-04 19:56+0100\n" "PO-Revision-Date: 2015-11-27 08:34-0600\n"
"Last-Translator: Chris Leo Mameli <llajta2012@gmail.com>\n" "Last-Translator: Manuel Cortéz <manuel@manuelcortez.net>\n"
"Language-Team: \n" "Language-Team: \n"
"Language: it\n" "Language: it\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"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.3\n" "X-Generator: Poedit 1.6.11\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 "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 p 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"
@@ -884,7 +884,7 @@ msgstr ""
" * Mute: quando silenziate un utente, non verranno visualizzati i tweet " " * Mute: quando silenziate un utente, non verranno visualizzati i tweet "
"nella cronologia principale; non verranno visualizzati neppure eventuali " "nella cronologia principale; non verranno visualizzati neppure eventuali "
"menzioni che vi riguardano. Si possono comunque scambiare messaggi diretti. " "menzioni che vi riguardano. Si possono comunque scambiare messaggi diretti. "
"L' utente silenziato non viene informato di questa azione." "L'utente silenziato non viene informato di questa azione."
#: ../doc\strings.py:188 #: ../doc\strings.py:188
msgid "" msgid ""
@@ -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,71 @@ 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)." #, fuzzy
msgid "* Galician: [Juan Buño](https://twitter.com/Quetzatl_)."
msgstr "* Galiziano: [Alba Kinteiro](https://twitter.com/albasmileforeve)." msgstr "* Galiziano: [Alba Kinteiro](https://twitter.com/albasmileforeve)."
#: ../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
#, fuzzy
msgid "* Japanese: [Riku](https://twitter.com/riku_sub001)"
msgstr "* Basco: [Sukil Etxenike](https://twitter.com/sukil2011)."
#: ../doc\strings.py:420
#, fuzzy
msgid "* Polish: [Pawel Masarczyk.](https://twitter.com/Piciok)"
msgstr "* Spagnolo: [Manuel Cortéz](https://twitter.com/manuelcortez00)."
#: ../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." #, fuzzy
msgstr "* Russo: Alexander Jaszyn." msgid ""
"* Romanian: [Florian Ionașcu](https://twitter.com/7ro) and [Răzvan Ciule]"
#: ../doc\strings.py:420 "(https://twitter.com/pilgrim89)"
msgid "* Turkish: Burak." msgstr ""
msgstr "* Turco: Burak." "* Inglese: [Bryner Villalobos](https://twitter.com/Bry_StarkCR) and [Bill "
"Dengler](https://twitter.com/codeofdusk)."
#: ../doc\strings.py:423 #: ../doc\strings.py:423
msgid "* Russian: [Александр Яшин](https://twitter.com/radovest)."
msgstr "* Russo: [Александр Яшин](https://twitter.com/radovest)."
#: ../doc\strings.py:424
#, fuzzy
msgid "* Serbian: [Aleksandar Đurić](https://twitter.com/sokodtreshnje)"
msgstr "* Galiziano: [Alba Kinteiro](https://twitter.com/albasmileforeve)."
#: ../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 +1873,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"

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -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)."""))

View File

@@ -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

View File

@@ -3,9 +3,9 @@ Type=PortableApps.comFormat
Version=3.0 Version=3.0
[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.

View File

@@ -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

View File

@@ -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 &gt;&gt;</a></p> <p><a href="http://portableapps.com/node/*Node ID*">Go to the tw blue Portable Homepage &gt;&gt;</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>

View File

@@ -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

View File

@@ -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))

View File

@@ -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)
return ctypes.windll[libfile] if cdll:
return ctypes.cdll[libfile]
else:
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():

View File

@@ -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

View File

@@ -1,24 +1,17 @@
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": output_classes = accessible_output2.get_output_classes()
import voiceover self.outputs = []
self.outputs = [voiceover.VoiceOver()] for output in output_classes:
elif platform.system() == "Linux": try:
import speechDispatcher self.outputs.append(output())
self.outputs = [speechDispatcher.SpeechDispatcher()] except OutputError:
elif platform.system() == "Windows": pass
output_classes = accessible_output2.get_output_classes()
self.outputs = []
for output in output_classes:
try:
self.outputs.append(output())
except OutputError:
pass
def get_first_available_output(self): def get_first_available_output(self):
for output in self.outputs: for output in self.outputs:
@@ -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()

View File

@@ -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

View File

@@ -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)

View 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

View File

@@ -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."""

View File

@@ -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()

View File

@@ -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()

View File

@@ -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__)

View File

@@ -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("<", "&lt;")) textOutput = "<pitch absmiddle=\"%d\">%s</pitch>" % (round(self._pitch), text.replace("<", "&lt;"))
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:

View 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

View File

@@ -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

View File

@@ -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

View File

@@ -1 +0,0 @@
SPD_SPAWN_CMD = "/usr/bin/speech-dispatcher"

View File

@@ -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:

View File

@@ -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

View File

@@ -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):

View File

@@ -8,7 +8,7 @@ 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)

View File

@@ -5,12 +5,12 @@ if snapshot == False:
version = "0.80" version = "0.80"
update_url = 'http://twblue.es/updates/twblue_ngen.json' update_url = 'http://twblue.es/updates/twblue_ngen.json'
else: else:
version = "10.2" 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" 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"

View File

@@ -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" if args.directory != None: paths.directory = args.directory
elif args.portable == True:
paths.mode = "portable"
if args.directory != None: paths.directory = args.directory

View File

@@ -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,6 +43,7 @@ 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
@@ -82,7 +84,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):
@@ -142,6 +146,13 @@ class bufferController(object):
call_threaded(self.session.api_call, call_name="update_status_with_media", status=text, media=tweet.image) 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() if hasattr(tweet.message, "destroy"): tweet.message.destroy()
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)
@@ -224,7 +235,8 @@ 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()
@@ -235,6 +247,10 @@ class baseBufferController(bufferController):
uri = tweet["long_uri"] uri = tweet["long_uri"]
try: try:
tweet = self.session.twitter.twitter.show_status(id=tweet_id) tweet = self.session.twitter.twitter.show_status(id=tweet_id)
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
@@ -246,6 +262,10 @@ class baseBufferController(bufferController):
id = tweets.get_id(l) id = tweets.get_id(l)
try: try:
tweet = self.session.twitter.twitter.show_status(id=id) tweet = self.session.twitter.twitter.show_status(id=id)
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
@@ -254,16 +274,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):
log.debug("Starting stream for buffer %s, account %s and type %s" % (self.name, self.account, self.type)) # starts stream every 3 minutes.
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs)) current_time = time.time()
val = self.session.call_paged(self.function, *self.args, **self.kwargs) if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True:
number_of_items = self.session.order_buffer(self.name, val) self.execution_time = current_time
log.debug("Number of items retrieved: %d" % (number_of_items,)) log.debug("Starting stream for buffer %s, account %s and type %s" % (self.name, self.account, self.type))
self.put_items_on_list(number_of_items) log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))
if self.sound == None: return val = self.session.call_paged(self.function, *self.args, **self.kwargs)
if number_of_items > 0 and self.name != "sent_tweets" and self.name != "sent_direct_messages": number_of_items = self.session.order_buffer(self.name, val)
self.session.sound.play(self.sound) log.debug("Number of items retrieved: %d" % (number_of_items,))
self.put_items_on_list(number_of_items)
if number_of_items > 0 and self.name != "sent_tweets" and self.name != "sent_direct_messages" and self.sound != None:
self.session.sound.play(self.sound)
return number_of_items
def get_more_items(self): def get_more_items(self):
elements = [] elements = []
@@ -345,8 +369,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...")
@@ -357,6 +381,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"):
@@ -404,7 +483,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
@@ -423,7 +508,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", twishort_enabled=self.session.settings["mysc"]["twishort_enabled"]) 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:
@@ -457,11 +542,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[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
@@ -480,8 +564,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)
@@ -535,6 +619,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)
@@ -542,9 +646,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 = []
@@ -599,9 +703,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,))
@@ -609,7 +730,25 @@ class peopleBufferController(baseBufferController):
self.url = self.interact self.url = self.interact
def remove_buffer(self): def remove_buffer(self):
return False if "-followers" in self.name:
dlg = commonMessageDialogs.remove_buffer()
if dlg == widgetUtils.YES:
if self.name[:-10] in self.session.settings["other_buffers"]["followers_timelines"]:
self.session.settings["other_buffers"]["followers_timelines"].remove(self.name[:-10])
return True
elif dlg == widgetUtils.NO:
return False
elif "-friends" in self.name:
dlg = commonMessageDialogs.remove_buffer()
if dlg == widgetUtils.YES:
if self.name[:-8] in self.session.settings["other_buffers"]["friends_timelines"]:
self.session.settings["other_buffers"]["friends_timelines"].remove(self.name[:-8])
return True
elif dlg == widgetUtils.NO:
return False
else:
output.speak(_(u"This buffer is not a timeline; it can't be deleted."), True)
return False
def onFocus(self, ev): def onFocus(self, ev):
pass pass
@@ -631,17 +770,20 @@ class peopleBufferController(baseBufferController):
call_threaded(self.session.api_call, call_name="update_status_with_media", _sound="reply_send.ogg", status=message.message.get_text(), media=message.file) 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):
log.debug("Starting stream for %s buffer, %s account" % (self.name, self.account,)) # starts stream every 3 minutes.
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs)) current_time = time.time()
val = self.session.get_cursored_stream(self.name, self.function, *self.args, **self.kwargs) if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True:
# self.session.order_cursored_buffer(self.name, self.session.db[self.name]) self.execution_time = current_time
# log.debug("Number of items retrieved: %d" % (val,)) log.debug("Starting stream for %s buffer, %s account" % (self.name, self.account,))
self.put_items_on_list(val) log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))
val = self.session.get_cursored_stream(self.name, self.function, *self.args, **self.kwargs)
self.put_items_on_list(val)
return val
def get_more_items(self): 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
@@ -709,19 +851,40 @@ 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):
log.debug("Starting stream for %s buffer, %s account and %s type" % (self.name, self.account, self.type)) # starts stream every 3 minutes.
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs)) current_time = time.time()
log.debug("Function: %s" % (self.function,)) if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True:
self.execution_time = current_time
log.debug("Starting stream for %s buffer, %s account and %s type" % (self.name, self.account, self.type))
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))
log.debug("Function: %s" % (self.function,))
# try: # try:
val = self.session.search(self.name, *self.args, **self.kwargs) val = self.session.search(self.name, *self.args, **self.kwargs)
# except: # except:
# return None # return None
num = self.session.order_buffer(self.name, val) num = self.session.order_buffer(self.name, val)
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()
@@ -744,19 +907,24 @@ 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):
log.debug("starting stream for %s buffer, %s account and %s type" % (self.name, self.account, self.type)) # starts stream every 3 minutes.
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs)) current_time = time.time()
log.debug("Function: %s" % (self.function,)) if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True:
self.execution_time = current_time
log.debug("starting stream for %s buffer, %s account and %s type" % (self.name, self.account, self.type))
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))
log.debug("Function: %s" % (self.function,))
# try: # try:
val = self.session.call_paged(self.function, *self.args, **self.kwargs) val = self.session.call_paged(self.function, *self.args, **self.kwargs)
# except: # except:
# return # return
number_of_items = self.session.order_cursored_buffer(self.name, val) number_of_items = self.session.order_cursored_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 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()
@@ -785,17 +953,22 @@ 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):
try: # starts stream every 3 minutes.
data = self.session.call_paged("get_place_trends", id=self.trendsFor) current_time = time.time()
except: if self.execution_time == 0 or current_time-self.execution_time >= 180:
return self.execution_time = current_time
if not hasattr(self, "name_"): try:
self.name_ = data[0]["locations"][0]["name"] data = self.session.call_paged("get_place_trends", id=self.trendsFor)
self.trends = data[0]["trends"] except:
self.put_items_on_the_list() return
self.session.sound.play(self.sound) if not hasattr(self, "name_"):
self.name_ = data[0]["locations"][0]["name"]
self.trends = data[0]["trends"]
self.put_items_on_the_list()
self.session.sound.play(self.sound)
def put_items_on_the_list(self): def put_items_on_the_list(self):
selected_item = self.buffer.list.get_selected() selected_item = self.buffer.list.get_selected()
@@ -811,10 +984,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]
@@ -829,36 +1003,93 @@ class trendsBufferController(bufferController):
elif dlg == widgetUtils.NO: elif dlg == widgetUtils.NO:
return False return False
def interact(self, *args, **kwargs): def search_topic(self, *args, **kwargs):
self.searchfunction(value=self.get_message()) 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):
if start == True: # starts stream every 3 minutes.
self.statuses = [] current_time = time.time()
self.ids = [] if self.execution_time == 0 or current_time-self.execution_time >= 180:
self.statuses.append(self.tweet) self.execution_time = current_time
self.ids.append(self.tweet["id"]) if start == True:
tweet = self.tweet self.statuses = []
while tweet["in_reply_to_status_id"] != None: self.ids = []
tweet = self.session.twitter.twitter.show_status(id=tweet["in_reply_to_status_id"]) self.statuses.append(self.tweet)
self.statuses.insert(0, tweet) self.ids.append(self.tweet["id"])
self.ids.append(tweet["id"]) tweet = self.tweet
if tweet["in_reply_to_status_id"] == None: while tweet["in_reply_to_status_id"] != None:
self.kwargs["since_id"] = tweet["id"] tweet = self.session.twitter.twitter.show_status(id=tweet["in_reply_to_status_id"])
self.ids.append(tweet["id"]) self.statuses.insert(0, tweet)
val2 = self.session.search(self.name, *self.args, **self.kwargs) self.ids.append(tweet["id"])
for i in val2: if tweet["in_reply_to_status_id"] == None:
if i["in_reply_to_status_id"] in self.ids: self.kwargs["since_id"] = tweet["id"]
self.statuses.append(i) self.ids.append(tweet["id"])
self.ids.append(i["id"]) val2 = self.session.search(self.name, *self.args, **self.kwargs)
tweet = i for i in val2:
number_of_items = self.session.order_buffer(self.name, self.statuses) if i["in_reply_to_status_id"] in self.ids:
log.debug("Number of items retrieved: %d" % (number_of_items,)) self.statuses.append(i)
self.put_items_on_list(number_of_items) self.ids.append(i["id"])
if number_of_items > 0: tweet = i
self.session.sound.play("search_updated.ogg") number_of_items = self.session.order_buffer(self.name, self.statuses)
log.debug("Number of items retrieved: %d" % (number_of_items,))
self.put_items_on_list(number_of_items)
if number_of_items > 0:
self.session.sound.play("search_updated.ogg")
return number_of_items
def remove_buffer(self):
dlg = commonMessageDialogs.remove_buffer()
if dlg == widgetUtils.YES:
self.timer.cancel()
return True
elif dlg == widgetUtils.NO:
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):

View File

@@ -15,12 +15,23 @@ 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:
@@ -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["name"]) 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))

View File

@@ -97,7 +97,7 @@ class Controller(object):
def get_buffers_for_account(self, account): def get_buffers_for_account(self, account):
results = [] results = []
buffers = self.view.get_buffers() buffers = self.view.get_buffers()
[results.append(self.search_buffer(i.name, i.account)) for i in buffers if i.account == account] [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):
@@ -118,6 +118,7 @@ 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")
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):
@@ -128,7 +129,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)
@@ -156,7 +158,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)
@@ -174,6 +178,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()
@@ -235,7 +243,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)
@@ -246,6 +253,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:
@@ -263,6 +271,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)
@@ -286,11 +295,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':
@@ -301,7 +310,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)
@@ -331,11 +340,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"])
@@ -360,41 +387,28 @@ 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 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)
if buffer == None: return if buffer == None: return
@@ -404,7 +418,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)
@@ -414,13 +431,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)
@@ -478,8 +496,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()
@@ -508,8 +538,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
@@ -561,6 +615,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()
@@ -718,8 +773,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:
@@ -727,33 +781,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+1) 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+1) 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()
@@ -1188,7 +1283,7 @@ 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"]:
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"]))
@@ -1202,13 +1297,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]
for i in self.buffers: if hasattr(s, "main_stream"):
if i.invisible == True and i.session.session_id == s.session_id: s.main_stream.disconnect()
i.start_stream() log.error("main stream disconnected")
s.listen_stream_error() 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:
@@ -1221,7 +1329,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"])
@@ -1340,6 +1448,11 @@ 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):
self.buffers.insert(position, buffer) self.buffers.insert(position, buffer)
@@ -1350,5 +1463,25 @@ class Controller(object):
def repeat_item(self, *args, **kwargs): def repeat_item(self, *args, **kwargs):
output.speak(self.get_current_buffer().get_message()) output.speak(self.get_current_buffer().get_message())
def execute_action(self, action):
if hasattr(self, action):
getattr(self, action)()
def restart_streams_(self, session):
for i in self.buffers:
if i.session != None and i.session.session_id == session:
i.start_stream()
def __del__(self): def __del__(self):
config.app.write() config.app.write()
def update_buffer(self, *args, **kwargs):
bf = self.get_current_buffer()
if not hasattr(bf, "start_stream"):
output.speak(_(u"Unable to update this buffer."))
return
else:
output.speak(_(u"Updating buffer..."))
n = bf.start_stream(mandatory=True)
if n != None:
output.speak(_(u"{0} items retrieved").format(n,))

View File

@@ -1,4 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import re
import platform import platform
system = platform.system() system = platform.system()
import widgetUtils import widgetUtils
@@ -25,6 +26,7 @@ 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() 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)
@@ -34,10 +36,10 @@ class basicTweet(object):
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.message.text_focus() self.message.text_focus()
output.speak(_(u"Translated")) output.speak(_(u"Translated"))
@@ -97,6 +99,7 @@ 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.message.text_focus()
def attach(self, *args, **kwargs): def attach(self, *args, **kwargs):
def completed_callback(): def completed_callback():
@@ -109,6 +112,7 @@ class basicTweet(object):
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, twishort_enabled, messageType="tweet", max=140): def __init__(self, session, title, caption, text, twishort_enabled, messageType="tweet", max=140):
@@ -130,6 +134,7 @@ class tweet(basicTweet):
self.image = self.message.get_image() self.image = self.message.get_image()
if self.image != None: if self.image != None:
self.message.set("upload_image", _(u"Discard image")) self.message.set("upload_image", _(u"Discard image"))
self.message.text_focus()
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)
@@ -151,7 +156,7 @@ class reply(tweet):
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)
def autocomplete_users(self, *args, **kwargs): def autocomplete_users(self, *args, **kwargs):
@@ -164,17 +169,19 @@ class viewTweet(basicTweet):
text = "" text = ""
for i in xrange(0, len(tweetList)): for i in xrange(0, len(tweetList)):
if tweetList[i].has_key("retweeted_status"): if tweetList[i].has_key("retweeted_status"):
text = text + "rt @%s: %s\n\n" % (tweetList[i]["retweeted_status"]["user"]["screen_name"], tweetList[i]["retweeted_status"]["text"]) text = text + "rt @%s: %s\n" % (tweetList[i]["retweeted_status"]["user"]["screen_name"], tweetList[i]["retweeted_status"]["text"])
else: else:
text = text + "@%s: %s\n\n" % (tweetList[i]["user"]["screen_name"], tweetList[i]["text"]) text = text + "@%s: %s\n" % (tweetList[i]["user"]["screen_name"], tweetList[i]["text"])
rt_count = str(tweet["retweet_count"]) rt_count = str(tweet["retweet_count"])
favs_count = str(tweet["favorite_count"]) favs_count = str(tweet["favorite_count"])
source = str(re.sub(r"(?s)<.*?>", "", tweet["source"]))
if text == "": if text == "":
if tweet.has_key("retweeted_status"): if tweet.has_key("retweeted_status"):
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 = tweet["text"]
self.message = message.viewTweet(text, rt_count, favs_count) text = self.clear_text(text)
self.message = message.viewTweet(text, rt_count, favs_count,source)
self.message.set_title(len(text)) self.message.set_title(len(text))
else: else:
text = tweet text = tweet
@@ -190,3 +197,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, "")
return text

View File

@@ -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
@@ -147,11 +147,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,))
@@ -261,24 +261,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"] = ""

View File

@@ -95,7 +95,7 @@ class profileController(object):
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):

View File

@@ -74,10 +74,10 @@ class audioUploader(object):
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 +92,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 +100,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")
@@ -137,11 +137,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 +151,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):

View File

@@ -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)

View File

@@ -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.")),

View File

@@ -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"),
@@ -100,8 +101,8 @@ languages = {
} }
def available_languages(): def available_languages():
l = languages.keys() l = languages.keys()
d = languages.values() d = languages.values()
l.insert(0, '') l.insert(0, '')
d.insert(0, _(u"autodetect")) d.insert(0, _(u"autodetect"))
return sorted(zip(l, d)) return sorted(zip(l, d))

View File

@@ -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}'

View File

@@ -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

View File

@@ -28,3 +28,8 @@ repeat_item = string(default="control+win+space")
copy_to_clipboard = string(default="control+win+shift+c") copy_to_clipboard = string(default="control+win+shift+c")
search = string(default="control+win+/") search = string(default="control+win+/")
find = string(default="control+win+shift+/") 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")

View File

@@ -47,3 +47,8 @@ view_user_lists = string(default="win+alt+shift+l")
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+shift+t") 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")

View File

@@ -30,8 +30,8 @@ volume_up = string(default="alt+win+shift+up")
go_home = string(default="alt+win+home") go_home = string(default="alt+win+home")
volume_down = string(default="alt+win+shift+down") volume_down = string(default="alt+win+shift+down")
go_end = string(default="alt+win+end") go_end = string(default="alt+win+end")
go_page_up = string(default="alt+win+pageup") go_page_up = string(default="control+win+pageup")
go_page_down = string(default="alt+win+pagedown") go_page_down = string(default="control+win+pagedown")
update_profile = string(default="alt+win+p") update_profile = string(default="alt+win+p")
delete = string(default="alt+win+delete") delete = string(default="alt+win+delete")
clear_buffer = string(default="alt+win+shift+delete") clear_buffer = string(default="alt+win+shift+delete")
@@ -49,3 +49,8 @@ get_more_items = string(default="alt+win+pageup")
reverse_geocode = string(default="alt+win+g") reverse_geocode = string(default="alt+win+g")
view_reverse_geocode = string(default="alt+win+shift+g") view_reverse_geocode = string(default="alt+win+shift+g")
get_trending_topics = string(default="alt+win+t") 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")

View File

@@ -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")

View File

@@ -50,3 +50,8 @@ 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")
find = string(default="control+win+{") find = string(default="control+win+{")
check_for_updates = string(default="control+win+u")
list_manager = string(default="control+win+shift+l")
configuration = string(default="control+win+o")
accountConfiguration = string(default="control+win+shift+o")
update_buffer = string(default="control+win+shift+u")

View File

@@ -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 platform.architecture()[0][:2] == "32": if application.snapshot == True:
lib = load_library("api_keys32", x86_path=paths.app_path("keys/lib")) 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: else:
lib = load_library("api_keys64", x64_path=paths.app_path("keys/lib")) if platform.architecture()[0][:2] == "32":
lib = load_library("stable_api_keys32", x86_path=paths.app_path("keys/lib"))
else:
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.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -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."),
} }

View File

@@ -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,13 +37,10 @@ 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")
if dialog.get("shift") == True: if dialog.get("shift") == True:
@@ -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)

View File

@@ -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:

View File

@@ -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]

View File

@@ -1,13 +1,26 @@
from pywintypes import com_error from pywintypes import com_error
import win32com
import paths
win32com.__gen_path__=paths.data_path(u"com_cache")
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:

View File

@@ -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.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More