mirror of
https://github.com/MCV-Software/TWBlue.git
synced 2025-08-25 17:39:23 +00:00
Compare commits
191 Commits
v0.93
...
snapshot11
Author | SHA1 | Date | |
---|---|---|---|
4c1cad7f61 | |||
fffd98e09e | |||
a1a084bfda | |||
85e575386e | |||
2c64805eec | |||
6f2e439ddc | |||
7e42a096a5 | |||
9d2cf05a41 | |||
d7c095173d | |||
36ba6eca92 | |||
b6fa131999 | |||
c85c478595 | |||
![]() |
74e020c090 | ||
40105f37ed | |||
ca3f8779b8 | |||
a6a651d6f7 | |||
7748b4bb5d | |||
01a6c65c82 | |||
211d43aa30 | |||
c716f4aa96 | |||
9fd9d2a120 | |||
5c75be20d3 | |||
1ccb898f78 | |||
d734a30a18 | |||
3d310c0ee4 | |||
79512af350 | |||
7a2ad3797d | |||
f87312fc53 | |||
682f1e8bd4 | |||
cbc2e978c9 | |||
72fd93eaf6 | |||
8bac4b8ec6 | |||
6c29a4a18f | |||
3ae581a19f | |||
a9378988cb | |||
00f96bb7af | |||
ecd2984a61 | |||
3be69cb6a2 | |||
099bc49761 | |||
ec61f4b431 | |||
b16a6c5ddb | |||
9a94b92018 | |||
fe8a3b1565 | |||
a3d1052193 | |||
fbbd3cf00e | |||
8a6f73fdc2 | |||
c806f17484 | |||
db231e07f8 | |||
eaf13a4453 | |||
d4a73fb3bb | |||
8459135002 | |||
4aef2595b2 | |||
ccdcc7676e | |||
967cc8da71 | |||
071bcf55ef | |||
cf735211c9 | |||
bd56eb953b | |||
940ace664c | |||
![]() |
8619deb6ee | ||
![]() |
9fcc5d36e5 | ||
![]() |
c374cdefe9 | ||
7b925b5909 | |||
013a80a1f2 | |||
ec860aa6fc | |||
12e06eb52d | |||
464fce07b0 | |||
ad484a1f35 | |||
7296d2a939 | |||
cd596a6ad6 | |||
![]() |
ed3b9c9538 | ||
df9d99edcd | |||
![]() |
f5f4074409 | ||
6439eac76c | |||
5c794aaeff | |||
8cdd1b52d1 | |||
6928ac4b99 | |||
ae42a53b41 | |||
be7df1714d | |||
8cf7ca5ef2 | |||
0cfa89b389 | |||
f63ed6d0a7 | |||
00440e9050 | |||
76db14360a | |||
0966739296 | |||
1e27056902 | |||
3b41e18573 | |||
2668e47a6f | |||
b44e30ed28 | |||
bfad5b82f0 | |||
41d4c97067 | |||
![]() |
52f27c87b9 | ||
3f5ef28a48 | |||
4ec1e08606 | |||
f2cea695ee | |||
e4a6ead606 | |||
dc536c45de | |||
95fcbe6ba4 | |||
60f55940b7 | |||
655331d405 | |||
4381992718 | |||
eb87d924c2 | |||
1cebb29bdc | |||
27c1ec990a | |||
d40b816c48 | |||
ac5daec462 | |||
0835a34c71 | |||
babbc0a08d | |||
04ac629b51 | |||
![]() |
3920435eb7 | ||
2f0b20558e | |||
9ca6e15a20 | |||
9c2dba7cf8 | |||
318b6caf5f | |||
![]() |
83612b6a3c | ||
![]() |
f4e20f8ed4 | ||
![]() |
7883413210 | ||
![]() |
ad54134c86 | ||
![]() |
ef0d3a9eae | ||
ea48733cef | |||
6893d923a3 | |||
d94b133e63 | |||
28b6d554e2 | |||
931cadfffa | |||
232d876c8f | |||
c7f4fd2926 | |||
6b43ff1c0e | |||
5b5d762759 | |||
b4020d0f95 | |||
d8da78e22d | |||
c82bb4125b | |||
7b5e6477d3 | |||
41582a3770 | |||
e9cbe0d825 | |||
dc563523bc | |||
b15eed9697 | |||
019e83c55b | |||
7dad22189a | |||
eebaf94cbf | |||
1726d5882c | |||
64d843d98a | |||
610f18dcb6 | |||
cea638b680 | |||
e1e0a4e092 | |||
bc4a8bcba1 | |||
3db13062ed | |||
9559f07013 | |||
dee30385cc | |||
49ce469c12 | |||
59e1299a0b | |||
ab2667529f | |||
![]() |
a7fd88b4be | ||
a2cb4ba889 | |||
9847f7ad01 | |||
c2d81279fe | |||
77489cab1e | |||
7d35dbc752 | |||
f2ea4136c0 | |||
537d011b40 | |||
8af1e650b7 | |||
e3cbd8be87 | |||
7099875bc7 | |||
4a15fe1602 | |||
7478edd454 | |||
da4658c220 | |||
6768bf85d5 | |||
199a06c6e5 | |||
b967c32393 | |||
e9797ce6ac | |||
861de1f354 | |||
6f838d12e9 | |||
010c0011aa | |||
b1c5ddbca8 | |||
a16f16d36d | |||
e5196f0aad | |||
b8df56dcbb | |||
612f4ffadf | |||
652d3c7ff8 | |||
b6d49bb851 | |||
cb6f90a027 | |||
fff215fcdb | |||
8e9743cae1 | |||
0e41fabbe6 | |||
5ff5a4a6d2 | |||
d4dadfcdc7 | |||
fac228dec1 | |||
79490f8346 | |||
635b467394 | |||
e886090830 | |||
80cb5567d5 | |||
3c0824aad4 | |||
0bbbb3f1b6 |
2
COPYING
2
COPYING
@@ -1,5 +1,5 @@
|
||||
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
|
||||
Copyright © 2013-2018. 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/
|
||||
|
||||
|
63
README.md
63
README.md
@@ -1,7 +1,9 @@
|
||||
TWBlue -
|
||||
======
|
||||
|
||||
TW Blue is an app designed to use Twitter simply and efficiently while using minimal system resources.
|
||||
[](https://ci.appveyor.com/project/manuelcortez/twblue)
|
||||
|
||||
TW Blue is an app designed to use Twitter simply and efficiently while using minimal system resources.
|
||||
With this app you’ll have access to twitter features such as:
|
||||
|
||||
* Create, reply to, like, retweet and delete tweets,
|
||||
@@ -29,50 +31,38 @@ Although most dependencies can be found in the windows-dependencies directory, w
|
||||
|
||||
#### Dependencies packaged in windows installers
|
||||
|
||||
* [Python,](http://python.org) version 2.7.14
|
||||
* [Python,](http://python.org) version 2.7.15
|
||||
If you want to build both x86 and x64 binaries, you can install python x86 to C:\python27 and python x64 to C:\python27x64, for example.
|
||||
* [wxPython](http://www.wxpython.org) for Python 2.7, version 3.0.2.0
|
||||
* [Python windows extensions (pywin32)](http://www.sourceforge.net/projects/pywin32/) for python 2.7, build 221
|
||||
* [PyEnchant,](http://pythonhosted.org/pyenchant/) version 1.6.6.
|
||||
x64 version has been built by TWBlue developers, so you only will find it in windows-dependencies folder
|
||||
|
||||
The windows installers are available only in the windows-dependencies folder
|
||||
The windows installers are available only in the windows-dependencies folder.
|
||||
|
||||
To build a binary version:
|
||||
|
||||
* [Py2exe](http://www.sourceforge.net/projects/py2exe/) for Python 2.7, version 0.6.9
|
||||
|
||||
#### Dependencies that must be installed using easy_install
|
||||
#### Dependencies that must be installed using pip
|
||||
|
||||
setuptools installs a script, called easy_install. You can find it in the python scripts directory. To install packages using easy_install, you have to navigate to the scripts directory using a command prompt, for example:
|
||||
Python installs a tool called Pip that allows to install packages in a simple way. You can find it in the python scripts directory. To install packages using Pip, you have to navigate to the scripts directory using a command prompt, for example:
|
||||
|
||||
cd C:\python27x64\scripts
|
||||
|
||||
You can also add the scripts folder to your path environment variable.
|
||||
You can also add the scripts folder to your path environment variable or choose the corresponding option when installing Python.
|
||||
Note: pip and setuptools are included in the Python installer since version 2.7.9.
|
||||
|
||||
After that, run the following command to install a package, replacing packagename with the names listed below:
|
||||
Pip is able to install packages listed in a special text file, called the requirements file. To install all remaining dependencies, perform the following command:
|
||||
|
||||
easy_install -Z package
|
||||
pip install -r requirements.txt
|
||||
|
||||
The -z switch unzips the package, instead of installing it compressed. If you add the --upgrade switch, you can upgrade a package to its latest version. The following packages need to be installed:
|
||||
Note that if you perform the command from the path where Pip is located, you need to specify the path to your Tw Blue root folder where the requirements file is located, for example:
|
||||
|
||||
* pypubsub==3.3.0
|
||||
* configobj
|
||||
* requests-oauthlib
|
||||
* requests-toolbelt
|
||||
* future
|
||||
* pygeocoder
|
||||
* arrow
|
||||
* markdown
|
||||
* winpaths
|
||||
* PySocks
|
||||
* win_inet_pton
|
||||
* yandex.translate
|
||||
pip install -r D:\repos\TwBlue\requirements.txt
|
||||
|
||||
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 markdown future requests oauthlib requests-oauthlib requests-toolbelt pypubsub==3.3.0 pygeocoder arrow python-dateutil futures winpaths PySocks win_inet_pton yandex.translate idna chardet urllib3
|
||||
Pip will automatically get the additional libraries that the listed packages need to work properly.
|
||||
If you need to update your dependencies, perform the following command:
|
||||
|
||||
pip install --upgrade -r requirements.txt
|
||||
|
||||
#### Other dependencies
|
||||
|
||||
@@ -82,16 +72,17 @@ These dependencies are located in the windows-dependencies directory. You don't
|
||||
This dependency has been built using pure basic 4.61. Its source can be found at http://hg.q-continuum.net/updater
|
||||
* [oggenc2.exe,](http://www.rarewares.org/ogg-oggenc.php) version 2.87
|
||||
* Microsoft Visual c++ 2008 redistributable dlls.
|
||||
* VLC plugins and DLL libraries.
|
||||
|
||||
#### Dependencies required to build the installer
|
||||
|
||||
* [NSIS,](http://nsis.sourceforge.net/) version 3.02.1
|
||||
* [NSIS,](http://nsis.sourceforge.net/) version 3.03
|
||||
|
||||
#### Dependencies required to build the portableApps.com format archive
|
||||
|
||||
* [NSIS Portable,](http://portableapps.com/apps/development/nsis_portable) version 3.02.1
|
||||
* [NSIS Portable,](http://portableapps.com/apps/development/nsis_portable) version 3.03
|
||||
* [PortableApps.com Launcher,](http://portableapps.com/apps/development/portableapps.com_launcher) version 2.2.1
|
||||
* [PortableApps.com Installer,](http://portableapps.com/apps/development/portableapps.com_installer) version 3.5.5
|
||||
* [PortableApps.com Installer,](http://portableapps.com/apps/development/portableapps.com_installer) version 3.5.8
|
||||
|
||||
Important! Install these 3 apps into the same folder, otherwise you won't be able to build the pa.c version. For example: D:\portableApps\NSISPortable, D:\PortableApps\PortableApps.com installer, ...
|
||||
|
||||
@@ -101,19 +92,21 @@ In order to add the support for spell checking in more languages than english yo
|
||||
|
||||
### 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:
|
||||
|
||||
python main.py
|
||||
|
||||
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 these commands:
|
||||
python document_importer.py
|
||||
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.
|
||||
|
||||
python document_importer.py
|
||||
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 necessary.
|
||||
Also, copy the `license.txt` file located in the root of the repo to the documentation folder.
|
||||
|
||||
### Building a binary version
|
||||
|
||||
|
83
appveyor.yml
Normal file
83
appveyor.yml
Normal file
@@ -0,0 +1,83 @@
|
||||
pull_requests:
|
||||
# Avoid building after pull requests. Shall we disable this option?
|
||||
do_not_increment_build_number: true
|
||||
|
||||
# Only build whenever we add tags to the repo.
|
||||
skip_non_tags: true
|
||||
|
||||
environment:
|
||||
|
||||
matrix:
|
||||
|
||||
# List of python versions we want to work with.
|
||||
- PYTHON: "C:\\Python27"
|
||||
PYTHON_VERSION: "2.7.x" # currently 2.7.9
|
||||
PYTHON_ARCH: "32"
|
||||
|
||||
# perhaps we may enable this one in future?
|
||||
# - PYTHON: "C:\\Python27-x64"
|
||||
# PYTHON_VERSION: "2.7.x" # currently 2.7.9
|
||||
# PYTHON_ARCH: "64"
|
||||
|
||||
# This is important so we will retrieve everything in submodules as opposed to default method.
|
||||
clone_script:
|
||||
- cmd: >-
|
||||
git clone -q --branch=%APPVEYOR_REPO_BRANCH% https://github.com/%APPVEYOR_REPO_NAME%.git %APPVEYOR_BUILD_FOLDER%
|
||||
&& cd %APPVEYOR_BUILD_FOLDER%
|
||||
&& git checkout -qf %APPVEYOR_REPO_COMMIT%
|
||||
&& git submodule update --init --recursive
|
||||
|
||||
install:
|
||||
# If there is a newer build queued for the same PR, cancel this one.
|
||||
# The AppVeyor 'rollout builds' option is supposed to serve the same
|
||||
# purpose but it is problematic because it tends to cancel builds pushed
|
||||
# directly to master instead of just PR builds (or the converse).
|
||||
# credits: JuliaLang developers.
|
||||
- ps: if ($env:APPVEYOR_PULL_REQUEST_NUMBER -and $env:APPVEYOR_BUILD_NUMBER -ne ((Invoke-RestMethod `
|
||||
https://ci.appveyor.com/api/projects/$env:APPVEYOR_ACCOUNT_NAME/$env:APPVEYOR_PROJECT_SLUG/history?recordsNumber=50).builds | `
|
||||
Where-Object pullRequestId -eq $env:APPVEYOR_PULL_REQUEST_NUMBER)[0].buildNumber) { `
|
||||
throw "There are newer queued builds for this pull request, failing early." }
|
||||
- ECHO "Filesystem root:"
|
||||
- ps: "ls \"C:/\""
|
||||
|
||||
# Check that we have the expected version and architecture for Python
|
||||
- "python --version"
|
||||
- "python -c \"import struct; print(struct.calcsize('P') * 8)\""
|
||||
|
||||
# Upgrade to the latest version of pip to avoid it displaying warnings
|
||||
# about it being out of date.
|
||||
- "python -m pip install --upgrade pip setuptools"
|
||||
|
||||
# Install the build dependencies of the project. If some dependencies contain
|
||||
# compiled extensions and are not provided as pre-built wheel packages,
|
||||
# pip will build them from source using the MSVC compiler matching the
|
||||
# target Python version and architecture
|
||||
- "%CMD_IN_ENV% pip install -r requirements.txt"
|
||||
- "%CMD_IN_ENV% pip install pyenchant py2exe_py2"
|
||||
|
||||
build_script:
|
||||
# Build documentation at first, so setup.py won't fail when copying everything.
|
||||
- "cd doc"
|
||||
# Import documentation before building, so strings.py will be created.
|
||||
- "%CMD_IN_ENV% python documentation_importer.py"
|
||||
# build doc from src folder so it will generate result files right there.
|
||||
- "cd ..\\src"
|
||||
- "%CMD_IN_ENV% python ..\\doc\\generator.py"
|
||||
# Build distributable files.
|
||||
- "%CMD_IN_ENV% python setup.py py2exe"
|
||||
- "cd dist"
|
||||
# Zip it all.
|
||||
- cmd: 7z a ..\..\snapshot.zip *
|
||||
|
||||
artifacts:
|
||||
- path: snapshot.zip
|
||||
|
||||
deploy:
|
||||
- provider: FTP
|
||||
host: twblue.es
|
||||
protocol: ftp
|
||||
beta: true
|
||||
username: twblue
|
||||
password:
|
||||
secure: ml/xB8YEoZ7DmjzDr+KSNw==
|
||||
# folder: '//pubs'
|
@@ -2,7 +2,7 @@
|
||||
name = 'TWBlue'
|
||||
snapshot = False
|
||||
if snapshot == False:
|
||||
version = "0.93"
|
||||
version = "0.94"
|
||||
update_url = 'http://twblue.es/updates/twblue_ngen.json'
|
||||
mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/stable.json'
|
||||
else:
|
||||
|
@@ -2,6 +2,49 @@
|
||||
|
||||
## changes in this version
|
||||
|
||||
* When adding or removing an user from a list, it is possible to press enter in the focused list instead of having to search for the "add" or "delete" button.
|
||||
* Quoted and long tweets are displayed properly in the sent tweets buffer after being send. ([#253](https://github.com/manuelcortez/TWBlue/issues/253))
|
||||
* Fixed an issue that was making the list manager keystroke unable to be shown in the keystroke editor. Now the keystroke is listed properly. ([#260](https://github.com/manuelcortez/TWBlue/issues/260))
|
||||
* The volume slider, located in the account settings of TWBlue, now should decrease and increase value properly when up and down arrows are pressed. Before it was doing it in inverted order. ([#261](https://github.com/manuelcortez/TWBlue/issues/261))
|
||||
* autoreading has been redesigned to work in a similar way for almost all buffers. Needs testing. ([#221](https://github.com/manuelcortez/TWBlue/issues/221))
|
||||
* When displaying tweets or direct messages, a new field has been added to show the date when the item has been posted to Twitter.
|
||||
* Added support for deleting direct messages by using the new Twitter API methods.
|
||||
* When quoting a retweet, the quote will be made to the original tweet instead of the retweet.
|
||||
* If the sent direct messages buffer is hidden, TWBlue should keep loading everything as expected. ([#246](https://github.com/manuelcortez/TWBlue/issues/246))
|
||||
* There is a new soundpack, called FreakyBlue (Thanks to [Andre Louis](https://twitter.com/FreakyFwoof)) as a new option in TWBlue. This pack can be the default in the next stable, so users can take a look and share their opinion in snapshot versions. ([#247](https://github.com/manuelcortez/TWBlue/issues/247))
|
||||
* There is a new option in the help menu that allows you to visit the soundpacks section in the TWBlue website. ([#247](https://github.com/manuelcortez/TWBlue/issues/247))
|
||||
* When reading location of a geotagged tweet, it will be translated for users of other languages. ([#251](https://github.com/manuelcortez/TWBlue/pull/251))
|
||||
* In the Windows 10 Keymap, the action to read location of a tweet has been remapped to Ctrl+Win+G. ([#177](https://github.com/manuelcortez/TWBlue/pull/177))
|
||||
* When there are no more items to retrieve in direct messages and people buffers, a message will announce it.
|
||||
* Fixed an issue reported by some users that was making them unable to load more items in their direct messages.
|
||||
* It is possible to add a tweet to the likes buffer from the menu bar again.
|
||||
* Tweets, replies and retweets will be added to sent tweets right after being posted in Twitter.
|
||||
* Extended Tweets should be displayed properly in list buffers.
|
||||
|
||||
## Changes in version 0.94
|
||||
|
||||
* Added an option in the global settings dialog to disable the Streaming features of TWBlue. TWBlue will remove all Streaming features after August 16, so this option will give people an idea about how it will be. ([#219](https://github.com/manuelcortez/TWBlue/issues/219))
|
||||
* Due to Twitter API changes, Switched authorisation method to Pin-code based authorisation. When you add new accounts to TWBlue, you will be required to paste a code displayed in the Twitter website in order to grant access to TWBlue. ([#216](https://github.com/manuelcortez/TWBlue/issues/216))
|
||||
* In order to comply with latest Twitter changes, TWBlue has switched to the new method used to send and receive direct messages, according to issue [#215.](https://github.com/manuelcortez/twblue/issues/215)
|
||||
* The new method does not allow direct messages to be processed in real time. Direct messages will be updated periodically.
|
||||
* After august 16 or when streaming is disabled, the events buffer will no longer be created in TWBlue.
|
||||
* You can configure frequency for buffer updates in TWBlue. By default, TWBlue will update all buffers every 2 minutes, but you can change this setting in the global settings dialog. ([#223](https://github.com/manuelcortez/TWBlue/issues/223))
|
||||
* Added a new tab called feedback, in the account settings dialog. This tab allows you to control whether automatic speech or Braille feedbak in certain events (mentions and direct messages received) is enabled. Take into account that this option will take preference over automatic reading of buffers and any kind of automatic output. ([#203](https://github.com/manuelcortez/TWBlue/issues/203))
|
||||
* The spell checking dialog now has access keys defined for the most important actions. ([#211](https://github.com/manuelcortez/TWBlue/issues/211))
|
||||
* TWBlue now Uses WXPython 4.0.1. This will allow us to migrate all important components to Python 3 in the future. ([#207](https://github.com/manuelcortez/TWBlue/issues/207))
|
||||
* When you quote a Tweet, if the original tweet was posted with Twishort, TWBlue should display properly the quoted tweet. Before it was displaying the original tweet only. ([#206](https://github.com/manuelcortez/TWBlue/issues/206))
|
||||
* It is possible to filter by retweets, quotes and replies when creating a new filter.
|
||||
* Added support for playing youtube Links directly from the client. ([#94](https://github.com/manuelcortez/TWBlue/issues/94))
|
||||
* Replaced Bass with libVLC for playing URL streams.
|
||||
* the checkbox for indicating whether TWBlue will include everyone in a reply or not, will be unchecked by default.
|
||||
* You can request TWBlue to save the state for two checkboxes: Long tweet and mention all, from the global settings dialogue.
|
||||
* For windows 10 users, some keystrokes in the invisible user interface have been changed or merged:
|
||||
* control+Windows+alt+F will be used for toggling between adding and removing a tweet to user's likes. This function will execute the needed action based in the current status for the focused tweet.
|
||||
* TWBlue will show an error if something goes wrong in an audio upload.
|
||||
* And more. ([#171,](https://github.com/manuelcortez/TWBlue/issues/171)
|
||||
|
||||
## Changes in version 0.93
|
||||
|
||||
* A new soundpack has been added to TWBlue. Thanks to [@ValeriaK305](https://twitter.com/ValeriaK305)
|
||||
* In the Windows 10 keymap, we have changed some default keystrokes as windows now uses some previously assigned shortcuts:
|
||||
* For liking a tweet, press Control+Windows+alt+f
|
||||
|
@@ -1,6 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import markdown
|
||||
import os
|
||||
import shutil
|
||||
from codecs import open as _open
|
||||
import languageHandler
|
||||
languageHandler.setLanguage("en")
|
||||
@@ -38,14 +39,18 @@ def generate_document(language, document_type="documentation"):
|
||||
""" % (language, title, title)
|
||||
first_html_block = first_html_block+ markdown_file
|
||||
first_html_block = first_html_block + "\n</body>\n</html>"
|
||||
if not os.path.exists(language):
|
||||
os.mkdir(language)
|
||||
mdfile = _open("%s/%s" % (language, filename), "w", encoding="utf-8")
|
||||
if not os.path.exists(os.path.join("documentation", language)):
|
||||
os.mkdir(os.path.join("documentation", language))
|
||||
mdfile = _open(os.path.join("documentation", language, filename), "w", encoding="utf-8")
|
||||
mdfile.write(first_html_block)
|
||||
mdfile.close()
|
||||
|
||||
def create_documentation():
|
||||
print("Creating documentation in the supported languages...\n")
|
||||
if not os.path.exists("documentation"):
|
||||
os.mkdir("documentation")
|
||||
if os.path.exists(os.path.join("documentation", "license.txt")) == False:
|
||||
shutil.copy(os.path.join("..", "license.txt"), os.path.join("documentation", "license.txt"))
|
||||
for i in languages:
|
||||
print("Creating documentation for: %s" % (i,))
|
||||
generate_document(i)
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -5,7 +5,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: TW Blue documentation 0.89\n"
|
||||
"POT-Creation-Date: 2017-01-18 08:42+Hora estndar central (Mxico)\n"
|
||||
"POT-Creation-Date: 2018-08-07 13:19+Hora de verano central (Mexico)\n"
|
||||
"PO-Revision-Date: 2017-03-25 15:15+0100\n"
|
||||
"Last-Translator: Joan Rabat <joanrabat@hotmail.com>\n"
|
||||
"Language-Team: Francisco Torres Gallego <frantorresgallego@gmail.com>\n"
|
||||
@@ -114,9 +114,10 @@ msgid "## Usage"
|
||||
msgstr "##funcionament"
|
||||
|
||||
#: ../doc/strings.py:21
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Twitter is a social networking or micro-blogging tool which allows you to "
|
||||
"compose short status updates of your activities in 140 characters or less. "
|
||||
"compose short status updates of your activities in 280 characters or less. "
|
||||
"Twitter is a way for friends, family and co-workers to communicate and stay "
|
||||
"connected through the exchange of quick, frequent messages. You can restrict "
|
||||
"delivery of updates to those in your circle of friends or, by default, allow "
|
||||
@@ -521,9 +522,10 @@ msgid "#### Buttons in the application"
|
||||
msgstr "###Botons en l'aplicació."
|
||||
|
||||
#: ../doc/strings.py:65
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"* Tweet: this button opens up a dialogue box to write your tweet. Normal "
|
||||
"tweets must not exceed 140 characters. However you can press the long tweet "
|
||||
"tweets must not exceed 280 characters. However you can press the long tweet "
|
||||
"checkbox and your tweet will be posted throught Twishort, wich will allow "
|
||||
"you to write longer tweets (10000 characters). If you write past this limit, "
|
||||
"a sound will play to warn you. Note that the character count is displayed in "
|
||||
|
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.
@@ -5,8 +5,8 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: TWBlue Documentation\n"
|
||||
"POT-Creation-Date: 2017-01-18 08:42+Hora estndar central (Mxico)\n"
|
||||
"PO-Revision-Date: 2017-07-09 10:41+0200\n"
|
||||
"POT-Creation-Date: 2018-08-07 13:19+Hora de verano central (Mexico)\n"
|
||||
"PO-Revision-Date: 2018-08-08 11:01+0200\n"
|
||||
"Last-Translator: Steffen Schultz <schulle3o@yahoo.de>\n"
|
||||
"Language-Team: Steffen Schultz <schulle3o@yahoo.de>\n"
|
||||
"Language: de\n"
|
||||
@@ -14,7 +14,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: pygettext.py 1.5\n"
|
||||
"X-Generator: Poedit 2.0.2\n"
|
||||
"X-Generator: Poedit 2.0.6\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: ../doc/strings.py:3
|
||||
@@ -111,17 +111,17 @@ msgstr "## Verwendung"
|
||||
#: ../doc/strings.py:21
|
||||
msgid ""
|
||||
"Twitter is a social networking or micro-blogging tool which allows you to "
|
||||
"compose short status updates of your activities in 140 characters or less. "
|
||||
"compose short status updates of your activities in 280 characters or less. "
|
||||
"Twitter is a way for friends, family and co-workers to communicate and stay "
|
||||
"connected through the exchange of quick, frequent messages. You can restrict "
|
||||
"delivery of updates to those in your circle of friends or, by default, allow "
|
||||
"anyone to access them."
|
||||
msgstr ""
|
||||
"Twitter ist ein soziales Netzwerk oder Micro-Blog, welches das Verfassen von "
|
||||
"Status-Nachrichten von nicht mehr als 140 Zeichen Länge erlaubt. Dieser "
|
||||
"Dienst ist perfekt für Freunde, Familien und Mitarbeiter, um schnell und "
|
||||
"regelmäßig Kurznachrichten auszutauschen. Die Nachrichten können dabei allen "
|
||||
"zugänglich gemacht oder nur auf den Freundeskreis beschränkt werden."
|
||||
"Status-Nachrichten von bis zu 280 Zeichen Länge erlaubt. Dieser Dienst ist "
|
||||
"perfekt für Freunde, Familien und Mitarbeiter, um schnell und regelmäßig "
|
||||
"Kurznachrichten auszutauschen. Die Nachrichten können dabei allen zugänglich "
|
||||
"gemacht oder nur auf den Freundeskreis beschränkt werden."
|
||||
|
||||
#: ../doc/strings.py:22
|
||||
msgid ""
|
||||
@@ -527,7 +527,7 @@ msgstr "#### Schaltflächen der Anwendung"
|
||||
#: ../doc/strings.py:65
|
||||
msgid ""
|
||||
"* Tweet: this button opens up a dialogue box to write your tweet. Normal "
|
||||
"tweets must not exceed 140 characters. However you can press the long tweet "
|
||||
"tweets must not exceed 280 characters. However you can press the long tweet "
|
||||
"checkbox and your tweet will be posted throught Twishort, wich will allow "
|
||||
"you to write longer tweets (10000 characters). If you write past this limit, "
|
||||
"a sound will play to warn you. Note that the character count is displayed in "
|
||||
@@ -541,7 +541,7 @@ msgid ""
|
||||
"message in English describing the problem."
|
||||
msgstr ""
|
||||
"* Tweet: Diese Schaltfläche öffnet einen Dialog zum Verfassen eines neuen "
|
||||
"Tweets. Die Nachricht darf normalerweise 140 Zeichen nicht überschreiten, "
|
||||
"Tweets. Die Nachricht darf normalerweise 280 Zeichen nicht überschreiten, "
|
||||
"kann jedoch durch aktivieren der Checkbox \"Langer Tweet\" über den Twishort-"
|
||||
"Dienst gesendet werden (maximal 10000 Zeichen). Geht eine Nachricht darüber "
|
||||
"hinaus, kennzeichnet TWBlue dies durch einen Warnklang. Die Anzahl der "
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -5,7 +5,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: twblue-documentation 0.84\n"
|
||||
"POT-Creation-Date: 2017-12-06 15:59+Hora estndar central (Mxico)\n"
|
||||
"POT-Creation-Date: 2018-08-07 13:19+Hora de verano central (Mexico)\n"
|
||||
"PO-Revision-Date: 2017-01-18 09:13-0600\n"
|
||||
"Last-Translator: Manuel Cortéz <manuel@manuelcortez.net>\n"
|
||||
"Language-Team: Spanish <manuel@manuelcortez.net>\n"
|
||||
@@ -116,9 +116,10 @@ msgid "## Usage"
|
||||
msgstr "## Uso"
|
||||
|
||||
#: ../doc/strings.py:21
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Twitter is a social networking or micro-blogging tool which allows you to "
|
||||
"compose short status updates of your activities in 140 characters or less. "
|
||||
"compose short status updates of your activities in 280 characters or less. "
|
||||
"Twitter is a way for friends, family and co-workers to communicate and stay "
|
||||
"connected through the exchange of quick, frequent messages. You can restrict "
|
||||
"delivery of updates to those in your circle of friends or, by default, allow "
|
||||
@@ -552,9 +553,10 @@ msgid "#### Buttons in the application"
|
||||
msgstr "#### Botones de la aplicación"
|
||||
|
||||
#: ../doc/strings.py:65
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"* Tweet: this button opens up a dialogue box to write your tweet. Normal "
|
||||
"tweets must not exceed 140 characters. However you can press the long tweet "
|
||||
"tweets must not exceed 280 characters. However you can press the long tweet "
|
||||
"checkbox and your tweet will be posted throught Twishort, wich will allow "
|
||||
"you to write longer tweets (10000 characters). If you write past this limit, "
|
||||
"a sound will play to warn you. Note that the character count is displayed in "
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -5,7 +5,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: TW Blue documentation 0.46\n"
|
||||
"POT-Creation-Date: 2017-01-18 08:42+Hora estndar central (Mxico)\n"
|
||||
"POT-Creation-Date: 2018-08-07 13:19+Hora de verano central (Mexico)\n"
|
||||
"PO-Revision-Date: 2015-11-27 08:33-0600\n"
|
||||
"Last-Translator: Manuel Cortéz <manuel@manuelcortez.net>\n"
|
||||
"Language-Team: Sukil Echenique <sukiletxe@yahoo.es>\n"
|
||||
@@ -116,9 +116,10 @@ msgid "## Usage"
|
||||
msgstr " Nola erabili"
|
||||
|
||||
#: ../doc/strings.py:21
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Twitter is a social networking or micro-blogging tool which allows you to "
|
||||
"compose short status updates of your activities in 140 characters or less. "
|
||||
"compose short status updates of your activities in 280 characters or less. "
|
||||
"Twitter is a way for friends, family and co-workers to communicate and stay "
|
||||
"connected through the exchange of quick, frequent messages. You can restrict "
|
||||
"delivery of updates to those in your circle of friends or, by default, allow "
|
||||
@@ -446,7 +447,7 @@ msgstr "&Aplikazioa"
|
||||
#: ../doc/strings.py:65
|
||||
msgid ""
|
||||
"* Tweet: this button opens up a dialogue box to write your tweet. Normal "
|
||||
"tweets must not exceed 140 characters. However you can press the long tweet "
|
||||
"tweets must not exceed 280 characters. However you can press the long tweet "
|
||||
"checkbox and your tweet will be posted throught Twishort, wich will allow "
|
||||
"you to write longer tweets (10000 characters). If you write past this limit, "
|
||||
"a sound will play to warn you. Note that the character count is displayed in "
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -5,8 +5,8 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: TW Blue documentation 0.88\n"
|
||||
"POT-Creation-Date: 2017-01-18 08:42+Hora estndar central (Mxico)\n"
|
||||
"PO-Revision-Date: 2017-01-18 16:32+0100\n"
|
||||
"POT-Creation-Date: 2018-08-07 13:19+Hora de verano central (Mexico)\n"
|
||||
"PO-Revision-Date: 2018-08-11 12:25+0200\n"
|
||||
"Last-Translator: Rémy Ruiz <remyruiz@gmail.com>\n"
|
||||
"Language-Team: Rémy Ruiz <remyruiz@gmail.com>\n"
|
||||
"Language: fr\n"
|
||||
@@ -14,7 +14,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: pygettext.py 1.5\n"
|
||||
"X-Generator: Poedit 1.8.9\n"
|
||||
"X-Generator: Poedit 1.8.12\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"X-Poedit-SourceCharset: UTF-8\n"
|
||||
|
||||
@@ -120,14 +120,14 @@ msgstr "## Utilisation"
|
||||
#: ../doc/strings.py:21
|
||||
msgid ""
|
||||
"Twitter is a social networking or micro-blogging tool which allows you to "
|
||||
"compose short status updates of your activities in 140 characters or less. "
|
||||
"compose short status updates of your activities in 280 characters or less. "
|
||||
"Twitter is a way for friends, family and co-workers to communicate and stay "
|
||||
"connected through the exchange of quick, frequent messages. You can restrict "
|
||||
"delivery of updates to those in your circle of friends or, by default, allow "
|
||||
"anyone to access them."
|
||||
msgstr ""
|
||||
"Twitter est un réseau social qui vous permet de créer vos mises à jour du "
|
||||
"statut de vos activités en 140 caractères ou moins. Twitter est un moyen de "
|
||||
"statut de vos activités en 280 caractères ou moins. Twitter est un moyen de "
|
||||
"rester connecté avec vos amis, famille et collègues de travail à travers de "
|
||||
"l'échange de messages courts. Vous pouvez restreindre vos mises à jour afin "
|
||||
"que seuls vos amis puissent les voir, ou permettre à quiconque de les voir. "
|
||||
@@ -568,7 +568,7 @@ msgstr "#### Boutons dans l'application"
|
||||
#: ../doc/strings.py:65
|
||||
msgid ""
|
||||
"* Tweet: this button opens up a dialogue box to write your tweet. Normal "
|
||||
"tweets must not exceed 140 characters. However you can press the long tweet "
|
||||
"tweets must not exceed 280 characters. However you can press the long tweet "
|
||||
"checkbox and your tweet will be posted throught Twishort, wich will allow "
|
||||
"you to write longer tweets (10000 characters). If you write past this limit, "
|
||||
"a sound will play to warn you. Note that the character count is displayed in "
|
||||
@@ -582,7 +582,7 @@ msgid ""
|
||||
"message in English describing the problem."
|
||||
msgstr ""
|
||||
"* Tweet: Ce bouton ouvre la boîte de dialogue pour écrire un tweet. Le "
|
||||
"message ne doit pas dépasser au-delà de 140 caractères. Cependant, vous "
|
||||
"message ne doit pas dépasser au-delà de 280 caractères. Cependant, vous "
|
||||
"pouvez appuyer sur la case à cocher Long tweet et votre tweet sera affiché "
|
||||
"via Twishort qui vous permettra d'écrire des tweets plus longs (10000 "
|
||||
"caractères). Si vous écrivez au-delà de cette limite, un son sera joués pour "
|
||||
@@ -1093,7 +1093,7 @@ msgid ""
|
||||
"* Play/pause: try to play audio for the selected item (if available), or "
|
||||
"stop the currently played audio."
|
||||
msgstr ""
|
||||
"* Lecture/Pause: essayez de lire l'audio de l'élément sélectionné (si "
|
||||
"* Lecture / Pause: essayez de lire l'audio de l'élément sélectionné (si "
|
||||
"disponible) ou arrêtez l'audio actuellement en cours de lecture."
|
||||
|
||||
#: ../doc/strings.py:117
|
||||
@@ -1478,13 +1478,13 @@ msgstr "* Contrôle+Windows+Maj+A: Supprimer l'utilisateur de la liste."
|
||||
#: ../doc/strings.py:187
|
||||
msgid "* Control + Windows + Shift + M: Mute / unmute the current buffer."
|
||||
msgstr ""
|
||||
"* Contrôle+Windows+Maj+M: Activer muet /désactiver muet dans le tampon "
|
||||
"* Contrôle+Windows+Maj+M: Activer muet / désactiver muet dans le tampon "
|
||||
"actuel."
|
||||
|
||||
#: ../doc/strings.py:188
|
||||
msgid "* Windows + Alt + M: Mute / unmute the current session."
|
||||
msgstr ""
|
||||
"* Windows +Alt+M: : Activer muet /désactiver muet dans la session actuelle."
|
||||
"* Windows +Alt+M: : Activer muet / désactiver muet dans la session actuelle."
|
||||
|
||||
#: ../doc/strings.py:189
|
||||
msgid ""
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -5,8 +5,8 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: tw blue documentation 0.46\n"
|
||||
"POT-Creation-Date: 2017-01-18 08:42+Hora estndar central (Mxico)\n"
|
||||
"PO-Revision-Date: 2017-01-20 16:44+0100\n"
|
||||
"POT-Creation-Date: 2018-08-07 13:19+Hora de verano central (Mexico)\n"
|
||||
"PO-Revision-Date: 2018-08-08 11:34+0100\n"
|
||||
"Last-Translator: Juan C. Buño <oprisniki@gmail.com>\n"
|
||||
"Language-Team: Alba Quinteiro <alba_080695@hotmail.com>\n"
|
||||
"Language: gl\n"
|
||||
@@ -117,18 +117,19 @@ msgstr "## Uso"
|
||||
#: ../doc/strings.py:21
|
||||
msgid ""
|
||||
"Twitter is a social networking or micro-blogging tool which allows you to "
|
||||
"compose short status updates of your activities in 140 characters or less. "
|
||||
"compose short status updates of your activities in 280 characters or less. "
|
||||
"Twitter is a way for friends, family and co-workers to communicate and stay "
|
||||
"connected through the exchange of quick, frequent messages. You can restrict "
|
||||
"delivery of updates to those in your circle of friends or, by default, allow "
|
||||
"anyone to access them."
|
||||
msgstr ""
|
||||
"Twitter é unha rede social que che permite crear actualizacións de estado "
|
||||
"sobre as túas actividades nun máximo de 140 caracteres. Twitter é un xeito "
|
||||
"de manterte conectado cos teus amigos, familiares e compañeiros de traballo "
|
||||
"a través do intercambio de mensaxes curtas. Podes restrinxir as túas "
|
||||
"actualizacións para que só as vexan os teus amigos, ou permitir que calquera "
|
||||
"poda velas. Esta segunda opción é o comportamento por defecto de Twitter."
|
||||
"Twitter é unha rede social ou ferramenta de micro-blogging que che permite "
|
||||
"compoñer curtas actualizacións de estado das túas actividades en 280 "
|
||||
"caracteres ou menos. Twitter é un xeito para que amigos, familiares e "
|
||||
"compañeiros de traballo se comuniquen e permanezan conectados a través do "
|
||||
"intercambio de mensaxes rápidas e frecuentes. Podes restrinxir a entrega de "
|
||||
"actualizacións aos membros do teu círculo de amigos ou, de xeito "
|
||||
"predeterminado, permitir que calquera persoa teña aceso a elas."
|
||||
|
||||
#: ../doc/strings.py:22
|
||||
msgid ""
|
||||
@@ -546,7 +547,7 @@ msgstr "#### Botóns na aplicación"
|
||||
#: ../doc/strings.py:65
|
||||
msgid ""
|
||||
"* Tweet: this button opens up a dialogue box to write your tweet. Normal "
|
||||
"tweets must not exceed 140 characters. However you can press the long tweet "
|
||||
"tweets must not exceed 280 characters. However you can press the long tweet "
|
||||
"checkbox and your tweet will be posted throught Twishort, wich will allow "
|
||||
"you to write longer tweets (10000 characters). If you write past this limit, "
|
||||
"a sound will play to warn you. Note that the character count is displayed in "
|
||||
@@ -559,20 +560,20 @@ msgid ""
|
||||
"hear a sound confirming it. Otherwise, the screen reader will speak an error "
|
||||
"message in English describing the problem."
|
||||
msgstr ""
|
||||
"* Chío: este botón abre unha Caixa de diálogo para escreber o teu chío. Os "
|
||||
"chíos normais non deben pasar dos 140 carácteres. Non obstante podes premer "
|
||||
"a Caixa de verificación Chíos Longos e o chío publicarase a través do "
|
||||
"Twishort, o que che permitirá escribir chíos máis longos (10000 carácteres). "
|
||||
"Se te pasas escrebindo este límite, reproducirase un son para avisarte. Ten "
|
||||
"en conta que a conta de carácteres amósase na barra de título. Poderás usar "
|
||||
"os botón acurtar e expandir URL para aumentar os límites de carácteres. "
|
||||
"Podes descargar un gráfico, correxir a ortografía, engadir audio ou traducir "
|
||||
"a túa mensaxe seleccionando un dos botón disponibles na Caixa de diálogo. "
|
||||
"Ademáis, podes autocompletar a introducción de usuarios premendo Alt + C ou "
|
||||
"o botón para ese propósito se tes a base de datos de usuarios configurada. "
|
||||
"Preme intro para enviar o chío. Se todo foi ben, escoitarás un son "
|
||||
"confirmándocho. De outro xeito, o lector de pantallas falará unha mensaxe de "
|
||||
"erro en inglés descrebindo o problema."
|
||||
"* Chío: este botón abre una Caixa de diálogo para escreber os teus chíos. Os "
|
||||
"chíos normais non deben exceder de 280 caracteres. Non obstante podes premer "
|
||||
"a Caixa de verificación chíos longos e os teus chíos publicaránse a través "
|
||||
"de Twishort, o que che permite escreber chíos máis longos (10000 "
|
||||
"caracteres). Se escrebes pasando este límite, reproducirase un son para "
|
||||
"advertirte. Ten en conta que o reconto de caracteres amósase na barra de "
|
||||
"título. Podes usar os botons de acurtar e expandir URL para cumplir co "
|
||||
"límite de caracteres. Podes cargar una imaxe, correxir a ortografía, "
|
||||
"adxuntar audio ou traducir a túa mensaxe seleccionando un dos botóns "
|
||||
"disponibles na caixa de diálogo. Ademáis, podes autocompretar a introducción "
|
||||
"de usuarios premendo Alt + C ou o botón para ese propósito se tes a base de "
|
||||
"datos de usuarios configurada. Preme intro para enviar o chío. Se todo foi "
|
||||
"ben, escoitarás un son confirmándoo. Doutro xeito, o lector de pantalla "
|
||||
"falará una mensaxe de erro en inglés descrebindo o problema."
|
||||
|
||||
#: ../doc/strings.py:66
|
||||
msgid ""
|
||||
|
Binary file not shown.
@@ -5,8 +5,8 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: TW Blue documentation 0.46\n"
|
||||
"POT-Creation-Date: 2017-01-18 08:42+Hora estndar central (Mxico)\n"
|
||||
"PO-Revision-Date: 2017-01-24 14:35+0100\n"
|
||||
"POT-Creation-Date: 2018-08-07 13:19+Hora de verano central (Mexico)\n"
|
||||
"PO-Revision-Date: 2018-08-09 11:51+0100\n"
|
||||
"Last-Translator: Chris Leo Mameli <llajta2012@gmail.com>\n"
|
||||
"Language-Team: \n"
|
||||
"Language: it\n"
|
||||
@@ -116,19 +116,19 @@ msgstr "## Caratteristiche"
|
||||
#: ../doc/strings.py:21
|
||||
msgid ""
|
||||
"Twitter is a social networking or micro-blogging tool which allows you to "
|
||||
"compose short status updates of your activities in 140 characters or less. "
|
||||
"compose short status updates of your activities in 280 characters or less. "
|
||||
"Twitter is a way for friends, family and co-workers to communicate and stay "
|
||||
"connected through the exchange of quick, frequent messages. You can restrict "
|
||||
"delivery of updates to those in your circle of friends or, by default, allow "
|
||||
"anyone to access them."
|
||||
msgstr ""
|
||||
"Twitter è un social network o strumento di micro-blogging che consente di "
|
||||
"pubblicare gli aggiornamenti di stato delle vostre attività in 140 caratteri "
|
||||
"o meno. È un modo per comunicare con amici, parenti, colleghi e rimanere in "
|
||||
"contatto attraverso lo scambio frequente e rapido di messaggi. È possibile "
|
||||
"limitare la visualizzazione degli aggiornamenti alla tua cerchia di amici o, "
|
||||
"modificando come impostazione predefinita, consentire a chiunque di "
|
||||
"accedervi."
|
||||
"aTwitter è un social network o strumento di micro-blogging che consente di "
|
||||
"pubblicare gli aggiornamenti di stato delle vostre attività con un massimo "
|
||||
"di 180 caratteri. È un modo per comunicare con amici, parenti, colleghi e "
|
||||
"restare in contatto attraverso lo scambio frequente e rapido di messaggi. È "
|
||||
"possibile limitare la visualizzazione degli aggiornamenti alla tua cerchia "
|
||||
"di amici o, modificando come impostazione predefinita, consentire a chiunque "
|
||||
"di accedervi."
|
||||
|
||||
#: ../doc/strings.py:22
|
||||
msgid ""
|
||||
@@ -533,7 +533,7 @@ msgstr "#### Pulsanti dell'applicazione"
|
||||
#: ../doc/strings.py:65
|
||||
msgid ""
|
||||
"* Tweet: this button opens up a dialogue box to write your tweet. Normal "
|
||||
"tweets must not exceed 140 characters. However you can press the long tweet "
|
||||
"tweets must not exceed 280 characters. However you can press the long tweet "
|
||||
"checkbox and your tweet will be posted throught Twishort, wich will allow "
|
||||
"you to write longer tweets (10000 characters). If you write past this limit, "
|
||||
"a sound will play to warn you. Note that the character count is displayed in "
|
||||
@@ -547,7 +547,7 @@ msgid ""
|
||||
"message in English describing the problem."
|
||||
msgstr ""
|
||||
"* Twit: Questo pulsante apre una finestra di dialogo per digitare un tweet. "
|
||||
"Il limite è 140 caratteri. Tuttavia, è possibile scrivere tweet lunghi "
|
||||
"Il limite è 180 caratteri. Tuttavia, è possibile scrivere tweet lunghi "
|
||||
"selezionando la casella di controllo apposita che attiva Twishort(il limite "
|
||||
"in questo caso sarà 10000 caratteri). Quando si supera il limite, verrà "
|
||||
"riprodotto un suono di avviso. Il numero dei caratteri digitati viene "
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -5,8 +5,8 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"POT-Creation-Date: 2017-01-18 08:42+Hora estndar central (Mxico)\n"
|
||||
"PO-Revision-Date: 2017-01-23 00:07+0900\n"
|
||||
"POT-Creation-Date: 2018-08-07 13:19+Hora de verano central (Mexico)\n"
|
||||
"PO-Revision-Date: 2018-08-08 19:09+0900\n"
|
||||
"Last-Translator: Masamitsu Misono <misono@nvsupport.org>\n"
|
||||
"Language-Team: NVDA Help Desk <nvdahelp@center-aikoh.net>\n"
|
||||
"Language: ja_JP\n"
|
||||
@@ -14,12 +14,12 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: pygettext.py 1.5\n"
|
||||
"X-Generator: Poedit 1.8.7\n"
|
||||
"X-Generator: Poedit 2.1.1\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
|
||||
#: ../doc/strings.py:3
|
||||
msgid "Documentation for TWBlue - 0.88"
|
||||
msgstr "TWBlue 0.88 取扱説明書"
|
||||
msgstr "TWBlue - 0.88 取扱説明書"
|
||||
|
||||
#: ../doc/strings.py:4
|
||||
msgid "## Table of contents"
|
||||
@@ -31,7 +31,7 @@ msgstr "[TOC]"
|
||||
|
||||
#: ../doc/strings.py:6
|
||||
msgid "## Warning!"
|
||||
msgstr "## 警告"
|
||||
msgstr "## 警告!"
|
||||
|
||||
#: ../doc/strings.py:7
|
||||
msgid ""
|
||||
@@ -112,17 +112,17 @@ msgstr "## 使い方"
|
||||
#: ../doc/strings.py:21
|
||||
msgid ""
|
||||
"Twitter is a social networking or micro-blogging tool which allows you to "
|
||||
"compose short status updates of your activities in 140 characters or less. "
|
||||
"compose short status updates of your activities in 280 characters or less. "
|
||||
"Twitter is a way for friends, family and co-workers to communicate and stay "
|
||||
"connected through the exchange of quick, frequent messages. You can restrict "
|
||||
"delivery of updates to those in your circle of friends or, by default, allow "
|
||||
"anyone to access them."
|
||||
msgstr ""
|
||||
"ツイッターは、ソーシャルネットワークまたは小さなブログのようなもので、自分の"
|
||||
"活動を140文字以下で登校することができるツールです。ツイッターは、友達や家"
|
||||
"族、同僚とコミュニケーションをとったり、接続を維持して、頻繁に素早くメッセー"
|
||||
"ジを交換するための一つの方法です。あなたは、友人とのサークルなどのように、公"
|
||||
"開範囲を制限するか、だれでもツイートをみえるようにすることができます。"
|
||||
"活動を280文字以下で登校することができるツールです。ツイッターは、友達や家族、"
|
||||
"同僚とコミュニケーションをとったり、接続を維持して、頻繁に素早くメッセージを"
|
||||
"交換するための一つの方法です。あなたは、友人とのサークルなどのように、公開範"
|
||||
"囲を制限するか、だれでもツイートをみえるようにすることができます。"
|
||||
|
||||
#: ../doc/strings.py:22
|
||||
msgid ""
|
||||
@@ -528,7 +528,7 @@ msgstr "#### アプリケーション上のボタン"
|
||||
#: ../doc/strings.py:65
|
||||
msgid ""
|
||||
"* Tweet: this button opens up a dialogue box to write your tweet. Normal "
|
||||
"tweets must not exceed 140 characters. However you can press the long tweet "
|
||||
"tweets must not exceed 280 characters. However you can press the long tweet "
|
||||
"checkbox and your tweet will be posted throught Twishort, wich will allow "
|
||||
"you to write longer tweets (10000 characters). If you write past this limit, "
|
||||
"a sound will play to warn you. Note that the character count is displayed in "
|
||||
@@ -542,7 +542,7 @@ msgid ""
|
||||
"message in English describing the problem."
|
||||
msgstr ""
|
||||
"* ツイート: このボタンはツイートを書き込むためのダイアログボックスを開きま"
|
||||
"す。メッセージは140字以内です。書き込み字数が制限を超過した場合は警告音が鳴り"
|
||||
"す。メッセージは280字以内です。書き込み字数が制限を超過した場合は警告音が鳴り"
|
||||
"ます。タイトルバーには文字カウントを表示します。ツイートを短縮して投稿に"
|
||||
"チェックを入れると、1万文字までのツイートをTwishortを経由して、投稿できます。"
|
||||
"画像をアップロードボタンや、スペルチェックボタンや音声を添付ボタンを押すと、"
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -5,8 +5,8 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: twblue-documentation 0.46\n"
|
||||
"POT-Creation-Date: 2017-01-18 08:42+Hora estndar central (Mxico)\n"
|
||||
"PO-Revision-Date: 2017-01-23 09:55+0200\n"
|
||||
"POT-Creation-Date: 2018-08-07 13:19+Hora de verano central (Mexico)\n"
|
||||
"PO-Revision-Date: 2018-08-08 10:32+0300\n"
|
||||
"Last-Translator: Florian Ionașcu <florianionascu@hotmail.com>\n"
|
||||
"Language-Team: Spanish <manuel@manuelcortez.net>\n"
|
||||
"Language: ro\n"
|
||||
@@ -14,7 +14,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: pygettext.py 1.5\n"
|
||||
"X-Generator: Poedit 1.8.9\n"
|
||||
"X-Generator: Poedit 2.0.6\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Poedit-SourceCharset: UTF-8\n"
|
||||
|
||||
@@ -115,9 +115,10 @@ msgid "## Usage"
|
||||
msgstr "## Utilizare"
|
||||
|
||||
#: ../doc/strings.py:21
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Twitter is a social networking or micro-blogging tool which allows you to "
|
||||
"compose short status updates of your activities in 140 characters or less. "
|
||||
"compose short status updates of your activities in 280 characters or less. "
|
||||
"Twitter is a way for friends, family and co-workers to communicate and stay "
|
||||
"connected through the exchange of quick, frequent messages. You can restrict "
|
||||
"delivery of updates to those in your circle of friends or, by default, allow "
|
||||
@@ -523,7 +524,7 @@ msgstr "#### Butoane în aplicație"
|
||||
#: ../doc/strings.py:65
|
||||
msgid ""
|
||||
"* Tweet: this button opens up a dialogue box to write your tweet. Normal "
|
||||
"tweets must not exceed 140 characters. However you can press the long tweet "
|
||||
"tweets must not exceed 280 characters. However you can press the long tweet "
|
||||
"checkbox and your tweet will be posted throught Twishort, wich will allow "
|
||||
"you to write longer tweets (10000 characters). If you write past this limit, "
|
||||
"a sound will play to warn you. Note that the character count is displayed in "
|
||||
@@ -537,7 +538,7 @@ msgid ""
|
||||
"message in English describing the problem."
|
||||
msgstr ""
|
||||
"* Postare: acest buton deschide o casetă de dialog pentru a vă scrie "
|
||||
"postarea. Postările normale nu trebuie să depășească 140 de caractere. "
|
||||
"postarea. Postările normale nu trebuie să depășească 280 de caractere. "
|
||||
"Totuși, puteți bifa caseta postare lungă, iar postarea dumneavoastră va fi "
|
||||
"postată prin Twishort, care vă permite să scrieți postări lungi (10000 de "
|
||||
"caractere). Dacă depășiți această limită, se va reda un sunet pentru a vă "
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -5,8 +5,8 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: TW Blue documentation 0.46\n"
|
||||
"POT-Creation-Date: 2017-12-06 15:59+Hora estndar central (Mxico)\n"
|
||||
"PO-Revision-Date: 2017-01-18 18:50+0400\n"
|
||||
"POT-Creation-Date: 2018-08-07 13:19+Hora de verano central (Mexico)\n"
|
||||
"PO-Revision-Date: 2018-08-14 21:44+0400\n"
|
||||
"Last-Translator: Valeria <luciana.lu3a@gmail.com>\n"
|
||||
"Language-Team: \n"
|
||||
"Language: ru\n"
|
||||
@@ -117,14 +117,14 @@ msgstr "## Использование"
|
||||
#: ../doc/strings.py:21
|
||||
msgid ""
|
||||
"Twitter is a social networking or micro-blogging tool which allows you to "
|
||||
"compose short status updates of your activities in 140 characters or less. "
|
||||
"compose short status updates of your activities in 280 characters or less. "
|
||||
"Twitter is a way for friends, family and co-workers to communicate and stay "
|
||||
"connected through the exchange of quick, frequent messages. You can restrict "
|
||||
"delivery of updates to those in your circle of friends or, by default, allow "
|
||||
"anyone to access them."
|
||||
msgstr ""
|
||||
"Твиттер - это социальная сеть или инструмент для микро-блоггинга, "
|
||||
"позволяющий создавать короткие, не более 140 символов заметки. Твиттер - это "
|
||||
"позволяющий создавать короткие, не более 280 символов заметки. Твиттер - это "
|
||||
"возможность общаться с друзьями, членами семьи и коллегами, обмениваясь "
|
||||
"быстрыми, короткими сообщениями, и оставаясь всегда на связи. Обновления "
|
||||
"можно ограничить только для круга друзей или, как выбрано по умолчанию, "
|
||||
@@ -541,7 +541,7 @@ msgstr "#### Кнопки приложения"
|
||||
#: ../doc/strings.py:65
|
||||
msgid ""
|
||||
"* Tweet: this button opens up a dialogue box to write your tweet. Normal "
|
||||
"tweets must not exceed 140 characters. However you can press the long tweet "
|
||||
"tweets must not exceed 280 characters. However you can press the long tweet "
|
||||
"checkbox and your tweet will be posted throught Twishort, wich will allow "
|
||||
"you to write longer tweets (10000 characters). If you write past this limit, "
|
||||
"a sound will play to warn you. Note that the character count is displayed in "
|
||||
@@ -555,7 +555,7 @@ msgid ""
|
||||
"message in English describing the problem."
|
||||
msgstr ""
|
||||
"* Твит: этой кнопкой открывается диалоговое окно для написания твита. Длина "
|
||||
"обычного сообщения не должна превышать 140 символов. Однако, можно отметить "
|
||||
"обычного сообщения не должна превышать 280 символов. Однако, можно отметить "
|
||||
"флажок длинный твит и ваша запись будет отправлена через сервис Twishort, "
|
||||
"позволяющий отправлять более длинные сообщения (10000 символов). Если вы "
|
||||
"привысите лимит, прозвучит предупреждающий сигнал. Обратите внимание, что "
|
||||
|
@@ -26,7 +26,7 @@ TWBlue is an application to make Twitter simple and fast, while using as few res
|
||||
|
||||
## Usage
|
||||
|
||||
Twitter is a social networking or micro-blogging tool which allows you to compose short status updates of your activities in 140 characters or less. Twitter is a way for friends, family and co-workers to communicate and stay connected through the exchange of quick, frequent messages. You can restrict delivery of updates to those in your circle of friends or, by default, allow anyone to access them.
|
||||
Twitter is a social networking or micro-blogging tool which allows you to compose short status updates of your activities in 280 characters or less. Twitter is a way for friends, family and co-workers to communicate and stay connected through the exchange of quick, frequent messages. You can restrict delivery of updates to those in your circle of friends or, by default, allow anyone to access them.
|
||||
|
||||
You can monitor the status of updates from your friends, family or co-workers (known as following), and they in turn can read any updates you create, (known as followers). The updates are referred to as Tweets. The Tweets are posted to your Twitter profile or Blog and are searchable using Twitter Search.
|
||||
|
||||
@@ -98,7 +98,7 @@ In summary, the GUI contains two core components. These are the controls you wil
|
||||
|
||||
#### Buttons in the application
|
||||
|
||||
* Tweet: this button opens up a dialogue box to write your tweet. Normal tweets must not exceed 140 characters. However you can press the long tweet checkbox and your tweet will be posted throught Twishort, wich will allow you to write longer tweets (10000 characters). If you write past this limit, a 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 character limit. You can upload a picture, check spelling, attach audio 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 pressing Alt + C or the button for that purpose if you have the database of users configured. Press enter to send the tweet. If all goes well, you'll hear a sound confirming it. Otherwise, the screen reader will speak an error message in English describing the problem.
|
||||
* Tweet: this button opens up a dialogue box to write your tweet. Normal tweets must not exceed 280 characters. However you can press the long tweet checkbox and your tweet will be posted throught Twishort, wich will allow you to write longer tweets (10000 characters). If you write past this limit, a 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 character limit. You can upload a picture, check spelling, attach audio 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 pressing Alt + C or the button for that purpose if you have the database of users configured. Press enter to send the tweet. If all goes well, you'll hear a sound confirming it. Otherwise, the screen reader will speak an error message in English describing the problem.
|
||||
* Retweet: this button retweets the message you're reading. After you press 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 add a comment, it will post a quoted tweet, that is, the comment with a link to the originating tweet.
|
||||
* Reply: when you're viewing a tweet, you can reply to the user who sent it by pressing this button. A dialogue will open up similar to the one for tweeting. If there are more users referred to in the tweet, you can press tab and activate the mention to all checkbox, or enabling checkbox for the users you want to mention separately. When you're on the friends or followers lists, the button will be called mention instead.
|
||||
* Direct message: exactly like sending a tweet, but it's a private message which can only be read by the user you send it to. Press shift-tab twice to see the recipient. If there were other users mentioned in the tweet you were reading, you can arrow up or down to choose which one to send it to, or write the username yourself without the at sign. In addition, you can autocomplete the entering of users by pressing Alt + C or the button for that purpose if you have the database of users configured.
|
||||
|
@@ -20,8 +20,8 @@ CommercialUse=true
|
||||
EULAVersion=2
|
||||
|
||||
[Version]
|
||||
PackageVersion=0.93.0.0
|
||||
DisplayVersion=0.93
|
||||
PackageVersion=0.94.0.0
|
||||
DisplayVersion=0.94
|
||||
|
||||
[Control]
|
||||
Icons=1
|
||||
|
26
requirements.txt
Normal file
26
requirements.txt
Normal file
@@ -0,0 +1,26 @@
|
||||
wxpython
|
||||
six
|
||||
configobj
|
||||
markdown
|
||||
future
|
||||
requests
|
||||
oauthlib
|
||||
requests-oauthlib
|
||||
requests-toolbelt
|
||||
pypubsub==3.3.0
|
||||
pygeocoder
|
||||
arrow
|
||||
python-dateutil
|
||||
futures
|
||||
winpaths
|
||||
PySocks
|
||||
win_inet_pton
|
||||
yandex.translate
|
||||
idna
|
||||
chardet
|
||||
urllib3
|
||||
youtube-dl
|
||||
python-vlc
|
||||
pywin32
|
||||
certifi
|
||||
backports.functools_lru_cache
|
@@ -14,11 +14,11 @@ SetCompress auto
|
||||
SetCompressor /solid lzma
|
||||
SetDatablockOptimize on
|
||||
VIAddVersionKey ProductName "TWBlue"
|
||||
VIAddVersionKey LegalCopyright "Copyright 2016 Manuel Cortéz."
|
||||
VIAddVersionKey ProductVersion "0.93"
|
||||
VIAddVersionKey FileVersion "0.93"
|
||||
VIProductVersion "0.93.0.0"
|
||||
VIFileVersion "0.93.0.0"
|
||||
VIAddVersionKey LegalCopyright "Copyright 2018 Manuel Cortéz."
|
||||
VIAddVersionKey ProductVersion "0.94"
|
||||
VIAddVersionKey FileVersion "0.94"
|
||||
VIProductVersion "0.94.0.0"
|
||||
VIFileVersion "0.94.0.0"
|
||||
!insertmacro MUI_PAGE_WELCOME
|
||||
!define MUI_LICENSEPAGE_RADIOBUTTONS
|
||||
!insertmacro MUI_PAGE_LICENSE "license.txt"
|
||||
@@ -72,10 +72,10 @@ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "D
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "UninstallString" '"$INSTDIR\uninstall.exe"'
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall" "InstallLocation" $INSTDIR
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall" "Publisher" "Manuel Cortéz"
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "DisplayVersion" "0.93"
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "DisplayVersion" "0.94"
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "URLInfoAbout" "http://twblue.es"
|
||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "VersionMajor" 0
|
||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "VersionMinor" 93
|
||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "VersionMinor" 94
|
||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "NoModify" 1
|
||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "NoRepair" 1
|
||||
SectionEnd
|
||||
|
@@ -9,12 +9,11 @@ relative_times = boolean(default=True)
|
||||
max_api_calls = integer(default=1)
|
||||
max_tweets_per_call = integer(default=100)
|
||||
reverse_timelines = boolean(default=False)
|
||||
time_to_check_streams = integer(default=30)
|
||||
announce_stream_status = boolean(default=True)
|
||||
retweet_mode = string(default="ask")
|
||||
persist_size = integer(default=0)
|
||||
show_screen_names = boolean(default=False)
|
||||
buffer_order = list(default=list('home','mentions','dm','sent_dm','sent_tweets','favorites','followers','friends','blocks','muted','events'))
|
||||
buffer_order = list(default=list('home','mentions', 'dm', 'sent_dm', 'sent_tweets','favorites','followers','friends','blocks','muted','events'))
|
||||
|
||||
[sound]
|
||||
volume = float(default=1.0)
|
||||
@@ -44,4 +43,8 @@ save_followers_in_autocompletion_db = boolean(default=False)
|
||||
save_friends_in_autocompletion_db = boolean(default=False)
|
||||
ocr_language = string(default="")
|
||||
|
||||
[reporting]
|
||||
braille_reporting = boolean(default=True)
|
||||
speech_reporting = boolean(default=True)
|
||||
|
||||
[filters]
|
||||
|
@@ -5,6 +5,7 @@ ignored_sessions = list(default=list())
|
||||
|
||||
[app-settings]
|
||||
language = string(default="system")
|
||||
update_period = integer(default=2)
|
||||
hide_gui = boolean(default=False)
|
||||
voice_enabled = boolean(default=False)
|
||||
ask_at_exit = boolean(default=True)
|
||||
@@ -17,6 +18,10 @@ log_level = string(default="error")
|
||||
load_keymap = string(default="default.keymap")
|
||||
donation_dialog_displayed = boolean(default=False)
|
||||
check_for_updates = boolean(default=True)
|
||||
remember_mention_and_longtweet = boolean(default=False)
|
||||
longtweet = boolean(default=false)
|
||||
mention_all = boolean(default=False)
|
||||
no_streaming = boolean(default=False)
|
||||
|
||||
[proxy]
|
||||
type = string(default="Direct connection")
|
||||
|
@@ -1,17 +1,19 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import datetime
|
||||
|
||||
name = 'TWBlue'
|
||||
snapshot = False
|
||||
snapshot = True
|
||||
if snapshot == False:
|
||||
version = "0.93"
|
||||
version = "0.94"
|
||||
update_url = 'https://twblue.es/updates/stable.php'
|
||||
mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/stable.json'
|
||||
else:
|
||||
version = "3"
|
||||
version = "11"
|
||||
update_url = 'https://twblue.es/updates/snapshot.php'
|
||||
mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/snapshots.json'
|
||||
authors = [u"Manuel Cortéz", u"José Manuel Delicado"]
|
||||
authorEmail = "manuel@manuelcortez.net"
|
||||
copyright = u"Copyright (C) 2013-2017, Manuel cortéz."
|
||||
copyright = u"Copyright (C) 2013-2018, Manuel cortéz."
|
||||
description = unicode(name+" is an app designed to use Twitter simply and efficiently while using minimal system resources. This app provides access to most Twitter features.")
|
||||
translators = [u"Manuel Cortéz (English)", u"Mohammed Al Shara, Hatoun Felemban (Arabic)", u"Francisco Torres (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"Zvonimir Stanečić (Croatian)", u"Robert Osztolykan (Hungarian)", u"Christian Leo Mameli (Italian)", u"Riku (Japanese)", u"Paweł Masarczyk (Polish)", u"Odenilton Júnior Santos (Portuguese)", u"Florian Ionașcu, Nicușor Untilă (Romanian)", u"Natalia Hedlund, Valeria Kuznetsova (Russian)", u"Aleksandar Đurić (Serbian)", u"Burak Yüksek (Turkish)"]
|
||||
url = u"https://twblue.es"
|
||||
|
@@ -2,6 +2,7 @@ from audio_services import matches_url
|
||||
import json
|
||||
import re
|
||||
import urllib
|
||||
import youtube_utils
|
||||
|
||||
@matches_url('https://audioboom.com')
|
||||
def convert_audioboom(url):
|
||||
@@ -28,5 +29,9 @@ def convert_soundcloud (url):
|
||||
else:
|
||||
raise TypeError('%r is not streamable' % url)
|
||||
|
||||
@matches_url ('https://www.youtube.com/watch')
|
||||
def convert_youtube_long (url):
|
||||
return youtube_utils.get_video_url(url)
|
||||
|
||||
def convert_generic_audio(url):
|
||||
return url
|
||||
|
7
src/controller/buffers/__init__.py
Normal file
7
src/controller/buffers/__init__.py
Normal file
@@ -0,0 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
""" this package contains logic related to buffers. A buffer is a virtual representation of a group of items retrieved through the Social network API'S.
|
||||
Ideally, new social networks added to TWBlue will have its own "buffers", and these buffers should be defined within this package, following the Twitter example.
|
||||
Currently, the package contains the following modules:
|
||||
* baseBuffers: Define a set of functions and structure to be expected in all buffers. New buffers should inherit its classes from one of the classes present here.
|
||||
* twitterBuffers: All other code, specific to Twitter.
|
||||
"""
|
201
src/controller/buffers/baseBuffers.py
Normal file
201
src/controller/buffers/baseBuffers.py
Normal file
@@ -0,0 +1,201 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
""" Common logic to all buffers in TWBlue."""
|
||||
import logging
|
||||
import wx
|
||||
import output
|
||||
import config
|
||||
import sound
|
||||
import widgetUtils
|
||||
from pubsub import pub
|
||||
from wxUI import buffers
|
||||
|
||||
log = logging.getLogger("controller.buffers.baseBuffers")
|
||||
|
||||
def _items_exist(function):
|
||||
""" A decorator to execute a function only if the selected buffer contains at least one item."""
|
||||
def function_(self, *args, **kwargs):
|
||||
if self.buffer.list.get_count() > 0:
|
||||
function(self, *args, **kwargs)
|
||||
return function_
|
||||
|
||||
class buffer(object):
|
||||
""" A basic buffer object. This should be the base class for all other derived buffers."""
|
||||
|
||||
def __init__(self, parent=None, function=None, session=None, *args, **kwargs):
|
||||
"""Inits the main controller for this buffer:
|
||||
@ parent wx.Treebook object: Container where we will put this buffer.
|
||||
@ function str or None: function to be called periodically and update items on this buffer.
|
||||
@ session sessionmanager.session object or None: Session handler for settings, database and data access.
|
||||
"""
|
||||
super(buffer, self).__init__()
|
||||
self.function = function
|
||||
# Compose_function will be used to render an object on this buffer. Normally, signature is as follows:
|
||||
# compose_function(item, db, relative_times, show_screen_names=False, session=None)
|
||||
# Read more about compose functions in twitter/compose.py.
|
||||
self.compose_function = None
|
||||
self.args = args
|
||||
self.kwargs = kwargs
|
||||
# This will be used as a reference to the wx.Panel object wich stores the buffer GUI.
|
||||
self.buffer = None
|
||||
# This should countains the account associated to this buffer.
|
||||
self.account = ""
|
||||
# This controls whether the start_stream function should be called when starting the program.
|
||||
self.needs_init = True
|
||||
# if this is set to False, the buffer will be ignored on the invisible interface.
|
||||
self.invisible = False
|
||||
# Control variable, used to track time of execution for calls to start_stream.
|
||||
self.execution_time = 0
|
||||
|
||||
def clear_list(self):
|
||||
pass
|
||||
|
||||
def get_event(self, ev):
|
||||
""" Catch key presses in the WX interface and generate the corresponding event names."""
|
||||
if ev.GetKeyCode() == wx.WXK_RETURN and ev.ControlDown(): event = "audio"
|
||||
elif ev.GetKeyCode() == wx.WXK_RETURN: event = "url"
|
||||
elif ev.GetKeyCode() == wx.WXK_F5: event = "volume_down"
|
||||
elif ev.GetKeyCode() == wx.WXK_F6: event = "volume_up"
|
||||
elif ev.GetKeyCode() == wx.WXK_DELETE and ev.ShiftDown(): event = "clear_list"
|
||||
elif ev.GetKeyCode() == wx.WXK_DELETE: event = "destroy_status"
|
||||
else:
|
||||
event = None
|
||||
ev.Skip()
|
||||
if event != None:
|
||||
try:
|
||||
getattr(self, event)()
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
def volume_down(self):
|
||||
""" Decreases volume by 5%"""
|
||||
if self.session.settings["sound"]["volume"] > 0.0:
|
||||
if self.session.settings["sound"]["volume"] <= 0.05:
|
||||
self.session.settings["sound"]["volume"] = 0.0
|
||||
else:
|
||||
self.session.settings["sound"]["volume"] -=0.05
|
||||
sound.URLPlayer.player.audio_set_volume(int(self.session.settings["sound"]["volume"]*100.0))
|
||||
self.session.sound.play("volume_changed.ogg")
|
||||
self.session.settings.write()
|
||||
|
||||
def volume_up(self):
|
||||
""" Increases volume by 5%."""
|
||||
if self.session.settings["sound"]["volume"] < 1.0:
|
||||
if self.session.settings["sound"]["volume"] >= 0.95:
|
||||
self.session.settings["sound"]["volume"] = 1.0
|
||||
else:
|
||||
self.session.settings["sound"]["volume"] +=0.05
|
||||
sound.URLPlayer.player.audio_set_volume(int(self.session.settings["sound"]["volume"]*100))
|
||||
self.session.sound.play("volume_changed.ogg")
|
||||
self.session.settings.write()
|
||||
|
||||
def start_stream(self, mandatory=False, play_sound=True):
|
||||
pass
|
||||
|
||||
def get_more_items(self):
|
||||
output.speak(_(u"This action is not supported for this buffer"), True)
|
||||
|
||||
def put_items_on_list(self, items):
|
||||
pass
|
||||
|
||||
def remove_buffer(self):
|
||||
return False
|
||||
|
||||
def remove_item(self, item):
|
||||
f = self.buffer.list.get_selected()
|
||||
self.buffer.list.remove_item(item)
|
||||
self.buffer.list.select_item(f)
|
||||
|
||||
def bind_events(self):
|
||||
pass
|
||||
|
||||
def get_object(self):
|
||||
return self.buffer
|
||||
|
||||
def get_message(self):
|
||||
pass
|
||||
|
||||
def set_list_position(self, reversed=False):
|
||||
if reversed == False:
|
||||
self.buffer.list.select_item(-1)
|
||||
else:
|
||||
self.buffer.list.select_item(0)
|
||||
|
||||
def reply(self):
|
||||
pass
|
||||
|
||||
def send_message(self):
|
||||
pass
|
||||
|
||||
def share_item(self):
|
||||
pass
|
||||
|
||||
def destroy_status(self):
|
||||
pass
|
||||
|
||||
def post_status(self, *args, **kwargs):
|
||||
pass
|
||||
|
||||
def save_positions(self):
|
||||
try:
|
||||
self.session.db[self.name+"_pos"]=self.buffer.list.get_selected()
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
class accountPanel(buffer):
|
||||
def __init__(self, parent, name, account, account_id):
|
||||
super(accountPanel, self).__init__(parent, None, name)
|
||||
log.debug("Initializing buffer %s, account %s" % (name, account,))
|
||||
self.buffer = buffers.accountPanel(parent, name)
|
||||
self.type = self.buffer.type
|
||||
self.compose_function = None
|
||||
self.session = None
|
||||
self.needs_init = False
|
||||
self.account = account
|
||||
self.buffer.account = account
|
||||
self.name = name
|
||||
self.account_id = account_id
|
||||
|
||||
def setup_account(self):
|
||||
widgetUtils.connect_event(self.buffer, widgetUtils.CHECKBOX, self.autostart, menuitem=self.buffer.autostart_account)
|
||||
if self.account_id in config.app["sessions"]["ignored_sessions"]:
|
||||
self.buffer.change_autostart(False)
|
||||
else:
|
||||
self.buffer.change_autostart(True)
|
||||
if not hasattr(self, "logged"):
|
||||
self.buffer.change_login(login=False)
|
||||
widgetUtils.connect_event(self.buffer.login, widgetUtils.BUTTON_PRESSED, self.logout)
|
||||
else:
|
||||
self.buffer.change_login(login=True)
|
||||
widgetUtils.connect_event(self.buffer.login, widgetUtils.BUTTON_PRESSED, self.login)
|
||||
|
||||
def login(self, *args, **kwargs):
|
||||
del self.logged
|
||||
self.setup_account()
|
||||
pub.sendMessage("login", session_id=self.account_id)
|
||||
|
||||
def logout(self, *args, **kwargs):
|
||||
self.logged = False
|
||||
self.setup_account()
|
||||
pub.sendMessage("logout", session_id=self.account_id)
|
||||
|
||||
def autostart(self, *args, **kwargs):
|
||||
if self.account_id in config.app["sessions"]["ignored_sessions"]:
|
||||
self.buffer.change_autostart(True)
|
||||
config.app["sessions"]["ignored_sessions"].remove(self.account_id)
|
||||
else:
|
||||
self.buffer.change_autostart(False)
|
||||
config.app["sessions"]["ignored_sessions"].append(self.account_id)
|
||||
config.app.write()
|
||||
|
||||
class emptyPanel(buffer):
|
||||
def __init__(self, parent, name, account):
|
||||
super(emptyPanel, self).__init__(parent=parent)
|
||||
log.debug("Initializing buffer %s, account %s" % (name, account,))
|
||||
self.buffer = buffers.emptyPanel(parent, name)
|
||||
self.type = self.buffer.type
|
||||
self.compose_function = None
|
||||
self.account = account
|
||||
self.buffer.account = account
|
||||
self.name = name
|
||||
self.session = None
|
||||
self.needs_init = True
|
File diff suppressed because it is too large
Load Diff
@@ -14,6 +14,9 @@ class filter(object):
|
||||
contains = self.dialog.get("contains")
|
||||
term = self.dialog.get("term")
|
||||
regexp = self.dialog.get("regexp")
|
||||
allow_rts = self.dialog.get("allow_rts")
|
||||
allow_quotes = self.dialog.get("allow_quotes")
|
||||
allow_replies = self.dialog.get("allow_replies")
|
||||
load_language = self.dialog.get("load_language")
|
||||
ignore_language = self.dialog.get("ignore_language")
|
||||
lang_option = None
|
||||
@@ -26,7 +29,7 @@ class filter(object):
|
||||
for i in application.supported_languages:
|
||||
if i["name"] in langs:
|
||||
langcodes.append(i["code"])
|
||||
d = dict(in_buffer=self.buffer.name, word=term, regexp=regexp, in_lang=lang_option, languages=langcodes, if_word_exists=contains)
|
||||
d = dict(in_buffer=self.buffer.name, word=term, regexp=regexp, in_lang=lang_option, languages=langcodes, if_word_exists=contains, allow_rts=allow_rts, allow_quotes=allow_quotes, allow_replies=allow_replies)
|
||||
if self.buffer.session.settings["filters"].has_key(title):
|
||||
return commonMessageDialogs.existing_filter()
|
||||
self.buffer.session.settings["filters"][title] = d
|
||||
@@ -49,7 +52,6 @@ class filterManager(object):
|
||||
def insert_filters(self, filters):
|
||||
self.dialog.filters.clear()
|
||||
for f in filters.keys():
|
||||
# ToDo: Add titles to filters.
|
||||
filterName = f
|
||||
buffer = filters[f]["in_buffer"]
|
||||
if filters[f]["if_word_exists"] == "True" and filters[f]["word"] != "":
|
||||
|
@@ -3,7 +3,7 @@ import widgetUtils
|
||||
import output
|
||||
from wxUI.dialogs import lists
|
||||
from twython import TwythonError
|
||||
from twitter import compose, utils
|
||||
from sessions.twitter import compose, utils
|
||||
from pubsub import pub
|
||||
|
||||
class listsController(object):
|
||||
@@ -29,7 +29,7 @@ class listsController(object):
|
||||
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)
|
||||
self.lists = self.session.twitter.show_lists(reverse=True, screen_name=user)
|
||||
return [compose.compose_list(item) for item in self.lists]
|
||||
|
||||
def create_list(self, *args, **kwargs):
|
||||
@@ -43,7 +43,7 @@ class listsController(object):
|
||||
else:
|
||||
mode = "private"
|
||||
try:
|
||||
new_list = self.session.twitter.twitter.create_list(name=name, description=description, mode=mode)
|
||||
new_list = self.session.twitter.create_list(name=name, description=description, mode=mode)
|
||||
self.session.db["lists"].append(new_list)
|
||||
self.dialog.lista.insert_item(False, *compose.compose_list(new_list))
|
||||
except TwythonError as e:
|
||||
@@ -63,7 +63,7 @@ class listsController(object):
|
||||
else:
|
||||
mode = "private"
|
||||
try:
|
||||
self.session.twitter.twitter.update_list(list_id=list["id"], name=name, description=description, mode=mode)
|
||||
self.session.twitter.update_list(list_id=list["id"], name=name, description=description, mode=mode)
|
||||
self.session.get_lists()
|
||||
self.dialog.populate_list(self.get_all_lists(), True)
|
||||
except TwythonError as e:
|
||||
@@ -75,7 +75,7 @@ class listsController(object):
|
||||
list = self.session.db["lists"][self.dialog.get_item()]["id"]
|
||||
if lists.remove_list() == widgetUtils.YES:
|
||||
try:
|
||||
self.session.twitter.twitter.delete_list(list_id=list)
|
||||
self.session.twitter.delete_list(list_id=list)
|
||||
self.session.db["lists"].pop(self.dialog.get_item())
|
||||
self.dialog.lista.remove_item(self.dialog.get_item())
|
||||
except TwythonError as e:
|
||||
@@ -90,7 +90,7 @@ class listsController(object):
|
||||
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)
|
||||
list = self.session.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:
|
||||
@@ -100,7 +100,7 @@ class listsController(object):
|
||||
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)
|
||||
list = self.session.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))
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -2,19 +2,24 @@
|
||||
import re
|
||||
import platform
|
||||
import attach
|
||||
import arrow
|
||||
import languageHandler
|
||||
system = platform.system()
|
||||
import widgetUtils
|
||||
import output
|
||||
import url_shortener
|
||||
import sound
|
||||
import config
|
||||
from pubsub import pub
|
||||
if system == "Windows":
|
||||
from wxUI.dialogs import message, urlList
|
||||
from wxUI import commonMessageDialogs
|
||||
|
||||
from extra import translator, SpellChecker, autocompletionUsers
|
||||
from extra.AudioUploader import audioUploader
|
||||
elif system == "Linux":
|
||||
from gtkUI.dialogs import message
|
||||
from twitter import utils
|
||||
from sessions.twitter import utils
|
||||
|
||||
class basicTweet(object):
|
||||
""" This class handles the tweet main features. Other classes should derive from this class."""
|
||||
@@ -26,14 +31,14 @@ class basicTweet(object):
|
||||
self.message = getattr(message, messageType)(title, caption, text, *args, **kwargs)
|
||||
widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck)
|
||||
widgetUtils.connect_event(self.message.attach, widgetUtils.BUTTON_PRESSED, self.attach)
|
||||
# if system == "Windows":
|
||||
# if messageType != "dm":
|
||||
widgetUtils.connect_event(self.message.text, widgetUtils.ENTERED_TEXT, self.text_processor)
|
||||
widgetUtils.connect_event(self.message.shortenButton, widgetUtils.BUTTON_PRESSED, self.shorten)
|
||||
widgetUtils.connect_event(self.message.unshortenButton, widgetUtils.BUTTON_PRESSED, self.unshorten)
|
||||
widgetUtils.connect_event(self.message.translateButton, widgetUtils.BUTTON_PRESSED, self.translate)
|
||||
if hasattr(self.message, "long_tweet"):
|
||||
widgetUtils.connect_event(self.message.long_tweet, widgetUtils.CHECKBOX, self.text_processor)
|
||||
if config.app["app-settings"]["remember_mention_and_longtweet"]:
|
||||
self.message.long_tweet.SetValue(config.app["app-settings"]["longtweet"])
|
||||
self.attachments = []
|
||||
|
||||
def translate(self, event=None):
|
||||
@@ -114,11 +119,12 @@ class basicTweet(object):
|
||||
url = dlg.uploaderFunction.get_url()
|
||||
pub.unsubscribe(dlg.uploaderDialog.update, "uploading")
|
||||
dlg.uploaderDialog.destroy()
|
||||
if url != 0:
|
||||
if "sndup.net/" in url:
|
||||
self.message.set_text(self.message.get_text()+url+" #audio")
|
||||
self.text_processor()
|
||||
else:
|
||||
output.speak(_(u"Unable to upload the audio"))
|
||||
commonMessageDialogs.common_error(url)
|
||||
|
||||
dlg.cleanup()
|
||||
dlg = audioUploader.audioUploader(self.session.settings, completed_callback)
|
||||
self.message.text_focus()
|
||||
@@ -148,7 +154,8 @@ class reply(tweet):
|
||||
if len(users) > 0:
|
||||
widgetUtils.connect_event(self.message.mentionAll, widgetUtils.CHECKBOX, self.mention_all)
|
||||
self.message.enable_button("mentionAll")
|
||||
self.message.set("mentionAll", True)
|
||||
if config.app["app-settings"]["remember_mention_and_longtweet"]:
|
||||
self.message.mentionAll.SetValue(config.app["app-settings"]["mention_all"])
|
||||
self.mention_all()
|
||||
self.message.set_cursor_at_end()
|
||||
self.text_processor()
|
||||
@@ -188,12 +195,13 @@ class dm(basicTweet):
|
||||
c.show_menu("dm")
|
||||
|
||||
class viewTweet(basicTweet):
|
||||
def __init__(self, tweet, tweetList, is_tweet=True):
|
||||
def __init__(self, tweet, tweetList, is_tweet=True, utc_offset=0, date=""):
|
||||
""" This represents a tweet displayer. However it could be used for showing something wich is not a tweet, like a direct message or an event.
|
||||
param tweet: A dictionary that represents a full tweet or a string for non-tweets.
|
||||
param tweetList: If is_tweet is set to True, this could be a list of quoted tweets.
|
||||
param is_tweet: True or false, depending wether the passed object is a tweet or not."""
|
||||
if is_tweet == True:
|
||||
self.title = _(u"Tweet")
|
||||
image_description = []
|
||||
text = ""
|
||||
for i in xrange(0, len(tweetList)):
|
||||
@@ -223,6 +231,8 @@ class viewTweet(basicTweet):
|
||||
favs_count = str(tweet["favorite_count"])
|
||||
# Gets the client from where this tweet was made.
|
||||
source = str(re.sub(r"(?s)<.*?>", "", tweet["source"].encode("utf-8")))
|
||||
original_date = arrow.get(tweet["created_at"], "ddd MMM DD H:m:s Z YYYY", locale="en")
|
||||
date = original_date.replace(seconds=utc_offset).format(_(u"MMM D, YYYY. H:m"), locale=languageHandler.getLanguage())
|
||||
if text == "":
|
||||
if tweet.has_key("message"):
|
||||
value = "message"
|
||||
@@ -244,12 +254,13 @@ class viewTweet(basicTweet):
|
||||
for z in tweet["retweeted_status"]["extended_entities"]["media"]:
|
||||
if z.has_key("ext_alt_text") and z["ext_alt_text"] != None:
|
||||
image_description.append(z["ext_alt_text"])
|
||||
self.message = message.viewTweet(text, rt_count, favs_count, source.decode("utf-8"))
|
||||
self.message = message.viewTweet(text, rt_count, favs_count, source.decode("utf-8"), date)
|
||||
self.message.set_title(len(text))
|
||||
[self.message.set_image_description(i) for i in image_description]
|
||||
else:
|
||||
self.title = _(u"View item")
|
||||
text = tweet
|
||||
self.message = message.viewNonTweet(text)
|
||||
self.message = message.viewNonTweet(text, date)
|
||||
widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck)
|
||||
widgetUtils.connect_event(self.message.translateButton, widgetUtils.BUTTON_PRESSED, self.translate)
|
||||
if self.contain_urls() == True:
|
||||
|
@@ -61,13 +61,16 @@ class globalSettingsController(object):
|
||||
else:
|
||||
self.dialog.general.autostart.Enable(False)
|
||||
self.dialog.set_value("general", "ask_at_exit", config.app["app-settings"]["ask_at_exit"])
|
||||
self.dialog.set_value("general", "no_streaming", config.app["app-settings"]["no_streaming"])
|
||||
self.dialog.set_value("general", "play_ready_sound", config.app["app-settings"]["play_ready_sound"])
|
||||
self.dialog.set_value("general", "speak_ready_msg", config.app["app-settings"]["speak_ready_msg"])
|
||||
self.dialog.set_value("general", "handle_longtweets", config.app["app-settings"]["handle_longtweets"])
|
||||
self.dialog.set_value("general", "use_invisible_shorcuts", config.app["app-settings"]["use_invisible_keyboard_shorcuts"])
|
||||
self.dialog.set_value("general", "disable_sapi5", config.app["app-settings"]["voice_enabled"])
|
||||
self.dialog.set_value("general", "hide_gui", config.app["app-settings"]["hide_gui"])
|
||||
self.dialog.set_value("general", "update_period", config.app["app-settings"]["update_period"])
|
||||
self.dialog.set_value("general", "check_for_updates", config.app["app-settings"]["check_for_updates"])
|
||||
self.dialog.set_value("general", "remember_mention_and_longtweet", config.app["app-settings"]["remember_mention_and_longtweet"])
|
||||
proxyTypes=config.proxyTypes
|
||||
self.dialog.create_proxy([_(u"Direct connection")]+proxyTypes)
|
||||
if config.app["proxy"]["type"] not in proxyTypes:
|
||||
@@ -92,13 +95,18 @@ class globalSettingsController(object):
|
||||
kmFile = open(paths.config_path("keymap.keymap"), "w")
|
||||
kmFile.close()
|
||||
self.needs_restart = True
|
||||
|
||||
if config.app["app-settings"]["autostart"] != self.dialog.get_value("general", "autostart") and paths.mode == "installed":
|
||||
config.app["app-settings"]["autostart"] = self.dialog.get_value("general", "autostart")
|
||||
autostart_windows.setAutoStart(application.name, enable=self.dialog.get_value("general", "autostart"))
|
||||
if config.app["app-settings"]["use_invisible_keyboard_shorcuts"] != self.dialog.get_value("general", "use_invisible_shorcuts"):
|
||||
config.app["app-settings"]["use_invisible_keyboard_shorcuts"] = self.dialog.get_value("general", "use_invisible_shorcuts")
|
||||
pub.sendMessage("invisible-shorcuts-changed", registered=self.dialog.get_value("general", "use_invisible_shorcuts"))
|
||||
if config.app["app-settings"]["no_streaming"] != self.dialog.get_value("general", "no_streaming"):
|
||||
config.app["app-settings"]["no_streaming"] = self.dialog.get_value("general", "no_streaming")
|
||||
self.needs_restart = True
|
||||
if config.app["app-settings"]["update_period"] != self.dialog.get_value("general", "update_period"):
|
||||
config.app["app-settings"]["update_period"] = self.dialog.get_value("general", "update_period")
|
||||
self.needs_restart = True
|
||||
config.app["app-settings"]["voice_enabled"] = self.dialog.get_value("general", "disable_sapi5")
|
||||
config.app["app-settings"]["hide_gui"] = self.dialog.get_value("general", "hide_gui")
|
||||
config.app["app-settings"]["ask_at_exit"] = self.dialog.get_value("general", "ask_at_exit")
|
||||
@@ -106,6 +114,7 @@ class globalSettingsController(object):
|
||||
config.app["app-settings"]["play_ready_sound"] = self.dialog.get_value("general", "play_ready_sound")
|
||||
config.app["app-settings"]["speak_ready_msg"] = self.dialog.get_value("general", "speak_ready_msg")
|
||||
config.app["app-settings"]["check_for_updates"] = self.dialog.get_value("general", "check_for_updates")
|
||||
config.app["app-settings"]["remember_mention_and_longtweet"] = self.dialog.get_value("general", "remember_mention_and_longtweet")
|
||||
if config.app["proxy"]["type"]!=self.dialog.get_value("proxy", "type") or config.app["proxy"]["server"] != self.dialog.get_value("proxy", "server") or config.app["proxy"]["port"] != self.dialog.get_value("proxy", "port") or config.app["proxy"]["user"] != self.dialog.get_value("proxy", "user") or config.app["proxy"]["password"] != self.dialog.get_value("proxy", "password"):
|
||||
if self.is_started == True:
|
||||
self.needs_restart = True
|
||||
@@ -129,7 +138,6 @@ class accountSettingsController(globalSettingsController):
|
||||
widgetUtils.connect_event(self.dialog.general.au, widgetUtils.BUTTON_PRESSED, self.manage_autocomplete)
|
||||
self.dialog.set_value("general", "relative_time", self.config["general"]["relative_times"])
|
||||
self.dialog.set_value("general", "show_screen_names", self.config["general"]["show_screen_names"])
|
||||
self.dialog.set_value("general", "apiCalls", self.config["general"]["max_api_calls"])
|
||||
self.dialog.set_value("general", "itemsPerApiCall", self.config["general"]["max_tweets_per_call"])
|
||||
self.dialog.set_value("general", "reverse_timelines", self.config["general"]["reverse_timelines"])
|
||||
rt = self.config["general"]["retweet_mode"]
|
||||
@@ -140,6 +148,9 @@ class accountSettingsController(globalSettingsController):
|
||||
else:
|
||||
self.dialog.set_value("general", "retweet_mode", _(u"Retweet with comments"))
|
||||
self.dialog.set_value("general", "persist_size", str(self.config["general"]["persist_size"]))
|
||||
self.dialog.create_reporting()
|
||||
self.dialog.set_value("reporting", "speech_reporting", self.config["reporting"]["speech_reporting"])
|
||||
self.dialog.set_value("reporting", "braille_reporting", self.config["reporting"]["braille_reporting"])
|
||||
self.dialog.create_other_buffers()
|
||||
buffer_values = self.get_buffers_list()
|
||||
self.dialog.buffers.insert_buffers(buffer_values)
|
||||
@@ -178,7 +189,6 @@ class accountSettingsController(globalSettingsController):
|
||||
self.needs_restart = True
|
||||
self.config["general"]["relative_times"] = self.dialog.get_value("general", "relative_time")
|
||||
self.config["general"]["show_screen_names"] = self.dialog.get_value("general", "show_screen_names")
|
||||
self.config["general"]["max_api_calls"] = self.dialog.get_value("general", "apiCalls")
|
||||
self.config["general"]["max_tweets_per_call"] = self.dialog.get_value("general", "itemsPerApiCall")
|
||||
if self.config["general"]["persist_size"] != self.dialog.get_value("general", "persist_size"):
|
||||
if self.dialog.get_value("general", "persist_size") == '':
|
||||
@@ -204,6 +214,8 @@ class accountSettingsController(globalSettingsController):
|
||||
if set(self.config["general"]["buffer_order"]) != set(buffers_list) or buffers_list != self.config["general"]["buffer_order"]:
|
||||
self.needs_restart = True
|
||||
self.config["general"]["buffer_order"] = buffers_list
|
||||
self.config["reporting"]["speech_reporting"] = self.dialog.get_value("reporting", "speech_reporting")
|
||||
self.config["reporting"]["braille_reporting"] = self.dialog.get_value("reporting", "braille_reporting")
|
||||
self.config["mysc"]["ocr_language"] = OCRSpace.OcrLangs[self.dialog.extras.ocr_lang.GetSelection()]
|
||||
# if self.config["other_buffers"]["show_followers"] != self.dialog.get_value("buffers", "followers"):
|
||||
# self.config["other_buffers"]["show_followers"] = self.dialog.get_value("buffers", "followers")
|
||||
@@ -277,7 +289,6 @@ class accountSettingsController(globalSettingsController):
|
||||
all_buffers['friends']=_(u"Friends")
|
||||
all_buffers['blocks']=_(u"Blocked users")
|
||||
all_buffers['muted']=_(u"Muted users")
|
||||
all_buffers['events']=_(u"Events")
|
||||
list_buffers = []
|
||||
hidden_buffers=[]
|
||||
for i in all_buffers.keys():
|
||||
@@ -291,27 +302,4 @@ class accountSettingsController(globalSettingsController):
|
||||
def toggle_buffer_active(self, ev):
|
||||
change = self.dialog.buffers.get_event(ev)
|
||||
if change == True:
|
||||
self.dialog.buffers.change_selected_item()
|
||||
|
||||
# def manage_pocket(self, *args, **kwargs):
|
||||
# if self.dialog.services.get_pocket_status() == _(u"Connect your Pocket account"):
|
||||
# self.connect_pocket()
|
||||
# else:
|
||||
# self.disconnect_pocket()
|
||||
|
||||
# def connect_pocket(self):
|
||||
# dlg = self.dialog.services.show_pocket_dialog()
|
||||
# if dlg == widgetUtils.YES:
|
||||
# request_token = pocket.Pocket.get_request_token(consumer_key=keys.keyring.get("pocket_consumer_key"), redirect_uri="http://127.0.0.1:8080")
|
||||
# auth_url = pocket.Pocket.get_auth_url(code=request_token, redirect_uri="http://127.0.0.1:8080")
|
||||
# webbrowser.open_new_tab(auth_url)
|
||||
# httpd = BaseHTTPServer.HTTPServer(('127.0.0.1', 8080), authorisationHandler.handler)
|
||||
# while authorisationHandler.logged == False:
|
||||
# httpd.handle_request()
|
||||
# user_credentials = pocket.Pocket.get_credentials(consumer_key=keys.keyring.get("pocket_consumer_key"), code=request_token)
|
||||
# self.dialog.services.set_pocket(True)
|
||||
# self.config["services"]["pocket_access_token"] = user_credentials["access_token"]
|
||||
|
||||
def disconnect_dropbox(self):
|
||||
self.config["services"]["pocket_access_token"] = ""
|
||||
self.dialog.services.set_pocket(False)
|
||||
self.dialog.buffers.change_selected_item()
|
@@ -8,7 +8,7 @@ class trendingTopicsController(object):
|
||||
self.countries = {}
|
||||
self.cities = {}
|
||||
self.dialog = trends.trendingTopicsDialog()
|
||||
self.information = session.twitter.twitter.get_available_trends()
|
||||
self.information = session.twitter.get_available_trends()
|
||||
self.split_information()
|
||||
widgetUtils.connect_event(self.dialog.country, widgetUtils.RADIOBUTTON, self.get_places)
|
||||
widgetUtils.connect_event(self.dialog.city, widgetUtils.RADIOBUTTON, self.get_places)
|
||||
|
@@ -41,9 +41,9 @@ class profileController(object):
|
||||
self.do_update()
|
||||
|
||||
def get_data(self, screen_name):
|
||||
self.data = self.session.twitter.twitter.show_user(screen_name=screen_name)
|
||||
self.data = self.session.twitter.show_user(screen_name=screen_name)
|
||||
if screen_name != self.session.db["user_name"]:
|
||||
self.friendship_status = self.session.twitter.twitter.show_friendship(source_screen_name=self.session.db["user_name"], target_screen_name=screen_name)
|
||||
self.friendship_status = self.session.twitter.show_friendship(source_screen_name=self.session.db["user_name"], target_screen_name=screen_name)
|
||||
|
||||
def fill_profile_fields(self):
|
||||
self.dialog.set_name(self.data["name"])
|
||||
@@ -81,11 +81,11 @@ class profileController(object):
|
||||
url = self.dialog.get("url")
|
||||
if self.file != None:
|
||||
try:
|
||||
self.session.twitter.twitter.update_profile_image(image=self.file)
|
||||
self.session.twitter.update_profile_image(image=self.file)
|
||||
except TwythonError as e:
|
||||
output.speak(u"Error %s. %s" % (e.error_code, e.msg))
|
||||
try:
|
||||
self.session.twitter.twitter.update_profile(name=name, description=description, location=location, url=url)
|
||||
self.session.twitter.update_profile(name=name, description=description, location=location, url=url)
|
||||
except TwythonError as e:
|
||||
output.speak(u"Error %s. %s" % (e.error_code, e.msg))
|
||||
|
||||
|
@@ -29,43 +29,43 @@ class userActionsController(object):
|
||||
|
||||
def follow(self, user):
|
||||
try:
|
||||
self.session.twitter.twitter.create_friendship(screen_name=user )
|
||||
self.session.twitter.create_friendship(screen_name=user )
|
||||
except TwythonError as err:
|
||||
output.speak("Error %s: %s" % (err.error_code, err.msg), True)
|
||||
|
||||
def unfollow(self, user):
|
||||
try:
|
||||
id = self.session.twitter.twitter.destroy_friendship(screen_name=user )
|
||||
id = self.session.twitter.destroy_friendship(screen_name=user )
|
||||
except TwythonError as err:
|
||||
output.speak("Error %s: %s" % (err.error_code, err.msg), True)
|
||||
|
||||
def mute(self, user):
|
||||
try:
|
||||
id = self.session.twitter.twitter.create_mute(screen_name=user )
|
||||
id = self.session.twitter.create_mute(screen_name=user )
|
||||
except TwythonError as err:
|
||||
output.speak("Error %s: %s" % (err.error_code, err.msg), True)
|
||||
|
||||
def unmute(self, user):
|
||||
try:
|
||||
id = self.session.twitter.twitter.destroy_mute(screen_name=user )
|
||||
id = self.session.twitter.destroy_mute(screen_name=user )
|
||||
except TwythonError as err:
|
||||
output.speak("Error %s: %s" % (err.error_code, err.msg), True)
|
||||
|
||||
def report(self, user):
|
||||
try:
|
||||
id = self.session.twitter.twitter.report_spam(screen_name=user )
|
||||
id = self.session.twitter.report_spam(screen_name=user )
|
||||
except TwythonError as err:
|
||||
output.speak("Error %s: %s" % (err.error_code, err.msg), True)
|
||||
|
||||
def block(self, user):
|
||||
try:
|
||||
id = self.session.twitter.twitter.create_block(screen_name=user )
|
||||
id = self.session.twitter.create_block(screen_name=user )
|
||||
except TwythonError as err:
|
||||
output.speak("Error %s: %s" % (err.error_code, err.msg), True)
|
||||
|
||||
def unblock(self, user):
|
||||
try:
|
||||
id = self.session.twitter.twitter.destroy_block(screen_name=user )
|
||||
id = self.session.twitter.destroy_block(screen_name=user )
|
||||
except TwythonError as err:
|
||||
output.speak("Error %s: %s" % (err.error_code, err.msg), True)
|
||||
|
||||
|
@@ -52,7 +52,7 @@ class audioUploader(object):
|
||||
self.uploaderDialog = wx_transfer_dialogs.UploadDialog(self.file)
|
||||
output.speak(_(u"Attaching..."))
|
||||
if self.dialog.get("services") == "SNDUp":
|
||||
base_url = "http://sndup.net/post.php"
|
||||
base_url = "https://sndup.net/post.php"
|
||||
if len(self.config["sound"]["sndup_api_key"]) > 0:
|
||||
url = base_url + '?apikey=' + self.config['sound']['sndup_api_key']
|
||||
else:
|
||||
|
@@ -69,5 +69,15 @@ class Upload(object):
|
||||
self.completed_callback(self.obj)
|
||||
if hasattr(self,'fin') and callable(self.fin.close):
|
||||
self.fin.close()
|
||||
|
||||
def get_url(self):
|
||||
return self.response.json()['url']
|
||||
try:
|
||||
data = self.response.json()
|
||||
except:
|
||||
return _("Error in file upload: {0}").format(self.data.content,)
|
||||
if data.has_key("url") and data["url"] != "0":
|
||||
return data["url"]
|
||||
elif data.has_key("error") and data["error"] != "0":
|
||||
return data["error"]
|
||||
else:
|
||||
return _("Error in file upload: {0}").format(self.data.content,)
|
@@ -6,7 +6,7 @@ import widgetUtils
|
||||
class UploadDialog(widgetUtils.BaseDialog):
|
||||
|
||||
def __init__(self, filename, *args, **kwargs):
|
||||
super(UploadDialog, self).__init__(parent=None, id=wx.NewId(), *args, **kwargs)
|
||||
super(UploadDialog, self).__init__(parent=None, id=wx.ID_ANY, *args, **kwargs)
|
||||
self.pane = wx.Panel(self)
|
||||
self.progress_bar = wx.Gauge(parent=self.pane)
|
||||
fileBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
|
@@ -1,4 +1,5 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import os
|
||||
import logging
|
||||
import wx_ui
|
||||
import widgetUtils
|
||||
@@ -16,6 +17,12 @@ log = logging.getLogger("extra.SpellChecker.spellChecker")
|
||||
class spellChecker(object):
|
||||
def __init__(self, text, dictionary):
|
||||
super(spellChecker, self).__init__()
|
||||
# Set Dictionary path if not set in a previous call to this method.
|
||||
# Dictionary path will be located in user config, see https://github.com/manuelcortez/twblue/issues/208
|
||||
dict_path = enchant.get_param("enchant.myspell.dictionary.path")
|
||||
if dict_path == None:
|
||||
enchant.set_param("enchant.myspell.dictionary.path", os.path.join(paths.config_path(), "dicts"))
|
||||
log.debug("Dictionary path set to %s" % (os.path.join(paths.config_path(), "dicts"),))
|
||||
log.debug("Creating the SpellChecker object. Dictionary: %s" % (dictionary,))
|
||||
self.active = True
|
||||
try:
|
||||
|
@@ -39,11 +39,11 @@ class spellCheckerDialog(wx.Dialog):
|
||||
suggestionsBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
suggestionsBox.Add(suggest, 0, wx.ALL, 5)
|
||||
suggestionsBox.Add(self.suggestions, 0, wx.ALL, 5)
|
||||
self.ignore = wx.Button(panel, -1, _(u"Ignore"))
|
||||
self.ignoreAll = wx.Button(panel, -1, _(u"Ignore all"))
|
||||
self.replace = wx.Button(panel, -1, _(u"Replace"))
|
||||
self.replaceAll = wx.Button(panel, -1, _(u"Replace all"))
|
||||
self.add = wx.Button(panel, -1, _(u"Add to personal dictionary"))
|
||||
self.ignore = wx.Button(panel, -1, _(u"&Ignore"))
|
||||
self.ignoreAll = wx.Button(panel, -1, _(u"I&gnore all"))
|
||||
self.replace = wx.Button(panel, -1, _(u"&Replace"))
|
||||
self.replaceAll = wx.Button(panel, -1, _(u"R&eplace all"))
|
||||
self.add = wx.Button(panel, -1, _(u"&Add to personal dictionary"))
|
||||
close = wx.Button(panel, wx.ID_CANCEL)
|
||||
btnBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
btnBox.Add(self.ignore, 0, wx.ALL, 5)
|
||||
|
@@ -10,7 +10,7 @@ class menu(wx.Menu):
|
||||
|
||||
def append_options(self, options):
|
||||
for i in options:
|
||||
item = wx.MenuItem(self, wx.NewId(), "%s (@%s)" % (i[1], i[0]))
|
||||
item = wx.MenuItem(self, wx.ID_ANY, "%s (@%s)" % (i[1], i[0]))
|
||||
self.AppendItem(item)
|
||||
self.Bind(wx.EVT_MENU, lambda evt, temp=i[0]: self.select_text(evt, temp), item)
|
||||
|
||||
|
@@ -16,8 +16,7 @@ post_tweet = string(default="alt+win+n")
|
||||
post_reply = string(default="control+win+r")
|
||||
post_retweet = string(default="alt+win+shift+r")
|
||||
send_dm = string(default="alt+win+shift+d")
|
||||
add_to_favourites = string(default="control+alt+win+f")
|
||||
remove_from_favourites = string(default="alt+shift+win+f")
|
||||
toggle_like = string(default="control+alt+win+f")
|
||||
follow = string(default="alt+win+shift+s")
|
||||
user_details = string(default="alt+win+shift+n")
|
||||
view_item = string(default="alt+win+v")
|
||||
@@ -46,7 +45,7 @@ search = string(default="alt+win+-")
|
||||
edit_keystrokes = string(default="alt+win+k")
|
||||
view_user_lists = string(default="alt+win+l")
|
||||
get_more_items = string(default="alt+win+pageup")
|
||||
reverse_geocode = string(default="alt+win+g")
|
||||
reverse_geocode = string(default="control+win+g")
|
||||
view_reverse_geocode = string(default="alt+win+shift+g")
|
||||
get_trending_topics = string(default="control+win+t")
|
||||
check_for_updates = string(default="alt+win+u")
|
||||
|
@@ -12,6 +12,7 @@ actions = {
|
||||
"post_retweet": _(u"Retweet"),
|
||||
"send_dm": _(u"Send direct message"),
|
||||
"add_to_favourites": _(u"Like a tweet"),
|
||||
"toggle_like": _(u"Like/unlike a tweet"),
|
||||
"remove_from_favourites": _(u"Unlike a tweet"),
|
||||
"follow": _(u"Open the user actions dialogue"),
|
||||
"user_details": _(u"See user details"),
|
||||
@@ -49,6 +50,7 @@ actions = {
|
||||
"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"),
|
||||
"list_manager": _(u"Opens the list manager"),
|
||||
"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."),
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
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
Reference in New Issue
Block a user