Compare commits

..

24 Commits
v0.85 ... v0.87

Author SHA1 Message Date
Jose Manuel Delicado
12f47b85af Updated version to 0.87 2016-10-04 22:06:24 +02:00
30c0a8249e Removed an unneeded file in the romanian translation 2016-10-04 14:52:32 -05:00
62e51ad14b Updated translations 2016-10-04 14:49:55 -05:00
d076ed1f56 Fixed an exception where mention to all checkbox was not being shown 2016-10-04 09:35:18 -05:00
9bbe325517 Mention all status (enabled/disabled) will be saved in config 2016-10-04 03:55:36 -05:00
6f5ef6d3f1 Fixed reply to single user in tweets with multiple users 2016-10-04 03:37:12 -05:00
378d277a98 Fixed some bugs related to extended tweets 2016-10-03 22:54:54 -05:00
Jose Manuel Delicado
2fdbcbc152 Updated translation templates 2016-10-02 21:17:14 +02:00
Jose Manuel Delicado
ef7ba0fe40 Updated Windows 10 keymap. The authorization message returned by the webbrowser when authorizing a new account now is translatable 2016-10-02 20:46:27 +02:00
Jose Manuel Delicado
3c5de10fe6 pa.c/appinfo.ini: updated format version to 3.4 2016-10-02 17:04:37 +02:00
Jose Manuel Delicado
230e0fa951 Removed unnecesary txt file from arabic translation folder 2016-10-02 16:47:54 +02:00
31192a5801 Updated locales 2016-10-02 09:40:45 -05:00
f1c974b4cf Reply to tweets will always be quotes 2016-10-02 09:11:02 -05:00
Jose Manuel Delicado
a9f9cb7969 Updated Windows dependencies. Updated readme 2016-10-02 15:20:14 +02:00
Jose Manuel Delicado
3a3393e03a Increased version number to 0.86 2016-10-02 15:14:32 +02:00
3a7c0c8f12 Added a fix for composing tweets in the new way twitter provides them 2016-10-02 07:54:23 -05:00
bd2460e42b Return false in twishort module if a long tweet has been deleted 2016-10-02 07:52:02 -05:00
Jose Manuel Delicado
2dd262cc83 TWBlue can now send long tweets directly to twishort. TWBlue server is nolonger used for this purpose 2016-10-02 14:35:54 +02:00
Jose Manuel Delicado
a2cf1ac8d0 Merge branch 'next-gen' of github.com:manuelcortez/twblue into next-gen 2016-10-02 10:38:40 +02:00
df345b5eec Initial support for extended tweets 2016-09-28 17:25:03 -05:00
Jose Manuel Delicado
b535c996d6 Merge branch 'next-gen' of github.com:manuelcortez/twblue into next-gen 2016-08-13 12:37:06 +02:00
b131f50d42 Updated windows 10 keymap 2016-08-12 23:40:56 -05:00
d729f86898 Merge pull request #87 from masonasons/next-gen
Adds functions to seek the playing audio forward or back 5 seconds.
2016-08-11 03:00:31 -05:00
Mason Armstrong
51ef047fb6 Adds functions to seek the playing audio forward or back 5 seconds. Adds function in audio_player to play/pause the audio but wouldn't work right when bound to the UI so not implemented. 2016-08-10 21:59:19 -05:00
61 changed files with 23375 additions and 36266 deletions

View File

@@ -73,7 +73,7 @@ setuptools installs a script, called easy_install. You can find it in the python
easy_install will automatically get the additional libraries that these packages need to work properly. easy_install will automatically get the additional libraries that these packages need to work properly.
Run the following command to quickly install and upgrade all packages and their dependencies: Run the following command to quickly install and upgrade all packages and their dependencies:
easy_install -Z --upgrade six configobj goslate markdown future suds requests oauthlib requests-oauthlib requests-toolbelt pypubsub pygeocoder arrow==0.6 python-dateutil futures markdown microsofttranslator winpaths easy_install -Z --upgrade six configobj goslate markdown future suds requests oauthlib requests-oauthlib requests-toolbelt pypubsub pygeocoder arrow==0.6 python-dateutil futures microsofttranslator winpaths
#### Other dependencies #### Other dependencies
@@ -92,7 +92,7 @@ This dependency has been built using pure basic 4.61. Its source can be found at
* [NSIS Unicode Portable,](http://portableapps.com/apps/development/nsis_portable) version 2.46.5 rev 3 * [NSIS Unicode Portable,](http://portableapps.com/apps/development/nsis_portable) version 2.46.5 rev 3
* [PortableApps.com Launcher,](http://portableapps.com/apps/development/portableapps.com_launcher) version 2.2 * [PortableApps.com Launcher,](http://portableapps.com/apps/development/portableapps.com_launcher) version 2.2
* [PortableApps.com Installer,](http://portableapps.com/apps/development/portableapps.com_installer) version 3.3.2 * [PortableApps.com Installer,](http://portableapps.com/apps/development/portableapps.com_installer) version 3.4.2
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, ... 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, ...

View File

@@ -2,7 +2,7 @@
name = 'TWBlue' name = 'TWBlue'
snapshot = False snapshot = False
if snapshot == False: if snapshot == False:
version = "0.85" version = "0.87"
update_url = 'http://twblue.es/updates/twblue_ngen.json' update_url = 'http://twblue.es/updates/twblue_ngen.json'
mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/stable.json' mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/stable.json'
else: else:

View File

@@ -5,16 +5,16 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: TW Blue documentation 0.46\n" "Project-Id-Version: TW Blue documentation 0.46\n"
"POT-Creation-Date: 2016-08-05 08:33+Hora de verano central (México)\n" "POT-Creation-Date: 2016-10-02 21:05+Hora de verano romance\n"
"PO-Revision-Date: 2016-08-06 14:20-0600\n" "PO-Revision-Date: 2016-10-03 11:52+0400\n"
"Last-Translator: Наталья Хедлунд <natalia.hedlund@gmail.com>\n" "Last-Translator: Valeria <luciana.lu3a@gmail.com>\n"
"Language-Team: \n" "Language-Team: \n"
"Language: ru\n" "Language: ru\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: pygettext.py 1.5\n" "Generated-By: pygettext.py 1.5\n"
"X-Generator: Poedit 1.6.11\n" "X-Generator: Poedit 1.5.7\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-SourceCharset: UTF-8\n"
@@ -29,7 +29,7 @@ msgstr "Документация для TWBlue - 0.84"
#: ../doc\strings.py:4 #: ../doc\strings.py:4
msgid "## Table of contents" msgid "## Table of contents"
msgstr "Содержание" msgstr "## Содержание"
#: ../doc\strings.py:5 #: ../doc\strings.py:5
msgid "[TOC]" msgid "[TOC]"
@@ -60,9 +60,8 @@ msgid ""
"If you want to see what has changed from the previous version, [read the " "If you want to see what has changed from the previous version, [read the "
"list of updates here.](changes.html)" "list of updates here.](changes.html)"
msgstr "" msgstr ""
"Если вы хоти\n" "Если вы хотите посмотреть какие изменения произошли с предыдущей версии, "
"те посмотреть какие изменения произошли с предыдущей версии, [читайте список " "[читайте список обновлений здесь.](changes.html) "
"обновлений здесь.](changes.html) "
#: ../doc\strings.py:9 #: ../doc\strings.py:9
msgid "## Introduction" msgid "## Introduction"
@@ -364,7 +363,8 @@ msgstr ""
#: ../doc\strings.py:43 #: ../doc\strings.py:43
msgid "* Favourites: here you will see all the tweets you have favourited." msgid "* Favourites: here you will see all the tweets you have favourited."
msgstr "" msgstr ""
"* Избранное: здесь вы увидите все твиты, которые вы добавили в Избранное." "* Понравившиеся: здесь вы увидите все твиты, которые вы отметили как "
"понравившиеся."
#: ../doc\strings.py:44 #: ../doc\strings.py:44
msgid "" msgid ""
@@ -426,8 +426,8 @@ msgid ""
"* User favourites: You can have the program create a buffer containing " "* User favourites: You can have the program create a buffer containing "
"tweets favourited by a particular user." "tweets favourited by a particular user."
msgstr "" msgstr ""
"* Избранное пользователя: вы можете создать буфер, в котором будут " "* Понравившиеся ленты: вы можете создать буфер, в котором будут содержаться "
"содержаться твиты, добавленные в Избранное определенным пользователем." "твиты, отмеченные определённым пользователем как понравившиеся."
#: ../doc\strings.py:51 #: ../doc\strings.py:51
msgid "" msgid ""
@@ -436,7 +436,7 @@ msgid ""
"updated every five minutes." "updated every five minutes."
msgstr "" msgstr ""
"* Трендовые (популярные) темы: в трендовом буфере отображаются десять " "* Трендовые (популярные) темы: в трендовом буфере отображаются десять "
"терминов, наиболее часто используемых в определенном регионе. Регионо может " "терминов, наиболее часто используемых в определенном регионе. Регионом может "
"быть как страна, так и город. Тренды обновляются каждые пять минут." "быть как страна, так и город. Тренды обновляются каждые пять минут."
#: ../doc\strings.py:52 #: ../doc\strings.py:52
@@ -450,8 +450,8 @@ msgid ""
"Windows + G in the invisible interface to retrieve it." "Windows + G in the invisible interface to retrieve it."
msgstr "" msgstr ""
"Если в твите содержится ссылка, ее можно открыть, нажав клавишу Ввод в окне " "Если в твите содержится ссылка, ее можно открыть, нажав клавишу Ввод в окне "
"программы, либо нажав сочетание клавиш КОнтрол + Виндовс + Ввод в невидимом " "программы, либо нажав сочетание клавиш Контрол + Виндовс + Ввод в невидимом "
"интерфейсе. Если присутстсвует аудио, его можно прослушать, нажав Контрол + " "интерфейсе. Если присутствует аудио, его можно прослушать, нажав Контрол + "
"Ввод или Контрол + Виндовс, + Альт, + Ввод соответственно. Если в твите " "Ввод или Контрол + Виндовс, + Альт, + Ввод соответственно. Если в твите "
"присутствует хэштег (метка) #audio, TWBlue проиграет звук, но аудио может " "присутствует хэштег (метка) #audio, TWBlue проиграет звук, но аудио может "
"содержаться и в твитах, не имеющих этой метки. Наконец, если в твите " "содержаться и в твитах, не имеющих этой метки. Наконец, если в твите "
@@ -601,9 +601,9 @@ msgstr ""
"пользователю, нажав эту кнопку. Откроется диалог, подобный окну создания " "пользователю, нажав эту кнопку. Откроется диалог, подобный окну создания "
"твита, но с уже заполненным именем пользователя (например, @user), и вам " "твита, но с уже заполненным именем пользователя (например, @user), и вам "
"останется только написать свое сообщение. Если твит относится к нескольким " "останется только написать свое сообщение. Если твит относится к нескольким "
"пользователям, можно нажать Шифт-Таб и активировать кнопку Упомянуть всех. " "пользователям, можно нажать Шифт-Таб и отметить флажок Упомянуть всех. Если "
"Если вы находитесь в списке друзей или читателей, эта кнопка будет " "вы находитесь в списке друзей или читателей, этот флажок будет называться "
"называться Упомянуть." "Упомянуть."
#: ../doc\strings.py:68 #: ../doc\strings.py:68
msgid "" msgid ""
@@ -615,10 +615,10 @@ msgid ""
msgstr "" msgstr ""
"* Личное сообщение: тоже, что и отправка твита, но это приватное сообщение, " "* Личное сообщение: тоже, что и отправка твита, но это приватное сообщение, "
"которое может быть просмотрено только тем пользователем, которому вы его " "которое может быть просмотрено только тем пользователем, которому вы его "
"отправляете. Чтобы посмотреть получателя, нажмите Шифт-таб. Если в твите, " "отправляете. Чтобы посмотреть получателя, нажмите Шифт-таб. Если в "
"который вы читаете, упомянуто несколько пользователей,стрелками вверх и вниз " "сообщении, которое вы читаете, упомянуто несколько пользователей, стрелками "
"можно выбрать получателя сообщения, или ввести имя вручную, без знака " "вверх и вниз можно выбрать получателя сообщения, или ввести имя вручную, без "
"собаки." "знака собаки."
#: ../doc\strings.py:69 #: ../doc\strings.py:69
msgid "" msgid ""
@@ -631,10 +631,10 @@ msgid ""
msgstr "" msgstr ""
"Учтите, что кнопки будут отображаться в зависимости от того, какие действия " "Учтите, что кнопки будут отображаться в зависимости от того, какие действия "
"доступны в просматриваемом списке. Например, в главной ленте, в упоминаниях, " "доступны в просматриваемом списке. Например, в главной ленте, в упоминаниях, "
"Отправленных, избраном и лентах пользователей вы увидите четыре кнопки, в то " "Отправленных, избранном и лентах пользователей вы увидите четыре кнопки, в "
"время как в списке личных сообщений будут отображаться только кнопки Личное " "то время как в списке личных сообщений будут отображаться только кнопки "
"сообщение и Твит, а в списках друзей и читающих будут доступны кнопки Личное " "Личное сообщение и Твит, а в списках друзей и читающих будут доступны кнопки "
"сообщение,Твит и Упомянуть." "Личное сообщение,Твит и Упомянуть."
#: ../doc\strings.py:70 #: ../doc\strings.py:70
msgid "#### Menus" msgid "#### Menus"
@@ -756,14 +756,15 @@ msgstr ""
#: ../doc\strings.py:84 #: ../doc\strings.py:84
msgid "* Add to favourites: marks the tweet you're viewing as a favourite." msgid "* Add to favourites: marks the tweet you're viewing as a favourite."
msgstr "* Добавить в Избранное:добавляет просматриваемый твит в Избранное." msgstr "* Нравится: отмечает просматриваемый вами твит как понравившийся."
#: ../doc\strings.py:85 #: ../doc\strings.py:85
msgid "" msgid ""
"* Remove from favourites: removes the tweet from your favourites, but not " "* Remove from favourites: removes the tweet from your favourites, but not "
"from Twitter." "from Twitter."
msgstr "" msgstr ""
"* Удалить из Избранного: удаляет твит из Избранного, но не из Твиттера." "* Не нравится: удаляет твит из списка понравившихся вам твитов, но не из "
"твиттера."
#: ../doc\strings.py:86 #: ../doc\strings.py:86
msgid "" msgid ""
@@ -779,7 +780,7 @@ msgstr ""
"личное сообщение, имя друга или читателя, находящееся в фокусе. Текст можно " "личное сообщение, имя друга или читателя, находящееся в фокусе. Текст можно "
"читать клавишами стрелок. Этот диалог похож на окно отправки твита, но без " "читать клавишами стрелок. Этот диалог похож на окно отправки твита, но без "
"возможности отправки, прикрепления вложений и автозаполнения. Однако, здесь " "возможности отправки, прикрепления вложений и автозаполнения. Однако, здесь "
"указано число ретвитов и добавлений в Избранное. Если вы находитесь в списке " "указано число ретвитов и отметок Нравится. Если вы находитесь в списке "
"читателей или друзей, будут доступны только поле для чтения информации, " "читателей или друзей, будут доступны только поле для чтения информации, "
"находящейся в фокусе, и кнопка Закрыть." "находящейся в фокусе, и кнопка Закрыть."
@@ -861,7 +862,7 @@ msgid ""
"both will be able to exchange direct messages. The muted user is not " "both will be able to exchange direct messages. The muted user is not "
"informed of this action." "informed of this action."
msgstr "" msgstr ""
" * Выключить: TWBlue не будет отображать в вашей главной ленте твиты " " * Отключить: TWBlue не будет отображать в вашей главной ленте твиты "
"пользователя; вы также не будете видеть упоминаний этого человека. Но вы " "пользователя; вы также не будете видеть упоминаний этого человека. Но вы "
"сможете обмениваться личными сообщениями. О том, что пользователь отключен, " "сможете обмениваться личными сообщениями. О том, что пользователь отключен, "
"он уведомлен не будет." "он уведомлен не будет."
@@ -954,8 +955,8 @@ msgid ""
"* View favourites: Opens a buffer where you can see the tweets which have " "* View favourites: Opens a buffer where you can see the tweets which have "
"been favourited by a particular user." "been favourited by a particular user."
msgstr "" msgstr ""
"* Просмотреть избранное: открывает буфер, в котором можно увидеть твиты, " "* Просмотреть Понравившиеся: открывает буфер, в котором можно увидеть твиты, "
"добавленные указанным пользователем в избранное." "отмеченные указанным пользователем как понравившиеся."
#: ../doc\strings.py:107 #: ../doc\strings.py:107
msgid "##### Buffer menu" msgid "##### Buffer menu"
@@ -971,7 +972,7 @@ msgid ""
"the \"OK\" button has been activated within the dialogue box. Remember this " "the \"OK\" button has been activated within the dialogue box. Remember this "
"kind of buffer will be updated every five minutes." "kind of buffer will be updated every five minutes."
msgstr "" msgstr ""
"* Новый буфер для трендов: открывает буфер ля самых популярных тем в мире, " "* Новый буфер для трендов: открывает буфер для самых популярных тем в мире, "
"стране или городе. Вы сможете выбрать из списка показывать ли популярные " "стране или городе. Вы сможете выбрать из списка показывать ли популярные "
"темы по стране, городу или со всего мира (эта опция находится в списке " "темы по стране, городу или со всего мира (эта опция находится в списке "
"Город), а затем выбрать нужный элемент. Буфер для трендов будет создан как " "Город), а затем выбрать нужный элемент. Буфер для трендов будет создан как "
@@ -983,7 +984,7 @@ msgid ""
"* Load previous items: This allows more items to be loaded for the specified " "* Load previous items: This allows more items to be loaded for the specified "
"buffer." "buffer."
msgstr "" msgstr ""
"* Загрузить предыдущие твиты: позволяет загрузить больше элементов в " "* Загрузить предыдущие элементы: позволяет загрузить больше элементов в "
"указанный буфер." "указанный буфер."
#: ../doc\strings.py:110 #: ../doc\strings.py:110
@@ -991,7 +992,7 @@ msgid ""
"* Mute: Mutes notifications of a particular buffer so you will not hear when " "* Mute: Mutes notifications of a particular buffer so you will not hear when "
"new tweets arrive." "new tweets arrive."
msgstr "" msgstr ""
"* Выключить звук: отключает уведомления для конкретного буфера, так что вы " "* Отключить: отключает звук и уведомления для конкретного буфера, так что вы "
"не будете слышать, когда приходят новые твиты." "не будете слышать, когда приходят новые твиты."
#: ../doc\strings.py:111 #: ../doc\strings.py:111
@@ -1001,8 +1002,8 @@ msgid ""
"could get rather chatty if there are a lot of incoming tweets." "could get rather chatty if there are a lot of incoming tweets."
msgstr "" msgstr ""
"* Авточтение: когда включено, программа экранного доступа или голос SAPI 5 " "* Авточтение: когда включено, программа экранного доступа или голос SAPI 5 "
"(если активен) будет читать текст входящих твитов. Обратите внимание, что " "(если активен) будет читать текст входящих твитов. Обратите внимание, что, "
"что, если приходит много твитов, программа может слишком много болтать." "если приходит много твитов, программа может слишком много болтать."
#: ../doc\strings.py:112 #: ../doc\strings.py:112
msgid "* Clear buffer: Deletes all items from the buffer." msgid "* Clear buffer: Deletes all items from the buffer."
@@ -1097,12 +1098,12 @@ msgstr ""
"Невидимый интерфейс, как следует из названия, не имеет графического окна и " "Невидимый интерфейс, как следует из названия, не имеет графического окна и "
"работает напрямую с программами экранного доступа, такими как JAWS для " "работает напрямую с программами экранного доступа, такими как JAWS для "
"Windows, NVDA и System Access. По умолчанию этот интерфейс отключен, но его " "Windows, NVDA и System Access. По умолчанию этот интерфейс отключен, но его "
"можно включить нажав Контрл + M. Ор работает подобно TheQube и Chicken " "можно включить нажав Контрол + M. Он работает подобно TheQube и Chicken "
"Nugget. Горячие клаиши также похожи на те, что используются в этих клиентах. " "Nugget. Горячие клавиши также похожи на те, что используются в этих "
"Кроме того, в программе имеется возможность редактирования клавиатурных " "клиентах. Кроме того, в программе имеется возможность редактирования "
"команд, которую можно выбрать в Основных настройках. По умолчанию, с " лавиатурных команд, которую можно выбрать в Основных настройках. По "
"горячими клавишами этого интерфейса невозможно работать в графическом окне, " "умолчанию, с горячими клавишами этого интерфейса невозможно работать в "
"но этот параметр можно изменить в Основных настройках." "графическом окне, но этот параметр можно изменить в Основных настройках."
#: ../doc\strings.py:124 #: ../doc\strings.py:124
msgid "" msgid ""
@@ -1127,55 +1128,55 @@ msgstr "* Ввод: открыть ссылку."
#: ../doc\strings.py:128 #: ../doc\strings.py:128
msgid "* Control + Enter: Play audio." msgid "* Control + Enter: Play audio."
msgstr "* КОнтрл + Ввод: воспроизвести аудио." msgstr "* Контрол + Ввод: воспроизвести аудио."
#: ../doc\strings.py:129 #: ../doc\strings.py:129
msgid "* Control + M: Hide the GUI." msgid "* Control + M: Hide the GUI."
msgstr "* Контрл + M: скрыть графический интерфейс." msgstr "* Контрол + M: скрыть графический интерфейс."
#: ../doc\strings.py:130 #: ../doc\strings.py:130
msgid "* Control + N: Compose a new tweet." msgid "* Control + N: Compose a new tweet."
msgstr "* Контрл + N: создать новый твит." msgstr "* Контрол + N: создать новый твит."
#: ../doc\strings.py:131 #: ../doc\strings.py:131
msgid "* Control + R: Reply / mention." msgid "* Control + R: Reply / mention."
msgstr "* Контрл + R: ответить / упомянуть." msgstr "* Контрол + R: ответить / упомянуть."
#: ../doc\strings.py:132 #: ../doc\strings.py:132
msgid "* Control + Shift + R: Retweet." msgid "* Control + Shift + R: Retweet."
msgstr "* Контрл + Шифт + R: ретвитнуть." msgstr "* Контрол + Шифт + R: ретвитнуть."
#: ../doc\strings.py:133 #: ../doc\strings.py:133
msgid "* Control + D: Send a direct message." msgid "* Control + D: Send a direct message."
msgstr "* КОнтрл + D: отправить личное сообщение." msgstr "* Контрол + D: отправить личное сообщение."
#: ../doc\strings.py:134 #: ../doc\strings.py:134
msgid "* control + F: Add tweet to favourites." msgid "* control + F: Add tweet to favourites."
msgstr "* КОнтрл + F: добавить твит в Избранное." msgstr "* Контрол + F: отметить твит как понравившийся."
#: ../doc\strings.py:135 #: ../doc\strings.py:135
msgid "* Control + Shift + F: Remove a tweet from favourites." msgid "* Control + Shift + F: Remove a tweet from favourites."
msgstr "* Контрл + Шифт + F: удалить твит из Избранного." msgstr "* Контрол + Шифт + F: удалить твит из списка понравившихся."
#: ../doc\strings.py:136 #: ../doc\strings.py:136
msgid "* Control + S: Open the user actions dialogue." msgid "* Control + S: Open the user actions dialogue."
msgstr "* Контрл + S: открыть диалог действий с пользователем." msgstr "* Контрол + S: открыть диалог действий с пользователем."
#: ../doc\strings.py:137 #: ../doc\strings.py:137
msgid "* Control + Shift + V: Show tweet." msgid "* Control + Shift + V: Show tweet."
msgstr "* Контрл + Шифт + V: показать твит." msgstr "* Контрол + Шифт + V: показать твит."
#: ../doc\strings.py:138 #: ../doc\strings.py:138
msgid "* Control + Q: Quit this program." msgid "* Control + Q: Quit this program."
msgstr "Контрл + Q: закрыть программу." msgstr "* Контрол + Q: закрыть программу."
#: ../doc\strings.py:139 #: ../doc\strings.py:139
msgid "* Control + I: Open user timeline." msgid "* Control + I: Open user timeline."
msgstr "Контрл + I: открыть ленту пользователя." msgstr "* Контрол + I: открыть ленту пользователя."
#: ../doc\strings.py:140 #: ../doc\strings.py:140
msgid "* Control + Shift + i: Destroy buffer." msgid "* Control + Shift + i: Destroy buffer."
msgstr "* КОнтрл + Шифт I: закрыть и удалить буфер." msgstr "* Контрол + Шифт+ I: закрыть и удалить буфер."
#: ../doc\strings.py:141 #: ../doc\strings.py:141
msgid "* F5: Increase volume by 5%." msgid "* F5: Increase volume by 5%."
@@ -1187,15 +1188,15 @@ msgstr "* F6: уменьшить громкость на 5%."
#: ../doc\strings.py:143 #: ../doc\strings.py:143
msgid "* Control + P: Edit your profile." msgid "* Control + P: Edit your profile."
msgstr "* Контрл + P: редактировать свой профиль." msgstr "* Контрол + P: редактировать свой профиль."
#: ../doc\strings.py:144 #: ../doc\strings.py:144
msgid "* Control + Delete: Delete a tweet or direct message." msgid "* Control + Delete: Delete a tweet or direct message."
msgstr "* Контрл + Делит: удалить твит или личное сообщение." msgstr "* Контрол + Дэлит: удалить твит или личное сообщение."
#: ../doc\strings.py:145 #: ../doc\strings.py:145
msgid "* Control + Shift + Delete: Empty the current buffer." msgid "* Control + Shift + Delete: Empty the current buffer."
msgstr "* КОнтрл + Шифт + Делит: очистить текущий буфер." msgstr "* Контрол + Шифт + Дэлит: очистить текущий буфер."
#: ../doc\strings.py:146 #: ../doc\strings.py:146
msgid "### Shortcuts of the invisible interface (default keymap)" msgid "### Shortcuts of the invisible interface (default keymap)"
@@ -1205,125 +1206,127 @@ msgstr "### Горячие клавиши для невидимого интер
msgid "" msgid ""
"* Control + Windows + Up Arrow: moves to the previous item in the buffer." "* Control + Windows + Up Arrow: moves to the previous item in the buffer."
msgstr "" msgstr ""
"* Контрл + Windows + Стрелка вверх: перемещает к предыдущему элементу в " "* Контрол + Windows + Стрелка вверх: перемещает к предыдущему элементу в "
"буфере." "буфере."
#: ../doc\strings.py:148 #: ../doc\strings.py:148
msgid "* Control + Windows + Down Arrow: moves to the next item in the buffer." msgid "* Control + Windows + Down Arrow: moves to the next item in the buffer."
msgstr "" msgstr ""
"* Контрл + Windows + Стрелка вниз: перемещает к следующему элементу в буфере." "* Контрол + Windows + Стрелка вниз: перемещает к следующему элементу в "
"буфере."
#: ../doc\strings.py:149 #: ../doc\strings.py:149
msgid "* Control + Windows + Left Arrow: Move to the previous buffer." msgid "* Control + Windows + Left Arrow: Move to the previous buffer."
msgstr "* Контрл + Windows + Стрелка влево: перейти к предыдущему буферу." msgstr "* Контрол + Windows + Стрелка влево: перейти к предыдущему буферу."
#: ../doc\strings.py:150 #: ../doc\strings.py:150
msgid "* Control + Windows + Right Arrow: Move to the next buffer." msgid "* Control + Windows + Right Arrow: Move to the next buffer."
msgstr "* Контрл + Windows + Стрелка вправо: перейти к следующему буферу." msgstr "* Контрол + Windows + Стрелка вправо: перейти к следующему буферу."
#: ../doc\strings.py:151 #: ../doc\strings.py:151
msgid "* Control + Windows + Shift + Left: Focus the previous session." msgid "* Control + Windows + Shift + Left: Focus the previous session."
msgstr "* Контрл + Windows + Шифт + Влево: перейти к предыдущей сессии." msgstr "* Контрол + Windows + Шифт + Влево: перейти к предыдущей сессии."
#: ../doc\strings.py:152 #: ../doc\strings.py:152
msgid "* Control + Windows + Shift + Right: Focus the next session." msgid "* Control + Windows + Shift + Right: Focus the next session."
msgstr "* Контрл + Windows + Шифт + Вправо: перейти к следующей сессии." msgstr "* Контрол + Windows + Шифт + Вправо: перейти к следующей сессии."
#: ../doc\strings.py:153 #: ../doc\strings.py:153
msgid "* Control + Windows + C: View conversation." msgid "* Control + Windows + C: View conversation."
msgstr "* Контрл + Windows + C: просмотреть беседу." msgstr "* Контрол + Windows + C: просмотреть беседу."
#: ../doc\strings.py:154 #: ../doc\strings.py:154
msgid "* Control + Windows + Enter: Open URL." msgid "* Control + Windows + Enter: Open URL."
msgstr "КОнтрл + Windows + Ввод: Открыть ссылку." msgstr "* Контрол + Windows + Ввод: Открыть ссылку."
#: ../doc\strings.py:155 #: ../doc\strings.py:155
msgid "* Control + Windows + ALT + Enter: Play audio." msgid "* Control + Windows + ALT + Enter: Play audio."
msgstr "* Контрл + Windows + Альт + Ввод: воспроизвести аудио." msgstr "* Контрол + Windows + Альт + Ввод: воспроизвести аудио."
#: ../doc\strings.py:156 #: ../doc\strings.py:156
msgid "* Control + Windows + M: Show or hide the GUI." msgid "* Control + Windows + M: Show or hide the GUI."
msgstr "* КОнтрл + Windows + M: показать или скрыть графический интерфейс." msgstr "* Контрол + Windows + M: показать или скрыть графический интерфейс."
#: ../doc\strings.py:157 #: ../doc\strings.py:157
msgid "* Control + Windows + N: New tweet." msgid "* Control + Windows + N: New tweet."
msgstr "* КОнтрл + Windows + N: новый твит." msgstr "* Контрол + Windows + N: новый твит."
#: ../doc\strings.py:158 #: ../doc\strings.py:158
msgid "* Control + Windows + R: Reply / Mention." msgid "* Control + Windows + R: Reply / Mention."
msgstr "* Контрл + Windows + R: ответить / упомянуть." msgstr "* Контрол + Windows + R: ответить / упомянуть."
#: ../doc\strings.py:159 #: ../doc\strings.py:159
msgid "* Control + Windows + Shift + R: Retweet." msgid "* Control + Windows + Shift + R: Retweet."
msgstr "* КОнтрл + Windows + Шифт + R: ретвитнуть." msgstr "* Контрол + Windows + Шифт + R: ретвитнуть."
#: ../doc\strings.py:160 #: ../doc\strings.py:160
msgid "* Control + Windows + D: Send direct message." msgid "* Control + Windows + D: Send direct message."
msgstr "* КОнтрл + Windows + D: отправить личное сообщение." msgstr "* Контрол + Windows + D: отправить личное сообщение."
#: ../doc\strings.py:161 #: ../doc\strings.py:161
msgid "* Windows+ Alt + F: Like a tweet." msgid "* Windows+ Alt + F: Like a tweet."
msgstr "* Windows+ Альт + F: поставить твиту отметку Нравится." msgstr "* Windows+ Альт + F: отметить твит как понравившийся."
#: ../doc\strings.py:162 #: ../doc\strings.py:162
msgid "* Alt + Windows + Shift + F: Remove from likes." msgid "* Alt + Windows + Shift + F: Remove from likes."
msgstr "* Альт + Windows + Шифт + F: удалить из понравившихся." msgstr "* Альт + Windows + Шифт + F: удалить из списка понравившихся."
#: ../doc\strings.py:163 #: ../doc\strings.py:163
msgid "* Control + Windows + S: Open the user actions dialogue." msgid "* Control + Windows + S: Open the user actions dialogue."
msgstr "* Контрл + Windows + S: открыть диалог действий с пользователем." msgstr "* Контрол + Windows + S: открыть диалог действий с пользователем."
#: ../doc\strings.py:164 #: ../doc\strings.py:164
msgid "* Control + Windows + Alt + N: See user details." msgid "* Control + Windows + Alt + N: See user details."
msgstr "* КОнтрл + Windows + Альт + N: посмотреть информацию о пользователе." msgstr "* Контрол + Windows + Альт + N: посмотреть информацию о пользователе."
#: ../doc\strings.py:165 #: ../doc\strings.py:165
msgid "* Control + Windows + V: Show tweet." msgid "* Control + Windows + V: Show tweet."
msgstr "* КОнтрл + Windows + V: показать твит." msgstr "* Контрол + Windows + V: показать твит."
#: ../doc\strings.py:166 #: ../doc\strings.py:166
msgid "* Control + Windows + F4: Quit TWBlue." msgid "* Control + Windows + F4: Quit TWBlue."
msgstr "* Контрл + Windows + F4: закрыть TWBlue." msgstr "* Контрол + Windows + F4: закрыть TWBlue."
#: ../doc\strings.py:167 #: ../doc\strings.py:167
msgid "* Control + Windows + I: Open user timeline." msgid "* Control + Windows + I: Open user timeline."
msgstr "* Контрл + Windows + I: открыть ленту пользователя." msgstr "* Контрол + Windows + I: открыть ленту пользователя."
#: ../doc\strings.py:168 #: ../doc\strings.py:168
msgid "* Control + Windows + Shift + I: Destroy buffer." msgid "* Control + Windows + Shift + I: Destroy buffer."
msgstr "* КОнтрл + Windows + Шифт + I: закрыть и удалить буфер." msgstr "* Контрол + Windows + Шифт + I: закрыть и удалить буфер."
#: ../doc\strings.py:169 #: ../doc\strings.py:169
msgid "* Control + Windows + Alt + Up: Increase volume by 5%." msgid "* Control + Windows + Alt + Up: Increase volume by 5%."
msgstr "* КОнтрл + Windows + Альт + вверх: увеличить громкость на 5%." msgstr "* Контрол + Windows + Альт + вверх: увеличить громкость на 5%."
#: ../doc\strings.py:170 #: ../doc\strings.py:170
msgid "* Control + Windows + Alt + Down: Decrease volume by 5%." msgid "* Control + Windows + Alt + Down: Decrease volume by 5%."
msgstr "* Контрл + Windows + Альт + Вниз: уменьшить громкость на 5%." msgstr "* Контрол + Windows + Альт + Вниз: уменьшить громкость на 5%."
#: ../doc\strings.py:171 #: ../doc\strings.py:171
msgid "" msgid ""
"* Control + Windows + Home: Jump to the first element of the current buffer." "* Control + Windows + Home: Jump to the first element of the current buffer."
msgstr "* Контрл + Windows + Хоум: перейти к первому элементу текущего буфера." msgstr ""
"* Контрол + Windows + Хоум: перейти к первому элементу текущего буфера."
#: ../doc\strings.py:172 #: ../doc\strings.py:172
msgid "" msgid ""
"* Control + Windows + End: Jump to the last element of the current buffer." "* Control + Windows + End: Jump to the last element of the current buffer."
msgstr "" msgstr ""
"* Контрл + Windows + Энд: перейти к последнему элементу текущего буфера." "* Контрол + Windows + Энд: перейти к последнему элементу текущего буфера."
#: ../doc\strings.py:173 #: ../doc\strings.py:173
msgid "" msgid ""
"* Control + Windows + PageUp: Jump 20 elements up in the current buffer." "* Control + Windows + PageUp: Jump 20 elements up in the current buffer."
msgstr "" msgstr ""
"* КОнтрл + Windows + Страница вверх: перейти на 20элементов вверх в текущем " "* Контрол + Windows + Страница вверх: перейти на 20элементов вверх в текущем "
"буфере." "буфере."
#: ../doc\strings.py:174 #: ../doc\strings.py:174
msgid "" msgid ""
"* Control + Windows + PageDown: Jump 20 elements down in the current buffer." "* Control + Windows + PageDown: Jump 20 elements down in the current buffer."
msgstr "" msgstr ""
"* Контрл + Windows + Страница вниз: перейти на 20 элементов вниз в текущем " "* Контрол + Windows + Страница вниз: перейти на 20 элементов вниз в текущем "
"буфере." "буфере."
#: ../doc\strings.py:175 #: ../doc\strings.py:175
@@ -1332,57 +1335,57 @@ msgstr "* Windows + Альт + P: редактировать профиль."
#: ../doc\strings.py:176 #: ../doc\strings.py:176
msgid "* Control + Windows + Delete: Delete a tweet or direct message." msgid "* Control + Windows + Delete: Delete a tweet or direct message."
msgstr "* КОнтрл + Windows + Делит: удалить твит или личное сообщение." msgstr "* Контрол + Windows + Дэлит: удалить твит или личное сообщение."
#: ../doc\strings.py:177 #: ../doc\strings.py:177
msgid "* Control + Windows + Shift + Delete: Empty the current buffer." msgid "* Control + Windows + Shift + Delete: Empty the current buffer."
msgstr "* Control + Windows + Шифт + Делит: очистить текущий буфер." msgstr "* Контрол + Windows + Шифт + Дэлит: очистить текущий буфер."
#: ../doc\strings.py:178 #: ../doc\strings.py:178
msgid "* Control + Windows + Space: Repeat last item." msgid "* Control + Windows + Space: Repeat last item."
msgstr "* Контрл + Windows + Пробел: повторить последний элемент." msgstr "* Контрол + Windows + Пробел: повторить последний элемент."
#: ../doc\strings.py:179 #: ../doc\strings.py:179
msgid "* Control + Windows + Shift + C: Copy to clipboard." msgid "* Control + Windows + Shift + C: Copy to clipboard."
msgstr "* Контрл + Windows + Шифт + C: скопировать в буфер обмена." msgstr "* Контрол + Windows + Шифт + C: скопировать в буфер обмена."
#: ../doc\strings.py:180 #: ../doc\strings.py:180
msgid "* Control + Windows+ A: Add user to list." msgid "* Control + Windows+ A: Add user to list."
msgstr "* Контрл + Windows+ A: добавить пользователя в список." msgstr "* Контрол + Windows+ A: добавить пользователя в список."
#: ../doc\strings.py:181 #: ../doc\strings.py:181
msgid "* Control + Windows + Shift + A: Remove user from list." msgid "* Control + Windows + Shift + A: Remove user from list."
msgstr "* Контрл + Windows + Шифт + A:удалить пользователя из списка. " msgstr "* Контрол + Windows + Шифт + A: удалить пользователя из списка. "
#: ../doc\strings.py:182 #: ../doc\strings.py:182
msgid "* Control + Windows + Shift + M: Mute / unmute the current buffer." msgid "* Control + Windows + Shift + M: Mute / unmute the current buffer."
msgstr "" msgstr ""
"* Контрл + Windows + Шифт + M: отключить / включить звуки для текущего " "* Контрол + Windows + Шифт + M: отключить / включить звуки для текущего "
"буфера." "буфера."
#: ../doc\strings.py:183 #: ../doc\strings.py:183
msgid "* Windows + Alt + M: Mute / unmute the current session." msgid "* Windows + Alt + M: Mute / unmute the current session."
msgstr "* Windows + Альт + M: отключить / включить звуки для текущей сессии." msgstr "* Windows + Альт + M: Отключить / включить звуки для текущей сессии."
#: ../doc\strings.py:184 #: ../doc\strings.py:184
msgid "" msgid ""
"* Control + Windows + E: Toggle the automatic reading of incoming tweets in " "* Control + Windows + E: Toggle the automatic reading of incoming tweets in "
"the current buffer." "the current buffer."
msgstr "" msgstr ""
"* Контрл + Windows + E: переключить авточтение входящих твитов в текущем " "* Контрол + Windows + E: переключить авточтение входящих твитов в текущем "
"буфере." "буфере."
#: ../doc\strings.py:185 #: ../doc\strings.py:185
msgid "* Control + Windows + -: Search on Twitter." msgid "* Control + Windows + -: Search on Twitter."
msgstr "* Контрл + Windows + -: искать в Твиттере." msgstr "* Контрол + Windows + -: искать в Твиттере."
#: ../doc\strings.py:186 #: ../doc\strings.py:186
msgid "* Control + Windows + K: Show the keystroke editor." msgid "* Control + Windows + K: Show the keystroke editor."
msgstr "* Control + Windows + K: показать редактор горячих клавиш." msgstr "* Контрол + Windows + K: показать редактор горячих клавиш."
#: ../doc\strings.py:187 #: ../doc\strings.py:187
msgid "* Control + Windows + L: Show lists for a specified user." msgid "* Control + Windows + L: Show lists for a specified user."
msgstr "* КОнтрл + Windows + L: показать списки указанного пользователя." msgstr "* Контрол + Windows + L: показать списки указанного пользователя."
#: ../doc\strings.py:188 #: ../doc\strings.py:188
msgid "* Windows + Alt + PageUp: Load previous items for the current buffer." msgid "* Windows + Alt + PageUp: Load previous items for the current buffer."
@@ -1392,22 +1395,22 @@ msgstr ""
#: ../doc\strings.py:189 #: ../doc\strings.py:189
msgid "* Control + Windows + G: Get geolocation." msgid "* Control + Windows + G: Get geolocation."
msgstr "* КОнтрл + Windows + G: получить местоположение." msgstr "* Контрол + Windows + G: получить местоположение."
#: ../doc\strings.py:190 #: ../doc\strings.py:190
msgid "" msgid ""
"* Control + Windows + Shift + G: Display the tweet's geolocation in a " "* Control + Windows + Shift + G: Display the tweet's geolocation in a "
"dialogue." "dialogue."
msgstr "" msgstr ""
"* КОнтрл + Windows + Шифт + G: показать местоположение для твита в диалоге." "* Контрол + Windows + Шифт + G: показать местоположение для твита в диалоге."
#: ../doc\strings.py:191 #: ../doc\strings.py:191
msgid "* Control + Windows + T: Create a trending topics' buffer." msgid "* Control + Windows + T: Create a trending topics' buffer."
msgstr "* Контрл + Windows + T: создать буфер для трендов." msgstr "* Контрол + Windows + T: создать буфер для трендов."
#: ../doc\strings.py:192 #: ../doc\strings.py:192
msgid "* Control + Windows + {: Find a string in the current buffer." msgid "* Control + Windows + {: Find a string in the current buffer."
msgstr "* КОнтрл + Windows + {: найти фразу в текущем буфере." msgstr "* Контрол + Windows + {: найти фразу в текущем буфере."
#: ../doc\strings.py:193 #: ../doc\strings.py:193
msgid "## Configuration" msgid "## Configuration"
@@ -1571,7 +1574,7 @@ msgid ""
msgstr "" msgstr ""
"* Язык: здесь можно выбрать язык программы. В настоящий момент " "* Язык: здесь можно выбрать язык программы. В настоящий момент "
"поддерживаются Арабский,Каталанский, немецкий, английский,испанский, " "поддерживаются Арабский,Каталанский, немецкий, английский,испанский, "
"баскский, финский, французский, Галицкий, хорватский, венгерский, " "баскский, финский, французский, Галисийский, хорватский, венгерский, "
"итальянский, польский, португальский, русский и турецкий." "итальянский, польский, португальский, русский и турецкий."
#: ../doc\strings.py:216 #: ../doc\strings.py:216
@@ -1598,8 +1601,8 @@ msgid ""
"\"ready\"." "\"ready\"."
msgstr "" msgstr ""
"* Произносить приветствие при запуске TWBlue: то же, что и предыдущий " "* Произносить приветствие при запуске TWBlue: то же, что и предыдущий "
"параметр, но определяетбудет ли программа экранного доступа говорить \"готово" "параметр, но определяет будет ли программа экранного доступа говорить "
"\"." "\"готово\"."
#: ../doc\strings.py:219 #: ../doc\strings.py:219
msgid "" msgid ""
@@ -1692,7 +1695,7 @@ msgstr ""
#: ../doc\strings.py:229 #: ../doc\strings.py:229
msgid "## Contact" msgid "## Contact"
msgstr "## КОнтакт" msgstr "## Контакт"
#: ../doc\strings.py:230 #: ../doc\strings.py:230
msgid "" msgid ""
@@ -1704,7 +1707,7 @@ msgid ""
"es)" "es)"
msgstr "" msgstr ""
"Если, после прочтения этого документа, у вас все еще остались вопросы, если " "Если, после прочтения этого документа, у вас все еще остались вопросы, если "
"вы хотите каким-либо образом посотрудничать с проектом, или, если вы просто " "вы хотите каким-либо образом сотрудничать с проектом, или, если вы просто "
"хотите связаться с разработчиком этого приложения, начните читать в Твиттере " "хотите связаться с разработчиком этого приложения, начните читать в Твиттере "
"пользователя [@tw\\_blue2](https://twitter.com/tw_blue2) или " "пользователя [@tw\\_blue2](https://twitter.com/tw_blue2) или "
"[@manuelcortez00.](https://twitter.com/manuelcortez00). Вы также можете " "[@manuelcortez00.](https://twitter.com/manuelcortez00). Вы также можете "
@@ -1720,7 +1723,7 @@ msgid ""
"manuelcortez00) and [José Manuel Delicado](https://twitter.com/jmdaweb). " "manuelcortez00) and [José Manuel Delicado](https://twitter.com/jmdaweb). "
"It's supported and sponsored by [Technow S. L.](https://twitter.com/technow)" "It's supported and sponsored by [Technow S. L.](https://twitter.com/technow)"
msgstr "" msgstr ""
"Разрабатывают и поддерживают TWBlue [Мануэль Кортез](https://twitter.com/" "Разрабатывают и поддерживают TWBlue [Мануэль Кортес](https://twitter.com/"
"manuelcortez00) и [Хосе Мануэль Деликадо](https://twitter.com/jmdaweb). " "manuelcortez00) и [Хосе Мануэль Деликадо](https://twitter.com/jmdaweb). "
"Поддержку и спонсорскую помощь оказывает [Technow S. L.](https://twitter.com/" "Поддержку и спонсорскую помощь оказывает [Technow S. L.](https://twitter.com/"
"technow)" "technow)"
@@ -1743,7 +1746,7 @@ msgstr "* Арабский : [Mohammed Al Shara](https://twitter.com/mohammed020
#: ../doc\strings.py:236 #: ../doc\strings.py:236
msgid "* Catalan: [Francisco Torres](https://twitter.com/ftgalleg)" msgid "* Catalan: [Francisco Torres](https://twitter.com/ftgalleg)"
msgstr "* Галицийский: [Francisco Torres](https://twitter.com/ftgalleg)" msgstr "* Каталанский: [Francisco Torres](https://twitter.com/ftgalleg)"
#: ../doc\strings.py:237 #: ../doc\strings.py:237
msgid "* Spanish: [Manuel Cortéz](https://twitter.com/manuelcortez00)." msgid "* Spanish: [Manuel Cortéz](https://twitter.com/manuelcortez00)."
@@ -1763,7 +1766,7 @@ msgstr "* Французский: [Rémi Ruiz](https://twitter.com/blindhelp38).
#: ../doc\strings.py:241 #: ../doc\strings.py:241
msgid "* Galician: [Juan Buño](https://twitter.com/Quetzatl_)." msgid "* Galician: [Juan Buño](https://twitter.com/Quetzatl_)."
msgstr "* Галицийский: [Juan Buño](https://twitter.com/Quetzatl_)." msgstr "* Галисийский: [Juan Buño](https://twitter.com/Quetzatl_)."
#: ../doc\strings.py:242 #: ../doc\strings.py:242
msgid "* German: [Steffen Schultz](https://twitter.com/schulle4u)." msgid "* German: [Steffen Schultz](https://twitter.com/schulle4u)."
@@ -1826,7 +1829,7 @@ msgid ""
"twitter.com/brianhartgen) and [Bill Dengler](https://twitter.com/codeofdusk)." "twitter.com/brianhartgen) and [Bill Dengler](https://twitter.com/codeofdusk)."
msgstr "" msgstr ""
"Также огромная благодарность всем, кто работал над документацией. Изначально " "Также огромная благодарность всем, кто работал над документацией. Изначально "
"[Мануэль Кортез](https://twitter.com/manuelcortez00) создал документацию на " "[Мануэль Кортес](https://twitter.com/manuelcortez00) создал документацию на "
"испанском языке, затем она была переведена на английский пользователями " "испанском языке, затем она была переведена на английский пользователями "
"[Bryner Villalobos](https://twitter.com/Bry_StarkCR), [Robert Spangler]" "[Bryner Villalobos](https://twitter.com/Bry_StarkCR), [Robert Spangler]"
"(https://twitter.com/glasscity1837), [Sussan Rey](https://twitter.com/" "(https://twitter.com/glasscity1837), [Sussan Rey](https://twitter.com/"

View File

@@ -1,6 +1,6 @@
[Format] [Format]
Type=PortableApps.comFormat Type=PortableApps.comFormat
Version=3.3 Version=3.4
[Details] [Details]
Name=tw blue portable Name=tw blue portable
@@ -20,8 +20,8 @@ CommercialUse=true
EULAVersion=2 EULAVersion=2
[Version] [Version]
PackageVersion=0.85.0.0 PackageVersion=0.87.0.0
DisplayVersion=0.85 DisplayVersion=0.87
[Control] [Control]
Icons=1 Icons=1

View File

@@ -13,9 +13,9 @@ SetCompressor /solid lzma
SetDatablockOptimize on SetDatablockOptimize on
VIAddVersionKey ProductName "TWBlue" VIAddVersionKey ProductName "TWBlue"
VIAddVersionKey LegalCopyright "Copyright 2016 Manuel Cortéz." VIAddVersionKey LegalCopyright "Copyright 2016 Manuel Cortéz."
VIAddVersionKey ProductVersion "0.85" VIAddVersionKey ProductVersion "0.87"
VIAddVersionKey FileVersion "0.85" VIAddVersionKey FileVersion "0.87"
VIProductVersion "0.85.0.0" VIProductVersion "0.87.0.0"
!insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_WELCOME
!define MUI_LICENSEPAGE_RADIOBUTTONS !define MUI_LICENSEPAGE_RADIOBUTTONS
!insertmacro MUI_PAGE_LICENSE "license.txt" !insertmacro MUI_PAGE_LICENSE "license.txt"
@@ -69,10 +69,10 @@ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "D
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "UninstallString" '"$INSTDIR\uninstall.exe"' WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "UninstallString" '"$INSTDIR\uninstall.exe"'
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall" "InstallLocation" $INSTDIR WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall" "InstallLocation" $INSTDIR
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall" "Publisher" "Manuel Cortéz" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall" "Publisher" "Manuel Cortéz"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "DisplayVersion" "0.85" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "DisplayVersion" "0.87"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "URLInfoAbout" "http://twblue.es" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "URLInfoAbout" "http://twblue.es"
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "VersionMajor" 0 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "VersionMajor" 0
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "VersionMinor" 85 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "VersionMinor" 87
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "NoModify" 1 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "NoModify" 1
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "NoRepair" 1 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\twblue" "NoRepair" 1
SectionEnd SectionEnd

View File

@@ -39,3 +39,4 @@ spelling_language = string(default="")
save_followers_in_autocompletion_db = boolean(default=False) save_followers_in_autocompletion_db = boolean(default=False)
save_friends_in_autocompletion_db = boolean(default=False) save_friends_in_autocompletion_db = boolean(default=False)
twishort_enabled = boolean(default=False) twishort_enabled = boolean(default=False)
mention_all = boolean(default=True)

View File

@@ -2,7 +2,7 @@
name = 'TWBlue' name = 'TWBlue'
snapshot = False snapshot = False
if snapshot == False: if snapshot == False:
version = "0.85" version = "0.87"
update_url = 'http://twblue.es/updates/twblue_ngen.json' update_url = 'http://twblue.es/updates/twblue_ngen.json'
mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/stable.json' mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/stable.json'
else: else:

View File

@@ -224,7 +224,7 @@ class emptyPanel(bufferController):
self.needs_init = True self.needs_init = True
class baseBufferController(bufferController): class baseBufferController(bufferController):
def __init__(self, parent, function, name, sessionObject, account, sound=None, bufferType=None, *args, **kwargs): def __init__(self, parent, function, name, sessionObject, account, sound=None, bufferType=None, compose_func="compose_tweet", *args, **kwargs):
super(baseBufferController, self).__init__(parent, function, *args, **kwargs) super(baseBufferController, self).__init__(parent, function, *args, **kwargs)
log.debug("Initializing buffer %s, account %s" % (name, account,)) log.debug("Initializing buffer %s, account %s" % (name, account,))
if bufferType != None: if bufferType != None:
@@ -235,7 +235,7 @@ class baseBufferController(bufferController):
self.name = name self.name = name
self.type = self.buffer.type self.type = self.buffer.type
self.session = sessionObject self.session = sessionObject
self.compose_function = compose.compose_tweet self.compose_function = getattr(compose, compose_func)
log.debug("Compose_function: %s" % (self.compose_function,)) log.debug("Compose_function: %s" % (self.compose_function,))
self.account = account self.account = account
self.buffer.account = account self.buffer.account = account
@@ -258,10 +258,10 @@ class baseBufferController(bufferController):
if tweet.has_key("message"): if tweet.has_key("message"):
message = tweet["message"] message = tweet["message"]
try: try:
tweet = self.session.twitter.twitter.show_status(id=tweet_id, include_ext_alt_text=True) tweet = self.session.twitter.twitter.show_status(id=tweet_id, include_ext_alt_text=True, tweet_mode="extended")
urls = utils.find_urls_in_text(tweet["text"]) urls = utils.find_urls_in_text(tweet["full_text"])
for url in range(0, len(urls)): for url in range(0, len(urls)):
try: tweet["text"] = tweet["text"].replace(urls[url], tweet["entities"]["urls"][url]["expanded_url"]) try: tweet["full_text"] = tweet["full_text"].replace(urls[url], tweet["entities"]["urls"][url]["expanded_url"])
except IndexError: pass except IndexError: pass
except TwythonError as e: except TwythonError as e:
utils.twitter_error(e) utils.twitter_error(e)
@@ -272,10 +272,10 @@ class baseBufferController(bufferController):
while l != False: while l != False:
tweetsList.append(tweet) tweetsList.append(tweet)
try: try:
tweet = self.session.twitter.twitter.show_status(id=l, include_ext_alt_text=True) tweet = self.session.twitter.twitter.show_status(id=l, include_ext_alt_text=True, tweet_mode="extended")
urls = utils.find_urls_in_text(tweet["text"]) urls = utils.find_urls_in_text(tweet["full_text"])
for url in range(0, len(urls)): for url in range(0, len(urls)):
try: tweet["text"] = tweet["text"].replace(urls[url], tweet["entities"]["urls"][url]["expanded_url"]) try: tweet["full_text"] = tweet["full_text"].replace(urls[url], tweet["entities"]["urls"][url]["expanded_url"])
except IndexError: pass except IndexError: pass
except TwythonError as e: except TwythonError as e:
utils.twitter_error(e) utils.twitter_error(e)
@@ -480,19 +480,22 @@ class baseBufferController(bufferController):
screen_name = tweet["user"]["screen_name"] screen_name = tweet["user"]["screen_name"]
id = tweet["id"] id = tweet["id"]
users = utils.get_all_mentioned(tweet, self.session.db) users = utils.get_all_mentioned(tweet, self.session.db)
message = messages.reply(self.session, _(u"Reply"), _(u"Reply to %s") % (screen_name,), "@%s " % (screen_name,), twishort_enabled=self.session.settings["mysc"]["twishort_enabled"], users=users) message = messages.reply(self.session, _(u"Reply"), _(u"Reply to %s") % (screen_name,), "", twishort_enabled=self.session.settings["mysc"]["twishort_enabled"], users=users)
if message.message.get_response() == widgetUtils.OK: if message.message.get_response() == widgetUtils.OK:
self.session.settings["mysc"]["twishort_enabled"] = message.message.long_tweet.GetValue() self.session.settings["mysc"]["twishort_enabled"] = message.message.long_tweet.GetValue()
self.session.settings["mysc"]["mention_all"] = message.message.mentionAll.GetValue()
text = message.message.get_text() text = message.message.get_text()
if message.message.mentionAll.GetValue() == False:
text = u"@{0} {1}".format(screen_name, text)
if len(text) > 140 and message.message.get("long_tweet") == True: if len(text) > 140 and message.message.get("long_tweet") == True:
if message.image == None: if message.image == None:
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text) text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text)
else: else:
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1) text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1)
if message.image == None: if message.image == None:
call_threaded(self.session.api_call, call_name="update_status", _sound="reply_send.ogg", in_reply_to_status_id=id, status=text) call_threaded(self.session.api_call, call_name="update_status", _sound="reply_send.ogg", in_reply_to_status_id=id, status=text, auto_populate_reply_metadata=message.message.mentionAll.GetValue())
else: else:
call_threaded(self.session.api_call, call_name="update_status_with_media", _sound="reply_send.ogg", in_reply_to_status_id=id, status=text, media=message.file) call_threaded(self.session.api_call, call_name="update_status_with_media", _sound="reply_send.ogg", in_reply_to_status_id=id, status=text, media=message.file, auto_populate_reply_metadata=message.message.mentionAll.GetValue())
if hasattr(message.message, "destroy"): message.message.destroy() if hasattr(message.message, "destroy"): message.message.destroy()
@_tweets_exist @_tweets_exist
@@ -534,20 +537,16 @@ class baseBufferController(bufferController):
self._retweet_with_comment(tweet, id) self._retweet_with_comment(tweet, id)
def _retweet_with_comment(self, tweet, id, comment=''): def _retweet_with_comment(self, tweet, id, comment=''):
retweet = messages.tweet(self.session, _(u"Retweet"), _(u"Add your comment to the tweet"), u"“@%s: %s" % (tweet["user"]["screen_name"], tweet["text"]), max=116, messageType="retweet", twishort_enabled=self.session.settings["mysc"]["twishort_enabled"]) if tweet.has_key("full_text"):
comments = tweet["full_text"]
else:
comments = tweet["text"]
retweet = messages.tweet(self.session, _(u"Quote"), _(u"Add your comment to the tweet"), u"“@%s: %s" % (tweet["user"]["screen_name"], comments), max=116, messageType="retweet", twishort_enabled=self.session.settings["mysc"]["twishort_enabled"])
if comment != '': if comment != '':
retweet.message.set_text(comment) retweet.message.set_text(comment)
if retweet.message.get_response() == widgetUtils.OK: if retweet.message.get_response() == widgetUtils.OK:
text = retweet.message.get_text() text = retweet.message.get_text()
comments=text
if len(text+ u"“@%s: %s" % (tweet["user"]["screen_name"], tweet["text"])) < 140:
text = text+u"“@%s: %s" % (tweet["user"]["screen_name"], tweet["text"])
else:
answer = commonMessageDialogs.retweet_as_link(self.buffer)
if answer == widgetUtils.YES:
text = text+" https://twitter.com/{0}/status/{1}".format(tweet["user"]["screen_name"], id) text = text+" https://twitter.com/{0}/status/{1}".format(tweet["user"]["screen_name"], id)
else:
return self._retweet_with_comment(tweet, id, comment=comments)
if retweet.image == None: if retweet.image == None:
call_threaded(self.session.api_call, call_name="update_status", _sound="retweet_send.ogg", status=text, in_reply_to_status_id=id) call_threaded(self.session.api_call, call_name="update_status", _sound="retweet_send.ogg", status=text, in_reply_to_status_id=id)
else: else:
@@ -1100,7 +1099,7 @@ class conversationBufferController(searchBufferController):
tweet = self.tweet tweet = self.tweet
while tweet["in_reply_to_status_id"] != None: while tweet["in_reply_to_status_id"] != None:
try: try:
tweet = self.session.twitter.twitter.show_status(id=tweet["in_reply_to_status_id"]) tweet = self.session.twitter.twitter.show_status(id=tweet["in_reply_to_status_id"], tweet_mode="extended")
except TwythonError as err: except TwythonError as err:
break break
self.statuses.insert(0, tweet) self.statuses.insert(0, tweet)
@@ -1108,7 +1107,7 @@ class conversationBufferController(searchBufferController):
if tweet["in_reply_to_status_id"] == None: if tweet["in_reply_to_status_id"] == None:
self.kwargs["since_id"] = tweet["id"] self.kwargs["since_id"] = tweet["id"]
self.ids.append(tweet["id"]) self.ids.append(tweet["id"])
val2 = self.session.search(self.name, *self.args, **self.kwargs) val2 = self.session.search(self.name, tweet_mode="extended", *self.args, **self.kwargs)
for i in val2: for i in val2:
if i["in_reply_to_status_id"] in self.ids: if i["in_reply_to_status_id"] in self.ids:
self.statuses.append(i) self.statuses.append(i)
@@ -1128,12 +1127,3 @@ class conversationBufferController(searchBufferController):
return True return True
elif dlg == widgetUtils.NO: elif dlg == widgetUtils.NO:
return False return False
class pocketBufferController(baseBufferController):
def __init__(self, parent, name, sessionObject, account, sound=None, function=None, bufferType=None, *args, **kwargs):
super(pocketBufferController, self).__init__(parent, name, sessionObject, account, sound, function, bufferType, *args, **kwargs)
self.type = "pocket"
def start_stream(self):
log.debug("Starting stream for buffer %s, account %s and type %s" % (self.name, self.account, self.type))
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))

View File

@@ -175,6 +175,8 @@ class Controller(object):
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.open_timeline, self.view.timeline) widgetUtils.connect_event(self.view, widgetUtils.MENU, self.open_timeline, self.view.timeline)
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.open_favs_timeline, self.view.favs) widgetUtils.connect_event(self.view, widgetUtils.MENU, self.open_favs_timeline, self.view.favs)
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.open_conversation, menuitem=self.view.view_conversation) widgetUtils.connect_event(self.view, widgetUtils.MENU, self.open_conversation, menuitem=self.view.view_conversation)
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.seekLeft, menuitem=self.view.seekLeft)
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.seekRight, menuitem=self.view.seekRight)
if widgetUtils.toolkit == "wx": if widgetUtils.toolkit == "wx":
widgetUtils.connect_event(self.view.nb, widgetUtils.NOTEBOOK_PAGE_CHANGED, self.buffer_changed) widgetUtils.connect_event(self.view.nb, widgetUtils.NOTEBOOK_PAGE_CHANGED, self.buffer_changed)
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.report_error, self.view.reportError) widgetUtils.connect_event(self.view, widgetUtils.MENU, self.report_error, self.view.reportError)
@@ -291,27 +293,27 @@ class Controller(object):
self.view.add_buffer(account.buffer , name=session.db["user_name"]) self.view.add_buffer(account.buffer , name=session.db["user_name"])
for i in session.settings['general']['buffer_order']: for i in session.settings['general']['buffer_order']:
if i == 'home': if i == 'home':
home = buffersController.baseBufferController(self.view.nb, "get_home_timeline", "home_timeline", session, session.db["user_name"]) home = buffersController.baseBufferController(self.view.nb, "get_home_timeline", "home_timeline", session, session.db["user_name"], tweet_mode="extended")
self.buffers.append(home) self.buffers.append(home)
self.view.insert_buffer(home.buffer, name=_(u"Home"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) self.view.insert_buffer(home.buffer, name=_(u"Home"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
elif i == 'mentions': elif i == 'mentions':
mentions = buffersController.baseBufferController(self.view.nb, "get_mentions_timeline", "mentions", session, session.db["user_name"], sound="mention_received.ogg") mentions = buffersController.baseBufferController(self.view.nb, "get_mentions_timeline", "mentions", session, session.db["user_name"], sound="mention_received.ogg", tweet_mode="extended")
self.buffers.append(mentions) self.buffers.append(mentions)
self.view.insert_buffer(mentions.buffer, name=_(u"Mentions"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) self.view.insert_buffer(mentions.buffer, name=_(u"Mentions"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
elif i == 'dm': elif i == 'dm':
dm = buffersController.baseBufferController(self.view.nb, "get_direct_messages", "direct_messages", session, session.db["user_name"], bufferType="dmPanel", sound="dm_received.ogg", full_text=True) dm = buffersController.baseBufferController(self.view.nb, "get_direct_messages", "direct_messages", session, session.db["user_name"], bufferType="dmPanel", compose_func="compose_dm", sound="dm_received.ogg", full_text=True)
self.buffers.append(dm) self.buffers.append(dm)
self.view.insert_buffer(dm.buffer, name=_(u"Direct messages"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) self.view.insert_buffer(dm.buffer, name=_(u"Direct messages"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
elif i == 'sent_dm': elif i == 'sent_dm':
sent_dm = buffersController.baseBufferController(self.view.nb, "get_sent_messages", "sent_direct_messages", session, session.db["user_name"], bufferType="dmPanel", full_text=True) sent_dm = buffersController.baseBufferController(self.view.nb, "get_sent_messages", "sent_direct_messages", session, session.db["user_name"], bufferType="dmPanel", compose_func="compose_dm", full_text=True)
self.buffers.append(sent_dm) self.buffers.append(sent_dm)
self.view.insert_buffer(sent_dm.buffer, name=_(u"Sent direct messages"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) self.view.insert_buffer(sent_dm.buffer, name=_(u"Sent direct messages"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
elif i == 'sent_tweets': elif i == 'sent_tweets':
sent_tweets = buffersController.baseBufferController(self.view.nb, "get_user_timeline", "sent_tweets", session, session.db["user_name"], bufferType="dmPanel", screen_name=session.db["user_name"]) sent_tweets = buffersController.baseBufferController(self.view.nb, "get_user_timeline", "sent_tweets", session, session.db["user_name"], bufferType="dmPanel", screen_name=session.db["user_name"], tweet_mode="extended")
self.buffers.append(sent_tweets) self.buffers.append(sent_tweets)
self.view.insert_buffer(sent_tweets.buffer, name=_(u"Sent tweets"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) self.view.insert_buffer(sent_tweets.buffer, name=_(u"Sent tweets"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
elif i == 'favorites': elif i == 'favorites':
favourites = buffersController.baseBufferController(self.view.nb, "get_favorites", "favourites", session, session.db["user_name"]) favourites = buffersController.baseBufferController(self.view.nb, "get_favorites", "favourites", session, session.db["user_name"], tweet_mode="extended")
self.buffers.append(favourites) self.buffers.append(favourites)
self.view.insert_buffer(favourites.buffer, name=_(u"Likes"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) self.view.insert_buffer(favourites.buffer, name=_(u"Likes"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
@@ -339,14 +341,14 @@ class Controller(object):
self.buffers.append(timelines) self.buffers.append(timelines)
self.view.insert_buffer(timelines.buffer , name=_(u"Timelines"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) self.view.insert_buffer(timelines.buffer , name=_(u"Timelines"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
for i in session.settings["other_buffers"]["timelines"]: for i in session.settings["other_buffers"]["timelines"]:
tl = buffersController.baseBufferController(self.view.nb, "get_user_timeline", "%s-timeline" % (i,), session, session.db["user_name"], bufferType=None, screen_name=i) tl = buffersController.baseBufferController(self.view.nb, "get_user_timeline", "%s-timeline" % (i,), session, session.db["user_name"], bufferType=None, screen_name=i, tweet_mode="extended")
self.buffers.append(tl) self.buffers.append(tl)
self.view.insert_buffer(tl.buffer, name=_(u"Timeline for {}").format(i,), pos=self.view.search("timelines", session.db["user_name"])) self.view.insert_buffer(tl.buffer, name=_(u"Timeline for {}").format(i,), pos=self.view.search("timelines", session.db["user_name"]))
favs_timelines = buffersController.emptyPanel(self.view.nb, "favs_timelines", session.db["user_name"]) favs_timelines = buffersController.emptyPanel(self.view.nb, "favs_timelines", session.db["user_name"])
self.buffers.append(favs_timelines) self.buffers.append(favs_timelines)
self.view.insert_buffer(favs_timelines.buffer , name=_(u"Likes timelines"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) self.view.insert_buffer(favs_timelines.buffer , name=_(u"Likes timelines"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
for i in session.settings["other_buffers"]["favourites_timelines"]: for i in session.settings["other_buffers"]["favourites_timelines"]:
tl = buffersController.baseBufferController(self.view.nb, "get_favorites", "%s-favorite" % (i,), session, session.db["user_name"], bufferType=None, screen_name=i) tl = buffersController.baseBufferController(self.view.nb, "get_favorites", "%s-favorite" % (i,), session, session.db["user_name"], bufferType=None, screen_name=i, tweet_mode="extended")
self.buffers.append(tl) self.buffers.append(tl)
self.view.insert_buffer(tl.buffer, name=_(u"Likes for {}").format(i,), pos=self.view.search("favs_timelines", session.db["user_name"])) self.view.insert_buffer(tl.buffer, name=_(u"Likes for {}").format(i,), pos=self.view.search("favs_timelines", session.db["user_name"]))
tl.timer = RepeatingTimer(300, tl.start_stream) tl.timer = RepeatingTimer(300, tl.start_stream)
@@ -373,7 +375,7 @@ class Controller(object):
self.buffers.append(lists) self.buffers.append(lists)
self.view.insert_buffer(lists.buffer , name=_(u"Lists"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) self.view.insert_buffer(lists.buffer , name=_(u"Lists"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
for i in session.settings["other_buffers"]["lists"]: for i in session.settings["other_buffers"]["lists"]:
tl = buffersController.listBufferController(self.view.nb, "get_list_statuses", "%s-list" % (i,), session, session.db["user_name"], bufferType=None, list_id=utils.find_list(i, session.db["lists"])) tl = buffersController.listBufferController(self.view.nb, "get_list_statuses", "%s-list" % (i,), session, session.db["user_name"], bufferType=None, list_id=utils.find_list(i, session.db["lists"]), tweet_mode="extended")
session.lists.append(tl) session.lists.append(tl)
self.buffers.append(tl) self.buffers.append(tl)
self.view.insert_buffer(tl.buffer, name=_(u"List for {}").format(i), pos=self.view.search("lists", session.db["user_name"])) self.view.insert_buffer(tl.buffer, name=_(u"List for {}").format(i), pos=self.view.search("lists", session.db["user_name"]))
@@ -381,7 +383,7 @@ class Controller(object):
self.buffers.append(searches) self.buffers.append(searches)
self.view.insert_buffer(searches.buffer , name=_(u"Searches"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) self.view.insert_buffer(searches.buffer , name=_(u"Searches"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
for i in session.settings["other_buffers"]["tweet_searches"]: for i in session.settings["other_buffers"]["tweet_searches"]:
tl = buffersController.searchBufferController(self.view.nb, "search", "%s-searchterm" % (i,), session, session.db["user_name"], bufferType="searchPanel", q=i, count=session.settings["general"]["max_tweets_per_call"]) tl = buffersController.searchBufferController(self.view.nb, "search", "%s-searchterm" % (i,), session, session.db["user_name"], bufferType="searchPanel", q=i, count=session.settings["general"]["max_tweets_per_call"], tweet_mode="extended")
self.buffers.append(tl) self.buffers.append(tl)
self.view.insert_buffer(tl.buffer, name=_(u"Search for {}").format(i), pos=self.view.search("searches", session.db["user_name"])) self.view.insert_buffer(tl.buffer, name=_(u"Search for {}").format(i), pos=self.view.search("searches", session.db["user_name"]))
tl.timer = RepeatingTimer(180, tl.start_stream) tl.timer = RepeatingTimer(180, tl.start_stream)
@@ -478,6 +480,18 @@ class Controller(object):
output.speak(_(u"{0} not found.").format(string,), True) output.speak(_(u"{0} not found.").format(string,), True)
page.buffer.list.select_item(start) page.buffer.list.select_item(start)
def seekLeft(self, *args, **kwargs):
try:
sound.URLPlayer.seek(-5)
except:
output.speak("Unable to seek.",True)
def seekRight(self, *args, **kwargs):
try:
sound.URLPlayer.seek(5)
except:
output.speak("Unable to seek.",True)
def edit_keystrokes(self, *args, **kwargs): def edit_keystrokes(self, *args, **kwargs):
editor = keystrokeEditor.KeystrokeEditor() editor = keystrokeEditor.KeystrokeEditor()
if editor.changed == True: if editor.changed == True:

View File

@@ -147,10 +147,11 @@ class tweet(basicTweet):
class reply(tweet): class reply(tweet):
def __init__(self, session, title, caption, text, twishort_enabled, users=None): def __init__(self, session, title, caption, text, twishort_enabled, users=None):
super(reply, self).__init__(session, title, caption, text, twishort_enabled, messageType="reply") super(reply, self).__init__(session, title, caption, text, twishort_enabled, messageType="reply")
self.users = users self.message.mentionAll.SetValue(True)
if self.users != None and len(self.users) > 1: if len(users) > 1:
widgetUtils.connect_event(self.message.mentionAll, widgetUtils.BUTTON_PRESSED, self.mention_all) # widgetUtils.connect_event(self.message.mentionAll, widgetUtils.CHECKBOX, self.mention_all)
self.message.enable_button("mentionAll") self.message.enable_button("mentionAll")
self.message.mentionAll.SetValue(self.session.settings["mysc"]["mention_all"])
self.message.set_cursor_at_end() self.message.set_cursor_at_end()
self.text_processor() self.text_processor()
@@ -184,10 +185,10 @@ class viewTweet(basicTweet):
if tweetList[i].has_key("message") and tweetList[i]["is_quote_status"] == False: if tweetList[i].has_key("message") and tweetList[i]["is_quote_status"] == False:
value = "message" value = "message"
else: else:
value = "text" value = "full_text"
if tweetList[i].has_key("retweeted_status") and tweetList[i]["is_quote_status"] == False: if tweetList[i].has_key("retweeted_status") and tweetList[i]["is_quote_status"] == False:
if tweetList[i].has_key("message") == False: if tweetList[i].has_key("message") == False:
text = text + "rt @%s: %s\n" % (tweetList[i]["retweeted_status"]["user"]["screen_name"], tweetList[i]["retweeted_status"]["text"]) text = text + "rt @%s: %s\n" % (tweetList[i]["retweeted_status"]["user"]["screen_name"], tweetList[i]["retweeted_status"]["full_text"])
else: else:
text = text + "rt @%s: %s\n" % (tweetList[i]["retweeted_status"]["user"]["screen_name"], tweetList[i][value]) text = text + "rt @%s: %s\n" % (tweetList[i]["retweeted_status"]["user"]["screen_name"], tweetList[i][value])
else: else:
@@ -206,10 +207,10 @@ class viewTweet(basicTweet):
if tweet.has_key("message"): if tweet.has_key("message"):
value = "message" value = "message"
else: else:
value = "text" value = "full_text"
if tweet.has_key("retweeted_status"): if tweet.has_key("retweeted_status"):
if tweet.has_key("message") == False: if tweet.has_key("message") == False:
text = "rt @%s: %s" % (tweet["retweeted_status"]["user"]["screen_name"], tweet["retweeted_status"]["text"]) text = "rt @%s: %s" % (tweet["retweeted_status"]["user"]["screen_name"], tweet["retweeted_status"]["full_text"])
else: else:
text = "rt @%s: %s" % (tweet["retweeted_status"]["user"]["screen_name"], tweet[value]) text = "rt @%s: %s" % (tweet["retweeted_status"]["user"]["screen_name"], tweet[value])
else: else:

View File

@@ -11,11 +11,11 @@ right = string(default="alt+win+right")
next_account = string(default="alt+win+shift+right") next_account = string(default="alt+win+shift+right")
previous_account = string(default="alt+win+shift+left") previous_account = string(default="alt+win+shift+left")
open_conversation = string(default="alt+win+c") open_conversation = string(default="alt+win+c")
show_hide = string(default="alt+win+w") show_hide = string(default="control+win+w")
post_tweet = string(default="alt+win+n") post_tweet = string(default="alt+win+n")
post_reply = string(default="control+win+r") post_reply = string(default="control+win+r")
post_retweet = string(default="alt+win+shift+r") post_retweet = string(default="alt+win+shift+r")
send_dm = string(default="alt+win+d") send_dm = string(default="alt+win+shift+d")
add_to_favourites = string(default="alt+win+f") add_to_favourites = string(default="alt+win+f")
remove_from_favourites = string(default="alt+shift+win+f") remove_from_favourites = string(default="alt+shift+win+f")
follow = string(default="alt+win+s") follow = string(default="alt+win+s")

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

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

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

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -24,7 +24,11 @@ def is_long(tweet):
return False return False
def clear_url(tweet): def clear_url(tweet):
urls = utils.find_urls_in_text(tweet["text"]) if tweet.has_key("full_text"):
value = "full_text"
else:
value = "text"
urls = utils.find_urls_in_text(tweet[value])
try: tweet["message"] = tweet["message"].replace(urls[-1], "") try: tweet["message"] = tweet["message"].replace(urls[-1], "")
except IndexError: pass except IndexError: pass
return tweet return tweet

View File

@@ -18,8 +18,8 @@
############################################################ ############################################################
import requests import requests
import keys import keys
import application
from twitter import utils from twitter import utils
from requests_oauthlib import OAuth1Session
def get_twishort_uri(url): def get_twishort_uri(url):
try: try:
@@ -30,25 +30,39 @@ def get_twishort_uri(url):
def is_long(tweet): def is_long(tweet):
long = False long = False
for url in range(0, len(tweet["entities"]["urls"])): for url in range(0, len(tweet["entities"]["urls"])):
try:
if "twishort.com" in tweet["entities"]["urls"][url]["expanded_url"]: if "twishort.com" in tweet["entities"]["urls"][url]["expanded_url"]:
long = get_twishort_uri(tweet["entities"]["urls"][url]["expanded_url"]) long = get_twishort_uri(tweet["entities"]["urls"][url]["expanded_url"])
except TypeError:
pass
return long return long
def get_full_text(uri): def get_full_text(uri):
# try: try:
r = requests.get("http://api.twishort.com/1.1/get.json", params={"uri": uri, "api_key": keys.keyring.get("twishort_api_key")}) r = requests.get("http://api.twishort.com/1.1/get.json", params={"uri": uri, "api_key": keys.keyring.get("twishort_api_key")})
return r.json()["text"] return r.json()["text"]
# except: except:
# return False return False
def create_tweet(user_token, user_secret, text, media=0): def create_tweet(user_token, user_secret, text, media=0):
if application.snapshot == True: twitter = OAuth1Session(keys.keyring.get("api_key"), client_secret=keys.keyring.get("api_secret"), resource_owner_key=user_token, resource_owner_secret=user_secret)
url = "http://twblue.es/snapshot_twishort.php" twishort_key=keys.keyring.get("twishort_api_key")
else: x_auth_service_provider = "https://api.twitter.com/1.1/account/verify_credentials.json"
url = "http://twblue.es/stable_twishort.php" twishort_post_url = "http://api.twishort.com/1.1/post.json"
data = {"user_token": user_token, twishort_update_ids_url = "http://api.twishort.com/1.1/update_ids.json"
"user_secret": user_secret, r=requests.Request('GET', x_auth_service_provider)
prep=twitter.prepare_request(r)
resp=twitter.send(prep)
twitter.headers={
'X-Auth-Service-Provider':x_auth_service_provider,
'X-Verify-Credentials-Authorization':prep.headers['Authorization'],
}
data = {'api_key':twishort_key,
"text": text.encode("utf-8"), "text": text.encode("utf-8"),
"media": media} "media": media}
response = requests.post(url, data=data) response = twitter.post(twishort_post_url, data=data)
try:
return response.json()["text_to_tweet"] return response.json()["text_to_tweet"]
except:
print "There was a problem creating a long tweet"
return 0

View File

@@ -26,8 +26,9 @@ def stream_threaded(func, *args, **kwargs):
def new_func(*a, **k): def new_func(*a, **k):
try: try:
func(**k) func(**k)
except: except exception as msg:
log.error("Error in stream with args: %r" % (a,)) log.error("Error in stream with args: %r" % (a,))
log.error(msg.message)
pub.sendMessage("stream-error", session=a[0]) pub.sendMessage("stream-error", session=a[0])
thread = threading.Thread(target=new_func, args=args, kwargs=kwargs) thread = threading.Thread(target=new_func, args=args, kwargs=kwargs)

View File

@@ -432,17 +432,21 @@ class Session(object):
def get_quoted_tweet(self, tweet): def get_quoted_tweet(self, tweet):
quoted_tweet = tweet quoted_tweet = tweet
urls = utils.find_urls_in_text(quoted_tweet["text"]) if tweet.has_key("full_text"):
value = "full_text"
else:
value = "text"
urls = utils.find_urls_in_text(quoted_tweet[value])
for url in range(0, len(urls)): for url in range(0, len(urls)):
try: quoted_tweet["text"] = quoted_tweet["text"].replace(urls[url], quoted_tweet["entities"]["urls"][url]["expanded_url"]) try: quoted_tweet[value] = quoted_tweet[value].replace(urls[url], quoted_tweet["entities"]["urls"][url]["expanded_url"])
except IndexError: pass except IndexError: pass
id = tweets.is_long(quoted_tweet) id = tweets.is_long(quoted_tweet)
try: original_tweet = self.twitter.twitter.show_status(id=id) try: original_tweet = self.twitter.twitter.show_status(id=id, tweet_mode="extended")
except: return quoted_tweet except: return quoted_tweet
original_tweet = self.check_long_tweet(original_tweet) original_tweet = self.check_long_tweet(original_tweet)
urls = utils.find_urls_in_text(original_tweet["text"]) urls = utils.find_urls_in_text(original_tweet["full_text"])
for url in range(0, len(urls)): for url in range(0, len(urls)):
try: original_tweet["text"] = original_tweet["text"].replace(urls[url], original_tweet["entities"]["urls"][url]["expanded_url"]) try: original_tweet["full_text"] = original_tweet["full_text"].replace(urls[url], original_tweet["entities"]["urls"][url]["expanded_url"])
except IndexError: pass except IndexError: pass
return compose.compose_quoted_tweet(quoted_tweet, original_tweet) return compose.compose_quoted_tweet(quoted_tweet, original_tweet)

View File

@@ -117,6 +117,22 @@ class URLStream(object):
log.debug("Transformed URL: %s. Prepared" % (self.url,)) log.debug("Transformed URL: %s. Prepared" % (self.url,))
self.prepared = True self.prepared = True
def seek(self,step):
pos=self.stream.get_position()
pos=self.stream.bytes_to_seconds(pos)
pos+=step
pos=self.stream.seconds_to_bytes(pos)
if pos<0:
pos=0
self.stream.set_position(pos)
def playpause(self):
if self.stream.is_playing==True:
self.stream.pause()
else:
self.stream.play()
def play(self, url=None, volume=1.0, stream=None,announce=True): def play(self, url=None, volume=1.0, stream=None,announce=True):
if announce: if announce:
output.speak(_(u"Playing...")) output.speak(_(u"Playing..."))

View File

@@ -17,5 +17,4 @@ class handler(BaseHTTPServer.BaseHTTPRequestHandler):
params = parse_qs(urlparse(self.path).query) params = parse_qs(urlparse(self.path).query)
global verifier global verifier
verifier = params.get('oauth_verifier', [None])[0] verifier = params.get('oauth_verifier', [None])[0]
self.wfile.write("You have successfully logged into Twitter with" + application.name + ". " self.wfile.write(_(u"You have successfully logged into Twitter with {0}. You can close this window now.").format(application.name))
"You can close this window now.")

View File

@@ -67,8 +67,12 @@ class timelinesStreamer(TwythonStreamer):
self.friends = friends self.friends = friends
def on_success(self, data): def on_success(self, data):
try: # try:
if "text" in data and utils.is_allowed(data, self.session.settings["twitter"]["ignored_clients"]) == True: if "text" in data and utils.is_allowed(data, self.session.settings["twitter"]["ignored_clients"]) == True:
if data.has_key("extended_tweet"):
data["full_text"] = data["extended_tweet"]["full_text"]
# data["entities"] = data["extended_tweet"]["entities"]
# log.error(data["extended_entities"])
self.check_tls(data) self.check_tls(data)
except: # except:
pass # pass

View File

@@ -135,6 +135,11 @@ class streamer(TwythonStreamer):
self.friends = data["friends"] self.friends = data["friends"]
pub.sendMessage("friends-receibed") pub.sendMessage("friends-receibed")
elif "text" in data and utils.is_allowed(data, self.session.settings["twitter"]["ignored_clients"]) == True: elif "text" in data and utils.is_allowed(data, self.session.settings["twitter"]["ignored_clients"]) == True:
if data.has_key("extended_tweet"):
data["full_text"] = data["extended_tweet"]["full_text"]
# data["entities"].extend(data["extended_tweet"]["entities"])
# log.error(data["extended_tweet"])
# log.error("Extended tweet")
if data["user"]["id"] in self.muted_users: return if data["user"]["id"] in self.muted_users: return
self.check_mentions(data) self.check_mentions(data)
self.check_send(data) self.check_send(data)

View File

@@ -40,47 +40,75 @@ def compose_tweet(tweet, db, relative_times):
ts = tweet["created_at"] ts = tweet["created_at"]
if tweet.has_key("message"): if tweet.has_key("message"):
value = "message" value = "message"
elif tweet.has_key("full_text"):
value = "full_text"
else: else:
value = "text" value = "text"
# log.exception(tweet.keys())
text = StripChars(tweet[value]) text = StripChars(tweet[value])
if tweet.has_key("sender"):
source = "DM"
if db["user_name"] == tweet["sender"]["screen_name"]: user = _(u"Dm to %s ") % (tweet["recipient"]["name"],)
else: user = tweet["sender"]["name"]
elif tweet.has_key("user"):
user = tweet["user"]["name"] user = tweet["user"]["name"]
source = re.sub(r"(?s)<.*?>", "", tweet["source"]) source = re.sub(r"(?s)<.*?>", "", tweet["source"])
if tweet.has_key("retweeted_status"): if tweet.has_key("retweeted_status"):
if tweet.has_key("message") == False and tweet["retweeted_status"]["is_quote_status"] == False: if tweet.has_key("message") == False and tweet["retweeted_status"]["is_quote_status"] == False:
text = "RT @%s: %s" % (tweet["retweeted_status"]["user"]["screen_name"], StripChars(tweet["retweeted_status"]["text"])) text = "RT @%s: %s" % (tweet["retweeted_status"]["user"]["screen_name"], StripChars(tweet["retweeted_status"][value]))
elif tweet["retweeted_status"]["is_quote_status"]: elif tweet["retweeted_status"]["is_quote_status"]:
text = "%s" % (StripChars(tweet[value])) text = "%s" % (StripChars(tweet[value]))
else: else:
text = "RT @%s: %s" % (tweet["retweeted_status"]["user"]["screen_name"], StripChars(tweet[value])) text = "RT @%s: %s" % (tweet["retweeted_status"]["user"]["screen_name"], StripChars(tweet[value]))
if text[-1] in chars: text=text+"." # if text[-1] in chars: text=text+"."
if tweet.has_key("message") == False: if tweet.has_key("message") == False:
urls = utils.find_urls_in_text(text) urls = utils.find_urls_in_text(text)
for url in range(0, len(urls)): for url in range(0, len(urls)):
try: text = text.replace(urls[url], tweet["entities"]["urls"][url]["expanded_url"]) try:
except IndexError: pass log.error(urls[url])
log.error(tweet["entities"]["urls"][url])
text = text.replace(urls[url], tweet["entities"]["urls"][url]["expanded_url"])
except: pass
if config.app['app-settings']['handle_longtweets']: pass if config.app['app-settings']['handle_longtweets']: pass
# return [user+", ", text, ts+", ", source] # return [user+", ", text, ts+", ", source]
return [user+", ", text, ts+", ", source] return [user+", ", text, ts+", ", source]
def compose_dm(tweet, db, relative_times):
""" It receives a tweet and returns a list with the user, text for the tweet or message, date and the client where user is."""
if system == "Windows":
original_date = arrow.get(tweet["created_at"], "ddd MMM DD H:m:s Z YYYY", locale="en")
if relative_times == True:
ts = original_date.humanize(locale=languageHandler.getLanguage())
else:
ts = original_date.replace(seconds=db["utc_offset"]).format(_(u"dddd, MMMM D, YYYY H:m:s"), locale=languageHandler.getLanguage())
else:
ts = tweet["created_at"]
text = StripChars(tweet["text"])
source = "DM"
if db["user_name"] == tweet["sender"]["screen_name"]: user = _(u"Dm to %s ") % (tweet["recipient"]["name"],)
else: user = tweet["sender"]["name"]
if text[-1] in chars: text=text+"."
urls = utils.find_urls_in_text(text)
for url in range(0, len(urls)):
try: text = text.replace(urls[url], tweet["entities"]["urls"][url]["expanded_url"])
except IndexError: pass
return [user+", ", text, ts+", ", source]
def compose_quoted_tweet(quoted_tweet, original_tweet): def compose_quoted_tweet(quoted_tweet, original_tweet):
""" It receives a tweet and returns a list with the user, text for the tweet or message, date and the client where user is.""" """ It receives a tweet and returns a list with the user, text for the tweet or message, date and the client where user is."""
text = StripChars(quoted_tweet["text"]) if quoted_tweet.has_key("full_text"):
value = "full_text"
else:
value = "text"
text = StripChars(quoted_tweet[value])
quoting_user = quoted_tweet["user"]["name"] quoting_user = quoted_tweet["user"]["name"]
source = re.sub(r"(?s)<.*?>", "", quoted_tweet["source"]) source = re.sub(r"(?s)<.*?>", "", quoted_tweet["source"])
try: text = "rt @%s: %s" % (quoted_tweet["retweeted_status"]["user"]["screen_name"], StripChars(quoted_tweet["retweeted_status"]["text"])) try: text = "rt @%s: %s" % (quoted_tweet["retweeted_status"]["user"]["screen_name"], StripChars(quoted_tweet["retweeted_status"][value]))
except KeyError: text = "%s" % (StripChars(quoted_tweet["text"])) except KeyError: text = "%s" % (StripChars(quoted_tweet[value]))
if text[-1] in chars: text=text+"." if text[-1] in chars: text=text+"."
original_user = original_tweet["user"]["screen_name"] original_user = original_tweet["user"]["screen_name"]
if original_tweet.has_key("message"): if original_tweet.has_key("message"):
original_text = StripChars(original_tweet["message"]) original_text = StripChars(original_tweet["message"])
elif original_tweet.has_key("full_text"):
original_text = StripChars(original_tweet["full_text"])
else: else:
original_text = StripChars(original_tweet["text"]) original_text = StripChars(original_tweet["text"])
quoted_tweet["message"] = _(u"{0}. Quoted tweet from @{1}: {2}").format( quoted_tweet["text"], original_user, original_text) quoted_tweet["message"] = _(u"{0}. Quoted tweet from @{1}: {2}").format( quoted_tweet[value], original_user, original_text)
quoted_tweet = tweets.clear_url(quoted_tweet) quoted_tweet = tweets.clear_url(quoted_tweet)
return quoted_tweet return quoted_tweet

View File

@@ -25,6 +25,8 @@ def find_urls (tweet):
urls = [] urls = []
if tweet.has_key("message"): if tweet.has_key("message"):
i = "message" i = "message"
elif tweet.has_key("full_text"):
i = "full_text"
else: else:
i = "text" i = "text"
return [s[0] for s in url_re.findall(tweet[i])] return [s[0] for s in url_re.findall(tweet[i])]
@@ -57,6 +59,7 @@ def is_audio(tweet):
if i["text"] == "audio": if i["text"] == "audio":
return True return True
except: except:
print tweet["entities"]["hashtags"]
log.exception("Exception while executing is_audio hashtag algorithm") log.exception("Exception while executing is_audio hashtag algorithm")
def is_geocoded(tweet): def is_geocoded(tweet):
@@ -68,8 +71,8 @@ def get_all_mentioned(tweet, conf):
string = [] string = []
for i in tweet["entities"]["user_mentions"]: for i in tweet["entities"]["user_mentions"]:
if i["screen_name"] != conf["user_name"] and i["screen_name"] != tweet["user"]["screen_name"]: if i["screen_name"] != conf["user_name"] and i["screen_name"] != tweet["user"]["screen_name"]:
if "@"+i["screen_name"] not in string: if i["id"] not in string:
string.append("@"+i["screen_name"]) string.append(i["id_str"])
return " ".join(string)+" " return " ".join(string)+" "
def get_all_users(tweet, conf): def get_all_users(tweet, conf):
@@ -120,7 +123,7 @@ def is_allowed(tweet, clients):
for i in clients: for i in clients:
if i.lower() == source.lower(): if i.lower() == source.lower():
allowed = False allowed = False
log.exception("Tuit not allowed: %s" % (tweet["text"],)) # log.exception("Tuit not allowed: %r" % (tweet,))
return allowed return allowed
def twitter_error(error): def twitter_error(error):

View File

@@ -234,7 +234,7 @@ class reply(tweet):
def __init__(self, title, message, text): def __init__(self, title, message, text):
super(reply, self).__init__(message, title, text) super(reply, self).__init__(message, title, text)
self.text.SetInsertionPoint(len(self.text.GetValue())) self.text.SetInsertionPoint(len(self.text.GetValue()))
self.mentionAll = wx.Button(self, -1, _(u"&Mention to all"), size=wx.DefaultSize) self.mentionAll = wx.CheckBox(self, -1, _(u"&Mention to all"), size=wx.DefaultSize)
self.mentionAll.Disable() self.mentionAll.Disable()
self.buttonsBox1.Add(self.mentionAll, 0, wx.ALL, 5) self.buttonsBox1.Add(self.mentionAll, 0, wx.ALL, 5)
self.buttonsBox1.Layout() self.buttonsBox1.Layout()

View File

@@ -57,6 +57,11 @@ class mainFrame(wx.Frame):
self.clear = buffer.Append(wx.NewId(), _(u"&Clear buffer")) self.clear = buffer.Append(wx.NewId(), _(u"&Clear buffer"))
self.deleteTl = buffer.Append(wx.NewId(), _(u"&Destroy")) self.deleteTl = buffer.Append(wx.NewId(), _(u"&Destroy"))
# audio menu
audio = wx.Menu()
self.seekLeft = audio.Append(wx.NewId(), _(u"&Seek back 5 seconds"))
self.seekRight = audio.Append(wx.NewId(), _(u"&Seek forward 5 seconds"))
# Help Menu # Help Menu
help = wx.Menu() help = wx.Menu()
self.doc = help.Append(-1, _(u"&Documentation")) self.doc = help.Append(-1, _(u"&Documentation"))
@@ -72,6 +77,7 @@ class mainFrame(wx.Frame):
menuBar.Append(tweet, _(u"&Tweet")) menuBar.Append(tweet, _(u"&Tweet"))
menuBar.Append(user, _(u"&User")) menuBar.Append(user, _(u"&User"))
menuBar.Append(buffer, _(u"&Buffer")) menuBar.Append(buffer, _(u"&Buffer"))
menuBar.Append(audio, _(u"&Audio"))
menuBar.Append(help, _(u"&Help")) menuBar.Append(help, _(u"&Help"))
self.accel_tbl = wx.AcceleratorTable([ self.accel_tbl = wx.AcceleratorTable([
@@ -88,7 +94,10 @@ class mainFrame(wx.Frame):
(wx.ACCEL_CTRL, ord('I'), self.timeline.GetId()), (wx.ACCEL_CTRL, ord('I'), self.timeline.GetId()),
(wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('I'), self.deleteTl.GetId()), (wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('I'), self.deleteTl.GetId()),
(wx.ACCEL_CTRL, ord('M'), self.show_hide.GetId()), (wx.ACCEL_CTRL, ord('M'), self.show_hide.GetId()),
(wx.ACCEL_CTRL, wx.WXK_LEFT, self.seekLeft.GetId()),
(wx.ACCEL_CTRL, ord('P'), self.updateProfile.GetId()), (wx.ACCEL_CTRL, ord('P'), self.updateProfile.GetId()),
(wx.ACCEL_CTRL, wx.WXK_RIGHT, self.seekRight.GetId()),
(wx.ACCEL_CTRL, ord(' '), self.seekLeft.GetId()),
]) ])
self.SetAcceleratorTable(self.accel_tbl) self.SetAcceleratorTable(self.accel_tbl)

View File

@@ -5,7 +5,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2016-08-05 08:33+Hora de verano central (M<>xico)\n" "POT-Creation-Date: 2016-10-02 21:05+Hora de verano romance\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
{"current_version": "0.85", {"current_version": "0.87",
"description": "The first version for the new generation of TWBlue.", "description": "The first version for the new generation of TWBlue.",
"downloads": "downloads":
{"Windows32": "http://twblue.es/pubs/twblue_ngen_0.80_x86.zip", {"Windows32": "http://twblue.es/pubs/twblue_ngen_0.80_x86.zip",