diff --git a/contributors.txt b/contributors.txt index 436c4ba8..90686177 100644 --- a/contributors.txt +++ b/contributors.txt @@ -39,5 +39,5 @@ florian Ionașcu Christian Leo Mameli Natalia Hedlund (Наталья Хедлунд) Valeria (Валерия) -Oreonan +Corentin Bacqué-Cazenave Artem Plaksin (maniyax) diff --git a/doc/changelog.md b/doc/changelog.md index 1222937d..83d7022f 100644 --- a/doc/changelog.md +++ b/doc/changelog.md @@ -1,12 +1,34 @@ TWBlue Changelog - ## changes in this version +* We have added Experimental support for templates in the invisible interface. The GUI will remain unchanged for now: + * Each object (tweet, received direct message, sent direct message and people) has its own template in the settings. You can edit those templates from the account settings dialog, in the new "templates" tab. + * Every template is composed of the group of variables you want to display for each object. Each variable will start with a dollar sign ($) and cannot contain spaces or special characters. Templates can include arbitrary text that will not be processed. When editing the example templates, you can get an idea of the variables that are available for each object by using the template editing dialog. When you press enter on a variable from the list of available variables, it will be added to the template automatically. When you try to save a template, TWBlue will warn you if the template is incorrectly formatted or if it includes variables that do not exist in the information provided by objects. It is also possible to return to default values from the same dialog when editing a template. + * TWBlue can display image descriptions within Tweet templates. For that, you can use the $image_description variable in your template. +* We have restored conversation and threads support powered by Twitter API V2 thanks to a set of improvements we have done in the application, as well as more generous limits to Tweet monthly cap by Twitter. +* In the Windows 11 Keymap, the default shortcut to open the keystrokes editor is now CTRL+Alt+Windows+K to avoid conflicts with the new global mute microphone shortcut. +* TWBlue show display properly HTML entities in tweet's text. +* TWBlue should no longer load old tweets in buffers. +* Fixed issue when uploading attachments (images, videos or gif files) while sending tweets or replies. +* Fixed an error that was making TWBlue to ask for a restart after saving account settings, even if such restart was not required. ([#413,](https://github.com/manuelcortez/TWBlue/issues/413)) + +## Changes in version 2021.11.12 + +* Now it is possible to create a tweet from a trending topics buffer again. +* TWBlue now includes a completely new set of dialogs to handle tweeting, replying and sending direct messages that takes advantage of more Twitter features. + * It is possible to add videos in tweets and direct messages by using the new "add" button, located in every dialog where media can be added. Twitter suggests to add videos from 5 seconds up to 2 minutes lenght, in mp4 format (video Codec H.264 and audio codec AAC). Currently, TWBlue does not check if the uploaded video complies with Twitter media requirements. You can add only a video in a tweet or direct message. No other kind of media can be added after a video is in a tweet. If the video was unable to be uploaded successfully, the tweet or direct message won't be created. + * Now you can add a poll to tweets. Polls can have up to 4 different options and allow voting up to 7 days after being created. Take into account, though, that currently TWBlue does not support reading polls in tweets. + * TWBlue now support threads while creating a new tweet. There is a new button, called add tweet which will add the current tweet to the thread and will allow you to write another tweet in the thread. Every tweet might include media (up to 4 photos, or one GIF image or a video) or up to one poll. + * Some functionality was removed from tweet dialogs within TWBlue. Particularly, URL shorteners and long tweets via Twishort. You still can read long tweets posted via Twishort, though. + +## Changes in version 2021.11.07 + * TWBlue should retrieve tweets from threads and conversations in a more reliable way. Tweets in the same thread (made by the same author) will be sorted correctly, although replies to the thread (made by different people) may not be ordered in the same way they are displayed in Twitter apps. ([#417](https://github.com/manuelcortez/TWBlue/issues/417)) -* fixed a bug when clearing the direct messages buffer. ([#418](https://github.com/manuelcortez/TWBlue/issues/418)) -* fixed an issue that was making TWBlue to show incorrectly titles for trending topic buffers upon startup. ([#421](https://github.com/manuelcortez/TWBlue/issues/421)) * When creating a filter, TWBlue will show an error if user has not provided a name for the filter. Before, unnamed filters were a cause of config breaks in the application. * It is again possible to read the changelog for TWBlue from the help menu in the menu bar. +* fixed a bug when clearing the direct messages buffer. ([#418](https://github.com/manuelcortez/TWBlue/issues/418)) +* fixed an issue that was making TWBlue to show incorrectly titles for trending topic buffers upon startup. ([#421](https://github.com/manuelcortez/TWBlue/issues/421)) +* fixed an issue that was making users of the graphical user interface to delete a buffer if a trends buffer was opened in the same session. * Updated Spanish, Japanese and french translations. ## Changes in Version 2021.10.30 diff --git a/doc/locales/es/LC_MESSAGES/twblue-changelog.mo b/doc/locales/es/LC_MESSAGES/twblue-changelog.mo index 5ec37f0d..82dbe54f 100644 Binary files a/doc/locales/es/LC_MESSAGES/twblue-changelog.mo and b/doc/locales/es/LC_MESSAGES/twblue-changelog.mo differ diff --git a/doc/locales/es/LC_MESSAGES/twblue-changelog.po b/doc/locales/es/LC_MESSAGES/twblue-changelog.po index f6103073..36d645ee 100644 --- a/doc/locales/es/LC_MESSAGES/twblue-changelog.po +++ b/doc/locales/es/LC_MESSAGES/twblue-changelog.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: manuel@manuelcortez.net\n" -"POT-Creation-Date: 2021-11-01 16:17-0600\n" -"PO-Revision-Date: 2021-11-01 17:01-0600\n" +"POT-Creation-Date: 2021-11-12 12:52-0600\n" +"PO-Revision-Date: 2021-11-12 13:08-0600\n" "Last-Translator: José Manuel Delicado \n" "Language-Team: \n" "Language: es\n" @@ -22,12 +22,90 @@ msgstr "" msgid "TWBlue Changelog" msgstr "Lista de cambios de TWBlue" -#: changelog.py:5 changelog.py:7 +#: changelog.py:5 msgid "## changes in this version" msgstr "## Cambios en esta versión" +#: changelog.py:7 +msgid "" +"* Now it is possible to create a tweet from a trending topics buffer again." +msgstr "" +"* De nuevo es posible crear un tweet desde un buffer de Tendencias.* Es " +"posible añadir tuits al buffer de me gusta desde la barra de menú otra vez." + +#: changelog.py:8 +msgid "" +"* TWBlue now includes a completely new set of dialogs to handle tweeting, " +"replying and sending direct messages that takes advantage of more Twitter " +"features." +msgstr "" +"* TWBlue incluye ahora un conjunto completamente nuevo de diálogos para " +"gestionar los tweets, las respuestas y el envío de mensajes directos que " +"aprovechan más funciones de la API de Twitter." + #: changelog.py:9 msgid "" +" * It is possible to add videos in tweets and direct messages by using " +"the new \"add\" button, located in every dialog where media can be added. " +"Twitter suggests to add videos from 5 seconds up to 2 minutes lenght, in mp4 " +"format (video Codec H.264 and audio codec AAC). Currently, TWBlue does not " +"check if the uploaded video complies with Twitter media requirements. You " +"can add only a video in a tweet or direct message. No other kind of media " +"can be added after a video is in a tweet. If the video was unable to be " +"uploaded successfully, the tweet or direct message won't be created." +msgstr "" +" * Ahora ya es posible añadir vídeos en los tweets y mensajes directos " +"utilizando el nuevo botón \"añadir\", situado en todos los diálogos donde se " +"pueden añadir medios. Twitter sugiere añadir vídeos de entre 5 segundos y 2 " +"minutos de duración, en formato mp4 (códec de vídeo H.264 y códec de audio " +"AAC). Actualmente, TWBlue no comprueba si el vídeo subido cumple con los " +"requisitos de los medios de comunicación de Twitter. Sólo se puede añadir un " +"vídeo en un tweet o mensaje directo. No se puede añadir ningún otro tipo de " +"medio después de que un vídeo esté en un tweet. Si el vídeo no se ha podido " +"subir con éxito, el tuit o el mensaje directo no se creará." + +#: changelog.py:10 +msgid "" +" * Now you can add a poll to tweets. Polls can have up to 4 different " +"options and allow voting up to 7 days after being created. Take into " +"account, though, that currently TWBlue does not support reading polls in " +"tweets." +msgstr "" +" * Ahora puedes añadir una encuesta a los tweets. Las encuestas pueden " +"tener hasta 4 opciones diferentes y permiten votar hasta 7 días después de " +"ser creadas. Ten en cuenta, sin embargo, que actualmente TWBlue no soporta " +"la lectura de encuestas en los tweets." + +#: changelog.py:11 +msgid "" +" * TWBlue now support threads while creating a new tweet. There is a new " +"button, called add tweet which will add the current tweet to the thread and " +"will allow you to write another tweet in the thread. Every tweet might " +"include media (up to 4 photos, or one GIF image or a video) or up to one " +"poll." +msgstr "" +" * TWBlue ahora soporta hilos mientras se crea un nuevo tweet. Hay un " +"nuevo botón, llamado añadir tweet, que añadirá el tweet actual al hilo y te " +"permitirá escribir otro tweet en el hilo. Cada tweet puede incluir medios " +"(hasta 4 fotos, o una imagen GIF o un video) y una encuesta." + +#: changelog.py:12 +msgid "" +" * Some functionality was removed from tweet dialogs within TWBlue. " +"Particularly, URL shorteners and long tweets via Twishort. You still can " +"read long tweets posted via Twishort, though." +msgstr "" +" * Se han eliminado algunas características de los diálogos de tweets en " +"TWBlue. En particular, los acortadores de URL y los tweets largos a través " +"de Twishort. Sin embargo, todavía se pueden leer los tweets largos " +"publicados a través de Twishort." + +#: changelog.py:14 +msgid "## Changes in version 2021.11.07" +msgstr "## Cambios en la versión 2021.11.07" + +#: changelog.py:16 +msgid "" "* TWBlue should retrieve tweets from threads and conversations in a more " "reliable way. Tweets in the same thread (made by the same author) will be " "sorted correctly, although replies to the thread (made by different people) " @@ -40,7 +118,29 @@ msgstr "" "mostrar en un orden diferente al que se muestra en las aplicaciones de " "Twitter. ([#417](https://github.com/manuelcortez/TWBlue/issues/417))" -#: changelog.py:10 +#: changelog.py:17 +msgid "" +"* When creating a filter, TWBlue will show an error if user has not provided " +"a name for the filter. Before, unnamed filters were a cause of config breaks " +"in the application." +msgstr "" +"* Al crear un filtro, TWBlue mostrará un error si el usuario no ha " +"proporcionado un nombre para el filtro. Antes, los filtros sin nombre se " +"guardaban en la configuración y causaban errores al iniciar la aplicación." + +#: changelog.py:18 +#, fuzzy +#| msgid "" +#| "* It is possible to add a tweet to the likes buffer from the menu bar " +#| "again." +msgid "" +"* It is again possible to read the changelog for TWBlue from the help menu " +"in the menu bar." +msgstr "" +"* Es posible añadir tuits al buffer de me gusta desde la barra de menú otra " +"vez." + +#: changelog.py:19 msgid "" "* fixed a bug when clearing the direct messages buffer. ([#418](https://" "github.com/manuelcortez/TWBlue/issues/418))" @@ -50,7 +150,7 @@ msgstr "" "problema en el Streaming API que causaba que TWBlue desconectara el " "Streaming. ([#103](https://github.com/manuelcortez/TWBlue/issues/103))" -#: changelog.py:11 +#: changelog.py:20 msgid "" "* fixed an issue that was making TWBlue to show incorrectly titles for " "trending topic buffers upon startup. ([#421](https://github.com/manuelcortez/" @@ -60,11 +160,26 @@ msgstr "" "incorrecta los títulos de los buffers de trending topics al iniciarse. " "([#421](https://github.com/manuelcortez/TWBlue/issues/421))" -#: changelog.py:13 +#: changelog.py:21 +msgid "" +"* fixed an issue that was making users of the graphical user interface to " +"delete a buffer if a trends buffer was opened in the same session." +msgstr "" +"* Se ha solucionado un problema que hacía que los usuarios de la interfaz " +"gráfica no pudieran borrar algunos buffers si se abría un buffer de " +"tendencias en la misma sesión." + +#: changelog.py:22 +#, fuzzy +#| msgid "* Updated romanian translation." +msgid "* Updated Spanish, Japanese and french translations." +msgstr "* Actualizada la traducción al rumano." + +#: changelog.py:24 msgid "## Changes in Version 2021.10.30" msgstr "## Cambios en la versión 2021.10.30" -#: changelog.py:15 +#: changelog.py:26 msgid "" "* Fixed many errors in the way we compile TWBlue, so users of 64 bits " "systems and particularly windows 7 users would be able to install TWBlue " @@ -84,7 +199,7 @@ msgstr "" "próximos 23 meses.([#416,](https://github.com/manuelcortez/TWBlue/" "issues/416), [#415,](https://github.com/manuelcortez/TWBlue/issues/415))" -#: changelog.py:16 +#: changelog.py:27 msgid "" "* fixed an issue that was making impossible to manually add an user to the " "autocomplete users database." @@ -92,7 +207,7 @@ msgstr "" "* Corregido un error que causaba que fuera imposible añadir manualmente un " "usuario a la base de datos de autocompletado." -#: changelog.py:17 +#: changelog.py:28 msgid "" "* Started to improve support to conversations by searching for " "conversation_id." @@ -100,11 +215,11 @@ msgstr "" "* Se ha comenzado a mejorar el soporte a las conversaciones e hilos buscando " "por el parámetro conversation_id en Twitter." -#: changelog.py:19 +#: changelog.py:30 msgid "## changes in version 2021.10.27" msgstr "## Cambios en la versión 2021.10.27" -#: changelog.py:21 +#: changelog.py:32 msgid "" "* Added an user alias manager, located in the application menu in the menu " "bar. From this dialog, it is possible to review, add, edit or remove user " @@ -116,7 +231,7 @@ msgstr "" "editar y eliminar el alias para los usuarios de la cuenta seleccionada. " "([#401](https://github.com/manuelcortez/TWBlue/issues/401))" -#: changelog.py:22 +#: changelog.py:33 msgid "" "* TWBlue now closes the VLC player window automatically when a video reaches " "its end. ([#399](https://github.com/manuelcortez/TWBlue/issues/399))" @@ -125,7 +240,7 @@ msgstr "" "reproducción de un video. ([#399](https://github.com/manuelcortez/TWBlue/" "issues/399))" -#: changelog.py:23 +#: changelog.py:34 msgid "" "* After a lot of time, TWBlue now uses a new default Soundpack, called " "FreakyBlue. This soundpack will be set by default in all new sessions " @@ -139,7 +254,7 @@ msgstr "" "por tomarse el trabajo de diseñar el paquete de sonidos para TWBlue. ([#247]" "(https://github.com/manuelcortez/TWBlue/issues/247))" -#: changelog.py:24 +#: changelog.py:35 msgid "" "* When reading a tweet, if the tweet contains more than 2 consecutive " "mentions, TWBlue will announce how many more users the tweet includes, as " @@ -153,7 +268,7 @@ msgstr "" "conjunto de usuarios mencionados en el tweet utilizando el diálogo de ver " "tweets." -#: changelog.py:25 +#: changelog.py:36 msgid "" "* In the tweet displayer, It is possible to copy a link to the current tweet " "or person by pressing a button called \"copy link to clipboard\"." @@ -162,7 +277,7 @@ msgstr "" "directo al tweet o usuario seleccionando el botón llamado \"copiar vínculo " "al portapapeles\"." -#: changelog.py:26 +#: changelog.py:37 msgid "" "* Added a keymap capable to work under Windows 11. ([#391](https://github." "com/manuelcortez/TWBlue/pull/391))" @@ -170,7 +285,7 @@ msgstr "" "* Se ha añadido un mapa de teclado capaz de funcionar correctamente en " "Windows 11. ([#391](https://github.com/manuelcortez/TWBlue/pull/391))" -#: changelog.py:27 +#: changelog.py:38 msgid "" "* Added user aliases to TWBlue. This feature allows you to rename user's " "display names on Twitter, so the next time you'll read an user it will be " @@ -192,11 +307,11 @@ msgstr "" "a ninguna combinación de teclado por defecto. ([#389](https://github.com/" "manuelcortez/TWBlue/pull/389))" -#: changelog.py:28 +#: changelog.py:39 msgid "* There are some changes to the autocomplete users feature:" msgstr "* Hemos introducido algunos cambios al autocompletado de usuarios:" -#: changelog.py:29 +#: changelog.py:40 msgid "" " * Now users can search for twitter screen names or display names in the " "database." @@ -204,7 +319,7 @@ msgstr "" " * Ahora, es posible buscar utilizando los nombres de pantalla o nombres " "para mostrar de los usuarios de Twitter." -#: changelog.py:30 +#: changelog.py:41 msgid "" "* It is possible to undefine keystrokes in the current keymap in TWBlue. " "This allows you, for example, to redefine keystrokes completely." @@ -213,7 +328,7 @@ msgstr "" "uso en TWBlue. Esto permite, por ejemplo, desasignar combinaciones de " "teclado para utilizarlas en otras funciones." -#: changelog.py:31 +#: changelog.py:42 msgid "" "* We have changed our Geocoding service to the Nominatim API from " "OpenStreetMap. Addresses present in tweets are going to be determined by " @@ -226,7 +341,7 @@ msgstr "" "ahora una clave API de pago. ([#390](https://github.com/manuelcortez/TWBlue/" "issues/390))" -#: changelog.py:32 +#: changelog.py:43 msgid "" "* Added a limited version of the Twitter's Streaming API: The Streaming API " "will work only for tweets, and will receive tweets only by people you " @@ -243,7 +358,7 @@ msgstr "" "debería ser capaz de detectar este problema y reconectar el stream de nuevo. " "([#385](https://github.com/manuelcortez/TWBlue/pull/385))" -#: changelog.py:33 +#: changelog.py:44 msgid "" "* Fixed an issue that made TWBlue to not show a dialog when attempting to " "show a profile for a suspended user. ([#387](https://github.com/manuelcortez/" @@ -253,7 +368,7 @@ msgstr "" "mostrar nada al intentar ver el perfil de un usuario suspendido. ([#387]" "(https://github.com/manuelcortez/TWBlue/issues/387))" -#: changelog.py:34 +#: changelog.py:45 msgid "" "* Added support for Twitter audio and videos: Tweets which contains audio or " "videos will be detected as audio items, and you can playback those with the " @@ -265,7 +380,7 @@ msgstr "" "reproducirlos con el comando habitual para reproducir audios. ([#384,]" "(https://github.com/manuelcortez/TWBlue/pull/384))" -#: changelog.py:35 +#: changelog.py:46 msgid "" "* We just implemented some changes in the way TWBlue handles tweets in order " "to reduce its RAM memory usage [#380](https://github.com/manuelcortez/TWBlue/" @@ -275,7 +390,7 @@ msgstr "" "los tweets, con el objetivo de mejorar el consumo de memoria y CPU. [#380]" "(https://github.com/manuelcortez/TWBlue/pull/380):" -#: changelog.py:36 +#: changelog.py:47 msgid "" " * We reduced the tweets size by storing only the tweet fields we " "currently use. This should reduce tweet's size in memory for every object up " @@ -285,7 +400,7 @@ msgstr "" "campos de información que usamos actualmente. Esto debería reducir el tamaño " "del tweet en la memoria para cada objeto hasta un 75%." -#: changelog.py:37 +#: changelog.py:48 msgid "" " * When using the cache database to store your tweets, there is a new " "setting present in the account settings dialog, in the general tab. This " @@ -297,7 +412,7 @@ msgstr "" "pestaña general. Este ajuste te permite controlar si TWBlue cargará toda la " "base de datos en la memoria RAM (Opción predeterminada) o no." -#: changelog.py:38 +#: changelog.py:49 msgid "" " * Loading the whole database into memory has the advantage of being " "extremely fast to access any element (for example when moving through tweets " @@ -314,7 +429,7 @@ msgstr "" "los objetos de tweets. Si tienes una máquina con suficiente memoria, esta " "debería ser una buena opción para ti." -#: changelog.py:39 +#: changelog.py:50 msgid "" " * If you uncheck this setting, TWBlue will read the whole database " "from disk. This is significantly slower, but the advantage of this setting " @@ -333,7 +448,7 @@ msgstr "" "sugiere para ordenadores con poca memoria o para aquellas personas que no " "quieran mantener una cantidad realmente grande de tweets almacenados." -#: changelog.py:40 +#: changelog.py:51 msgid "" "* Changed the label in the direct message's text control so it will indicate " "that the user needs to write the text there, without referring to any " @@ -344,7 +459,7 @@ msgstr "" "de un mensaje directo. Ahora en dicho campo no se especifica ningún nombre " "de usuario. ([#366,](https://github.com/manuelcortez/TWBlue/issues/366))" -#: changelog.py:41 +#: changelog.py:52 msgid "" "* TWBlue will take Shift+F10 again as the contextual menu key in the list of " "items in a buffer. This stopped working after we have migrated to WX 4.1. " @@ -353,7 +468,7 @@ msgstr "" "* TWBlue puede volver a usar la combinación de teclado Shift+F10 como la " "tecla de menú contextual." -#: changelog.py:42 +#: changelog.py:53 msgid "" "* TWBlue should render correctly retweets of quoted tweets. ([#365,](https://" "github.com/manuelcortez/TWBlue/issues/365))" @@ -361,7 +476,7 @@ msgstr "" "* TWBlue debería mostrar apropiadamente los retweets de un tweet citado. " "([#365,](https://github.com/manuelcortez/TWBlue/issues/365))" -#: changelog.py:43 +#: changelog.py:54 msgid "" "* Fixed an error that was causing TWBlue to be unable to output to screen " "readers at times. ([#369,](https://github.com/manuelcortez/TWBlue/" @@ -371,7 +486,7 @@ msgstr "" "enviar texto a los lectores de pantalla. ([#369,](https://github.com/" "manuelcortez/TWBlue/issues/369))" -#: changelog.py:44 +#: changelog.py:55 msgid "" "* Fixed autocomplete users feature. ([#367,](https://github.com/manuelcortez/" "TWBlue/issues/367))" @@ -379,7 +494,7 @@ msgstr "" "* Corregida la característica de autocompletado de usuarios. ([#367,]" "(https://github.com/manuelcortez/TWBlue/issues/367))" -#: changelog.py:45 +#: changelog.py:56 msgid "" "* Fixed error when displaying an URL at the end of a line, when the tweet or " "direct message contained multiple lines. Now the URL should be displayed " @@ -391,7 +506,7 @@ msgstr "" "todas las direcciones. ([#305,](https://github.com/manuelcortez/TWBlue/" "issues/305) [#272,](https://github.com/manuelcortez/TWBlue/issues/272))" -#: changelog.py:46 +#: changelog.py:57 msgid "" "* TWBlue has been migrated completely to Python 3 (currently, the software " "builds with Python 3.8)." @@ -399,7 +514,7 @@ msgstr "" "* TWBlue ha sido migrado completamente a Python 3 (actualmente, el software " "se construye con Python 3.8)." -#: changelog.py:47 +#: changelog.py:58 msgid "" "* TWBlue should be restarted gracefully. Before, the application was " "alerting users of not being closed properly every time the application " @@ -409,7 +524,7 @@ msgstr "" "los usuarios de que no se cerraba correctamente cada vez que debía efectuar " "un reinicio." -#: changelog.py:48 +#: changelog.py:59 msgid "" "* If TWBlue attemps to load an account with invalid tokens (this happens " "when reactivating a previously deactivated account, or when access to the ap " @@ -423,7 +538,7 @@ msgstr "" "sesión. Antes, la aplicación no podía iniciarse debido a un error crítico. " "([#328,](https://github.com/manuelcortez/TWBlue/issues/328))" -#: changelog.py:49 +#: changelog.py:60 msgid "" "* When sending a direct message, the title of the window will change " "appropiately when the recipient is edited. ([#276,](https://github.com/" @@ -433,7 +548,7 @@ msgstr "" "apropiadamente cada vez que el recipiente es editado. ([#276,](https://" "github.com/manuelcortez/TWBlue/issues/276))" -#: changelog.py:50 +#: changelog.py:61 msgid "" "* URL'S in user profiles are expanded automatically. ([#275,](https://github." "com/manuelcortez/TWBlue/issues/275))" @@ -441,7 +556,7 @@ msgstr "" "* Las direcciones URL de los perfiles de usuario estarán expandidas " "automáticamente. ([#275,](https://github.com/manuelcortez/TWBlue/issues/275))" -#: changelog.py:51 +#: changelog.py:62 msgid "" "* TWBlue now uses [Tweepy,](https://github.com/tweepy/tweepy) to connect " "with Twitter. We have adopted this change in order to support Twitter'S API " @@ -454,7 +569,7 @@ msgstr "" "de Twitter en un futuro cercano. ([#333,](https://github.com/manuelcortez/" "TWBlue/issues/337) [#347](https://github.com/manuelcortez/TWBlue/pull/347))" -#: changelog.py:52 +#: changelog.py:63 msgid "" "* TWBlue can upload images in Tweets and replies again. ([#240,](https://" "github.com/manuelcortez/TWBlue/issues/240))" @@ -462,7 +577,7 @@ msgstr "" "* TWBlue puede subir imágenes en tweets y respuestas de nuevo. ([#240,]" "(https://github.com/manuelcortez/TWBlue/issues/240))" -#: changelog.py:53 +#: changelog.py:64 msgid "" "* Fixed the way we use to count characters in Twitter. The new methods in " "TWBlue take into account special characters and URLS as documented in " @@ -474,11 +589,11 @@ msgstr "" "especificaciones de Twitter. ([#199,](https://github.com/manuelcortez/TWBlue/" "issues/199) [#315](https://github.com/manuelcortez/TWBlue/issues/315))" -#: changelog.py:54 +#: changelog.py:65 msgid "* Proxy support now works as expected." msgstr "* El soporte Proxy ahora debería funcionar como es debido." -#: changelog.py:55 +#: changelog.py:66 msgid "" "* Changed translation service from yandex.translate to Google Translator. " "([#355,](https://github.com/manuelcortez/TWBlue/issues/355))" @@ -486,7 +601,7 @@ msgstr "" "* Hemos cambiado el servicio de traducción de yandex.translate a Google " "Translate. ([#355,](https://github.com/manuelcortez/TWBlue/issues/355))" -#: changelog.py:56 +#: changelog.py:67 msgid "" "* Improved method to load direct messages in the buffers. Now it should be " "faster due to less calls to Twitter API performed from the client." @@ -495,16 +610,16 @@ msgstr "" "Ahora debería ser más rápido debido a que se realizan menos llamadas a la " "API de Twitter desde el cliente." -#: changelog.py:57 +#: changelog.py:68 msgid "" "* And more. ([#352,](https://github.com/manuelcortez/TWBlue/issues/352))" msgstr "* Y más ([#352,](https://github.com/manuelcortez/TWBlue/issues/352))" -#: changelog.py:59 +#: changelog.py:70 msgid "## Changes in version 0.95" msgstr "## Cambios en la versión 0.95" -#: changelog.py:61 +#: changelog.py:72 msgid "" "* TWBlue can open a Tweet or user directly in Twitter. There is a new option " "in the context menu for people and tweet buffers, and also, the shortcut " @@ -515,12 +630,12 @@ msgstr "" "también el atajo control+win+alt+enter para abrir en Twitter el elemento con " "el foco." -#: changelog.py:62 +#: changelog.py:73 msgid "* Some keystrokes were remapped in the Windows 10 Keymap:" msgstr "" "* Cambiados algunos atajos de teclado en el mapa de teclado de Windows 10:" -#: changelog.py:63 +#: changelog.py:74 msgid "" " * Read location of a tweet: Ctrl+Win+G. ([#177](https://github.com/" "manuelcortez/TWBlue/pull/177))" @@ -528,17 +643,17 @@ msgstr "" " * Leer ubicación de un tuit: CTRL+Win+G. ([#177](https://github.com/" "manuelcortez/TWBlue/pull/177))" -#: changelog.py:64 +#: changelog.py:75 msgid " * Open global settings dialogue: Ctrl+Win+Alt+O." msgstr " * Abrir diálogo de configuración global: Ctrl+Win+Alt+O." -#: changelog.py:65 +#: changelog.py:76 msgid " * Mute/unmute current session: Control + Windows + Alt + M." msgstr "" " * Silenciar / desactivar silencio en la sesión actual: Control + Windows " "+ Alt + M." -#: changelog.py:66 +#: changelog.py:77 msgid "" "* Fixed an error that was preventing TWBlue to load the direct messages " "buffer if an user who sent a message has been deleted." @@ -546,7 +661,7 @@ msgstr "" "* Corregido un error que impedía a TWBlue cargar el buffer de mensajes " "directos si se ha eliminado un usuario que envió un mensaje." -#: changelog.py:67 +#: changelog.py:78 msgid "" "* Added support for playing audios posted in [AnyAudio.net](http://anyaudio." "net) directly from TWBlue. Thanks to [Sam Tupy](http://www.samtupy.com/)" @@ -555,7 +670,7 @@ msgstr "" "(http://anyaudio.net) directamente desde TWBlue. Gracias a [Sam Tupy](http://" "www.samtupy.com/)" -#: changelog.py:68 +#: changelog.py:79 msgid "" "* Custom buffer ordering will not be reset every time the application " "restarts after an account setting has been modified." @@ -563,7 +678,7 @@ msgstr "" "* El orden personalizado de buffers no se restablecerá cada vez que la " "aplicación se reinicie tras modificar un ajuste de la cuenta." -#: changelog.py:69 +#: changelog.py:80 msgid "" "* When adding or removing an user from a list, it is possible to press enter " "in the focused list instead of having to search for the \"add\" or \"delete" @@ -573,7 +688,7 @@ msgstr "" "la lista con el foco en vez de tener que buscar los botones \"Añadir\" o " "\"Eliminar\"." -#: changelog.py:70 +#: changelog.py:81 msgid "" "* Quoted and long tweets are displayed properly in the sent tweets buffer " "after being send. ([#253](https://github.com/manuelcortez/TWBlue/issues/253))" @@ -582,7 +697,7 @@ msgstr "" "enviados después de enviarse. ([#253](https://github.com/manuelcortez/TWBlue/" "issues/253))" -#: changelog.py:71 +#: changelog.py:82 msgid "" "* Fixed an issue that was making the list manager keystroke unable to be " "shown in the keystroke editor. Now the keystroke is listed properly. ([#260]" @@ -593,7 +708,7 @@ msgstr "" "se lista adecuadamente. ([#260](https://github.com/manuelcortez/TWBlue/" "issues/260))" -#: changelog.py:72 +#: changelog.py:83 msgid "" "* The volume slider, located in the account settings of TWBlue, now should " "decrease and increase value properly when up and down arrows are pressed. " @@ -605,7 +720,7 @@ msgstr "" "arriba y abajo. Antes lo hacía en orden inverso. ([#261](https://github.com/" "manuelcortez/TWBlue/issues/261))" -#: changelog.py:73 +#: changelog.py:84 msgid "" "* autoreading has been redesigned to work in a similar way for almost all " "buffers. Needs testing. ([#221](https://github.com/manuelcortez/TWBlue/" @@ -615,7 +730,7 @@ msgstr "" "casi todos los buffers. Necesita pruebas. ([#221](https://github.com/" "manuelcortez/TWBlue/issues/221))" -#: changelog.py:74 +#: changelog.py:85 msgid "" "* When displaying tweets or direct messages, a new field has been added to " "show the date when the item has been posted to Twitter." @@ -623,7 +738,7 @@ msgstr "" "* Al mostrar tuits o mensajes directos, ahora hay un nuevo campo que muestra " "la fecha en la que se publicó ese elemento en Twitter." -#: changelog.py:75 +#: changelog.py:86 msgid "" "* Added support for deleting direct messages by using the new Twitter API " "methods." @@ -631,14 +746,14 @@ msgstr "" "* Se ha añadido soporte para eliminar mensajes directos usando los nuevos " "métodos de la API de Twitter." -#: changelog.py:76 +#: changelog.py:87 msgid "" "* When quoting a retweet, the quote will be made to the original tweet " "instead of the retweet." msgstr "" "* Al citar un retuit, la cita apuntará al tuit original en vez del retuit." -#: changelog.py:77 +#: changelog.py:88 msgid "" "* If the sent direct messages buffer is hidden, TWBlue should keep loading " "everything as expected. ([#246](https://github.com/manuelcortez/TWBlue/" @@ -648,7 +763,7 @@ msgstr "" "cargar todo como se espera. ([#246](https://github.com/manuelcortez/TWBlue/" "issues/246))" -#: changelog.py:78 +#: changelog.py:89 msgid "" "* There is a new soundpack, called FreakyBlue (Thanks to [Andre Louis]" "(https://twitter.com/FreakyFwoof)) as a new option in TWBlue. This pack can " @@ -662,7 +777,7 @@ msgstr "" "que los usuarios deberían echar un vistazo y dar su opinión en las " "snapshots. ([#247](https://github.com/manuelcortez/TWBlue/issues/247))" -#: changelog.py:79 +#: changelog.py:90 msgid "" "* There is a new option in the help menu that allows you to visit the " "soundpacks section in the TWBlue website. ([#247](https://github.com/" @@ -672,7 +787,7 @@ msgstr "" "paquetes de sonidos en el sitio web de TWBlue. ([#247](https://github.com/" "manuelcortez/TWBlue/issues/247))" -#: changelog.py:80 +#: changelog.py:91 msgid "" "* When reading location of a geotagged tweet, it will be translated for " "users of other languages. ([#251](https://github.com/manuelcortez/TWBlue/" @@ -682,7 +797,7 @@ msgstr "" "usuarios de otros idiomas. ([#251](https://github.com/manuelcortez/TWBlue/" "pull/251))" -#: changelog.py:81 +#: changelog.py:92 msgid "" "* When there are no more items to retrieve in direct messages and people " "buffers, a message will announce it." @@ -690,7 +805,7 @@ msgstr "" "* Cuando no haya más elementos que recuperar en los buffers de mensajes " "directos y personas, un mensaje lo indicará." -#: changelog.py:82 +#: changelog.py:93 msgid "" "* Fixed an issue reported by some users that was making them unable to load " "more items in their direct messages." @@ -698,14 +813,14 @@ msgstr "" "* Corregido un problema reportado por algunos usuarios que les impedía " "cargar más elementos en sus mensajes directos." -#: changelog.py:83 +#: changelog.py:94 msgid "" "* It is possible to add a tweet to the likes buffer from the menu bar again." msgstr "" "* Es posible añadir tuits al buffer de me gusta desde la barra de menú otra " "vez." -#: changelog.py:84 +#: changelog.py:95 msgid "" "* Tweets, replies and retweets will be added to sent tweets right after " "being posted in Twitter." @@ -713,16 +828,16 @@ msgstr "" "* Los tuits, respuestas y retuits se añadirán a los tuits enviados justo al " "publicarse en Twitter." -#: changelog.py:85 +#: changelog.py:96 msgid "* Extended Tweets should be displayed properly in list buffers." msgstr "" "* Los tuits largos deberían mostrarse correctamente en los buffers de listas." -#: changelog.py:87 +#: changelog.py:98 msgid "## Changes in version 0.94" msgstr "## Cambios en la versión 0.94" -#: changelog.py:89 +#: changelog.py:100 msgid "" "* Added an option in the global settings dialog to disable the Streaming " "features of TWBlue. TWBlue will remove all Streaming features after August " @@ -736,7 +851,7 @@ msgstr "" "permite saber cómo se comportará la aplicación al llegar ese día. ([#219]" "(https://github.com/manuelcortez/TWBlue/issues/219))" -#: changelog.py:90 +#: changelog.py:101 msgid "" "* Due to Twitter API changes, Switched authorisation method to Pin-code " "based authorisation. When you add new accounts to TWBlue, you will be " @@ -749,7 +864,7 @@ msgstr "" "autorizar recibirás un número que deberás pegar en la ventana de TWBlue para " "poder continuar. ([#216](https://github.com/manuelcortez/TWBlue/issues/216))" -#: changelog.py:91 +#: changelog.py:102 msgid "" "* In order to comply with latest Twitter changes, TWBlue has switched to the " "new method used to send and receive direct messages, according to issue " @@ -760,7 +875,7 @@ msgstr "" "directos, de acuerdo con lo dispuesto en el issue [#215.](https://github.com/" "manuelcortez/twblue/issues/215)" -#: changelog.py:92 +#: changelog.py:103 msgid "" " * The new method does not allow direct messages to be processed in real " "time. Direct messages will be updated periodically." @@ -769,7 +884,7 @@ msgstr "" "tiempo real. Los mensajes directos se actualizarán periódicamente, pero no " "en tiempo real." -#: changelog.py:93 +#: changelog.py:104 msgid "" "* After august 16 or when streaming is disabled, the events buffer will no " "longer be created in TWBlue." @@ -777,7 +892,7 @@ msgstr "" "* Luego del 16 de agosto o si las características en tiempo real han sido " "desactivadas, el buffer de eventos dejará de ser utilizado en TWBlue." -#: changelog.py:94 +#: changelog.py:105 msgid "" "* You can configure frequency for buffer updates in TWBlue. By default, " "TWBlue will update all buffers every 2 minutes, but you can change this " @@ -789,7 +904,7 @@ msgstr "" "esto puede cambiarse desde el diálogo de opciones globales. ([#223](https://" "github.com/manuelcortez/TWBlue/issues/223))" -#: changelog.py:95 +#: changelog.py:106 msgid "" "* Added a new tab called feedback, in the account settings dialog. This tab " "allows you to control whether automatic speech or Braille feedbak in certain " @@ -806,7 +921,7 @@ msgstr "" "salida automática. ([#203](https://github.com/manuelcortez/TWBlue/" "issues/203))" -#: changelog.py:96 +#: changelog.py:107 msgid "" "* The spell checking dialog now has access keys defined for the most " "important actions. ([#211](https://github.com/manuelcortez/TWBlue/" @@ -816,7 +931,7 @@ msgstr "" "para las acciones más importantes. ([#211](https://github.com/manuelcortez/" "TWBlue/issues/211))" -#: changelog.py:97 +#: changelog.py:108 msgid "" "* TWBlue now Uses WXPython 4.0.1. This will allow us to migrate all " "important components to Python 3 in the future. ([#207](https://github.com/" @@ -826,7 +941,7 @@ msgstr "" "componentes importantes a Python 3 en el futuro. ([#207](https://github.com/" "manuelcortez/TWBlue/issues/207))" -#: changelog.py:98 +#: changelog.py:109 msgid "" "* When you quote a Tweet, if the original tweet was posted with Twishort, " "TWBlue should display properly the quoted tweet. Before it was displaying " @@ -837,7 +952,7 @@ msgstr "" "debería mostrar correctamente el tuit citado. Antes sólo mostraba el tuit " "original. ([#206](https://github.com/manuelcortez/TWBlue/issues/206))" -#: changelog.py:99 +#: changelog.py:110 msgid "" "* It is possible to filter by retweets, quotes and replies when creating a " "new filter." @@ -845,7 +960,7 @@ msgstr "" "* Es posible filtrar por retuits, tuits citados y respuestas al crear nuevos " "filtros." -#: changelog.py:100 +#: changelog.py:111 msgid "" "* Added support for playing youtube Links directly from the client. ([#94]" "(https://github.com/manuelcortez/TWBlue/issues/94))" @@ -853,11 +968,11 @@ msgstr "" "* Se ha añadido soporte para reproducir enlaces de Youtube directamente " "desde el cliente. ([#94](https://github.com/manuelcortez/TWBlue/issues/94))" -#: changelog.py:101 +#: changelog.py:112 msgid "* Replaced Bass with libVLC for playing URL streams." msgstr "* Se ha reemplazado bass por LibVlc para reproducir audio desde URLS." -#: changelog.py:102 +#: changelog.py:113 msgid "" "* the checkbox for indicating whether TWBlue will include everyone in a " "reply or not, will be unchecked by default." @@ -865,7 +980,7 @@ msgstr "" "* La casilla que indica si TWBlue debe incluir a todos los participantes en " "una respuesta estará desmarcada por defecto." -#: changelog.py:103 +#: changelog.py:114 msgid "" "* You can request TWBlue to save the state for two checkboxes: Long tweet " "and mention all, from the global settings dialogue." @@ -873,7 +988,7 @@ msgstr "" "* Puedes pedir a TWBlue que guarde el estado de dos casillas: tuit largo y " "mencionar a todos, desde el diálogo de opciones globales." -#: changelog.py:104 +#: changelog.py:115 msgid "" "* For windows 10 users, some keystrokes in the invisible user interface have " "been changed or merged:" @@ -881,7 +996,7 @@ msgstr "" "* Para usuarios de Windows 10, algunas combinaciones de teclado en el modo " "invisible han sufrido cambios o han sido combinadas:" -#: changelog.py:105 +#: changelog.py:116 msgid "" " * control+Windows+alt+F will be used for toggling between adding and " "removing a tweet to user's likes. This function will execute the needed " @@ -891,22 +1006,22 @@ msgstr "" "un tuit a los tuits que le gustan a un usuario. Esta función ejecutará la " "acción necesaria basándose en el estado actual del tuit con el foco." -#: changelog.py:106 +#: changelog.py:117 msgid "* TWBlue will show an error if something goes wrong in an audio upload." msgstr "" "* TWBlue mostrará un error si algo sale mal durante la carga de un archivo " "de audio." -#: changelog.py:107 +#: changelog.py:118 msgid "" "* And more. ([#171,](https://github.com/manuelcortez/TWBlue/issues/171) " msgstr "* Y más. ([#171,](https://github.com/manuelcortez/TWBlue/issues/171) " -#: changelog.py:109 +#: changelog.py:120 msgid "## Changes in version 0.93" msgstr "## Cambios en la versión 0.93" -#: changelog.py:111 +#: changelog.py:122 msgid "" "* A new soundpack has been added to TWBlue. Thanks to [@ValeriaK305](https://" "twitter.com/ValeriaK305)" @@ -914,7 +1029,7 @@ msgstr "" "* Se ha añadido un nuevo paquete de sonidos a la instalación predeterminada " "de TWBlue, gracias a [@ValeriaK305](https://twitter.com/ValeriaK305)" -#: changelog.py:112 +#: changelog.py:123 msgid "" "* In the Windows 10 keymap, we have changed some default keystrokes as " "windows now uses some previously assigned shortcuts:" @@ -923,16 +1038,16 @@ msgstr "" "de teclado, ya que Windows ahora utiliza algunos de los atajos que utilizaba " "TWBlue:" -#: changelog.py:113 +#: changelog.py:124 msgid " * For liking a tweet, press Control+Windows+alt+f" msgstr "" " * Para marcar como me gusta un tweet, presiona control+windows+alt+f" -#: changelog.py:114 +#: changelog.py:125 msgid " * for opening a trends buffer, press control+Windows+T" msgstr " * Para abrir un buffer de tendencias, presiona Control+Windows+T" -#: changelog.py:115 +#: changelog.py:126 msgid "" "* TWBlue has received improvements in some functions for handling extended " "tweets, long tweets and quoted retweets. It should render some tweets in a " @@ -942,7 +1057,7 @@ msgstr "" "extendidos y retuits citados. Debería ser capaz de mostrar mejor algunos " "tuits." -#: changelog.py:116 +#: changelog.py:127 msgid "" "* In the spell checker module, there is a new button that will allow you to " "add your own words to your personal dictionary so the module won't mark them " @@ -952,7 +1067,7 @@ msgstr "" "la palabra a tu diccionario. De esta forma,en un futuro esa palabra no " "aparecerá marcada como mal escrita." -#: changelog.py:117 +#: changelog.py:128 msgid "" "* Added filtering capabilities to TWBlue. ([#102](https://github.com/" "manuelcortez/TWBlue/issues/102))" @@ -960,7 +1075,7 @@ msgstr "" "* Se han añadido filtros a TWBlue. ([#102](https://github.com/manuelcortez/" "TWBlue/issues/102))" -#: changelog.py:118 +#: changelog.py:129 msgid "" " * You can create a filter for the current buffer from the buffer menu in " "the menu bar. At this moment, invisible interface does not have any shorcut " @@ -970,11 +1085,11 @@ msgstr "" "ubicado en la barra de menú. Por el momento, la interfaz invisible no cuenta " "con un atajo para esta acción." -#: changelog.py:119 +#: changelog.py:130 msgid " * You can create filters by word or languages." msgstr " * Puedes crear filtros de palabras o de idiomas en el tuit." -#: changelog.py:120 +#: changelog.py:131 msgid "" " * For deleting already created filters, you can go to the filter manager " "in the buffer menu and delete the filters you won't need." @@ -982,7 +1097,7 @@ msgstr "" " * Para eliminar filtros previamente creados, puedes acceder al gestor de " "filtros en el menú buffer, y eliminar desde ahí los que ya no necesites." -#: changelog.py:121 +#: changelog.py:132 msgid "" "* Links should be opened properly in quoted tweets ([#167,](https://github." "com/manuelcortez/TWBlue/issues/167) [#184](https://github.com/manuelcortez/" @@ -992,14 +1107,14 @@ msgstr "" "(https://github.com/manuelcortez/TWBlue/issues/167) [#184](https://github." "com/manuelcortez/TWBlue/issues/184))" -#: changelog.py:122 +#: changelog.py:133 msgid "" "* Increased display name limit up to 50 characters in update profile dialog." msgstr "" "* Se ha aumentado el número de caracteres permitidos en los nombres para " "mostrar en Twitter a 50 caracteres." -#: changelog.py:123 +#: changelog.py:134 msgid "" "* When authorising an account, you will see a dialogue with a cancel button, " "in case you want to abort the process. Also, NVDA will not be blocked when " @@ -1011,7 +1126,7 @@ msgstr "" "autorización para la cuenta. ([#101](https://github.com/manuelcortez/TWBlue/" "issues/101))" -#: changelog.py:124 +#: changelog.py:135 msgid "" "* In the translator module, the list of available languages is fetched " "automatically from the provider. That means all of these languages will work " @@ -1026,7 +1141,7 @@ msgstr "" "determina de forma automática por el API de Yandex. ([#153](https://github." "com/manuelcortez/TWBlue/issues/153))" -#: changelog.py:125 +#: changelog.py:136 msgid "" "* Trending topics, searches and conversation buffers will use mute settings " "set for the session in wich they were opened. ([#157](https://github.com/" @@ -1036,7 +1151,7 @@ msgstr "" "opciones de silencio en la sesión de TWBlue donde fueron creados. ([#157]" "(https://github.com/manuelcortez/TWBlue/issues/157))" -#: changelog.py:126 +#: changelog.py:137 msgid "" "* The Tweet limit is now 280 characters lenght instead 140. It means you can " "tweet longer tweets. ([#172](https://github.com/manuelcortez/TWBlue/" @@ -1046,7 +1161,7 @@ msgstr "" "significa que se pueden escribir tuits más largos. [#172](https://github.com/" "manuelcortez/TWBlue/issues/172))" -#: changelog.py:127 +#: changelog.py:138 msgid "" "* Per popular request, Status for mention to all and long tweet checkboxes " "will not be saved in settings. ([#170](https://github.com/manuelcortez/" @@ -1056,7 +1171,7 @@ msgstr "" "escribir un tuit largo y responder a todos. ([#170](https://github.com/" "manuelcortez/TWBlue/issues/170))" -#: changelog.py:128 +#: changelog.py:139 msgid "" "* Fixed a problem that was making TWBlue unable to start if it was being ran " "in Windows with Serbian language. ([#175](https://github.com/manuelcortez/" @@ -1066,11 +1181,11 @@ msgstr "" "el equipo se detectaba el idioma serbio. ([#175](https://github.com/" "manuelcortez/TWBlue/issues/175))" -#: changelog.py:129 +#: changelog.py:140 msgid "* Added Danish translation." msgstr "* Se ha añadido la traducción al Danés." -#: changelog.py:130 +#: changelog.py:141 msgid "" "* And more. ([#156,](https://github.com/manuelcortez/TWBlue/issues/156) " "[#163,](https://github.com/manuelcortez/TWBlue/issues/163) [#159,](https://" @@ -1085,11 +1200,11 @@ msgstr "" "TWBlue/issues/173) [#174,](https://github.com/manuelcortez/TWBlue/" "issues/174) [#176,](https://github.com/manuelcortez/TWBlue/issues/176))" -#: changelog.py:132 +#: changelog.py:143 msgid "## changes in version 0.91 and 0.92" msgstr "## Cambios en las versiones 0.91 y 0.92" -#: changelog.py:134 +#: changelog.py:145 msgid "" "* Fixed incorrect unicode handling when copying tweet to clipboard. ([#150]" "(https://github.com/manuelcortez/TWBlue/issues/150))" @@ -1097,7 +1212,7 @@ msgstr "" "* Se ha corregido un error de Unicode al copiar tuits al portapapeles. " "([#150](https://github.com/manuelcortez/TWBlue/issues/150))" -#: changelog.py:135 +#: changelog.py:146 msgid "" "* TWBlue will show an error when trying to open a timeline for a suspended " "user. ([#128](https://github.com/manuelcortez/TWBlue/issues/128))" @@ -1106,7 +1221,7 @@ msgstr "" "usuario suspendido. ([#128](https://github.com/manuelcortez/TWBlue/" "issues/128))" -#: changelog.py:136 +#: changelog.py:147 msgid "" "* Removed TwUp as service as it no longer exists. ([#112](https://github.com/" "manuelcortez/TWBlue/issues/112))" @@ -1114,7 +1229,7 @@ msgstr "" "* Se ha removido el servicio de audio TWUp, debido a que ya no existe. " "([#112](https://github.com/manuelcortez/TWBlue/issues/112))" -#: changelog.py:137 +#: changelog.py:148 msgid "" "* Release audio files after uploading them. ([#130](https://github.com/" "manuelcortez/TWBlue/issues/130))" @@ -1123,7 +1238,7 @@ msgstr "" "luego de haber sido subidos a algún servicio de audio. ([#130](https://" "github.com/manuelcortez/TWBlue/issues/130))" -#: changelog.py:138 +#: changelog.py:149 msgid "" "* Now TWBlue will use Yandex's translation services instead microsoft " "translator. ([#132](https://github.com/manuelcortez/TWBlue/issues/132))" @@ -1132,7 +1247,7 @@ msgstr "" "Microsoft Translator. ([#132](https://github.com/manuelcortez/TWBlue/" "issues/132))" -#: changelog.py:139 +#: changelog.py:150 msgid "" "* SndUp users will be able to upload audio in their account by using their " "API Key again. ([#134](https://github.com/manuelcortez/TWBlue/issues/134))" @@ -1140,7 +1255,7 @@ msgstr "" "* Los usuarios con cuenta de SNDUp podrán subir audios utilizando su clave " "de API de nuevo. ([#134](https://github.com/manuelcortez/TWBlue/issues/134))" -#: changelog.py:140 +#: changelog.py:151 msgid "" "* old tweets shouldn't be added as new items in buffers. ([#116,](https://" "github.com/manuelcortez/TWBlue/issues/116)) ([#133](https://github.com/" @@ -1150,7 +1265,7 @@ msgstr "" "github.com/manuelcortez/TWBlue/issues/116)) ([#133](https://github.com/" "manuelcortez/TWBlue/issues/133))" -#: changelog.py:141 +#: changelog.py:152 msgid "" "* All mentionned users should be displayed correctly in Twishort's long " "tweets. ([#116,](https://github.com/manuelcortez/TWBlue/issues/116)) ([#135]" @@ -1160,7 +1275,7 @@ msgstr "" "hechos mediante Twishort. ([#116,](https://github.com/manuelcortez/TWBlue/" "issues/116)) ([#135](https://github.com/manuelcortez/TWBlue/issues/135))" -#: changelog.py:142 +#: changelog.py:153 msgid "" "* It is possible to select a language for OCR service from the extras panel, " "in the account settings dialogue. You can, however, set this to detect " @@ -1175,7 +1290,7 @@ msgstr "" "especiales o símbolos que no forman parte del alfabeto inglés. ([#107]" "(https://github.com/manuelcortez/TWBlue/issues/107))" -#: changelog.py:143 +#: changelog.py:154 msgid "" "* Fixed a problem with JAWS for Windows and TWBlue. Now JAWS will work " "normally in this update. [#100](https://github.com/manuelcortez/twblue/" @@ -1185,15 +1300,15 @@ msgstr "" "funcionar de forma correcta con este lector de pantalla. [#100](https://" "github.com/manuelcortez/twblue/issues/100)" -#: changelog.py:144 +#: changelog.py:155 msgid "* And more ([#136,](https://github.com/manuelcortez/TWBlue/issues/136))" msgstr "* Y más ([#136,](https://github.com/manuelcortez/TWBlue/issues/136))" -#: changelog.py:146 +#: changelog.py:157 msgid "## Changes in version 0.90" msgstr "## Cambios en la versión 0.90" -#: changelog.py:148 +#: changelog.py:159 msgid "" "* Fixed a bug in long tweet parsing that was making TWBlue to disconnect the " "streaming API. ([#103](https://github.com/manuelcortez/TWBlue/issues/103))" @@ -1202,7 +1317,7 @@ msgstr "" "desconectara el Streaming. ([#103](https://github.com/manuelcortez/TWBlue/" "issues/103))" -#: changelog.py:149 +#: changelog.py:160 msgid "" "* Now OCR will work in images from retweets. It fixes a bug where TWBlue was " "detecting images but couldn't apply OCR on them. ([#105](https://github.com/" @@ -1213,7 +1328,7 @@ msgstr "" "pudiera aplicar OCR en ellas. ([#105](https://github.com/manuelcortez/TWBlue/" "issues/105))" -#: changelog.py:150 +#: changelog.py:161 msgid "" "* TWBlue won't try to load tweets already deleted, made with Twishort. " "Before, if someone posted a long tweet but deleted it in the Twishort's " @@ -1226,7 +1341,7 @@ msgstr "" "problemas en todo el cliente. ([#113](https://github.com/manuelcortez/TWBlue/" "issues/113))" -#: changelog.py:151 +#: changelog.py:162 msgid "" "* TWBlue shows an error message when you try to view the profile of an user " "that does not exist or has been suspended. ([#114,](https://github.com/" @@ -1238,7 +1353,7 @@ msgstr "" "manuelcortez/TWBlue/issues/114) [#115](https://github.com/manuelcortez/" "TWBlue/issues/115))" -#: changelog.py:152 +#: changelog.py:163 msgid "" "* The spellchecker module should select the right language when is set to " "\"user default\". ([#117](https://github.com/manuelcortez/TWBlue/issues/117))" @@ -1247,7 +1362,7 @@ msgstr "" "apropiado cuando el idioma del cliente se establece en \"Idioma " "predeterminado\". ([#117](https://github.com/manuelcortez/TWBlue/issues/117))" -#: changelog.py:153 +#: changelog.py:164 msgid "" "* Image description will be displayed in retweets too. ([#119](https://" "github.com/manuelcortez/TWBlue/issues/119))" @@ -1255,7 +1370,7 @@ msgstr "" "* La descripción de imágenes se mostrará en retuits también. ([#119](https://" "github.com/manuelcortez/TWBlue/issues/119))" -#: changelog.py:154 +#: changelog.py:165 msgid "" "* When reading a long tweet, you shouldn't read strange entities anymore. " "([#118](https://github.com/manuelcortez/twblue/issues/118))" @@ -1263,7 +1378,7 @@ msgstr "" "* cuando se lea un tuit largo, no deberían aparecer símbolos extraños. " "([#118](https://github.com/manuelcortez/twblue/issues/118))" -#: changelog.py:155 +#: changelog.py:166 msgid "" "* TWBlue will not try to load timelines if the user is blocking you. ([#125]" "(https://github.com/manuelcortez/twblue/issues/125))" @@ -1272,28 +1387,28 @@ msgstr "" "a la cuenta actual. ([#125](https://github.com/manuelcortez/twblue/" "issues/125))" -#: changelog.py:157 +#: changelog.py:168 msgid "## Changes in version 0.88 and 0.89" msgstr "## Cambios en las versiones 0.88 y 0.89" -#: changelog.py:159 +#: changelog.py:170 msgid "* Fixed more issues with streams and reconnections." msgstr "* Corregidos más problemas con los streams y la reconexión." -#: changelog.py:160 +#: changelog.py:171 msgid "* newer updates will indicate the release date in the updater." msgstr "" "* Las actualizaciones más nuevas indicarán la fecha de lanzamiento en el " "módulo de actualización." -#: changelog.py:161 +#: changelog.py:172 msgid "" "* Changes to keystrokes are reflected in keystroke editor automatically." msgstr "" "* Los cambios en las combinaciones de teclado se reflejarán automáticamente " "en el editor de combinaciones de teclado." -#: changelog.py:162 +#: changelog.py:173 msgid "" "* In replies with multiple users, if the mention to all checkbox is " "unchecked, you will see a checkbox per user so you will be able to control " @@ -1303,7 +1418,7 @@ msgstr "" "todos no está marcada, verás una casilla para cada usuario, lo que te " "permitirá seleccionar a los usuarios que serán mencionados en la respuesta." -#: changelog.py:163 +#: changelog.py:174 msgid "" "* Fixed a bug that caused duplicated user mentions in replies when the tweet " "was made with Twishort." @@ -1311,7 +1426,7 @@ msgstr "" "* Corregido un error que causaba que TWBlue mostrara menciones duplicadas si " "el tuit había sido enviado mediante Twishort." -#: changelog.py:164 +#: changelog.py:175 msgid "" "* Retweets should be displayed normally again when the originating tweet is " "a Twishort's long tweet." @@ -1319,7 +1434,7 @@ msgstr "" "* Los Retuits deben mostrarse correctamente si el tuit original había sido " "enviado mediante Twishort." -#: changelog.py:165 +#: changelog.py:176 msgid "" "* Changed the way TWBlue saves user timelines in configuration. Now it uses " "user IDS instead usernames. With user IDS, if an user changes the username, " @@ -1332,7 +1447,7 @@ msgstr "" "cambia su nombre de usuario TWBlue todavía será capaz de crear la línea " "temporal. Esto no era posible anteriormente." -#: changelog.py:166 +#: changelog.py:177 msgid "" "* Added a new setting in the account settings dialogue that makes TWBlue to " "show twitter usernames instead the full name." @@ -1340,7 +1455,7 @@ msgstr "" "* Añadida una opción en el diálogo de opciones de cuenta que hace que TWBlue " "muestre el nombre de pantalla del usuario en lugar del nombre completo." -#: changelog.py:167 +#: changelog.py:178 msgid "" "* Added OCR in twitter pictures. There is a new item in the tweet menu that " "allows you to extract and display text in images. Also the keystroke alt+Win" @@ -1351,18 +1466,18 @@ msgstr "" "imagen del tuit seleccionado. También se ha añadido la combinación Alt + " "Windows +O para el mismo propósito en la interfaz invisible." -#: changelog.py:168 +#: changelog.py:179 msgid "* Now TWBlue will play a sound when the focused tweet contains images." msgstr "" "* Ahora TWBlue reproducirá un sonido cuando el tuit seleccionado contenga " "imágenes." -#: changelog.py:169 +#: changelog.py:180 msgid "" "* Your own quoted tweets will not appear in the mentions buffer anymore." msgstr "* Tus tuits citados dejarán de mostrarse en el buffer de menciones." -#: changelog.py:170 +#: changelog.py:181 msgid "" "* The config file is saved in a different way, it should fix the bug where " "TWBlue needs to be restarted after the config folder is deleted." @@ -1371,13 +1486,13 @@ msgstr "" "solucionar el error que requería borrar el directorio de configuraciones y " "reiniciar TWBlue." -#: changelog.py:171 +#: changelog.py:182 msgid "* Mentioning people from friends or followers buffers works again." msgstr "" "* Es posible de nuevo mencionar usuarios desde los buffers de seguidores y " "amigos." -#: changelog.py:172 +#: changelog.py:183 msgid "" "* Support for proxy servers has been improved. Now TWBlue supports http, " "https, socks4 and socks5 proxies, with and without autentication." @@ -1385,15 +1500,15 @@ msgstr "" "* Se ha mejorado el soporte para servidores proxy. Ahora TWBlue soporta " "proxys http, https, socks4 y socks5, con o sin autenticación." -#: changelog.py:174 +#: changelog.py:185 msgid "## Changes in version 0.87" msgstr "## Cambios en la versión 0.87" -#: changelog.py:176 +#: changelog.py:187 msgid "* Fixed stream connection errors." msgstr "* Arreglados errores en la conexión de los streams." -#: changelog.py:177 +#: changelog.py:188 msgid "" "* Now TWBlue can handle properly a reply to the sender without including all " "other mentioned users." @@ -1401,11 +1516,11 @@ msgstr "" "* Ahora TWBlue puede manejar correctamente las respuestas sin incluir a " "todos los usuarios del tuit original." -#: changelog.py:178 +#: changelog.py:189 msgid "* Updated translations." msgstr "* Traducciones actualizadas." -#: changelog.py:179 +#: changelog.py:190 msgid "" "* The status of the mention to all checkbox will be remembered the next time " "you reply to multiple users." @@ -1413,11 +1528,11 @@ msgstr "" "* El estado de la casilla para mencionar a todos se recordará la próxima vez " "que escribas una respuesta." -#: changelog.py:181 +#: changelog.py:192 msgid "## Changes in version 0.86" msgstr "## Cambios en la versión 0.86" -#: changelog.py:183 +#: changelog.py:194 msgid "" "* Fixed a very important security issue. Now TWBlue will send tweets to " "twishort without using any other server." @@ -1425,7 +1540,7 @@ msgstr "" "* Arreglado un error de seguridad muy importante. Ahora TWBlue enviará tuits " "hacia Twishort sin utilizar un servidor intermedio." -#: changelog.py:184 +#: changelog.py:195 msgid "" "* When you add a comment to a tweet, it will be sent as a quoted tweet, even " "if your reply plus the original tweet is not exceeding 140 characters." @@ -1434,7 +1549,7 @@ msgstr "" "citado, incluso si el comentario más el tuit original no supera los 140 " "caracteres." -#: changelog.py:185 +#: changelog.py:196 msgid "" "* Updated windows 10 keymap for reflecting changes made in the last windows " "10 build." @@ -1442,11 +1557,11 @@ msgstr "" "* Actualizado el mapa de teclado de Windows 10 debido a los cambios de la " "última build." -#: changelog.py:186 +#: changelog.py:197 msgid "* Added last changes in the twitter API." msgstr "* Añadidos los últimos cambios en el API de Twitter." -#: changelog.py:187 +#: changelog.py:198 msgid "" "* When replying, it will not show the twitter username in the text box. When " "you send the tweet, the username will be added automatically." @@ -1455,7 +1570,7 @@ msgstr "" "campo de texto. El nombre de usuario será añadido de forma automática al " "enviar el tuit." -#: changelog.py:188 +#: changelog.py:199 msgid "" "* When replying to multiple users, you'll have a checkbox instead a button " "for mentioning all people. If this is checked, twitter usernames will be " @@ -1465,44 +1580,44 @@ msgstr "" "lugar de un botón para mencionar a todos. Si es marcada, los nombres de " "usuario de Twitter se añadirán automáticamente al enviar el tuit." -#: changelog.py:190 +#: changelog.py:201 msgid "## Changes in version 0.85" msgstr "## Cambios en la versión 0.85" -#: changelog.py:192 +#: changelog.py:203 msgid "* Long and quoted tweets should be displayed properly In lists." msgstr "" "* Los tuits largos y citados deberían mostrarse correctamente en las listas." -#: changelog.py:193 +#: changelog.py:204 msgid "* The connection should be more stable." msgstr "* La conexión debería ser más estable." -#: changelog.py:194 +#: changelog.py:205 msgid "* Added an autostart option in the global settings dialogue." msgstr "" "* Se ha añadido la opción para iniciar después de iniciar sesión en Windows " "en el diálogo de opciones globales." -#: changelog.py:195 +#: changelog.py:206 msgid "* Updated translation." msgstr "* Se han actualizado las traducciones." -#: changelog.py:196 +#: changelog.py:207 msgid "* Updated russian documentation." msgstr "* Actualizada la documentación en ruso." -#: changelog.py:197 +#: changelog.py:208 msgid "* Tweets in cached database should be loaded properly." msgstr "* Se deben cargar correctamente los tuits en la base de datos." -#: changelog.py:198 +#: changelog.py:209 msgid "* Added some missed dictionaries for spelling correction." msgstr "" "* Se han añadido algunos nuevos diccionarios en el módulo de corrección " "ortográfica." -#: changelog.py:199 +#: changelog.py:210 msgid "" "* Timelines, lists and other buffer should be created in the right order at " "startup." @@ -1510,15 +1625,15 @@ msgstr "" "* Líneas temporales, listas y otros buffers deberían ser creados en el orden " "correcto al iniciar TWBlue." -#: changelog.py:201 +#: changelog.py:212 msgid "## Changes in version 0.84 " msgstr "## Cambios en la versión 0.84 " -#: changelog.py:203 +#: changelog.py:214 msgid "* More improvements in quoted and long tweets." msgstr "* Más mejoras en los tuits largos y citados." -#: changelog.py:204 +#: changelog.py:215 msgid "" "* Updated translations: Russian, Italian, French, Romanian, Galician and " "Finnish." @@ -1526,7 +1641,7 @@ msgstr "" "* Actualizadas las siguientes traducciones: Ruso, italiano, francés, rumano, " "gallego y finlandés." -#: changelog.py:205 +#: changelog.py:216 msgid "" "* Improvements in the audio uploader module: Now it can handle audio with " "non-english characters." @@ -1534,7 +1649,7 @@ msgstr "" "* Mejoras en el módulo de carga de archivos de audio: Ahora es capaz de " "manejar archivos de audio con caracteres especiales." -#: changelog.py:206 +#: changelog.py:217 msgid "" "* the title of the window should be updated properly when spellcheck, " "translate or shorten/unshorten URL buttons are pressed." @@ -1542,7 +1657,7 @@ msgstr "" "* El título de la ventana debe actualizarse correctamente cuando se utilizan " "funciones como corrección ortográfica, traducción o acortar / expandir URL." -#: changelog.py:207 +#: changelog.py:218 msgid "" "* the bug that changes the selected tweet in the home timeline shouldn't be " "happening so often." @@ -1550,11 +1665,11 @@ msgstr "" "* El error que hacía que el tuit seleccionado cambiara en la interfaz " "visible debería estar parcialmente corregido." -#: changelog.py:209 +#: changelog.py:220 msgid "## Changes in version 0.82 and 0.83" msgstr "## Cambios en las versiones 0.82 y 0.83" -#: changelog.py:211 +#: changelog.py:222 msgid "" "* If the tweet source (client) is an application with unicode characters " "(example: российская газета) it will not break the tweet displayer." @@ -1563,7 +1678,7 @@ msgstr "" "caracteres Unicode en su nombre (por ejemplo: российская газета), el " "visualizador de tuits lo podrá mostrar adecuadamente." -#: changelog.py:212 +#: changelog.py:223 msgid "" "* Added a new field for image description in tweet displayer. When " "available, it will show description for images posted in tweets." @@ -1572,7 +1687,7 @@ msgstr "" "tuits. Cuando estén disponibles, se mostrarán descripciones para las " "imágenes en el tuit." -#: changelog.py:213 +#: changelog.py:224 msgid "" "* users can add image descriptions to their photos. When uploading an image, " "a dialog will show for asking a description." @@ -1580,15 +1695,15 @@ msgstr "" "* Los usuarios ahora pueden añadir descripción a sus fotos. Al subir la " "imagen, aparecerá un diálogo para que se proporcione una descripción." -#: changelog.py:214 +#: changelog.py:225 msgid "* Redesigned upload image dialog." msgstr "* El diálogo para subir imágenes ha sido rediseñado." -#: changelog.py:215 +#: changelog.py:226 msgid "* Fixed photo uploads when posting tweets." msgstr "* Se ha corregido la carga de imágenes al publicar tuits." -#: changelog.py:216 +#: changelog.py:227 msgid "" "* When getting tweets for a conversation, ignores deleted tweets or some " "errors, now TWBlue will try to get as much tweets as possible, even if some " @@ -1598,23 +1713,23 @@ msgstr "" "los tuits eliminados y algunos errores comunes. TWBlue cargará la mayor " "cantidad de tuits posible." -#: changelog.py:217 +#: changelog.py:228 msgid "* Added audio playback from soundcloud." msgstr "* Añadida la reproducción de audio desde Soundcloud." -#: changelog.py:218 +#: changelog.py:229 msgid "* Now the session mute option don't makes the screen reader speaks." msgstr "" "* Al silenciar una sesión, el lector de pantalla ya no anunciará ningún " "contenido automáticamente." -#: changelog.py:219 +#: changelog.py:230 msgid "* Fixed the direct message dialog. Now it should be displayed properly." msgstr "" "* Corregido el diálogo de mensaje directo. Ahora debería mostrarse " "correctamente." -#: changelog.py:220 +#: changelog.py:231 msgid "" "* when a tweet is deleted in twitter, TWBlue should reflect this change and " "delete that tweet in every buffer it is displayed." @@ -1622,7 +1737,7 @@ msgstr "" "* Cuando se elimina un tuit, TWBlue debería reflejar el cambio y eliminar el " "tuit de todos los buffers donde se muestra." -#: changelog.py:221 +#: changelog.py:232 msgid "" "* If your session is broken, TWBlue will be able to remove it automatically " "instead just crashing." @@ -1630,12 +1745,12 @@ msgstr "" "* Si la configuración de una sesión ha sido dañada, TWBlue debería ser capaz " "de eliminarla y continuar en lugar de no abrirse." -#: changelog.py:222 +#: changelog.py:233 msgid "* audio uploader should display the current progress." msgstr "" "* El diálogo de carga de archivos de audio ahora muestra el progreso actual." -#: changelog.py:223 +#: changelog.py:234 msgid "" "* users can disable the check for updates feature at startup from the " "general tab, in the global settings dialogue." @@ -1643,7 +1758,7 @@ msgstr "" "* Es posible desactivar la comprobación automática de actualizaciones en el " "diálogo de opciones globales, en la pestaña General." -#: changelog.py:224 +#: changelog.py:235 msgid "" "* The invisible interface and the window should be synchronized when the " "client reconnects." @@ -1651,12 +1766,12 @@ msgstr "" "* La interfaz invisible y la ventana gráfica deben estar sincronizadas " "cuando el cliente se reconecta." -#: changelog.py:225 +#: changelog.py:236 msgid "* The documentation option in the systray icon should be enabled." msgstr "" "* La opción de documentación en la bandeja del sistema se encuentra activa." -#: changelog.py:226 +#: changelog.py:237 msgid "" "* In trending buffers, you can press enter for posting a tweet about the " "focused trend." @@ -1664,7 +1779,7 @@ msgstr "" "* En buffers de tendencias, puedes pulsar enter sobre cada tendencia para " "publicar un tuit acerca de ella." -#: changelog.py:227 +#: changelog.py:238 msgid "" "* Updated russian documentation and main program interface (thanks to " "Natalia Hedlund (Наталья Хедлунд), [@lifestar_n](https://twitter.com/" @@ -1673,19 +1788,19 @@ msgstr "" "* Actualizada la documentación e interfaz en ruso (gracias a Natalia Hedlund " "(Наталья Хедлунд), [@lifestar_n](https://twitter.com/lifestar_n) en twitter)" -#: changelog.py:228 +#: changelog.py:239 msgid "* updated translations." msgstr "* Actualizadas algunas traducciones." -#: changelog.py:230 +#: changelog.py:241 msgid "## Changes in Version 0.81" msgstr "## Cambios en la versión 0.81" -#: changelog.py:232 +#: changelog.py:243 msgid "* Updated translations" msgstr "* Traducciones actualizadas" -#: changelog.py:233 +#: changelog.py:244 msgid "" "* The updater module has received some improvements. Now it includes a " "Mirror URL for checking updates if the main URL is not available at the " @@ -1696,24 +1811,24 @@ msgstr "" "una URL con información de actualizaciones de respaldo por si la dirección " "principal no funciona." -#: changelog.py:234 +#: changelog.py:245 msgid "* some GUI elements now use keyboard shortcuts for common actions." msgstr "" "* Algunos elementos de la interfaz gráfica ahora utilizan atajos de teclado " "para acciones comunes." -#: changelog.py:235 +#: changelog.py:246 msgid "* fixed a bug in the geolocation dialog." msgstr "" "* Corregido un error en el diálogo para mostrar la información geográfica en " "Tuits." -#: changelog.py:236 +#: changelog.py:247 msgid "* the chicken nugget keymap should work properly." msgstr "" "* El mapa de teclado de chicken Nugget debería funcionar correctamente." -#: changelog.py:237 +#: changelog.py:248 msgid "" "* Added a new soundpack to the default installation of TWBlue, thanks to " "[@Deng90](https://twitter.com/deng90)" @@ -1721,11 +1836,11 @@ msgstr "" "* Se ha añadido un nuevo paquete de sonidos a la instalación predeterminada " "de TWBlue, gracias a [@Deng90](https://twitter.com/deng90)" -#: changelog.py:238 +#: changelog.py:249 msgid "* Now the changelog is written in an html File." msgstr "* La lista de cambios ahora está escrita en un archivo HTML." -#: changelog.py:239 +#: changelog.py:250 msgid "" "* Added some missed dictionaries in last version for the spell checking " "feature." @@ -1733,7 +1848,7 @@ msgstr "" "* Se han añadido algunos diccionarios al módulo de corrección ortográfica " "que no habían sido añadidos en la última versión." -#: changelog.py:240 +#: changelog.py:251 msgid "" "* Trimmed the beginnings of the sounds in the default soundpack. Thanks to " "[@masonasons](https://github.com/masonasons)" @@ -1742,7 +1857,7 @@ msgstr "" "de sonidos predeterminado. Gracias a [@masonasons](https://github.com/" "masonasons)" -#: changelog.py:241 +#: changelog.py:252 msgid "" "* Added Opus support for sound playback in TWBlue. Thanks to [@masonasons]" "(https://github.com/masonasons)" @@ -1750,7 +1865,7 @@ msgstr "" "* Añadido soporte al códec Opus en TWBlue. Gracias a [@masonasons](https://" "github.com/masonasons)" -#: changelog.py:242 +#: changelog.py:253 msgid "" "* Added a source field in view tweet dialogue. Thanks to [@masonasons]" "(https://github.com/masonasons)" @@ -1759,14 +1874,14 @@ msgstr "" "el visualizador de tuits. Gracias a [@masonasons](https://github.com/" "masonasons)" -#: changelog.py:243 +#: changelog.py:254 msgid "" "* You can load previous items in followers and friend buffers for others." msgstr "" "* Se pueden cargar más elementos en los buffers de seguidores y amigos de " "otros usuarios." -#: changelog.py:244 +#: changelog.py:255 msgid "" "* The Spell Checker dialogue should not display an error message when you " "have set \"default language\" in the global settings dialogue if your " @@ -1777,20 +1892,20 @@ msgstr "" "tu idioma se encuentra soportado. [#168](http://twblue.es/bugs/view.php?" "id=168)" -#: changelog.py:245 +#: changelog.py:256 msgid "* Updated romanian translation." msgstr "* Actualizada la traducción al rumano." -#: changelog.py:246 +#: changelog.py:257 msgid "* Some code cleanups." msgstr "* Limpieza del código." -#: changelog.py:247 +#: changelog.py:258 msgid "* The bug reports feature is fully operational again." msgstr "" "* El sistema de reporte de errores es completamente operativo de nuevo." -#: changelog.py:248 +#: changelog.py:259 msgid "" "* TWBlue should work again for users that contains special characters in " "windows usernames." @@ -1798,24 +1913,24 @@ msgstr "" "* TWBlue debería funcionar de nuevo para usuarios que contienen caracteres " "especiales en sus nombres de usuario de Windows." -#: changelog.py:249 +#: changelog.py:260 msgid "* Added more options for the tweet searches." msgstr "* Añadidas más opciones para las búsquedas en Twitter." -#: changelog.py:250 +#: changelog.py:261 msgid "* Added play_audio to the keymap editor." msgstr "* Añadida la función play_audio al editor de mapas de teclado." -#: changelog.py:251 +#: changelog.py:262 msgid "* Windows key is no longer required in the keymap editor" msgstr "" "* La tecla Windows ya no es obligatoria en el editor de mapas de teclado" -#: changelog.py:252 +#: changelog.py:263 msgid "* Switched to the Microsoft translator." msgstr "* hemos pasado a usar el servicio Microsoft translator." -#: changelog.py:253 +#: changelog.py:264 msgid "" "* You can update the current buffer by pressing ctrl+win+shift+u in the " "default keymap or in the buffer menu." @@ -1823,21 +1938,23 @@ msgstr "" "* Puedes actualizar el buffer actual pulsando ctrl+win+shift+u en la " "interfaz invisible o desde el menú buffer." -#: changelog.py:254 +#: changelog.py:265 msgid "* Changed some keystrokes in the windows 10 default keymap" msgstr "" "* Cambiados algunos atajos de teclado en el mapa de teclado de Windows 10" -#: changelog.py:255 +#: changelog.py:266 msgid "* New followers and friends buffer for user timelines." msgstr "* Nuevos buffers de amigos y seguidores para otros usuarios." -#: changelog.py:257 +#: changelog.py:268 msgid "---" msgstr "---" -#: changelog.py:258 -msgid "Copyright © 2014-2017, Manuel Cortez." +#: changelog.py:269 +#, fuzzy +#| msgid "Copyright © 2014-2017, Manuel Cortez." +msgid "Copyright © 2014-2021, Manuel Cortez." msgstr "Copyright © 2014-2017, Manuel Cortéz." #~ msgid "" diff --git a/scripts/twblue.nsi b/scripts/twblue.nsi index 9f1bfe95..f0a37095 100644 --- a/scripts/twblue.nsi +++ b/scripts/twblue.nsi @@ -14,7 +14,7 @@ SetCompress auto SetCompressor /solid lzma SetDatablockOptimize on VIAddVersionKey ProductName "TWBlue" -VIAddVersionKey LegalCopyright "Copyright 2014-2021 Manuel Cortéz." +VIAddVersionKey LegalCopyright "Copyright 2014-2022 MCV Software." VIAddVersionKey ProductVersion "0.95.0" VIAddVersionKey FileVersion "0.95.0" VIProductVersion "0.95.0" diff --git a/src/Conf.defaults b/src/Conf.defaults index a2b3760a..da579d6b 100644 --- a/src/Conf.defaults +++ b/src/Conf.defaults @@ -14,7 +14,7 @@ retweet_mode = string(default="ask") persist_size = integer(default=0) load_cache_in_memory=boolean(default=True) show_screen_names = boolean(default=False) -buffer_order = list(default=list('home','mentions', 'dm', 'sent_dm', 'sent_tweets','favorites','followers','friends','blocks','muted','events')) +buffer_order = list(default=list('home','mentions', 'dm', 'sent_dm', 'sent_tweets','favorites','followers','friends','blocks','muted')) [sound] volume = float(default=1.0) @@ -48,6 +48,12 @@ ocr_language = string(default="") braille_reporting = boolean(default=True) speech_reporting = boolean(default=True) +[templates] +tweet = string(default="$display_name, $text $image_descriptions $date. $source") +dm = string(default="$sender_display_name, $text $date") +dm_sent = string(default="Dm to $recipient_display_name, $text $date") +person = string(default="$display_name (@$screen_name). $followers followers, $following following, $tweets tweets. Joined Twitter $created_at.") + [filters] [user-aliases] \ No newline at end of file diff --git a/src/application.py b/src/application.py index 07632f4c..f173a916 100644 --- a/src/application.py +++ b/src/application.py @@ -1,16 +1,14 @@ # -*- coding: utf-8 -*- -import datetime - name = 'TWBlue' short_name='twblue' update_url = 'https://twblue.es/updates/updates.php' mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/updates.json' authors = ["Manuel Cortéz", "José Manuel Delicado"] authorEmail = "manuel@manuelcortez.net" -copyright = "Copyright (C) 2013-2021, Manuel cortéz." +copyright = "Copyright (C) 2013-2022, MCV Software." description = name+" is an app designed to use Twitter simply and efficiently while using minimal system resources. This app provides access to most Twitter features." -translators = ["Manuel Cortéz (English)", "Mohammed Al Shara, Hatoun Felemban (Arabic)", "Francisco Torres (Catalan)", "Manuel cortéz (Spanish)", "Sukil Etxenike Arizaleta (Basque)", "Jani Kinnunen (finnish)", "Oreonan (Français)", "Juan Buño (Galician)", "Steffen Schultz (German)", "Zvonimir Stanečić (Croatian)", "Robert Osztolykan (Hungarian)", "Christian Leo Mameli (Italian)", "Riku (Japanese)", "Paweł Masarczyk (Polish)", "Odenilton Júnior Santos (Portuguese)", "Florian Ionașcu, Nicușor Untilă (Romanian)", "Natalia Hedlund, Valeria Kuznetsova (Russian)", "Aleksandar Đurić (Serbian)", "Burak Yüksek (Turkish)"] -url = u"https://twblue.es" +translators = ["Manuel Cortéz (English)", "Mohammed Al Shara, Hatoun Felemban (Arabic)", "Francisco Torres (Catalan)", "Manuel cortéz (Spanish)", "Sukil Etxenike Arizaleta (Basque)", "Jani Kinnunen (finnish)", "Corentin Bacqué-Cazenave (Français)", "Juan Buño (Galician)", "Steffen Schultz (German)", "Zvonimir Stanečić (Croatian)", "Robert Osztolykan (Hungarian)", "Christian Leo Mameli (Italian)", "Riku (Japanese)", "Paweł Masarczyk (Polish)", "Odenilton Júnior Santos (Portuguese)", "Florian Ionașcu, Nicușor Untilă (Romanian)", "Natalia Hedlund, Valeria Kuznetsova (Russian)", "Aleksandar Đurić (Serbian)", "Burak Yüksek (Turkish)"] +url = "https://twblue.es" report_bugs_url = "https://github.com/manuelcortez/twblue/issues" supported_languages = [] version = "11" diff --git a/src/config_utils.py b/src/config_utils.py index fb0b2ccf..4861827c 100644 --- a/src/config_utils.py +++ b/src/config_utils.py @@ -4,6 +4,7 @@ from validate import Validator, ValidateError import os import string from logging import getLogger +from wxUI import commonMessageDialogs log = getLogger("config_utils") class ConfigLoadError(Exception): pass @@ -21,6 +22,7 @@ def load_config(config_path, configspec_path=None, copy=True, *args, **kwargs): return config else: log.exception("Error in config file: {0}".format(validated,)) + commonMessageDialogs.invalid_configuration() def is_blank(arg): "Check if a line is blank." diff --git a/src/controller/attach.py b/src/controller/attach.py deleted file mode 100644 index 08427142..00000000 --- a/src/controller/attach.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals -from builtins import object -import os -import widgetUtils -import logging -from wxUI.dialogs import attach as gui -log = logging.getLogger("controller.attach") - -class attach(object): - def __init__(self): - self.attachments = list() - self.dialog = gui.attachDialog() - widgetUtils.connect_event(self.dialog.photo, widgetUtils.BUTTON_PRESSED, self.upload_image) - widgetUtils.connect_event(self.dialog.remove, widgetUtils.BUTTON_PRESSED, self.remove_attachment) - self.dialog.get_response() - log.debug("Attachments controller started.") - - def upload_image(self, *args, **kwargs): - image, description = self.dialog.get_image() - if image != None: - imageInfo = {"type": "photo", "file": image, "description": description} - log.debug("Image data to upload: %r" % (imageInfo,)) - self.attachments.append(imageInfo) - info = [_(u"Photo"), description] - self.dialog.attachments.insert_item(False, *info) - self.dialog.remove.Enable(True) - - def remove_attachment(self, *args, **kwargs): - current_item = self.dialog.attachments.get_selected() - log.debug("Removing item %d" % (current_item,)) - if current_item == -1: current_item = 0 - self.attachments.pop(current_item) - self.dialog.attachments.remove_item(current_item) - self.check_remove_status() - log.debug("Removed") - - def check_remove_status(self): - if len(self.attachments) == 0 and self.dialog.attachments.get_count() == 0: - self.dialog.remove.Enable(False) diff --git a/src/controller/buffers/base/base.py b/src/controller/buffers/base/base.py index 41b31219..178dbd10 100644 --- a/src/controller/buffers/base/base.py +++ b/src/controller/buffers/base/base.py @@ -125,6 +125,9 @@ class Buffer(object): def share_item(self): pass + def can_share(self): + pass + def destroy_status(self): pass diff --git a/src/controller/buffers/twitter/base.py b/src/controller/buffers/twitter/base.py index 6890bd1c..9429aee1 100644 --- a/src/controller/buffers/twitter/base.py +++ b/src/controller/buffers/twitter/base.py @@ -19,7 +19,7 @@ import languageHandler import logging from audio_services import youtube_utils from controller.buffers.base import base -from sessions.twitter import compose, utils, reduce +from sessions.twitter import compose, utils, reduce, templates from mysc.thread_utils import call_threaded from tweepy.errors import TweepyException from tweepy.cursor import Cursor @@ -84,42 +84,15 @@ class BaseBuffer(base.Buffer): return _(u"Unknown buffer") def post_status(self, *args, **kwargs): - item = None - title = _(u"Tweet") - caption = _(u"Write the tweet here") + title = _("Tweet") + caption = _("Write the tweet here") tweet = messages.tweet(self.session, title, caption, "") - if tweet.message.get_response() == widgetUtils.OK: - if config.app["app-settings"]["remember_mention_and_longtweet"]: - config.app["app-settings"]["longtweet"] = tweet.message.long_tweet.GetValue() - config.app.write() - text = tweet.message.get_text() - if len(text) > 280 and tweet.message.get("long_tweet") == True: - if not hasattr(tweet, "attachments"): - text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text) - else: - text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1) - if not hasattr(tweet, "attachments") or len(tweet.attachments) == 0: - item = self.session.api_call(call_name="update_status", status=text, _sound="tweet_send.ogg", tweet_mode="extended") - else: - call_threaded(self.post_with_media, text=text, attachments=tweet.attachments) - # We will no longer will reuse the sent item from here as Streaming API should give us the new and correct item. - # but in case we'd need it, just uncomment the following couple of lines and make sure we reduce the item correctly. -# if item != None: -# pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"]) - if hasattr(tweet.message, "destroy"): tweet.message.destroy() - self.session.settings.write() - - def post_with_media(self, text, attachments): - media_ids = [] - for i in attachments: - img = self.session.twitter.media_upload(i["file"]) - self.session.twitter.create_media_metadata(media_id=img.media_id, alt_text=i["description"]) - media_ids.append(img.media_id) - item = self.session.twitter.update_status(status=text, media_ids=media_ids) - # We will no longer will reuse the sent item from here as Streaming API should give us the new and correct item. - # but in case we'd need it, just uncomment the following couple of lines and make sure we reduce the item correctly. -# if item != None: -# pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"]) + response = tweet.message.ShowModal() + if response == wx.ID_OK: + tweet_data = tweet.get_tweet_data() + call_threaded(self.session.send_tweet, *tweet_data) + if hasattr(tweet.message, "destroy"): + tweet.message.destroy() def get_formatted_message(self): if self.type == "dm" or self.name == "direct_messages": @@ -127,8 +100,10 @@ class BaseBuffer(base.Buffer): return self.get_message() def get_message(self): + template = self.session.settings["templates"]["tweet"] tweet = self.get_right_tweet() - return " ".join(self.compose_function(tweet, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)) + t = templates.render_tweet(tweet, template, self.session, relative_times=self.session.settings["general"]["relative_times"], offset_seconds=self.session.db["utc_offset"]) + return t def get_full_tweet(self): tweet = self.get_right_tweet() @@ -167,7 +142,7 @@ class BaseBuffer(base.Buffer): 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)) if self.name != "direct_messages": - val = self.session.call_paged(self.function, *self.args, **self.kwargs) + val = self.session.call_paged(self.function, self.name, *self.args, **self.kwargs) else: # 50 results are allowed per API call, so let's assume max value can be 50. # reference: https://developer.twitter.com/en/docs/twitter-api/v1/direct-messages/sending-and-receiving/api-reference/list-events @@ -199,9 +174,9 @@ class BaseBuffer(base.Buffer): self.put_items_on_list(number_of_items) if hasattr(self, "finished_timeline") and self.finished_timeline == False: if "-timeline" in self.name: - self.username = val[0].user.screen_name + self.username = self.session.get_user(self.kwargs.get("user_id")).screen_name elif "-favorite" in self.name: - self.username = self.session.api_call("get_user", **self.kwargs).screen_name + self.username = self.session.get_user(self.kwargs.get("user_id")).screen_name self.finished_timeline = True if number_of_items > 0 and self.name != "sent_tweets" and self.name != "sent_direct_messages" and self.sound != None and self.session.settings["sound"]["session_mute"] == False and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and play_sound == True: self.session.sound.play(self.sound) @@ -416,13 +391,18 @@ class BaseBuffer(base.Buffer): tweet = self.session.db[self.name][self.buffer.list.get_selected()] return tweet + def can_share(self): + tweet = self.get_right_tweet() + user = self.session.get_user(tweet.user) + is_protected = user.protected + return is_protected==False + @_tweets_exist def reply(self, *args, **kwargs): tweet = self.get_right_tweet() user = self.session.get_user(tweet.user) screen_name = user.screen_name id = tweet.id - twishort_enabled = hasattr(tweet, "twishort") users = utils.get_all_mentioned(tweet, self.session.db, field="screen_name") ids = utils.get_all_mentioned(tweet, self.session.db, field="id") # Build the window title @@ -430,38 +410,14 @@ class BaseBuffer(base.Buffer): title=_("Reply to {arg0}").format(arg0=screen_name) else: title=_("Reply") - message = messages.reply(self.session, title, _(u"Reply to %s") % (screen_name,), "", users=users, ids=ids) - if message.message.get_response() == widgetUtils.OK: + message = messages.reply(self.session, title, _("Reply to %s") % (screen_name,), "", users=users, ids=ids) + if message.message.ShowModal() == widgetUtils.OK: if config.app["app-settings"]["remember_mention_and_longtweet"]: - config.app["app-settings"]["longtweet"] = message.message.long_tweet.GetValue() if len(users) > 0: - config.app["app-settings"]["mention_all"] = message.message.mentionAll.GetValue() + config.app["app-settings"]["mention_all"] = message.message.mention_all.GetValue() config.app.write() - params = {"_sound": "reply_send.ogg", "in_reply_to_status_id": id, "tweet_mode": "extended"} - text = message.message.get_text() - if twishort_enabled == False: - excluded_ids = message.get_ids() - params["exclude_reply_user_ids"] =excluded_ids - params["auto_populate_reply_metadata"] =True - else: - mentioned_people = message.get_people() - text = "@"+screen_name+" "+mentioned_people+u" "+text - if len(text) > 280 and message.message.get("long_tweet") == True: - if message.image == None: - text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text) - else: - text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1) - params["status"] = text - if message.image == None: - params["call_name"] = "update_status" - else: - params["call_name"] = "update_status_with_media" - params["media"] = message.file - item = self.session.api_call(**params) - # We will no longer will reuse the sent item from here as Streaming API should give us the new and correct item. - # but in case we'd need it, just uncomment the following couple of lines and make sure we reduce the item correctly. -# if item != None: -# pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"]) + tweet_data = dict(text=message.message.text.GetValue(), attachments=message.attachments, poll_options=message.poll_options, poll_period=message.poll_period) + call_threaded(self.session.reply, in_reply_to_status_id=id, text=message.message.text.GetValue(), attachments=message.attachments, exclude_reply_user_ids=message.get_ids()) if hasattr(message.message, "destroy"): message.message.destroy() self.session.settings.write() @@ -477,25 +433,23 @@ class BaseBuffer(base.Buffer): else: screen_name = self.session.get_user(tweet.user).screen_name users = utils.get_all_users(tweet, self.session) - dm = messages.dm(self.session, _(u"Direct message to %s") % (screen_name,), _(u"New direct message"), users) - if dm.message.get_response() == widgetUtils.OK: - screen_name = dm.message.get("cb") + dm = messages.dm(self.session, _("Direct message to %s") % (screen_name,), _("New direct message"), users) + if dm.message.ShowModal() == widgetUtils.OK: + screen_name = dm.message.cb.GetValue() user = self.session.get_user_by_screen_name(screen_name) recipient_id = user - text = dm.message.get_text() - val = self.session.api_call(call_name="send_direct_message", recipient_id=recipient_id, text=text) - if val != None: - sent_dms = self.session.db["sent_direct_messages"] - if self.session.settings["general"]["reverse_timelines"] == False: - sent_dms.append(val) - else: - sent_dms.insert(0, val) - self.session.db["sent_direct_messages"] = sent_dms - pub.sendMessage("sent-dm", data=val, user=self.session.db["user_name"]) + text = dm.message.text.GetValue() + if len(dm.attachments) > 0: + attachment = dm.attachments[0] + else: + attachment = None + call_threaded(self.session.direct_message, text=text, recipient=recipient_id, attachment=attachment) if hasattr(dm.message, "destroy"): dm.message.destroy() @_tweets_exist def share_item(self, *args, **kwargs): + if self.can_share() == False: + return output.speak(_("This action is not supported on protected accounts.")) tweet = self.get_right_tweet() id = tweet.id if self.session.settings["general"]["retweet_mode"] == "ask": @@ -509,40 +463,20 @@ class BaseBuffer(base.Buffer): else: self._retweet_with_comment(tweet, id) - def _retweet_with_comment(self, tweet, id, comment=''): - # If quoting a retweet, let's quote the original tweet instead the retweet. + def _retweet_with_comment(self, tweet, id): if hasattr(tweet, "retweeted_status"): tweet = tweet.retweeted_status - if hasattr(tweet, "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 ”" % (self.session.get_user(tweet.user).screen_name, comments), max=256, messageType="retweet") - if comment != '': - retweet.message.set_text(comment) - if retweet.message.get_response() == widgetUtils.OK: - text = retweet.message.get_text() - text = text+" https://twitter.com/{0}/status/{1}".format(self.session.get_user(tweet.user).screen_name, id) - if retweet.image == None: - # We will no longer will reuse the sent item from here as Streaming API should give us the new and correct item. - # but in case we'd need it, just uncomment the following couple of lines and make sure we reduce the item correctly. - item = self.session.api_call(call_name="update_status", _sound="retweet_send.ogg", status=text, in_reply_to_status_id=id, tweet_mode="extended") -# if item != None: -# new_item = self.session.twitter.get_status(id=item.id, include_ext_alt_text=True, tweet_mode="extended") -# pub.sendMessage("sent-tweet", data=new_item, user=self.session.db["user_name"]) - else: - call_threaded(self.session.api_call, call_name="update_status", _sound="retweet_send.ogg", status=text, media=retweet.image) - if hasattr(retweet.message, "destroy"): retweet.message.destroy() + retweet = messages.tweet(session=self.session, title=_("Quote"), caption=_("Add your comment to the tweet"), max=256, thread_mode=False) + if retweet.message.ShowModal() == widgetUtils.OK: + text = retweet.message.text.GetValue() + tweet_data = dict(text=text, attachments=retweet.attachments, poll_period=retweet.poll_period, poll_options=retweet.poll_options) + tweet_data.update(quote_tweet_id=id) + call_threaded(self.session.send_tweet, *[tweet_data]) + if hasattr(retweet.message, "destroy"): + retweet.message.Destroy() def _direct_retweet(self, id): item = self.session.api_call(call_name="retweet", _sound="retweet_send.ogg", id=id) - # We will no longer will reuse the sent item from here as Streaming API should give us the new and correct item. - # but in case we'd need it, just uncomment the following couple of lines and make sure we reduce the item correctly. -# if item != None: - # Retweets are returned as non-extended tweets, so let's get the object as extended - # just before sending the event message. See https://github.com/manuelcortez/TWBlue/issues/253 -# item = self.session.twitter.get_status(id=item.id, include_ext_alt_text=True, tweet_mode="extended") -# pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"]) def onFocus(self, *args, **kwargs): tweet = self.get_tweet() @@ -557,6 +491,9 @@ class BaseBuffer(base.Buffer): self.session.sound.play("geo.ogg") if self.session.settings['sound']['indicate_img'] and utils.is_media(tweet): self.session.sound.play("image.ogg") + can_share = self.can_share() + pub.sendMessage("toggleShare", shareable=can_share) + self.buffer.retweet.Enable(can_share) def audio(self, url='', *args, **kwargs): if sound.URLPlayer.player.is_playing(): diff --git a/src/controller/buffers/twitter/directMessages.py b/src/controller/buffers/twitter/directMessages.py index b0c51e5b..776521d0 100644 --- a/src/controller/buffers/twitter/directMessages.py +++ b/src/controller/buffers/twitter/directMessages.py @@ -8,7 +8,7 @@ import config import languageHandler import logging from controller import messages -from sessions.twitter import compose, utils +from sessions.twitter import compose, utils, templates from mysc.thread_utils import call_threaded from tweepy.errors import TweepyException from pubsub import pub @@ -90,18 +90,12 @@ class DirectMessagesBuffer(base.BaseBuffer): def reply(self, *args, **kwargs): tweet = self.get_right_tweet() screen_name = self.session.get_user(tweet.message_create["sender_id"]).screen_name - message = messages.reply(self.session, _(u"Mention"), _(u"Mention to %s") % (screen_name,), "@%s " % (screen_name,), [screen_name,]) - if message.message.get_response() == widgetUtils.OK: - if config.app["app-settings"]["remember_mention_and_longtweet"]: - config.app["app-settings"]["longtweet"] = message.message.long_tweet.GetValue() - config.app.write() - if message.image == None: - item = self.session.api_call(call_name="update_status", _sound="reply_send.ogg", status=message.message.get_text(), tweet_mode="extended") - if item != None: - pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"]) - else: - call_threaded(self.session.api_call, call_name="update_status_with_media", _sound="reply_send.ogg", status=message.message.get_text(), media=message.file) - if hasattr(message.message, "destroy"): message.message.destroy() + message = messages.reply(session=self.session, title=_("Mention"), caption=_("Mention to %s") % (screen_name,), text="@%s " % (screen_name,), thread_mode=False, users=[screen_name,]) + if message.message.ShowModal() == widgetUtils.OK: + tweet_data = message.get_tweet_data() + call_threaded(self.session.send_tweet, tweet_data) + if hasattr(message.message, "destroy"): + message.message.destroy() def onFocus(self, *args, **kwargs): tweet = self.get_tweet() @@ -135,6 +129,12 @@ class DirectMessagesBuffer(base.BaseBuffer): def open_in_browser(self, *args, **kwargs): output.speak(_(u"This action is not supported in the buffer yet.")) + def get_message(self): + template = self.session.settings["templates"]["dm"] + dm = self.get_right_tweet() + t = templates.render_dm(dm, template, self.session, relative_times=self.session.settings["general"]["relative_times"], offset_seconds=self.session.db["utc_offset"]) + return t + class SentDirectMessagesBuffer(DirectMessagesBuffer): def __init__(self, *args, **kwargs): @@ -156,4 +156,10 @@ class SentDirectMessagesBuffer(DirectMessagesBuffer): else: for i in items: tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session) - self.buffer.list.insert_item(False, *tweet) \ No newline at end of file + self.buffer.list.insert_item(False, *tweet) + + def get_message(self): + template = self.session.settings["templates"]["dm_sent"] + dm = self.get_right_tweet() + t = templates.render_dm(dm, template, self.session, relative_times=self.session.settings["general"]["relative_times"], offset_seconds=self.session.db["utc_offset"]) + return t diff --git a/src/controller/buffers/twitter/people.py b/src/controller/buffers/twitter/people.py index 7f5c90b1..6d6c387d 100644 --- a/src/controller/buffers/twitter/people.py +++ b/src/controller/buffers/twitter/people.py @@ -16,7 +16,7 @@ import logging from mysc.thread_utils import call_threaded from tweepy.errors import TweepyException from pubsub import pub -from sessions.twitter import compose +from sessions.twitter import compose, templates from . import base log = logging.getLogger("controller.buffers.twitter.peopleBuffer") @@ -84,7 +84,10 @@ class PeopleBuffer(base.BaseBuffer): pass def get_message(self): - return " ".join(self.compose_function(self.get_tweet(), self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)) + template = self.session.settings["templates"]["person"] + user = self.get_right_tweet() + t = templates.render_person(user, template, self.session, relative_times=True, offset_seconds=self.session.db["utc_offset"]) + return t def delete_item(self): pass @@ -92,18 +95,12 @@ class PeopleBuffer(base.BaseBuffer): def reply(self, *args, **kwargs): tweet = self.get_right_tweet() screen_name = tweet.screen_name - message = messages.reply(self.session, _(u"Mention"), _(u"Mention to %s") % (screen_name,), "@%s " % (screen_name,), [screen_name,]) - if message.message.get_response() == widgetUtils.OK: - if config.app["app-settings"]["remember_mention_and_longtweet"]: - config.app["app-settings"]["longtweet"] = message.message.long_tweet.GetValue() - config.app.write() - if message.image == None: - item = self.session.api_call(call_name="update_status", _sound="reply_send.ogg", status=message.message.get_text(), tweet_mode="extended") - if item != None: - pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"]) - else: - call_threaded(self.session.api_call, call_name="update_status_with_media", _sound="reply_send.ogg", status=message.message.get_text(), media=message.file) - if hasattr(message.message, "destroy"): message.message.destroy() + message = messages.tweet(session=self.session, title=_("Mention"), caption=_("Mention to %s") % (screen_name,), text="@%s " % (screen_name,), thread_mode=False) + if message.message.ShowModal() == widgetUtils.OK: + tweet_data = message.get_tweet_data() + call_threaded(self.session.send_tweet, tweet_data) + if hasattr(message.message, "destroy"): + message.message.destroy() def start_stream(self, mandatory=False, play_sound=True, avoid_autoreading=False): # starts stream every 3 minutes. diff --git a/src/controller/buffers/twitter/search.py b/src/controller/buffers/twitter/search.py index 7a75d702..55205069 100644 --- a/src/controller/buffers/twitter/search.py +++ b/src/controller/buffers/twitter/search.py @@ -64,12 +64,16 @@ class SearchPeopleBuffer(people.PeopleBuffer): return False class ConversationBuffer(SearchBuffer): + last_thread_id = None + last_reply_id = None def start_stream(self, start=False, mandatory=False, play_sound=True, avoid_autoreading=False): current_time = time.time() if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory == True: self.execution_time = current_time + log.debug("Retrieving conversation. Last thread ID is {}, last reply ID is {}".format(self.last_thread_id, self.last_reply_id)) results = self.get_replies(self.tweet) + log.debug("Retrieved {} items before filters.".format(len(results))) number_of_items = self.session.order_buffer(self.name, results) log.debug("Number of items retrieved: %d" % (number_of_items,)) self.put_items_on_list(number_of_items) @@ -117,12 +121,12 @@ class ConversationBuffer(SearchBuffer): # find all tweets replying to the original thread only. Those tweets are sent by the same author who originally posted the first tweet. try: term = "conversation_id:{} from:{} to:{}".format(conversation_id, original_tweet.data.author_id, original_tweet.data.author_id) - thread_tweets = self.session.twitter_v2.search_recent_tweets(term, user_auth=True, max_results=98, tweet_fields=["in_reply_to_user_id", "author_id", "conversation_id"]) + thread_tweets = self.session.twitter_v2.search_recent_tweets(term, user_auth=True, max_results=98, since_id=self.last_thread_id, tweet_fields=["in_reply_to_user_id", "author_id", "conversation_id"]) if thread_tweets.data != None: thread_results.extend(thread_tweets.data) # Search only replies to conversation_id. term = "conversation_id:{}".format(conversation_id, original_tweet.data.author_id) - reply_tweets = self.session.twitter_v2.search_recent_tweets(term, user_auth=True, max_results=50, tweet_fields=["in_reply_to_user_id", "author_id", "conversation_id"]) + reply_tweets = self.session.twitter_v2.search_recent_tweets(term, user_auth=True, max_results=50, since_id=self.last_reply_id, tweet_fields=["in_reply_to_user_id", "author_id", "conversation_id"]) if reply_tweets.data != None: reply_results.extend(reply_tweets.data) except TweepyException as e: @@ -135,6 +139,7 @@ class ConversationBuffer(SearchBuffer): try: thread_results = self.session.twitter.lookup_statuses(ids, include_ext_alt_text=True, tweet_mode="extended") thread_results.sort(key=lambda x: x.id) + self.last_thread_id = thread_results[-1].id results.extend(thread_results) except TweepyException as e: log.exception("There was an error attempting to retrieve tweets for Twitter API V1.1, in conversation buffer {}".format(self.name)) @@ -144,7 +149,39 @@ class ConversationBuffer(SearchBuffer): try: reply_results = self.session.twitter.lookup_statuses(ids, include_ext_alt_text=True, tweet_mode="extended") reply_results.sort(key=lambda x: x.id) + self.last_reply_id = reply_results[-1].id results.extend(reply_results) except TweepyException as e: log.exception("There was an error attempting to retrieve tweets for Twitter API V1.1, in conversation buffer {}".format(self.name)) + return results + + def get_replies_v1(self, tweet): + try: + tweet = self.session.twitter.get_status(id=tweet.id, tweet_mode="extended") + except: + log.exception("Error getting tweet for making a conversation buffer.") + return [] + results = [] + results.append(tweet) + if hasattr(tweet, "in_reply_to_status_id") and tweet.in_reply_to_status_id != None: + while tweet.in_reply_to_status_id != None: + original_tweet = self.session.twitter.get_status(id=tweet.in_reply_to_status_id, tweet_mode="extended") + results.insert(0, original_tweet) + tweet = original_tweet + try: + term = "from:{} to:{}".format(tweet.user.screen_name, tweet.user.screen_name) + thread_tweets = self.session.twitter.search_tweets(term, count=100, since_id=tweet.id, tweet_mode="extended") + results.extend(thread_tweets) + except TweepyException as e: + log.exception("There was an error when attempting to retrieve the whole conversation for buffer {}".format(self.buffer.name)) + + try: + term = "to:{}".format(tweet.user.screen_name) + reply_tweets = self.session.twitter.search_tweets(term, count=100, since_id=tweet.id, tweet_mode="extended") + ids = [t.id for t in results] + reply_tweets = [t for t in reply_tweets if hasattr(t, "in_reply_to_status_id") and t.in_reply_to_status_id in ids] + results.extend(reply_tweets) + except TweepyException as e: + log.exception("There was an error when attempting to retrieve the whole conversation for buffer {}".format(self.buffer.name)) + results.sort(key=lambda x: x.id) return results \ No newline at end of file diff --git a/src/controller/buffers/twitter/trends.py b/src/controller/buffers/twitter/trends.py index d09aa5cf..16455971 100644 --- a/src/controller/buffers/twitter/trends.py +++ b/src/controller/buffers/twitter/trends.py @@ -4,7 +4,7 @@ import platform if platform.system() == "Windows": import wx from wxUI import buffers, commonMessageDialogs, menus - from controller import user + from controller import user, messages elif platform.system() == "Linux": from gi.repository import Gtk from gtkUI import buffers, commonMessageDialogs @@ -38,6 +38,18 @@ class TrendsBuffer(base.Buffer): self.get_formatted_message = self.get_message self.reply = self.search_topic + + def post_status(self, *args, **kwargs): + title = _("Tweet") + caption = _("Write the tweet here") + tweet = messages.tweet(self.session, title, caption, "") + response = tweet.message.ShowModal() + if response == wx.ID_OK: + tweet_data = tweet.get_tweet_data() + call_threaded(self.session.send_tweet, *tweet_data) + if hasattr(tweet.message, "destroy"): + tweet.message.destroy() + def start_stream(self, mandatory=False, play_sound=True, avoid_autoreading=False): # starts stream every 3 minutes. current_time = time.time() @@ -119,21 +131,13 @@ class TrendsBuffer(base.Buffer): def tweet_about_this_trend(self, *args, **kwargs): if self.buffer.list.get_count() == 0: return - title = _(u"Tweet") - caption = _(u"Write the tweet here") - tweet = messages.tweet(self.session, title, caption, self.get_message()+ " ") - tweet.message.set_cursor_at_end() - if tweet.message.get_response() == widgetUtils.OK: - text = tweet.message.get_text() - if len(text) > 280 and tweet.message.get("long_tweet") == True: - if tweet.image == None: - text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text) - else: - text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1) - if tweet.image == None: - call_threaded(self.session.api_call, call_name="update_status", status=text) - else: - call_threaded(self.session.api_call, call_name="update_status_with_media", status=text, media=tweet.image) + title = _("Tweet") + caption = _("Write the tweet here") + tweet = messages.tweet(session=self.session, title=title, caption=caption, text=self.get_message()+ " ") + tweet.message.SetInsertionPoint(len(tweet.message.GetValue())) + if tweet.message.ShowModal() == widgetUtils.OK: + tweet_data = tweet.get_tweet_data() + call_threaded(self.session.send_tweet, *tweet_data) if hasattr(tweet.message, "destroy"): tweet.message.destroy() def show_menu_by_key(self, ev): diff --git a/src/controller/editTemplateController.py b/src/controller/editTemplateController.py new file mode 100644 index 00000000..7251153c --- /dev/null +++ b/src/controller/editTemplateController.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +import re +import wx +from typing import List +from sessions.twitter.templates import tweet_variables, dm_variables, person_variables +from wxUI.dialogs.twitterDialogs import templateDialogs + +class EditTemplate(object): + def __init__(self, template: str, type: str) -> None: + super(EditTemplate, self).__init__() + self.default_template = template + if type == "tweet": + self.variables = tweet_variables + elif type == "dm": + self.variables = dm_variables + else: + self.variables = person_variables + self.template: str = template + + def validate_template(self, template: str) -> bool: + used_variables: List[str] = re.findall("\$\w+", template) + validated: bool = True + for var in used_variables: + if var[1:] not in self.variables: + validated = False + return validated + + def run_dialog(self) -> str: + dialog = templateDialogs.EditTemplateDialog(template=self.template, variables=self.variables, default_template=self.default_template) + response = dialog.ShowModal() + if response == wx.ID_SAVE: + validated: bool = self.validate_template(dialog.template.GetValue()) + if validated == False: + templateDialogs.invalid_template() + self.template = dialog.template.GetValue() + return self.run_dialog() + else: + return dialog.template.GetValue() + else: + return "" \ No newline at end of file diff --git a/src/controller/mainController.py b/src/controller/mainController.py index ddedb068..cc24c47a 100644 --- a/src/controller/mainController.py +++ b/src/controller/mainController.py @@ -134,6 +134,7 @@ class Controller(object): pub.subscribe(self.manage_blocked_user, "blocked-user") pub.subscribe(self.manage_unblocked_user, "unblocked-user") pub.subscribe(self.create_buffer, "createBuffer") + pub.subscribe(self.toggle_share_settings, "toggleShare") if system == "Windows": pub.subscribe(self.invisible_shorcuts_changed, "invisible-shorcuts-changed") widgetUtils.connect_event(self.view, widgetUtils.MENU, self.show_hide, menuitem=self.view.show_hide) @@ -334,17 +335,17 @@ class Controller(object): root_position =self.view.search(session.db["user_name"], session.db["user_name"]) for i in session.settings['general']['buffer_order']: if i == 'home': - pub.sendMessage("createBuffer", buffer_type="BaseBuffer", session_type=session.type, buffer_title=_("Home"), parent_tab=root_position, start=False, kwargs=dict(parent=self.view.nb, function="home_timeline", name="home_timeline", sessionObject=session, account=session.db["user_name"], sound="tweet_received.ogg", tweet_mode="extended")) + pub.sendMessage("createBuffer", buffer_type="BaseBuffer", session_type=session.type, buffer_title=_("Home"), parent_tab=root_position, start=False, kwargs=dict(parent=self.view.nb, function="home_timeline", name="home_timeline", sessionObject=session, account=session.db["user_name"], sound="tweet_received.ogg", include_ext_alt_text=True, tweet_mode="extended")) elif i == 'mentions': - pub.sendMessage("createBuffer", buffer_type="BaseBuffer", session_type=session.type, buffer_title=_("Mentions"), parent_tab=root_position, start=False, kwargs=dict(parent=self.view.nb, function="mentions_timeline", name="mentions", sessionObject=session, account=session.db["user_name"], sound="mention_received.ogg", tweet_mode="extended")) + pub.sendMessage("createBuffer", buffer_type="BaseBuffer", session_type=session.type, buffer_title=_("Mentions"), parent_tab=root_position, start=False, kwargs=dict(parent=self.view.nb, function="mentions_timeline", name="mentions", sessionObject=session, account=session.db["user_name"], sound="mention_received.ogg", include_ext_alt_text=True, tweet_mode="extended")) elif i == 'dm': pub.sendMessage("createBuffer", buffer_type="DirectMessagesBuffer", session_type=session.type, buffer_title=_("Direct messages"), parent_tab=root_position, start=False, kwargs=dict(parent=self.view.nb, function="get_direct_messages", name="direct_messages", sessionObject=session, account=session.db["user_name"], bufferType="dmPanel", compose_func="compose_direct_message", sound="dm_received.ogg")) elif i == 'sent_dm': pub.sendMessage("createBuffer", buffer_type="SentDirectMessagesBuffer", session_type=session.type, buffer_title=_("Sent direct messages"), parent_tab=root_position, start=False, kwargs=dict(parent=self.view.nb, function=None, name="sent_direct_messages", sessionObject=session, account=session.db["user_name"], bufferType="dmPanel", compose_func="compose_direct_message")) elif i == 'sent_tweets': - pub.sendMessage("createBuffer", buffer_type="BaseBuffer", session_type=session.type, buffer_title=_("Sent tweets"), parent_tab=root_position, start=False, kwargs=dict(parent=self.view.nb, function="user_timeline", name="sent_tweets", sessionObject=session, account=session.db["user_name"], screen_name=session.db["user_name"], tweet_mode="extended")) + pub.sendMessage("createBuffer", buffer_type="BaseBuffer", session_type=session.type, buffer_title=_("Sent tweets"), parent_tab=root_position, start=False, kwargs=dict(parent=self.view.nb, function="user_timeline", name="sent_tweets", sessionObject=session, account=session.db["user_name"], screen_name=session.db["user_name"], include_ext_alt_text=True, tweet_mode="extended")) elif i == 'favorites': - pub.sendMessage("createBuffer", buffer_type="BaseBuffer", session_type=session.type, buffer_title=_("Likes"), parent_tab=root_position, start=False, kwargs=dict(parent=self.view.nb, function="get_favorites", name="favourites", sessionObject=session, account=session.db["user_name"], sound="favourite.ogg", tweet_mode="extended")) + pub.sendMessage("createBuffer", buffer_type="BaseBuffer", session_type=session.type, buffer_title=_("Likes"), parent_tab=root_position, start=False, kwargs=dict(parent=self.view.nb, function="get_favorites", name="favourites", sessionObject=session, account=session.db["user_name"], sound="favourite.ogg", include_ext_alt_text=True, tweet_mode="extended")) elif i == 'followers': pub.sendMessage("createBuffer", buffer_type="PeopleBuffer", session_type=session.type, buffer_title=_("Followers"), parent_tab=root_position, start=False, kwargs=dict(parent=self.view.nb, function="get_followers", name="followers", sessionObject=session, account=session.db["user_name"], sound="update_followers.ogg", screen_name=session.db["user_name"])) elif i == 'friends': @@ -356,11 +357,11 @@ class Controller(object): pub.sendMessage("createBuffer", buffer_type="EmptyBuffer", session_type="base", buffer_title=_("Timelines"), parent_tab=root_position, start=False, kwargs=dict(parent=self.view.nb, name="timelines", account=session.db["user_name"])) timelines_position =self.view.search("timelines", session.db["user_name"]) for i in session.settings["other_buffers"]["timelines"]: - pub.sendMessage("createBuffer", buffer_type="BaseBuffer", session_type=session.type, buffer_title=_(u"Timeline for {}").format(i,), parent_tab=timelines_position, start=False, kwargs=dict(parent=self.view.nb, function="user_timeline", name="%s-timeline" % (i,), sessionObject=session, account=session.db["user_name"], sound="tweet_timeline.ogg", bufferType=None, user_id=i, tweet_mode="extended")) + pub.sendMessage("createBuffer", buffer_type="BaseBuffer", session_type=session.type, buffer_title=_(u"Timeline for {}").format(i,), parent_tab=timelines_position, start=False, kwargs=dict(parent=self.view.nb, function="user_timeline", name="%s-timeline" % (i,), sessionObject=session, account=session.db["user_name"], sound="tweet_timeline.ogg", bufferType=None, user_id=i, include_ext_alt_text=True, tweet_mode="extended")) pub.sendMessage("createBuffer", buffer_type="EmptyBuffer", session_type="base", buffer_title=_("Likes timelines"), parent_tab=root_position, start=False, kwargs=dict(parent=self.view.nb, name="favs_timelines", account=session.db["user_name"])) favs_timelines_position =self.view.search("favs_timelines", session.db["user_name"]) for i in session.settings["other_buffers"]["favourites_timelines"]: - pub.sendMessage("createBuffer", buffer_type="BaseBuffer", session_type=session.type, buffer_title=_("Likes for {}").format(i,), parent_tab=favs_timelines_position, start=False, kwargs=dict(parent=self.view.nb, function="get_favorites", name="%s-favorite" % (i,), sessionObject=session, account=session.db["user_name"], bufferType=None, sound="favourites_timeline_updated.ogg", user_id=i, tweet_mode="extended")) + pub.sendMessage("createBuffer", buffer_type="BaseBuffer", session_type=session.type, buffer_title=_("Likes for {}").format(i,), parent_tab=favs_timelines_position, start=False, kwargs=dict(parent=self.view.nb, function="get_favorites", name="%s-favorite" % (i,), sessionObject=session, account=session.db["user_name"], bufferType=None, sound="favourites_timeline_updated.ogg", user_id=i, include_ext_alt_text=True, tweet_mode="extended")) pub.sendMessage("createBuffer", buffer_type="EmptyBuffer", session_type="base", buffer_title=_("Followers timelines"), parent_tab=root_position, start=False, kwargs=dict(parent=self.view.nb, name="followers_timelines", account=session.db["user_name"])) followers_timelines_position =self.view.search("followers_timelines", session.db["user_name"]) for i in session.settings["other_buffers"]["followers_timelines"]: @@ -372,11 +373,11 @@ class Controller(object): pub.sendMessage("createBuffer", buffer_type="EmptyBuffer", session_type="base", buffer_title=_("Lists"), parent_tab=root_position, start=False, kwargs=dict(parent=self.view.nb, name="lists", account=session.db["user_name"])) lists_position =self.view.search("lists", session.db["user_name"]) for i in session.settings["other_buffers"]["lists"]: - pub.sendMessage("createBuffer", buffer_type="ListBuffer", session_type=session.type, buffer_title=_(u"List for {}").format(i), parent_tab=lists_position, start=False, kwargs=dict(parent=self.view.nb, function="list_timeline", name="%s-list" % (i,), sessionObject=session, account=session.db["user_name"], bufferType=None, sound="list_tweet.ogg", list_id=utils.find_list(i, session.db["lists"]), tweet_mode="extended")) + pub.sendMessage("createBuffer", buffer_type="ListBuffer", session_type=session.type, buffer_title=_(u"List for {}").format(i), parent_tab=lists_position, start=False, kwargs=dict(parent=self.view.nb, function="list_timeline", name="%s-list" % (i,), sessionObject=session, account=session.db["user_name"], bufferType=None, sound="list_tweet.ogg", list_id=utils.find_list(i, session.db["lists"]), include_ext_alt_text=True, tweet_mode="extended")) pub.sendMessage("createBuffer", buffer_type="EmptyBuffer", session_type="base", buffer_title=_("Searches"), parent_tab=root_position, start=False, kwargs=dict(parent=self.view.nb, name="searches", account=session.db["user_name"])) searches_position =self.view.search("searches", session.db["user_name"]) for i in session.settings["other_buffers"]["tweet_searches"]: - pub.sendMessage("createBuffer", buffer_type="SearchBuffer", session_type=session.type, buffer_title=_(u"Search for {}").format(i), parent_tab=searches_position, start=False, kwargs=dict(parent=self.view.nb, function="search_tweets", name="%s-searchterm" % (i,), sessionObject=session, account=session.db["user_name"], bufferType="searchPanel", sound="search_updated.ogg", q=i, tweet_mode="extended")) + pub.sendMessage("createBuffer", buffer_type="SearchBuffer", session_type=session.type, buffer_title=_(u"Search for {}").format(i), parent_tab=searches_position, start=False, kwargs=dict(parent=self.view.nb, function="search_tweets", name="%s-searchterm" % (i,), sessionObject=session, account=session.db["user_name"], bufferType="searchPanel", sound="search_updated.ogg", q=i, include_ext_alt_text=True, tweet_mode="extended")) for i in session.settings["other_buffers"]["trending_topic_buffers"]: pub.sendMessage("createBuffer", buffer_type="TrendsBuffer", session_type=session.type, buffer_title=_("Trending topics for %s") % (i), parent_tab=root_position, start=False, kwargs=dict(parent=self.view.nb, name="%s_tt" % (i,), sessionObject=session, account=session.db["user_name"], trendsFor=i, sound="trends_updated.ogg")) @@ -423,7 +424,7 @@ class Controller(object): buffer.session.settings["other_buffers"]["tweet_searches"].append(term) buffer.session.settings.write() args = {"lang": dlg.get_language(), "result_type": dlg.get_result_type()} - pub.sendMessage("createBuffer", buffer_type="SearchBuffer", session_type=buffer.session.type, buffer_title=_("Search for {}").format(term), parent_tab=searches_position, start=True, kwargs=dict(parent=self.view.nb, function="search_tweets", name="%s-searchterm" % (term,), sessionObject=buffer.session, account=buffer.session.db["user_name"], bufferType="searchPanel", sound="search_updated.ogg", q=term, tweet_mode="extended", **args)) + pub.sendMessage("createBuffer", buffer_type="SearchBuffer", session_type=buffer.session.type, buffer_title=_("Search for {}").format(term), parent_tab=searches_position, start=True, kwargs=dict(parent=self.view.nb, function="search_tweets", name="%s-searchterm" % (term,), sessionObject=buffer.session, account=buffer.session.db["user_name"], bufferType="searchPanel", sound="search_updated.ogg", q=term, include_ext_alt_text=True, tweet_mode="extended", **args)) else: log.error("A buffer for the %s search term is already created. You can't create a duplicate buffer." % (term,)) return @@ -872,7 +873,7 @@ class Controller(object): if usr.id_str in buff.session.settings["other_buffers"]["timelines"]: commonMessageDialogs.timeline_exist() return - tl = buffers.twitter.BaseBuffer(self.view.nb, "user_timeline", "%s-timeline" % (usr.id_str,), buff.session, buff.session.db["user_name"], bufferType=None, sound="tweet_timeline.ogg", user_id=usr.id_str, tweet_mode="extended") + tl = buffers.twitter.BaseBuffer(self.view.nb, "user_timeline", "%s-timeline" % (usr.id_str,), buff.session, buff.session.db["user_name"], bufferType=None, sound="tweet_timeline.ogg", user_id=usr.id_str, include_ext_alt_text=True, tweet_mode="extended") try: tl.start_stream(play_sound=False) except ValueError: @@ -891,7 +892,7 @@ class Controller(object): if usr.id_str in buff.session.settings["other_buffers"]["favourites_timelines"]: commonMessageDialogs.timeline_exist() return - tl = buffers.twitter.BaseBuffer(self.view.nb, "get_favorites", "%s-favorite" % (usr.id_str,), buff.session, buff.session.db["user_name"], bufferType=None, sound="favourites_timeline_updated.ogg", user_id=usr.id_str, tweet_mode="extended") + tl = buffers.twitter.BaseBuffer(self.view.nb, "get_favorites", "%s-favorite" % (usr.id_str,), buff.session, buff.session.db["user_name"], bufferType=None, sound="favourites_timeline_updated.ogg", user_id=usr.id_str, include_ext_alt_text=True, tweet_mode="extended") try: tl.start_stream(play_sound=False) except ValueError: @@ -1088,10 +1089,10 @@ class Controller(object): if position == page.buffer.list.get_selected(): page.session.sound.play("limit.ogg") - try: - output.speak(page.get_message(), True) - except: - pass +# try: + output.speak(page.get_message(), True) +# except: +# pass def down(self, *args, **kwargs): page = self.get_current_buffer() @@ -1100,16 +1101,16 @@ class Controller(object): return position = page.buffer.list.get_selected() index = position+1 - try: - page.buffer.list.select_item(index) - except: - pass +# try: + page.buffer.list.select_item(index) +# except: +# pass if position == page.buffer.list.get_selected(): page.session.sound.play("limit.ogg") - try: - output.speak(page.get_message(), True) - except: - pass +# try: + output.speak(page.get_message(), True) +# except: +# pass def left(self, *args, **kwargs): buff = self.view.get_current_buffer_pos() @@ -1202,18 +1203,18 @@ class Controller(object): def go_home(self): buffer = self.get_current_buffer() buffer.buffer.list.select_item(0) - try: - output.speak(buffer.get_message(), True) - except: - pass +# try: + output.speak(buffer.get_message(), True) +# except: +# pass def go_end(self): buffer = self.get_current_buffer() buffer.buffer.list.select_item(buffer.buffer.list.get_count()-1) - try: - output.speak(buffer.get_message(), True) - except: - pass +# try: + output.speak(buffer.get_message(), True) +# except: +# pass def go_page_up(self): buffer = self.get_current_buffer() @@ -1222,10 +1223,10 @@ class Controller(object): else: index = buffer.buffer.list.get_selected() - 20 buffer.buffer.list.select_item(index) - try: - output.speak(buffer.get_message(), True) - except: - pass +# try: + output.speak(buffer.get_message(), True) +# except: +# pass def go_page_down(self): buffer = self.get_current_buffer() @@ -1234,10 +1235,10 @@ class Controller(object): else: index = buffer.buffer.list.get_selected() + 20 buffer.buffer.list.select_item(index) - try: - output.speak(buffer.get_message(), True) - except: - pass +# try: + output.speak(buffer.get_message(), True) +# except: +# pass def url(self, *args, **kwargs): buffer = self.get_current_buffer() @@ -1385,7 +1386,7 @@ class Controller(object): buff = self.search_buffer("home_timeline", account) if create == True: if buffer == "favourites": - favourites = buffers.twitter.BaseBuffer(self.view.nb, "get_favorites", "favourites", buff.session, buff.session.db["user_name"], tweet_mode="extended") + favourites = buffers.twitter.BaseBuffer(self.view.nb, "get_favorites", "favourites", buff.session, buff.session.db["user_name"], include_ext_alt_text=True, tweet_mode="extended") self.buffers.append(favourites) self.view.insert_buffer(favourites.buffer, name=_(u"Likes"), pos=self.view.search(buff.session.db["user_name"], buff.session.db["user_name"])) favourites.start_stream(play_sound=False) @@ -1415,7 +1416,7 @@ class Controller(object): if create in buff.session.settings["other_buffers"]["lists"]: output.speak(_(u"This list is already opened"), True) return - tl = buffers.twitter.ListBuffer(self.view.nb, "list_timeline", create+"-list", buff.session, buff.session.db["user_name"], bufferType=None, list_id=utils.find_list(create, buff.session.db["lists"]), tweet_mode="extended") + tl = buffers.twitter.ListBuffer(self.view.nb, "list_timeline", create+"-list", buff.session, buff.session.db["user_name"], bufferType=None, list_id=utils.find_list(create, buff.session.db["lists"]), include_ext_alt_text=True, tweet_mode="extended") buff.session.lists.append(tl) pos=self.view.search("lists", buff.session.db["user_name"]) self.insert_buffer(tl, pos) @@ -1657,6 +1658,10 @@ class Controller(object): if sound_to_play != None and buff not in buffer.session.settings["other_buffers"]["muted_buffers"]: self.notify(buffer.session, sound_to_play) + def toggle_share_settings(self, shareable=True): + self.view.retweet.Enable(shareable) + + def check_streams(self): if self.started == False: return diff --git a/src/controller/messages.py b/src/controller/messages.py index a748464d..9b93ed58 100644 --- a/src/controller/messages.py +++ b/src/controller/messages.py @@ -1,123 +1,69 @@ # -*- coding: utf-8 -*- -import re -import platform +import os import arrow import languageHandler -system = platform.system() +import wx import widgetUtils import output -import url_shortener import sound import config from pubsub import pub from twitter_text import parse_tweet -if system == "Windows": - from wxUI.dialogs import message, urlList - from wxUI import commonMessageDialogs - from extra import translator, SpellChecker, autocompletionUsers - from extra.AudioUploader import audioUploader -elif system == "Linux": - from gtkUI.dialogs import message +from wxUI.dialogs import twitterDialogs, urlList +from wxUI import commonMessageDialogs +from extra import translator, SpellChecker, autocompletionUsers +from extra.AudioUploader import audioUploader from sessions.twitter import utils -from . import attach class basicTweet(object): """ This class handles the tweet main features. Other classes should derive from this class.""" - def __init__(self, session, title, caption, text, messageType="tweet", max=280, *args, **kwargs): + def __init__(self, session, title, caption, text="", messageType="tweet", max=280, *args, **kwargs): super(basicTweet, self).__init__() self.max = max self.title = title self.session = session - self.message = getattr(message, messageType)(title, caption, text, *args, **kwargs) + self.message = getattr(twitterDialogs, messageType)(title=title, caption=caption, message=text, *args, **kwargs) + self.message.text.SetValue(text) + self.message.text.SetInsertionPoint(len(self.message.text.GetValue())) widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck) - widgetUtils.connect_event(self.message.attach, widgetUtils.BUTTON_PRESSED, self.attach) + widgetUtils.connect_event(self.message.add_audio, widgetUtils.BUTTON_PRESSED, self.attach) widgetUtils.connect_event(self.message.text, widgetUtils.ENTERED_TEXT, self.text_processor) - widgetUtils.connect_event(self.message.shortenButton, widgetUtils.BUTTON_PRESSED, self.shorten) - widgetUtils.connect_event(self.message.unshortenButton, widgetUtils.BUTTON_PRESSED, self.unshorten) - widgetUtils.connect_event(self.message.translateButton, widgetUtils.BUTTON_PRESSED, self.translate) - if hasattr(self.message, "long_tweet"): - widgetUtils.connect_event(self.message.long_tweet, widgetUtils.CHECKBOX, self.text_processor) - if config.app["app-settings"]["remember_mention_and_longtweet"]: - self.message.long_tweet.SetValue(config.app["app-settings"]["longtweet"]) + widgetUtils.connect_event(self.message.translate, widgetUtils.BUTTON_PRESSED, self.translate) + if hasattr(self.message, "add"): + widgetUtils.connect_event(self.message.add, widgetUtils.BUTTON_PRESSED, self.on_attach) self.attachments = [] def translate(self, event=None): dlg = translator.gui.translateDialog() if dlg.get_response() == widgetUtils.OK: - text_to_translate = self.message.get_text() + text_to_translate = self.message.text.GetValue() language_dict = translator.translator.available_languages() for k in language_dict: if language_dict[k] == dlg.dest_lang.GetStringSelection(): dst = k msg = translator.translator.translate(text=text_to_translate, target=dst) - self.message.set_text(msg) + self.message.text.ChangeValue(msg) + self.message.text.SetInsertionPoint(len(self.message.text.GetValue())) self.text_processor() - self.message.text_focus() + self.message.text.SetFocus() output.speak(_(u"Translated")) else: return - def shorten(self, event=None): - urls = utils.find_urls_in_text(self.message.get_text()) - if len(urls) == 0: - output.speak(_(u"There's no URL to be shortened")) - self.message.text_focus() - elif len(urls) == 1: - self.message.set_text(self.message.get_text().replace(urls[0], url_shortener.shorten(urls[0]))) - output.speak(_(u"URL shortened")) - self.text_processor() - self.message.text_focus() - elif len(urls) > 1: - list_urls = urlList.urlList() - list_urls.populate_list(urls) - if list_urls.get_response() == widgetUtils.OK: - self.message.set_text(self.message.get_text().replace(urls[list_urls.get_item()], url_shortener.shorten(list_urls.get_string()))) - output.speak(_(u"URL shortened")) - self.text_processor() - self.message.text_focus() - - def unshorten(self, event=None): - urls = utils.find_urls_in_text(self.message.get_text()) - if len(urls) == 0: - output.speak(_(u"There's no URL to be expanded")) - self.message.text_focus() - elif len(urls) == 1: - self.message.set_text(self.message.get_text().replace(urls[0], url_shortener.unshorten(urls[0]))) - output.speak(_(u"URL expanded")) - self.text_processor() - self.message.text_focus() - elif len(urls) > 1: - list_urls = urlList.urlList() - list_urls.populate_list(urls) - if list_urls.get_response() == widgetUtils.OK: - self.message.set_text(self.message.get_text().replace(urls[list_urls.get_item()], url_shortener.unshorten(list_urls.get_string()))) - output.speak(_(u"URL expanded")) - self.text_processor() - self.message.text_focus() - def text_processor(self, *args, **kwargs): - if len(self.message.get_text()) > 1: - self.message.enable_button("shortenButton") - self.message.enable_button("unshortenButton") - else: - self.message.disable_button("shortenButton") - self.message.disable_button("unshortenButton") - if self.message.get("long_tweet") == False and hasattr(self, "max"): - text = self.message.get_text() - results = parse_tweet(text) - self.message.set_title(_(u"%s - %s of %d characters") % (self.title, results.weightedLength, self.max)) - if results.weightedLength > self.max: - self.session.sound.play("max_length.ogg") - else: - self.message.set_title(_(u"%s - %s characters") % (self.title, len(self.message.get_text()))) + text = self.message.text.GetValue() + results = parse_tweet(text) + self.message.SetTitle(_("%s - %s of %d characters") % (self.title, results.weightedLength, self.max)) + if results.weightedLength > self.max: + self.session.sound.play("max_length.ogg") def spellcheck(self, event=None): - text = self.message.get_text() + text = self.message.text.GetValue() checker = SpellChecker.spellchecker.spellChecker(text, "") if hasattr(checker, "fixed_text"): - self.message.set_text(checker.fixed_text) + self.message.text.ChangeValue(checker.fixed_text) self.text_processor() - self.message.text_focus() + self.message.text.SetFocus() def attach(self, *args, **kwargs): def completed_callback(dlg): @@ -125,48 +71,170 @@ class basicTweet(object): pub.unsubscribe(dlg.uploaderDialog.update, "uploading") dlg.uploaderDialog.destroy() if "sndup.net/" in url: - self.message.set_text(self.message.get_text()+url+" #audio") + self.message.text.ChangeValue(self.message.text.GetValue()+url+" #audio") self.text_processor() else: commonMessageDialogs.common_error(url) - dlg.cleanup() dlg = audioUploader.audioUploader(self.session.settings, completed_callback) - self.message.text_focus() + self.message.text.SetFocus() + + def can_attach(self): + if len(self.attachments) == 0: + return True + elif len(self.attachments) == 1 and (self.attachments[0]["type"] == "video" or self.attachments[0]["type"] == "gif"): + return False + elif len(self.attachments) < 4: + return True + return False + + def on_attach(self, *args, **kwargs): + can_attach = self.can_attach() + menu = self.message.attach_menu(can_attach) + self.message.Bind(wx.EVT_MENU, self.on_attach_image, self.message.add_image) + self.message.Bind(wx.EVT_MENU, self.on_attach_video, self.message.add_video) + if hasattr(self.message, "add_poll"): + self.message.Bind(wx.EVT_MENU, self.on_attach_poll, self.message.add_poll) + self.message.PopupMenu(menu, self.message.add.GetPosition()) + + def on_attach_image(self, *args, **kwargs): + can_attach = self.can_attach() + video_or_gif_present = False + for a in self.attachments: + if a["type"] == "video" or a["type"] == "gif": + video_or_gif = True + break + if can_attach == False or video_or_gif_present == True: + return self.message.unable_to_attach_file() + image, description = self.message.get_image() + if image != None: + if image.endswith("gif"): + image_type = "gif" + else: + image_type = "photo" + imageInfo = {"type": image_type, "file": image, "description": description} + if len(self.attachments) > 0 and image_type == "gif": + return self.message.unable_to_attach_file() + self.attachments.append(imageInfo) + self.message.add_item(item=[os.path.basename(imageInfo["file"]), imageInfo["type"], imageInfo["description"]]) + self.text_processor() + + def on_attach_video(self, *args, **kwargs): + if len(self.attachments) > 0: + return self.message.unable_to_attach_file() + video = self.message.get_video() + if video != None: + videoInfo = {"type": "video", "file": video, "description": ""} + if len(self.attachments) > 0: + return self.message.unable_to_attach_file() + self.attachments.append(videoInfo) + self.message.add_item(item=[os.path.basename(videoInfo["file"]), videoInfo["type"], videoInfo["description"]]) + self.text_processor() + + def on_attach_poll(self, *args, **kwargs): + dlg = twitterDialogs.poll() + if dlg.ShowModal() == wx.ID_OK: + self.poll_options = dlg.get_options() + self.poll_period = 60*24*dlg.period.GetValue() + dlg.Destroy() + + def remove_attachment(self, *args, **kwargs): + attachment = self.message.attachments.GetFocusedItem() + if attachment > -1 and len(self.attachments) > attachment: + self.attachments.pop(attachment) + self.message.remove_item(list_type="attachment") + self.text_processor() + self.message.text.SetFocus() class tweet(basicTweet): - def __init__(self, session, title, caption, text, max=280, messageType="tweet", *args, **kwargs): + def __init__(self, session, title, caption, text="", max=280, messageType="tweet", *args, **kwargs): + self.thread = [] + self.poll_options = None + self.poll_period = None super(tweet, self).__init__(session, title, caption, text, messageType, max, *args, **kwargs) - self.image = None - widgetUtils.connect_event(self.message.upload_image, widgetUtils.BUTTON_PRESSED, self.upload_image) - widgetUtils.connect_event(self.message.autocompletionButton, widgetUtils.BUTTON_PRESSED, self.autocomplete_users) + widgetUtils.connect_event(self.message.autocomplete_users, widgetUtils.BUTTON_PRESSED, self.autocomplete_users) + if hasattr(self.message, "add_tweet"): + widgetUtils.connect_event(self.message.add_tweet, widgetUtils.BUTTON_PRESSED, self.add_tweet) + widgetUtils.connect_event(self.message.remove_tweet, widgetUtils.BUTTON_PRESSED, self.remove_tweet) + widgetUtils.connect_event(self.message.remove_attachment, widgetUtils.BUTTON_PRESSED, self.remove_attachment) self.text_processor() - def upload_image(self, *args, **kwargs): - a = attach.attach() - if len(a.attachments) != 0: - self.attachments = a.attachments - def autocomplete_users(self, *args, **kwargs): c = autocompletionUsers.completion.autocompletionUsers(self.message, self.session.session_id) c.show_menu() + def add_tweet(self, event, update_gui=True, *args, **kwargs): + text = self.message.text.GetValue() + attachments = self.attachments[::] + tweetdata = dict(text=text, attachments=attachments, poll_options=self.poll_options, poll_period=self.poll_period) + self.thread.append(tweetdata) + self.attachments = [] + self.poll_options = None + self.poll_period = None + if update_gui: + self.message.reset_controls() + self.message.add_item(item=[text, len(attachments)], list_type="tweet") + self.message.text.SetFocus() + self.text_processor() + + def get_tweet_data(self): + self.add_tweet(event=None, update_gui=False) + return self.thread + + def text_processor(self, *args, **kwargs): + super(tweet, self).text_processor(*args, **kwargs) + if len(self.thread) > 0: + self.message.tweets.Enable(True) + self.message.remove_tweet.Enable(True) + else: + self.message.tweets.Enable(False) + self.message.remove_tweet.Enable(False) + if len(self.attachments) > 0: + self.message.attachments.Enable(True) + self.message.remove_attachment.Enable(True) + else: + self.message.attachments.Enable(False) + self.message.remove_attachment.Enable(False) + if hasattr(self.message, "add_tweet"): + if len(self.message.text.GetValue()) > 0 or len(self.attachments) > 0: + self.message.add_tweet.Enable(True) + else: + self.message.add_tweet.Enable(False) + + def remove_tweet(self, *args, **kwargs): + tweet = self.message.tweets.GetFocusedItem() + if tweet > -1 and len(self.thread) > tweet: + self.thread.pop(tweet) + self.message.remove_item(list_type="tweet") + self.text_processor() + self.message.text.SetFocus() + + class reply(tweet): def __init__(self, session, title, caption, text, users=[], ids=[]): super(reply, self).__init__(session, title, caption, text, messageType="reply", users=users) self.ids = ids self.users = users if len(users) > 0: - widgetUtils.connect_event(self.message.mentionAll, widgetUtils.CHECKBOX, self.mention_all) - self.message.enable_button("mentionAll") + widgetUtils.connect_event(self.message.mention_all, widgetUtils.CHECKBOX, self.mention_all) + self.message.mention_all.Enable(True) if config.app["app-settings"]["remember_mention_and_longtweet"]: - self.message.mentionAll.SetValue(config.app["app-settings"]["mention_all"]) + self.message.mention_all.SetValue(config.app["app-settings"]["mention_all"]) self.mention_all() - self.message.set_cursor_at_end() + self.message.text.SetInsertionPoint(len(self.message.text.GetValue())) self.text_processor() + def text_processor(self, *args, **kwargs): + super(tweet, self).text_processor(*args, **kwargs) + if len(self.attachments) > 0: + self.message.attachments.Enable(True) + self.message.remove_attachment.Enable(True) + else: + self.message.attachments.Enable(False) + self.message.remove_attachment.Enable(False) + def mention_all(self, *args, **kwargs): - if self.message.mentionAll.GetValue() == True: + if self.message.mention_all.GetValue() == True: for i in self.message.checkboxes: i.SetValue(True) i.Hide() @@ -176,10 +244,10 @@ class reply(tweet): i.Show() def get_ids(self): - excluded_ids = "" + excluded_ids = [] for i in range(0, len(self.message.checkboxes)): if self.message.checkboxes[i].GetValue() == False: - excluded_ids = excluded_ids + "{0},".format(self.ids[i],) + excluded_ids.append(self.ids[i]) return excluded_ids def get_people(self): @@ -190,20 +258,34 @@ class reply(tweet): return people class dm(basicTweet): - def __init__(self, session, title, caption, text): - super(dm, self).__init__(session, title, caption, text, messageType="dm", max=10000) - widgetUtils.connect_event(self.message.autocompletionButton, widgetUtils.BUTTON_PRESSED, self.autocomplete_users) + def __init__(self, session, title, caption, users): + super(dm, self).__init__(session, title, caption, messageType="dm", max=10000, users=users) + widgetUtils.connect_event(self.message.autocomplete_users, widgetUtils.BUTTON_PRESSED, self.autocomplete_users) self.text_processor() widgetUtils.connect_event(self.message.cb, widgetUtils.ENTERED_TEXT, self.user_changed) def user_changed(self, *args, **kwargs): - self.title = _("Direct message to %s") % (self.message.get_user()) + self.title = _("Direct message to %s") % (self.message.cb.GetValue()) self.text_processor() def autocomplete_users(self, *args, **kwargs): c = autocompletionUsers.completion.autocompletionUsers(self.message, self.session.session_id) c.show_menu("dm") + def text_processor(self, *args, **kwargs): + super(dm, self).text_processor(*args, **kwargs) + if len(self.attachments) > 0: + self.message.attachments.Enable(True) + self.message.remove_attachment.Enable(True) + else: + self.message.attachments.Enable(False) + self.message.remove_attachment.Enable(False) + + def can_attach(self): + if len(self.attachments) == 0: + return True + return False + class viewTweet(basicTweet): def __init__(self, tweet, tweetList, is_tweet=True, utc_offset=0, date="", item_url=""): """ This represents a tweet displayer. However it could be used for showing something wich is not a tweet, like a direct message or an event. @@ -264,31 +346,28 @@ class viewTweet(basicTweet): for z in tweet.retweeted_status.extended_entities["media"]: if "ext_alt_text" in z and z["ext_alt_text"] != None: image_description.append(z["ext_alt_text"]) - self.message = message.viewTweet(text, rt_count, favs_count, source, date) + self.message = twitterDialogs.viewTweet(text, rt_count, favs_count, source, date) results = parse_tweet(text) self.message.set_title(results.weightedLength) [self.message.set_image_description(i) for i in image_description] else: self.title = _(u"View item") text = tweet - self.message = message.viewNonTweet(text, date) + self.message = twitterDialogs.viewNonTweet(text, date) widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck) if item_url != "": self.message.enable_button("share") widgetUtils.connect_event(self.message.share, widgetUtils.BUTTON_PRESSED, self.share) self.item_url = item_url widgetUtils.connect_event(self.message.translateButton, widgetUtils.BUTTON_PRESSED, self.translate) - if self.contain_urls() == True: - self.message.enable_button("unshortenButton") - widgetUtils.connect_event(self.message.unshortenButton, widgetUtils.BUTTON_PRESSED, self.unshorten) - self.message.get_response() + self.message.ShowModal() - def contain_urls(self): - if len(utils.find_urls_in_text(self.message.get_text())) > 0: - return True - return False + # We won't need text_processor in this dialog, so let's avoid it. + def text_processor(self): + pass def clear_text(self, text): + text = utils.StripChars(text) urls = utils.find_urls_in_text(text) for i in urls: if "https://twitter.com/" in i: diff --git a/src/controller/settings.py b/src/controller/settings.py index 84040d2e..a8ae5702 100644 --- a/src/controller/settings.py +++ b/src/controller/settings.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import os import webbrowser +import logging import sound_lib import paths import widgetUtils @@ -8,17 +9,18 @@ import config import languageHandler import output import application +import config_utils +import keys +from collections import OrderedDict +from pubsub import pub +from mysc import autostart as autostart_windows from wxUI.dialogs import configuration from wxUI import commonMessageDialogs from extra.autocompletionUsers import settings from extra.ocr import OCRSpace -from pubsub import pub -import logging -import config_utils +from .editTemplateController import EditTemplate + log = logging.getLogger("Settings") -import keys -from collections import OrderedDict -from mysc import autostart as autostart_windows class globalSettingsController(object): def __init__(self): @@ -90,10 +92,12 @@ class globalSettingsController(object): config.app["app-settings"]["language"] = self.codes[self.dialog.general.language.GetSelection()] languageHandler.setLanguage(config.app["app-settings"]["language"]) self.needs_restart = True + log.debug("Triggered app restart due to interface language changes.") if self.kmnames[self.dialog.general.km.GetSelection()] != config.app["app-settings"]["load_keymap"]: config.app["app-settings"]["load_keymap"] =self.kmnames[self.dialog.general.km.GetSelection()] kmFile = open(os.path.join(paths.config_path(), "keymap.keymap"), "w") kmFile.close() + log.debug("Triggered app restart due to a keymap change.") self.needs_restart = True if config.app["app-settings"]["autostart"] != self.dialog.get_value("general", "autostart") and paths.mode == "installed": config.app["app-settings"]["autostart"] = self.dialog.get_value("general", "autostart") @@ -104,9 +108,11 @@ class globalSettingsController(object): if config.app["app-settings"]["no_streaming"] != self.dialog.get_value("general", "no_streaming"): config.app["app-settings"]["no_streaming"] = self.dialog.get_value("general", "no_streaming") self.needs_restart = True + log.debug("Triggered app restart due to change in streaming availability.") if config.app["app-settings"]["update_period"] != self.dialog.get_value("general", "update_period"): config.app["app-settings"]["update_period"] = self.dialog.get_value("general", "update_period") self.needs_restart = True + log.debug("Triggered app restart due to changes in update period.") config.app["app-settings"]["voice_enabled"] = self.dialog.get_value("general", "disable_sapi5") config.app["app-settings"]["hide_gui"] = self.dialog.get_value("general", "hide_gui") config.app["app-settings"]["ask_at_exit"] = self.dialog.get_value("general", "ask_at_exit") @@ -118,6 +124,7 @@ class globalSettingsController(object): if config.app["proxy"]["type"]!=self.dialog.get_value("proxy", "type") or config.app["proxy"]["server"] != self.dialog.get_value("proxy", "server") or config.app["proxy"]["port"] != self.dialog.get_value("proxy", "port") or config.app["proxy"]["user"] != self.dialog.get_value("proxy", "user") or config.app["proxy"]["password"] != self.dialog.get_value("proxy", "password"): if self.is_started == True: self.needs_restart = True + log.debug("Triggered app restart due to change in proxy settings.") config.app["proxy"]["type"] = self.dialog.proxy.type.Selection config.app["proxy"]["server"] = self.dialog.get_value("proxy", "server") config.app["proxy"]["port"] = self.dialog.get_value("proxy", "port") @@ -152,6 +159,15 @@ class accountSettingsController(globalSettingsController): self.dialog.create_reporting() self.dialog.set_value("reporting", "speech_reporting", self.config["reporting"]["speech_reporting"]) self.dialog.set_value("reporting", "braille_reporting", self.config["reporting"]["braille_reporting"]) + tweet_template = self.config["templates"]["tweet"] + dm_template = self.config["templates"]["dm"] + sent_dm_template = self.config["templates"]["dm_sent"] + person_template = self.config["templates"]["person"] + self.dialog.create_templates(tweet_template=tweet_template, dm_template=dm_template, sent_dm_template=sent_dm_template, person_template=person_template) + widgetUtils.connect_event(self.dialog.templates.tweet, widgetUtils.BUTTON_PRESSED, self.edit_tweet_template) + widgetUtils.connect_event(self.dialog.templates.dm, widgetUtils.BUTTON_PRESSED, self.edit_dm_template) + widgetUtils.connect_event(self.dialog.templates.sent_dm, widgetUtils.BUTTON_PRESSED, self.edit_sent_dm_template) + widgetUtils.connect_event(self.dialog.templates.person, widgetUtils.BUTTON_PRESSED, self.edit_person_template) self.dialog.create_other_buffers() buffer_values = self.get_buffers_list() self.dialog.buffers.insert_buffers(buffer_values) @@ -160,7 +176,6 @@ class accountSettingsController(globalSettingsController): widgetUtils.connect_event(self.dialog.buffers.up, widgetUtils.BUTTON_PRESSED, self.dialog.buffers.move_up) widgetUtils.connect_event(self.dialog.buffers.down, widgetUtils.BUTTON_PRESSED, self.dialog.buffers.move_down) - self.dialog.create_ignored_clients(self.config["twitter"]["ignored_clients"]) widgetUtils.connect_event(self.dialog.ignored_clients.add, widgetUtils.BUTTON_PRESSED, self.add_ignored_client) widgetUtils.connect_event(self.dialog.ignored_clients.remove, widgetUtils.BUTTON_PRESSED, self.remove_ignored_client) @@ -185,15 +200,53 @@ class accountSettingsController(globalSettingsController): self.dialog.set_title(_(u"Account settings for %s") % (self.user,)) self.response = self.dialog.get_response() + def edit_tweet_template(self, *args, **kwargs): + template = self.config["templates"]["tweet"] + control = EditTemplate(template=template, type="tweet") + result = control.run_dialog() + if result != "": # Template has been saved. + self.config["templates"]["tweet"] = result + self.config.write() + self.dialog.templates.tweet.SetLabel(_("Edit template for tweets. Current template: {}").format(result)) + + def edit_dm_template(self, *args, **kwargs): + template = self.config["templates"]["dm"] + control = EditTemplate(template=template, type="dm") + result = control.run_dialog() + if result != "": # Template has been saved. + self.config["templates"]["dm"] = result + self.config.write() + self.dialog.templates.dm.SetLabel(_("Edit template for direct messages. Current template: {}").format(result)) + + def edit_sent_dm_template(self, *args, **kwargs): + template = self.config["templates"]["dm_sent"] + control = EditTemplate(template=template, type="dm") + result = control.run_dialog() + if result != "": # Template has been saved. + self.config["templates"]["dm_sent"] = result + self.config.write() + self.dialog.templates.sent_dm.SetLabel(_("Edit template for sent direct messages. Current template: {}").format(result)) + + def edit_person_template(self, *args, **kwargs): + template = self.settings["templates"]["person"] + control = EditTemplate(template=template, type="person") + result = control.run_dialog() + if result != "": # Template has been saved. + self.config["templates"]["person"] = result + self.config.write() + self.dialog.templates.person.SetLabel(_("Edit template for persons. Current template: {}").format(result)) + def save_configuration(self): if self.config["general"]["relative_times"] != self.dialog.get_value("general", "relative_time"): self.needs_restart = True + log.debug("Triggered app restart due to change in relative times.") self.config["general"]["relative_times"] = self.dialog.get_value("general", "relative_time") self.config["general"]["show_screen_names"] = self.dialog.get_value("general", "show_screen_names") self.config["general"]["max_tweets_per_call"] = self.dialog.get_value("general", "itemsPerApiCall") if self.config["general"]["load_cache_in_memory"] != self.dialog.get_value("general", "load_cache_in_memory"): self.config["general"]["load_cache_in_memory"] = self.dialog.get_value("general", "load_cache_in_memory") self.needs_restart = True + log.debug("Triggered app restart due to change in database strategy management.") if self.config["general"]["persist_size"] != self.dialog.get_value("general", "persist_size"): if self.dialog.get_value("general", "persist_size") == '': self.config["general"]["persist_size"] =-1 @@ -206,6 +259,7 @@ class accountSettingsController(globalSettingsController): if self.config["general"]["reverse_timelines"] != self.dialog.get_value("general", "reverse_timelines"): self.needs_restart = True + log.debug("Triggered app restart due to change in timeline order.") self.config["general"]["reverse_timelines"] = self.dialog.get_value("general", "reverse_timelines") rt = self.dialog.get_value("general", "retweet_mode") if rt == _(u"Ask"): @@ -217,28 +271,11 @@ class accountSettingsController(globalSettingsController): buffers_list = self.dialog.buffers.get_list() if buffers_list != self.config["general"]["buffer_order"]: self.needs_restart = True + log.debug("Triggered app restart due to change in buffer ordering.") self.config["general"]["buffer_order"] = buffers_list self.config["reporting"]["speech_reporting"] = self.dialog.get_value("reporting", "speech_reporting") self.config["reporting"]["braille_reporting"] = self.dialog.get_value("reporting", "braille_reporting") self.config["mysc"]["ocr_language"] = OCRSpace.OcrLangs[self.dialog.extras.ocr_lang.GetSelection()] -# if self.config["other_buffers"]["show_followers"] != self.dialog.get_value("buffers", "followers"): -# self.config["other_buffers"]["show_followers"] = self.dialog.get_value("buffers", "followers") -# pub.sendMessage("create-new-buffer", buffer="followers", account=self.user, create=self.config["other_buffers"]["show_followers"]) -# if self.config["other_buffers"]["show_friends"] != self.dialog.get_value("buffers", "friends"): -# self.config["other_buffers"]["show_friends"] = self.dialog.get_value("buffers", "friends") -# pub.sendMessage("create-new-buffer", buffer="friends", account=self.user, create=self.config["other_buffers"]["show_friends"]) -# if self.config["other_buffers"]["show_favourites"] != self.dialog.get_value("buffers", "favs"): -# self.config["other_buffers"]["show_favourites"] = self.dialog.get_value("buffers", "favs") -# pub.sendMessage("create-new-buffer", buffer="favourites", account=self.user, create=self.config["other_buffers"]["show_favourites"]) -# if self.config["other_buffers"]["show_blocks"] != self.dialog.get_value("buffers", "blocks"): -# self.config["other_buffers"]["show_blocks"] = self.dialog.get_value("buffers", "blocks") -# pub.sendMessage("create-new-buffer", buffer="blocked", account=self.user, create=self.config["other_buffers"]["show_blocks"]) -# if self.config["other_buffers"]["show_muted_users"] != self.dialog.get_value("buffers", "mutes"): -# self.config["other_buffers"]["show_muted_users"] = self.dialog.get_value("buffers", "mutes") -# pub.sendMessage("create-new-buffer", buffer="muted", account=self.user, create=self.config["other_buffers"]["show_muted_users"]) -# if self.config["other_buffers"]["show_events"] != self.dialog.get_value("buffers", "events"): -# self.config["other_buffers"]["show_events"] = self.dialog.get_value("buffers", "events") -# pub.sendMessage("create-new-buffer", buffer="events", account=self.user, create=self.config["other_buffers"]["show_events"]) if self.config["sound"]["input_device"] != self.dialog.sound.get("input"): self.config["sound"]["input_device"] = self.dialog.sound.get("input") try: diff --git a/src/extra/autocompletionUsers/completion.py b/src/extra/autocompletionUsers/completion.py index 826dc699..9fa8c8ec 100644 --- a/src/extra/autocompletionUsers/completion.py +++ b/src/extra/autocompletionUsers/completion.py @@ -10,9 +10,9 @@ class autocompletionUsers(object): self.db = storage.storage(session_id) def show_menu(self, mode="tweet"): - position = self.window.get_position() + position = self.window.text.GetInsertionPoint() if mode == "tweet": - text = self.window.get_text() + text = self.window.text.GetValue() text = text[:position] try: pattern = text.split()[-1] @@ -24,14 +24,14 @@ class autocompletionUsers(object): users = self.db.get_users(pattern[1:]) if len(users) > 0: menu.append_options(users) - self.window.popup_menu(menu) + self.window.PopupMenu(menu, self.window.text.GetPosition()) menu.destroy() else: output.speak(_(u"There are no results in your users database")) else: output.speak(_(u"Autocompletion only works for users.")) elif mode == "dm": - text = self.window.get_user() + text = self.window.cb.GetValue() try: pattern = text.split()[-1] except IndexError: @@ -41,7 +41,7 @@ class autocompletionUsers(object): users = self.db.get_users(pattern) if len(users) > 0: menu.append_options(users) - self.window.popup_menu(menu) + self.window.PopupMenu(menu, self.window.text.GetPosition()) menu.destroy() else: output.speak(_(u"There are no results in your users database")) diff --git a/src/keymaps/Windows11.keymap b/src/keymaps/Windows11.keymap index 57ca311e..acda0961 100644 --- a/src/keymaps/Windows11.keymap +++ b/src/keymaps/Windows11.keymap @@ -42,7 +42,7 @@ toggle_buffer_mute = string(default="alt+win+shift+m") toggle_session_mute = string(default="control+alt+win+m") toggle_autoread = string(default="alt+win+e") search = string(default="alt+win+-") -edit_keystrokes = string(default="alt+win+k") +edit_keystrokes = string(default="control+alt+win+k") view_user_lists = string(default="alt+win+l") get_more_items = string(default="alt+win+pageup") reverse_geocode = string(default="control+win+g") diff --git a/src/locales/es/LC_MESSAGES/twblue.mo b/src/locales/es/LC_MESSAGES/twblue.mo index 6a57f84e..41660d8d 100644 Binary files a/src/locales/es/LC_MESSAGES/twblue.mo and b/src/locales/es/LC_MESSAGES/twblue.mo differ diff --git a/src/locales/es/LC_MESSAGES/twblue.po b/src/locales/es/LC_MESSAGES/twblue.po index 452cd695..55b892fd 100644 --- a/src/locales/es/LC_MESSAGES/twblue.po +++ b/src/locales/es/LC_MESSAGES/twblue.po @@ -1,8 +1,9 @@ msgid "" msgstr "" "Project-Id-Version: TW Blue 0.84\n" -"POT-Creation-Date: 2021-11-01 05:25-0600\n" -"PO-Revision-Date: 2021-11-01 05:44-0600\n" +"Report-Msgid-Bugs-To: manuel@manuelcortez.net\n" +"POT-Creation-Date: 2021-11-12 13:22-0600\n" +"PO-Revision-Date: 2021-11-12 13:29-0600\n" "Last-Translator: Manuel Cortez \n" "Language-Team: Manuel Cortez \n" "Language: es\n" @@ -15,1839 +16,90 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" -#: ../src\controller\attach.py:25 -msgid "Photo" -msgstr "Imagen" - -#: ../src\controller\buffers\base\base.py:91 -msgid "This action is not supported for this buffer" -msgstr "Esta acción no se encuentra soportada para este buffer" - -#: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:337 ../src\controller\settings.py:286 -msgid "Home" -msgstr "Inicio" - -#: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:339 ../src\controller\settings.py:287 -msgid "Mentions" -msgstr "Menciones" - -#: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:341 -msgid "Direct messages" -msgstr "Mensajes directos" - -#: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:343 ../src\controller\settings.py:289 -msgid "Sent direct messages" -msgstr "Mensajes directos enviados" - -#: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:345 ../src\controller\settings.py:290 -msgid "Sent tweets" -msgstr "Tuits enviados" - -#: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:347 -#: ../src\controller\mainController.py:1390 ../src\controller\settings.py:291 -msgid "Likes" -msgstr "Tuits marcados como me gusta" - -#: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:349 -#: ../src\controller\mainController.py:1395 ../src\controller\settings.py:292 -msgid "Followers" -msgstr "Seguidores" - -#: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:353 -#: ../src\controller\mainController.py:1405 ../src\controller\settings.py:294 -msgid "Blocked users" -msgstr "Usuarios bloqueados" - -#: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:355 -#: ../src\controller\mainController.py:1410 ../src\controller\settings.py:295 -msgid "Muted users" -msgstr "Usuarios silenciados" - -#: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:1400 ../src\controller\settings.py:293 -msgid "Friends" -msgstr "Amigos" - -#: ../src\controller\buffers\twitter\base.py:76 -msgid "{username}'s timeline" -msgstr "Línea temporal de {username}" - -#: ../src\controller\buffers\twitter\base.py:78 -msgid "{username}'s likes" -msgstr "Tuits que le gustan a {username}" - -#: ../src\controller\buffers\twitter\base.py:80 -msgid "{username}'s followers" -msgstr "Seguidores de {username}" - -#: ../src\controller\buffers\twitter\base.py:82 -msgid "{username}'s friends" -msgstr "Amigos de {username}" - -#: ../src\controller\buffers\twitter\base.py:84 -msgid "Unknown buffer" -msgstr "Buffer desconocido" - -#: ../src\controller\buffers\twitter\base.py:88 -#: ../src\controller\buffers\twitter\trends.py:122 -#: ../src\controller\messages.py:214 ../src\wxUI\buffers\base.py:25 -#: ../src\wxUI\buffers\events.py:15 ../src\wxUI\buffers\trends.py:18 -#: ../src\wxUI\dialogs\message.py:304 ../src\wxUI\sysTrayIcon.py:35 -msgid "Tweet" -msgstr "Tuit" - -#: ../src\controller\buffers\twitter\base.py:89 -#: ../src\controller\buffers\twitter\trends.py:123 -msgid "Write the tweet here" -msgstr "Escribe el tuit aquí" - -#: ../src\controller\buffers\twitter\base.py:219 -msgid "New tweet in {0}" -msgstr "Nuevo tuit en {0}" - -#: ../src\controller\buffers\twitter\base.py:222 -msgid "{0} new tweets in {1}." -msgstr "{0} nuevos tuits en {1}." - -#: ../src\controller\buffers\twitter\base.py:261 -#: ../src\controller\buffers\twitter\directMessages.py:88 -#: ../src\controller\buffers\twitter\people.py:180 -msgid "%s items retrieved" -msgstr "%s elementos recuperados" - -#: ../src\controller\buffers\twitter\base.py:293 -#: ../src\controller\buffers\twitter\people.py:80 -msgid "This buffer is not a timeline; it can't be deleted." -msgstr "Este buffer no es una línea temporal. No se puede eliminar." - -#: ../src\controller\buffers\twitter\base.py:430 -msgid "Reply to {arg0}" -msgstr "Responder a {arg0}" - -#: ../src\controller\buffers\twitter\base.py:432 -#: ../src\keystrokeEditor\constants.py:11 ../src\wxUI\buffers\base.py:27 -msgid "Reply" -msgstr "Responder" - -#: ../src\controller\buffers\twitter\base.py:433 -msgid "Reply to %s" -msgstr "Responder a %s" - -#: ../src\controller\buffers\twitter\base.py:480 -#: ../src\controller\buffers\twitter\directMessages.py:130 -msgid "New direct message" -msgstr "Nuevo mensaje directo" - -#: ../src\controller\buffers\twitter\base.py:480 -#: ../src\controller\messages.py:200 -msgid "Direct message to %s" -msgstr "Mensaje directo a %s" - -#: ../src\controller\buffers\twitter\base.py:520 -msgid "Add your comment to the tweet" -msgstr "Añade tu comentario al tuit" - -#: ../src\controller\buffers\twitter\base.py:520 -msgid "Quote" -msgstr "Citar" - -#: ../src\controller\buffers\twitter\base.py:596 -msgid "Opening URL..." -msgstr "Abriendo URL..." - -#: ../src\controller\buffers\twitter\base.py:633 -msgid "User details" -msgstr "Detalles del usuario" - -#: ../src\controller\buffers\twitter\base.py:654 -msgid "Opening item in web browser..." -msgstr "Abriendo elemento en el navegador..." - -#: ../src\controller\buffers\twitter\directMessages.py:93 -#: ../src\controller\buffers\twitter\people.py:95 -msgid "Mention to %s" -msgstr "Mencionar a %s" - -#: ../src\controller\buffers\twitter\directMessages.py:93 -#: ../src\controller\buffers\twitter\people.py:95 -#: ../src\wxUI\buffers\people.py:17 -msgid "Mention" -msgstr "Mención" - -#: ../src\controller\buffers\twitter\directMessages.py:133 -msgid "{0} new direct messages." -msgstr "{0} mensajes directos nuevos." - -#: ../src\controller\buffers\twitter\directMessages.py:136 -msgid "This action is not supported in the buffer yet." -msgstr "Esta acción todavía no se soporta en este buffer." - -#: ../src\controller\buffers\twitter\directMessages.py:146 -msgid "" -"Getting more items cannot be done in this buffer. Use the direct messages " -"buffer instead." -msgstr "" -"No se pueden obtener más elementos en este buffer. Usa el buffer de mensajes " -"directos en su lugar." - -#: ../src\controller\buffers\twitter\people.py:253 -msgid "{0} new followers." -msgstr "{0} nuevos seguidores." - -#: ../src\controller\buffers\twitter\trends.py:146 -msgid "This action is not supported in the buffer, yet." -msgstr "Esta acción todavía no se soporta en este buffer." - -#: ../src\controller\mainController.py:277 -msgid "Ready" -msgstr "Listo" - -#: ../src\controller\mainController.py:351 -msgid "Following" -msgstr "Siguiendo" - -#: ../src\controller\mainController.py:356 -msgid "Timelines" -msgstr "Líneas temporales" - -#: ../src\controller\mainController.py:359 -#: ../src\controller\mainController.py:883 -#: ../src\controller\mainController.py:1585 -msgid "Timeline for {}" -msgstr "Línea temporal de {0}" - -#: ../src\controller\mainController.py:360 -msgid "Likes timelines" -msgstr "Líneas temporales de tuits marcados con me gusta" - -#: ../src\controller\mainController.py:363 -#: ../src\controller\mainController.py:902 -#: ../src\controller\mainController.py:1587 -msgid "Likes for {}" -msgstr "Tuits que le gustan a {0}" - -#: ../src\controller\mainController.py:364 -msgid "Followers timelines" -msgstr "Líneas temporales de seguidores" - -#: ../src\controller\mainController.py:367 -#: ../src\controller\mainController.py:921 -#: ../src\controller\mainController.py:1589 -msgid "Followers for {}" -msgstr "Seguidores de {0}" - -#: ../src\controller\mainController.py:368 -msgid "Following timelines" -msgstr "Líneas temporales de siguiendo" - -#: ../src\controller\mainController.py:371 -#: ../src\controller\mainController.py:940 -#: ../src\controller\mainController.py:1591 -msgid "Friends for {}" -msgstr "Amigos de {0}" - -#: ../src\controller\mainController.py:372 ../src\wxUI\dialogs\lists.py:13 -msgid "Lists" -msgstr "Listas" - -#: ../src\controller\mainController.py:375 -#: ../src\controller\mainController.py:1422 -msgid "List for {}" -msgstr "Lista {0}" - -#: ../src\controller\mainController.py:376 -msgid "Searches" -msgstr "Búsquedas" - -#: ../src\controller\mainController.py:379 -#: ../src\controller\mainController.py:426 -#: ../src\controller\mainController.py:431 -msgid "Search for {}" -msgstr "Buscar {0}" - -#: ../src\controller\mainController.py:381 -#: ../src\controller\mainController.py:982 -#: ../src\controller\mainController.py:1593 -msgid "Trending topics for %s" -msgstr "Tendencias para %s" - -#: ../src\controller\mainController.py:448 -#: ../src\controller\mainController.py:464 -#: ../src\controller\mainController.py:1080 -#: ../src\controller\mainController.py:1099 -#: ../src\controller\mainController.py:1118 -#: ../src\controller\mainController.py:1137 -msgid "" -"No session is currently in focus. Focus a session with the next or previous " -"session shortcut." -msgstr "No estás en ninguna sesión. Cambia a una sesión activa." - -#: ../src\controller\mainController.py:452 -msgid "Empty buffer." -msgstr "Buffer vacío." - -#: ../src\controller\mainController.py:459 -msgid "{0} not found." -msgstr "{0} no encontrado." - -#: ../src\controller\mainController.py:469 -msgid "Filters cannot be applied on this buffer" -msgstr "No pueden aplicarse filtros sobre este buffer" - -#: ../src\controller\mainController.py:522 -#: ../src\controller\mainController.py:539 -#: ../src\controller\mainController.py:568 -msgid "Select the user" -msgstr "Selecciona un usuario" - -#: ../src\controller\mainController.py:753 -msgid "Add an user alias" -msgstr "Añadir alias de usuario" - -#: ../src\controller\mainController.py:761 -msgid "Alias has been set correctly for {}." -msgstr "Añadido el alias para {}" - -#: ../src\controller\mainController.py:829 ../src\controller\messages.py:245 -msgid "MMM D, YYYY. H:m" -msgstr "D MMM, YYYY. H:m" - -#: ../src\controller\mainController.py:957 -msgid "Conversation with {0}" -msgstr "Conversación con {0}" - -#: ../src\controller\mainController.py:998 -#: ../src\controller\mainController.py:1015 -msgid "There are no coordinates in this tweet" -msgstr "No hay coordenadas en este tuit" - -#: ../src\controller\mainController.py:1000 -#: ../src\controller\mainController.py:1019 -msgid "Error decoding coordinates. Try again later." -msgstr "Error decodificando las coordenadas. Inténtalo nuevamente más tarde." - -#: ../src\controller\mainController.py:1004 -msgid "Unable to find address in OpenStreetMap." -msgstr "Imposible encontrar dirección en Open Street Map." - -#: ../src\controller\mainController.py:1017 -msgid "There are no results for the coordinates in this tweet" -msgstr "No hay resultados para las coordenadas en este tuit" - -#: ../src\controller\mainController.py:1128 -#: ../src\controller\mainController.py:1147 -msgid "%s, %s of %s" -msgstr "%s, %s de %s" - -#: ../src\controller\mainController.py:1130 -#: ../src\controller\mainController.py:1149 -#: ../src\controller\mainController.py:1174 -#: ../src\controller\mainController.py:1199 -msgid "%s. Empty" -msgstr "%s. Vacío" - -#: ../src\controller\mainController.py:1162 -#: ../src\controller\mainController.py:1166 -#: ../src\controller\mainController.py:1187 -msgid "{0}: This account is not logged into Twitter." -msgstr "{0}: No has iniciado sesión con esta cuenta en Twitter." - -#: ../src\controller\mainController.py:1172 -#: ../src\controller\mainController.py:1197 -msgid "%s. %s, %s of %s" -msgstr "%s. %s, %s de %s" - -#: ../src\controller\mainController.py:1191 -msgid "{0}: This account is not logged into twitter." -msgstr "{0}: No has iniciado sesión con esta cuenta en Twitter." - -#: ../src\controller\mainController.py:1416 -msgid "This list is already opened" -msgstr "Esta lista ya ha sido abierta" - -#: ../src\controller\mainController.py:1446 -#: ../src\controller\mainController.py:1462 -msgid "" -"An error happened while trying to connect to the server. Please try later." -msgstr "" -"Ha ocurrido un error al intentar conectarse al servidor. Por favor, " -"inténtalo más tarde." - -#: ../src\controller\mainController.py:1498 -msgid "The auto-reading of new tweets is enabled for this buffer" -msgstr "La lectura automática de nuevos tuits para este buffer está activada" - -#: ../src\controller\mainController.py:1501 -msgid "The auto-reading of new tweets is disabled for this buffer" -msgstr "" -"La lectura automática de nuevos tuits para este buffer está desactivada" - -#: ../src\controller\mainController.py:1508 -msgid "Session mute on" -msgstr "Silencio de sesión activo" - -#: ../src\controller\mainController.py:1511 -msgid "Session mute off" -msgstr "Silencio de sesión desactivado" - -#: ../src\controller\mainController.py:1519 -msgid "Buffer mute on" -msgstr "Silenciar buffer, activado" - -#: ../src\controller\mainController.py:1522 -msgid "Buffer mute off" -msgstr "Silenciar buffer, desactivado" - -#: ../src\controller\mainController.py:1545 -msgid "Copied" -msgstr "Copiado" - -#: ../src\controller\mainController.py:1575 -msgid "Unable to update this buffer." -msgstr "Imposible actualizar este buffer." - -#: ../src\controller\mainController.py:1578 -msgid "Updating buffer..." -msgstr "Actualizando buffer..." - -#: ../src\controller\mainController.py:1581 -msgid "{0} items retrieved" -msgstr "{0} elementos descargados" - -#: ../src\controller\mainController.py:1600 -#: ../src\controller\mainController.py:1620 -msgid "Invalid buffer" -msgstr "Buffer inválido" - -#: ../src\controller\mainController.py:1611 -msgid "Picture {0}" -msgstr "Foto {0}" - -#: ../src\controller\mainController.py:1612 -msgid "Select the picture" -msgstr "Selecciona la foto" - -#: ../src\controller\mainController.py:1631 -msgid "Unable to extract text" -msgstr "Imposible extraer texto" - -#: ../src\controller\messages.py:56 -msgid "Translated" -msgstr "Traducido" - -#: ../src\controller\messages.py:63 -msgid "There's no URL to be shortened" -msgstr "No hay ninguna URL para acortar" - -#: ../src\controller\messages.py:67 ../src\controller\messages.py:75 -msgid "URL shortened" -msgstr "URL Acortada" - -#: ../src\controller\messages.py:82 -msgid "There's no URL to be expanded" -msgstr "No hay ninguna URL para expandir" - -#: ../src\controller\messages.py:86 ../src\controller\messages.py:94 -msgid "URL expanded" -msgstr "URL expandida" - -#: ../src\controller\messages.py:108 -msgid "%s - %s of %d characters" -msgstr "%s - %s de %d caracteres" - -#: ../src\controller\messages.py:112 -msgid "%s - %s characters" -msgstr "%s - %s caracteres" - -#: ../src\controller\messages.py:272 -msgid "View item" -msgstr "Ver elemento" - -#: ../src\controller\messages.py:301 -msgid "Link copied to clipboard." -msgstr "Enlace copiado al portapapeles" - -#: ../src\controller\settings.py:74 -msgid "HTTP" -msgstr "HTTP" - -#: ../src\controller\settings.py:74 -msgid "SOCKS v4" -msgstr "SOCKS v4" - -#: ../src\controller\settings.py:74 -msgid "SOCKS v4 with DNS support" -msgstr "SOCKS v4 con soporte DNS" - -#: ../src\controller\settings.py:74 -msgid "SOCKS v5" -msgstr "SOCKS v5" - -#: ../src\controller\settings.py:74 -msgid "SOCKS v5 with DNS support" -msgstr "SOCKS v5 con soporte DNS" - -#: ../src\controller\settings.py:74 -msgid "System default" -msgstr "Predeterminado del sistema" - -#: ../src\controller\settings.py:145 ../src\controller\settings.py:211 -#: ../src\wxUI\dialogs\configuration.py:116 -msgid "Ask" -msgstr "Preguntar" - -#: ../src\controller\settings.py:147 ../src\controller\settings.py:213 -#: ../src\wxUI\dialogs\configuration.py:116 -msgid "Retweet without comments" -msgstr "Retuitear sin comentario" - -#: ../src\controller\settings.py:149 ../src\wxUI\dialogs\configuration.py:116 -msgid "Retweet with comments" -msgstr "Retuitear añadiendo un comentario" - -#: ../src\controller\settings.py:185 -msgid "Account settings for %s" -msgstr "Opciones de la cuenta de %s" - -#: ../src\controller\settings.py:288 -msgid "Direct Messages" -msgstr "Mensajes directos" - -#: ../src\controller\user.py:29 ../src\controller\user.py:31 -#: ../src\extra\SpellChecker\wx_ui.py:80 ../src\issueReporter\wx_ui.py:84 -#: ../src\issueReporter\wx_ui.py:87 ../src\wxUI\commonMessageDialogs.py:39 -#: ../src\wxUI\commonMessageDialogs.py:51 -#: ../src\wxUI\commonMessageDialogs.py:58 -#: ../src\wxUI\commonMessageDialogs.py:61 -#: ../src\wxUI\commonMessageDialogs.py:64 -#: ../src\wxUI\commonMessageDialogs.py:67 -#: ../src\wxUI\commonMessageDialogs.py:77 -#: ../src\wxUI\commonMessageDialogs.py:80 -#: ../src\wxUI\commonMessageDialogs.py:83 -#: ../src\wxUI\commonMessageDialogs.py:89 -#: ../src\wxUI\commonMessageDialogs.py:92 -msgid "Error" -msgstr "Error" - -#: ../src\controller\user.py:29 ../src\wxUI\commonMessageDialogs.py:39 -msgid "That user does not exist" -msgstr "El usuario no existe" - -#: ../src\controller\user.py:31 -msgid "User has been suspended" -msgstr "El usuario ha sido suspendido" - -#: ../src\controller\user.py:37 -msgid "Information for %s" -msgstr "Detalles para %s" - -#: ../src\controller\user.py:67 ../src\extra\AudioUploader\audioUploader.py:127 -msgid "Discarded" -msgstr "Descartado" - -#: ../src\controller\user.py:95 -msgid "Username: @%s\n" -msgstr "Nombre de usuario: @%s\n" - -#: ../src\controller\user.py:96 -msgid "Name: %s\n" -msgstr "Nombre: %s\n" - -#: ../src\controller\user.py:98 -msgid "Location: %s\n" -msgstr "Ubicación: %s\n" - -#: ../src\controller\user.py:100 -msgid "URL: %s\n" -msgstr "URL: %s\n" - -#: ../src\controller\user.py:104 -msgid "Bio: %s\n" -msgstr "Descripción: %s\n" - -#: ../src\controller\user.py:105 ../src\controller\user.py:120 -msgid "Yes" -msgstr "Sí" - -#: ../src\controller\user.py:106 ../src\controller\user.py:121 -msgid "No" -msgstr "No" - -#: ../src\controller\user.py:107 -msgid "Protected: %s\n" -msgstr "Protegido: %s\n" - -#: ../src\controller\user.py:112 -msgid "You follow {0}. " -msgstr "Sigues a {0}. " - -#: ../src\controller\user.py:115 -msgid "{0} is following you." -msgstr "{0} te sigue." - -#: ../src\controller\user.py:119 -msgid "" -"Followers: %s\n" -" Friends: %s\n" -msgstr "" -"Seguidores: %s\n" -" Amigos: %s\n" - -#: ../src\controller\user.py:122 -msgid "Verified: %s\n" -msgstr "Verificado: %s\n" - -#: ../src\controller\user.py:123 -msgid "Tweets: %s\n" -msgstr "Tuits: %s\n" - -#: ../src\controller\user.py:124 -msgid "Likes: %s" -msgstr "Me gusta: %s" - -#: ../src\controller\userActionsController.py:74 -msgid "You can't ignore direct messages" -msgstr "No puedes ignorar los mensajes directos" - -#: ../src\controller\userAliasController.py:32 -msgid "Edit alias for {}" -msgstr "Editar alias para {}" - -#: ../src\extra\AudioUploader\audioUploader.py:57 -msgid "Attaching..." -msgstr "Adjuntando..." - -#: ../src\extra\AudioUploader\audioUploader.py:74 -msgid "Pause" -msgstr "Pausa" - -#: ../src\extra\AudioUploader\audioUploader.py:76 -msgid "&Resume" -msgstr "&Reanudar" - -#: ../src\extra\AudioUploader\audioUploader.py:77 -msgid "Resume" -msgstr "Reanudar" - -#: ../src\extra\AudioUploader\audioUploader.py:79 -#: ../src\extra\AudioUploader\audioUploader.py:106 -#: ../src\extra\AudioUploader\wx_ui.py:37 -msgid "&Pause" -msgstr "&Pausa" - -#: ../src\extra\AudioUploader\audioUploader.py:94 -#: ../src\extra\AudioUploader\audioUploader.py:140 -msgid "&Stop" -msgstr "&Detener" - -#: ../src\extra\AudioUploader\audioUploader.py:95 -msgid "Recording" -msgstr "Grabando" - -#: ../src\extra\AudioUploader\audioUploader.py:100 -#: ../src\extra\AudioUploader\audioUploader.py:151 -msgid "Stopped" -msgstr "Stopped" - -#: ../src\extra\AudioUploader\audioUploader.py:102 -#: ../src\extra\AudioUploader\wx_ui.py:39 -msgid "&Record" -msgstr "&Grabar" - -#: ../src\extra\AudioUploader\audioUploader.py:136 ../src\sound.py:148 -msgid "Playing..." -msgstr "Reproduciendo..." - -#: ../src\extra\AudioUploader\audioUploader.py:144 -#: ../src\extra\AudioUploader\audioUploader.py:154 -#: ../src\extra\AudioUploader\wx_ui.py:35 -msgid "&Play" -msgstr "&Reproducir" - -#: ../src\extra\AudioUploader\audioUploader.py:159 -msgid "Recoding audio..." -msgstr "Recodificando audio..." - -#: ../src\extra\AudioUploader\transfer.py:82 -#: ../src\extra\AudioUploader\transfer.py:88 -msgid "Error in file upload: {0}" -msgstr "Error al subir el archivo: {0}" - -#: ../src\extra\AudioUploader\utils.py:29 ../src\update\utils.py:29 -msgid "%d day, " -msgstr "%d día, " - -#: ../src\extra\AudioUploader\utils.py:31 ../src\update\utils.py:31 -msgid "%d days, " -msgstr "%d días, " - -#: ../src\extra\AudioUploader\utils.py:33 ../src\update\utils.py:33 -msgid "%d hour, " -msgstr "%d hora, " - -#: ../src\extra\AudioUploader\utils.py:35 ../src\update\utils.py:35 -msgid "%d hours, " -msgstr "%d horas, " - -#: ../src\extra\AudioUploader\utils.py:37 ../src\update\utils.py:37 -msgid "%d minute, " -msgstr "%d minuto, " - -#: ../src\extra\AudioUploader\utils.py:39 ../src\update\utils.py:39 -msgid "%d minutes, " -msgstr "%d minutos, " - -#: ../src\extra\AudioUploader\utils.py:41 ../src\update\utils.py:41 -msgid "%s second" -msgstr "%s segundo" - -#: ../src\extra\AudioUploader\utils.py:43 ../src\update\utils.py:43 -msgid "%s seconds" -msgstr "%s segundos" - -#: ../src\extra\AudioUploader\wx_transfer_dialogs.py:15 -msgid "File" -msgstr "Archivo" - -#: ../src\extra\AudioUploader\wx_transfer_dialogs.py:21 -msgid "Transferred" -msgstr "Transferido" - -#: ../src\extra\AudioUploader\wx_transfer_dialogs.py:26 -msgid "Total file size" -msgstr "Tamaño total del archivo" - -#: ../src\extra\AudioUploader\wx_transfer_dialogs.py:31 -msgid "Transfer rate" -msgstr "Velocidad de transferencia" - -#: ../src\extra\AudioUploader\wx_transfer_dialogs.py:36 -msgid "Time left" -msgstr "Tiempo restante" - -#: ../src\extra\AudioUploader\wx_ui.py:29 -msgid "Attach audio" -msgstr "Adjuntar audio" - -#: ../src\extra\AudioUploader\wx_ui.py:41 -msgid "&Add an existing file" -msgstr "&Añadir un archivo existente" - -#: ../src\extra\AudioUploader\wx_ui.py:42 -msgid "&Discard" -msgstr "&Descartar" - -#: ../src\extra\AudioUploader\wx_ui.py:44 -msgid "Upload to" -msgstr "Subir a" - -#: ../src\extra\AudioUploader\wx_ui.py:49 -msgid "Attach" -msgstr "Adjuntar" - -#: ../src\extra\AudioUploader\wx_ui.py:51 -msgid "&Cancel" -msgstr "&Cancelar" - -#: ../src\extra\AudioUploader\wx_ui.py:76 -msgid "Audio Files (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" -msgstr "Archivos de audio (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" - -#: ../src\extra\AudioUploader\wx_ui.py:76 -msgid "Select the audio file to be uploaded" -msgstr "Selecciona el archivo de audio que deseas subir" - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:7 -msgid "Audio tweet." -msgstr "Tuit con audio." - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:8 -msgid "User timeline buffer created." -msgstr "Línea temporal de un usuario creada." - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:9 -msgid "Buffer destroied." -msgstr "Buffer eliminado." - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:10 -msgid "Direct message received." -msgstr "Mensaje directo recibido." - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:11 -msgid "Direct message sent." -msgstr "Mensaje directo enviado." - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:12 -msgid "Error." -msgstr "Error." - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:13 -msgid "Tweet liked." -msgstr "Tuit marcado como me gusta." - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:14 -msgid "Likes buffer updated." -msgstr "Un Buffer de tuits marcados como me gusta se ha actualizado." - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:15 -msgid "Geotweet." -msgstr "Tuit con información geográfica." - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:16 -msgid "Tweet contains one or more images" -msgstr "El tuit contiene una o más imágenes" - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:17 -msgid "Boundary reached." -msgstr "No hay más elementos en el buffer." - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:18 -msgid "List updated." -msgstr "Lista actualizada." - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:19 -msgid "Too many characters." -msgstr "Demasiados caracteres." - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:20 -msgid "Mention received." -msgstr "Mención recibida." - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:21 -msgid "New event." -msgstr "Nuevo evento." - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:22 -msgid "{0} is ready." -msgstr "{0} está listo." - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:23 -msgid "Mention sent." -msgstr "Mención enviada." - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:24 -msgid "Tweet retweeted." -msgstr "Tuit retuiteado." - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:25 -msgid "Search buffer updated." -msgstr "Buffer de búsqueda actualizado." - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:26 -msgid "Tweet received." -msgstr "Tuit recibido." - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:27 -msgid "Tweet sent." -msgstr "Tuit enviado." - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:28 -msgid "Trending topics buffer updated." -msgstr "Buffer de trending topics actualizado." - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:29 -msgid "New tweet in user timeline buffer." -msgstr "Nuevo tuit en línea temporal de un usuario." - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:30 -msgid "New follower." -msgstr "Nuevo seguidor." - -#: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:31 -msgid "Volume changed." -msgstr "Volumen modificado." - -#: ../src\extra\SoundsTutorial\wx_ui.py:9 -msgid "Sounds tutorial" -msgstr "Tutorial de sonidos" - -#: ../src\extra\SoundsTutorial\wx_ui.py:12 -msgid "Press enter to listen to the sound for the selected event" -msgstr "Pulsa enter para escuchar el sonido para el evento seleccionado" - -#: ../src\extra\SpellChecker\spellchecker.py:60 -msgid "Misspelled word: %s" -msgstr "Palabra mal escrita: %s" - -#: ../src\extra\SpellChecker\wx_ui.py:28 -msgid "Misspelled word" -msgstr "Palabra mal escrita" - -#: ../src\extra\SpellChecker\wx_ui.py:33 -msgid "Context" -msgstr "Contexto" - -#: ../src\extra\SpellChecker\wx_ui.py:38 -msgid "Suggestions" -msgstr "Sugerencias" - -#: ../src\extra\SpellChecker\wx_ui.py:43 -msgid "&Ignore" -msgstr "&Ignorar" - -#: ../src\extra\SpellChecker\wx_ui.py:44 -msgid "I&gnore all" -msgstr "Ignorar &todo" - -#: ../src\extra\SpellChecker\wx_ui.py:45 -msgid "&Replace" -msgstr "&Reemplazar" - -#: ../src\extra\SpellChecker\wx_ui.py:46 -msgid "R&eplace all" -msgstr "R&eemplazar todo" - -#: ../src\extra\SpellChecker\wx_ui.py:47 -msgid "&Add to personal dictionary" -msgstr "Añadir al &diccionario" - -#: ../src\extra\SpellChecker\wx_ui.py:80 -msgid "" -"An error has occurred. There are no dictionaries available for the selected " -"language in {0}" -msgstr "" -"Ha ocurrido un error. No se encuentran diccionarios disponibles para el " -"idioma seleccionado en {0}." - -#: ../src\extra\SpellChecker\wx_ui.py:83 -msgid "Spell check complete." -msgstr "Corrección ortográfica finalizada." - -#: ../src\extra\autocompletionUsers\completion.py:20 -#: ../src\extra\autocompletionUsers\completion.py:38 -msgid "You have to start writing" -msgstr "Tienes que empezar a escribir" - -#: ../src\extra\autocompletionUsers\completion.py:30 -#: ../src\extra\autocompletionUsers\completion.py:47 -msgid "There are no results in your users database" -msgstr "No hay resultados en tu base de datos de usuarios" - -#: ../src\extra\autocompletionUsers\completion.py:32 -msgid "Autocompletion only works for users." -msgstr "El autocompletado solo funciona con usuarios." - -#: ../src\extra\autocompletionUsers\settings.py:25 -msgid "" -"Updating database... You can close this window now. A message will tell you " -"when the process finishes." -msgstr "" -"Actualizando base de datos... Puedes cerrar esta ventana ahora. Un mensaje " -"te informará cuando el proceso haya terminado." - -#: ../src\extra\autocompletionUsers\wx_manage.py:9 -msgid "Manage Autocompletion database" -msgstr "Gestionar la base de datos del autocompletado de usuarios" - -#: ../src\extra\autocompletionUsers\wx_manage.py:12 -msgid "Editing {0} users database" -msgstr "Editando la base de datos de usuarios de {0}" - -#: ../src\extra\autocompletionUsers\wx_manage.py:13 -msgid "Username" -msgstr "Nombre de usuario" - -#: ../src\extra\autocompletionUsers\wx_manage.py:13 -#: ../src\wxUI\dialogs\configuration.py:144 -msgid "Name" -msgstr "Nombre" - -#: ../src\extra\autocompletionUsers\wx_manage.py:16 -msgid "Add user" -msgstr "Añadir usuario" - -#: ../src\extra\autocompletionUsers\wx_manage.py:17 -msgid "Remove user" -msgstr "Quitar usuario" - -#: ../src\extra\autocompletionUsers\wx_manage.py:38 -msgid "Add user to database" -msgstr "Añadir usuario a la base de datos" - -#: ../src\extra\autocompletionUsers\wx_manage.py:38 -msgid "Twitter username" -msgstr "Nombre de usuario de Twitter" - -#: ../src\extra\autocompletionUsers\wx_manage.py:44 -msgid "The user does not exist" -msgstr "El usuario no existe" - -#: ../src\extra\autocompletionUsers\wx_manage.py:44 -#: ../src\wxUI\commonMessageDialogs.py:45 -msgid "Error!" -msgstr "¡Error!" - -#: ../src\extra\autocompletionUsers\wx_settings.py:8 -msgid "Autocomplete users' settings" -msgstr "Opciones de autocompletado de usuarios" - -#: ../src\extra\autocompletionUsers\wx_settings.py:11 -msgid "Add users from followers buffer" -msgstr "Añadir usuarios desde el buffer de seguidores" - -#: ../src\extra\autocompletionUsers\wx_settings.py:12 -msgid "Add users from friends buffer" -msgstr "Añadir usuarios desde el buffer de amigos" - -#: ../src\extra\autocompletionUsers\wx_settings.py:15 -msgid "Manage database..." -msgstr "Administrar base de datos..." - -#: ../src\extra\autocompletionUsers\wx_settings.py:27 -msgid "Done" -msgstr "¡Hecho" - -#: ../src\extra\autocompletionUsers\wx_settings.py:27 -msgid "{0}'s database of users has been updated." -msgstr "La base de datos de usuarios de {0} ha sido actualizada." - -#: ../src\extra\ocr\OCRSpace.py:7 -msgid "Detect automatically" -msgstr "Detectar automáticamente" - -#: ../src\extra\ocr\OCRSpace.py:7 ../src\extra\translator\translator.py:41 -msgid "Danish" -msgstr "Danés" - -#: ../src\extra\ocr\OCRSpace.py:7 ../src\extra\translator\translator.py:43 -msgid "Dutch" -msgstr "Holandés" - -#: ../src\extra\ocr\OCRSpace.py:7 ../src\extra\translator\translator.py:44 -msgid "English" -msgstr "Inglés" - -#: ../src\extra\ocr\OCRSpace.py:7 ../src\extra\translator\translator.py:48 -msgid "Finnish" -msgstr "Finés" - -#: ../src\extra\ocr\OCRSpace.py:7 ../src\extra\translator\translator.py:49 -msgid "French" -msgstr "Francés" - -#: ../src\extra\ocr\OCRSpace.py:7 ../src\extra\translator\translator.py:52 -msgid "German" -msgstr "Alemán" - -#: ../src\extra\ocr\OCRSpace.py:7 ../src\extra\translator\translator.py:58 -msgid "Hungarian" -msgstr "Húngaro" - -#: ../src\extra\ocr\OCRSpace.py:7 ../src\extra\translator\translator.py:63 -msgid "Italian" -msgstr "Italiano" - -#: ../src\extra\ocr\OCRSpace.py:7 ../src\extra\translator\translator.py:64 -msgid "Japanese" -msgstr "Japonés" - -#: ../src\extra\ocr\OCRSpace.py:7 ../src\extra\translator\translator.py:68 -msgid "Korean" -msgstr "Coreano" - -#: ../src\extra\ocr\OCRSpace.py:7 ../src\extra\translator\translator.py:85 -msgid "Polish" -msgstr "Polaco" - -#: ../src\extra\ocr\OCRSpace.py:7 ../src\extra\translator\translator.py:86 -msgid "Portuguese" -msgstr "Portugués" - -#: ../src\extra\ocr\OCRSpace.py:7 ../src\extra\translator\translator.py:89 -msgid "Russian" -msgstr "Ruso" - -#: ../src\extra\ocr\OCRSpace.py:7 ../src\extra\translator\translator.py:96 -msgid "Spanish" -msgstr "Español" - -#: ../src\extra\ocr\OCRSpace.py:7 ../src\extra\translator\translator.py:105 -msgid "Turkish" -msgstr "Turco" - -#: ../src\extra\translator\translator.py:22 -msgid "Afrikaans" -msgstr "Africano" - -#: ../src\extra\translator\translator.py:23 -msgid "Albanian" -msgstr "Albanés" - -#: ../src\extra\translator\translator.py:24 +#: languageHandler.py:61 +msgctxt "languageName" msgid "Amharic" msgstr "Amárico" -#: ../src\extra\translator\translator.py:25 -msgid "Arabic" -msgstr "Árabe" +#: languageHandler.py:62 +msgctxt "languageName" +msgid "Aragonese" +msgstr "Aragonés" -#: ../src\extra\translator\translator.py:26 -msgid "Armenian" -msgstr "Armenio" +#: languageHandler.py:63 +msgctxt "languageName" +msgid "Spanish" +msgstr "Español" -#: ../src\extra\translator\translator.py:27 -msgid "Azerbaijani" -msgstr "Acerí" +#: languageHandler.py:64 +msgctxt "languageName" +msgid "Portuguese" +msgstr "Portugués" -#: ../src\extra\translator\translator.py:28 -msgid "Basque" -msgstr "Vasco" +#: languageHandler.py:65 +msgctxt "languageName" +msgid "Russian" +msgstr "Ruso" -#: ../src\extra\translator\translator.py:29 -msgid "Belarusian" -msgstr "Bielorruso" +#: languageHandler.py:66 +msgctxt "languageName" +msgid "italian" +msgstr "Italiano" -#: ../src\extra\translator\translator.py:30 -msgid "Bengali" -msgstr "Bengalí" +#: languageHandler.py:67 +msgctxt "languageName" +msgid "Turkey" +msgstr "Turco" -#: ../src\extra\translator\translator.py:31 -msgid "Bihari" -msgstr "Bihari" - -#: ../src\extra\translator\translator.py:32 -msgid "Bulgarian" -msgstr "Búlgaro" - -#: ../src\extra\translator\translator.py:33 -msgid "Burmese" -msgstr "Birmano" - -#: ../src\extra\translator\translator.py:34 -msgid "Catalan" -msgstr "Catalán" - -#: ../src\extra\translator\translator.py:35 -msgid "Cherokee" -msgstr "Cheroqui" - -#: ../src\extra\translator\translator.py:36 -msgid "Chinese" -msgstr "Chino" - -#: ../src\extra\translator\translator.py:37 -msgid "Chinese_simplified" -msgstr "Chino simplificado" - -#: ../src\extra\translator\translator.py:38 -msgid "Chinese_traditional" -msgstr "Chino tradicional" - -#: ../src\extra\translator\translator.py:39 -msgid "Croatian" -msgstr "Croata" - -#: ../src\extra\translator\translator.py:40 -msgid "Czech" -msgstr "Checo" - -#: ../src\extra\translator\translator.py:42 -msgid "Dhivehi" -msgstr "Dhivehi" - -#: ../src\extra\translator\translator.py:45 -msgid "Esperanto" -msgstr "Esperanto" - -#: ../src\extra\translator\translator.py:46 -msgid "Estonian" -msgstr "Estonio" - -#: ../src\extra\translator\translator.py:47 -msgid "Filipino" -msgstr "Filipino" - -#: ../src\extra\translator\translator.py:50 +#: languageHandler.py:68 +msgctxt "languageName" msgid "Galician" msgstr "Gallego" -#: ../src\extra\translator\translator.py:51 -msgid "Georgian" -msgstr "Georgiano" +#: languageHandler.py:69 +msgctxt "languageName" +msgid "Catala" +msgstr "Catalán" -#: ../src\extra\translator\translator.py:53 -msgid "Greek" -msgstr "Griego" +#: languageHandler.py:70 +msgctxt "languageName" +msgid "Vasque" +msgstr "Vasco" -#: ../src\extra\translator\translator.py:54 -msgid "Guarani" -msgstr "Guaraní" +#: languageHandler.py:71 +msgctxt "languageName" +msgid "polish" +msgstr "Polaco" -#: ../src\extra\translator\translator.py:55 -msgid "Gujarati" -msgstr "Guyaratí" +#: languageHandler.py:72 +msgctxt "languageName" +msgid "Arabic" +msgstr "Árabe" -#: ../src\extra\translator\translator.py:56 -msgid "Hebrew" -msgstr "Hebreo" - -#: ../src\extra\translator\translator.py:57 -msgid "Hindi" -msgstr "Hindi" - -#: ../src\extra\translator\translator.py:59 -msgid "Icelandic" -msgstr "Islandés" - -#: ../src\extra\translator\translator.py:60 -msgid "Indonesian" -msgstr "Indonesio" - -#: ../src\extra\translator\translator.py:61 -msgid "Inuktitut" -msgstr "Inuktitut" - -#: ../src\extra\translator\translator.py:62 -msgid "Irish" -msgstr "Irlandés" - -#: ../src\extra\translator\translator.py:65 -msgid "Kannada" -msgstr "Canarés" - -#: ../src\extra\translator\translator.py:66 -msgid "Kazakh" -msgstr "Kazajo" - -#: ../src\extra\translator\translator.py:67 -msgid "Khmer" -msgstr "Camboyano" - -#: ../src\extra\translator\translator.py:69 -msgid "Kurdish" -msgstr "Kurdo" - -#: ../src\extra\translator\translator.py:70 -msgid "Kyrgyz" -msgstr "Kirguís" - -#: ../src\extra\translator\translator.py:71 -msgid "Laothian" -msgstr "Lao" - -#: ../src\extra\translator\translator.py:72 -msgid "Latvian" -msgstr "Letón" - -#: ../src\extra\translator\translator.py:73 -msgid "Lithuanian" -msgstr "Lituano" - -#: ../src\extra\translator\translator.py:74 -msgid "Macedonian" -msgstr "Macedonio" - -#: ../src\extra\translator\translator.py:75 -msgid "Malay" -msgstr "Malayo" - -#: ../src\extra\translator\translator.py:76 -msgid "Malayalam" -msgstr "Malayalam" - -#: ../src\extra\translator\translator.py:77 -msgid "Maltese" -msgstr "Maltés" - -#: ../src\extra\translator\translator.py:78 -msgid "Marathi" -msgstr "Maratí" - -#: ../src\extra\translator\translator.py:79 -msgid "Mongolian" -msgstr "Mongol" - -#: ../src\extra\translator\translator.py:80 +#: languageHandler.py:73 +msgctxt "languageName" msgid "Nepali" msgstr "Nepalí" -#: ../src\extra\translator\translator.py:81 -msgid "Norwegian" -msgstr "Noruego" - -#: ../src\extra\translator\translator.py:82 -msgid "Oriya" -msgstr "Oriya" - -#: ../src\extra\translator\translator.py:83 -msgid "Pashto" -msgstr "Pastú" - -#: ../src\extra\translator\translator.py:84 -msgid "Persian" -msgstr "Persa" - -#: ../src\extra\translator\translator.py:87 -msgid "Punjabi" -msgstr "Panyabí" - -#: ../src\extra\translator\translator.py:88 -msgid "Romanian" -msgstr "Rumano" - -#: ../src\extra\translator\translator.py:90 -msgid "Sanskrit" -msgstr "Sánscrito" - -#: ../src\extra\translator\translator.py:91 -msgid "Serbian" +#: languageHandler.py:74 +msgctxt "languageName" +msgid "Serbian (Latin)" msgstr "Serbio" -#: ../src\extra\translator\translator.py:92 -msgid "Sindhi" -msgstr "Sindhi" +#: languageHandler.py:75 +msgctxt "languageName" +msgid "Japanese" +msgstr "Japonés" -#: ../src\extra\translator\translator.py:93 -msgid "Sinhalese" -msgstr "Cingalés" - -#: ../src\extra\translator\translator.py:94 -msgid "Slovak" -msgstr "Eslovaco" - -#: ../src\extra\translator\translator.py:95 -msgid "Slovenian" -msgstr "Esloveno" - -#: ../src\extra\translator\translator.py:97 -msgid "Swahili" -msgstr "Suajili" - -#: ../src\extra\translator\translator.py:98 -msgid "Swedish" -msgstr "Sueco" - -#: ../src\extra\translator\translator.py:99 -msgid "Tajik" -msgstr "Tayiko" - -#: ../src\extra\translator\translator.py:100 -msgid "Tamil" -msgstr "Tamil" - -#: ../src\extra\translator\translator.py:101 -msgid "Tagalog" -msgstr "Tagalo" - -#: ../src\extra\translator\translator.py:102 -msgid "Telugu" -msgstr "Telugú" - -#: ../src\extra\translator\translator.py:103 -msgid "Thai" -msgstr "Tailandés" - -#: ../src\extra\translator\translator.py:104 -msgid "Tibetan" -msgstr "Tibetano" - -#: ../src\extra\translator\translator.py:106 -msgid "Ukrainian" -msgstr "Ucraniano" - -#: ../src\extra\translator\translator.py:107 -msgid "Urdu" -msgstr "Urdu" - -#: ../src\extra\translator\translator.py:108 -msgid "Uzbek" -msgstr "Uzbeco" - -#: ../src\extra\translator\translator.py:109 -msgid "Uighur" -msgstr "Uigur" - -#: ../src\extra\translator\translator.py:110 -msgid "Vietnamese" -msgstr "Vietnamita" - -#: ../src\extra\translator\translator.py:111 -msgid "Welsh" -msgstr "Galés" - -#: ../src\extra\translator\translator.py:112 -msgid "Yiddish" -msgstr "Yídish" - -#: ../src\extra\translator\wx_ui.py:29 -msgid "Translate message" -msgstr "Traducir mensaje" - -#: ../src\extra\translator\wx_ui.py:32 -msgid "Target language" -msgstr "Idioma de destino" - -#: ../src\issueReporter\issueReporter.py:32 -#: ../src\wxUI\dialogs\configuration.py:359 -#: ../src\wxUI\dialogs\configuration.py:368 -msgid "General" -msgstr "General" - -#: ../src\issueReporter\issueReporter.py:33 -msgid "always" -msgstr "siempre" - -#: ../src\issueReporter\issueReporter.py:33 -msgid "have not tried" -msgstr "no se ha intentado" - -#: ../src\issueReporter\issueReporter.py:33 -msgid "random" -msgstr "aleatoriamente" - -#: ../src\issueReporter\issueReporter.py:33 -msgid "sometimes" -msgstr "a veces" - -#: ../src\issueReporter\issueReporter.py:33 -msgid "unable to duplicate" -msgstr "imposible de reproducir" - -#: ../src\issueReporter\issueReporter.py:34 -msgid "block" -msgstr "bloqueo" - -#: ../src\issueReporter\issueReporter.py:34 -msgid "crash" -msgstr "fallo" - -#: ../src\issueReporter\issueReporter.py:34 -msgid "feature" -msgstr "característica" - -#: ../src\issueReporter\issueReporter.py:34 -msgid "major" -msgstr "mayor" - -#: ../src\issueReporter\issueReporter.py:34 -msgid "minor" -msgstr "menor" - -#: ../src\issueReporter\issueReporter.py:34 -msgid "text" -msgstr "texto" - -#: ../src\issueReporter\issueReporter.py:34 -msgid "trivial" -msgstr "trivial" - -#: ../src\issueReporter\issueReporter.py:34 -msgid "tweak" -msgstr "ajuste" - -#: ../src\issueReporter\wx_ui.py:26 -msgid "Report an error" -msgstr "Reportar un error" - -#: ../src\issueReporter\wx_ui.py:29 -msgid "Select a category" -msgstr "Selecciona una categoría" - -#: ../src\issueReporter\wx_ui.py:37 -msgid "" -"Briefly describe what happened. You will be able to thoroughly explain it " -"later" -msgstr "" -"Describe en pocas palabras lo que ha pasado (después podrás profundizar)" - -#: ../src\issueReporter\wx_ui.py:46 -msgid "Here, you can describe the bug in detail" -msgstr "Aquí puedes describir el error en detalle" - -#: ../src\issueReporter\wx_ui.py:56 -msgid "how often does this bug happen?" -msgstr "¿Qué tan a menudo ocurre este error?" - -#: ../src\issueReporter\wx_ui.py:63 -msgid "Select the importance that you think this bug has" -msgstr "Selecciona la importancia que consideras que tiene este error" - -#: ../src\issueReporter\wx_ui.py:70 -msgid "" -"I know that the {0} bug system will get my Twitter username to contact me " -"and fix the bug quickly" -msgstr "" -"Sé que el sistema de errores de {0} obtendrá mi nombre de usuario de Twitter " -"para contactarme y resolver el error rápidamente" - -#: ../src\issueReporter\wx_ui.py:73 -msgid "Send report" -msgstr "Enviar reporte" - -#: ../src\issueReporter\wx_ui.py:75 ../src\wxUI\dialogs\filterDialogs.py:84 -#: ../src\wxUI\dialogs\find.py:23 -msgid "Cancel" -msgstr "Cancelar" - -#: ../src\issueReporter\wx_ui.py:84 -msgid "You must fill out both fields" -msgstr "Debes llenar ambos campos" - -#: ../src\issueReporter\wx_ui.py:87 -msgid "" -"You need to mark the checkbox to provide us your twitter username to contact " -"you if it is necessary." -msgstr "" -"Debes marcar la casilla para proporcionarnos tu nombre de usuario de Twitter " -"para poder contactarte si es necesario." - -#: ../src\issueReporter\wx_ui.py:90 -msgid "" -"Thanks for reporting this bug! In future versions, you may be able to find " -"it in the changes list. You've reported the bug number %i" -msgstr "" -"¡Gracias por reportar este error! Quizá puedas verlo entre la lista de " -"cambios de próximas versiones. Has reportado el error número %i" - -#: ../src\issueReporter\wx_ui.py:90 -msgid "reported" -msgstr "reportado" - -#: ../src\issueReporter\wx_ui.py:94 -msgid "Error while reporting" -msgstr "Error al reportar" - -#: ../src\issueReporter\wx_ui.py:94 -msgid "" -"Something unexpected occurred while trying to report the bug. Please, try " -"again later" -msgstr "" -"Algo inesperado ocurrió mientras intentábamos reportar tu error. Por favor, " -"vuelve a intentarlo más tarde" - -#: ../src\keystrokeEditor\constants.py:3 -msgid "Go up in the current buffer" -msgstr "Va arriba en la lista actual" - -#: ../src\keystrokeEditor\constants.py:4 -msgid "Go down in the current buffer" -msgstr "Va abajo en la lista actual" - -#: ../src\keystrokeEditor\constants.py:5 -msgid "Go to the previous buffer" -msgstr "Va al buffer anterior" - -#: ../src\keystrokeEditor\constants.py:6 -msgid "Go to the next buffer" -msgstr "Va al buffer siguiente" - -#: ../src\keystrokeEditor\constants.py:7 -msgid "Focus the next session" -msgstr "Ir a la siguiente sesión" - -#: ../src\keystrokeEditor\constants.py:8 -msgid "Focus the previous session" -msgstr "Va a la sesión anterior" - -#: ../src\keystrokeEditor\constants.py:9 -msgid "Show or hide the GUI" -msgstr "Muestra o esconde la interfaz gráfica" - -#: ../src\keystrokeEditor\constants.py:10 -msgid "New tweet" -msgstr "Nuevo tuit" - -#: ../src\keystrokeEditor\constants.py:12 ../src\wxUI\buffers\base.py:26 -#: ../src\wxUI\commonMessageDialogs.py:10 ../src\wxUI\dialogs\message.py:126 -msgid "Retweet" -msgstr "Retuit" - -#: ../src\keystrokeEditor\constants.py:13 -msgid "Send direct message" -msgstr "Enviar mensaje directo" - -#: ../src\keystrokeEditor\constants.py:14 -msgid "Like a tweet" -msgstr "Marcar tuit como me gusta" - -#: ../src\keystrokeEditor\constants.py:15 -msgid "Like/unlike a tweet" -msgstr "Marcar o remover tuit como me gusta" - -#: ../src\keystrokeEditor\constants.py:16 -msgid "Unlike a tweet" -msgstr "Marcar tuit como ya no me gusta" - -#: ../src\keystrokeEditor\constants.py:17 -msgid "Open the user actions dialogue" -msgstr "Abrir el diálogo de acciones" - -#: ../src\keystrokeEditor\constants.py:18 -msgid "See user details" -msgstr "Ver detalles del usuario" - -#: ../src\keystrokeEditor\constants.py:19 -msgid "Show tweet" -msgstr "Ver tuit" - -#: ../src\keystrokeEditor\constants.py:20 -msgid "Quit" -msgstr "Salir" - -#: ../src\keystrokeEditor\constants.py:21 -msgid "Open user timeline" -msgstr "Abrir línea temporal" - -#: ../src\keystrokeEditor\constants.py:22 -msgid "Destroy buffer" -msgstr "Eliminar buffer" - -#: ../src\keystrokeEditor\constants.py:23 -msgid "Interact with the currently focused tweet." -msgstr "Interactuar con el tuit que tiene el foco." - -#: ../src\keystrokeEditor\constants.py:24 -msgid "Open URL" -msgstr "Abrir URL" - -#: ../src\keystrokeEditor\constants.py:25 -msgid "View in Twitter" -msgstr "Ver en Twitter" - -#: ../src\keystrokeEditor\constants.py:26 -msgid "Increase volume by 5%" -msgstr "Subir volumen en un 5%" - -#: ../src\keystrokeEditor\constants.py:27 -msgid "Decrease volume by 5%" -msgstr "Bajar volumen en un 5%" - -#: ../src\keystrokeEditor\constants.py:28 -msgid "Jump to the first element of a buffer" -msgstr "Ir al primer elemento del buffer" - -#: ../src\keystrokeEditor\constants.py:29 -msgid "Jump to the last element of the current buffer" -msgstr "Ir al último elemento del buffer" - -#: ../src\keystrokeEditor\constants.py:30 -msgid "Jump 20 elements up in the current buffer" -msgstr "Moverse 20 elementos hacia arriba en el buffer actual" - -#: ../src\keystrokeEditor\constants.py:31 -msgid "Jump 20 elements down in the current buffer" -msgstr "Moverse 20 elementos hacia abajo en el buffer actual" - -#: ../src\keystrokeEditor\constants.py:32 -msgid "Edit profile" -msgstr "Editar perfil" - -#: ../src\keystrokeEditor\constants.py:33 -msgid "Delete a tweet or direct message" -msgstr "Eliminar tuit o mensaje directo" - -#: ../src\keystrokeEditor\constants.py:34 -msgid "Empty the current buffer" -msgstr "Vaciar buffer" - -#: ../src\keystrokeEditor\constants.py:35 -msgid "Repeat last item" -msgstr "Repetir último elemento" - -#: ../src\keystrokeEditor\constants.py:36 -msgid "Copy to clipboard" -msgstr "Copiar al portapapeles" - -#: ../src\keystrokeEditor\constants.py:37 -msgid "Add to list" -msgstr "Añadir a lista" - -#: ../src\keystrokeEditor\constants.py:38 -msgid "Remove from list" -msgstr "Quitar de lista" - -#: ../src\keystrokeEditor\constants.py:39 -msgid "Mute/unmute the active buffer" -msgstr "Silenciar o des-silenciar el buffer activo" - -#: ../src\keystrokeEditor\constants.py:40 -msgid "Mute/unmute the current session" -msgstr "Activar o desactivar el silencio para la sesión activa" - -#: ../src\keystrokeEditor\constants.py:41 -msgid "toggle the automatic reading of incoming tweets in the active buffer" -msgstr "" -"conmutar entre la lectura automática de nuevos tuits para el buffer actual" - -#: ../src\keystrokeEditor\constants.py:42 -msgid "Search on twitter" -msgstr "Buscar en Twitter" - -#: ../src\keystrokeEditor\constants.py:43 -msgid "Find a string in the currently focused buffer" -msgstr "Buscar un término en el buffer actual" - -#: ../src\keystrokeEditor\constants.py:44 -msgid "Show the keystroke editor" -msgstr "Mostrar el editor de combinaciones de teclado" - -#: ../src\keystrokeEditor\constants.py:45 -msgid "Show lists for a specified user" -msgstr "Mostrar listas para un usuario específico" - -#: ../src\keystrokeEditor\constants.py:46 -msgid "load previous items" -msgstr "cargar elementos anteriores" - -#: ../src\keystrokeEditor\constants.py:47 -msgid "Get geolocation" -msgstr "Obtener ubicación" - -#: ../src\keystrokeEditor\constants.py:48 -msgid "Display the tweet's geolocation in a dialog" -msgstr "Mostrar la ubicación del tuit en un diálogo" - -#: ../src\keystrokeEditor\constants.py:49 -msgid "Create a trending topics buffer" -msgstr "Crear un buffer de tendencias" - -#: ../src\keystrokeEditor\constants.py:50 -msgid "View conversation" -msgstr "Ver conversación" - -#: ../src\keystrokeEditor\constants.py:51 -msgid "Check and download updates" -msgstr "&Comprobar y descargar actualizaciones" - -#: ../src\keystrokeEditor\constants.py:52 -msgid "" -"Opens the list manager, which allows you to create, edit, delete and open " -"lists in buffers." -msgstr "" -"Abre el gestor de listas, que permite crear, editar, eliminar y abrir listas " -"como buffers." - -#: ../src\keystrokeEditor\constants.py:53 -msgid "Opens the global settings dialogue" -msgstr "Abre el diálogo de opciones globales" - -#: ../src\keystrokeEditor\constants.py:54 -msgid "Opens the list manager" -msgstr "Abre el gestor de listas" - -#: ../src\keystrokeEditor\constants.py:55 -msgid "Opens the account settings dialogue" -msgstr "Abre el diálogo de opciones de cuenta" - -#: ../src\keystrokeEditor\constants.py:56 -msgid "Try to play an audio file" -msgstr "Intentar reproducir audio" - -#: ../src\keystrokeEditor\constants.py:57 -msgid "Updates the buffer and retrieves possible lost items there." -msgstr "Actualiza el buffer e intenta descargar los elementos perdidos." - -#: ../src\keystrokeEditor\constants.py:58 -msgid "Extracts the text from a picture and displays the result in a dialog." -msgstr "Extrae el texto de una foto y muestra el resultado en un diálogo." - -#: ../src\keystrokeEditor\constants.py:59 -msgid "Adds an alias to an user" -msgstr "Añade un alias a un usuario específico." - -#: ../src\keystrokeEditor\wx_ui.py:8 -msgid "Keystroke editor" -msgstr "Editor de combinaciones de teclado" - -#: ../src\keystrokeEditor\wx_ui.py:12 -msgid "Select a keystroke to edit" -msgstr "Selecciona una combinación de teclado para editarla" - -#: ../src\keystrokeEditor\wx_ui.py:13 -msgid "Keystroke" -msgstr "Combinación de teclado" - -#: ../src\keystrokeEditor\wx_ui.py:13 ../src\wxUI\dialogs\userActions.py:10 -#: ../src\wxUI\dialogs\userActions.py:19 ../src\wxUI\dialogs\userActions.py:20 -msgid "Action" -msgstr "Acción" - -#: ../src\keystrokeEditor\wx_ui.py:18 ../src\wxUI\dialogs\filterDialogs.py:131 -#: ../src\wxUI\dialogs\lists.py:20 ../src\wxUI\dialogs\userAliasDialogs.py:53 -msgid "Edit" -msgstr "Editar" - -#: ../src\keystrokeEditor\wx_ui.py:20 ../src\keystrokeEditor\wx_ui.py:50 -msgid "Undefine keystroke" -msgstr "Desasignar combinación de teclas" - -#: ../src\keystrokeEditor\wx_ui.py:21 -msgid "Execute action" -msgstr "Ejecutar acción" - -#: ../src\keystrokeEditor\wx_ui.py:22 ../src\wxUI\dialogs\configuration.py:396 -#: ../src\wxUI\dialogs\userAliasDialogs.py:25 ../src\wxUI\dialogs\utils.py:39 -msgid "Close" -msgstr "Cerrar" - -#: ../src\keystrokeEditor\wx_ui.py:42 -msgid "Undefined" -msgstr "Sin definir" - -#: ../src\keystrokeEditor\wx_ui.py:50 -msgid "Are you sure you want to undefine this keystroke?" -msgstr "¿Seguro que deseas desasignar esta combinación de teclado?" - -#: ../src\keystrokeEditor\wx_ui.py:54 -msgid "Editing keystroke" -msgstr "Editando combinación de teclas" - -#: ../src\keystrokeEditor\wx_ui.py:57 -msgid "Control" -msgstr "Control" - -#: ../src\keystrokeEditor\wx_ui.py:58 -msgid "Alt" -msgstr "Alt" - -#: ../src\keystrokeEditor\wx_ui.py:59 -msgid "Shift" -msgstr "Shift" - -#: ../src\keystrokeEditor\wx_ui.py:60 -msgid "Windows" -msgstr "Windows" - -#: ../src\keystrokeEditor\wx_ui.py:66 -msgid "Key" -msgstr "Tecla" - -#: ../src\keystrokeEditor\wx_ui.py:71 ../src\wxUI\dialogs\filterDialogs.py:82 -#: ../src\wxUI\dialogs\find.py:21 ../src\wxUI\dialogs\userAliasDialogs.py:23 -#: ../src\wxUI\dialogs\utils.py:36 -msgid "OK" -msgstr "Aceptar" - -#: ../src\keystrokeEditor\wx_ui.py:84 -msgid "You need to use the Windows key" -msgstr "Necesitas usar la tecla de windows" - -#: ../src\keystrokeEditor\wx_ui.py:84 ../src\keystrokeEditor\wx_ui.py:87 -msgid "Invalid keystroke" -msgstr "Combinación de teclado inválida" - -#: ../src\keystrokeEditor\wx_ui.py:87 -msgid "You must provide a character for the keystroke" -msgstr "Debes proporcionar una letra para el atajo de teclado" - -#: ../src\languageHandler.py:99 +#: languageHandler.py:99 msgid "User default" msgstr "Idioma predeterminado" -#: ../src\main.py:120 +#: main.py:120 msgid "https://twblue.es/donate" msgstr "https://twblue.es/donate" -#: ../src\main.py:137 +#: main.py:137 msgid "" "{0} is already running. Close the other instance before starting this one. " "If you're sure that {0} isn't running, try deleting the file at {1}. If " @@ -1858,43 +110,1839 @@ msgstr "" "archivo que se encuentra en {1}. Si no sabes cómo hacerlo con seguridad, " "contacta con los desarrolladores de {0}." -#: ../src\sessionmanager\wxUI.py:9 +#: extra/AudioUploader/audioUploader.py:136 sound.py:147 +msgid "Playing..." +msgstr "Reproduciendo..." + +#: sound.py:160 +msgid "Stopped." +msgstr "Detenido." + +#: controller/mainController.py:277 +msgid "Ready" +msgstr "Listo" + +#: controller/buffers/twitter/base.py:70 controller/mainController.py:337 +#: controller/settings.py:286 +msgid "Home" +msgstr "Inicio" + +#: controller/buffers/twitter/base.py:70 controller/mainController.py:339 +#: controller/settings.py:287 +msgid "Mentions" +msgstr "Menciones" + +#: controller/buffers/twitter/base.py:70 controller/mainController.py:341 +msgid "Direct messages" +msgstr "Mensajes directos" + +#: controller/buffers/twitter/base.py:70 controller/mainController.py:343 +#: controller/settings.py:289 +msgid "Sent direct messages" +msgstr "Mensajes directos enviados" + +#: controller/buffers/twitter/base.py:70 controller/mainController.py:345 +#: controller/settings.py:290 +msgid "Sent tweets" +msgstr "Tuits enviados" + +#: controller/buffers/twitter/base.py:70 controller/mainController.py:347 +#: controller/mainController.py:1390 controller/settings.py:291 +msgid "Likes" +msgstr "Tuits marcados como me gusta" + +#: controller/buffers/twitter/base.py:70 controller/mainController.py:349 +#: controller/mainController.py:1395 controller/settings.py:292 +msgid "Followers" +msgstr "Seguidores" + +#: controller/mainController.py:351 +msgid "Following" +msgstr "Siguiendo" + +#: controller/buffers/twitter/base.py:70 controller/mainController.py:353 +#: controller/mainController.py:1405 controller/settings.py:294 +msgid "Blocked users" +msgstr "Usuarios bloqueados" + +#: controller/buffers/twitter/base.py:70 controller/mainController.py:355 +#: controller/mainController.py:1410 controller/settings.py:295 +msgid "Muted users" +msgstr "Usuarios silenciados" + +#: controller/mainController.py:356 +msgid "Timelines" +msgstr "Líneas temporales" + +#: controller/mainController.py:359 controller/mainController.py:883 +#: controller/mainController.py:1582 +msgid "Timeline for {}" +msgstr "Línea temporal de {0}" + +#: controller/mainController.py:360 +msgid "Likes timelines" +msgstr "Líneas temporales de tuits marcados con me gusta" + +#: controller/mainController.py:363 controller/mainController.py:902 +#: controller/mainController.py:1584 +msgid "Likes for {}" +msgstr "Tuits que le gustan a {0}" + +#: controller/mainController.py:364 +msgid "Followers timelines" +msgstr "Líneas temporales de seguidores" + +#: controller/mainController.py:367 controller/mainController.py:921 +#: controller/mainController.py:1586 +msgid "Followers for {}" +msgstr "Seguidores de {0}" + +#: controller/mainController.py:368 +msgid "Following timelines" +msgstr "Líneas temporales de siguiendo" + +#: controller/mainController.py:371 controller/mainController.py:940 +#: controller/mainController.py:1588 +msgid "Friends for {}" +msgstr "Amigos de {0}" + +#: controller/mainController.py:372 wxUI/dialogs/lists.py:13 +msgid "Lists" +msgstr "Listas" + +#: controller/mainController.py:375 controller/mainController.py:1422 +msgid "List for {}" +msgstr "Lista {0}" + +#: controller/mainController.py:376 +msgid "Searches" +msgstr "Búsquedas" + +#: controller/mainController.py:379 controller/mainController.py:426 +#: controller/mainController.py:431 +msgid "Search for {}" +msgstr "Buscar {0}" + +#: controller/mainController.py:381 controller/mainController.py:982 +#: controller/mainController.py:1590 +#, python-format +msgid "Trending topics for %s" +msgstr "Tendencias para %s" + +#: controller/mainController.py:448 controller/mainController.py:464 +#: controller/mainController.py:1080 controller/mainController.py:1099 +#: controller/mainController.py:1118 controller/mainController.py:1137 +msgid "" +"No session is currently in focus. Focus a session with the next or previous " +"session shortcut." +msgstr "No estás en ninguna sesión. Cambia a una sesión activa." + +#: controller/mainController.py:452 +msgid "Empty buffer." +msgstr "Buffer vacío." + +#: controller/mainController.py:459 +msgid "{0} not found." +msgstr "{0} no encontrado." + +#: controller/mainController.py:469 +msgid "Filters cannot be applied on this buffer" +msgstr "No pueden aplicarse filtros sobre este buffer" + +#: controller/mainController.py:522 controller/mainController.py:539 +#: controller/mainController.py:568 +msgid "Select the user" +msgstr "Selecciona un usuario" + +#: controller/mainController.py:753 +msgid "Add an user alias" +msgstr "Añadir alias de usuario" + +#: controller/mainController.py:761 +msgid "Alias has been set correctly for {}." +msgstr "Añadido el alias para {}" + +#: controller/mainController.py:829 controller/messages.py:327 +msgid "MMM D, YYYY. H:m" +msgstr "D MMM, YYYY. H:m" + +#: controller/mainController.py:957 +msgid "Conversation with {0}" +msgstr "Conversación con {0}" + +#: controller/mainController.py:998 controller/mainController.py:1015 +msgid "There are no coordinates in this tweet" +msgstr "No hay coordenadas en este tuit" + +#: controller/mainController.py:1000 controller/mainController.py:1019 +msgid "Error decoding coordinates. Try again later." +msgstr "Error decodificando las coordenadas. Inténtalo nuevamente más tarde." + +#: controller/mainController.py:1004 +msgid "Unable to find address in OpenStreetMap." +msgstr "Imposible encontrar dirección en Open Street Map." + +#: controller/mainController.py:1017 +msgid "There are no results for the coordinates in this tweet" +msgstr "No hay resultados para las coordenadas en este tuit" + +#: controller/mainController.py:1128 controller/mainController.py:1147 +#, python-format +msgid "%s, %s of %s" +msgstr "%s, %s de %s" + +#: controller/mainController.py:1130 controller/mainController.py:1149 +#: controller/mainController.py:1174 controller/mainController.py:1199 +#, python-format +msgid "%s. Empty" +msgstr "%s. Vacío" + +#: controller/mainController.py:1162 controller/mainController.py:1166 +#: controller/mainController.py:1187 +msgid "{0}: This account is not logged into Twitter." +msgstr "{0}: No has iniciado sesión con esta cuenta en Twitter." + +#: controller/mainController.py:1172 controller/mainController.py:1197 +#, python-format +msgid "%s. %s, %s of %s" +msgstr "%s. %s, %s de %s" + +#: controller/mainController.py:1191 +msgid "{0}: This account is not logged into twitter." +msgstr "{0}: No has iniciado sesión con esta cuenta en Twitter." + +#: controller/buffers/twitter/base.py:70 controller/mainController.py:1400 +#: controller/settings.py:293 +msgid "Friends" +msgstr "Amigos" + +#: controller/mainController.py:1416 +msgid "This list is already opened" +msgstr "Esta lista ya ha sido abierta" + +#: controller/mainController.py:1446 controller/mainController.py:1462 +msgid "" +"An error happened while trying to connect to the server. Please try later." +msgstr "" +"Ha ocurrido un error al intentar conectarse al servidor. Por favor, " +"inténtalo más tarde." + +#: controller/mainController.py:1498 +msgid "The auto-reading of new tweets is enabled for this buffer" +msgstr "La lectura automática de nuevos tuits para este buffer está activada" + +#: controller/mainController.py:1501 +msgid "The auto-reading of new tweets is disabled for this buffer" +msgstr "" +"La lectura automática de nuevos tuits para este buffer está desactivada" + +#: controller/mainController.py:1508 +msgid "Session mute on" +msgstr "Silencio de sesión activo" + +#: controller/mainController.py:1511 +msgid "Session mute off" +msgstr "Silencio de sesión desactivado" + +#: controller/mainController.py:1519 +msgid "Buffer mute on" +msgstr "Silenciar buffer, activado" + +#: controller/mainController.py:1522 +msgid "Buffer mute off" +msgstr "Silenciar buffer, desactivado" + +#: controller/mainController.py:1542 +msgid "Copied" +msgstr "Copiado" + +#: controller/mainController.py:1572 +msgid "Unable to update this buffer." +msgstr "Imposible actualizar este buffer." + +#: controller/mainController.py:1575 +msgid "Updating buffer..." +msgstr "Actualizando buffer..." + +#: controller/mainController.py:1578 +msgid "{0} items retrieved" +msgstr "{0} elementos descargados" + +#: controller/mainController.py:1597 controller/mainController.py:1617 +msgid "Invalid buffer" +msgstr "Buffer inválido" + +#: controller/mainController.py:1608 +msgid "Picture {0}" +msgstr "Foto {0}" + +#: controller/mainController.py:1609 +msgid "Select the picture" +msgstr "Selecciona la foto" + +#: controller/mainController.py:1628 +msgid "Unable to extract text" +msgstr "Imposible extraer texto" + +#: controller/messages.py:49 +msgid "Translated" +msgstr "Traducido" + +#: controller/messages.py:56 +#, python-format +msgid "%s - %s of %d characters" +msgstr "%s - %s de %d caracteres" + +#: controller/buffers/twitter/base.py:428 controller/messages.py:268 +#, python-format +msgid "Direct message to %s" +msgstr "Mensaje directo a %s" + +#: controller/buffers/twitter/base.py:87 +#: controller/buffers/twitter/trends.py:43 +#: controller/buffers/twitter/trends.py:134 controller/messages.py:296 +#: wxUI/buffers/base.py:25 wxUI/buffers/events.py:15 wxUI/buffers/trends.py:18 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:309 wxUI/sysTrayIcon.py:35 +msgid "Tweet" +msgstr "Tuit" + +#: controller/messages.py:354 +msgid "View item" +msgstr "Ver elemento" + +#: controller/messages.py:379 +msgid "Link copied to clipboard." +msgstr "Enlace copiado al portapapeles" + +#: controller/settings.py:74 +msgid "System default" +msgstr "Predeterminado del sistema" + +#: controller/settings.py:74 +msgid "HTTP" +msgstr "HTTP" + +#: controller/settings.py:74 +msgid "SOCKS v4" +msgstr "SOCKS v4" + +#: controller/settings.py:74 +msgid "SOCKS v4 with DNS support" +msgstr "SOCKS v4 con soporte DNS" + +#: controller/settings.py:74 +msgid "SOCKS v5" +msgstr "SOCKS v5" + +#: controller/settings.py:74 +msgid "SOCKS v5 with DNS support" +msgstr "SOCKS v5 con soporte DNS" + +#: controller/settings.py:145 controller/settings.py:211 +#: wxUI/dialogs/configuration.py:116 +msgid "Ask" +msgstr "Preguntar" + +#: controller/settings.py:147 controller/settings.py:213 +#: wxUI/dialogs/configuration.py:116 +msgid "Retweet without comments" +msgstr "Retuitear sin comentario" + +#: controller/settings.py:149 wxUI/dialogs/configuration.py:116 +msgid "Retweet with comments" +msgstr "Retuitear añadiendo un comentario" + +#: controller/settings.py:185 +#, python-format +msgid "Account settings for %s" +msgstr "Opciones de la cuenta de %s" + +#: controller/settings.py:288 +msgid "Direct Messages" +msgstr "Mensajes directos" + +#: controller/user.py:29 wxUI/commonMessageDialogs.py:39 +msgid "That user does not exist" +msgstr "El usuario no existe" + +#: controller/user.py:29 controller/user.py:31 extra/SpellChecker/wx_ui.py:80 +#: issueReporter/wx_ui.py:84 issueReporter/wx_ui.py:87 +#: wxUI/commonMessageDialogs.py:39 wxUI/commonMessageDialogs.py:51 +#: wxUI/commonMessageDialogs.py:58 wxUI/commonMessageDialogs.py:61 +#: wxUI/commonMessageDialogs.py:64 wxUI/commonMessageDialogs.py:67 +#: wxUI/commonMessageDialogs.py:77 wxUI/commonMessageDialogs.py:80 +#: wxUI/commonMessageDialogs.py:83 wxUI/commonMessageDialogs.py:89 +#: wxUI/commonMessageDialogs.py:92 +msgid "Error" +msgstr "Error" + +#: controller/user.py:31 +msgid "User has been suspended" +msgstr "El usuario ha sido suspendido" + +#: controller/user.py:37 +#, python-format +msgid "Information for %s" +msgstr "Detalles para %s" + +#: controller/user.py:67 extra/AudioUploader/audioUploader.py:127 +msgid "Discarded" +msgstr "Descartado" + +#: controller/user.py:95 +#, python-format +msgid "Username: @%s\n" +msgstr "Nombre de usuario: @%s\n" + +#: controller/user.py:96 +#, python-format +msgid "Name: %s\n" +msgstr "Nombre: %s\n" + +#: controller/user.py:98 +#, python-format +msgid "Location: %s\n" +msgstr "Ubicación: %s\n" + +#: controller/user.py:100 +#, python-format +msgid "URL: %s\n" +msgstr "URL: %s\n" + +#: controller/user.py:104 +#, python-format +msgid "Bio: %s\n" +msgstr "Descripción: %s\n" + +#: controller/user.py:105 controller/user.py:120 +msgid "Yes" +msgstr "Sí" + +#: controller/user.py:106 controller/user.py:121 +msgid "No" +msgstr "No" + +#: controller/user.py:107 +#, python-format +msgid "Protected: %s\n" +msgstr "Protegido: %s\n" + +#: controller/user.py:112 +msgid "You follow {0}. " +msgstr "Sigues a {0}. " + +#: controller/user.py:115 +msgid "{0} is following you." +msgstr "{0} te sigue." + +#: controller/user.py:119 +#, python-format +msgid "" +"Followers: %s\n" +" Friends: %s\n" +msgstr "" +"Seguidores: %s\n" +" Amigos: %s\n" + +#: controller/user.py:122 +#, python-format +msgid "Verified: %s\n" +msgstr "Verificado: %s\n" + +#: controller/user.py:123 +#, python-format +msgid "Tweets: %s\n" +msgstr "Tuits: %s\n" + +#: controller/user.py:124 +#, python-format +msgid "Likes: %s" +msgstr "Me gusta: %s" + +#: controller/userActionsController.py:74 +msgid "You can't ignore direct messages" +msgstr "No puedes ignorar los mensajes directos" + +#: controller/userAliasController.py:32 +msgid "Edit alias for {}" +msgstr "Editar alias para {}" + +#: controller/buffers/base/base.py:91 +msgid "This action is not supported for this buffer" +msgstr "Esta acción no se encuentra soportada para este buffer" + +#: controller/buffers/twitter/base.py:76 +msgid "{username}'s timeline" +msgstr "Línea temporal de {username}" + +#: controller/buffers/twitter/base.py:78 +msgid "{username}'s likes" +msgstr "Tuits que le gustan a {username}" + +#: controller/buffers/twitter/base.py:80 +msgid "{username}'s followers" +msgstr "Seguidores de {username}" + +#: controller/buffers/twitter/base.py:82 +msgid "{username}'s friends" +msgstr "Amigos de {username}" + +#: controller/buffers/twitter/base.py:84 +msgid "Unknown buffer" +msgstr "Buffer desconocido" + +#: controller/buffers/twitter/base.py:88 +#: controller/buffers/twitter/trends.py:44 +#: controller/buffers/twitter/trends.py:135 +msgid "Write the tweet here" +msgstr "Escribe el tuit aquí" + +#: controller/buffers/twitter/base.py:192 +msgid "New tweet in {0}" +msgstr "Nuevo tuit en {0}" + +#: controller/buffers/twitter/base.py:195 +msgid "{0} new tweets in {1}." +msgstr "{0} nuevos tuits en {1}." + +#: controller/buffers/twitter/base.py:234 +#: controller/buffers/twitter/directMessages.py:88 +#: controller/buffers/twitter/people.py:174 +#, python-format +msgid "%s items retrieved" +msgstr "%s elementos recuperados" + +#: controller/buffers/twitter/base.py:266 +#: controller/buffers/twitter/people.py:80 +msgid "This buffer is not a timeline; it can't be deleted." +msgstr "Este buffer no es una línea temporal. No se puede eliminar." + +#: controller/buffers/twitter/base.py:402 +msgid "Reply to {arg0}" +msgstr "Responder a {arg0}" + +#: controller/buffers/twitter/base.py:404 keystrokeEditor/constants.py:11 +#: wxUI/buffers/base.py:27 +msgid "Reply" +msgstr "Responder" + +#: controller/buffers/twitter/base.py:405 +#, python-format +msgid "Reply to %s" +msgstr "Responder a %s" + +#: controller/buffers/twitter/base.py:428 +#: controller/buffers/twitter/directMessages.py:124 +msgid "New direct message" +msgstr "Nuevo mensaje directo" + +#: controller/buffers/twitter/base.py:459 +msgid "Quote" +msgstr "Citar" + +#: controller/buffers/twitter/base.py:459 +msgid "Add your comment to the tweet" +msgstr "Añade tu comentario al tuit" + +#: controller/buffers/twitter/base.py:520 +msgid "Opening URL..." +msgstr "Abriendo URL..." + +#: controller/buffers/twitter/base.py:557 +msgid "User details" +msgstr "Detalles del usuario" + +#: controller/buffers/twitter/base.py:578 +msgid "Opening item in web browser..." +msgstr "Abriendo elemento en el navegador..." + +#: controller/buffers/twitter/directMessages.py:93 +#: controller/buffers/twitter/people.py:95 wxUI/buffers/people.py:17 +msgid "Mention" +msgstr "Mención" + +#: controller/buffers/twitter/directMessages.py:93 +#: controller/buffers/twitter/people.py:95 +#, python-format +msgid "Mention to %s" +msgstr "Mencionar a %s" + +#: controller/buffers/twitter/directMessages.py:127 +msgid "{0} new direct messages." +msgstr "{0} mensajes directos nuevos." + +#: controller/buffers/twitter/directMessages.py:130 +msgid "This action is not supported in the buffer yet." +msgstr "Esta acción todavía no se soporta en este buffer." + +#: controller/buffers/twitter/directMessages.py:140 +msgid "" +"Getting more items cannot be done in this buffer. Use the direct messages " +"buffer instead." +msgstr "" +"No se pueden obtener más elementos en este buffer. Usa el buffer de mensajes " +"directos en su lugar." + +#: controller/buffers/twitter/people.py:247 +msgid "{0} new followers." +msgstr "{0} nuevos seguidores." + +#: controller/buffers/twitter/trends.py:150 +msgid "This action is not supported in the buffer, yet." +msgstr "Esta acción todavía no se soporta en este buffer." + +#: extra/AudioUploader/audioUploader.py:57 +msgid "Attaching..." +msgstr "Adjuntando..." + +#: extra/AudioUploader/audioUploader.py:74 +msgid "Pause" +msgstr "Pausa" + +#: extra/AudioUploader/audioUploader.py:76 +msgid "&Resume" +msgstr "&Reanudar" + +#: extra/AudioUploader/audioUploader.py:77 +msgid "Resume" +msgstr "Reanudar" + +#: extra/AudioUploader/audioUploader.py:79 +#: extra/AudioUploader/audioUploader.py:106 extra/AudioUploader/wx_ui.py:37 +msgid "&Pause" +msgstr "&Pausa" + +#: extra/AudioUploader/audioUploader.py:94 +#: extra/AudioUploader/audioUploader.py:140 +msgid "&Stop" +msgstr "&Detener" + +#: extra/AudioUploader/audioUploader.py:95 +msgid "Recording" +msgstr "Grabando" + +#: extra/AudioUploader/audioUploader.py:100 +#: extra/AudioUploader/audioUploader.py:151 +msgid "Stopped" +msgstr "Stopped" + +#: extra/AudioUploader/audioUploader.py:102 extra/AudioUploader/wx_ui.py:39 +msgid "&Record" +msgstr "&Grabar" + +#: extra/AudioUploader/audioUploader.py:144 +#: extra/AudioUploader/audioUploader.py:154 extra/AudioUploader/wx_ui.py:35 +msgid "&Play" +msgstr "&Reproducir" + +#: extra/AudioUploader/audioUploader.py:159 +msgid "Recoding audio..." +msgstr "Recodificando audio..." + +#: extra/AudioUploader/transfer.py:82 extra/AudioUploader/transfer.py:88 +msgid "Error in file upload: {0}" +msgstr "Error al subir el archivo: {0}" + +#: extra/AudioUploader/utils.py:29 update/utils.py:29 +#, python-format +msgid "%d day, " +msgstr "%d día, " + +#: extra/AudioUploader/utils.py:31 update/utils.py:31 +#, python-format +msgid "%d days, " +msgstr "%d días, " + +#: extra/AudioUploader/utils.py:33 update/utils.py:33 +#, python-format +msgid "%d hour, " +msgstr "%d hora, " + +#: extra/AudioUploader/utils.py:35 update/utils.py:35 +#, python-format +msgid "%d hours, " +msgstr "%d horas, " + +#: extra/AudioUploader/utils.py:37 update/utils.py:37 +#, python-format +msgid "%d minute, " +msgstr "%d minuto, " + +#: extra/AudioUploader/utils.py:39 update/utils.py:39 +#, python-format +msgid "%d minutes, " +msgstr "%d minutos, " + +#: extra/AudioUploader/utils.py:41 update/utils.py:41 +#, python-format +msgid "%s second" +msgstr "%s segundo" + +#: extra/AudioUploader/utils.py:43 update/utils.py:43 +#, python-format +msgid "%s seconds" +msgstr "%s segundos" + +#: extra/AudioUploader/wx_transfer_dialogs.py:15 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:35 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:171 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:255 +msgid "File" +msgstr "Archivo" + +#: extra/AudioUploader/wx_transfer_dialogs.py:21 +msgid "Transferred" +msgstr "Transferido" + +#: extra/AudioUploader/wx_transfer_dialogs.py:26 +msgid "Total file size" +msgstr "Tamaño total del archivo" + +#: extra/AudioUploader/wx_transfer_dialogs.py:31 +msgid "Transfer rate" +msgstr "Velocidad de transferencia" + +#: extra/AudioUploader/wx_transfer_dialogs.py:36 +msgid "Time left" +msgstr "Tiempo restante" + +#: extra/AudioUploader/wx_ui.py:29 +msgid "Attach audio" +msgstr "Adjuntar audio" + +#: extra/AudioUploader/wx_ui.py:41 +msgid "&Add an existing file" +msgstr "&Añadir un archivo existente" + +#: extra/AudioUploader/wx_ui.py:42 +msgid "&Discard" +msgstr "&Descartar" + +#: extra/AudioUploader/wx_ui.py:44 +msgid "Upload to" +msgstr "Subir a" + +#: extra/AudioUploader/wx_ui.py:49 +msgid "Attach" +msgstr "Adjuntar" + +#: extra/AudioUploader/wx_ui.py:51 +msgid "&Cancel" +msgstr "&Cancelar" + +#: extra/AudioUploader/wx_ui.py:76 +msgid "Select the audio file to be uploaded" +msgstr "Selecciona el archivo de audio que deseas subir" + +#: extra/AudioUploader/wx_ui.py:76 +msgid "Audio Files (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" +msgstr "Archivos de audio (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" + +#: extra/SoundsTutorial/soundsTutorial_constants.py:7 +msgid "Audio tweet." +msgstr "Tuit con audio." + +#: extra/SoundsTutorial/soundsTutorial_constants.py:8 +msgid "User timeline buffer created." +msgstr "Línea temporal de un usuario creada." + +#: extra/SoundsTutorial/soundsTutorial_constants.py:9 +msgid "Buffer destroied." +msgstr "Buffer eliminado." + +#: extra/SoundsTutorial/soundsTutorial_constants.py:10 +msgid "Direct message received." +msgstr "Mensaje directo recibido." + +#: extra/SoundsTutorial/soundsTutorial_constants.py:11 +msgid "Direct message sent." +msgstr "Mensaje directo enviado." + +#: extra/SoundsTutorial/soundsTutorial_constants.py:12 +msgid "Error." +msgstr "Error." + +#: extra/SoundsTutorial/soundsTutorial_constants.py:13 +msgid "Tweet liked." +msgstr "Tuit marcado como me gusta." + +#: extra/SoundsTutorial/soundsTutorial_constants.py:14 +msgid "Likes buffer updated." +msgstr "Un Buffer de tuits marcados como me gusta se ha actualizado." + +#: extra/SoundsTutorial/soundsTutorial_constants.py:15 +msgid "Geotweet." +msgstr "Tuit con información geográfica." + +#: extra/SoundsTutorial/soundsTutorial_constants.py:16 +msgid "Tweet contains one or more images" +msgstr "El tuit contiene una o más imágenes" + +#: extra/SoundsTutorial/soundsTutorial_constants.py:17 +msgid "Boundary reached." +msgstr "No hay más elementos en el buffer." + +#: extra/SoundsTutorial/soundsTutorial_constants.py:18 +msgid "List updated." +msgstr "Lista actualizada." + +#: extra/SoundsTutorial/soundsTutorial_constants.py:19 +msgid "Too many characters." +msgstr "Demasiados caracteres." + +#: extra/SoundsTutorial/soundsTutorial_constants.py:20 +msgid "Mention received." +msgstr "Mención recibida." + +#: extra/SoundsTutorial/soundsTutorial_constants.py:21 +msgid "New event." +msgstr "Nuevo evento." + +#: extra/SoundsTutorial/soundsTutorial_constants.py:22 +msgid "{0} is ready." +msgstr "{0} está listo." + +#: extra/SoundsTutorial/soundsTutorial_constants.py:23 +msgid "Mention sent." +msgstr "Mención enviada." + +#: extra/SoundsTutorial/soundsTutorial_constants.py:24 +msgid "Tweet retweeted." +msgstr "Tuit retuiteado." + +#: extra/SoundsTutorial/soundsTutorial_constants.py:25 +msgid "Search buffer updated." +msgstr "Buffer de búsqueda actualizado." + +#: extra/SoundsTutorial/soundsTutorial_constants.py:26 +msgid "Tweet received." +msgstr "Tuit recibido." + +#: extra/SoundsTutorial/soundsTutorial_constants.py:27 +msgid "Tweet sent." +msgstr "Tuit enviado." + +#: extra/SoundsTutorial/soundsTutorial_constants.py:28 +msgid "Trending topics buffer updated." +msgstr "Buffer de trending topics actualizado." + +#: extra/SoundsTutorial/soundsTutorial_constants.py:29 +msgid "New tweet in user timeline buffer." +msgstr "Nuevo tuit en línea temporal de un usuario." + +#: extra/SoundsTutorial/soundsTutorial_constants.py:30 +msgid "New follower." +msgstr "Nuevo seguidor." + +#: extra/SoundsTutorial/soundsTutorial_constants.py:31 +msgid "Volume changed." +msgstr "Volumen modificado." + +#: extra/SoundsTutorial/wx_ui.py:9 +msgid "Sounds tutorial" +msgstr "Tutorial de sonidos" + +#: extra/SoundsTutorial/wx_ui.py:12 +msgid "Press enter to listen to the sound for the selected event" +msgstr "Pulsa enter para escuchar el sonido para el evento seleccionado" + +#: extra/SpellChecker/spellchecker.py:60 +#, python-format +msgid "Misspelled word: %s" +msgstr "Palabra mal escrita: %s" + +#: extra/SpellChecker/wx_ui.py:28 +msgid "Misspelled word" +msgstr "Palabra mal escrita" + +#: extra/SpellChecker/wx_ui.py:33 +msgid "Context" +msgstr "Contexto" + +#: extra/SpellChecker/wx_ui.py:38 +msgid "Suggestions" +msgstr "Sugerencias" + +#: extra/SpellChecker/wx_ui.py:43 +msgid "&Ignore" +msgstr "&Ignorar" + +#: extra/SpellChecker/wx_ui.py:44 +msgid "I&gnore all" +msgstr "Ignorar &todo" + +#: extra/SpellChecker/wx_ui.py:45 +msgid "&Replace" +msgstr "&Reemplazar" + +#: extra/SpellChecker/wx_ui.py:46 +msgid "R&eplace all" +msgstr "R&eemplazar todo" + +#: extra/SpellChecker/wx_ui.py:47 +msgid "&Add to personal dictionary" +msgstr "Añadir al &diccionario" + +#: extra/SpellChecker/wx_ui.py:80 +msgid "" +"An error has occurred. There are no dictionaries available for the selected " +"language in {0}" +msgstr "" +"Ha ocurrido un error. No se encuentran diccionarios disponibles para el " +"idioma seleccionado en {0}." + +#: extra/SpellChecker/wx_ui.py:83 +msgid "Spell check complete." +msgstr "Corrección ortográfica finalizada." + +#: extra/autocompletionUsers/completion.py:20 +#: extra/autocompletionUsers/completion.py:38 +msgid "You have to start writing" +msgstr "Tienes que empezar a escribir" + +#: extra/autocompletionUsers/completion.py:30 +#: extra/autocompletionUsers/completion.py:47 +msgid "There are no results in your users database" +msgstr "No hay resultados en tu base de datos de usuarios" + +#: extra/autocompletionUsers/completion.py:32 +msgid "Autocompletion only works for users." +msgstr "El autocompletado solo funciona con usuarios." + +#: extra/autocompletionUsers/settings.py:25 +msgid "" +"Updating database... You can close this window now. A message will tell you " +"when the process finishes." +msgstr "" +"Actualizando base de datos... Puedes cerrar esta ventana ahora. Un mensaje " +"te informará cuando el proceso haya terminado." + +#: extra/autocompletionUsers/wx_manage.py:9 +msgid "Manage Autocompletion database" +msgstr "Gestionar la base de datos del autocompletado de usuarios" + +#: extra/autocompletionUsers/wx_manage.py:12 +msgid "Editing {0} users database" +msgstr "Editando la base de datos de usuarios de {0}" + +#: extra/autocompletionUsers/wx_manage.py:13 +msgid "Username" +msgstr "Nombre de usuario" + +#: extra/autocompletionUsers/wx_manage.py:13 wxUI/dialogs/configuration.py:144 +msgid "Name" +msgstr "Nombre" + +#: extra/autocompletionUsers/wx_manage.py:16 +msgid "Add user" +msgstr "Añadir usuario" + +#: extra/autocompletionUsers/wx_manage.py:17 +msgid "Remove user" +msgstr "Quitar usuario" + +#: extra/autocompletionUsers/wx_manage.py:38 +msgid "Twitter username" +msgstr "Nombre de usuario de Twitter" + +#: extra/autocompletionUsers/wx_manage.py:38 +msgid "Add user to database" +msgstr "Añadir usuario a la base de datos" + +#: extra/autocompletionUsers/wx_manage.py:44 +msgid "The user does not exist" +msgstr "El usuario no existe" + +#: extra/autocompletionUsers/wx_manage.py:44 wxUI/commonMessageDialogs.py:45 +msgid "Error!" +msgstr "¡Error!" + +#: extra/autocompletionUsers/wx_settings.py:8 +msgid "Autocomplete users' settings" +msgstr "Opciones de autocompletado de usuarios" + +#: extra/autocompletionUsers/wx_settings.py:11 +msgid "Add users from followers buffer" +msgstr "Añadir usuarios desde el buffer de seguidores" + +#: extra/autocompletionUsers/wx_settings.py:12 +msgid "Add users from friends buffer" +msgstr "Añadir usuarios desde el buffer de amigos" + +#: extra/autocompletionUsers/wx_settings.py:15 +msgid "Manage database..." +msgstr "Administrar base de datos..." + +#: extra/autocompletionUsers/wx_settings.py:27 +msgid "{0}'s database of users has been updated." +msgstr "La base de datos de usuarios de {0} ha sido actualizada." + +#: extra/autocompletionUsers/wx_settings.py:27 +msgid "Done" +msgstr "¡Hecho" + +#: extra/ocr/OCRSpace.py:7 +msgid "Detect automatically" +msgstr "Detectar automáticamente" + +#: extra/ocr/OCRSpace.py:7 extra/translator/translator.py:41 +msgid "Danish" +msgstr "Danés" + +#: extra/ocr/OCRSpace.py:7 extra/translator/translator.py:43 +msgid "Dutch" +msgstr "Holandés" + +#: extra/ocr/OCRSpace.py:7 extra/translator/translator.py:44 +msgid "English" +msgstr "Inglés" + +#: extra/ocr/OCRSpace.py:7 extra/translator/translator.py:48 +msgid "Finnish" +msgstr "Finés" + +#: extra/ocr/OCRSpace.py:7 extra/translator/translator.py:49 +msgid "French" +msgstr "Francés" + +#: extra/ocr/OCRSpace.py:7 extra/translator/translator.py:52 +msgid "German" +msgstr "Alemán" + +#: extra/ocr/OCRSpace.py:7 extra/translator/translator.py:58 +msgid "Hungarian" +msgstr "Húngaro" + +#: extra/ocr/OCRSpace.py:7 extra/translator/translator.py:68 +msgid "Korean" +msgstr "Coreano" + +#: extra/ocr/OCRSpace.py:7 extra/translator/translator.py:63 +msgid "Italian" +msgstr "Italiano" + +#: extra/ocr/OCRSpace.py:7 extra/translator/translator.py:64 +msgid "Japanese" +msgstr "Japonés" + +#: extra/ocr/OCRSpace.py:7 extra/translator/translator.py:85 +msgid "Polish" +msgstr "Polaco" + +#: extra/ocr/OCRSpace.py:7 extra/translator/translator.py:86 +msgid "Portuguese" +msgstr "Portugués" + +#: extra/ocr/OCRSpace.py:7 extra/translator/translator.py:89 +msgid "Russian" +msgstr "Ruso" + +#: extra/ocr/OCRSpace.py:7 extra/translator/translator.py:96 +msgid "Spanish" +msgstr "Español" + +#: extra/ocr/OCRSpace.py:7 extra/translator/translator.py:105 +msgid "Turkish" +msgstr "Turco" + +#: extra/translator/translator.py:22 +msgid "Afrikaans" +msgstr "Africano" + +#: extra/translator/translator.py:23 +msgid "Albanian" +msgstr "Albanés" + +#: extra/translator/translator.py:24 +msgid "Amharic" +msgstr "Amárico" + +#: extra/translator/translator.py:25 +msgid "Arabic" +msgstr "Árabe" + +#: extra/translator/translator.py:26 +msgid "Armenian" +msgstr "Armenio" + +#: extra/translator/translator.py:27 +msgid "Azerbaijani" +msgstr "Acerí" + +#: extra/translator/translator.py:28 +msgid "Basque" +msgstr "Vasco" + +#: extra/translator/translator.py:29 +msgid "Belarusian" +msgstr "Bielorruso" + +#: extra/translator/translator.py:30 +msgid "Bengali" +msgstr "Bengalí" + +#: extra/translator/translator.py:31 +msgid "Bihari" +msgstr "Bihari" + +#: extra/translator/translator.py:32 +msgid "Bulgarian" +msgstr "Búlgaro" + +#: extra/translator/translator.py:33 +msgid "Burmese" +msgstr "Birmano" + +#: extra/translator/translator.py:34 +msgid "Catalan" +msgstr "Catalán" + +#: extra/translator/translator.py:35 +msgid "Cherokee" +msgstr "Cheroqui" + +#: extra/translator/translator.py:36 +msgid "Chinese" +msgstr "Chino" + +#: extra/translator/translator.py:37 +msgid "Chinese_simplified" +msgstr "Chino simplificado" + +#: extra/translator/translator.py:38 +msgid "Chinese_traditional" +msgstr "Chino tradicional" + +#: extra/translator/translator.py:39 +msgid "Croatian" +msgstr "Croata" + +#: extra/translator/translator.py:40 +msgid "Czech" +msgstr "Checo" + +#: extra/translator/translator.py:42 +msgid "Dhivehi" +msgstr "Dhivehi" + +#: extra/translator/translator.py:45 +msgid "Esperanto" +msgstr "Esperanto" + +#: extra/translator/translator.py:46 +msgid "Estonian" +msgstr "Estonio" + +#: extra/translator/translator.py:47 +msgid "Filipino" +msgstr "Filipino" + +#: extra/translator/translator.py:50 +msgid "Galician" +msgstr "Gallego" + +#: extra/translator/translator.py:51 +msgid "Georgian" +msgstr "Georgiano" + +#: extra/translator/translator.py:53 +msgid "Greek" +msgstr "Griego" + +#: extra/translator/translator.py:54 +msgid "Guarani" +msgstr "Guaraní" + +#: extra/translator/translator.py:55 +msgid "Gujarati" +msgstr "Guyaratí" + +#: extra/translator/translator.py:56 +msgid "Hebrew" +msgstr "Hebreo" + +#: extra/translator/translator.py:57 +msgid "Hindi" +msgstr "Hindi" + +#: extra/translator/translator.py:59 +msgid "Icelandic" +msgstr "Islandés" + +#: extra/translator/translator.py:60 +msgid "Indonesian" +msgstr "Indonesio" + +#: extra/translator/translator.py:61 +msgid "Inuktitut" +msgstr "Inuktitut" + +#: extra/translator/translator.py:62 +msgid "Irish" +msgstr "Irlandés" + +#: extra/translator/translator.py:65 +msgid "Kannada" +msgstr "Canarés" + +#: extra/translator/translator.py:66 +msgid "Kazakh" +msgstr "Kazajo" + +#: extra/translator/translator.py:67 +msgid "Khmer" +msgstr "Camboyano" + +#: extra/translator/translator.py:69 +msgid "Kurdish" +msgstr "Kurdo" + +#: extra/translator/translator.py:70 +msgid "Kyrgyz" +msgstr "Kirguís" + +#: extra/translator/translator.py:71 +msgid "Laothian" +msgstr "Lao" + +#: extra/translator/translator.py:72 +msgid "Latvian" +msgstr "Letón" + +#: extra/translator/translator.py:73 +msgid "Lithuanian" +msgstr "Lituano" + +#: extra/translator/translator.py:74 +msgid "Macedonian" +msgstr "Macedonio" + +#: extra/translator/translator.py:75 +msgid "Malay" +msgstr "Malayo" + +#: extra/translator/translator.py:76 +msgid "Malayalam" +msgstr "Malayalam" + +#: extra/translator/translator.py:77 +msgid "Maltese" +msgstr "Maltés" + +#: extra/translator/translator.py:78 +msgid "Marathi" +msgstr "Maratí" + +#: extra/translator/translator.py:79 +msgid "Mongolian" +msgstr "Mongol" + +#: extra/translator/translator.py:80 +msgid "Nepali" +msgstr "Nepalí" + +#: extra/translator/translator.py:81 +msgid "Norwegian" +msgstr "Noruego" + +#: extra/translator/translator.py:82 +msgid "Oriya" +msgstr "Oriya" + +#: extra/translator/translator.py:83 +msgid "Pashto" +msgstr "Pastú" + +#: extra/translator/translator.py:84 +msgid "Persian" +msgstr "Persa" + +#: extra/translator/translator.py:87 +msgid "Punjabi" +msgstr "Panyabí" + +#: extra/translator/translator.py:88 +msgid "Romanian" +msgstr "Rumano" + +#: extra/translator/translator.py:90 +msgid "Sanskrit" +msgstr "Sánscrito" + +#: extra/translator/translator.py:91 +msgid "Serbian" +msgstr "Serbio" + +#: extra/translator/translator.py:92 +msgid "Sindhi" +msgstr "Sindhi" + +#: extra/translator/translator.py:93 +msgid "Sinhalese" +msgstr "Cingalés" + +#: extra/translator/translator.py:94 +msgid "Slovak" +msgstr "Eslovaco" + +#: extra/translator/translator.py:95 +msgid "Slovenian" +msgstr "Esloveno" + +#: extra/translator/translator.py:97 +msgid "Swahili" +msgstr "Suajili" + +#: extra/translator/translator.py:98 +msgid "Swedish" +msgstr "Sueco" + +#: extra/translator/translator.py:99 +msgid "Tajik" +msgstr "Tayiko" + +#: extra/translator/translator.py:100 +msgid "Tamil" +msgstr "Tamil" + +#: extra/translator/translator.py:101 +msgid "Tagalog" +msgstr "Tagalo" + +#: extra/translator/translator.py:102 +msgid "Telugu" +msgstr "Telugú" + +#: extra/translator/translator.py:103 +msgid "Thai" +msgstr "Tailandés" + +#: extra/translator/translator.py:104 +msgid "Tibetan" +msgstr "Tibetano" + +#: extra/translator/translator.py:106 +msgid "Ukrainian" +msgstr "Ucraniano" + +#: extra/translator/translator.py:107 +msgid "Urdu" +msgstr "Urdu" + +#: extra/translator/translator.py:108 +msgid "Uzbek" +msgstr "Uzbeco" + +#: extra/translator/translator.py:109 +msgid "Uighur" +msgstr "Uigur" + +#: extra/translator/translator.py:110 +msgid "Vietnamese" +msgstr "Vietnamita" + +#: extra/translator/translator.py:111 +msgid "Welsh" +msgstr "Galés" + +#: extra/translator/translator.py:112 +msgid "Yiddish" +msgstr "Yídish" + +#: extra/translator/wx_ui.py:29 +msgid "Translate message" +msgstr "Traducir mensaje" + +#: extra/translator/wx_ui.py:32 +msgid "Target language" +msgstr "Idioma de destino" + +#: issueReporter/issueReporter.py:32 wxUI/dialogs/configuration.py:359 +#: wxUI/dialogs/configuration.py:368 +msgid "General" +msgstr "General" + +#: issueReporter/issueReporter.py:33 +msgid "always" +msgstr "siempre" + +#: issueReporter/issueReporter.py:33 +msgid "sometimes" +msgstr "a veces" + +#: issueReporter/issueReporter.py:33 +msgid "random" +msgstr "aleatoriamente" + +#: issueReporter/issueReporter.py:33 +msgid "have not tried" +msgstr "no se ha intentado" + +#: issueReporter/issueReporter.py:33 +msgid "unable to duplicate" +msgstr "imposible de reproducir" + +#: issueReporter/issueReporter.py:34 +msgid "block" +msgstr "bloqueo" + +#: issueReporter/issueReporter.py:34 +msgid "crash" +msgstr "fallo" + +#: issueReporter/issueReporter.py:34 +msgid "major" +msgstr "mayor" + +#: issueReporter/issueReporter.py:34 +msgid "minor" +msgstr "menor" + +#: issueReporter/issueReporter.py:34 +msgid "tweak" +msgstr "ajuste" + +#: issueReporter/issueReporter.py:34 +msgid "text" +msgstr "texto" + +#: issueReporter/issueReporter.py:34 +msgid "trivial" +msgstr "trivial" + +#: issueReporter/issueReporter.py:34 +msgid "feature" +msgstr "característica" + +#: issueReporter/wx_ui.py:26 +msgid "Report an error" +msgstr "Reportar un error" + +#: issueReporter/wx_ui.py:29 +msgid "Select a category" +msgstr "Selecciona una categoría" + +#: issueReporter/wx_ui.py:37 +msgid "" +"Briefly describe what happened. You will be able to thoroughly explain it " +"later" +msgstr "" +"Describe en pocas palabras lo que ha pasado (después podrás profundizar)" + +#: issueReporter/wx_ui.py:46 +msgid "Here, you can describe the bug in detail" +msgstr "Aquí puedes describir el error en detalle" + +#: issueReporter/wx_ui.py:56 +msgid "how often does this bug happen?" +msgstr "¿Qué tan a menudo ocurre este error?" + +#: issueReporter/wx_ui.py:63 +msgid "Select the importance that you think this bug has" +msgstr "Selecciona la importancia que consideras que tiene este error" + +#: issueReporter/wx_ui.py:70 +msgid "" +"I know that the {0} bug system will get my Twitter username to contact me " +"and fix the bug quickly" +msgstr "" +"Sé que el sistema de errores de {0} obtendrá mi nombre de usuario de Twitter " +"para contactarme y resolver el error rápidamente" + +#: issueReporter/wx_ui.py:73 +msgid "Send report" +msgstr "Enviar reporte" + +#: issueReporter/wx_ui.py:75 wxUI/dialogs/filterDialogs.py:83 +#: wxUI/dialogs/find.py:23 +msgid "Cancel" +msgstr "Cancelar" + +#: issueReporter/wx_ui.py:84 +msgid "You must fill out both fields" +msgstr "Debes llenar ambos campos" + +#: issueReporter/wx_ui.py:87 +msgid "" +"You need to mark the checkbox to provide us your twitter username to contact " +"you if it is necessary." +msgstr "" +"Debes marcar la casilla para proporcionarnos tu nombre de usuario de Twitter " +"para poder contactarte si es necesario." + +#: issueReporter/wx_ui.py:90 +#, python-format +msgid "" +"Thanks for reporting this bug! In future versions, you may be able to find " +"it in the changes list. You've reported the bug number %i" +msgstr "" +"¡Gracias por reportar este error! Quizá puedas verlo entre la lista de " +"cambios de próximas versiones. Has reportado el error número %i" + +#: issueReporter/wx_ui.py:90 +msgid "reported" +msgstr "reportado" + +#: issueReporter/wx_ui.py:94 +msgid "" +"Something unexpected occurred while trying to report the bug. Please, try " +"again later" +msgstr "" +"Algo inesperado ocurrió mientras intentábamos reportar tu error. Por favor, " +"vuelve a intentarlo más tarde" + +#: issueReporter/wx_ui.py:94 +msgid "Error while reporting" +msgstr "Error al reportar" + +#: keystrokeEditor/constants.py:3 +msgid "Go up in the current buffer" +msgstr "Va arriba en la lista actual" + +#: keystrokeEditor/constants.py:4 +msgid "Go down in the current buffer" +msgstr "Va abajo en la lista actual" + +#: keystrokeEditor/constants.py:5 +msgid "Go to the previous buffer" +msgstr "Va al buffer anterior" + +#: keystrokeEditor/constants.py:6 +msgid "Go to the next buffer" +msgstr "Va al buffer siguiente" + +#: keystrokeEditor/constants.py:7 +msgid "Focus the next session" +msgstr "Ir a la siguiente sesión" + +#: keystrokeEditor/constants.py:8 +msgid "Focus the previous session" +msgstr "Va a la sesión anterior" + +#: keystrokeEditor/constants.py:9 +msgid "Show or hide the GUI" +msgstr "Muestra o esconde la interfaz gráfica" + +#: keystrokeEditor/constants.py:10 +msgid "New tweet" +msgstr "Nuevo tuit" + +#: keystrokeEditor/constants.py:12 wxUI/buffers/base.py:26 +#: wxUI/commonMessageDialogs.py:10 +msgid "Retweet" +msgstr "Retuit" + +#: keystrokeEditor/constants.py:13 +msgid "Send direct message" +msgstr "Enviar mensaje directo" + +#: keystrokeEditor/constants.py:14 +msgid "Like a tweet" +msgstr "Marcar tuit como me gusta" + +#: keystrokeEditor/constants.py:15 +msgid "Like/unlike a tweet" +msgstr "Marcar o remover tuit como me gusta" + +#: keystrokeEditor/constants.py:16 +msgid "Unlike a tweet" +msgstr "Marcar tuit como ya no me gusta" + +#: keystrokeEditor/constants.py:17 +msgid "Open the user actions dialogue" +msgstr "Abrir el diálogo de acciones" + +#: keystrokeEditor/constants.py:18 +msgid "See user details" +msgstr "Ver detalles del usuario" + +#: keystrokeEditor/constants.py:19 +msgid "Show tweet" +msgstr "Ver tuit" + +#: keystrokeEditor/constants.py:20 +msgid "Quit" +msgstr "Salir" + +#: keystrokeEditor/constants.py:21 +msgid "Open user timeline" +msgstr "Abrir línea temporal" + +#: keystrokeEditor/constants.py:22 +msgid "Destroy buffer" +msgstr "Eliminar buffer" + +#: keystrokeEditor/constants.py:23 +msgid "Interact with the currently focused tweet." +msgstr "Interactuar con el tuit que tiene el foco." + +#: keystrokeEditor/constants.py:24 +msgid "Open URL" +msgstr "Abrir URL" + +#: keystrokeEditor/constants.py:25 +msgid "View in Twitter" +msgstr "Ver en Twitter" + +#: keystrokeEditor/constants.py:26 +msgid "Increase volume by 5%" +msgstr "Subir volumen en un 5%" + +#: keystrokeEditor/constants.py:27 +msgid "Decrease volume by 5%" +msgstr "Bajar volumen en un 5%" + +#: keystrokeEditor/constants.py:28 +msgid "Jump to the first element of a buffer" +msgstr "Ir al primer elemento del buffer" + +#: keystrokeEditor/constants.py:29 +msgid "Jump to the last element of the current buffer" +msgstr "Ir al último elemento del buffer" + +#: keystrokeEditor/constants.py:30 +msgid "Jump 20 elements up in the current buffer" +msgstr "Moverse 20 elementos hacia arriba en el buffer actual" + +#: keystrokeEditor/constants.py:31 +msgid "Jump 20 elements down in the current buffer" +msgstr "Moverse 20 elementos hacia abajo en el buffer actual" + +#: keystrokeEditor/constants.py:32 +msgid "Edit profile" +msgstr "Editar perfil" + +#: keystrokeEditor/constants.py:33 +msgid "Delete a tweet or direct message" +msgstr "Eliminar tuit o mensaje directo" + +#: keystrokeEditor/constants.py:34 +msgid "Empty the current buffer" +msgstr "Vaciar buffer" + +#: keystrokeEditor/constants.py:35 +msgid "Repeat last item" +msgstr "Repetir último elemento" + +#: keystrokeEditor/constants.py:36 +msgid "Copy to clipboard" +msgstr "Copiar al portapapeles" + +#: keystrokeEditor/constants.py:37 +msgid "Add to list" +msgstr "Añadir a lista" + +#: keystrokeEditor/constants.py:38 +msgid "Remove from list" +msgstr "Quitar de lista" + +#: keystrokeEditor/constants.py:39 +msgid "Mute/unmute the active buffer" +msgstr "Silenciar o des-silenciar el buffer activo" + +#: keystrokeEditor/constants.py:40 +msgid "Mute/unmute the current session" +msgstr "Activar o desactivar el silencio para la sesión activa" + +#: keystrokeEditor/constants.py:41 +msgid "toggle the automatic reading of incoming tweets in the active buffer" +msgstr "" +"conmutar entre la lectura automática de nuevos tuits para el buffer actual" + +#: keystrokeEditor/constants.py:42 +msgid "Search on twitter" +msgstr "Buscar en Twitter" + +#: keystrokeEditor/constants.py:43 +msgid "Find a string in the currently focused buffer" +msgstr "Buscar un término en el buffer actual" + +#: keystrokeEditor/constants.py:44 +msgid "Show the keystroke editor" +msgstr "Mostrar el editor de combinaciones de teclado" + +#: keystrokeEditor/constants.py:45 +msgid "Show lists for a specified user" +msgstr "Mostrar listas para un usuario específico" + +#: keystrokeEditor/constants.py:46 +msgid "load previous items" +msgstr "cargar elementos anteriores" + +#: keystrokeEditor/constants.py:47 +msgid "Get geolocation" +msgstr "Obtener ubicación" + +#: keystrokeEditor/constants.py:48 +msgid "Display the tweet's geolocation in a dialog" +msgstr "Mostrar la ubicación del tuit en un diálogo" + +#: keystrokeEditor/constants.py:49 +msgid "Create a trending topics buffer" +msgstr "Crear un buffer de tendencias" + +#: keystrokeEditor/constants.py:50 +msgid "View conversation" +msgstr "Ver conversación" + +#: keystrokeEditor/constants.py:51 +msgid "Check and download updates" +msgstr "&Comprobar y descargar actualizaciones" + +#: keystrokeEditor/constants.py:52 +msgid "" +"Opens the list manager, which allows you to create, edit, delete and open " +"lists in buffers." +msgstr "" +"Abre el gestor de listas, que permite crear, editar, eliminar y abrir listas " +"como buffers." + +#: keystrokeEditor/constants.py:53 +msgid "Opens the global settings dialogue" +msgstr "Abre el diálogo de opciones globales" + +#: keystrokeEditor/constants.py:54 +msgid "Opens the list manager" +msgstr "Abre el gestor de listas" + +#: keystrokeEditor/constants.py:55 +msgid "Opens the account settings dialogue" +msgstr "Abre el diálogo de opciones de cuenta" + +#: keystrokeEditor/constants.py:56 +msgid "Try to play an audio file" +msgstr "Intentar reproducir audio" + +#: keystrokeEditor/constants.py:57 +msgid "Updates the buffer and retrieves possible lost items there." +msgstr "Actualiza el buffer e intenta descargar los elementos perdidos." + +#: keystrokeEditor/constants.py:58 +msgid "Extracts the text from a picture and displays the result in a dialog." +msgstr "Extrae el texto de una foto y muestra el resultado en un diálogo." + +#: keystrokeEditor/constants.py:59 +msgid "Adds an alias to an user" +msgstr "Añade un alias a un usuario específico." + +#: keystrokeEditor/wx_ui.py:8 +msgid "Keystroke editor" +msgstr "Editor de combinaciones de teclado" + +#: keystrokeEditor/wx_ui.py:12 +msgid "Select a keystroke to edit" +msgstr "Selecciona una combinación de teclado para editarla" + +#: keystrokeEditor/wx_ui.py:13 wxUI/dialogs/userActions.py:10 +#: wxUI/dialogs/userActions.py:19 wxUI/dialogs/userActions.py:20 +msgid "Action" +msgstr "Acción" + +#: keystrokeEditor/wx_ui.py:13 +msgid "Keystroke" +msgstr "Combinación de teclado" + +#: keystrokeEditor/wx_ui.py:18 wxUI/dialogs/filterDialogs.py:135 +#: wxUI/dialogs/lists.py:20 wxUI/dialogs/userAliasDialogs.py:53 +msgid "Edit" +msgstr "Editar" + +#: keystrokeEditor/wx_ui.py:20 keystrokeEditor/wx_ui.py:50 +msgid "Undefine keystroke" +msgstr "Desasignar combinación de teclas" + +#: keystrokeEditor/wx_ui.py:21 +msgid "Execute action" +msgstr "Ejecutar acción" + +#: keystrokeEditor/wx_ui.py:22 wxUI/dialogs/configuration.py:396 +#: wxUI/dialogs/userAliasDialogs.py:25 wxUI/dialogs/utils.py:39 +msgid "Close" +msgstr "Cerrar" + +#: keystrokeEditor/wx_ui.py:42 +msgid "Undefined" +msgstr "Sin definir" + +#: keystrokeEditor/wx_ui.py:50 +msgid "Are you sure you want to undefine this keystroke?" +msgstr "¿Seguro que deseas desasignar esta combinación de teclado?" + +#: keystrokeEditor/wx_ui.py:54 +msgid "Editing keystroke" +msgstr "Editando combinación de teclas" + +#: keystrokeEditor/wx_ui.py:57 +msgid "Control" +msgstr "Control" + +#: keystrokeEditor/wx_ui.py:58 +msgid "Alt" +msgstr "Alt" + +#: keystrokeEditor/wx_ui.py:59 +msgid "Shift" +msgstr "Shift" + +#: keystrokeEditor/wx_ui.py:60 +msgid "Windows" +msgstr "Windows" + +#: keystrokeEditor/wx_ui.py:66 +msgid "Key" +msgstr "Tecla" + +#: keystrokeEditor/wx_ui.py:71 wxUI/dialogs/filterDialogs.py:80 +#: wxUI/dialogs/find.py:21 wxUI/dialogs/userAliasDialogs.py:23 +#: wxUI/dialogs/utils.py:36 +msgid "OK" +msgstr "Aceptar" + +#: keystrokeEditor/wx_ui.py:84 +msgid "You need to use the Windows key" +msgstr "Necesitas usar la tecla de windows" + +#: keystrokeEditor/wx_ui.py:84 keystrokeEditor/wx_ui.py:87 +msgid "Invalid keystroke" +msgstr "Combinación de teclado inválida" + +#: keystrokeEditor/wx_ui.py:87 +msgid "You must provide a character for the keystroke" +msgstr "Debes proporcionar una letra para el atajo de teclado" + +#: sessionmanager/wxUI.py:9 msgid "Session manager" msgstr "Gestor de sesiones" -#: ../src\sessionmanager\wxUI.py:12 +#: sessionmanager/wxUI.py:12 msgid "Accounts list" msgstr "Lista de cuentas" -#: ../src\sessionmanager\wxUI.py:14 +#: sessionmanager/wxUI.py:14 msgid "Account" msgstr "Cuenta" -#: ../src\sessionmanager\wxUI.py:18 +#: sessionmanager/wxUI.py:18 msgid "New account" msgstr "Nueva cuenta" -#: ../src\sessionmanager\wxUI.py:19 ../src\sessionmanager\wxUI.py:65 +#: sessionmanager/wxUI.py:19 sessionmanager/wxUI.py:65 msgid "Remove account" msgstr "Eliminar cuenta" -#: ../src\sessionmanager\wxUI.py:20 +#: sessionmanager/wxUI.py:20 msgid "Global Settings" msgstr "Opciones globales" -#: ../src\sessionmanager\wxUI.py:43 -msgid "Account Error" -msgstr "Error en la cuenta" - -#: ../src\sessionmanager\wxUI.py:43 +#: sessionmanager/wxUI.py:43 msgid "You need to configure an account." msgstr "Necesitas configurar una cuenta." -#: ../src\sessionmanager\wxUI.py:49 -msgid "Authorization" -msgstr "Autorización" +#: sessionmanager/wxUI.py:43 +msgid "Account Error" +msgstr "Error en la cuenta" -#: ../src\sessionmanager\wxUI.py:49 +#: sessionmanager/wxUI.py:49 msgid "" "The request to authorize your Twitter account will be opened in your " "browser. You only need to do this once. Would you like to continue?" @@ -1902,15 +1950,16 @@ msgstr "" "La solicitud de autorización de Twitter será abierta en tu navegador. Esto " "es necesario hacerlo solo una vez. ¿Quieres continuar?" -#: ../src\sessionmanager\wxUI.py:53 +#: sessionmanager/wxUI.py:49 +msgid "Authorization" +msgstr "Autorización" + +#: sessionmanager/wxUI.py:53 +#, python-format msgid "Authorized account %d" msgstr "Cuenta autorizada %d" -#: ../src\sessionmanager\wxUI.py:59 -msgid "Invalid user token" -msgstr "Código de acceso inválido" - -#: ../src\sessionmanager\wxUI.py:59 +#: sessionmanager/wxUI.py:59 msgid "" "Your access token is invalid or the authorization has failed. Please try " "again." @@ -1918,15 +1967,15 @@ msgstr "" "El código de autorización es inválido o el proceso ha fallado. Por favor " "inténtalo de nuevo más tarde." -#: ../src\sessionmanager\wxUI.py:65 +#: sessionmanager/wxUI.py:59 +msgid "Invalid user token" +msgstr "Código de acceso inválido" + +#: sessionmanager/wxUI.py:65 msgid "Do you really want to delete this account?" msgstr "¿Realmente deseas eliminar esta cuenta?" -#: ../src\sessionmanager\wxUI.py:81 -msgid "Authentication error for session {}" -msgstr "Error de autenticación en la sesión {}" - -#: ../src\sessionmanager\wxUI.py:81 +#: sessionmanager/wxUI.py:81 msgid "" "TWBlue is unable to authenticate the account for {} in Twitter. It might be " "due to an invalid or expired token, revoqued access to the application, or " @@ -1939,7 +1988,11 @@ msgstr "" "favor, elimina esta cuenta manualmente desde tus sesiones de Twitter en la " "aplicación para dejar de ver este mensaje." -#: ../src\sessions\base.py:113 +#: sessionmanager/wxUI.py:81 +msgid "Authentication error for session {}" +msgstr "Error de autenticación en la sesión {}" + +#: sessions/base.py:113 msgid "" "An exception occurred while saving the {app} database. It will be deleted " "and rebuilt automatically. If this error persists, send the error log to the " @@ -1949,7 +2002,7 @@ msgstr "" "será creada desde cero automáticamente. Si este error persiste, contacta con " "los desarrolladores de {app} para obtener ayuda." -#: ../src\sessions\base.py:153 +#: sessions/base.py:153 msgid "" "An exception occurred while loading the {app} database. It will be deleted " "and rebuilt automatically. If this error persists, send the error log to the " @@ -1959,26 +2012,46 @@ msgstr "" "de datos nueva automáticamente. Si este error persiste, contacta con los " "desarrolladores de {app} para obtener ayuda." -#: ../src\sessions\twitter\compose.py:38 ../src\sessions\twitter\compose.py:81 -#: ../src\sessions\twitter\compose.py:146 -#: ../src\sessions\twitter\compose.py:155 +#: sessions/session_utils.py:231 sessions/twitter/utils.py:231 +msgid "Sorry, you are not authorised to see this status." +msgstr "Lo sentimos, no estás autorizado para ver este tuit." + +#: sessions/session_utils.py:233 sessions/twitter/utils.py:233 +msgid "No status found with that ID" +msgstr "No existe un tuit con este ID" + +#: sessions/session_utils.py:235 +msgid "Error code {0}" +msgstr "Código de error {0}" + +#: sessions/session_utils.py:262 sessions/twitter/utils.py:262 +msgid "{user_1}, {user_2} and {all_users} more: {text}" +msgstr "{user_1}, {user_2} y {all_users} más: {text}" + +#: sessions/twitter/compose.py:38 sessions/twitter/compose.py:81 +#: sessions/twitter/compose.py:146 sessions/twitter/compose.py:155 +#: sessions/twitter/templates.py:38 sessions/twitter/templates.py:81 +#: sessions/twitter/templates.py:146 sessions/twitter/templates.py:155 msgid "dddd, MMMM D, YYYY H:m:s" msgstr "dddd, MMMM D, YYYY H:m:s" -#: ../src\sessions\twitter\compose.py:89 ../src\sessions\twitter\compose.py:91 +#: sessions/twitter/compose.py:89 sessions/twitter/compose.py:91 +#: sessions/twitter/templates.py:89 sessions/twitter/templates.py:91 +#, python-format msgid "Dm to %s " msgstr "Dm a %s " -#: ../src\sessions\twitter\compose.py:130 +#: sessions/twitter/compose.py:130 sessions/twitter/templates.py:130 msgid "{0}. Quoted tweet from @{1}: {2}" msgstr "{0} citó el tuit de {1}: {2}" -#: ../src\sessions\twitter\compose.py:157 -#: ../src\sessions\twitter\compose.py:159 +#: sessions/twitter/compose.py:157 sessions/twitter/compose.py:159 +#: sessions/twitter/templates.py:157 sessions/twitter/templates.py:159 msgid "Unavailable" msgstr "No disponible" -#: ../src\sessions\twitter\compose.py:160 +#: sessions/twitter/compose.py:160 sessions/twitter/templates.py:160 +#, python-format msgid "" "%s (@%s). %s followers, %s friends, %s tweets. Last tweeted %s. Joined " "Twitter %s" @@ -1986,64 +2059,46 @@ msgstr "" "%s (@%s). %s seguidores, %s amigos, %s tuits. Último tuit %s. Se unió a " "Twitter %s" -#: ../src\sessions\twitter\compose.py:164 +#: sessions/twitter/compose.py:164 sessions/twitter/templates.py:164 msgid "No description available" msgstr "No hay una descripción disponible" -#: ../src\sessions\twitter\compose.py:168 +#: sessions/twitter/compose.py:168 sessions/twitter/templates.py:168 msgid "private" msgstr "privado" -#: ../src\sessions\twitter\compose.py:169 +#: sessions/twitter/compose.py:169 sessions/twitter/templates.py:169 msgid "public" msgstr "público" -#: ../src\sessions\twitter\session.py:211 +#: sessions/twitter/session.py:211 sessions/twitter/session.py:238 +#, python-format msgid "%s failed. Reason: %s" msgstr "%s falló. Razón: %s" -#: ../src\sessions\twitter\session.py:217 +#: sessions/twitter/session.py:217 sessions/twitter/session.py:241 +#, python-format msgid "%s succeeded." msgstr "%s con éxito." -#: ../src\sessions\twitter\session.py:426 -#: ../src\sessions\twitter\session.py:504 +#: sessions/twitter/session.py:450 sessions/twitter/session.py:528 msgid "Deleted account" msgstr "Cuenta eliminada" -#: ../src\sessions\twitter\utils.py:231 -msgid "Sorry, you are not authorised to see this status." -msgstr "Lo sentimos, no estás autorizado para ver este tuit." - -#: ../src\sessions\twitter\utils.py:233 -msgid "No status found with that ID" -msgstr "No existe un tuit con este ID" - -#: ../src\sessions\twitter\utils.py:235 +#: sessions/twitter/utils.py:235 msgid "Error {0}" msgstr "Código de error {0}" -#: ../src\sessions\twitter\utils.py:262 -msgid "{user_1}, {user_2} and {all_users} more: {text}" -msgstr "{user_1}, {user_2} y {all_users} más: {text}" - -#: ../src\sessions\twitter\wxUI.py:7 +#: sessions/twitter/wxUI.py:7 msgid "Authorising account..." msgstr "Autorizando cuenta..." -#: ../src\sessions\twitter\wxUI.py:10 +#: sessions/twitter/wxUI.py:10 msgid "Enter your PIN code here" msgstr "Introduce el código PIN aquí" -#: ../src\sound.py:161 -msgid "Stopped." -msgstr "Detenido." - -#: ../src\update\wxUpdater.py:14 -msgid "New version for %s" -msgstr "Nueva versión de %s" - -#: ../src\update\wxUpdater.py:14 +#: update/wxUpdater.py:14 +#, python-format msgid "" "There's a new %s version available, released on %s. Would you like to " "download it now?\n" @@ -2060,23 +2115,25 @@ msgstr "" "Novedades:\n" "%s" -#: ../src\update\wxUpdater.py:22 +#: update/wxUpdater.py:14 +#, python-format +msgid "New version for %s" +msgstr "Nueva versión de %s" + +#: update/wxUpdater.py:22 msgid "Download in Progress" msgstr "Descarga en progreso" -#: ../src\update\wxUpdater.py:22 +#: update/wxUpdater.py:22 msgid "Downloading the new version..." msgstr "Descargando la nueva versión..." -#: ../src\update\wxUpdater.py:32 +#: update/wxUpdater.py:32 +#, python-format msgid "Updating... %s of %s" msgstr "Actualizando... %s de %s" -#: ../src\update\wxUpdater.py:35 -msgid "Done!" -msgstr "¡Hecho!" - -#: ../src\update\wxUpdater.py:35 +#: update/wxUpdater.py:35 msgid "" "The update has been downloaded and installed successfully. Press OK to " "continue." @@ -2084,62 +2141,11 @@ msgstr "" "La actualización ha sido descargada e instalada. Presiona aceptar para " "iniciar la aplicación." -#: ../src\wxUI\buffers\base.py:12 -msgid "Client" -msgstr "Cliente" +#: update/wxUpdater.py:35 +msgid "Done!" +msgstr "¡Hecho!" -#: ../src\wxUI\buffers\base.py:12 -msgid "Text" -msgstr "Texto" - -#: ../src\wxUI\buffers\base.py:12 ../src\wxUI\buffers\events.py:14 -msgid "Date" -msgstr "Fecha" - -#: ../src\wxUI\buffers\base.py:12 ../src\wxUI\buffers\people.py:12 -#: ../src\wxUI\buffers\user_searches.py:11 -#: ../src\wxUI\dialogs\userAliasDialogs.py:14 -#: ../src\wxUI\dialogs\userSelection.py:11 ../src\wxUI\dialogs\utils.py:32 -msgid "User" -msgstr "Usuario" - -#: ../src\wxUI\buffers\base.py:28 -msgid "Direct message" -msgstr "Mensaje directo" - -#: ../src\wxUI\buffers\events.py:14 -msgid "Event" -msgstr "Evento" - -#: ../src\wxUI\buffers\events.py:16 -msgid "Remove event" -msgstr "Eliminar evento" - -#: ../src\wxUI\buffers\panels.py:12 ../src\wxUI\buffers\panels.py:20 -msgid "Login" -msgstr "Iniciar sesión" - -#: ../src\wxUI\buffers\panels.py:14 -msgid "Log in automatically" -msgstr "Iniciar sesión automáticamente" - -#: ../src\wxUI\buffers\panels.py:22 -msgid "Logout" -msgstr "Cerrar sesión" - -#: ../src\wxUI\buffers\trends.py:9 -msgid "Trending topic" -msgstr "Tendencia" - -#: ../src\wxUI\buffers\trends.py:19 -msgid "Tweet about this trend" -msgstr "Tuitear sobre esta tendencia" - -#: ../src\wxUI\buffers\trends.py:20 ../src\wxUI\menus.py:97 -msgid "Search topic" -msgstr "Buscar tema" - -#: ../src\wxUI\commonMessageDialogs.py:7 +#: wxUI/commonMessageDialogs.py:7 msgid "" "This retweet is over 140 characters. Would you like to post it as a mention " "to the poster with your comments and a link to the original tweet?" @@ -2148,38 +2154,38 @@ msgstr "" "comentarios con una mención al usuario que publicó el tuit original y un " "enlace al mismo?" -#: ../src\wxUI\commonMessageDialogs.py:10 +#: wxUI/commonMessageDialogs.py:10 msgid "Would you like to add a comment to this tweet?" msgstr "¿Te gustaría añadir un comentario a este tuit?" -#: ../src\wxUI\commonMessageDialogs.py:13 +#: wxUI/commonMessageDialogs.py:13 msgid "" "Do you really want to delete this tweet? It will be deleted from Twitter as " "well." msgstr "" "¿Realmente quieres borrar este mensaje? También se eliminará de Twitter." -#: ../src\wxUI\commonMessageDialogs.py:13 ../src\wxUI\dialogs\lists.py:149 +#: wxUI/commonMessageDialogs.py:13 wxUI/dialogs/lists.py:149 msgid "Delete" msgstr "Eliminar" -#: ../src\wxUI\commonMessageDialogs.py:16 +#: wxUI/commonMessageDialogs.py:16 msgid "Do you really want to close {0}?" msgstr "¿Realmente deseas salir de {0}?" -#: ../src\wxUI\commonMessageDialogs.py:16 +#: wxUI/commonMessageDialogs.py:16 msgid "Exit" msgstr "Salir" -#: ../src\wxUI\commonMessageDialogs.py:20 +#: wxUI/commonMessageDialogs.py:20 msgid " {0} must be restarted for these changes to take effect." msgstr " Debes reiniciar {0} para que estos cambios tengan efecto." -#: ../src\wxUI\commonMessageDialogs.py:20 +#: wxUI/commonMessageDialogs.py:20 msgid "Restart {0} " msgstr "Reiniciar {0} " -#: ../src\wxUI\commonMessageDialogs.py:23 +#: wxUI/commonMessageDialogs.py:23 msgid "" "Are you sure you want to delete this user from the database? This user will " "not appear in autocomplete results anymore." @@ -2187,20 +2193,19 @@ msgstr "" "¿Estás seguro de querer eliminar este usuario de la base de datos? Este ya " "no aparecerá en los resultados del autocompletado." -#: ../src\wxUI\commonMessageDialogs.py:23 +#: wxUI/commonMessageDialogs.py:23 msgid "Confirm" msgstr "Confirmar" -#: ../src\wxUI\commonMessageDialogs.py:26 +#: wxUI/commonMessageDialogs.py:26 msgid "Enter the name of the client : " msgstr "Introduce el nombre del cliente: " -#: ../src\wxUI\commonMessageDialogs.py:26 -#: ../src\wxUI\dialogs\configuration.py:246 +#: wxUI/commonMessageDialogs.py:26 wxUI/dialogs/configuration.py:246 msgid "Add client" msgstr "Añadir cliente" -#: ../src\wxUI\commonMessageDialogs.py:32 +#: wxUI/commonMessageDialogs.py:32 msgid "" "Do you really want to empty this buffer? It's items will be removed from " "the list but not from Twitter" @@ -2208,32 +2213,31 @@ msgstr "" "¿Realmente quieres vaciar el contenido de este buffer? Los tweets serán " "eliminados de la lista, pero no de Twitter" -#: ../src\wxUI\commonMessageDialogs.py:32 +#: wxUI/commonMessageDialogs.py:32 msgid "Empty buffer" msgstr "Vaciar buffer" -#: ../src\wxUI\commonMessageDialogs.py:36 +#: wxUI/commonMessageDialogs.py:36 msgid "Do you really want to destroy this buffer?" msgstr "¿Realmente deseas eliminar este buffer?" -#: ../src\wxUI\commonMessageDialogs.py:36 -#: ../src\wxUI\commonMessageDialogs.py:86 +#: wxUI/commonMessageDialogs.py:36 wxUI/commonMessageDialogs.py:86 msgid "Attention" msgstr "Atención" -#: ../src\wxUI\commonMessageDialogs.py:42 +#: wxUI/commonMessageDialogs.py:42 msgid "A timeline for this user already exists. You can't open another" msgstr "Ya hay una línea temporal para este usuario. No se puede abrir otra" -#: ../src\wxUI\commonMessageDialogs.py:42 +#: wxUI/commonMessageDialogs.py:42 msgid "Existing timeline" msgstr "Línea temporal existente" -#: ../src\wxUI\commonMessageDialogs.py:45 +#: wxUI/commonMessageDialogs.py:45 msgid "This user has no tweets, so you can't open a timeline for them." msgstr "Este usuario no tiene tuits. No puedes abrirle una línea temporal." -#: ../src\wxUI\commonMessageDialogs.py:48 +#: wxUI/commonMessageDialogs.py:48 msgid "" "This is a protected Twitter user, which means you can't open a timeline " "using the Streaming API. The user's tweets will not update due to a twitter " @@ -2244,12 +2248,11 @@ msgstr "" "este usuario no se actualizarán debido a una política de Twitter. ¿Deseas " "continuar?" -#: ../src\wxUI\commonMessageDialogs.py:48 -#: ../src\wxUI\commonMessageDialogs.py:95 +#: wxUI/commonMessageDialogs.py:48 wxUI/commonMessageDialogs.py:95 msgid "Warning" msgstr "Atención" -#: ../src\wxUI\commonMessageDialogs.py:51 +#: wxUI/commonMessageDialogs.py:51 msgid "" "This is a protected user account, you need to follow this user to view their " "tweets or likes." @@ -2257,7 +2260,7 @@ msgstr "" "Esta es una cuenta protegida, debes seguir al usuario para poder ver sus " "tuits y los tuits marcados con me gusta." -#: ../src\wxUI\commonMessageDialogs.py:54 +#: wxUI/commonMessageDialogs.py:54 msgid "" "If you like {0} we need your help to keep it going. Help us by donating to " "the project. This will help us pay for the server, the domain and some other " @@ -2272,42 +2275,38 @@ msgstr "" "permitirá seguir escribiendo características para {0} y que estas sean " "libres en {0}. ¿Te gustaría donar ahora?" -#: ../src\wxUI\commonMessageDialogs.py:54 +#: wxUI/commonMessageDialogs.py:54 msgid "We need your help" msgstr "Necesitamos tu ayuda" -#: ../src\wxUI\commonMessageDialogs.py:58 +#: wxUI/commonMessageDialogs.py:58 msgid "This user has no tweets. {0} can't create a timeline." msgstr "Este usuario no tiene tuits. {0} no puede abrirle una línea temporal." -#: ../src\wxUI\commonMessageDialogs.py:61 +#: wxUI/commonMessageDialogs.py:61 msgid "This user has no favorited tweets. {0} can't create a timeline." msgstr "" "Este usuario no tiene tuits favoritos. {0} no puede abrirle una línea " "temporal." -#: ../src\wxUI\commonMessageDialogs.py:64 +#: wxUI/commonMessageDialogs.py:64 msgid "This user has no followers. {0} can't create a timeline." msgstr "" "Este usuario no tiene seguidores. {0} no puede abrirle una línea temporal." -#: ../src\wxUI\commonMessageDialogs.py:67 +#: wxUI/commonMessageDialogs.py:67 msgid "This user has no friends. {0} can't create a timeline." msgstr "Este usuario no tiene amigos. {0} no puede abrirle una línea temporal." -#: ../src\wxUI\commonMessageDialogs.py:71 -msgid "Geo data for this tweet" -msgstr "Información geográfica para este tweet" - -#: ../src\wxUI\commonMessageDialogs.py:71 +#: wxUI/commonMessageDialogs.py:71 msgid "Geolocation data: {0}" msgstr "Datos de ubicación: {0}" -#: ../src\wxUI\commonMessageDialogs.py:74 -msgid "Information" -msgstr "Información" +#: wxUI/commonMessageDialogs.py:71 +msgid "Geo data for this tweet" +msgstr "Información geográfica para este tweet" -#: ../src\wxUI\commonMessageDialogs.py:74 +#: wxUI/commonMessageDialogs.py:74 msgid "" "TWBlue has detected that you're running windows 10 and has changed the " "default keymap to the Windows 10 keymap. It means that some keyboard " @@ -2320,11 +2319,15 @@ msgstr "" "el editor de combinaciones de teclado y ver todas las combinaciones " "disponibles en este mapa de teclado." -#: ../src\wxUI\commonMessageDialogs.py:77 +#: wxUI/commonMessageDialogs.py:74 +msgid "Information" +msgstr "Información" + +#: wxUI/commonMessageDialogs.py:77 msgid "You have been blocked from viewing this content" msgstr "Te han bloqueado y no puedes ver este contenido" -#: ../src\wxUI\commonMessageDialogs.py:80 +#: wxUI/commonMessageDialogs.py:80 msgid "" "You have been blocked from viewing someone's content. In order to avoid " "conflicts with the full session, TWBlue will remove the affected timeline." @@ -2332,7 +2335,7 @@ msgstr "" "Alguien te ha bloqueado y no puedes ver su contenido. Para evitar conflictos " "en la sesión entera, TWBlue quitará el hilo temporal afectado." -#: ../src\wxUI\commonMessageDialogs.py:83 +#: wxUI/commonMessageDialogs.py:83 msgid "" "TWBlue cannot load this timeline because the user has been suspended from " "Twitter." @@ -2340,15 +2343,15 @@ msgstr "" "TWBlue no puede cargar este hilo temporal porque el usuario ha sido " "suspendido por Twitter." -#: ../src\wxUI\commonMessageDialogs.py:86 +#: wxUI/commonMessageDialogs.py:86 msgid "Do you really want to delete this filter?" msgstr "¿Realmente deseas eliminar este filtro?" -#: ../src\wxUI\commonMessageDialogs.py:89 +#: wxUI/commonMessageDialogs.py:89 msgid "This filter already exists. Please use a different title" msgstr "Este filtro ya existe, por favor utiliza un título diferente" -#: ../src\wxUI\commonMessageDialogs.py:95 +#: wxUI/commonMessageDialogs.py:95 msgid "" "{0} quit unexpectedly the last time it was run. If the problem persists, " "please report it to the {0} developers." @@ -2356,146 +2359,441 @@ msgstr "" "{0} se cerró de forma inesperada la última vez que se usó. Si el problema " "persiste, por favor informa de él a los desarrolladores de {0}." -#: ../src\wxUI\dialogs\attach.py:10 -msgid "Add an attachment" -msgstr "Adjuntar un archivo" +#: wxUI/menus.py:8 wxUI/view.py:33 +msgid "&Retweet" +msgstr "&Retuit" -#: ../src\wxUI\dialogs\attach.py:13 -msgid "Attachments" -msgstr "Adjuntos" +#: wxUI/menus.py:10 wxUI/menus.py:34 wxUI/view.py:32 +msgid "Re&ply" +msgstr "Res&ponder" -#: ../src\wxUI\dialogs\attach.py:14 -msgid "Title" -msgstr "Título" +#: wxUI/menus.py:12 wxUI/view.py:34 +msgid "&Like" +msgstr "Me &gusta" -#: ../src\wxUI\dialogs\attach.py:14 -msgid "Type" -msgstr "Tipo" +#: wxUI/menus.py:14 wxUI/view.py:35 +msgid "&Unlike" +msgstr "&Ya no me gusta" -#: ../src\wxUI\dialogs\attach.py:19 -msgid "Add attachments" -msgstr "Añadir adjuntos" +#: wxUI/menus.py:16 wxUI/menus.py:36 wxUI/menus.py:52 +msgid "&Open URL" +msgstr "&Abrir URL" -#: ../src\wxUI\dialogs\attach.py:20 -msgid "&Photo" -msgstr "&Foto" +#: wxUI/menus.py:18 wxUI/menus.py:54 wxUI/menus.py:87 +msgid "&Open in Twitter" +msgstr "&Abrir en Twitter" -#: ../src\wxUI\dialogs\attach.py:21 -msgid "Remove attachment" -msgstr "Remover archivo" +#: wxUI/menus.py:20 wxUI/menus.py:38 wxUI/menus.py:56 +msgid "&Play audio" +msgstr "&Reproducir audio" -#: ../src\wxUI\dialogs\attach.py:37 ../src\wxUI\dialogs\message.py:116 -#: ../src\wxUI\dialogs\message.py:175 ../src\wxUI\dialogs\message.py:235 -#: ../src\wxUI\dialogs\update_profile.py:82 -msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" -msgstr "Archivos de imagen (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" +#: wxUI/menus.py:22 wxUI/menus.py:58 wxUI/view.py:36 +msgid "&Show tweet" +msgstr "&Ver tuit" -#: ../src\wxUI\dialogs\attach.py:37 ../src\wxUI\dialogs\message.py:116 -#: ../src\wxUI\dialogs\message.py:175 ../src\wxUI\dialogs\message.py:235 -#: ../src\wxUI\dialogs\update_profile.py:82 -msgid "Select the picture to be uploaded" -msgstr "Selecciona una foto para subir" +#: wxUI/menus.py:24 wxUI/menus.py:42 wxUI/menus.py:60 wxUI/menus.py:70 +#: wxUI/menus.py:89 wxUI/menus.py:103 +msgid "&Copy to clipboard" +msgstr "&Copiar al portapapeles" -#: ../src\wxUI\dialogs\attach.py:44 -msgid "please provide a description" -msgstr "por favor proporciona una descripción" +#: wxUI/menus.py:26 wxUI/menus.py:44 wxUI/menus.py:62 wxUI/menus.py:72 +#: wxUI/view.py:40 +msgid "&Delete" +msgstr "&Eliminar" -#: ../src\wxUI\dialogs\attach.py:44 ../src\wxUI\dialogs\lists.py:14 -#: ../src\wxUI\dialogs\lists.py:70 -msgid "Description" -msgstr "Descripción" +#: wxUI/menus.py:28 wxUI/menus.py:46 wxUI/menus.py:91 +msgid "&User actions..." +msgstr "&Acciones de usuario..." -#: ../src\wxUI\dialogs\configuration.py:15 +#: wxUI/menus.py:40 +msgid "&Show direct message" +msgstr "&Mostrar mensaje directo" + +#: wxUI/menus.py:68 +msgid "&Show event" +msgstr "&Mostrar evento" + +#: wxUI/menus.py:78 +msgid "Direct &message" +msgstr "Mensaje &directo" + +#: wxUI/menus.py:80 wxUI/view.py:50 +msgid "&View lists" +msgstr "&Ver listas" + +#: wxUI/menus.py:83 wxUI/view.py:51 +msgid "Show user &profile" +msgstr "Ve&r perfil del usuario" + +#: wxUI/menus.py:85 +msgid "&Show user" +msgstr "&Mostrar usuario" + +#: wxUI/buffers/trends.py:20 wxUI/menus.py:97 +msgid "Search topic" +msgstr "Buscar tema" + +#: wxUI/menus.py:99 +msgid "&Tweet about this trend" +msgstr "&Tuitear sobre esta tendencia" + +#: wxUI/menus.py:101 +msgid "&Show item" +msgstr "&Ver tuit" + +#: wxUI/sysTrayIcon.py:36 wxUI/view.py:26 +msgid "&Global settings" +msgstr "Opciones &globales" + +#: wxUI/sysTrayIcon.py:37 wxUI/view.py:25 +msgid "Account se&ttings" +msgstr "Opciones de &cuenta" + +#: wxUI/sysTrayIcon.py:38 +msgid "Update &profile" +msgstr "Actualizar &perfil" + +#: wxUI/sysTrayIcon.py:39 +msgid "&Show / hide" +msgstr "&Mostrar / esconder" + +#: wxUI/sysTrayIcon.py:40 wxUI/view.py:75 +msgid "&Documentation" +msgstr "&Documentación" + +#: wxUI/sysTrayIcon.py:41 +msgid "Check for &updates" +msgstr "Comprobar &actualizaciones" + +#: wxUI/sysTrayIcon.py:42 +msgid "&Exit" +msgstr "&Salir" + +#: wxUI/view.py:18 +msgid "&Manage accounts" +msgstr "Gestionar &cuentas" + +#: wxUI/dialogs/update_profile.py:35 wxUI/view.py:19 +msgid "&Update profile" +msgstr "Actuali&zar perfil" + +#: wxUI/view.py:20 +msgid "&Hide window" +msgstr "Esconder &ventana" + +#: wxUI/dialogs/search.py:13 wxUI/view.py:21 +msgid "&Search" +msgstr "&Buscar" + +#: wxUI/view.py:22 +msgid "&Lists manager" +msgstr "Gestor de &listas" + +#: wxUI/view.py:23 +msgid "Manage user aliases" +msgstr "Gestionar alias de usuario" + +#: wxUI/view.py:24 +msgid "&Edit keystrokes" +msgstr "Editar combinaciones de &teclas" + +#: wxUI/view.py:27 +msgid "E&xit" +msgstr "S&alir" + +#: wxUI/view.py:31 wxUI/view.py:86 +msgid "&Tweet" +msgstr "&Tuit" + +#: wxUI/view.py:37 +msgid "View &address" +msgstr "Ver &dirección" + +#: wxUI/view.py:38 +msgid "View conversa&tion" +msgstr "Ver conversa&ción" + +#: wxUI/view.py:39 +msgid "Read text in picture" +msgstr "Leer texto en imágenes" + +#: wxUI/view.py:44 +msgid "&Actions..." +msgstr "&Acciones..." + +#: wxUI/view.py:45 +msgid "&View timeline..." +msgstr "&Ver línea temporal..." + +#: wxUI/view.py:46 +msgid "Direct me&ssage" +msgstr "&Mensaje directo" + +#: wxUI/view.py:47 +msgid "Add a&lias" +msgstr "Añadir alias" + +#: wxUI/view.py:48 +msgid "&Add to list" +msgstr "&Añadir a lista" + +#: wxUI/view.py:49 +msgid "R&emove from list" +msgstr "&Quitar de lista" + +#: wxUI/view.py:52 +msgid "V&iew likes" +msgstr "&Ver tuits marcados con me gusta" + +#: wxUI/view.py:56 +msgid "&Update buffer" +msgstr "&actualizar buffer" + +#: wxUI/view.py:57 +msgid "New &trending topics buffer..." +msgstr "Nuevo buffer de &tendencias..." + +#: wxUI/view.py:58 +msgid "Create a &filter" +msgstr "Crear &filtro" + +#: wxUI/view.py:59 +msgid "&Manage filters" +msgstr "Gestionar &filtros" + +#: wxUI/view.py:60 +msgid "Find a string in the currently focused buffer..." +msgstr "Buscar término en el buffer actual..." + +#: wxUI/view.py:61 +msgid "&Load previous items" +msgstr "&Cargar elementos anteriores" + +#: wxUI/dialogs/userActions.py:22 wxUI/view.py:63 +msgid "&Mute" +msgstr "S&ilenciar" + +#: wxUI/view.py:64 +msgid "&Autoread" +msgstr "&lectura automática" + +#: wxUI/view.py:65 +msgid "&Clear buffer" +msgstr "&Vaciar buffer" + +#: wxUI/view.py:66 +msgid "&Destroy" +msgstr "&Eliminar" + +#: wxUI/view.py:70 +msgid "&Seek back 5 seconds" +msgstr "&Retroceder 5 segundos" + +#: wxUI/view.py:71 +msgid "&Seek forward 5 seconds" +msgstr "A&vanzar 5 segundos" + +#: wxUI/view.py:76 +msgid "Sounds &tutorial" +msgstr "Tutorial de &sonidos" + +#: wxUI/view.py:77 +msgid "&What's new in this version?" +msgstr "¿&Qué hay de nuevo en esta versión?" + +#: wxUI/view.py:78 +msgid "&Check for updates" +msgstr "&Comprobar actualizaciones" + +#: wxUI/view.py:79 +msgid "&Report an error" +msgstr "&Reportar un error" + +#: wxUI/view.py:80 +msgid "{0}'s &website" +msgstr "Sitio &web de {0}" + +#: wxUI/view.py:81 +msgid "Get soundpacks for TWBlue" +msgstr "Obtener paquetes de sonidos para TWBlue" + +#: wxUI/view.py:82 +msgid "About &{0}" +msgstr "Sobre &{0}" + +#: wxUI/view.py:85 +msgid "&Application" +msgstr "&Aplicación" + +#: wxUI/dialogs/userActions.py:11 wxUI/view.py:87 +msgid "&User" +msgstr "&Usuario" + +#: wxUI/view.py:88 +msgid "&Buffer" +msgstr "&Buffer" + +#: wxUI/view.py:89 +msgid "&Audio" +msgstr "&Audio" + +#: wxUI/view.py:90 +msgid "&Help" +msgstr "Ay&uda" + +#: wxUI/view.py:176 +msgid "Address" +msgstr "Dirección" + +#: wxUI/view.py:207 +msgid "Your {0} version is up to date" +msgstr "Tu versión de {0} está actualizada" + +#: wxUI/view.py:207 +msgid "Update" +msgstr "Actualización" + +#: wxUI/buffers/base.py:12 wxUI/buffers/people.py:12 +#: wxUI/buffers/user_searches.py:11 wxUI/dialogs/userAliasDialogs.py:14 +#: wxUI/dialogs/userSelection.py:11 wxUI/dialogs/utils.py:32 +msgid "User" +msgstr "Usuario" + +#: wxUI/buffers/base.py:12 wxUI/dialogs/twitterDialogs/tweetDialogs.py:47 +msgid "Text" +msgstr "Texto" + +#: wxUI/buffers/base.py:12 wxUI/buffers/events.py:14 +msgid "Date" +msgstr "Fecha" + +#: wxUI/buffers/base.py:12 +msgid "Client" +msgstr "Cliente" + +#: wxUI/buffers/base.py:28 +msgid "Direct message" +msgstr "Mensaje directo" + +#: wxUI/buffers/events.py:14 +msgid "Event" +msgstr "Evento" + +#: wxUI/buffers/events.py:16 +msgid "Remove event" +msgstr "Eliminar evento" + +#: wxUI/buffers/panels.py:12 wxUI/buffers/panels.py:20 +msgid "Login" +msgstr "Iniciar sesión" + +#: wxUI/buffers/panels.py:14 +msgid "Log in automatically" +msgstr "Iniciar sesión automáticamente" + +#: wxUI/buffers/panels.py:22 +msgid "Logout" +msgstr "Cerrar sesión" + +#: wxUI/buffers/trends.py:9 +msgid "Trending topic" +msgstr "Tendencia" + +#: wxUI/buffers/trends.py:19 +msgid "Tweet about this trend" +msgstr "Tuitear sobre esta tendencia" + +#: wxUI/dialogs/configuration.py:15 msgid "Language" msgstr "Idioma" -#: ../src\wxUI\dialogs\configuration.py:22 +#: wxUI/dialogs/configuration.py:22 msgid "Run {0} at Windows startup" msgstr "Ejecutar {0} al iniciar Windows" -#: ../src\wxUI\dialogs\configuration.py:23 +#: wxUI/dialogs/configuration.py:23 msgid "ask before exiting {0}" msgstr "preguntar antes de salir de {0}" -#: ../src\wxUI\dialogs\configuration.py:26 +#: wxUI/dialogs/configuration.py:26 msgid "Disable Streaming functions" msgstr "Desactivar funciones en tiempo real" -#: ../src\wxUI\dialogs\configuration.py:29 +#: wxUI/dialogs/configuration.py:29 msgid "Buffer update interval, in minutes" msgstr "Intervalo de actualización de los buffers, en minutos" -#: ../src\wxUI\dialogs\configuration.py:35 +#: wxUI/dialogs/configuration.py:35 msgid "Play a sound when {0} launches" msgstr "Reproducir un sonido cuando inicia {0}" -#: ../src\wxUI\dialogs\configuration.py:37 +#: wxUI/dialogs/configuration.py:37 msgid "Speak a message when {0} launches" msgstr "Hablar un mensaje cuando {0} inicie" -#: ../src\wxUI\dialogs\configuration.py:39 +#: wxUI/dialogs/configuration.py:39 msgid "Use invisible interface's keyboard shortcuts while GUI is visible" msgstr "" "Usar los atajos de teclado de la interfaz invisible en la ventana gráfica" -#: ../src\wxUI\dialogs\configuration.py:41 +#: wxUI/dialogs/configuration.py:41 msgid "Activate Sapi5 when any other screen reader is not being run" msgstr "Activar Sapi5 cuando no hay ningún lector de pantalla ejecutándose" -#: ../src\wxUI\dialogs\configuration.py:43 +#: wxUI/dialogs/configuration.py:43 msgid "Hide GUI on launch" msgstr "Esconder interfaz gráfica al iniciar" -#: ../src\wxUI\dialogs\configuration.py:45 +#: wxUI/dialogs/configuration.py:45 msgid "Use Codeofdusk's longtweet handlers (may decrease client performance)" msgstr "" "Lectura completa de Tuits largos (puede disminuir el rendimiento del cliente)" -#: ../src\wxUI\dialogs\configuration.py:47 +#: wxUI/dialogs/configuration.py:47 msgid "Remember state for mention all and long tweet" msgstr "Recordar estado para casillas de mencionar a todos y tweet largos" -#: ../src\wxUI\dialogs\configuration.py:50 +#: wxUI/dialogs/configuration.py:50 msgid "Keymap" msgstr "Mapa de teclado" -#: ../src\wxUI\dialogs\configuration.py:55 +#: wxUI/dialogs/configuration.py:55 msgid "Check for updates when {0} launches" msgstr "Comprobar actualizaciones cuando {0} inicie" -#: ../src\wxUI\dialogs\configuration.py:65 +#: wxUI/dialogs/configuration.py:65 msgid "Proxy type: " msgstr "Tipo de proxy: " -#: ../src\wxUI\dialogs\configuration.py:72 +#: wxUI/dialogs/configuration.py:72 msgid "Proxy server: " msgstr "Servidor proxy: " -#: ../src\wxUI\dialogs\configuration.py:78 +#: wxUI/dialogs/configuration.py:78 msgid "Port: " msgstr "Puerto: " -#: ../src\wxUI\dialogs\configuration.py:84 +#: wxUI/dialogs/configuration.py:84 msgid "User: " msgstr "Usuario: " -#: ../src\wxUI\dialogs\configuration.py:90 +#: wxUI/dialogs/configuration.py:90 msgid "Password: " msgstr "Contraseña: " -#: ../src\wxUI\dialogs\configuration.py:102 +#: wxUI/dialogs/configuration.py:102 msgid "Autocompletion settings..." msgstr "Opciones de autocompletado de usuarios..." -#: ../src\wxUI\dialogs\configuration.py:104 +#: wxUI/dialogs/configuration.py:104 msgid "Relative timestamps" msgstr "Tiempos relativos" -#: ../src\wxUI\dialogs\configuration.py:107 +#: wxUI/dialogs/configuration.py:107 msgid "Items on each API call" msgstr "Elementos por cada llamada a la API" -#: ../src\wxUI\dialogs\configuration.py:113 +#: wxUI/dialogs/configuration.py:113 msgid "" "Inverted buffers: The newest tweets will be shown at the beginning while the " "oldest at the end" @@ -2503,15 +2801,15 @@ msgstr "" "Buffers invertidos: los nuevos tweets se mostrarán al principio de las " "listas y los viejos al final" -#: ../src\wxUI\dialogs\configuration.py:115 +#: wxUI/dialogs/configuration.py:115 msgid "Retweet mode" msgstr "Modo de retuit" -#: ../src\wxUI\dialogs\configuration.py:121 +#: wxUI/dialogs/configuration.py:121 msgid "Show screen names instead of full names" msgstr "Mostrar nombres de pantalla en lugar de nombres completos" -#: ../src\wxUI\dialogs\configuration.py:123 +#: wxUI/dialogs/configuration.py:123 msgid "" "Number of items per buffer to cache in database (0 to disable caching, blank " "for unlimited)" @@ -2520,7 +2818,7 @@ msgstr "" "blanco para guardarlos de forma ilimitada, 0 para desactivar la base de " "datos)" -#: ../src\wxUI\dialogs\configuration.py:127 +#: wxUI/dialogs/configuration.py:127 msgid "" "Load cache for tweets in memory (much faster in big datasets but requires " "more RAM)" @@ -2528,909 +2826,786 @@ msgstr "" "Cargar cache para Tweets en RAM (es más rápido para listas muy grandes de " "elementos, pero requiere más memoria)" -#: ../src\wxUI\dialogs\configuration.py:134 +#: wxUI/dialogs/configuration.py:134 msgid "Enable automatic speech feedback" msgstr "Activar mensajes automáticos hablados" -#: ../src\wxUI\dialogs\configuration.py:136 +#: wxUI/dialogs/configuration.py:136 msgid "Enable automatic Braille feedback" msgstr "Activar mensajes automáticos en Braille" -#: ../src\wxUI\dialogs\configuration.py:144 -msgid "Status" -msgstr "Estado" - -#: ../src\wxUI\dialogs\configuration.py:144 -#: ../src\wxUI\dialogs\filterDialogs.py:126 +#: wxUI/dialogs/configuration.py:144 wxUI/dialogs/filterDialogs.py:130 msgid "Buffer" msgstr "Buffer" -#: ../src\wxUI\dialogs\configuration.py:147 +#: wxUI/dialogs/configuration.py:144 +msgid "Status" +msgstr "Estado" + +#: wxUI/dialogs/configuration.py:147 msgid "Show/hide" msgstr "Mostrar/ocultar" -#: ../src\wxUI\dialogs\configuration.py:148 +#: wxUI/dialogs/configuration.py:148 msgid "Move up" msgstr "Mover arriba" -#: ../src\wxUI\dialogs\configuration.py:149 +#: wxUI/dialogs/configuration.py:149 msgid "Move down" msgstr "Mover abajo" -#: ../src\wxUI\dialogs\configuration.py:159 -#: ../src\wxUI\dialogs\configuration.py:224 -#: ../src\wxUI\dialogs\configuration.py:227 -#: ../src\wxUI\dialogs\configuration.py:232 +#: wxUI/dialogs/configuration.py:159 wxUI/dialogs/configuration.py:224 +#: wxUI/dialogs/configuration.py:227 wxUI/dialogs/configuration.py:232 msgid "Show" msgstr "Mostrar" -#: ../src\wxUI\dialogs\configuration.py:161 -#: ../src\wxUI\dialogs\configuration.py:171 -#: ../src\wxUI\dialogs\configuration.py:195 -#: ../src\wxUI\dialogs\configuration.py:225 +#: wxUI/dialogs/configuration.py:161 wxUI/dialogs/configuration.py:171 +#: wxUI/dialogs/configuration.py:195 wxUI/dialogs/configuration.py:225 msgid "Hide" msgstr "Ocultar" -#: ../src\wxUI\dialogs\configuration.py:169 -#: ../src\wxUI\dialogs\configuration.py:193 +#: wxUI/dialogs/configuration.py:169 wxUI/dialogs/configuration.py:193 msgid "Select a buffer first." msgstr "Primero selecciona un buffer." -#: ../src\wxUI\dialogs\configuration.py:172 -#: ../src\wxUI\dialogs\configuration.py:196 +#: wxUI/dialogs/configuration.py:172 wxUI/dialogs/configuration.py:196 msgid "The buffer is hidden, show it first." msgstr "El buffer está oculto, muéstralo primero." -#: ../src\wxUI\dialogs\configuration.py:175 +#: wxUI/dialogs/configuration.py:175 msgid "The buffer is already at the top of the list." msgstr "El buffer ya se encuentra al principio de la lista." -#: ../src\wxUI\dialogs\configuration.py:199 +#: wxUI/dialogs/configuration.py:199 msgid "The buffer is already at the bottom of the list." msgstr "El buffer ya se encuentra al final de la lista." -#: ../src\wxUI\dialogs\configuration.py:240 -#: ../src\wxUI\dialogs\configuration.py:381 +#: wxUI/dialogs/configuration.py:240 wxUI/dialogs/configuration.py:381 msgid "Ignored clients" msgstr "Clientes ignorados" -#: ../src\wxUI\dialogs\configuration.py:247 +#: wxUI/dialogs/configuration.py:247 msgid "Remove client" msgstr "Quitar cliente" -#: ../src\wxUI\dialogs\configuration.py:271 +#: wxUI/dialogs/configuration.py:271 msgid "Volume" msgstr "Volumen" -#: ../src\wxUI\dialogs\configuration.py:282 +#: wxUI/dialogs/configuration.py:282 msgid "Session mute" msgstr "Silencio de sesión" -#: ../src\wxUI\dialogs\configuration.py:284 +#: wxUI/dialogs/configuration.py:284 msgid "Output device" msgstr "Dispositivo de salida" -#: ../src\wxUI\dialogs\configuration.py:291 +#: wxUI/dialogs/configuration.py:291 msgid "Input device" msgstr "Dispositivo de entrada" -#: ../src\wxUI\dialogs\configuration.py:299 +#: wxUI/dialogs/configuration.py:299 msgid "Sound pack" msgstr "Paquete de sonidos" -#: ../src\wxUI\dialogs\configuration.py:305 +#: wxUI/dialogs/configuration.py:305 msgid "Indicate audio tweets with sound" msgstr "Reproducir sonido en tuits con audio" -#: ../src\wxUI\dialogs\configuration.py:307 +#: wxUI/dialogs/configuration.py:307 msgid "Indicate geotweets with sound" msgstr "Reproducir sonido en tuits con información geográfica" -#: ../src\wxUI\dialogs\configuration.py:309 +#: wxUI/dialogs/configuration.py:309 msgid "Indicate tweets containing images with sound" msgstr "Reproducir sonido en tuits con imágenes" -#: ../src\wxUI\dialogs\configuration.py:332 +#: wxUI/dialogs/configuration.py:332 msgid "Language for OCR" msgstr "Idioma para el OCR" -#: ../src\wxUI\dialogs\configuration.py:338 +#: wxUI/dialogs/configuration.py:338 msgid "API Key for SndUp" msgstr "Clave de api para SNDUp" -#: ../src\wxUI\dialogs\configuration.py:353 +#: wxUI/dialogs/configuration.py:353 msgid "{0} preferences" msgstr "Preferencias de {0}" -#: ../src\wxUI\dialogs\configuration.py:364 +#: wxUI/dialogs/configuration.py:364 msgid "Proxy" msgstr "Proxy" -#: ../src\wxUI\dialogs\configuration.py:373 +#: wxUI/dialogs/configuration.py:373 msgid "Feedback" msgstr "Retroalimentación" -#: ../src\wxUI\dialogs\configuration.py:377 +#: wxUI/dialogs/configuration.py:377 msgid "Buffers" msgstr "Buffers" -#: ../src\wxUI\dialogs\configuration.py:385 +#: wxUI/dialogs/configuration.py:385 msgid "Sound" msgstr "Sonido" -#: ../src\wxUI\dialogs\configuration.py:389 +#: wxUI/dialogs/configuration.py:389 msgid "Extras" msgstr "Extras" -#: ../src\wxUI\dialogs\configuration.py:394 +#: wxUI/dialogs/configuration.py:394 msgid "Save" msgstr "Guardar" -#: ../src\wxUI\dialogs\filterDialogs.py:16 +#: wxUI/dialogs/filterDialogs.py:13 msgid "Create a filter for this buffer" msgstr "Crear filtro para este buffer" -#: ../src\wxUI\dialogs\filterDialogs.py:17 +#: wxUI/dialogs/filterDialogs.py:14 msgid "Filter title" msgstr "Nombre del filtro" -#: ../src\wxUI\dialogs\filterDialogs.py:26 -#: ../src\wxUI\dialogs\filterDialogs.py:126 +#: wxUI/dialogs/filterDialogs.py:24 wxUI/dialogs/filterDialogs.py:130 msgid "Filter by word" msgstr "Filtrar por palabra" -#: ../src\wxUI\dialogs\filterDialogs.py:27 +#: wxUI/dialogs/filterDialogs.py:25 msgid "Ignore tweets wich contain the following word" msgstr "Ignorar tuits que contengan la siguiente palabra" -#: ../src\wxUI\dialogs\filterDialogs.py:28 +#: wxUI/dialogs/filterDialogs.py:26 msgid "Ignore tweets without the following word" msgstr "Ignorar tuits que no contengan la siguiente palabra" -#: ../src\wxUI\dialogs\filterDialogs.py:33 +#: wxUI/dialogs/filterDialogs.py:31 msgid "word" msgstr "palabra" -#: ../src\wxUI\dialogs\filterDialogs.py:38 +#: wxUI/dialogs/filterDialogs.py:36 msgid "Allow retweets" msgstr "Permitir retuits" -#: ../src\wxUI\dialogs\filterDialogs.py:39 +#: wxUI/dialogs/filterDialogs.py:37 msgid "Allow quoted tweets" msgstr "Permitir tweets citados" -#: ../src\wxUI\dialogs\filterDialogs.py:40 +#: wxUI/dialogs/filterDialogs.py:38 msgid "Allow replies" msgstr "Permitir respuestas" -#: ../src\wxUI\dialogs\filterDialogs.py:48 +#: wxUI/dialogs/filterDialogs.py:46 msgid "Use this term as a regular expression" msgstr "Usar término como expresión regular" -#: ../src\wxUI\dialogs\filterDialogs.py:50 -#: ../src\wxUI\dialogs\filterDialogs.py:126 +#: wxUI/dialogs/filterDialogs.py:48 wxUI/dialogs/filterDialogs.py:130 msgid "Filter by language" msgstr "Filtrar por idioma" -#: ../src\wxUI\dialogs\filterDialogs.py:51 +#: wxUI/dialogs/filterDialogs.py:49 msgid "Load tweets in the following languages" msgstr "Cargar tuits en los siguientes idiomas" -#: ../src\wxUI\dialogs\filterDialogs.py:52 +#: wxUI/dialogs/filterDialogs.py:50 msgid "Ignore tweets in the following languages" msgstr "Ignorar tuits en los siguientes idiomas" -#: ../src\wxUI\dialogs\filterDialogs.py:53 +#: wxUI/dialogs/filterDialogs.py:51 msgid "Don't filter by language" msgstr "No filtrar por idioma" -#: ../src\wxUI\dialogs\filterDialogs.py:64 +#: wxUI/dialogs/filterDialogs.py:62 msgid "Supported languages" msgstr "Idiomas soportados" -#: ../src\wxUI\dialogs\filterDialogs.py:69 +#: wxUI/dialogs/filterDialogs.py:67 msgid "Add selected language to filter" msgstr "Añadir idioma seleccionado al filtro" -#: ../src\wxUI\dialogs\filterDialogs.py:73 +#: wxUI/dialogs/filterDialogs.py:71 msgid "Selected languages" msgstr "Idiomas seleccionados" -#: ../src\wxUI\dialogs\filterDialogs.py:75 -#: ../src\wxUI\dialogs\filterDialogs.py:133 ../src\wxUI\dialogs\lists.py:21 -#: ../src\wxUI\dialogs\lists.py:132 ../src\wxUI\dialogs\userAliasDialogs.py:57 +#: wxUI/dialogs/filterDialogs.py:73 wxUI/dialogs/filterDialogs.py:137 +#: wxUI/dialogs/lists.py:21 wxUI/dialogs/lists.py:132 +#: wxUI/dialogs/userAliasDialogs.py:57 msgid "Remove" msgstr "Borrar" -#: ../src\wxUI\dialogs\filterDialogs.py:123 +#: wxUI/dialogs/filterDialogs.py:120 +msgid "You must define a name for the filter before creating it." +msgstr "Debes definir un título ppara el filtro antes de poder guardarlo." + +#: wxUI/dialogs/filterDialogs.py:120 +msgid "Missing filter name" +msgstr "Título del filtro faltante" + +#: wxUI/dialogs/filterDialogs.py:127 msgid "Manage filters" msgstr "Gestionar filtros" -#: ../src\wxUI\dialogs\filterDialogs.py:125 +#: wxUI/dialogs/filterDialogs.py:129 msgid "Filters" msgstr "Filtros" -#: ../src\wxUI\dialogs\filterDialogs.py:126 +#: wxUI/dialogs/filterDialogs.py:130 msgid "Filter" msgstr "Filtro" -#: ../src\wxUI\dialogs\find.py:13 +#: wxUI/dialogs/find.py:13 msgid "Find in current buffer" msgstr "Buscar en el buffer actual" -#: ../src\wxUI\dialogs\find.py:14 +#: wxUI/dialogs/find.py:14 msgid "String" msgstr "Término" -#: ../src\wxUI\dialogs\lists.py:11 +#: wxUI/dialogs/lists.py:11 msgid "Lists manager" msgstr "Gestor de listas" -#: ../src\wxUI\dialogs\lists.py:14 +#: wxUI/dialogs/lists.py:14 msgid "List" msgstr "Lista" -#: ../src\wxUI\dialogs\lists.py:14 -msgid "Members" -msgstr "Miembros" +#: wxUI/dialogs/lists.py:14 wxUI/dialogs/lists.py:70 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:37 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:126 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:173 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:257 +msgid "Description" +msgstr "Descripción" -#: ../src\wxUI\dialogs\lists.py:14 +#: wxUI/dialogs/lists.py:14 msgid "Owner" msgstr "Propietario" -#: ../src\wxUI\dialogs\lists.py:14 +#: wxUI/dialogs/lists.py:14 +msgid "Members" +msgstr "Miembros" + +#: wxUI/dialogs/lists.py:14 msgid "mode" msgstr "modo" -#: ../src\wxUI\dialogs\lists.py:19 ../src\wxUI\dialogs\lists.py:62 +#: wxUI/dialogs/lists.py:19 wxUI/dialogs/lists.py:62 msgid "Create a new list" msgstr "Crear nueva lista" -#: ../src\wxUI\dialogs\lists.py:22 +#: wxUI/dialogs/lists.py:22 msgid "Open in buffer" msgstr "Abrir en buffer" -#: ../src\wxUI\dialogs\lists.py:52 +#: wxUI/dialogs/lists.py:52 +#, python-format msgid "Viewing lists for %s" msgstr "Viendo las listas de %s" -#: ../src\wxUI\dialogs\lists.py:53 +#: wxUI/dialogs/lists.py:53 msgid "Subscribe" msgstr "Darte de alta" -#: ../src\wxUI\dialogs\lists.py:54 +#: wxUI/dialogs/lists.py:54 msgid "Unsubscribe" msgstr "Darse de baja" -#: ../src\wxUI\dialogs\lists.py:65 +#: wxUI/dialogs/lists.py:65 msgid "Name (20 characters maximun)" msgstr "Nombre (máximo 20 caracteres)" -#: ../src\wxUI\dialogs\lists.py:75 +#: wxUI/dialogs/lists.py:75 msgid "Mode" msgstr "Modo" -#: ../src\wxUI\dialogs\lists.py:76 +#: wxUI/dialogs/lists.py:76 msgid "Public" msgstr "Público" -#: ../src\wxUI\dialogs\lists.py:77 +#: wxUI/dialogs/lists.py:77 msgid "Private" msgstr "Privado" -#: ../src\wxUI\dialogs\lists.py:97 +#: wxUI/dialogs/lists.py:97 +#, python-format msgid "Editing the list %s" msgstr "Editando la lista %s" -#: ../src\wxUI\dialogs\lists.py:108 +#: wxUI/dialogs/lists.py:108 msgid "Select a list to add the user" msgstr "Selecciona una lista para añadir al usuario" -#: ../src\wxUI\dialogs\lists.py:109 +#: wxUI/dialogs/lists.py:109 msgid "Add" msgstr "Añadir" -#: ../src\wxUI\dialogs\lists.py:131 +#: wxUI/dialogs/lists.py:131 msgid "Select a list to remove the user" msgstr "Selecciona una lista para quitar al usuario" -#: ../src\wxUI\dialogs\lists.py:149 +#: wxUI/dialogs/lists.py:149 msgid "Do you really want to delete this list?" msgstr "¿Realmente deseas eliminar esta lista?" -#: ../src\wxUI\dialogs\message.py:73 ../src\wxUI\dialogs\message.py:254 -msgid "&Long tweet" -msgstr "Tuit &largo" - -#: ../src\wxUI\dialogs\message.py:74 ../src\wxUI\dialogs\message.py:133 -#: ../src\wxUI\dialogs\message.py:255 -msgid "&Upload image..." -msgstr "&Subir imagen..." - -#: ../src\wxUI\dialogs\message.py:75 ../src\wxUI\dialogs\message.py:134 -#: ../src\wxUI\dialogs\message.py:194 ../src\wxUI\dialogs\message.py:256 -#: ../src\wxUI\dialogs\message.py:359 ../src\wxUI\dialogs\message.py:435 -msgid "Check &spelling..." -msgstr "Revisar &ortografía..." - -#: ../src\wxUI\dialogs\message.py:76 ../src\wxUI\dialogs\message.py:135 -#: ../src\wxUI\dialogs\message.py:195 ../src\wxUI\dialogs\message.py:257 -msgid "&Attach audio..." -msgstr "&Adjuntar audio..." - -#: ../src\wxUI\dialogs\message.py:77 ../src\wxUI\dialogs\message.py:136 -#: ../src\wxUI\dialogs\message.py:196 ../src\wxUI\dialogs\message.py:258 -msgid "Sh&orten URL" -msgstr "Acortar &URL" - -#: ../src\wxUI\dialogs\message.py:78 ../src\wxUI\dialogs\message.py:137 -#: ../src\wxUI\dialogs\message.py:197 ../src\wxUI\dialogs\message.py:259 -#: ../src\wxUI\dialogs\message.py:360 ../src\wxUI\dialogs\message.py:436 -msgid "&Expand URL" -msgstr "&Expandir URL" - -#: ../src\wxUI\dialogs\message.py:81 ../src\wxUI\dialogs\message.py:140 -#: ../src\wxUI\dialogs\message.py:200 ../src\wxUI\dialogs\message.py:262 -#: ../src\wxUI\dialogs\message.py:362 ../src\wxUI\dialogs\message.py:438 -msgid "&Translate..." -msgstr "&Traducir..." - -#: ../src\wxUI\dialogs\message.py:82 ../src\wxUI\dialogs\message.py:141 -#: ../src\wxUI\dialogs\message.py:186 ../src\wxUI\dialogs\message.py:263 -msgid "Auto&complete users" -msgstr "Auto&completar usuarios" - -#: ../src\wxUI\dialogs\message.py:83 ../src\wxUI\dialogs\message.py:142 -#: ../src\wxUI\dialogs\message.py:201 ../src\wxUI\dialogs\message.py:264 -msgid "Sen&d" -msgstr "En&viar" - -#: ../src\wxUI\dialogs\message.py:85 ../src\wxUI\dialogs\message.py:144 -#: ../src\wxUI\dialogs\message.py:203 ../src\wxUI\dialogs\message.py:266 -#: ../src\wxUI\dialogs\message.py:363 ../src\wxUI\dialogs\message.py:439 -msgid "C&lose" -msgstr "Ce&rrar" - -#: ../src\wxUI\dialogs\message.py:184 -msgid "&Recipient" -msgstr "&Destinatario" - -#: ../src\wxUI\dialogs\message.py:245 -msgid "&Mention to all" -msgstr "&Mencionar a todos" - -#: ../src\wxUI\dialogs\message.py:299 -msgid "Tweet - %i characters " -msgstr "Tuit - %i caracteres " - -#: ../src\wxUI\dialogs\message.py:316 -msgid "Image description" -msgstr "Descripción de la imagen" - -#: ../src\wxUI\dialogs\message.py:327 -msgid "Retweets: " -msgstr "Retuits: " - -#: ../src\wxUI\dialogs\message.py:332 -msgid "Likes: " -msgstr "Me gusta: " - -#: ../src\wxUI\dialogs\message.py:337 -msgid "Source: " -msgstr "Desde: " - -#: ../src\wxUI\dialogs\message.py:342 ../src\wxUI\dialogs\message.py:423 -msgid "Date: " -msgstr "Fecha: " - -#: ../src\wxUI\dialogs\message.py:357 ../src\wxUI\dialogs\message.py:433 -msgid "Copy link to clipboard" -msgstr "Copiar enlace al portapapeles" - -#: ../src\wxUI\dialogs\message.py:408 -msgid "View" -msgstr "Ver" - -#: ../src\wxUI\dialogs\message.py:410 -msgid "Item" -msgstr "Elemento" - -#: ../src\wxUI\dialogs\search.py:12 +#: wxUI/dialogs/search.py:12 msgid "Search on Twitter" msgstr "Buscar en Twitter" -#: ../src\wxUI\dialogs\search.py:13 ../src\wxUI\view.py:21 -msgid "&Search" -msgstr "&Buscar" - -#: ../src\wxUI\dialogs\search.py:21 +#: wxUI/dialogs/search.py:21 msgid "Tweets" msgstr "Tuits" -#: ../src\wxUI\dialogs\search.py:22 ../src\wxUI\dialogs\userAliasDialogs.py:43 +#: wxUI/dialogs/search.py:22 wxUI/dialogs/userAliasDialogs.py:43 msgid "Users" msgstr "Usuarios" -#: ../src\wxUI\dialogs\search.py:29 +#: wxUI/dialogs/search.py:29 msgid "&Language for results: " msgstr "&Idioma para los resultados: " -#: ../src\wxUI\dialogs\search.py:31 ../src\wxUI\dialogs\search.py:55 +#: wxUI/dialogs/search.py:31 wxUI/dialogs/search.py:55 msgid "any" msgstr "cualquiera" -#: ../src\wxUI\dialogs\search.py:37 +#: wxUI/dialogs/search.py:37 msgid "Results &type: " msgstr "&Tipo de resultados: " -#: ../src\wxUI\dialogs\search.py:38 ../src\wxUI\dialogs\search.py:63 +#: wxUI/dialogs/search.py:38 wxUI/dialogs/search.py:63 msgid "Mixed" msgstr "Mixtos" -#: ../src\wxUI\dialogs\search.py:38 ../src\wxUI\dialogs\search.py:64 +#: wxUI/dialogs/search.py:38 wxUI/dialogs/search.py:64 msgid "Recent" msgstr "Recientes" -#: ../src\wxUI\dialogs\search.py:38 ../src\wxUI\dialogs\search.py:65 +#: wxUI/dialogs/search.py:38 wxUI/dialogs/search.py:65 msgid "Popular" msgstr "Populares" -#: ../src\wxUI\dialogs\search.py:43 ../src\wxUI\dialogs\trends.py:25 -#: ../src\wxUI\dialogs\userActions.py:41 -#: ../src\wxUI\dialogs\userSelection.py:33 +#: wxUI/dialogs/search.py:43 wxUI/dialogs/trends.py:25 +#: wxUI/dialogs/userActions.py:41 wxUI/dialogs/userSelection.py:33 msgid "&OK" msgstr "&Aceptar" -#: ../src\wxUI\dialogs\search.py:45 ../src\wxUI\dialogs\show_user.py:19 -#: ../src\wxUI\dialogs\trends.py:27 ../src\wxUI\dialogs\update_profile.py:37 -#: ../src\wxUI\dialogs\userActions.py:43 -#: ../src\wxUI\dialogs\userSelection.py:35 +#: wxUI/dialogs/search.py:45 wxUI/dialogs/show_user.py:19 +#: wxUI/dialogs/trends.py:27 wxUI/dialogs/update_profile.py:37 +#: wxUI/dialogs/userActions.py:43 wxUI/dialogs/userSelection.py:35 msgid "&Close" msgstr "Ce&rrar" -#: ../src\wxUI\dialogs\show_user.py:12 +#: wxUI/dialogs/show_user.py:12 msgid "Details" msgstr "Detalles" -#: ../src\wxUI\dialogs\show_user.py:17 +#: wxUI/dialogs/show_user.py:17 msgid "&Go to URL" msgstr "&Ir a URL" -#: ../src\wxUI\dialogs\trends.py:10 +#: wxUI/dialogs/trends.py:10 msgid "View trending topics" msgstr "Ver tendencias" -#: ../src\wxUI\dialogs\trends.py:11 +#: wxUI/dialogs/trends.py:11 msgid "Trending topics by" msgstr "Tendencias por" -#: ../src\wxUI\dialogs\trends.py:12 +#: wxUI/dialogs/trends.py:12 msgid "Country" msgstr "País" -#: ../src\wxUI\dialogs\trends.py:13 +#: wxUI/dialogs/trends.py:13 msgid "City" msgstr "Ciudad" -#: ../src\wxUI\dialogs\trends.py:19 ../src\wxUI\dialogs\update_profile.py:18 +#: wxUI/dialogs/trends.py:19 wxUI/dialogs/update_profile.py:18 msgid "&Location" msgstr "&Ubicación" -#: ../src\wxUI\dialogs\update_profile.py:10 +#: wxUI/dialogs/update_profile.py:10 msgid "Update your profile" msgstr "Actualizar tu perfil" -#: ../src\wxUI\dialogs\update_profile.py:12 +#: wxUI/dialogs/update_profile.py:12 msgid "&Name (50 characters maximum)" msgstr "&Nombre (máximo 50 caracteres)" -#: ../src\wxUI\dialogs\update_profile.py:23 +#: wxUI/dialogs/update_profile.py:23 msgid "&Website" msgstr "Sitio &web" -#: ../src\wxUI\dialogs\update_profile.py:28 +#: wxUI/dialogs/update_profile.py:28 msgid "&Bio (160 characters maximum)" msgstr "&Descripción (máximo 160 caracteres)" -#: ../src\wxUI\dialogs\update_profile.py:34 +#: wxUI/dialogs/update_profile.py:34 msgid "Upload a &picture" msgstr "Subir una &foto" -#: ../src\wxUI\dialogs\update_profile.py:35 ../src\wxUI\view.py:19 -msgid "&Update profile" -msgstr "Actuali&zar perfil" - -#: ../src\wxUI\dialogs\update_profile.py:77 +#: wxUI/dialogs/update_profile.py:77 msgid "Upload a picture" msgstr "Subir una foto" -#: ../src\wxUI\dialogs\update_profile.py:79 +#: wxUI/dialogs/update_profile.py:79 msgid "Discard image" msgstr "Descartar foto" -#: ../src\wxUI\dialogs\urlList.py:6 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:133 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:289 +#: wxUI/dialogs/update_profile.py:82 +msgid "Select the picture to be uploaded" +msgstr "Selecciona una foto para subir" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:133 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:289 +#: wxUI/dialogs/update_profile.py:82 +msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" +msgstr "Archivos de imagen (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" + +#: wxUI/dialogs/urlList.py:6 msgid "Select URL" msgstr "Selecciona la URL" -#: ../src\wxUI\dialogs\userActions.py:11 ../src\wxUI\view.py:87 -msgid "&User" -msgstr "&Usuario" - -#: ../src\wxUI\dialogs\userActions.py:14 -#: ../src\wxUI\dialogs\userAliasDialogs.py:13 -#: ../src\wxUI\dialogs\userSelection.py:14 ../src\wxUI\dialogs\utils.py:31 +#: wxUI/dialogs/userActions.py:14 wxUI/dialogs/userAliasDialogs.py:13 +#: wxUI/dialogs/userSelection.py:14 wxUI/dialogs/utils.py:31 msgid "&Autocomplete users" msgstr "&Autocompletar usuarios" -#: ../src\wxUI\dialogs\userActions.py:20 +#: wxUI/dialogs/userActions.py:20 msgid "&Follow" msgstr "&Seguir" -#: ../src\wxUI\dialogs\userActions.py:21 +#: wxUI/dialogs/userActions.py:21 msgid "U&nfollow" msgstr "&Dejar de seguir" -#: ../src\wxUI\dialogs\userActions.py:22 ../src\wxUI\view.py:63 -msgid "&Mute" -msgstr "S&ilenciar" - -#: ../src\wxUI\dialogs\userActions.py:23 +#: wxUI/dialogs/userActions.py:23 msgid "Unmu&te" msgstr "D&esactivar silencio" -#: ../src\wxUI\dialogs\userActions.py:24 +#: wxUI/dialogs/userActions.py:24 msgid "&Block" msgstr "&Bloquear" -#: ../src\wxUI\dialogs\userActions.py:25 +#: wxUI/dialogs/userActions.py:25 msgid "Unbl&ock" msgstr "Desb&loquear" -#: ../src\wxUI\dialogs\userActions.py:26 +#: wxUI/dialogs/userActions.py:26 msgid "&Report as spam" msgstr "&Reportar como spam" -#: ../src\wxUI\dialogs\userActions.py:27 +#: wxUI/dialogs/userActions.py:27 msgid "&Ignore tweets from this client" msgstr "&Ignorar tuits de este cliente" -#: ../src\wxUI\dialogs\userAliasDialogs.py:18 +#: wxUI/dialogs/userAliasDialogs.py:18 msgid "Alias" msgstr "Alias" -#: ../src\wxUI\dialogs\userAliasDialogs.py:41 +#: wxUI/dialogs/userAliasDialogs.py:41 msgid "Edit user aliases" msgstr "Editar alias de usuarios" -#: ../src\wxUI\dialogs\userAliasDialogs.py:48 +#: wxUI/dialogs/userAliasDialogs.py:48 msgid "Actions" msgstr "Acciones" -#: ../src\wxUI\dialogs\userAliasDialogs.py:50 +#: wxUI/dialogs/userAliasDialogs.py:50 msgid "Add alias" msgstr "Añadir alias" -#: ../src\wxUI\dialogs\userAliasDialogs.py:51 +#: wxUI/dialogs/userAliasDialogs.py:51 msgid "Adds a new user alias" msgstr "Añadir un nuevo alias" -#: ../src\wxUI\dialogs\userAliasDialogs.py:54 +#: wxUI/dialogs/userAliasDialogs.py:54 msgid "Edit the currently focused user Alias." msgstr "Editar alias del usuario seleccionado" -#: ../src\wxUI\dialogs\userAliasDialogs.py:58 +#: wxUI/dialogs/userAliasDialogs.py:58 msgid "Remove the currently focused user alias." msgstr "Eliminar alias del usuario seleccionado." -#: ../src\wxUI\dialogs\userAliasDialogs.py:82 +#: wxUI/dialogs/userAliasDialogs.py:82 msgid "Are you sure you want to delete this user alias?" msgstr "¿Estás seguro que deseas eliminar este alias de usuario?" -#: ../src\wxUI\dialogs\userAliasDialogs.py:82 +#: wxUI/dialogs/userAliasDialogs.py:82 msgid "Remove user alias" msgstr "Eliminar alias de usuario" -#: ../src\wxUI\dialogs\userAliasDialogs.py:93 +#: wxUI/dialogs/userAliasDialogs.py:93 msgid "User alias" msgstr "Alias de usuario" -#: ../src\wxUI\dialogs\userSelection.py:10 +#: wxUI/dialogs/userSelection.py:10 +#, python-format msgid "Timeline for %s" msgstr "Línea temporal de %s" -#: ../src\wxUI\dialogs\userSelection.py:19 +#: wxUI/dialogs/userSelection.py:19 msgid "Buffer type" msgstr "Tipo de buffer" -#: ../src\wxUI\dialogs\userSelection.py:20 +#: wxUI/dialogs/userSelection.py:20 msgid "&Tweets" msgstr "&Tuits" -#: ../src\wxUI\dialogs\userSelection.py:21 +#: wxUI/dialogs/userSelection.py:21 msgid "&Likes" msgstr "Tuits marcados como &me gusta" -#: ../src\wxUI\dialogs\userSelection.py:22 +#: wxUI/dialogs/userSelection.py:22 msgid "&Followers" msgstr "&Seguidores" -#: ../src\wxUI\dialogs\userSelection.py:23 +#: wxUI/dialogs/userSelection.py:23 msgid "F&riends" msgstr "&Amigos" -#: ../src\wxUI\menus.py:8 ../src\wxUI\view.py:33 -msgid "&Retweet" -msgstr "&Retuit" - -#: ../src\wxUI\menus.py:10 ../src\wxUI\menus.py:34 ../src\wxUI\view.py:32 -msgid "Re&ply" -msgstr "Res&ponder" - -#: ../src\wxUI\menus.py:12 ../src\wxUI\view.py:34 -msgid "&Like" -msgstr "Me &gusta" - -#: ../src\wxUI\menus.py:14 ../src\wxUI\view.py:35 -msgid "&Unlike" -msgstr "&Ya no me gusta" - -#: ../src\wxUI\menus.py:16 ../src\wxUI\menus.py:36 ../src\wxUI\menus.py:52 -msgid "&Open URL" -msgstr "&Abrir URL" - -#: ../src\wxUI\menus.py:18 ../src\wxUI\menus.py:54 ../src\wxUI\menus.py:87 -msgid "&Open in Twitter" -msgstr "&Abrir en Twitter" - -#: ../src\wxUI\menus.py:20 ../src\wxUI\menus.py:38 ../src\wxUI\menus.py:56 -msgid "&Play audio" -msgstr "&Reproducir audio" - -#: ../src\wxUI\menus.py:22 ../src\wxUI\menus.py:58 ../src\wxUI\view.py:36 -msgid "&Show tweet" -msgstr "&Ver tuit" - -#: ../src\wxUI\menus.py:24 ../src\wxUI\menus.py:42 ../src\wxUI\menus.py:60 -#: ../src\wxUI\menus.py:70 ../src\wxUI\menus.py:89 ../src\wxUI\menus.py:103 -msgid "&Copy to clipboard" -msgstr "&Copiar al portapapeles" - -#: ../src\wxUI\menus.py:26 ../src\wxUI\menus.py:44 ../src\wxUI\menus.py:62 -#: ../src\wxUI\menus.py:72 ../src\wxUI\view.py:40 -msgid "&Delete" -msgstr "&Eliminar" +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:32 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:48 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:168 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:252 +msgid "Attachments" +msgstr "Adjuntos" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:36 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:172 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:256 +msgid "Type" +msgstr "Tipo" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:39 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:175 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:259 +msgid "Delete attachment" +msgstr "Quitar archivo" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:44 +msgid "Added Tweets" +msgstr "Tuits añadidos" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:51 +msgid "Delete tweet" +msgstr "Quitar tuit" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:56 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:190 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:264 +msgid "A&dd..." +msgstr "Añadir..." + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:58 +msgid "Add t&weet" +msgstr "Añadir Tuit" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:61 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:192 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:266 +msgid "&Attach audio..." +msgstr "&Adjuntar audio..." + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:65 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:196 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:235 +msgid "Auto&complete users" +msgstr "Auto&completar usuarios" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:67 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:198 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:270 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:364 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:437 +msgid "Check &spelling..." +msgstr "Revisar &ortografía..." + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:69 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:200 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:272 +msgid "&Translate" +msgstr "&Traducir" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:73 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:204 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:276 +msgid "Sen&d" +msgstr "En&viar" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:117 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:218 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:296 +msgid "Image" +msgstr "Imagen" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:119 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:220 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:298 +msgid "Video" +msgstr "Vídeo" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:121 +msgid "Poll" +msgstr "Encuesta" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:126 +msgid "please provide a description" +msgstr "por favor proporciona una descripción" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:140 +msgid "Select the video to be uploaded" +msgstr "Selecciona un vídeo para subir" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:140 +msgid "Video files (*.mp4)|*.mp4" +msgstr "Archivos de video (*.mp4)|*.mp4" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:146 +msgid "" +"It is not possible to add more attachments. Please make sure your tweet " +"complies with Twitter'S attachment rules. You can add only one video or GIF " +"in every tweet, and a maximum of 4 photos." +msgstr "" +"No es posible añadir más archivos multimedia. Por favor asegúrate que " +"cumples con los requisitos de archivos de Twitter. Solo se puede añadir un " +"video o un GIF en cada tweet, o un máximo de hasta 4 imágenes." + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:146 +msgid "Error adding attachment" +msgstr "Error añadiendo un archivo" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:180 +msgid "&Mention to all" +msgstr "&Mencionar a todos" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:233 +msgid "&Recipient" +msgstr "&Destinatario" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:304 +#, python-format +msgid "Tweet - %i characters " +msgstr "Tuit - %i caracteres " + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:321 +msgid "Image description" +msgstr "Descripción de la imagen" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:332 +msgid "Retweets: " +msgstr "Retuits: " + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:337 +msgid "Likes: " +msgstr "Me gusta: " + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:342 +msgid "Source: " +msgstr "Desde: " + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:347 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:425 +msgid "Date: " +msgstr "Fecha: " + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:362 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:435 +msgid "Copy link to clipboard" +msgstr "Copiar enlace al portapapeles" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:365 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:440 +msgid "&Translate..." +msgstr "&Traducir..." + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:366 +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:441 +msgid "C&lose" +msgstr "Ce&rrar" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:410 +msgid "View" +msgstr "Ver" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:412 +msgid "Item" +msgstr "Elemento" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:438 +msgid "&Expand URL" +msgstr "&Expandir URL" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:477 +msgid "Add a poll" +msgstr "Añadir encuesta" + +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:481 +msgid "Participation time (in days)" +msgstr "Tiempo para participar (en días)" -#: ../src\wxUI\menus.py:28 ../src\wxUI\menus.py:46 ../src\wxUI\menus.py:91 -msgid "&User actions..." -msgstr "&Acciones de usuario..." +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:488 +msgid "Choices" +msgstr "Opciones" -#: ../src\wxUI\menus.py:40 -msgid "&Show direct message" -msgstr "&Mostrar mensaje directo" +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:492 +msgid "Option 1" +msgstr "Opción 1" -#: ../src\wxUI\menus.py:68 -msgid "&Show event" -msgstr "&Mostrar evento" +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:499 +msgid "Option 2" +msgstr "Opción 2" -#: ../src\wxUI\menus.py:78 -msgid "Direct &message" -msgstr "Mensaje &directo" +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:506 +msgid "Option 3" +msgstr "Opción 3" -#: ../src\wxUI\menus.py:80 ../src\wxUI\view.py:50 -msgid "&View lists" -msgstr "&Ver listas" +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:513 +msgid "Option 4" +msgstr "Opción 4" -#: ../src\wxUI\menus.py:83 ../src\wxUI\view.py:51 -msgid "Show user &profile" -msgstr "Ve&r perfil del usuario" +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:541 +msgid "Please make sure you have provided at least two options for the poll." +msgstr "" +"Por favor asegúrate de haber proporcionado, al menos, dos opciones para la " +"encuesta." -#: ../src\wxUI\menus.py:85 -msgid "&Show user" -msgstr "&Mostrar usuario" +#: wxUI/dialogs/twitterDialogs/tweetDialogs.py:541 +msgid "Not enough information" +msgstr "Información insuficiente" -#: ../src\wxUI\menus.py:99 -msgid "&Tweet about this trend" -msgstr "&Tuitear sobre esta tendencia" +#~ msgid "Photo" +#~ msgstr "Imagen" -#: ../src\wxUI\menus.py:101 -msgid "&Show item" -msgstr "&Ver tuit" +#~ msgid "There's no URL to be shortened" +#~ msgstr "No hay ninguna URL para acortar" -#: ../src\wxUI\sysTrayIcon.py:36 ../src\wxUI\view.py:26 -msgid "&Global settings" -msgstr "Opciones &globales" +#~ msgid "URL shortened" +#~ msgstr "URL Acortada" -#: ../src\wxUI\sysTrayIcon.py:37 ../src\wxUI\view.py:25 -msgid "Account se&ttings" -msgstr "Opciones de &cuenta" +#~ msgid "There's no URL to be expanded" +#~ msgstr "No hay ninguna URL para expandir" -#: ../src\wxUI\sysTrayIcon.py:38 -msgid "Update &profile" -msgstr "Actualizar &perfil" +#~ msgid "URL expanded" +#~ msgstr "URL expandida" -#: ../src\wxUI\sysTrayIcon.py:39 -msgid "&Show / hide" -msgstr "&Mostrar / esconder" +#~ msgid "%s - %s characters" +#~ msgstr "%s - %s caracteres" -#: ../src\wxUI\sysTrayIcon.py:40 ../src\wxUI\view.py:75 -msgid "&Documentation" -msgstr "&Documentación" +#~ msgid "Title" +#~ msgstr "Título" -#: ../src\wxUI\sysTrayIcon.py:41 -msgid "Check for &updates" -msgstr "Comprobar &actualizaciones" +#~ msgid "Add attachments" +#~ msgstr "Añadir adjuntos" -#: ../src\wxUI\sysTrayIcon.py:42 -msgid "&Exit" -msgstr "&Salir" +#~ msgid "&Photo" +#~ msgstr "&Foto" -#: ../src\wxUI\view.py:18 -msgid "&Manage accounts" -msgstr "Gestionar &cuentas" +#~ msgid "&Long tweet" +#~ msgstr "Tuit &largo" -#: ../src\wxUI\view.py:20 -msgid "&Hide window" -msgstr "Esconder &ventana" +#~ msgid "&Upload image..." +#~ msgstr "&Subir imagen..." -#: ../src\wxUI\view.py:22 -msgid "&Lists manager" -msgstr "Gestor de &listas" - -#: ../src\wxUI\view.py:23 -msgid "Manage user aliases" -msgstr "Gestionar alias de usuario" - -#: ../src\wxUI\view.py:24 -msgid "&Edit keystrokes" -msgstr "Editar combinaciones de &teclas" - -#: ../src\wxUI\view.py:27 -msgid "E&xit" -msgstr "S&alir" - -#: ../src\wxUI\view.py:31 ../src\wxUI\view.py:86 -msgid "&Tweet" -msgstr "&Tuit" - -#: ../src\wxUI\view.py:37 -msgid "View &address" -msgstr "Ver &dirección" - -#: ../src\wxUI\view.py:38 -msgid "View conversa&tion" -msgstr "Ver conversa&ción" - -#: ../src\wxUI\view.py:39 -msgid "Read text in picture" -msgstr "Leer texto en imágenes" - -#: ../src\wxUI\view.py:44 -msgid "&Actions..." -msgstr "&Acciones..." - -#: ../src\wxUI\view.py:45 -msgid "&View timeline..." -msgstr "&Ver línea temporal..." - -#: ../src\wxUI\view.py:46 -msgid "Direct me&ssage" -msgstr "&Mensaje directo" - -#: ../src\wxUI\view.py:47 -msgid "Add a&lias" -msgstr "Añadir alias" - -#: ../src\wxUI\view.py:48 -msgid "&Add to list" -msgstr "&Añadir a lista" - -#: ../src\wxUI\view.py:49 -msgid "R&emove from list" -msgstr "&Quitar de lista" - -#: ../src\wxUI\view.py:52 -msgid "V&iew likes" -msgstr "&Ver tuits marcados con me gusta" - -#: ../src\wxUI\view.py:56 -msgid "&Update buffer" -msgstr "&actualizar buffer" - -#: ../src\wxUI\view.py:57 -msgid "New &trending topics buffer..." -msgstr "Nuevo buffer de &tendencias..." - -#: ../src\wxUI\view.py:58 -msgid "Create a &filter" -msgstr "Crear &filtro" - -#: ../src\wxUI\view.py:59 -msgid "&Manage filters" -msgstr "Gestionar &filtros" - -#: ../src\wxUI\view.py:60 -msgid "Find a string in the currently focused buffer..." -msgstr "Buscar término en el buffer actual..." - -#: ../src\wxUI\view.py:61 -msgid "&Load previous items" -msgstr "&Cargar elementos anteriores" - -#: ../src\wxUI\view.py:64 -msgid "&Autoread" -msgstr "&lectura automática" - -#: ../src\wxUI\view.py:65 -msgid "&Clear buffer" -msgstr "&Vaciar buffer" - -#: ../src\wxUI\view.py:66 -msgid "&Destroy" -msgstr "&Eliminar" - -#: ../src\wxUI\view.py:70 -msgid "&Seek back 5 seconds" -msgstr "&Retroceder 5 segundos" - -#: ../src\wxUI\view.py:71 -msgid "&Seek forward 5 seconds" -msgstr "A&vanzar 5 segundos" - -#: ../src\wxUI\view.py:76 -msgid "Sounds &tutorial" -msgstr "Tutorial de &sonidos" - -#: ../src\wxUI\view.py:77 -msgid "&What's new in this version?" -msgstr "¿&Qué hay de nuevo en esta versión?" - -#: ../src\wxUI\view.py:78 -msgid "&Check for updates" -msgstr "&Comprobar actualizaciones" - -#: ../src\wxUI\view.py:79 -msgid "&Report an error" -msgstr "&Reportar un error" - -#: ../src\wxUI\view.py:80 -msgid "{0}'s &website" -msgstr "Sitio &web de {0}" - -#: ../src\wxUI\view.py:81 -msgid "Get soundpacks for TWBlue" -msgstr "Obtener paquetes de sonidos para TWBlue" - -#: ../src\wxUI\view.py:82 -msgid "About &{0}" -msgstr "Sobre &{0}" - -#: ../src\wxUI\view.py:85 -msgid "&Application" -msgstr "&Aplicación" - -#: ../src\wxUI\view.py:88 -msgid "&Buffer" -msgstr "&Buffer" - -#: ../src\wxUI\view.py:89 -msgid "&Audio" -msgstr "&Audio" - -#: ../src\wxUI\view.py:90 -msgid "&Help" -msgstr "Ay&uda" - -#: ../src\wxUI\view.py:176 -msgid "Address" -msgstr "Dirección" - -#: ../src\wxUI\view.py:207 -msgid "Update" -msgstr "Actualización" - -#: ../src\wxUI\view.py:207 -msgid "Your {0} version is up to date" -msgstr "Tu versión de {0} está actualizada" +#~ msgid "Sh&orten URL" +#~ msgstr "Acortar &URL" #~ msgid "Friends' Timelines" #~ msgstr "Líneas temporales de amigos" @@ -3682,9 +3857,6 @@ msgstr "Tu versión de {0} está actualizada" #~ msgid "GIF images" #~ msgstr "Imágenes GIF" -#~ msgid "PNG Images" -#~ msgstr "Imágenes PNG" - #~ msgid "Select an URL" #~ msgstr "Selecciona una URL" diff --git a/src/locales/fr/LC_MESSAGES/twblue.mo b/src/locales/fr/LC_MESSAGES/twblue.mo index c83284cf..456e437a 100644 Binary files a/src/locales/fr/LC_MESSAGES/twblue.mo and b/src/locales/fr/LC_MESSAGES/twblue.mo differ diff --git a/src/locales/fr/LC_MESSAGES/twblue.po b/src/locales/fr/LC_MESSAGES/twblue.po index cd6eb5be..82c2c0b9 100644 --- a/src/locales/fr/LC_MESSAGES/twblue.po +++ b/src/locales/fr/LC_MESSAGES/twblue.po @@ -1,80 +1,76 @@ msgid "" msgstr "" "Project-Id-Version: TW Blue 0.94\n" -"POT-Creation-Date: 2021-10-28 12:29+Paris, Madrid (heure d’été)\n" -"PO-Revision-Date: 2021-10-28 18:29+0200\n" -"Last-Translator: Oreonan \n" -"Language-Team: Oreonan \n" +"POT-Creation-Date: 2022-01-26 18:25+0100\n" +"PO-Revision-Date: 2022-01-26 18:26+0100\n" +"Last-Translator: Corentin Bacqué-Cazenave \n" +"Language-Team: Corentin Bacqué-Cazenave \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.0\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.0.1\n" "X-Poedit-KeywordsList: _;gettext;gettext_noop\n" "X-Poedit-Basepath: .\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-Bookmarks: -1,-1,-1,-1,-1,384,-1,-1,-1,-1\n" -#: ../src\controller\attach.py:25 -msgid "Photo" -msgstr "Photo" - #: ../src\controller\buffers\base\base.py:91 msgid "This action is not supported for this buffer" msgstr "Cette action n'est pas supportée pour ce tampon" #: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:337 ../src\controller\settings.py:286 +#: ../src\controller\mainController.py:338 ../src\controller\settings.py:323 msgid "Home" msgstr "Accueil" #: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:339 ../src\controller\settings.py:287 +#: ../src\controller\mainController.py:340 ../src\controller\settings.py:324 msgid "Mentions" msgstr "Mentions" #: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:341 +#: ../src\controller\mainController.py:342 msgid "Direct messages" -msgstr "Messages privés" +msgstr "Messages" #: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:343 ../src\controller\settings.py:289 +#: ../src\controller\mainController.py:344 ../src\controller\settings.py:326 msgid "Sent direct messages" -msgstr "Messages privés envoyés" +msgstr "Messages envoyés" #: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:345 ../src\controller\settings.py:290 +#: ../src\controller\mainController.py:346 ../src\controller\settings.py:327 msgid "Sent tweets" msgstr "Tweets envoyés" #: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:347 -#: ../src\controller\mainController.py:1390 ../src\controller\settings.py:291 +#: ../src\controller\mainController.py:348 +#: ../src\controller\mainController.py:1391 ../src\controller\settings.py:328 msgid "Likes" msgstr "Favoris" #: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:349 -#: ../src\controller\mainController.py:1395 ../src\controller\settings.py:292 +#: ../src\controller\mainController.py:350 +#: ../src\controller\mainController.py:1396 ../src\controller\settings.py:329 msgid "Followers" msgstr "Abonnés" #: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:353 -#: ../src\controller\mainController.py:1405 ../src\controller\settings.py:294 +#: ../src\controller\mainController.py:354 +#: ../src\controller\mainController.py:1406 ../src\controller\settings.py:331 msgid "Blocked users" msgstr "Utilisateurs bloqués" #: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:355 -#: ../src\controller\mainController.py:1410 ../src\controller\settings.py:295 +#: ../src\controller\mainController.py:356 +#: ../src\controller\mainController.py:1411 ../src\controller\settings.py:332 msgid "Muted users" msgstr "Utilisateurs masqués" #: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:1400 ../src\controller\settings.py:293 +#: ../src\controller\mainController.py:1401 ../src\controller\settings.py:330 msgid "Friends" msgstr "Abonnements" @@ -98,194 +94,202 @@ msgstr "Abonnements de {username}" msgid "Unknown buffer" msgstr "Tampon inconnu" -#: ../src\controller\buffers\twitter\base.py:88 -#: ../src\controller\buffers\twitter\trends.py:121 -#: ../src\controller\messages.py:214 ../src\wxUI\buffers\base.py:25 +#: ../src\controller\buffers\twitter\base.py:87 +#: ../src\controller\buffers\twitter\trends.py:43 +#: ../src\controller\buffers\twitter\trends.py:134 +#: ../src\controller\messages.py:296 ../src\wxUI\buffers\base.py:25 #: ../src\wxUI\buffers\events.py:15 ../src\wxUI\buffers\trends.py:18 -#: ../src\wxUI\dialogs\message.py:304 ../src\wxUI\sysTrayIcon.py:35 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:309 +#: ../src\wxUI\sysTrayIcon.py:35 msgid "Tweet" msgstr "Tweet" -#: ../src\controller\buffers\twitter\base.py:89 -#: ../src\controller\buffers\twitter\trends.py:122 +#: ../src\controller\buffers\twitter\base.py:88 +#: ../src\controller\buffers\twitter\trends.py:44 +#: ../src\controller\buffers\twitter\trends.py:135 msgid "Write the tweet here" msgstr "Écrivez le tweet ici" -#: ../src\controller\buffers\twitter\base.py:219 +#: ../src\controller\buffers\twitter\base.py:194 msgid "New tweet in {0}" msgstr "Nouveau tweet dans {0}" -#: ../src\controller\buffers\twitter\base.py:222 +#: ../src\controller\buffers\twitter\base.py:197 msgid "{0} new tweets in {1}." msgstr "{0} nouveau tweet dans {1}" -#: ../src\controller\buffers\twitter\base.py:261 -#: ../src\controller\buffers\twitter\directMessages.py:87 -#: ../src\controller\buffers\twitter\people.py:180 +#: ../src\controller\buffers\twitter\base.py:236 +#: ../src\controller\buffers\twitter\directMessages.py:88 +#: ../src\controller\buffers\twitter\people.py:177 msgid "%s items retrieved" msgstr "%s éléments récupérés" -#: ../src\controller\buffers\twitter\base.py:293 +#: ../src\controller\buffers\twitter\base.py:268 #: ../src\controller\buffers\twitter\people.py:80 msgid "This buffer is not a timeline; it can't be deleted." msgstr "Ce tampon n'est pas une chronologie ; Impossible de le supprimé." -#: ../src\controller\buffers\twitter\base.py:430 +#: ../src\controller\buffers\twitter\base.py:410 msgid "Reply to {arg0}" msgstr "Répondre à {arg0}" -#: ../src\controller\buffers\twitter\base.py:432 +#: ../src\controller\buffers\twitter\base.py:412 #: ../src\keystrokeEditor\constants.py:11 ../src\wxUI\buffers\base.py:27 msgid "Reply" msgstr "Répondre" -#: ../src\controller\buffers\twitter\base.py:433 +#: ../src\controller\buffers\twitter\base.py:413 msgid "Reply to %s" msgstr "Répondre à %s" -#: ../src\controller\buffers\twitter\base.py:480 -#: ../src\controller\buffers\twitter\directMessages.py:129 +#: ../src\controller\buffers\twitter\base.py:436 +#: ../src\controller\buffers\twitter\directMessages.py:124 msgid "New direct message" -msgstr "Nouveau message privé" +msgstr "Nouveau message" -#: ../src\controller\buffers\twitter\base.py:480 -#: ../src\controller\messages.py:200 +#: ../src\controller\buffers\twitter\base.py:436 +#: ../src\controller\messages.py:268 msgid "Direct message to %s" -msgstr "Message privé à %s" +msgstr "Message à %s" -#: ../src\controller\buffers\twitter\base.py:520 +#: ../src\controller\buffers\twitter\base.py:452 +msgid "This action is not supported on protected accounts." +msgstr "Cette action n'est pas supportée pour les comptes protégés." + +#: ../src\controller\buffers\twitter\base.py:469 msgid "Add your comment to the tweet" msgstr "Ajoutez votre commentaire pour le tweet" -#: ../src\controller\buffers\twitter\base.py:520 +#: ../src\controller\buffers\twitter\base.py:469 msgid "Quote" msgstr "Citer" -#: ../src\controller\buffers\twitter\base.py:596 +#: ../src\controller\buffers\twitter\base.py:533 msgid "Opening URL..." msgstr "Ouverture de l'URL..." -#: ../src\controller\buffers\twitter\base.py:633 +#: ../src\controller\buffers\twitter\base.py:570 msgid "User details" msgstr "Détails de l'utilisateur" -#: ../src\controller\buffers\twitter\base.py:654 +#: ../src\controller\buffers\twitter\base.py:591 msgid "Opening item in web browser..." msgstr "Ouverture de l'élément dans le navigateur Web..." -#: ../src\controller\buffers\twitter\directMessages.py:92 -#: ../src\controller\buffers\twitter\people.py:95 +#: ../src\controller\buffers\twitter\directMessages.py:93 +#: ../src\controller\buffers\twitter\people.py:98 msgid "Mention to %s" msgstr "Mention pour %s" -#: ../src\controller\buffers\twitter\directMessages.py:92 -#: ../src\controller\buffers\twitter\people.py:95 +#: ../src\controller\buffers\twitter\directMessages.py:93 +#: ../src\controller\buffers\twitter\people.py:98 #: ../src\wxUI\buffers\people.py:17 msgid "Mention" msgstr "Mention" -#: ../src\controller\buffers\twitter\directMessages.py:132 +#: ../src\controller\buffers\twitter\directMessages.py:127 msgid "{0} new direct messages." -msgstr "{0} nouveau message privé" +msgstr "{0} nouveau message" -#: ../src\controller\buffers\twitter\directMessages.py:135 +#: ../src\controller\buffers\twitter\directMessages.py:130 msgid "This action is not supported in the buffer yet." msgstr "Cette action n'est pas supportée dans le tampon actuel" -#: ../src\controller\buffers\twitter\directMessages.py:145 +#: ../src\controller\buffers\twitter\directMessages.py:146 msgid "" "Getting more items cannot be done in this buffer. Use the direct messages " "buffer instead." msgstr "" "Récupérer plus d'élément est impossible dans ce tampon, utilisez le tampon " -"des messages privés à la place." +"des messages à la place." -#: ../src\controller\buffers\twitter\people.py:253 +#: ../src\controller\buffers\twitter\people.py:250 msgid "{0} new followers." msgstr "{0} nouvel abonné" -#: ../src\controller\buffers\twitter\trends.py:145 +#: ../src\controller\buffers\twitter\trends.py:150 msgid "This action is not supported in the buffer, yet." msgstr "Cette action n'est pas supportée pour le tampon actuel" -#: ../src\controller\mainController.py:277 +#: ../src\controller\mainController.py:278 msgid "Ready" msgstr "Prêt" -#: ../src\controller\mainController.py:351 +#: ../src\controller\mainController.py:352 msgid "Following" msgstr "Abonnements" -#: ../src\controller\mainController.py:356 +#: ../src\controller\mainController.py:357 msgid "Timelines" msgstr "Chronologies" -#: ../src\controller\mainController.py:359 -#: ../src\controller\mainController.py:883 -#: ../src\controller\mainController.py:1585 +#: ../src\controller\mainController.py:360 +#: ../src\controller\mainController.py:884 +#: ../src\controller\mainController.py:1583 msgid "Timeline for {}" msgstr "Chronologie de {}" -#: ../src\controller\mainController.py:360 +#: ../src\controller\mainController.py:361 msgid "Likes timelines" msgstr "Chronologies des favoris" -#: ../src\controller\mainController.py:363 -#: ../src\controller\mainController.py:902 -#: ../src\controller\mainController.py:1587 +#: ../src\controller\mainController.py:364 +#: ../src\controller\mainController.py:903 +#: ../src\controller\mainController.py:1585 msgid "Likes for {}" msgstr "Favoris de {}" -#: ../src\controller\mainController.py:364 +#: ../src\controller\mainController.py:365 msgid "Followers timelines" msgstr "Chronologies des abonnés" -#: ../src\controller\mainController.py:367 -#: ../src\controller\mainController.py:921 -#: ../src\controller\mainController.py:1589 +#: ../src\controller\mainController.py:368 +#: ../src\controller\mainController.py:922 +#: ../src\controller\mainController.py:1587 msgid "Followers for {}" msgstr "Abonnés de {}" -#: ../src\controller\mainController.py:368 +#: ../src\controller\mainController.py:369 msgid "Following timelines" msgstr "Chronologies des abonnements" -#: ../src\controller\mainController.py:371 -#: ../src\controller\mainController.py:940 -#: ../src\controller\mainController.py:1591 +#: ../src\controller\mainController.py:372 +#: ../src\controller\mainController.py:941 +#: ../src\controller\mainController.py:1589 msgid "Friends for {}" msgstr "Abonnements de {}" -#: ../src\controller\mainController.py:372 ../src\wxUI\dialogs\lists.py:13 +#: ../src\controller\mainController.py:373 ../src\wxUI\dialogs\lists.py:13 msgid "Lists" msgstr "Listes" -#: ../src\controller\mainController.py:375 -#: ../src\controller\mainController.py:1422 +#: ../src\controller\mainController.py:376 +#: ../src\controller\mainController.py:1423 msgid "List for {}" msgstr "Liste {}" -#: ../src\controller\mainController.py:376 +#: ../src\controller\mainController.py:377 msgid "Searches" msgstr "Recherches" -#: ../src\controller\mainController.py:379 -#: ../src\controller\mainController.py:426 -#: ../src\controller\mainController.py:431 +#: ../src\controller\mainController.py:380 +#: ../src\controller\mainController.py:427 +#: ../src\controller\mainController.py:432 msgid "Search for {}" msgstr "Recherche de {}" -#: ../src\controller\mainController.py:381 -#: ../src\controller\mainController.py:982 +#: ../src\controller\mainController.py:382 +#: ../src\controller\mainController.py:983 +#: ../src\controller\mainController.py:1591 msgid "Trending topics for %s" msgstr "Tendances pour %s" -#: ../src\controller\mainController.py:448 -#: ../src\controller\mainController.py:464 -#: ../src\controller\mainController.py:1080 -#: ../src\controller\mainController.py:1099 -#: ../src\controller\mainController.py:1118 -#: ../src\controller\mainController.py:1137 +#: ../src\controller\mainController.py:449 +#: ../src\controller\mainController.py:465 +#: ../src\controller\mainController.py:1081 +#: ../src\controller\mainController.py:1100 +#: ../src\controller\mainController.py:1119 +#: ../src\controller\mainController.py:1138 msgid "" "No session is currently in focus. Focus a session with the next or previous " "session shortcut." @@ -293,135 +297,135 @@ msgstr "" "Aucune session n'a actuellement le focus. Sélectionnez-en une avec le " "raccourci pour la session précédente ou suivante." -#: ../src\controller\mainController.py:452 +#: ../src\controller\mainController.py:453 msgid "Empty buffer." msgstr "Tampon vide." -#: ../src\controller\mainController.py:459 +#: ../src\controller\mainController.py:460 msgid "{0} not found." msgstr "{0} introuvable." -#: ../src\controller\mainController.py:469 +#: ../src\controller\mainController.py:470 msgid "Filters cannot be applied on this buffer" msgstr "Les filtres ne peuvent pas s'appliquer à ce tampon" -#: ../src\controller\mainController.py:522 -#: ../src\controller\mainController.py:539 -#: ../src\controller\mainController.py:568 +#: ../src\controller\mainController.py:523 +#: ../src\controller\mainController.py:540 +#: ../src\controller\mainController.py:569 msgid "Select the user" msgstr "Sélectionnez l'utilisateur" -#: ../src\controller\mainController.py:753 +#: ../src\controller\mainController.py:754 msgid "Add an user alias" msgstr "Ajoute un alias pour l'utilisateur" -#: ../src\controller\mainController.py:761 +#: ../src\controller\mainController.py:762 msgid "Alias has been set correctly for {}." msgstr "L'alias pour {} a correctement été définie" -#: ../src\controller\mainController.py:829 ../src\controller\messages.py:245 +#: ../src\controller\mainController.py:830 ../src\controller\messages.py:327 msgid "MMM D, YYYY. H:m" msgstr "D MMM YYYY à H:m" -#: ../src\controller\mainController.py:957 +#: ../src\controller\mainController.py:958 msgid "Conversation with {0}" msgstr "Conversation avec {0}" -#: ../src\controller\mainController.py:998 -#: ../src\controller\mainController.py:1015 +#: ../src\controller\mainController.py:999 +#: ../src\controller\mainController.py:1016 msgid "There are no coordinates in this tweet" msgstr "Il n'y a aucune coordonnée dans ce tweet" -#: ../src\controller\mainController.py:1000 -#: ../src\controller\mainController.py:1019 +#: ../src\controller\mainController.py:1001 +#: ../src\controller\mainController.py:1020 msgid "Error decoding coordinates. Try again later." msgstr "Erreur pendant le décodage des coordonnées. Réessayez plus tard." -#: ../src\controller\mainController.py:1004 +#: ../src\controller\mainController.py:1005 msgid "Unable to find address in OpenStreetMap." msgstr "Impossible de trouver l'adresse dans OpenStreetMap" -#: ../src\controller\mainController.py:1017 +#: ../src\controller\mainController.py:1018 msgid "There are no results for the coordinates in this tweet" msgstr "Il n'y a aucun résultat pour les coordonnées dans ce tweet" -#: ../src\controller\mainController.py:1128 -#: ../src\controller\mainController.py:1147 +#: ../src\controller\mainController.py:1129 +#: ../src\controller\mainController.py:1148 msgid "%s, %s of %s" msgstr "%s, %s de %s" -#: ../src\controller\mainController.py:1130 -#: ../src\controller\mainController.py:1149 -#: ../src\controller\mainController.py:1174 -#: ../src\controller\mainController.py:1199 +#: ../src\controller\mainController.py:1131 +#: ../src\controller\mainController.py:1150 +#: ../src\controller\mainController.py:1175 +#: ../src\controller\mainController.py:1200 msgid "%s. Empty" msgstr "%s. Vide" -#: ../src\controller\mainController.py:1162 -#: ../src\controller\mainController.py:1166 -#: ../src\controller\mainController.py:1187 +#: ../src\controller\mainController.py:1163 +#: ../src\controller\mainController.py:1167 +#: ../src\controller\mainController.py:1188 msgid "{0}: This account is not logged into Twitter." msgstr "{0}: Ce compte n'est pas connecté à twitter." -#: ../src\controller\mainController.py:1172 -#: ../src\controller\mainController.py:1197 +#: ../src\controller\mainController.py:1173 +#: ../src\controller\mainController.py:1198 msgid "%s. %s, %s of %s" msgstr "%s. %s, %s de %s" -#: ../src\controller\mainController.py:1191 +#: ../src\controller\mainController.py:1192 msgid "{0}: This account is not logged into twitter." msgstr "{0}: Ce compte n'est pas connecté à twitter." -#: ../src\controller\mainController.py:1416 +#: ../src\controller\mainController.py:1417 msgid "This list is already opened" msgstr "Cette liste est déjà ouverte" -#: ../src\controller\mainController.py:1446 -#: ../src\controller\mainController.py:1462 +#: ../src\controller\mainController.py:1447 +#: ../src\controller\mainController.py:1463 msgid "" "An error happened while trying to connect to the server. Please try later." msgstr "" "Une erreur s'est produite en essayant de se connecter au serveur. Veuillez " "réessayer plus tard." -#: ../src\controller\mainController.py:1498 +#: ../src\controller\mainController.py:1499 msgid "The auto-reading of new tweets is enabled for this buffer" msgstr "La lecture automatique des nouveaux tweets est activée pour ce tampon" -#: ../src\controller\mainController.py:1501 +#: ../src\controller\mainController.py:1502 msgid "The auto-reading of new tweets is disabled for this buffer" msgstr "" "La lecture automatique des nouveaux tweets est désactivée pour ce tampon" -#: ../src\controller\mainController.py:1508 +#: ../src\controller\mainController.py:1509 msgid "Session mute on" msgstr "Session muet" -#: ../src\controller\mainController.py:1511 +#: ../src\controller\mainController.py:1512 msgid "Session mute off" msgstr "Session non muet" -#: ../src\controller\mainController.py:1519 +#: ../src\controller\mainController.py:1520 msgid "Buffer mute on" msgstr "Tampon muet" -#: ../src\controller\mainController.py:1522 +#: ../src\controller\mainController.py:1523 msgid "Buffer mute off" msgstr "Tampon non muet" -#: ../src\controller\mainController.py:1545 +#: ../src\controller\mainController.py:1543 msgid "Copied" msgstr "Copié" -#: ../src\controller\mainController.py:1575 +#: ../src\controller\mainController.py:1573 msgid "Unable to update this buffer." msgstr "Impossible de mettre à jour ce tampon." -#: ../src\controller\mainController.py:1578 +#: ../src\controller\mainController.py:1576 msgid "Updating buffer..." msgstr "Actualisation..." -#: ../src\controller\mainController.py:1581 +#: ../src\controller\mainController.py:1579 msgid "{0} items retrieved" msgstr "{0} éléments récupérés" @@ -442,87 +446,83 @@ msgstr "Sélectionner la photo" msgid "Unable to extract text" msgstr "Impossible d'extraire le texte" -#: ../src\controller\messages.py:56 +#: ../src\controller\messages.py:49 msgid "Translated" msgstr "Traduit" -#: ../src\controller\messages.py:63 -msgid "There's no URL to be shortened" -msgstr "Aucune URL à réduire" - -#: ../src\controller\messages.py:67 ../src\controller\messages.py:75 -msgid "URL shortened" -msgstr "URL réduite" - -#: ../src\controller\messages.py:82 -msgid "There's no URL to be expanded" -msgstr "Aucune URL à élargir" - -#: ../src\controller\messages.py:86 ../src\controller\messages.py:94 -msgid "URL expanded" -msgstr "URL élargi" - -#: ../src\controller\messages.py:108 +#: ../src\controller\messages.py:56 msgid "%s - %s of %d characters" msgstr "%s - %s/%d caractères" -#: ../src\controller\messages.py:112 -msgid "%s - %s characters" -msgstr "%s - %s caractères" - -#: ../src\controller\messages.py:272 +#: ../src\controller\messages.py:354 msgid "View item" msgstr "Voir l'élément" -#: ../src\controller\messages.py:301 +#: ../src\controller\messages.py:380 msgid "Link copied to clipboard." msgstr "Lien copié dans le Presse-papiers" -#: ../src\controller\settings.py:74 +#: ../src\controller\settings.py:76 msgid "HTTP" msgstr "HTTP" -#: ../src\controller\settings.py:74 +#: ../src\controller\settings.py:76 msgid "SOCKS v4" msgstr "SOCKS v4" -#: ../src\controller\settings.py:74 +#: ../src\controller\settings.py:76 msgid "SOCKS v4 with DNS support" msgstr "SOCKS v4 avec support DNS" -#: ../src\controller\settings.py:74 +#: ../src\controller\settings.py:76 msgid "SOCKS v5" msgstr "SOCKS v5" -#: ../src\controller\settings.py:74 +#: ../src\controller\settings.py:76 msgid "SOCKS v5 with DNS support" msgstr "SOCKS v5 avec support DNS" -#: ../src\controller\settings.py:74 +#: ../src\controller\settings.py:76 msgid "System default" msgstr "Système par défaut" -#: ../src\controller\settings.py:145 ../src\controller\settings.py:211 +#: ../src\controller\settings.py:152 ../src\controller\settings.py:265 #: ../src\wxUI\dialogs\configuration.py:116 msgid "Ask" msgstr "Demander" -#: ../src\controller\settings.py:147 ../src\controller\settings.py:213 +#: ../src\controller\settings.py:154 ../src\controller\settings.py:267 #: ../src\wxUI\dialogs\configuration.py:116 msgid "Retweet without comments" msgstr "Retweet sans commentaires" -#: ../src\controller\settings.py:149 ../src\wxUI\dialogs\configuration.py:116 +#: ../src\controller\settings.py:156 ../src\wxUI\dialogs\configuration.py:116 msgid "Retweet with comments" msgstr "Retweet avec commentaires" -#: ../src\controller\settings.py:185 +#: ../src\controller\settings.py:200 msgid "Account settings for %s" msgstr "Paramètres du compte de %s" -#: ../src\controller\settings.py:288 +#: ../src\controller\settings.py:210 ../src\wxUI\dialogs\configuration.py:240 +msgid "Edit template for tweets. Current template: {}" +msgstr "Éditer le modèle des tweets. Modèle actuel : {}" + +#: ../src\controller\settings.py:219 ../src\wxUI\dialogs\configuration.py:242 +msgid "Edit template for direct messages. Current template: {}" +msgstr "Éditer le modèle pour les messages. Modèle actuel : {}" + +#: ../src\controller\settings.py:228 ../src\wxUI\dialogs\configuration.py:244 +msgid "Edit template for sent direct messages. Current template: {}" +msgstr "Éditer le modèle des messages envoyés. Modèle actuel : {}" + +#: ../src\controller\settings.py:237 ../src\wxUI\dialogs\configuration.py:246 +msgid "Edit template for persons. Current template: {}" +msgstr "Éditer le modèles pour les personnes. Modèle actuel : {}" + +#: ../src\controller\settings.py:325 msgid "Direct Messages" -msgstr "Messages privés" +msgstr "Messages" #: ../src\controller\user.py:29 ../src\controller\user.py:31 #: ../src\extra\SpellChecker\wx_ui.py:80 ../src\issueReporter\wx_ui.py:84 @@ -537,6 +537,7 @@ msgstr "Messages privés" #: ../src\wxUI\commonMessageDialogs.py:83 #: ../src\wxUI\commonMessageDialogs.py:89 #: ../src\wxUI\commonMessageDialogs.py:92 +#: ../src\wxUI\commonMessageDialogs.py:95 msgid "Error" msgstr "Erreur" @@ -618,7 +619,7 @@ msgstr "Favoris: %s" #: ../src\controller\userActionsController.py:74 msgid "You can't ignore direct messages" -msgstr "Vous ne pouvez pas ignorer les messages privés" +msgstr "Vous ne pouvez pas ignorer les messages" #: ../src\controller\userAliasController.py:32 msgid "Edit alias for {}" @@ -665,7 +666,7 @@ msgstr "Arrêté" msgid "&Record" msgstr "&Enregistrer" -#: ../src\extra\AudioUploader\audioUploader.py:136 ../src\sound.py:148 +#: ../src\extra\AudioUploader\audioUploader.py:136 ../src\sound.py:147 msgid "Playing..." msgstr "Lecture..." @@ -717,6 +718,9 @@ msgid "%s seconds" msgstr "%s secondes" #: ../src\extra\AudioUploader\wx_transfer_dialogs.py:15 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:35 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:171 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:255 msgid "File" msgstr "Fichier" @@ -782,11 +786,11 @@ msgstr "Tampon détruit." #: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:10 msgid "Direct message received." -msgstr "Message privé reçu." +msgstr "Message reçu." #: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:11 msgid "Direct message sent." -msgstr "Message privé envoyé." +msgstr "Message envoyé." #: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:12 msgid "Error." @@ -826,7 +830,7 @@ msgstr "Mention reçue." #: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:21 msgid "New event." -msgstr "Nouvel événement." +msgstr "Nouvel évènement." #: ../src\extra\SoundsTutorial\soundsTutorial_constants.py:22 msgid "{0} is ready." @@ -874,7 +878,7 @@ msgstr "Apprentissage des sons" #: ../src\extra\SoundsTutorial\wx_ui.py:12 msgid "Press enter to listen to the sound for the selected event" -msgstr "Pressez sur entrée pour entendre le son lié à l'événement sélectionné" +msgstr "Pressez entrée pour entendre le son lié à l'évènement sélectionné" #: ../src\extra\SpellChecker\spellchecker.py:60 msgid "Misspelled word: %s" @@ -1390,8 +1394,8 @@ msgid "Target language" msgstr "Langue cible" #: ../src\issueReporter\issueReporter.py:32 -#: ../src\wxUI\dialogs\configuration.py:359 -#: ../src\wxUI\dialogs\configuration.py:368 +#: ../src\wxUI\dialogs\configuration.py:373 +#: ../src\wxUI\dialogs\configuration.py:382 msgid "General" msgstr "Général" @@ -1487,7 +1491,7 @@ msgstr "" msgid "Send report" msgstr "Envoyer le rapport" -#: ../src\issueReporter\wx_ui.py:75 ../src\wxUI\dialogs\filterDialogs.py:84 +#: ../src\issueReporter\wx_ui.py:75 ../src\wxUI\dialogs\filterDialogs.py:83 #: ../src\wxUI\dialogs\find.py:23 msgid "Cancel" msgstr "Annuler" @@ -1562,13 +1566,13 @@ msgid "New tweet" msgstr "Nouveau tweet" #: ../src\keystrokeEditor\constants.py:12 ../src\wxUI\buffers\base.py:26 -#: ../src\wxUI\commonMessageDialogs.py:10 ../src\wxUI\dialogs\message.py:126 +#: ../src\wxUI\commonMessageDialogs.py:10 msgid "Retweet" msgstr "Retweet" #: ../src\keystrokeEditor\constants.py:13 msgid "Send direct message" -msgstr "Envoyer un message privé" +msgstr "Envoyer un message" #: ../src\keystrokeEditor\constants.py:14 msgid "Like a tweet" @@ -1648,7 +1652,7 @@ msgstr "Modifier le profil" #: ../src\keystrokeEditor\constants.py:33 msgid "Delete a tweet or direct message" -msgstr "Supprimer un tweet ou un message privé" +msgstr "Supprimer un tweet ou un message" #: ../src\keystrokeEditor\constants.py:34 msgid "Empty the current buffer" @@ -1780,7 +1784,7 @@ msgstr "Raccourci" msgid "Action" msgstr "Action" -#: ../src\keystrokeEditor\wx_ui.py:18 ../src\wxUI\dialogs\filterDialogs.py:131 +#: ../src\keystrokeEditor\wx_ui.py:18 ../src\wxUI\dialogs\filterDialogs.py:135 #: ../src\wxUI\dialogs\lists.py:20 ../src\wxUI\dialogs\userAliasDialogs.py:53 msgid "Edit" msgstr "Modifier" @@ -1793,7 +1797,7 @@ msgstr "Indéfinir le raccourcis clavier" msgid "Execute action" msgstr "Exécuter une action" -#: ../src\keystrokeEditor\wx_ui.py:22 ../src\wxUI\dialogs\configuration.py:396 +#: ../src\keystrokeEditor\wx_ui.py:22 ../src\wxUI\dialogs\configuration.py:414 #: ../src\wxUI\dialogs\userAliasDialogs.py:25 ../src\wxUI\dialogs\utils.py:39 msgid "Close" msgstr "Fermer" @@ -1830,7 +1834,7 @@ msgstr "Windows" msgid "Key" msgstr "Touche" -#: ../src\keystrokeEditor\wx_ui.py:71 ../src\wxUI\dialogs\filterDialogs.py:82 +#: ../src\keystrokeEditor\wx_ui.py:71 ../src\wxUI\dialogs\filterDialogs.py:80 #: ../src\wxUI\dialogs\find.py:21 ../src\wxUI\dialogs\userAliasDialogs.py:23 #: ../src\wxUI\dialogs\utils.py:36 msgid "OK" @@ -1968,26 +1972,27 @@ msgstr "" "elle va être détruite et recréée automatiquement. Si ce problème perciste, " "veuillez envoyer le journal d'erreur aux développeurs de {app}." -#: ../src\sessions\twitter\compose.py:38 ../src\sessions\twitter\compose.py:81 -#: ../src\sessions\twitter\compose.py:146 -#: ../src\sessions\twitter\compose.py:155 +#: ../src\sessions\twitter\compose.py:25 ../src\sessions\twitter\compose.py:68 +#: ../src\sessions\twitter\compose.py:133 +#: ../src\sessions\twitter\compose.py:142 +#: ../src\sessions\twitter\templates.py:26 msgid "dddd, MMMM D, YYYY H:m:s" msgstr "dddd D MMMM YYYY à H:m:s" -#: ../src\sessions\twitter\compose.py:89 ../src\sessions\twitter\compose.py:91 +#: ../src\sessions\twitter\compose.py:76 ../src\sessions\twitter\compose.py:78 msgid "Dm to %s " msgstr "Mp à %s" -#: ../src\sessions\twitter\compose.py:130 +#: ../src\sessions\twitter\compose.py:117 msgid "{0}. Quoted tweet from @{1}: {2}" msgstr "{0}. Tweet de @{1} cité : {2}" -#: ../src\sessions\twitter\compose.py:157 -#: ../src\sessions\twitter\compose.py:159 +#: ../src\sessions\twitter\compose.py:144 +#: ../src\sessions\twitter\compose.py:146 msgid "Unavailable" msgstr "Indisponible" -#: ../src\sessions\twitter\compose.py:160 +#: ../src\sessions\twitter\compose.py:147 msgid "" "%s (@%s). %s followers, %s friends, %s tweets. Last tweeted %s. Joined " "Twitter %s" @@ -1995,44 +2000,70 @@ msgstr "" "%s (@%s). %s abonnés, %s abonnements, %s tweets. Dernier tweet envoyé %s. À " "rejoint Twitter %s" -#: ../src\sessions\twitter\compose.py:164 +#: ../src\sessions\twitter\compose.py:151 msgid "No description available" msgstr "Aucune description disponible" -#: ../src\sessions\twitter\compose.py:168 +#: ../src\sessions\twitter\compose.py:155 msgid "private" msgstr "privé" -#: ../src\sessions\twitter\compose.py:169 +#: ../src\sessions\twitter\compose.py:156 msgid "public" msgstr "public" -#: ../src\sessions\twitter\session.py:209 +#: ../src\sessions\twitter\session.py:211 +#: ../src\sessions\twitter\session.py:238 msgid "%s failed. Reason: %s" msgstr "%s erreur. Raison: %s" -#: ../src\sessions\twitter\session.py:215 +#: ../src\sessions\twitter\session.py:217 +#: ../src\sessions\twitter\session.py:241 msgid "%s succeeded." msgstr "%s réussi." -#: ../src\sessions\twitter\session.py:424 -#: ../src\sessions\twitter\session.py:502 +#: ../src\sessions\twitter\session.py:451 +#: ../src\sessions\twitter\session.py:529 msgid "Deleted account" msgstr "Compte supprimé" -#: ../src\sessions\twitter\utils.py:231 +#: ../src\sessions\twitter\templates.py:16 +msgid "$display_name, $text $image_descriptions $date. $source" +msgstr "$display_name, $text $image_descriptions $date. $source" + +#: ../src\sessions\twitter\templates.py:17 +msgid "$sender_display_name, $text $date" +msgstr "$sender_display_name, $text $date" + +#: ../src\sessions\twitter\templates.py:18 +msgid "Dm to $recipient_display_name, $text $date" +msgstr "MP à $recipient_display_name, $text $date" + +#: ../src\sessions\twitter\templates.py:19 +msgid "" +"$display_name (@$screen_name). $followers followers, $following following, " +"$tweets tweets. Joined Twitter $created_at." +msgstr "" +"$display_name (@$screen_name). $followers abonnés, $following abonnements, " +"$tweets tweets. À rejoint Twitter $created_at." + +#: ../src\sessions\twitter\templates.py:54 +msgid "Image description: {}." +msgstr "Description de l'image: {}." + +#: ../src\sessions\twitter\utils.py:243 msgid "Sorry, you are not authorised to see this status." msgstr "Désolé, vous n'êtes pas autorisé à voir ce Tweet." -#: ../src\sessions\twitter\utils.py:233 +#: ../src\sessions\twitter\utils.py:245 msgid "No status found with that ID" msgstr "Aucun Tweet trouvée avec cet ID" -#: ../src\sessions\twitter\utils.py:235 +#: ../src\sessions\twitter\utils.py:247 msgid "Error {0}" msgstr "Erreur {0}" -#: ../src\sessions\twitter\utils.py:262 +#: ../src\sessions\twitter\utils.py:274 msgid "{user_1}, {user_2} and {all_users} more: {text}" msgstr "{user_1}, {user_2} et {all_users} de plus : {text}" @@ -2044,7 +2075,7 @@ msgstr "Compte en cours d'autorisation..." msgid "Enter your PIN code here" msgstr "Entrer votre code PIN ici" -#: ../src\sound.py:161 +#: ../src\sound.py:160 msgid "Stopped." msgstr "Arrêté." @@ -2098,10 +2129,6 @@ msgstr "" msgid "Client" msgstr "Client" -#: ../src\wxUI\buffers\base.py:12 -msgid "Text" -msgstr "Texte" - #: ../src\wxUI\buffers\base.py:12 ../src\wxUI\buffers\events.py:14 msgid "Date" msgstr "Date" @@ -2113,17 +2140,22 @@ msgstr "Date" msgid "User" msgstr "Utilisateur" +#: ../src\wxUI\buffers\base.py:12 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:47 +msgid "Text" +msgstr "Texte" + #: ../src\wxUI\buffers\base.py:28 msgid "Direct message" -msgstr "Message privé" +msgstr "Message" #: ../src\wxUI\buffers\events.py:14 msgid "Event" -msgstr "Événement" +msgstr "Évènement" #: ../src\wxUI\buffers\events.py:16 msgid "Remove event" -msgstr "Supprimer l'événement" +msgstr "Supprimer l'évènement" #: ../src\wxUI\buffers\panels.py:12 ../src\wxUI\buffers\panels.py:20 msgid "Login" @@ -2208,7 +2240,7 @@ msgid "Enter the name of the client : " msgstr "Entrez le nom du client: " #: ../src\wxUI\commonMessageDialogs.py:26 -#: ../src\wxUI\dialogs\configuration.py:246 +#: ../src\wxUI\dialogs\configuration.py:260 msgid "Add client" msgstr "Ajouter un client" @@ -2261,7 +2293,7 @@ msgstr "" "vous continuer ?" #: ../src\wxUI\commonMessageDialogs.py:48 -#: ../src\wxUI\commonMessageDialogs.py:95 +#: ../src\wxUI\commonMessageDialogs.py:98 msgid "Warning" msgstr "Attention" @@ -2367,6 +2399,10 @@ msgid "This filter already exists. Please use a different title" msgstr "Ce filtre existe déjà. Veuillez utiliser un titre différent" #: ../src\wxUI\commonMessageDialogs.py:95 +msgid "The configuration file is invalid." +msgstr "Le fichier de configuration est invalide." + +#: ../src\wxUI\commonMessageDialogs.py:98 msgid "" "{0} quit unexpectedly the last time it was run. If the problem persists, " "please report it to the {0} developers." @@ -2374,55 +2410,6 @@ msgstr "" "{0} a été quitté inopinément lors de sa dernière exécution. Si ce problème " "perciste, veuillez le signaler aux développeurs de {0}." -#: ../src\wxUI\dialogs\attach.py:10 -msgid "Add an attachment" -msgstr "Ajouter un fichier" - -#: ../src\wxUI\dialogs\attach.py:13 -msgid "Attachments" -msgstr "Fichiers joints" - -#: ../src\wxUI\dialogs\attach.py:14 -msgid "Title" -msgstr "Titre" - -#: ../src\wxUI\dialogs\attach.py:14 -msgid "Type" -msgstr "Type" - -#: ../src\wxUI\dialogs\attach.py:19 -msgid "Add attachments" -msgstr "Joindre des fichiers" - -#: ../src\wxUI\dialogs\attach.py:20 -msgid "&Photo" -msgstr "&Image" - -#: ../src\wxUI\dialogs\attach.py:21 -msgid "Remove attachment" -msgstr "Supprimer le fichier joint" - -#: ../src\wxUI\dialogs\attach.py:37 ../src\wxUI\dialogs\message.py:116 -#: ../src\wxUI\dialogs\message.py:175 ../src\wxUI\dialogs\message.py:235 -#: ../src\wxUI\dialogs\update_profile.py:82 -msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" -msgstr "Fichiers image (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" - -#: ../src\wxUI\dialogs\attach.py:37 ../src\wxUI\dialogs\message.py:116 -#: ../src\wxUI\dialogs\message.py:175 ../src\wxUI\dialogs\message.py:235 -#: ../src\wxUI\dialogs\update_profile.py:82 -msgid "Select the picture to be uploaded" -msgstr "Sélectionnez la photo à charger" - -#: ../src\wxUI\dialogs\attach.py:44 -msgid "please provide a description" -msgstr "Veuillez fournir une description" - -#: ../src\wxUI\dialogs\attach.py:44 ../src\wxUI\dialogs\lists.py:14 -#: ../src\wxUI\dialogs\lists.py:70 -msgid "Description" -msgstr "Description" - #: ../src\wxUI\dialogs\configuration.py:15 msgid "Language" msgstr "Langue" @@ -2561,7 +2548,7 @@ msgid "Status" msgstr "Statut" #: ../src\wxUI\dialogs\configuration.py:144 -#: ../src\wxUI\dialogs\filterDialogs.py:126 +#: ../src\wxUI\dialogs\filterDialogs.py:130 msgid "Buffer" msgstr "Tampon" @@ -2609,168 +2596,180 @@ msgstr "Le tampon est déjà en haut de la liste." msgid "The buffer is already at the bottom of the list." msgstr "Le tampon est déjà en bas de la liste." -#: ../src\wxUI\dialogs\configuration.py:240 -#: ../src\wxUI\dialogs\configuration.py:381 +#: ../src\wxUI\dialogs\configuration.py:254 +#: ../src\wxUI\dialogs\configuration.py:395 msgid "Ignored clients" msgstr "Clients ignorés" -#: ../src\wxUI\dialogs\configuration.py:247 +#: ../src\wxUI\dialogs\configuration.py:261 msgid "Remove client" msgstr "Supprimer le client" -#: ../src\wxUI\dialogs\configuration.py:271 +#: ../src\wxUI\dialogs\configuration.py:285 msgid "Volume" msgstr "Volume" -#: ../src\wxUI\dialogs\configuration.py:282 +#: ../src\wxUI\dialogs\configuration.py:296 msgid "Session mute" msgstr "Session muet" -#: ../src\wxUI\dialogs\configuration.py:284 +#: ../src\wxUI\dialogs\configuration.py:298 msgid "Output device" msgstr "Périphérique de sortie" -#: ../src\wxUI\dialogs\configuration.py:291 +#: ../src\wxUI\dialogs\configuration.py:305 msgid "Input device" msgstr "Périphérique d'entrée" -#: ../src\wxUI\dialogs\configuration.py:299 +#: ../src\wxUI\dialogs\configuration.py:313 msgid "Sound pack" msgstr "Pack de sons" -#: ../src\wxUI\dialogs\configuration.py:305 +#: ../src\wxUI\dialogs\configuration.py:319 msgid "Indicate audio tweets with sound" msgstr "Indiquer les tweets audio avec son" -#: ../src\wxUI\dialogs\configuration.py:307 +#: ../src\wxUI\dialogs\configuration.py:321 msgid "Indicate geotweets with sound" msgstr "Indiquer les Tweet avec localisation géographique avec son" -#: ../src\wxUI\dialogs\configuration.py:309 +#: ../src\wxUI\dialogs\configuration.py:323 msgid "Indicate tweets containing images with sound" msgstr "Indiquer les tweets contenant des images avec du son" -#: ../src\wxUI\dialogs\configuration.py:332 +#: ../src\wxUI\dialogs\configuration.py:346 msgid "Language for OCR" msgstr "Langue pour l'OCR" -#: ../src\wxUI\dialogs\configuration.py:338 +#: ../src\wxUI\dialogs\configuration.py:352 msgid "API Key for SndUp" msgstr "Clé API pour SndUp" -#: ../src\wxUI\dialogs\configuration.py:353 +#: ../src\wxUI\dialogs\configuration.py:367 msgid "{0} preferences" msgstr "Préférences de {0}" -#: ../src\wxUI\dialogs\configuration.py:364 +#: ../src\wxUI\dialogs\configuration.py:378 msgid "Proxy" msgstr "Proxy" -#: ../src\wxUI\dialogs\configuration.py:373 +#: ../src\wxUI\dialogs\configuration.py:387 msgid "Feedback" msgstr "Retour" -#: ../src\wxUI\dialogs\configuration.py:377 +#: ../src\wxUI\dialogs\configuration.py:391 msgid "Buffers" msgstr "Tampons" -#: ../src\wxUI\dialogs\configuration.py:385 +#: ../src\wxUI\dialogs\configuration.py:399 +msgid "Templates" +msgstr "Modèles" + +#: ../src\wxUI\dialogs\configuration.py:403 msgid "Sound" msgstr "Audio" -#: ../src\wxUI\dialogs\configuration.py:389 +#: ../src\wxUI\dialogs\configuration.py:407 msgid "Extras" msgstr "Supplémentaires" -#: ../src\wxUI\dialogs\configuration.py:394 +#: ../src\wxUI\dialogs\configuration.py:412 msgid "Save" msgstr "Enregistrer" -#: ../src\wxUI\dialogs\filterDialogs.py:16 +#: ../src\wxUI\dialogs\filterDialogs.py:13 msgid "Create a filter for this buffer" msgstr "Créer un filtre pour ce tampon" -#: ../src\wxUI\dialogs\filterDialogs.py:17 +#: ../src\wxUI\dialogs\filterDialogs.py:14 msgid "Filter title" msgstr "Titre du filtre" -#: ../src\wxUI\dialogs\filterDialogs.py:26 -#: ../src\wxUI\dialogs\filterDialogs.py:126 +#: ../src\wxUI\dialogs\filterDialogs.py:24 +#: ../src\wxUI\dialogs\filterDialogs.py:130 msgid "Filter by word" msgstr "Filtrer par mot" -#: ../src\wxUI\dialogs\filterDialogs.py:27 +#: ../src\wxUI\dialogs\filterDialogs.py:25 msgid "Ignore tweets wich contain the following word" msgstr "Ignorer les tweets contenant le mot suivant" -#: ../src\wxUI\dialogs\filterDialogs.py:28 +#: ../src\wxUI\dialogs\filterDialogs.py:26 msgid "Ignore tweets without the following word" msgstr "Ignorer les tweets ne contenant pas le mot suivant" -#: ../src\wxUI\dialogs\filterDialogs.py:33 +#: ../src\wxUI\dialogs\filterDialogs.py:31 msgid "word" msgstr "Mot" -#: ../src\wxUI\dialogs\filterDialogs.py:38 +#: ../src\wxUI\dialogs\filterDialogs.py:36 msgid "Allow retweets" msgstr "Permettre les retweets" -#: ../src\wxUI\dialogs\filterDialogs.py:39 +#: ../src\wxUI\dialogs\filterDialogs.py:37 msgid "Allow quoted tweets" msgstr "Permettre les tweets cités" -#: ../src\wxUI\dialogs\filterDialogs.py:40 +#: ../src\wxUI\dialogs\filterDialogs.py:38 msgid "Allow replies" msgstr "Permettre les réponses" -#: ../src\wxUI\dialogs\filterDialogs.py:48 +#: ../src\wxUI\dialogs\filterDialogs.py:46 msgid "Use this term as a regular expression" msgstr "Utiliser ce terme comme une expression régulière" -#: ../src\wxUI\dialogs\filterDialogs.py:50 -#: ../src\wxUI\dialogs\filterDialogs.py:126 +#: ../src\wxUI\dialogs\filterDialogs.py:48 +#: ../src\wxUI\dialogs\filterDialogs.py:130 msgid "Filter by language" msgstr "Filtrer par langue" -#: ../src\wxUI\dialogs\filterDialogs.py:51 +#: ../src\wxUI\dialogs\filterDialogs.py:49 msgid "Load tweets in the following languages" msgstr "Charger tweets dans les suivantes langues" -#: ../src\wxUI\dialogs\filterDialogs.py:52 +#: ../src\wxUI\dialogs\filterDialogs.py:50 msgid "Ignore tweets in the following languages" msgstr "Ignorer tweets dans les suivantes langues" -#: ../src\wxUI\dialogs\filterDialogs.py:53 +#: ../src\wxUI\dialogs\filterDialogs.py:51 msgid "Don't filter by language" msgstr "Ne pas filtrer par langue" -#: ../src\wxUI\dialogs\filterDialogs.py:64 +#: ../src\wxUI\dialogs\filterDialogs.py:62 msgid "Supported languages" msgstr "Langues supportées" -#: ../src\wxUI\dialogs\filterDialogs.py:69 +#: ../src\wxUI\dialogs\filterDialogs.py:67 msgid "Add selected language to filter" msgstr "Ajouter la langue sélectionnée au filtre" -#: ../src\wxUI\dialogs\filterDialogs.py:73 +#: ../src\wxUI\dialogs\filterDialogs.py:71 msgid "Selected languages" msgstr "Langue sélectionnée" -#: ../src\wxUI\dialogs\filterDialogs.py:75 -#: ../src\wxUI\dialogs\filterDialogs.py:133 ../src\wxUI\dialogs\lists.py:21 +#: ../src\wxUI\dialogs\filterDialogs.py:73 +#: ../src\wxUI\dialogs\filterDialogs.py:137 ../src\wxUI\dialogs\lists.py:21 #: ../src\wxUI\dialogs\lists.py:132 ../src\wxUI\dialogs\userAliasDialogs.py:57 msgid "Remove" msgstr "Effacer" -#: ../src\wxUI\dialogs\filterDialogs.py:123 +#: ../src\wxUI\dialogs\filterDialogs.py:120 +msgid "Missing filter name" +msgstr "Nom de filtre manquant" + +#: ../src\wxUI\dialogs\filterDialogs.py:120 +msgid "You must define a name for the filter before creating it." +msgstr "Vous devez définir un nom pour le filtre avant de le créer." + +#: ../src\wxUI\dialogs\filterDialogs.py:127 msgid "Manage filters" msgstr "Gérer les filtres" -#: ../src\wxUI\dialogs\filterDialogs.py:125 +#: ../src\wxUI\dialogs\filterDialogs.py:129 msgid "Filters" msgstr "Filtres" -#: ../src\wxUI\dialogs\filterDialogs.py:126 +#: ../src\wxUI\dialogs\filterDialogs.py:130 msgid "Filter" msgstr "Filtre" @@ -2802,6 +2801,14 @@ msgstr "Propriétaire" msgid "mode" msgstr "mode" +#: ../src\wxUI\dialogs\lists.py:14 ../src\wxUI\dialogs\lists.py:70 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:37 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:126 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:173 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:257 +msgid "Description" +msgstr "Description" + #: ../src\wxUI\dialogs\lists.py:19 ../src\wxUI\dialogs\lists.py:62 msgid "Create a new list" msgstr "Créer une nouvelle liste" @@ -2858,103 +2865,6 @@ msgstr "Sélectionnez une liste pour supprimer l'utilisateur" msgid "Do you really want to delete this list?" msgstr "Voulez-vous vraiment supprimer cette liste ?" -#: ../src\wxUI\dialogs\message.py:73 ../src\wxUI\dialogs\message.py:254 -msgid "&Long tweet" -msgstr "&Tweet long" - -#: ../src\wxUI\dialogs\message.py:74 ../src\wxUI\dialogs\message.py:133 -#: ../src\wxUI\dialogs\message.py:255 -msgid "&Upload image..." -msgstr "&Joindre une image..." - -#: ../src\wxUI\dialogs\message.py:75 ../src\wxUI\dialogs\message.py:134 -#: ../src\wxUI\dialogs\message.py:194 ../src\wxUI\dialogs\message.py:256 -#: ../src\wxUI\dialogs\message.py:359 ../src\wxUI\dialogs\message.py:435 -msgid "Check &spelling..." -msgstr "Correction &orthographique..." - -#: ../src\wxUI\dialogs\message.py:76 ../src\wxUI\dialogs\message.py:135 -#: ../src\wxUI\dialogs\message.py:195 ../src\wxUI\dialogs\message.py:257 -msgid "&Attach audio..." -msgstr "&Joindre un audio..." - -#: ../src\wxUI\dialogs\message.py:77 ../src\wxUI\dialogs\message.py:136 -#: ../src\wxUI\dialogs\message.py:196 ../src\wxUI\dialogs\message.py:258 -msgid "Sh&orten URL" -msgstr "&Réduire URL" - -#: ../src\wxUI\dialogs\message.py:78 ../src\wxUI\dialogs\message.py:137 -#: ../src\wxUI\dialogs\message.py:197 ../src\wxUI\dialogs\message.py:259 -#: ../src\wxUI\dialogs\message.py:360 ../src\wxUI\dialogs\message.py:436 -msgid "&Expand URL" -msgstr "&Élargir URL" - -#: ../src\wxUI\dialogs\message.py:81 ../src\wxUI\dialogs\message.py:140 -#: ../src\wxUI\dialogs\message.py:200 ../src\wxUI\dialogs\message.py:262 -#: ../src\wxUI\dialogs\message.py:362 ../src\wxUI\dialogs\message.py:438 -msgid "&Translate..." -msgstr "&Traduire..." - -#: ../src\wxUI\dialogs\message.py:82 ../src\wxUI\dialogs\message.py:141 -#: ../src\wxUI\dialogs\message.py:186 ../src\wxUI\dialogs\message.py:263 -msgid "Auto&complete users" -msgstr "Sai&sie automatique utilisateurs" - -#: ../src\wxUI\dialogs\message.py:83 ../src\wxUI\dialogs\message.py:142 -#: ../src\wxUI\dialogs\message.py:201 ../src\wxUI\dialogs\message.py:264 -msgid "Sen&d" -msgstr "Envoye&r" - -#: ../src\wxUI\dialogs\message.py:85 ../src\wxUI\dialogs\message.py:144 -#: ../src\wxUI\dialogs\message.py:203 ../src\wxUI\dialogs\message.py:266 -#: ../src\wxUI\dialogs\message.py:363 ../src\wxUI\dialogs\message.py:439 -msgid "C&lose" -msgstr "F&ermer" - -#: ../src\wxUI\dialogs\message.py:184 -msgid "&Recipient" -msgstr "&Destinataire" - -#: ../src\wxUI\dialogs\message.py:245 -msgid "&Mention to all" -msgstr "&Répondre à tout le monde" - -#: ../src\wxUI\dialogs\message.py:299 -msgid "Tweet - %i characters " -msgstr "Tweet - %i caractères " - -#: ../src\wxUI\dialogs\message.py:316 -msgid "Image description" -msgstr "Description de l'image" - -#: ../src\wxUI\dialogs\message.py:327 -msgid "Retweets: " -msgstr "Retweets: " - -#: ../src\wxUI\dialogs\message.py:332 -msgid "Likes: " -msgstr "Favoris: " - -#: ../src\wxUI\dialogs\message.py:337 -msgid "Source: " -msgstr "Source: " - -#: ../src\wxUI\dialogs\message.py:342 ../src\wxUI\dialogs\message.py:423 -msgid "Date: " -msgstr "Date: " - -#: ../src\wxUI\dialogs\message.py:357 ../src\wxUI\dialogs\message.py:433 -msgid "Copy link to clipboard" -msgstr "Copier le lien dans le Presse-papiers" - -#: ../src\wxUI\dialogs\message.py:408 -msgid "View" -msgstr "Voir" - -#: ../src\wxUI\dialogs\message.py:410 -msgid "Item" -msgstr "Élément" - #: ../src\wxUI\dialogs\search.py:12 msgid "Search on Twitter" msgstr "Rechercher sur Twitter" @@ -3036,6 +2946,261 @@ msgstr "Ville" msgid "&Location" msgstr "&Localisation" +#: ../src\wxUI\dialogs\twitterDialogs\templateDialogs.py:8 +msgid "Edit Template" +msgstr "Éditer le Modèle" + +#: ../src\wxUI\dialogs\twitterDialogs\templateDialogs.py:13 +msgid "Edit template" +msgstr "Éditer le modèle" + +#: ../src\wxUI\dialogs\twitterDialogs\templateDialogs.py:17 +msgid "Available variables" +msgstr "Variables disponibles" + +#: ../src\wxUI\dialogs\twitterDialogs\templateDialogs.py:29 +msgid "Restore template" +msgstr "Restaurer le modèle" + +#: ../src\wxUI\dialogs\twitterDialogs\templateDialogs.py:48 +msgid "Restored template to {}." +msgstr "Modèle restauré à {}." + +#: ../src\wxUI\dialogs\twitterDialogs\templateDialogs.py:52 +msgid "Invalid template" +msgstr "Modèle invalide" + +#: ../src\wxUI\dialogs\twitterDialogs\templateDialogs.py:52 +msgid "" +"the template you have specified include variables that do not exists for the " +"object. Please fix the template and try again. For your reference, you can " +"see a list of all available variables in the variables list while editing " +"your template." +msgstr "" +"Le modèle que vous avez spécifié contient des variables qui ne sont pas " +"disponibles pour cet objet. Veuillez corriger le modèle et réessayer. Pour " +"votre information, vous pouvez consulter une liste des variables disponibles " +"dans la liste de variables lorsque vous éditez le modèle." + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:32 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:48 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:168 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:252 +msgid "Attachments" +msgstr "Fichiers joints" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:36 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:172 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:256 +msgid "Type" +msgstr "Type" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:39 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:175 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:259 +msgid "Delete attachment" +msgstr "Supprimer la pièce jointe" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:44 +msgid "Added Tweets" +msgstr "Tweets ajoutés" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:51 +msgid "Delete tweet" +msgstr "Supprimer le tweet" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:56 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:190 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:264 +msgid "A&dd..." +msgstr "&Ajouter" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:58 +msgid "Add t&weet" +msgstr "A&jouter un tweet" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:61 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:192 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:266 +msgid "&Attach audio..." +msgstr "&Joindre un audio..." + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:65 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:196 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:235 +msgid "Auto&complete users" +msgstr "Sai&sie automatique utilisateurs" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:67 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:198 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:270 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:364 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:437 +msgid "Check &spelling..." +msgstr "Correction &orthographique..." + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:69 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:200 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:272 +msgid "&Translate" +msgstr "&Traduire" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:73 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:204 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:276 +msgid "Sen&d" +msgstr "Envoye&r" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:117 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:218 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:296 +msgid "Image" +msgstr "Image" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:119 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:220 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:298 +msgid "Video" +msgstr "Vidéo" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:121 +msgid "Poll" +msgstr "Sondage" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:126 +msgid "please provide a description" +msgstr "Veuillez fournir une description" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:133 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:289 +#: ../src\wxUI\dialogs\update_profile.py:82 +msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" +msgstr "Fichiers image (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:133 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:289 +#: ../src\wxUI\dialogs\update_profile.py:82 +msgid "Select the picture to be uploaded" +msgstr "Sélectionnez la photo à charger" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:140 +msgid "Select the video to be uploaded" +msgstr "Sélectionnez la vidéo à téléverser" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:140 +msgid "Video files (*.mp4)|*.mp4" +msgstr "Fichiers vidéo (*.mp4)|*.mp4" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:146 +msgid "Error adding attachment" +msgstr "Erreur à l'ajout de la pièce jointe" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:146 +msgid "" +"It is not possible to add more attachments. Please make sure your tweet " +"complies with Twitter'S attachment rules. You can add only one video or GIF " +"in every tweet, and a maximum of 4 photos." +msgstr "" +"Il est impossible de joindre plus de contenu. Assurez-vous que votre tweet " +"respecte les règles d'attachement de Twitter. Vous pouvez seulement inclure " +"une vidéo ou un GIF par tweet, et 4 photos au maximum." + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:180 +msgid "&Mention to all" +msgstr "&Répondre à tout le monde" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:233 +msgid "&Recipient" +msgstr "&Destinataire" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:304 +msgid "Tweet - %i characters " +msgstr "Tweet - %i caractères " + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:321 +msgid "Image description" +msgstr "Description de l'image" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:332 +msgid "Retweets: " +msgstr "Retweets: " + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:337 +msgid "Likes: " +msgstr "Favoris: " + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:342 +msgid "Source: " +msgstr "Source: " + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:347 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:425 +msgid "Date: " +msgstr "Date: " + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:362 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:435 +msgid "Copy link to clipboard" +msgstr "Copier le lien dans le Presse-papiers" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:365 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:440 +msgid "&Translate..." +msgstr "&Traduire..." + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:366 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:441 +msgid "C&lose" +msgstr "F&ermer" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:410 +msgid "View" +msgstr "Voir" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:412 +msgid "Item" +msgstr "Élément" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:438 +msgid "&Expand URL" +msgstr "&Élargir URL" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:477 +msgid "Add a poll" +msgstr "Ajouter un sondage" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:481 +msgid "Participation time (in days)" +msgstr "Temps de participation (en jours)" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:488 +msgid "Choices" +msgstr "Choix" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:492 +msgid "Option 1" +msgstr "Option 1" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:499 +msgid "Option 2" +msgstr "Option 2" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:506 +msgid "Option 3" +msgstr "Option 3" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:513 +msgid "Option 4" +msgstr "Option 4" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:541 +msgid "Not enough information" +msgstr "Pas assez d'informations" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:541 +msgid "Please make sure you have provided at least two options for the poll." +msgstr "Assurez-vous d'avoir spécifier au moins 2 options pour le sondage." + #: ../src\wxUI\dialogs\update_profile.py:10 msgid "Update your profile" msgstr "Actualiser votre profil" @@ -3226,15 +3391,15 @@ msgstr "&Actions de l'utilisateur..." #: ../src\wxUI\menus.py:40 msgid "&Show direct message" -msgstr "&Afficher le message privé" +msgstr "&Afficher le message" #: ../src\wxUI\menus.py:68 msgid "&Show event" -msgstr "&Afficher l'événement" +msgstr "&Afficher l'évènement" #: ../src\wxUI\menus.py:78 msgid "Direct &message" -msgstr "&Message privé" +msgstr "&Message" #: ../src\wxUI\menus.py:80 ../src\wxUI\view.py:50 msgid "&View lists" @@ -3334,7 +3499,7 @@ msgstr "Voir &chronologie..." #: ../src\wxUI\view.py:46 msgid "Direct me&ssage" -msgstr "&Message privé" +msgstr "&Message" #: ../src\wxUI\view.py:47 msgid "Add a&lias" diff --git a/src/locales/ja/lc_messages/twblue.mo b/src/locales/ja/lc_messages/twblue.mo index e85315e4..d95b4f06 100644 Binary files a/src/locales/ja/lc_messages/twblue.mo and b/src/locales/ja/lc_messages/twblue.mo differ diff --git a/src/locales/ja/lc_messages/twblue.po b/src/locales/ja/lc_messages/twblue.po index 496f81c5..0caa2a10 100644 --- a/src/locales/ja/lc_messages/twblue.po +++ b/src/locales/ja/lc_messages/twblue.po @@ -7,76 +7,72 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2021-11-01 11:40+0900\n" +"PO-Revision-Date: 2022-02-16 08:01+0900\n" "Last-Translator: 陸 \n" "Language-Team: \n" "Language: ja_JP\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" -"X-Generator: Poedit 3.0\n" "Plural-Forms: nplurals=1; plural=0;\n" - -#: ../src\controller\attach.py:25 -msgid "Photo" -msgstr "画像" +"Generated-By: pygettext.py 1.5\n" +"X-Generator: Poedit 3.0.1\n" #: ../src\controller\buffers\base\base.py:91 msgid "This action is not supported for this buffer" msgstr "この動作は、現在のバッファではサポートされていません" #: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:337 ../src\controller\settings.py:286 +#: ../src\controller\mainController.py:338 ../src\controller\settings.py:323 msgid "Home" msgstr "ホーム" #: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:339 ../src\controller\settings.py:287 +#: ../src\controller\mainController.py:340 ../src\controller\settings.py:324 msgid "Mentions" msgstr "メンション" #: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:341 +#: ../src\controller\mainController.py:342 msgid "Direct messages" msgstr "ダイレクトメッセージ" #: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:343 ../src\controller\settings.py:289 +#: ../src\controller\mainController.py:344 ../src\controller\settings.py:326 msgid "Sent direct messages" msgstr "送信済みのダイレクトメッセージ" #: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:345 ../src\controller\settings.py:290 +#: ../src\controller\mainController.py:346 ../src\controller\settings.py:327 msgid "Sent tweets" msgstr "送信済みのツイート" #: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:347 -#: ../src\controller\mainController.py:1390 ../src\controller\settings.py:291 +#: ../src\controller\mainController.py:348 +#: ../src\controller\mainController.py:1391 ../src\controller\settings.py:328 msgid "Likes" msgstr "いいね" #: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:349 -#: ../src\controller\mainController.py:1395 ../src\controller\settings.py:292 +#: ../src\controller\mainController.py:350 +#: ../src\controller\mainController.py:1396 ../src\controller\settings.py:329 msgid "Followers" msgstr "フォロワー" #: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:353 -#: ../src\controller\mainController.py:1405 ../src\controller\settings.py:294 +#: ../src\controller\mainController.py:354 +#: ../src\controller\mainController.py:1406 ../src\controller\settings.py:331 msgid "Blocked users" msgstr "ブロックしたユーザー" #: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:355 -#: ../src\controller\mainController.py:1410 ../src\controller\settings.py:295 +#: ../src\controller\mainController.py:356 +#: ../src\controller\mainController.py:1411 ../src\controller\settings.py:332 msgid "Muted users" msgstr "ミューとしたユーザー" #: ../src\controller\buffers\twitter\base.py:70 -#: ../src\controller\mainController.py:1400 ../src\controller\settings.py:293 +#: ../src\controller\mainController.py:1401 ../src\controller\settings.py:330 msgid "Friends" msgstr "フォロー" @@ -100,101 +96,108 @@ msgstr "「{username}」のフォロー" msgid "Unknown buffer" msgstr "不明なバッファ" -#: ../src\controller\buffers\twitter\base.py:88 -#: ../src\controller\buffers\twitter\trends.py:121 -#: ../src\controller\messages.py:214 ../src\wxUI\buffers\base.py:25 +#: ../src\controller\buffers\twitter\base.py:87 +#: ../src\controller\buffers\twitter\trends.py:43 +#: ../src\controller\buffers\twitter\trends.py:134 +#: ../src\controller\messages.py:296 ../src\wxUI\buffers\base.py:25 #: ../src\wxUI\buffers\events.py:15 ../src\wxUI\buffers\trends.py:18 -#: ../src\wxUI\dialogs\message.py:304 ../src\wxUI\sysTrayIcon.py:35 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:309 +#: ../src\wxUI\sysTrayIcon.py:35 msgid "Tweet" msgstr "ツイート" -#: ../src\controller\buffers\twitter\base.py:89 -#: ../src\controller\buffers\twitter\trends.py:122 +#: ../src\controller\buffers\twitter\base.py:88 +#: ../src\controller\buffers\twitter\trends.py:44 +#: ../src\controller\buffers\twitter\trends.py:135 msgid "Write the tweet here" msgstr "ツイートを入力" -#: ../src\controller\buffers\twitter\base.py:219 +#: ../src\controller\buffers\twitter\base.py:194 msgid "New tweet in {0}" msgstr "「{0}」への新規ツイート" -#: ../src\controller\buffers\twitter\base.py:222 +#: ../src\controller\buffers\twitter\base.py:197 msgid "{0} new tweets in {1}." msgstr "「{1}」への{0}個の新規ツイート。" -#: ../src\controller\buffers\twitter\base.py:261 -#: ../src\controller\buffers\twitter\directMessages.py:87 -#: ../src\controller\buffers\twitter\people.py:180 +#: ../src\controller\buffers\twitter\base.py:236 +#: ../src\controller\buffers\twitter\directMessages.py:88 +#: ../src\controller\buffers\twitter\people.py:177 msgid "%s items retrieved" msgstr "%s個のアイテムを取得しました" -#: ../src\controller\buffers\twitter\base.py:293 +#: ../src\controller\buffers\twitter\base.py:268 #: ../src\controller\buffers\twitter\people.py:80 msgid "This buffer is not a timeline; it can't be deleted." msgstr "このバッファは、タイムラインではないため、削除できません。" -#: ../src\controller\buffers\twitter\base.py:430 +#: ../src\controller\buffers\twitter\base.py:410 msgid "Reply to {arg0}" msgstr "「{arg0}」への返信:" -#: ../src\controller\buffers\twitter\base.py:432 +#: ../src\controller\buffers\twitter\base.py:412 #: ../src\keystrokeEditor\constants.py:11 ../src\wxUI\buffers\base.py:27 msgid "Reply" msgstr "返信" -#: ../src\controller\buffers\twitter\base.py:433 +#: ../src\controller\buffers\twitter\base.py:413 msgid "Reply to %s" msgstr "「%s」への返信" -#: ../src\controller\buffers\twitter\base.py:480 -#: ../src\controller\buffers\twitter\directMessages.py:129 +#: ../src\controller\buffers\twitter\base.py:436 +#: ../src\controller\buffers\twitter\directMessages.py:124 msgid "New direct message" msgstr "新しいダイレクトメッセージ" -#: ../src\controller\buffers\twitter\base.py:480 -#: ../src\controller\messages.py:200 +#: ../src\controller\buffers\twitter\base.py:436 +#: ../src\controller\messages.py:268 msgid "Direct message to %s" msgstr "「%s」へのダイレクトメッセージ" -#: ../src\controller\buffers\twitter\base.py:520 +#: ../src\controller\buffers\twitter\base.py:452 +msgid "This action is not supported on protected accounts." +msgstr "この動作は、保護されたアカウントではサポートされていません。" + +#: ../src\controller\buffers\twitter\base.py:469 msgid "Add your comment to the tweet" msgstr "ツイートにコメントを追加" -#: ../src\controller\buffers\twitter\base.py:520 +#: ../src\controller\buffers\twitter\base.py:469 msgid "Quote" msgstr "引用" -#: ../src\controller\buffers\twitter\base.py:596 +#: ../src\controller\buffers\twitter\base.py:533 msgid "Opening URL..." msgstr "URLを開いています…" -#: ../src\controller\buffers\twitter\base.py:633 +#: ../src\controller\buffers\twitter\base.py:570 msgid "User details" msgstr "ユーザーの詳細" -#: ../src\controller\buffers\twitter\base.py:654 +#: ../src\controller\buffers\twitter\base.py:591 msgid "Opening item in web browser..." msgstr "ブラウザでアイテムを開いています…" -#: ../src\controller\buffers\twitter\directMessages.py:92 -#: ../src\controller\buffers\twitter\people.py:95 +#: ../src\controller\buffers\twitter\directMessages.py:93 +#: ../src\controller\buffers\twitter\people.py:98 msgid "Mention to %s" msgstr "%sへのメンション" -#: ../src\controller\buffers\twitter\directMessages.py:92 -#: ../src\controller\buffers\twitter\people.py:95 +#: ../src\controller\buffers\twitter\directMessages.py:93 +#: ../src\controller\buffers\twitter\people.py:98 #: ../src\wxUI\buffers\people.py:17 msgid "Mention" msgstr "メンション" -#: ../src\controller\buffers\twitter\directMessages.py:132 +#: ../src\controller\buffers\twitter\directMessages.py:127 msgid "{0} new direct messages." msgstr "{0}件の新しいダイレクトメッセージ。" -#: ../src\controller\buffers\twitter\directMessages.py:135 +#: ../src\controller\buffers\twitter\directMessages.py:130 msgid "This action is not supported in the buffer yet." msgstr "この動作は、現在のバッファではサポートされていません。" -#: ../src\controller\buffers\twitter\directMessages.py:145 +#: ../src\controller\buffers\twitter\directMessages.py:146 msgid "" "Getting more items cannot be done in this buffer. Use the direct messages " "buffer instead." @@ -202,92 +205,93 @@ msgstr "" "このバッファでは、さらにアイテムを取得することはできません。代わりにダイレク" "トメッセージバッファを使用してください。" -#: ../src\controller\buffers\twitter\people.py:253 +#: ../src\controller\buffers\twitter\people.py:250 msgid "{0} new followers." msgstr "{0}人の新しいフォロワー。" -#: ../src\controller\buffers\twitter\trends.py:145 +#: ../src\controller\buffers\twitter\trends.py:150 msgid "This action is not supported in the buffer, yet." msgstr "この動作は、現在のバッファではサポートされていません。" -#: ../src\controller\mainController.py:277 +#: ../src\controller\mainController.py:278 msgid "Ready" msgstr "準備完了" -#: ../src\controller\mainController.py:351 +#: ../src\controller\mainController.py:352 msgid "Following" msgstr "フォロー中" -#: ../src\controller\mainController.py:356 +#: ../src\controller\mainController.py:357 msgid "Timelines" msgstr "タイムライン" -#: ../src\controller\mainController.py:359 -#: ../src\controller\mainController.py:883 -#: ../src\controller\mainController.py:1585 +#: ../src\controller\mainController.py:360 +#: ../src\controller\mainController.py:884 +#: ../src\controller\mainController.py:1583 msgid "Timeline for {}" msgstr "「{}」のタイムライン" -#: ../src\controller\mainController.py:360 +#: ../src\controller\mainController.py:361 msgid "Likes timelines" msgstr "ほかのユーザーのいいね一覧" -#: ../src\controller\mainController.py:363 -#: ../src\controller\mainController.py:902 -#: ../src\controller\mainController.py:1587 +#: ../src\controller\mainController.py:364 +#: ../src\controller\mainController.py:903 +#: ../src\controller\mainController.py:1585 msgid "Likes for {}" msgstr "{}のいいね一覧" -#: ../src\controller\mainController.py:364 +#: ../src\controller\mainController.py:365 msgid "Followers timelines" msgstr "フォロワー一覧" -#: ../src\controller\mainController.py:367 -#: ../src\controller\mainController.py:921 -#: ../src\controller\mainController.py:1589 +#: ../src\controller\mainController.py:368 +#: ../src\controller\mainController.py:922 +#: ../src\controller\mainController.py:1587 msgid "Followers for {}" msgstr "{}をフォローしているユーザー" -#: ../src\controller\mainController.py:368 +#: ../src\controller\mainController.py:369 msgid "Following timelines" msgstr "フォロー一覧" -#: ../src\controller\mainController.py:371 -#: ../src\controller\mainController.py:940 -#: ../src\controller\mainController.py:1591 +#: ../src\controller\mainController.py:372 +#: ../src\controller\mainController.py:941 +#: ../src\controller\mainController.py:1589 msgid "Friends for {}" msgstr "{}がフォローしているユーザー" -#: ../src\controller\mainController.py:372 ../src\wxUI\dialogs\lists.py:13 +#: ../src\controller\mainController.py:373 ../src\wxUI\dialogs\lists.py:13 msgid "Lists" msgstr "リスト" -#: ../src\controller\mainController.py:375 -#: ../src\controller\mainController.py:1422 +#: ../src\controller\mainController.py:376 +#: ../src\controller\mainController.py:1423 msgid "List for {}" msgstr "{}のリスト" -#: ../src\controller\mainController.py:376 +#: ../src\controller\mainController.py:377 msgid "Searches" msgstr "検索" -#: ../src\controller\mainController.py:379 -#: ../src\controller\mainController.py:426 -#: ../src\controller\mainController.py:431 +#: ../src\controller\mainController.py:380 +#: ../src\controller\mainController.py:427 +#: ../src\controller\mainController.py:432 msgid "Search for {}" msgstr "「{}」の検索結果" -#: ../src\controller\mainController.py:381 -#: ../src\controller\mainController.py:982 +#: ../src\controller\mainController.py:382 +#: ../src\controller\mainController.py:983 +#: ../src\controller\mainController.py:1591 msgid "Trending topics for %s" msgstr "%s のトレンド" -#: ../src\controller\mainController.py:448 -#: ../src\controller\mainController.py:464 -#: ../src\controller\mainController.py:1080 -#: ../src\controller\mainController.py:1099 -#: ../src\controller\mainController.py:1118 -#: ../src\controller\mainController.py:1137 +#: ../src\controller\mainController.py:449 +#: ../src\controller\mainController.py:465 +#: ../src\controller\mainController.py:1081 +#: ../src\controller\mainController.py:1100 +#: ../src\controller\mainController.py:1119 +#: ../src\controller\mainController.py:1138 msgid "" "No session is currently in focus. Focus a session with the next or previous " "session shortcut." @@ -295,134 +299,134 @@ msgstr "" "セッションが選択されていません。「次のセッション」または「前のセッション」の" "ショートカットを利用して、セッションを選択してください。" -#: ../src\controller\mainController.py:452 +#: ../src\controller\mainController.py:453 msgid "Empty buffer." msgstr "からのバッファ。" -#: ../src\controller\mainController.py:459 +#: ../src\controller\mainController.py:460 msgid "{0} not found." msgstr "{0}が見つかりませんでした。" -#: ../src\controller\mainController.py:469 +#: ../src\controller\mainController.py:470 msgid "Filters cannot be applied on this buffer" msgstr "このバッファにはフィルターを適応できません" -#: ../src\controller\mainController.py:522 -#: ../src\controller\mainController.py:539 -#: ../src\controller\mainController.py:568 +#: ../src\controller\mainController.py:523 +#: ../src\controller\mainController.py:540 +#: ../src\controller\mainController.py:569 msgid "Select the user" msgstr "ユーザーを選択" -#: ../src\controller\mainController.py:753 +#: ../src\controller\mainController.py:754 msgid "Add an user alias" msgstr "ユーザーエイリアスを追加" -#: ../src\controller\mainController.py:761 +#: ../src\controller\mainController.py:762 msgid "Alias has been set correctly for {}." msgstr "{}のエイリアスが正しく設定されています。" -#: ../src\controller\mainController.py:829 ../src\controller\messages.py:245 +#: ../src\controller\mainController.py:830 ../src\controller\messages.py:327 msgid "MMM D, YYYY. H:m" msgstr "YYYY年MMMMD日 H時m分" -#: ../src\controller\mainController.py:957 +#: ../src\controller\mainController.py:958 msgid "Conversation with {0}" msgstr "{0}との会話" -#: ../src\controller\mainController.py:998 -#: ../src\controller\mainController.py:1015 +#: ../src\controller\mainController.py:999 +#: ../src\controller\mainController.py:1016 msgid "There are no coordinates in this tweet" msgstr "このツイートに位置情報は存在しません" -#: ../src\controller\mainController.py:1000 -#: ../src\controller\mainController.py:1019 +#: ../src\controller\mainController.py:1001 +#: ../src\controller\mainController.py:1020 msgid "Error decoding coordinates. Try again later." msgstr "位置情報の取得に失敗しました。あとで再試行してください。" -#: ../src\controller\mainController.py:1004 +#: ../src\controller\mainController.py:1005 msgid "Unable to find address in OpenStreetMap." msgstr "OpenStreetMapでアドレスが見つかりません。" -#: ../src\controller\mainController.py:1017 +#: ../src\controller\mainController.py:1018 msgid "There are no results for the coordinates in this tweet" msgstr "このツイートの位置情報には、なにも含まれていません" -#: ../src\controller\mainController.py:1128 -#: ../src\controller\mainController.py:1147 +#: ../src\controller\mainController.py:1129 +#: ../src\controller\mainController.py:1148 msgid "%s, %s of %s" msgstr "%s %s/%s" -#: ../src\controller\mainController.py:1130 -#: ../src\controller\mainController.py:1149 -#: ../src\controller\mainController.py:1174 -#: ../src\controller\mainController.py:1199 +#: ../src\controller\mainController.py:1131 +#: ../src\controller\mainController.py:1150 +#: ../src\controller\mainController.py:1175 +#: ../src\controller\mainController.py:1200 msgid "%s. Empty" msgstr "%sは、からです" -#: ../src\controller\mainController.py:1162 -#: ../src\controller\mainController.py:1166 -#: ../src\controller\mainController.py:1187 +#: ../src\controller\mainController.py:1163 +#: ../src\controller\mainController.py:1167 +#: ../src\controller\mainController.py:1188 msgid "{0}: This account is not logged into Twitter." msgstr "{0}: このアカウントは、まだTwitterにログインしていません。" -#: ../src\controller\mainController.py:1172 -#: ../src\controller\mainController.py:1197 +#: ../src\controller\mainController.py:1173 +#: ../src\controller\mainController.py:1198 msgid "%s. %s, %s of %s" msgstr "セッション:%s %s %s/%s" -#: ../src\controller\mainController.py:1191 +#: ../src\controller\mainController.py:1192 msgid "{0}: This account is not logged into twitter." msgstr "{0}: このアカウントは、まだTwitterにログインしていません。" -#: ../src\controller\mainController.py:1416 +#: ../src\controller\mainController.py:1417 msgid "This list is already opened" msgstr "既に開かれています" -#: ../src\controller\mainController.py:1446 -#: ../src\controller\mainController.py:1462 +#: ../src\controller\mainController.py:1447 +#: ../src\controller\mainController.py:1463 msgid "" "An error happened while trying to connect to the server. Please try later." msgstr "" "サーバーへの接続中に、予期しないエラーが発生しました。あとで再試行してくださ" "い。" -#: ../src\controller\mainController.py:1498 +#: ../src\controller\mainController.py:1499 msgid "The auto-reading of new tweets is enabled for this buffer" msgstr "自動読み上げ 有効" -#: ../src\controller\mainController.py:1501 +#: ../src\controller\mainController.py:1502 msgid "The auto-reading of new tweets is disabled for this buffer" msgstr "自動読み上げ 無効" -#: ../src\controller\mainController.py:1508 +#: ../src\controller\mainController.py:1509 msgid "Session mute on" msgstr "このセッションのミュートを設定" -#: ../src\controller\mainController.py:1511 +#: ../src\controller\mainController.py:1512 msgid "Session mute off" msgstr "このセッションのミュートを解除" -#: ../src\controller\mainController.py:1519 +#: ../src\controller\mainController.py:1520 msgid "Buffer mute on" msgstr "このバッファのミュートを設定" -#: ../src\controller\mainController.py:1522 +#: ../src\controller\mainController.py:1523 msgid "Buffer mute off" msgstr "このバッファのミュートを解除" -#: ../src\controller\mainController.py:1545 +#: ../src\controller\mainController.py:1543 msgid "Copied" msgstr "コピーしました" -#: ../src\controller\mainController.py:1575 +#: ../src\controller\mainController.py:1573 msgid "Unable to update this buffer." msgstr "このバッファを更新できません。" -#: ../src\controller\mainController.py:1578 +#: ../src\controller\mainController.py:1576 msgid "Updating buffer..." msgstr "バッファを更新中…" -#: ../src\controller\mainController.py:1581 +#: ../src\controller\mainController.py:1579 msgid "{0} items retrieved" msgstr "{0}個のアイテムを取得しました" @@ -443,85 +447,83 @@ msgstr "画像を選択" msgid "Unable to extract text" msgstr "テキストを抽出できません" -#: ../src\controller\messages.py:56 +#: ../src\controller\messages.py:49 msgid "Translated" msgstr "翻訳完了" -#: ../src\controller\messages.py:63 -msgid "There's no URL to be shortened" -msgstr "短縮されたURLは、ありません" - -#: ../src\controller\messages.py:67 ../src\controller\messages.py:75 -msgid "URL shortened" -msgstr "URLを短縮しました" - -#: ../src\controller\messages.py:82 -msgid "There's no URL to be expanded" -msgstr "短縮を解除するURLはありません" - -#: ../src\controller\messages.py:86 ../src\controller\messages.py:94 -msgid "URL expanded" -msgstr "URLの短縮を解除しました" - -#: ../src\controller\messages.py:108 +#: ../src\controller\messages.py:56 msgid "%s - %s of %d characters" msgstr "%s - %s/%d" -#: ../src\controller\messages.py:112 -msgid "%s - %s characters" -msgstr "%s - %s文字" - -#: ../src\controller\messages.py:272 +#: ../src\controller\messages.py:354 msgid "View item" msgstr "アイテムを見る" -#: ../src\controller\messages.py:301 +#: ../src\controller\messages.py:380 msgid "Link copied to clipboard." msgstr "リンクをクリップボードへコピーしました。" -#: ../src\controller\settings.py:74 +#: ../src\controller\settings.py:76 msgid "HTTP" msgstr "HTTP" -#: ../src\controller\settings.py:74 +#: ../src\controller\settings.py:76 msgid "SOCKS v4" msgstr "SOCKS v4" -#: ../src\controller\settings.py:74 +#: ../src\controller\settings.py:76 msgid "SOCKS v4 with DNS support" msgstr "DNSをサポートする SOCKS v4" -#: ../src\controller\settings.py:74 +#: ../src\controller\settings.py:76 msgid "SOCKS v5" msgstr "SOCKS v5" -#: ../src\controller\settings.py:74 +#: ../src\controller\settings.py:76 msgid "SOCKS v5 with DNS support" msgstr "DNSをサポートする SOCKS v5" -#: ../src\controller\settings.py:74 +#: ../src\controller\settings.py:76 msgid "System default" msgstr "システムのデフォルト" -#: ../src\controller\settings.py:145 ../src\controller\settings.py:211 +#: ../src\controller\settings.py:152 ../src\controller\settings.py:265 #: ../src\wxUI\dialogs\configuration.py:116 msgid "Ask" msgstr "その都度、質問する" -#: ../src\controller\settings.py:147 ../src\controller\settings.py:213 +#: ../src\controller\settings.py:154 ../src\controller\settings.py:267 #: ../src\wxUI\dialogs\configuration.py:116 msgid "Retweet without comments" msgstr "コメントを付けずにリツイート(公式RT)" -#: ../src\controller\settings.py:149 ../src\wxUI\dialogs\configuration.py:116 +#: ../src\controller\settings.py:156 ../src\wxUI\dialogs\configuration.py:116 msgid "Retweet with comments" msgstr "コメントをつけてリツイート(非公式RT)" -#: ../src\controller\settings.py:185 +#: ../src\controller\settings.py:200 msgid "Account settings for %s" msgstr "%sのアカウント設定" -#: ../src\controller\settings.py:288 +#: ../src\controller\settings.py:210 ../src\wxUI\dialogs\configuration.py:240 +msgid "Edit template for tweets. Current template: {}" +msgstr "ツイートのテンプレートを編集します。現在のテンプレート: {}" + +#: ../src\controller\settings.py:219 ../src\wxUI\dialogs\configuration.py:242 +msgid "Edit template for direct messages. Current template: {}" +msgstr "ダイレクトメッセージのテンプレートを編集します。現在のテンプレート: {}" + +#: ../src\controller\settings.py:228 ../src\wxUI\dialogs\configuration.py:244 +msgid "Edit template for sent direct messages. Current template: {}" +msgstr "" +"送信済みのダイレクトメッセージのテンプレートを編集します。現在のテンプレー" +"ト: {}" + +#: ../src\controller\settings.py:237 ../src\wxUI\dialogs\configuration.py:246 +msgid "Edit template for persons. Current template: {}" +msgstr "人のテンプレートを編集します。現在のテンプレート: {}" + +#: ../src\controller\settings.py:325 msgid "Direct Messages" msgstr "ダイレクトメッセージ" @@ -538,6 +540,7 @@ msgstr "ダイレクトメッセージ" #: ../src\wxUI\commonMessageDialogs.py:83 #: ../src\wxUI\commonMessageDialogs.py:89 #: ../src\wxUI\commonMessageDialogs.py:92 +#: ../src\wxUI\commonMessageDialogs.py:95 msgid "Error" msgstr "エラー" @@ -666,7 +669,7 @@ msgstr "停止" msgid "&Record" msgstr "録音(&R)" -#: ../src\extra\AudioUploader\audioUploader.py:136 ../src\sound.py:148 +#: ../src\extra\AudioUploader\audioUploader.py:136 ../src\sound.py:147 msgid "Playing..." msgstr "再生中…" @@ -718,6 +721,9 @@ msgid "%s seconds" msgstr "%s秒" #: ../src\extra\AudioUploader\wx_transfer_dialogs.py:15 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:35 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:171 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:255 msgid "File" msgstr "ファイル" @@ -1388,8 +1394,8 @@ msgid "Target language" msgstr "翻訳先の言語" #: ../src\issueReporter\issueReporter.py:32 -#: ../src\wxUI\dialogs\configuration.py:359 -#: ../src\wxUI\dialogs\configuration.py:368 +#: ../src\wxUI\dialogs\configuration.py:373 +#: ../src\wxUI\dialogs\configuration.py:382 msgid "General" msgstr "一般" @@ -1483,7 +1489,7 @@ msgstr "" msgid "Send report" msgstr "レポートを送信" -#: ../src\issueReporter\wx_ui.py:75 ../src\wxUI\dialogs\filterDialogs.py:84 +#: ../src\issueReporter\wx_ui.py:75 ../src\wxUI\dialogs\filterDialogs.py:83 #: ../src\wxUI\dialogs\find.py:23 msgid "Cancel" msgstr "キャンセル" @@ -1557,7 +1563,7 @@ msgid "New tweet" msgstr "新規ツイート" #: ../src\keystrokeEditor\constants.py:12 ../src\wxUI\buffers\base.py:26 -#: ../src\wxUI\commonMessageDialogs.py:10 ../src\wxUI\dialogs\message.py:126 +#: ../src\wxUI\commonMessageDialogs.py:10 msgid "Retweet" msgstr "リツイート" @@ -1769,7 +1775,7 @@ msgstr "キーストローク" msgid "Action" msgstr "操作" -#: ../src\keystrokeEditor\wx_ui.py:18 ../src\wxUI\dialogs\filterDialogs.py:131 +#: ../src\keystrokeEditor\wx_ui.py:18 ../src\wxUI\dialogs\filterDialogs.py:135 #: ../src\wxUI\dialogs\lists.py:20 ../src\wxUI\dialogs\userAliasDialogs.py:53 msgid "Edit" msgstr "編集" @@ -1782,7 +1788,7 @@ msgstr "キーストロークの定義を解除" msgid "Execute action" msgstr "現在の動作を実行" -#: ../src\keystrokeEditor\wx_ui.py:22 ../src\wxUI\dialogs\configuration.py:396 +#: ../src\keystrokeEditor\wx_ui.py:22 ../src\wxUI\dialogs\configuration.py:414 #: ../src\wxUI\dialogs\userAliasDialogs.py:25 ../src\wxUI\dialogs\utils.py:39 msgid "Close" msgstr "閉じる" @@ -1819,7 +1825,7 @@ msgstr "ウィンドウズ" msgid "Key" msgstr "キー名" -#: ../src\keystrokeEditor\wx_ui.py:71 ../src\wxUI\dialogs\filterDialogs.py:82 +#: ../src\keystrokeEditor\wx_ui.py:71 ../src\wxUI\dialogs\filterDialogs.py:80 #: ../src\wxUI\dialogs\find.py:21 ../src\wxUI\dialogs\userAliasDialogs.py:23 #: ../src\wxUI\dialogs\utils.py:36 msgid "OK" @@ -1955,26 +1961,27 @@ msgstr "" "されます。このエラーが続く場合は、エラーログを {app} 開発者に送信してくださ" "い。" -#: ../src\sessions\twitter\compose.py:38 ../src\sessions\twitter\compose.py:81 -#: ../src\sessions\twitter\compose.py:146 -#: ../src\sessions\twitter\compose.py:155 +#: ../src\sessions\twitter\compose.py:25 ../src\sessions\twitter\compose.py:68 +#: ../src\sessions\twitter\compose.py:133 +#: ../src\sessions\twitter\compose.py:142 +#: ../src\sessions\twitter\templates.py:26 msgid "dddd, MMMM D, YYYY H:m:s" msgstr "YYYY年MMMMD日(dddd) H時m分s秒" -#: ../src\sessions\twitter\compose.py:89 ../src\sessions\twitter\compose.py:91 +#: ../src\sessions\twitter\compose.py:76 ../src\sessions\twitter\compose.py:78 msgid "Dm to %s " msgstr "「%s」へのDM " -#: ../src\sessions\twitter\compose.py:130 +#: ../src\sessions\twitter\compose.py:117 msgid "{0}. Quoted tweet from @{1}: {2}" msgstr "{0} 引用:@{1}:{2}" -#: ../src\sessions\twitter\compose.py:157 -#: ../src\sessions\twitter\compose.py:159 +#: ../src\sessions\twitter\compose.py:144 +#: ../src\sessions\twitter\compose.py:146 msgid "Unavailable" msgstr "無効" -#: ../src\sessions\twitter\compose.py:160 +#: ../src\sessions\twitter\compose.py:147 msgid "" "%s (@%s). %s followers, %s friends, %s tweets. Last tweeted %s. Joined " "Twitter %s" @@ -1982,44 +1989,70 @@ msgstr "" "%s: @%s フォロワー: %s フォロー: %s ツイート数: %s 最後のツイート: %s ツイッ" "ターへの参加: %s" -#: ../src\sessions\twitter\compose.py:164 +#: ../src\sessions\twitter\compose.py:151 msgid "No description available" msgstr "説明はありません" -#: ../src\sessions\twitter\compose.py:168 +#: ../src\sessions\twitter\compose.py:155 msgid "private" msgstr "プライベート" -#: ../src\sessions\twitter\compose.py:169 +#: ../src\sessions\twitter\compose.py:156 msgid "public" msgstr "公式" -#: ../src\sessions\twitter\session.py:209 +#: ../src\sessions\twitter\session.py:211 +#: ../src\sessions\twitter\session.py:238 msgid "%s failed. Reason: %s" msgstr "%s が失敗しました。理由: %s" -#: ../src\sessions\twitter\session.py:215 +#: ../src\sessions\twitter\session.py:217 +#: ../src\sessions\twitter\session.py:241 msgid "%s succeeded." msgstr "%sに成功しました。" -#: ../src\sessions\twitter\session.py:424 -#: ../src\sessions\twitter\session.py:502 +#: ../src\sessions\twitter\session.py:451 +#: ../src\sessions\twitter\session.py:529 msgid "Deleted account" msgstr "削除されたアカウント" -#: ../src\sessions\twitter\utils.py:231 +#: ../src\sessions\twitter\templates.py:16 +msgid "$display_name, $text $image_descriptions $date. $source" +msgstr "$display_name, $text $image_descriptions $date. $source" + +#: ../src\sessions\twitter\templates.py:17 +msgid "$sender_display_name, $text $date" +msgstr "$sender_display_name, $text $date" + +#: ../src\sessions\twitter\templates.py:18 +msgid "Dm to $recipient_display_name, $text $date" +msgstr "$recipient_display_name へのDM, $text $date" + +#: ../src\sessions\twitter\templates.py:19 +msgid "" +"$display_name (@$screen_name). $followers followers, $following following, " +"$tweets tweets. Joined Twitter $created_at." +msgstr "" +"$display_name (@$screen_name)。$followers フォロワー、$following フォロー" +"中、$tweets 件のツイート。Twitter への参加 $created_at。" + +#: ../src\sessions\twitter\templates.py:54 +msgid "Image description: {}." +msgstr "画像の説明: {}。" + +#: ../src\sessions\twitter\utils.py:243 msgid "Sorry, you are not authorised to see this status." msgstr "申し訳ありませんが、あなたはこのステータスを表示する権限がありません。" -#: ../src\sessions\twitter\utils.py:233 +#: ../src\sessions\twitter\utils.py:245 msgid "No status found with that ID" msgstr "そのIDのステータスが見つかりませんでした" -#: ../src\sessions\twitter\utils.py:235 +#: ../src\sessions\twitter\utils.py:247 msgid "Error {0}" msgstr "エラー {0}" -#: ../src\sessions\twitter\utils.py:262 +#: ../src\sessions\twitter\utils.py:274 msgid "{user_1}, {user_2} and {all_users} more: {text}" msgstr "{user_1}、{user_2}、ほか{all_users}ユーザー: {text}" @@ -2031,7 +2064,7 @@ msgstr "アカウントを連携中…" msgid "Enter your PIN code here" msgstr "PINコードを入力" -#: ../src\sound.py:161 +#: ../src\sound.py:160 msgid "Stopped." msgstr "停止。" @@ -2085,10 +2118,6 @@ msgstr "" msgid "Client" msgstr "クライアント" -#: ../src\wxUI\buffers\base.py:12 -msgid "Text" -msgstr "内容" - #: ../src\wxUI\buffers\base.py:12 ../src\wxUI\buffers\events.py:14 msgid "Date" msgstr "日時" @@ -2100,6 +2129,11 @@ msgstr "日時" msgid "User" msgstr "ユーザー" +#: ../src\wxUI\buffers\base.py:12 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:47 +msgid "Text" +msgstr "内容" + #: ../src\wxUI\buffers\base.py:28 msgid "Direct message" msgstr "ダイレクトメッセージ" @@ -2192,7 +2226,7 @@ msgid "Enter the name of the client : " msgstr "クライアントの名前: " #: ../src\wxUI\commonMessageDialogs.py:26 -#: ../src\wxUI\dialogs\configuration.py:246 +#: ../src\wxUI\dialogs\configuration.py:260 msgid "Add client" msgstr "クライアントを追加" @@ -2243,7 +2277,7 @@ msgstr "" "リシーにより更新されません。続行しますか?" #: ../src\wxUI\commonMessageDialogs.py:48 -#: ../src\wxUI\commonMessageDialogs.py:95 +#: ../src\wxUI\commonMessageDialogs.py:98 msgid "Warning" msgstr "警告" @@ -2349,6 +2383,10 @@ msgid "This filter already exists. Please use a different title" msgstr "このフィルターはすでに利用されています。別の名前を利用してください" #: ../src\wxUI\commonMessageDialogs.py:95 +msgid "The configuration file is invalid." +msgstr "設定ファイルが不正です。" + +#: ../src\wxUI\commonMessageDialogs.py:98 msgid "" "{0} quit unexpectedly the last time it was run. If the problem persists, " "please report it to the {0} developers." @@ -2356,55 +2394,6 @@ msgstr "" "{0}は、前回の実行時に予期せず終了しました。問題が解決しない場合は、{0}開発者" "に報告してください。" -#: ../src\wxUI\dialogs\attach.py:10 -msgid "Add an attachment" -msgstr "添付ファイルを追加" - -#: ../src\wxUI\dialogs\attach.py:13 -msgid "Attachments" -msgstr "添付ファイル" - -#: ../src\wxUI\dialogs\attach.py:14 -msgid "Title" -msgstr "タイトル" - -#: ../src\wxUI\dialogs\attach.py:14 -msgid "Type" -msgstr "形式" - -#: ../src\wxUI\dialogs\attach.py:19 -msgid "Add attachments" -msgstr "添付ファイルを追加" - -#: ../src\wxUI\dialogs\attach.py:20 -msgid "&Photo" -msgstr "画像(&P)" - -#: ../src\wxUI\dialogs\attach.py:21 -msgid "Remove attachment" -msgstr "添付ファイルを削除" - -#: ../src\wxUI\dialogs\attach.py:37 ../src\wxUI\dialogs\message.py:116 -#: ../src\wxUI\dialogs\message.py:175 ../src\wxUI\dialogs\message.py:235 -#: ../src\wxUI\dialogs\update_profile.py:82 -msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" -msgstr "画像ファイル (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" - -#: ../src\wxUI\dialogs\attach.py:37 ../src\wxUI\dialogs\message.py:116 -#: ../src\wxUI\dialogs\message.py:175 ../src\wxUI\dialogs\message.py:235 -#: ../src\wxUI\dialogs\update_profile.py:82 -msgid "Select the picture to be uploaded" -msgstr "アップロードする画像を選択" - -#: ../src\wxUI\dialogs\attach.py:44 -msgid "please provide a description" -msgstr "説明を入力" - -#: ../src\wxUI\dialogs\attach.py:44 ../src\wxUI\dialogs\lists.py:14 -#: ../src\wxUI\dialogs\lists.py:70 -msgid "Description" -msgstr "説明" - #: ../src\wxUI\dialogs\configuration.py:15 msgid "Language" msgstr "言語" @@ -2541,7 +2530,7 @@ msgid "Status" msgstr "ステータス" #: ../src\wxUI\dialogs\configuration.py:144 -#: ../src\wxUI\dialogs\filterDialogs.py:126 +#: ../src\wxUI\dialogs\filterDialogs.py:130 msgid "Buffer" msgstr "バッファ" @@ -2589,168 +2578,180 @@ msgstr "既にそのバッファは、リストの先頭です。" msgid "The buffer is already at the bottom of the list." msgstr "既にそのバッファは、リストの最後です。" -#: ../src\wxUI\dialogs\configuration.py:240 -#: ../src\wxUI\dialogs\configuration.py:381 +#: ../src\wxUI\dialogs\configuration.py:254 +#: ../src\wxUI\dialogs\configuration.py:395 msgid "Ignored clients" msgstr "無視するクライアント" -#: ../src\wxUI\dialogs\configuration.py:247 +#: ../src\wxUI\dialogs\configuration.py:261 msgid "Remove client" msgstr "クライアントを削除" -#: ../src\wxUI\dialogs\configuration.py:271 +#: ../src\wxUI\dialogs\configuration.py:285 msgid "Volume" msgstr "ボリューム" -#: ../src\wxUI\dialogs\configuration.py:282 +#: ../src\wxUI\dialogs\configuration.py:296 msgid "Session mute" msgstr "セッションのミュート" -#: ../src\wxUI\dialogs\configuration.py:284 +#: ../src\wxUI\dialogs\configuration.py:298 msgid "Output device" msgstr "出力先デバイス" -#: ../src\wxUI\dialogs\configuration.py:291 +#: ../src\wxUI\dialogs\configuration.py:305 msgid "Input device" msgstr "入力デバイス" -#: ../src\wxUI\dialogs\configuration.py:299 +#: ../src\wxUI\dialogs\configuration.py:313 msgid "Sound pack" msgstr "サウンドパック" -#: ../src\wxUI\dialogs\configuration.py:305 +#: ../src\wxUI\dialogs\configuration.py:319 msgid "Indicate audio tweets with sound" msgstr "音声付きツイートを音で報告" -#: ../src\wxUI\dialogs\configuration.py:307 +#: ../src\wxUI\dialogs\configuration.py:321 msgid "Indicate geotweets with sound" msgstr "位置情報付きツイートを音で報告" -#: ../src\wxUI\dialogs\configuration.py:309 +#: ../src\wxUI\dialogs\configuration.py:323 msgid "Indicate tweets containing images with sound" msgstr "画像付きツイートを音で報告" -#: ../src\wxUI\dialogs\configuration.py:332 +#: ../src\wxUI\dialogs\configuration.py:346 msgid "Language for OCR" msgstr "OCRの言語" -#: ../src\wxUI\dialogs\configuration.py:338 +#: ../src\wxUI\dialogs\configuration.py:352 msgid "API Key for SndUp" msgstr "SndUpのAPIキー" -#: ../src\wxUI\dialogs\configuration.py:353 +#: ../src\wxUI\dialogs\configuration.py:367 msgid "{0} preferences" msgstr "{0}の設定" -#: ../src\wxUI\dialogs\configuration.py:364 +#: ../src\wxUI\dialogs\configuration.py:378 msgid "Proxy" msgstr "プロキシ" -#: ../src\wxUI\dialogs\configuration.py:373 +#: ../src\wxUI\dialogs\configuration.py:387 msgid "Feedback" msgstr "フィードバック" -#: ../src\wxUI\dialogs\configuration.py:377 +#: ../src\wxUI\dialogs\configuration.py:391 msgid "Buffers" msgstr "バッファ" -#: ../src\wxUI\dialogs\configuration.py:385 +#: ../src\wxUI\dialogs\configuration.py:399 +msgid "Templates" +msgstr "テンプレート" + +#: ../src\wxUI\dialogs\configuration.py:403 msgid "Sound" msgstr "サウンド" -#: ../src\wxUI\dialogs\configuration.py:389 +#: ../src\wxUI\dialogs\configuration.py:407 msgid "Extras" msgstr "その他" -#: ../src\wxUI\dialogs\configuration.py:394 +#: ../src\wxUI\dialogs\configuration.py:412 msgid "Save" msgstr "保存" -#: ../src\wxUI\dialogs\filterDialogs.py:16 +#: ../src\wxUI\dialogs\filterDialogs.py:13 msgid "Create a filter for this buffer" msgstr "このバッファのフィルタを作成" -#: ../src\wxUI\dialogs\filterDialogs.py:17 +#: ../src\wxUI\dialogs\filterDialogs.py:14 msgid "Filter title" msgstr "フィルター名" -#: ../src\wxUI\dialogs\filterDialogs.py:26 -#: ../src\wxUI\dialogs\filterDialogs.py:126 +#: ../src\wxUI\dialogs\filterDialogs.py:24 +#: ../src\wxUI\dialogs\filterDialogs.py:130 msgid "Filter by word" msgstr "単語でフィルター" -#: ../src\wxUI\dialogs\filterDialogs.py:27 +#: ../src\wxUI\dialogs\filterDialogs.py:25 msgid "Ignore tweets wich contain the following word" msgstr "次の単語が含まれるツイートを無視する" -#: ../src\wxUI\dialogs\filterDialogs.py:28 +#: ../src\wxUI\dialogs\filterDialogs.py:26 msgid "Ignore tweets without the following word" msgstr "次の単語が含まれないツイートを無視する" -#: ../src\wxUI\dialogs\filterDialogs.py:33 +#: ../src\wxUI\dialogs\filterDialogs.py:31 msgid "word" msgstr "単語" -#: ../src\wxUI\dialogs\filterDialogs.py:38 +#: ../src\wxUI\dialogs\filterDialogs.py:36 msgid "Allow retweets" msgstr "リツイートを許可する" -#: ../src\wxUI\dialogs\filterDialogs.py:39 +#: ../src\wxUI\dialogs\filterDialogs.py:37 msgid "Allow quoted tweets" msgstr "引用ツイートを許可する" -#: ../src\wxUI\dialogs\filterDialogs.py:40 +#: ../src\wxUI\dialogs\filterDialogs.py:38 msgid "Allow replies" msgstr "リプライを許可するフォロワー一覧" -#: ../src\wxUI\dialogs\filterDialogs.py:48 +#: ../src\wxUI\dialogs\filterDialogs.py:46 msgid "Use this term as a regular expression" msgstr "正規表現を利用" -#: ../src\wxUI\dialogs\filterDialogs.py:50 -#: ../src\wxUI\dialogs\filterDialogs.py:126 +#: ../src\wxUI\dialogs\filterDialogs.py:48 +#: ../src\wxUI\dialogs\filterDialogs.py:130 msgid "Filter by language" msgstr "言語でフィルター" -#: ../src\wxUI\dialogs\filterDialogs.py:51 +#: ../src\wxUI\dialogs\filterDialogs.py:49 msgid "Load tweets in the following languages" msgstr "下記の言語のツイートを表示" -#: ../src\wxUI\dialogs\filterDialogs.py:52 +#: ../src\wxUI\dialogs\filterDialogs.py:50 msgid "Ignore tweets in the following languages" msgstr "下記の言語のツイートを無視する" -#: ../src\wxUI\dialogs\filterDialogs.py:53 +#: ../src\wxUI\dialogs\filterDialogs.py:51 msgid "Don't filter by language" msgstr "言語でフィルタしない" -#: ../src\wxUI\dialogs\filterDialogs.py:64 +#: ../src\wxUI\dialogs\filterDialogs.py:62 msgid "Supported languages" msgstr "サポートしている言語" -#: ../src\wxUI\dialogs\filterDialogs.py:69 +#: ../src\wxUI\dialogs\filterDialogs.py:67 msgid "Add selected language to filter" msgstr "選択した言語をフィルターに追加" -#: ../src\wxUI\dialogs\filterDialogs.py:73 +#: ../src\wxUI\dialogs\filterDialogs.py:71 msgid "Selected languages" msgstr "選択した言語" -#: ../src\wxUI\dialogs\filterDialogs.py:75 -#: ../src\wxUI\dialogs\filterDialogs.py:133 ../src\wxUI\dialogs\lists.py:21 +#: ../src\wxUI\dialogs\filterDialogs.py:73 +#: ../src\wxUI\dialogs\filterDialogs.py:137 ../src\wxUI\dialogs\lists.py:21 #: ../src\wxUI\dialogs\lists.py:132 ../src\wxUI\dialogs\userAliasDialogs.py:57 msgid "Remove" msgstr "削除" -#: ../src\wxUI\dialogs\filterDialogs.py:123 +#: ../src\wxUI\dialogs\filterDialogs.py:120 +msgid "Missing filter name" +msgstr "フィルター名がありません" + +#: ../src\wxUI\dialogs\filterDialogs.py:120 +msgid "You must define a name for the filter before creating it." +msgstr "フィルターを作成する前に、フィルターの名前を定義する必要があります。" + +#: ../src\wxUI\dialogs\filterDialogs.py:127 msgid "Manage filters" msgstr "フィルターの管理" -#: ../src\wxUI\dialogs\filterDialogs.py:125 +#: ../src\wxUI\dialogs\filterDialogs.py:129 msgid "Filters" msgstr "フィルター" -#: ../src\wxUI\dialogs\filterDialogs.py:126 +#: ../src\wxUI\dialogs\filterDialogs.py:130 msgid "Filter" msgstr "フィルター" @@ -2782,6 +2783,14 @@ msgstr "所有者" msgid "mode" msgstr "モード" +#: ../src\wxUI\dialogs\lists.py:14 ../src\wxUI\dialogs\lists.py:70 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:37 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:126 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:173 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:257 +msgid "Description" +msgstr "説明" + #: ../src\wxUI\dialogs\lists.py:19 ../src\wxUI\dialogs\lists.py:62 msgid "Create a new list" msgstr "新しいリストを作成" @@ -2838,103 +2847,6 @@ msgstr "ユーザーを削除するには、リストを選択" msgid "Do you really want to delete this list?" msgstr "本当に、このリストを削除しますか?" -#: ../src\wxUI\dialogs\message.py:73 ../src\wxUI\dialogs\message.py:254 -msgid "&Long tweet" -msgstr "ツイートを短縮して投稿(&L)" - -#: ../src\wxUI\dialogs\message.py:74 ../src\wxUI\dialogs\message.py:133 -#: ../src\wxUI\dialogs\message.py:255 -msgid "&Upload image..." -msgstr "画像をアップロード(&U)" - -#: ../src\wxUI\dialogs\message.py:75 ../src\wxUI\dialogs\message.py:134 -#: ../src\wxUI\dialogs\message.py:194 ../src\wxUI\dialogs\message.py:256 -#: ../src\wxUI\dialogs\message.py:359 ../src\wxUI\dialogs\message.py:435 -msgid "Check &spelling..." -msgstr "スペルチェック(&S)" - -#: ../src\wxUI\dialogs\message.py:76 ../src\wxUI\dialogs\message.py:135 -#: ../src\wxUI\dialogs\message.py:195 ../src\wxUI\dialogs\message.py:257 -msgid "&Attach audio..." -msgstr "音声を添付(&A)" - -#: ../src\wxUI\dialogs\message.py:77 ../src\wxUI\dialogs\message.py:136 -#: ../src\wxUI\dialogs\message.py:196 ../src\wxUI\dialogs\message.py:258 -msgid "Sh&orten URL" -msgstr "URLを短縮(&O)" - -#: ../src\wxUI\dialogs\message.py:78 ../src\wxUI\dialogs\message.py:137 -#: ../src\wxUI\dialogs\message.py:197 ../src\wxUI\dialogs\message.py:259 -#: ../src\wxUI\dialogs\message.py:360 ../src\wxUI\dialogs\message.py:436 -msgid "&Expand URL" -msgstr "URLを元に戻す(&E)" - -#: ../src\wxUI\dialogs\message.py:81 ../src\wxUI\dialogs\message.py:140 -#: ../src\wxUI\dialogs\message.py:200 ../src\wxUI\dialogs\message.py:262 -#: ../src\wxUI\dialogs\message.py:362 ../src\wxUI\dialogs\message.py:438 -msgid "&Translate..." -msgstr "翻訳(&T)..." - -#: ../src\wxUI\dialogs\message.py:82 ../src\wxUI\dialogs\message.py:141 -#: ../src\wxUI\dialogs\message.py:186 ../src\wxUI\dialogs\message.py:263 -msgid "Auto&complete users" -msgstr "ユーザーを自動保管(&C)" - -#: ../src\wxUI\dialogs\message.py:83 ../src\wxUI\dialogs\message.py:142 -#: ../src\wxUI\dialogs\message.py:201 ../src\wxUI\dialogs\message.py:264 -msgid "Sen&d" -msgstr "送信(&D)" - -#: ../src\wxUI\dialogs\message.py:85 ../src\wxUI\dialogs\message.py:144 -#: ../src\wxUI\dialogs\message.py:203 ../src\wxUI\dialogs\message.py:266 -#: ../src\wxUI\dialogs\message.py:363 ../src\wxUI\dialogs\message.py:439 -msgid "C&lose" -msgstr "閉じる(&C)" - -#: ../src\wxUI\dialogs\message.py:184 -msgid "&Recipient" -msgstr "送信先(&R)" - -#: ../src\wxUI\dialogs\message.py:245 -msgid "&Mention to all" -msgstr "全員にリプライ(&M)" - -#: ../src\wxUI\dialogs\message.py:299 -msgid "Tweet - %i characters " -msgstr "ツイート - %i文字" - -#: ../src\wxUI\dialogs\message.py:316 -msgid "Image description" -msgstr "画像の説明" - -#: ../src\wxUI\dialogs\message.py:327 -msgid "Retweets: " -msgstr "リツイート: " - -#: ../src\wxUI\dialogs\message.py:332 -msgid "Likes: " -msgstr "いいね: " - -#: ../src\wxUI\dialogs\message.py:337 -msgid "Source: " -msgstr "ソース: " - -#: ../src\wxUI\dialogs\message.py:342 ../src\wxUI\dialogs\message.py:423 -msgid "Date: " -msgstr "日付: " - -#: ../src\wxUI\dialogs\message.py:357 ../src\wxUI\dialogs\message.py:433 -msgid "Copy link to clipboard" -msgstr "リンクをクリップボードへコピー" - -#: ../src\wxUI\dialogs\message.py:408 -msgid "View" -msgstr "ツイート" - -#: ../src\wxUI\dialogs\message.py:410 -msgid "Item" -msgstr "アイテム" - #: ../src\wxUI\dialogs\search.py:12 msgid "Search on Twitter" msgstr "ツイッターを検索" @@ -3016,6 +2928,260 @@ msgstr "都市" msgid "&Location" msgstr "場所(&L)" +#: ../src\wxUI\dialogs\twitterDialogs\templateDialogs.py:8 +msgid "Edit Template" +msgstr "テンプレートを編集" + +#: ../src\wxUI\dialogs\twitterDialogs\templateDialogs.py:13 +msgid "Edit template" +msgstr "テンプレートを編集" + +#: ../src\wxUI\dialogs\twitterDialogs\templateDialogs.py:17 +msgid "Available variables" +msgstr "使用可能な変数" + +#: ../src\wxUI\dialogs\twitterDialogs\templateDialogs.py:29 +msgid "Restore template" +msgstr "テンプレートを復元" + +#: ../src\wxUI\dialogs\twitterDialogs\templateDialogs.py:48 +msgid "Restored template to {}." +msgstr "テンプレートを {} に復元しました。" + +#: ../src\wxUI\dialogs\twitterDialogs\templateDialogs.py:52 +msgid "Invalid template" +msgstr "無効なテンプレート" + +#: ../src\wxUI\dialogs\twitterDialogs\templateDialogs.py:52 +msgid "" +"the template you have specified include variables that do not exists for the " +"object. Please fix the template and try again. For your reference, you can " +"see a list of all available variables in the variables list while editing " +"your template." +msgstr "" +"指定したテンプレートには、オブジェクトに存在しない変数が含まれています。テン" +"プレートを修正して、再試行してください。参考までに、テンプレートの編集中に、" +"変数リストで使用可能なすべての変数のリストを確認できます。" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:32 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:48 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:168 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:252 +msgid "Attachments" +msgstr "添付ファイル" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:36 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:172 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:256 +msgid "Type" +msgstr "形式" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:39 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:175 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:259 +msgid "Delete attachment" +msgstr "添付ファイルを削除" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:44 +msgid "Added Tweets" +msgstr "ツイートを追加" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:51 +msgid "Delete tweet" +msgstr "ツイートを削除" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:56 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:190 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:264 +msgid "A&dd..." +msgstr "追加(&D)" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:58 +msgid "Add t&weet" +msgstr "ツイートを追加(&W)" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:61 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:192 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:266 +msgid "&Attach audio..." +msgstr "音声を添付(&A)" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:65 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:196 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:235 +msgid "Auto&complete users" +msgstr "ユーザーを自動保管(&C)" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:67 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:198 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:270 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:364 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:437 +msgid "Check &spelling..." +msgstr "スペルチェック(&S)" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:69 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:200 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:272 +msgid "&Translate" +msgstr "翻訳(&T)" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:73 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:204 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:276 +msgid "Sen&d" +msgstr "送信(&D)" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:117 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:218 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:296 +msgid "Image" +msgstr "画像" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:119 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:220 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:298 +msgid "Video" +msgstr "動画" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:121 +msgid "Poll" +msgstr "投票" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:126 +msgid "please provide a description" +msgstr "説明を入力" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:133 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:289 +#: ../src\wxUI\dialogs\update_profile.py:82 +msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" +msgstr "画像ファイル (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:133 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:289 +#: ../src\wxUI\dialogs\update_profile.py:82 +msgid "Select the picture to be uploaded" +msgstr "アップロードする画像を選択" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:140 +msgid "Select the video to be uploaded" +msgstr "アップロードする動画を選択" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:140 +msgid "Video files (*.mp4)|*.mp4" +msgstr "動画ファイル (*.mp4)|*.mp4" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:146 +msgid "Error adding attachment" +msgstr "添付ファイルの追加中にエラーが発生しました" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:146 +msgid "" +"It is not possible to add more attachments. Please make sure your tweet " +"complies with Twitter'S attachment rules. You can add only one video or GIF " +"in every tweet, and a maximum of 4 photos." +msgstr "" +"これ以上添付ファイルを追加することはできません。ツイートがTwitterの添付ルール" +"に準拠していることを確認してください。すべてのツイートに追加できるビデオまた" +"はGIFは1つだけで、最大4枚の写真を追加できます。" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:180 +msgid "&Mention to all" +msgstr "全員にリプライ(&M)" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:233 +msgid "&Recipient" +msgstr "送信先(&R)" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:304 +msgid "Tweet - %i characters " +msgstr "ツイート - %i文字" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:321 +msgid "Image description" +msgstr "画像の説明" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:332 +msgid "Retweets: " +msgstr "リツイート: " + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:337 +msgid "Likes: " +msgstr "いいね: " + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:342 +msgid "Source: " +msgstr "ソース: " + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:347 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:425 +msgid "Date: " +msgstr "日付: " + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:362 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:435 +msgid "Copy link to clipboard" +msgstr "リンクをクリップボードへコピー" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:365 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:440 +msgid "&Translate..." +msgstr "翻訳(&T)..." + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:366 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:441 +msgid "C&lose" +msgstr "閉じる(&C)" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:410 +msgid "View" +msgstr "ツイート" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:412 +msgid "Item" +msgstr "アイテム" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:438 +msgid "&Expand URL" +msgstr "URLを元に戻す(&E)" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:477 +msgid "Add a poll" +msgstr "投票を追加" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:481 +msgid "Participation time (in days)" +msgstr "投票期間(日数)" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:488 +msgid "Choices" +msgstr "選択肢" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:492 +msgid "Option 1" +msgstr "オプション1" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:499 +msgid "Option 2" +msgstr "オプション2" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:506 +msgid "Option 3" +msgstr "オプション3" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:513 +msgid "Option 4" +msgstr "オプション4" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:541 +msgid "Not enough information" +msgstr "十分な情報がありません" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:541 +msgid "Please make sure you have provided at least two options for the poll." +msgstr "投票に少なくとも2つのオプションを提供していることを確認してください。" + #: ../src\wxUI\dialogs\update_profile.py:10 msgid "Update your profile" msgstr "プロフィールを更新" diff --git a/src/locales/sr/LC_MESSAGES/twblue.mo b/src/locales/sr/LC_MESSAGES/twblue.mo index 7701f9b1..4406f6ca 100644 Binary files a/src/locales/sr/LC_MESSAGES/twblue.mo and b/src/locales/sr/LC_MESSAGES/twblue.mo differ diff --git a/src/locales/sr/LC_MESSAGES/twblue.po b/src/locales/sr/LC_MESSAGES/twblue.po index af9ba210..79d3e91d 100644 --- a/src/locales/sr/LC_MESSAGES/twblue.po +++ b/src/locales/sr/LC_MESSAGES/twblue.po @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: TwBlue 0.80\n" -"POT-Creation-Date: 2021-10-28 16:43+Central Europe Daylight Time\n" -"PO-Revision-Date: 2021-10-28 17:03+0100\n" +"POT-Creation-Date: 2021-11-11 01:16+0100\n" +"PO-Revision-Date: 2021-11-11 01:30+0100\n" "Last-Translator: Nikola Jović \n" "Language-Team: Aleksandar Đurić \n" "Language: sr_RS@latin\n" @@ -18,10 +18,6 @@ msgstr "" "X-Poedit-Bookmarks: -1,442,-1,-1,-1,-1,-1,-1,-1,-1\n" "X-Poedit-SourceCharset: UTF-8\n" -#: ../src\controller\attach.py:25 -msgid "Photo" -msgstr "Slika" - #: ../src\controller\buffers\base\base.py:91 msgid "This action is not supported for this buffer" msgstr "Ova radnja nije podržana na ovom kanalu" @@ -100,101 +96,104 @@ msgstr "Prijatelji korisnika {username}" msgid "Unknown buffer" msgstr "Nepoznat kanal" -#: ../src\controller\buffers\twitter\base.py:88 -#: ../src\controller\buffers\twitter\trends.py:121 -#: ../src\controller\messages.py:214 ../src\wxUI\buffers\base.py:25 +#: ../src\controller\buffers\twitter\base.py:87 +#: ../src\controller\buffers\twitter\trends.py:43 +#: ../src\controller\buffers\twitter\trends.py:134 +#: ../src\controller\messages.py:296 ../src\wxUI\buffers\base.py:25 #: ../src\wxUI\buffers\events.py:15 ../src\wxUI\buffers\trends.py:18 -#: ../src\wxUI\dialogs\message.py:304 ../src\wxUI\sysTrayIcon.py:35 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:312 +#: ../src\wxUI\sysTrayIcon.py:35 msgid "Tweet" msgstr "Tvit" -#: ../src\controller\buffers\twitter\base.py:89 -#: ../src\controller\buffers\twitter\trends.py:122 +#: ../src\controller\buffers\twitter\base.py:88 +#: ../src\controller\buffers\twitter\trends.py:44 +#: ../src\controller\buffers\twitter\trends.py:135 msgid "Write the tweet here" msgstr "Otkucajte tvit ovde:" -#: ../src\controller\buffers\twitter\base.py:219 +#: ../src\controller\buffers\twitter\base.py:192 msgid "New tweet in {0}" msgstr "Novi tvit u kanalu {0}" -#: ../src\controller\buffers\twitter\base.py:222 +#: ../src\controller\buffers\twitter\base.py:195 msgid "{0} new tweets in {1}." msgstr "{0} novih tvitova u kanalu {1}." -#: ../src\controller\buffers\twitter\base.py:261 -#: ../src\controller\buffers\twitter\directMessages.py:87 -#: ../src\controller\buffers\twitter\people.py:180 +#: ../src\controller\buffers\twitter\base.py:234 +#: ../src\controller\buffers\twitter\directMessages.py:88 +#: ../src\controller\buffers\twitter\people.py:174 msgid "%s items retrieved" msgstr "%s primljenih stavki" -#: ../src\controller\buffers\twitter\base.py:293 +#: ../src\controller\buffers\twitter\base.py:266 #: ../src\controller\buffers\twitter\people.py:80 msgid "This buffer is not a timeline; it can't be deleted." msgstr "Ovaj kanal nije vremenska linija i ne može biti izbrisan." -#: ../src\controller\buffers\twitter\base.py:430 +#: ../src\controller\buffers\twitter\base.py:402 msgid "Reply to {arg0}" msgstr "Odgovori {arg0}" -#: ../src\controller\buffers\twitter\base.py:432 +#: ../src\controller\buffers\twitter\base.py:404 #: ../src\keystrokeEditor\constants.py:11 ../src\wxUI\buffers\base.py:27 msgid "Reply" msgstr "Odgovori" -#: ../src\controller\buffers\twitter\base.py:433 +#: ../src\controller\buffers\twitter\base.py:405 msgid "Reply to %s" msgstr "Odgovori %s" -#: ../src\controller\buffers\twitter\base.py:480 -#: ../src\controller\buffers\twitter\directMessages.py:129 +#: ../src\controller\buffers\twitter\base.py:428 +#: ../src\controller\buffers\twitter\directMessages.py:124 msgid "New direct message" msgstr "Nova direktna poruka" -#: ../src\controller\buffers\twitter\base.py:480 -#: ../src\controller\messages.py:200 +#: ../src\controller\buffers\twitter\base.py:428 +#: ../src\controller\messages.py:268 msgid "Direct message to %s" msgstr "Direktna poruka za %s" -#: ../src\controller\buffers\twitter\base.py:520 +#: ../src\controller\buffers\twitter\base.py:459 msgid "Add your comment to the tweet" msgstr "Dodajte vaš komentar u tvit" -#: ../src\controller\buffers\twitter\base.py:520 +#: ../src\controller\buffers\twitter\base.py:459 msgid "Quote" msgstr "Citiraj" -#: ../src\controller\buffers\twitter\base.py:596 +#: ../src\controller\buffers\twitter\base.py:520 msgid "Opening URL..." msgstr "Otvaram vezu..." -#: ../src\controller\buffers\twitter\base.py:633 +#: ../src\controller\buffers\twitter\base.py:557 msgid "User details" msgstr "Podaci o korisniku" -#: ../src\controller\buffers\twitter\base.py:654 +#: ../src\controller\buffers\twitter\base.py:578 msgid "Opening item in web browser..." msgstr "Otvaram stavku u Web pretraživaču..." -#: ../src\controller\buffers\twitter\directMessages.py:92 +#: ../src\controller\buffers\twitter\directMessages.py:93 #: ../src\controller\buffers\twitter\people.py:95 msgid "Mention to %s" msgstr "Spomeni %s" -#: ../src\controller\buffers\twitter\directMessages.py:92 +#: ../src\controller\buffers\twitter\directMessages.py:93 #: ../src\controller\buffers\twitter\people.py:95 #: ../src\wxUI\buffers\people.py:17 msgid "Mention" msgstr "Spomeni" -#: ../src\controller\buffers\twitter\directMessages.py:132 +#: ../src\controller\buffers\twitter\directMessages.py:127 msgid "{0} new direct messages." msgstr "{0} novih direktnih poruka." -#: ../src\controller\buffers\twitter\directMessages.py:135 +#: ../src\controller\buffers\twitter\directMessages.py:130 msgid "This action is not supported in the buffer yet." msgstr "Ova radnja još uvek nije podržana na ovom kanalu." -#: ../src\controller\buffers\twitter\directMessages.py:145 +#: ../src\controller\buffers\twitter\directMessages.py:140 msgid "" "Getting more items cannot be done in this buffer. Use the direct messages " "buffer instead." @@ -202,11 +201,11 @@ msgstr "" "Nemoguće preuzeti dodatne stavke za ovaj kanal. Umesto toga, koristite kanal " "direktne poruke." -#: ../src\controller\buffers\twitter\people.py:253 +#: ../src\controller\buffers\twitter\people.py:247 msgid "{0} new followers." msgstr "{0} novih pratilaca." -#: ../src\controller\buffers\twitter\trends.py:145 +#: ../src\controller\buffers\twitter\trends.py:150 msgid "This action is not supported in the buffer, yet." msgstr "Ova radnja još uvek nije podržana na ovom kanalu" @@ -224,7 +223,7 @@ msgstr "Vremenske linije" #: ../src\controller\mainController.py:359 #: ../src\controller\mainController.py:883 -#: ../src\controller\mainController.py:1585 +#: ../src\controller\mainController.py:1582 msgid "Timeline for {}" msgstr "Vremenska linija od {}" @@ -234,7 +233,7 @@ msgstr "Vremenska linija omiljenih tvitova" #: ../src\controller\mainController.py:363 #: ../src\controller\mainController.py:902 -#: ../src\controller\mainController.py:1587 +#: ../src\controller\mainController.py:1584 msgid "Likes for {}" msgstr "Sviđanja od {}" @@ -244,7 +243,7 @@ msgstr "Vremenske linije pratilaca" #: ../src\controller\mainController.py:367 #: ../src\controller\mainController.py:921 -#: ../src\controller\mainController.py:1589 +#: ../src\controller\mainController.py:1586 msgid "Followers for {}" msgstr "Pratioci od {}" @@ -254,7 +253,7 @@ msgstr "Vremenske linije praćenih korisnika" #: ../src\controller\mainController.py:371 #: ../src\controller\mainController.py:940 -#: ../src\controller\mainController.py:1591 +#: ../src\controller\mainController.py:1588 msgid "Friends for {}" msgstr "Prijatelji od {}" @@ -279,6 +278,7 @@ msgstr "Pretraga za {}" #: ../src\controller\mainController.py:381 #: ../src\controller\mainController.py:982 +#: ../src\controller\mainController.py:1590 msgid "Trending topics for %s" msgstr "Teme u trendu za %s" @@ -321,7 +321,7 @@ msgstr "Dodaj nadimak za korisnika" msgid "Alias has been set correctly for {}." msgstr "Nadimak za {} je uspešno podešen." -#: ../src\controller\mainController.py:829 ../src\controller\messages.py:245 +#: ../src\controller\mainController.py:829 ../src\controller\messages.py:327 msgid "MMM D, YYYY. H:m" msgstr "MMM D, YYYY. H:m" @@ -410,72 +410,52 @@ msgstr "Utišavanje kanala uključeno" msgid "Buffer mute off" msgstr "Utišavanje kanala isključeno" -#: ../src\controller\mainController.py:1545 +#: ../src\controller\mainController.py:1542 msgid "Copied" msgstr "Kopirano" -#: ../src\controller\mainController.py:1575 +#: ../src\controller\mainController.py:1572 msgid "Unable to update this buffer." msgstr "Ne mogu da ažuriram ovaj kanal." -#: ../src\controller\mainController.py:1578 +#: ../src\controller\mainController.py:1575 msgid "Updating buffer..." msgstr "Ažuriram kanal..." -#: ../src\controller\mainController.py:1581 +#: ../src\controller\mainController.py:1578 msgid "{0} items retrieved" msgstr "{0} primljenih stavki" -#: ../src\controller\mainController.py:1598 -#: ../src\controller\mainController.py:1618 +#: ../src\controller\mainController.py:1597 +#: ../src\controller\mainController.py:1617 msgid "Invalid buffer" msgstr "Nevažeći kanal" -#: ../src\controller\mainController.py:1609 +#: ../src\controller\mainController.py:1608 msgid "Picture {0}" msgstr "Slika {0}" -#: ../src\controller\mainController.py:1610 +#: ../src\controller\mainController.py:1609 msgid "Select the picture" msgstr "Izaberite sliku" -#: ../src\controller\mainController.py:1629 +#: ../src\controller\mainController.py:1628 msgid "Unable to extract text" msgstr "Ne mogu da izdvojim tekst." -#: ../src\controller\messages.py:56 +#: ../src\controller\messages.py:49 msgid "Translated" msgstr "Prevedeno" -#: ../src\controller\messages.py:63 -msgid "There's no URL to be shortened" -msgstr "Nema veze koja bi mogla biti skraćena" - -#: ../src\controller\messages.py:67 ../src\controller\messages.py:75 -msgid "URL shortened" -msgstr "Veza je skraćena" - -#: ../src\controller\messages.py:82 -msgid "There's no URL to be expanded" -msgstr "Nema veze koja bi mogla biti proširena" - -#: ../src\controller\messages.py:86 ../src\controller\messages.py:94 -msgid "URL expanded" -msgstr "Veza je proširena" - -#: ../src\controller\messages.py:108 +#: ../src\controller\messages.py:56 msgid "%s - %s of %d characters" msgstr "%s - %s od %d znakova" -#: ../src\controller\messages.py:112 -msgid "%s - %s characters" -msgstr "%s - %s znakova" - -#: ../src\controller\messages.py:272 +#: ../src\controller\messages.py:354 msgid "View item" msgstr "Prikaži stavku" -#: ../src\controller\messages.py:301 +#: ../src\controller\messages.py:379 msgid "Link copied to clipboard." msgstr "Link kopiran u privremenu memoriju." @@ -667,7 +647,7 @@ msgstr "Zaustavljeno" msgid "&Record" msgstr "&Snimi" -#: ../src\extra\AudioUploader\audioUploader.py:136 ../src\sound.py:148 +#: ../src\extra\AudioUploader\audioUploader.py:136 ../src\sound.py:147 msgid "Playing..." msgstr "Reprodukujem..." @@ -719,6 +699,9 @@ msgid "%s seconds" msgstr "%s sekundi" #: ../src\extra\AudioUploader\wx_transfer_dialogs.py:15 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:36 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:173 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:258 msgid "File" msgstr "Datoteka" @@ -1486,7 +1469,7 @@ msgstr "" msgid "Send report" msgstr "Pošalji izveštaj" -#: ../src\issueReporter\wx_ui.py:75 ../src\wxUI\dialogs\filterDialogs.py:84 +#: ../src\issueReporter\wx_ui.py:75 ../src\wxUI\dialogs\filterDialogs.py:83 #: ../src\wxUI\dialogs\find.py:23 msgid "Cancel" msgstr "Otkaži" @@ -1560,7 +1543,7 @@ msgid "New tweet" msgstr "Novi tvit" #: ../src\keystrokeEditor\constants.py:12 ../src\wxUI\buffers\base.py:26 -#: ../src\wxUI\commonMessageDialogs.py:10 ../src\wxUI\dialogs\message.py:126 +#: ../src\wxUI\commonMessageDialogs.py:10 msgid "Retweet" msgstr "Retvituj" @@ -1773,7 +1756,7 @@ msgstr "Prečica" msgid "Action" msgstr "Radnja" -#: ../src\keystrokeEditor\wx_ui.py:18 ../src\wxUI\dialogs\filterDialogs.py:131 +#: ../src\keystrokeEditor\wx_ui.py:18 ../src\wxUI\dialogs\filterDialogs.py:135 #: ../src\wxUI\dialogs\lists.py:20 ../src\wxUI\dialogs\userAliasDialogs.py:53 msgid "Edit" msgstr "Izmeni" @@ -1823,7 +1806,7 @@ msgstr "Windows" msgid "Key" msgstr "Taster" -#: ../src\keystrokeEditor\wx_ui.py:71 ../src\wxUI\dialogs\filterDialogs.py:82 +#: ../src\keystrokeEditor\wx_ui.py:71 ../src\wxUI\dialogs\filterDialogs.py:80 #: ../src\wxUI\dialogs\find.py:21 ../src\wxUI\dialogs\userAliasDialogs.py:23 #: ../src\wxUI\dialogs\utils.py:36 msgid "OK" @@ -1999,16 +1982,18 @@ msgstr "Privatno" msgid "public" msgstr "Javno" -#: ../src\sessions\twitter\session.py:209 +#: ../src\sessions\twitter\session.py:211 +#: ../src\sessions\twitter\session.py:238 msgid "%s failed. Reason: %s" msgstr "%s nije uspelo. Razlog: %s" -#: ../src\sessions\twitter\session.py:215 +#: ../src\sessions\twitter\session.py:217 +#: ../src\sessions\twitter\session.py:241 msgid "%s succeeded." msgstr "%s uspelo." -#: ../src\sessions\twitter\session.py:424 -#: ../src\sessions\twitter\session.py:502 +#: ../src\sessions\twitter\session.py:450 +#: ../src\sessions\twitter\session.py:528 msgid "Deleted account" msgstr "Obrisan nalog" @@ -2036,7 +2021,7 @@ msgstr "Autorizacija naloga..." msgid "Enter your PIN code here" msgstr "Ovde upišite vaš PIN kod" -#: ../src\sound.py:161 +#: ../src\sound.py:160 msgid "Stopped." msgstr "Zaustavljeno" @@ -2088,10 +2073,6 @@ msgstr "" msgid "Client" msgstr "Klijent" -#: ../src\wxUI\buffers\base.py:12 -msgid "Text" -msgstr "Tekst" - #: ../src\wxUI\buffers\base.py:12 ../src\wxUI\buffers\events.py:14 msgid "Date" msgstr "Datum" @@ -2103,6 +2084,11 @@ msgstr "Datum" msgid "User" msgstr "Korisnik" +#: ../src\wxUI\buffers\base.py:12 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:48 +msgid "Text" +msgstr "Tekst" + #: ../src\wxUI\buffers\base.py:28 msgid "Direct message" msgstr "Direktna poruka" @@ -2359,55 +2345,6 @@ msgstr "" "{0} je neočekivano zatvoren pri poslednjem pokretanju. Ako se problem " "nastavi, molimo prijavite ga{0} programerima." -#: ../src\wxUI\dialogs\attach.py:10 -msgid "Add an attachment" -msgstr "Dodaj prilog" - -#: ../src\wxUI\dialogs\attach.py:13 -msgid "Attachments" -msgstr "Prilozi" - -#: ../src\wxUI\dialogs\attach.py:14 -msgid "Title" -msgstr "Naslov" - -#: ../src\wxUI\dialogs\attach.py:14 -msgid "Type" -msgstr "Vrsta" - -#: ../src\wxUI\dialogs\attach.py:19 -msgid "Add attachments" -msgstr "Dodaj priloge" - -#: ../src\wxUI\dialogs\attach.py:20 -msgid "&Photo" -msgstr "Slika" - -#: ../src\wxUI\dialogs\attach.py:21 -msgid "Remove attachment" -msgstr "Ukloni prilog" - -#: ../src\wxUI\dialogs\attach.py:37 ../src\wxUI\dialogs\message.py:116 -#: ../src\wxUI\dialogs\message.py:175 ../src\wxUI\dialogs\message.py:235 -#: ../src\wxUI\dialogs\update_profile.py:82 -msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" -msgstr "Datoteke sa slikama" - -#: ../src\wxUI\dialogs\attach.py:37 ../src\wxUI\dialogs\message.py:116 -#: ../src\wxUI\dialogs\message.py:175 ../src\wxUI\dialogs\message.py:235 -#: ../src\wxUI\dialogs\update_profile.py:82 -msgid "Select the picture to be uploaded" -msgstr "Izaberite sliku koju želite da otpremite" - -#: ../src\wxUI\dialogs\attach.py:44 -msgid "please provide a description" -msgstr "Molimo vas navedite opis:" - -#: ../src\wxUI\dialogs\attach.py:44 ../src\wxUI\dialogs\lists.py:14 -#: ../src\wxUI\dialogs\lists.py:70 -msgid "Description" -msgstr "Opis" - #: ../src\wxUI\dialogs\configuration.py:15 msgid "Language" msgstr "Jezik" @@ -2544,7 +2481,7 @@ msgid "Status" msgstr "Status" #: ../src\wxUI\dialogs\configuration.py:144 -#: ../src\wxUI\dialogs\filterDialogs.py:126 +#: ../src\wxUI\dialogs\filterDialogs.py:130 msgid "Buffer" msgstr "Kanal" @@ -2669,91 +2606,99 @@ msgstr "Dodaci" msgid "Save" msgstr "Sačuvaj" -#: ../src\wxUI\dialogs\filterDialogs.py:16 +#: ../src\wxUI\dialogs\filterDialogs.py:13 msgid "Create a filter for this buffer" msgstr "Napravi filter za ovaj kanal" -#: ../src\wxUI\dialogs\filterDialogs.py:17 +#: ../src\wxUI\dialogs\filterDialogs.py:14 msgid "Filter title" msgstr "Naziv filtera" -#: ../src\wxUI\dialogs\filterDialogs.py:26 -#: ../src\wxUI\dialogs\filterDialogs.py:126 +#: ../src\wxUI\dialogs\filterDialogs.py:24 +#: ../src\wxUI\dialogs\filterDialogs.py:130 msgid "Filter by word" msgstr "Filtriraj na osnovu reči" -#: ../src\wxUI\dialogs\filterDialogs.py:27 +#: ../src\wxUI\dialogs\filterDialogs.py:25 msgid "Ignore tweets wich contain the following word" msgstr "Zanemari tvitove koji sadrže sledeću reč" -#: ../src\wxUI\dialogs\filterDialogs.py:28 +#: ../src\wxUI\dialogs\filterDialogs.py:26 msgid "Ignore tweets without the following word" msgstr "Zanemari tvitove bez sledeće reči" -#: ../src\wxUI\dialogs\filterDialogs.py:33 +#: ../src\wxUI\dialogs\filterDialogs.py:31 msgid "word" msgstr "Reč" -#: ../src\wxUI\dialogs\filterDialogs.py:38 +#: ../src\wxUI\dialogs\filterDialogs.py:36 msgid "Allow retweets" msgstr "Dozvoli retvitove" -#: ../src\wxUI\dialogs\filterDialogs.py:39 +#: ../src\wxUI\dialogs\filterDialogs.py:37 msgid "Allow quoted tweets" msgstr "Dozvoli citirane tvitove" -#: ../src\wxUI\dialogs\filterDialogs.py:40 +#: ../src\wxUI\dialogs\filterDialogs.py:38 msgid "Allow replies" msgstr "Dozvoli odgovore" -#: ../src\wxUI\dialogs\filterDialogs.py:48 +#: ../src\wxUI\dialogs\filterDialogs.py:46 msgid "Use this term as a regular expression" msgstr "Koristi ovaj termin kao regulara nizraz" -#: ../src\wxUI\dialogs\filterDialogs.py:50 -#: ../src\wxUI\dialogs\filterDialogs.py:126 +#: ../src\wxUI\dialogs\filterDialogs.py:48 +#: ../src\wxUI\dialogs\filterDialogs.py:130 msgid "Filter by language" msgstr "Filtriraj na osnovu jezika" -#: ../src\wxUI\dialogs\filterDialogs.py:51 +#: ../src\wxUI\dialogs\filterDialogs.py:49 msgid "Load tweets in the following languages" msgstr "Učitaj tvitove na sledećim jezicima" -#: ../src\wxUI\dialogs\filterDialogs.py:52 +#: ../src\wxUI\dialogs\filterDialogs.py:50 msgid "Ignore tweets in the following languages" msgstr "Zanemari tvitove na sledećim jezicima" -#: ../src\wxUI\dialogs\filterDialogs.py:53 +#: ../src\wxUI\dialogs\filterDialogs.py:51 msgid "Don't filter by language" msgstr "Ne filtriraj na osnovu jezika" -#: ../src\wxUI\dialogs\filterDialogs.py:64 +#: ../src\wxUI\dialogs\filterDialogs.py:62 msgid "Supported languages" msgstr "Podržani jezici" -#: ../src\wxUI\dialogs\filterDialogs.py:69 +#: ../src\wxUI\dialogs\filterDialogs.py:67 msgid "Add selected language to filter" msgstr "Dodaj izabrani jezik u filter" -#: ../src\wxUI\dialogs\filterDialogs.py:73 +#: ../src\wxUI\dialogs\filterDialogs.py:71 msgid "Selected languages" msgstr "Izabrani jezici" -#: ../src\wxUI\dialogs\filterDialogs.py:75 -#: ../src\wxUI\dialogs\filterDialogs.py:133 ../src\wxUI\dialogs\lists.py:21 +#: ../src\wxUI\dialogs\filterDialogs.py:73 +#: ../src\wxUI\dialogs\filterDialogs.py:137 ../src\wxUI\dialogs\lists.py:21 #: ../src\wxUI\dialogs\lists.py:132 ../src\wxUI\dialogs\userAliasDialogs.py:57 msgid "Remove" msgstr "Ukloni" -#: ../src\wxUI\dialogs\filterDialogs.py:123 +#: ../src\wxUI\dialogs\filterDialogs.py:120 +msgid "Missing filter name" +msgstr "Ime filtera nedostaje" + +#: ../src\wxUI\dialogs\filterDialogs.py:120 +msgid "You must define a name for the filter before creating it." +msgstr "Morate upisati ime za filter pre nego što ga napravite." + +#: ../src\wxUI\dialogs\filterDialogs.py:127 msgid "Manage filters" msgstr "Upravljanje filterima" -#: ../src\wxUI\dialogs\filterDialogs.py:125 +#: ../src\wxUI\dialogs\filterDialogs.py:129 msgid "Filters" msgstr "Filteri" -#: ../src\wxUI\dialogs\filterDialogs.py:126 +#: ../src\wxUI\dialogs\filterDialogs.py:130 msgid "Filter" msgstr "Filter" @@ -2785,6 +2730,14 @@ msgstr "Vlasnik" msgid "mode" msgstr "Način" +#: ../src\wxUI\dialogs\lists.py:14 ../src\wxUI\dialogs\lists.py:70 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:38 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:127 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:175 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:260 +msgid "Description" +msgstr "Opis" + #: ../src\wxUI\dialogs\lists.py:19 ../src\wxUI\dialogs\lists.py:62 msgid "Create a new list" msgstr "Stvori novu listu" @@ -2841,103 +2794,6 @@ msgstr "Izaberite listu sa koje želite da uklonite korisnika" msgid "Do you really want to delete this list?" msgstr "Želite li zaista da izbrišete ovu listu?" -#: ../src\wxUI\dialogs\message.py:73 ../src\wxUI\dialogs\message.py:254 -msgid "&Long tweet" -msgstr "Dug tvit" - -#: ../src\wxUI\dialogs\message.py:74 ../src\wxUI\dialogs\message.py:133 -#: ../src\wxUI\dialogs\message.py:255 -msgid "&Upload image..." -msgstr "Otpremi sliku..." - -#: ../src\wxUI\dialogs\message.py:75 ../src\wxUI\dialogs\message.py:134 -#: ../src\wxUI\dialogs\message.py:194 ../src\wxUI\dialogs\message.py:256 -#: ../src\wxUI\dialogs\message.py:359 ../src\wxUI\dialogs\message.py:435 -msgid "Check &spelling..." -msgstr "Proveri pravopis..." - -#: ../src\wxUI\dialogs\message.py:76 ../src\wxUI\dialogs\message.py:135 -#: ../src\wxUI\dialogs\message.py:195 ../src\wxUI\dialogs\message.py:257 -msgid "&Attach audio..." -msgstr "Priloži zvučni zapis..." - -#: ../src\wxUI\dialogs\message.py:77 ../src\wxUI\dialogs\message.py:136 -#: ../src\wxUI\dialogs\message.py:196 ../src\wxUI\dialogs\message.py:258 -msgid "Sh&orten URL" -msgstr "Skrati vezu" - -#: ../src\wxUI\dialogs\message.py:78 ../src\wxUI\dialogs\message.py:137 -#: ../src\wxUI\dialogs\message.py:197 ../src\wxUI\dialogs\message.py:259 -#: ../src\wxUI\dialogs\message.py:360 ../src\wxUI\dialogs\message.py:436 -msgid "&Expand URL" -msgstr "Proširi vezu" - -#: ../src\wxUI\dialogs\message.py:81 ../src\wxUI\dialogs\message.py:140 -#: ../src\wxUI\dialogs\message.py:200 ../src\wxUI\dialogs\message.py:262 -#: ../src\wxUI\dialogs\message.py:362 ../src\wxUI\dialogs\message.py:438 -msgid "&Translate..." -msgstr "Prevedi..." - -#: ../src\wxUI\dialogs\message.py:82 ../src\wxUI\dialogs\message.py:141 -#: ../src\wxUI\dialogs\message.py:186 ../src\wxUI\dialogs\message.py:263 -msgid "Auto&complete users" -msgstr "&Automatsko dovršavanje" - -#: ../src\wxUI\dialogs\message.py:83 ../src\wxUI\dialogs\message.py:142 -#: ../src\wxUI\dialogs\message.py:201 ../src\wxUI\dialogs\message.py:264 -msgid "Sen&d" -msgstr "Pošalji" - -#: ../src\wxUI\dialogs\message.py:85 ../src\wxUI\dialogs\message.py:144 -#: ../src\wxUI\dialogs\message.py:203 ../src\wxUI\dialogs\message.py:266 -#: ../src\wxUI\dialogs\message.py:363 ../src\wxUI\dialogs\message.py:439 -msgid "C&lose" -msgstr "Zatvori" - -#: ../src\wxUI\dialogs\message.py:184 -msgid "&Recipient" -msgstr "Primalac" - -#: ../src\wxUI\dialogs\message.py:245 -msgid "&Mention to all" -msgstr "Spomeni sve" - -#: ../src\wxUI\dialogs\message.py:299 -msgid "Tweet - %i characters " -msgstr "Tvit - %i znakova" - -#: ../src\wxUI\dialogs\message.py:316 -msgid "Image description" -msgstr "Opis slike" - -#: ../src\wxUI\dialogs\message.py:327 -msgid "Retweets: " -msgstr "Retvitova" - -#: ../src\wxUI\dialogs\message.py:332 -msgid "Likes: " -msgstr "Sviđanja:" - -#: ../src\wxUI\dialogs\message.py:337 -msgid "Source: " -msgstr "Izvor:" - -#: ../src\wxUI\dialogs\message.py:342 ../src\wxUI\dialogs\message.py:423 -msgid "Date: " -msgstr "Datum:" - -#: ../src\wxUI\dialogs\message.py:357 ../src\wxUI\dialogs\message.py:433 -msgid "Copy link to clipboard" -msgstr "Kopiraj link u privremenu memoriju" - -#: ../src\wxUI\dialogs\message.py:408 -msgid "View" -msgstr "Vidi" - -#: ../src\wxUI\dialogs\message.py:410 -msgid "Item" -msgstr "Stavka" - #: ../src\wxUI\dialogs\search.py:12 msgid "Search on Twitter" msgstr "Pretraži ttwitter" @@ -3019,6 +2875,225 @@ msgstr "Gradu" msgid "&Location" msgstr "Mesto" +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:33 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:49 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:170 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:255 +msgid "Attachments" +msgstr "Prilozi" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:37 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:174 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:259 +msgid "Type" +msgstr "Vrsta" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:40 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:177 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:262 +msgid "Delete attachment" +msgstr "Ukloni prilog" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:45 +msgid "Added Tweets" +msgstr "Dodati tvitovi" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:52 +msgid "Delete tweet" +msgstr "Obriši tvit" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:57 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:192 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:267 +msgid "A&dd..." +msgstr "&Dodaj..." + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:59 +msgid "Add t&weet" +msgstr "Dodaj t&vit" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:62 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:194 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:269 +msgid "&Attach audio..." +msgstr "Priloži zvučni zapis..." + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:66 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:198 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:237 +msgid "Auto&complete users" +msgstr "&Automatsko dovršavanje" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:68 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:200 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:273 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:367 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:440 +msgid "Check &spelling..." +msgstr "Proveri pravopis..." + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:70 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:202 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:275 +msgid "&Translate" +msgstr "&Prevedi" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:74 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:206 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:279 +msgid "Sen&d" +msgstr "Pošalji" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:118 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:220 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:299 +msgid "Image" +msgstr "Slika" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:120 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:222 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:301 +msgid "Video" +msgstr "Video" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:122 +msgid "Poll" +msgstr "Anketa" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:127 +msgid "please provide a description" +msgstr "Molimo vas navedite opis:" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:134 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:292 +#: ../src\wxUI\dialogs\update_profile.py:82 +msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" +msgstr "Datoteke sa slikama" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:134 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:292 +#: ../src\wxUI\dialogs\update_profile.py:82 +msgid "Select the picture to be uploaded" +msgstr "Izaberite sliku koju želite da otpremite" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:141 +msgid "Select the video to be uploaded" +msgstr "Izaberite video zapis koji želite da otpremite" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:141 +msgid "Video files (*.mp4)|*.mp4" +msgstr "Datoteke video zapisa (*.mp4)|*.mp4" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:147 +msgid "Error adding attachment" +msgstr "Greška pri dodavanju priloga" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:147 +msgid "" +"It is not possible to add more attachments. Please make sure your tweet " +"complies with Twitter'S attachment rules. You can add only one video or GIF " +"in every tweet, and a maximum of 4 photos." +msgstr "" +"Nije moguće dodati više priloga. Molimo uverite se da vaš tvit poštuje " +"Twitter pravila o prilozima. Možete dodati samo jedan video ili GIF u svaki " +"tvit, i najviše 4 slike." + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:182 +msgid "&Mention to all" +msgstr "Spomeni sve" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:235 +msgid "&Recipient" +msgstr "Primalac" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:307 +msgid "Tweet - %i characters " +msgstr "Tvit - %i znakova" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:324 +msgid "Image description" +msgstr "Opis slike" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:335 +msgid "Retweets: " +msgstr "Retvitova" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:340 +msgid "Likes: " +msgstr "Sviđanja:" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:345 +msgid "Source: " +msgstr "Izvor:" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:350 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:428 +msgid "Date: " +msgstr "Datum:" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:365 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:438 +msgid "Copy link to clipboard" +msgstr "Kopiraj link u privremenu memoriju" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:368 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:443 +msgid "&Translate..." +msgstr "Prevedi..." + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:369 +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:444 +msgid "C&lose" +msgstr "Zatvori" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:413 +msgid "View" +msgstr "Vidi" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:415 +msgid "Item" +msgstr "Stavka" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:441 +msgid "&Expand URL" +msgstr "Proširi vezu" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:480 +msgid "Add a poll" +msgstr "Dodaj anketu" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:484 +msgid "Participation time (in days)" +msgstr "Vreme učešća (u danima)" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:491 +msgid "Choices" +msgstr "Opcije" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:495 +msgid "Option 1" +msgstr "Opcija 1" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:501 +msgid "Option 2" +msgstr "Opcija 2" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:507 +msgid "Option 3" +msgstr "Opcija 3" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:513 +msgid "Option 4" +msgstr "Opcija 4" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:540 +msgid "Not enough information" +msgstr "Nema dovoljno informacija" + +#: ../src\wxUI\dialogs\twitterDialogs\tweetDialogs.py:540 +msgid "Please make sure you have provided at least two options for the poll." +msgstr "Molimo uverite se da ste ponudili bar dve opcije u anketi." + #: ../src\wxUI\dialogs\update_profile.py:10 msgid "Update your profile" msgstr "Ažurirajte vaš profil" @@ -3435,6 +3510,42 @@ msgstr "Ažuriraj" msgid "Your {0} version is up to date" msgstr "Imate najnoviju verziju {0}." +#~ msgid "Photo" +#~ msgstr "Slika" + +#~ msgid "There's no URL to be shortened" +#~ msgstr "Nema veze koja bi mogla biti skraćena" + +#~ msgid "URL shortened" +#~ msgstr "Veza je skraćena" + +#~ msgid "There's no URL to be expanded" +#~ msgstr "Nema veze koja bi mogla biti proširena" + +#~ msgid "URL expanded" +#~ msgstr "Veza je proširena" + +#~ msgid "%s - %s characters" +#~ msgstr "%s - %s znakova" + +#~ msgid "Title" +#~ msgstr "Naslov" + +#~ msgid "Add attachments" +#~ msgstr "Dodaj priloge" + +#~ msgid "&Photo" +#~ msgstr "Slika" + +#~ msgid "&Long tweet" +#~ msgstr "Dug tvit" + +#~ msgid "&Upload image..." +#~ msgstr "Otpremi sliku..." + +#~ msgid "Sh&orten URL" +#~ msgstr "Skrati vezu" + #~ msgid "Friends' Timelines" #~ msgstr "Vremenska linija prijatelja" diff --git a/src/sessions/twitter/compose.py b/src/sessions/twitter/compose.py index 1b761390..539b4df7 100644 --- a/src/sessions/twitter/compose.py +++ b/src/sessions/twitter/compose.py @@ -3,7 +3,6 @@ import platform system = platform.system() from . import utils import re -import html.entities import time import output import languageHandler @@ -11,21 +10,9 @@ import arrow import logging import config from .long_tweets import twishort, tweets +from .utils import StripChars log = logging.getLogger("compose") -def StripChars(s): - """Converts any html entities in s to their unicode-decoded equivalents and returns a string.""" - entity_re = re.compile(r"&(#\d+|\w+);") - def matchFunc(match): - """Nested function to handle a match object. - If we match &blah; and it's not found, &blah; will be returned. - if we match #\d+, unichr(digits) will be returned. - Else, a unicode string will be returned.""" - if match.group(1).startswith('#'): return chr(int(match.group(1)[1:])) - replacement = html.entities.entitydefs.get(match.group(1), "&%s;" % match.group(1)) - return replacement - return str(entity_re.sub(matchFunc, s)) - chars = "abcdefghijklmnopqrstuvwxyz" def compose_tweet(tweet, db, relative_times, show_screen_names=False, session=None): diff --git a/src/sessions/twitter/session.py b/src/sessions/twitter/session.py index a219016c..e3ac4139 100644 --- a/src/sessions/twitter/session.py +++ b/src/sessions/twitter/session.py @@ -36,9 +36,9 @@ class Session(base.baseSession): return self.order_direct_messages(data) num = 0 last_id = None - if (name in self.db) == False: + if self.db.get(name) == None: self.db[name] = [] - if ("users" in self.db) == False: + if self.db.get("users") == None: self.db["users"] = {} objects = self.db[name] if ignore_older and len(self.db[name]) > 0: @@ -136,7 +136,7 @@ class Session(base.baseSession): if self.settings["twitter"]["user_key"] != None and self.settings["twitter"]["user_secret"] != None: try: log.debug("Logging in to twitter...") - self.auth = tweepy.OAuthHandler(appkeys.twitter_api_key, appkeys.twitter_api_secret) + self.auth = tweepy.OAuth1UserHandler(appkeys.twitter_api_key, appkeys.twitter_api_secret) self.auth.set_access_token(self.settings["twitter"]["user_key"], self.settings["twitter"]["user_secret"]) self.twitter = tweepy.API(self.auth) self.twitter_v2 = tweepy.Client(consumer_key=appkeys.twitter_api_key, consumer_secret=appkeys.twitter_api_secret, access_token=self.settings["twitter"]["user_key"], access_token_secret=self.settings["twitter"]["user_secret"]) @@ -158,7 +158,7 @@ class Session(base.baseSession): if self.logged == True: raise Exceptions.AlreadyAuthorisedError("The authorisation process is not needed at this time.") else: - self.auth = tweepy.OAuthHandler(appkeys.twitter_api_key, appkeys.twitter_api_secret) + self.auth = tweepy.OAuth1UserHandler(appkeys.twitter_api_key, appkeys.twitter_api_secret) redirect_url = self.auth.get_authorization_url() webbrowser.open_new_tab(redirect_url) self.authorisation_dialog = authorisationDialog() @@ -204,7 +204,7 @@ class Session(base.baseSession): except TweepyException as e: output.speak(str(e)) val = None - if type(e) != NotFound and type(e) != Forvidden: + if type(e) != NotFound and type(e) != Forbidden: tries = tries+1 time.sleep(5) elif report_failure: @@ -218,6 +218,30 @@ class Session(base.baseSession): if _sound != None: self.sound.play(_sound) return val + def api_call_v2(self, call_name, action="", _sound=None, report_success=False, report_failure=True, preexec_message="", *args, **kwargs): + finished = False + tries = 0 + if preexec_message: + output.speak(preexec_message, True) + while finished==False and tries < 25: + try: + val = getattr(self.twitter_v2, call_name)(*args, **kwargs) + finished = True + except TweepyException as e: + log.exception("Error sending the tweet.") + output.speak(str(e)) + val = None + if type(e) != NotFound and type(e) != Forbidden: + tries = tries+1 + time.sleep(5) + elif report_failure: + output.speak(_("%s failed. Reason: %s") % (action, str(e))) + finished = True + if report_success: + output.speak(_("%s succeeded.") % action) + if _sound != None: self.sound.play(_sound) + return val + def search(self, name, *args, **kwargs): """ Search in twitter, passing args and kwargs as arguments to the Twython function.""" tl = self.twitter.search_tweets(*args, **kwargs) @@ -232,21 +256,22 @@ class Session(base.baseSession): tl = self.call_paged("favorites", *args, **kwargs) return self.order_buffer(name, tl) - def call_paged(self, update_function, *args, **kwargs): + def call_paged(self, update_function, name, *args, **kwargs): """ Makes a call to the Twitter API methods several times. Useful for get methods. this function is needed for retrieving more than 200 items. update_function str: The function to call. This function must be child of self.twitter args and kwargs are passed to update_function. returns a list with all items retrieved.""" - max = 0 results = [] - data = getattr(self.twitter, update_function)(count=self.settings["general"]["max_tweets_per_call"], *args, **kwargs) + if self.db.get(name) == None or self.db.get(name) == []: + since_id = None + else: + if self.settings["general"]["reverse_timelines"] == False: + since_id = self.db[name][-1].id + else: + since_id = self.db[name][0].id + data = getattr(self.twitter, update_function)(count=self.settings["general"]["max_tweets_per_call"], since_id=since_id, *args, **kwargs) results.extend(data) - for i in range(0, max): - if i == 0: max_id = results[-1].id - else: max_id = results[0].id - data = getattr(self.twitter, update_function)(max_id=max_id, count=self.settings["general"]["max_tweets_per_call"], *args, **kwargs) - results.extend(data) results.reverse() return results @@ -590,4 +615,55 @@ class Session(base.baseSession): if self.logged == False: return if user != self.db["user_name"]: - log.debug("Connected streaming endpoint on account {}".format(user)) \ No newline at end of file + log.debug("Connected streaming endpoint on account {}".format(user)) + + def send_tweet(self, *tweets): + """ Convenience function to send a thread. """ + in_reply_to_status_id = None + for obj in tweets: + # When quoting a tweet, the tweet_data dict might contain a parameter called quote_tweet_id. Let's add it, or None, so quotes will be posted successfully. + if len(obj["attachments"]) == 0: + item = self.api_call_v2(call_name="create_tweet", text=obj["text"], _sound="tweet_send.ogg", in_reply_to_tweet_id=in_reply_to_status_id, poll_duration_minutes=obj["poll_period"], poll_options=obj["poll_options"], quote_tweet_id=obj.get("quote_tweet_id")) + in_reply_to_status_id = item.data["id"] + else: + media_ids = [] + for i in obj["attachments"]: + img = self.api_call("media_upload", filename=i["file"]) + if i["type"] == "photo": + self.api_call(call_name="create_media_metadata", media_id=img.media_id, alt_text=i["description"]) + media_ids.append(img.media_id) + item = self.api_call_v2(call_name="create_tweet", text=obj["text"], _sound="tweet_send.ogg", in_reply_to_tweet_id=in_reply_to_status_id, media_ids=media_ids, poll_duration_minutes=obj["poll_period"], poll_options=obj["poll_options"], quote_tweet_id=obj.get("quote_tweet_id")) + in_reply_to_status_id = item.data["id"] + + def reply(self, text="", in_reply_to_status_id=None, attachments=[], *args, **kwargs): + if len(attachments) == 0: + item = self.api_call_v2(call_name="create_tweet", text=text, _sound="reply_send.ogg", in_reply_to_tweet_id=in_reply_to_status_id, *args, **kwargs) + else: + media_ids = [] + for i in attachments: + img = self.api_call("media_upload", filename=i["file"]) + if i["type"] == "photo": + self.api_call(call_name="create_media_metadata", media_id=img.media_id, alt_text=i["description"]) + media_ids.append(img.media_id) + item = self.api_call_v2(call_name="create_tweet", text=text, _sound="reply_send.ogg", in_reply_to_tweet_id=in_reply_to_status_id, media_ids=media_ids, *args, **kwargs) + + def direct_message(self, text, recipient, attachment=None, *args, **kwargs): + if attachment == None: + item = self.api_call(call_name="send_direct_message", recipient_id=recipient, text=text) + else: + if attachment["type"] == "photo": + media_category = "DmImage" + elif attachment["type"] == "gif": + media_category = "DmGif" + elif attachment["type"] == "video": + media_category = "DmVideo" + media = self.api_call("media_upload", filename=attachment["file"], media_category=media_category) + item = self.api_call(call_name="send_direct_message", recipient_id=recipient, text=text, attachment_type="media", attachment_media_id=media.media_id) + if item != None: + sent_dms = self.db["sent_direct_messages"] + if self.settings["general"]["reverse_timelines"] == False: + sent_dms.append(item) + else: + sent_dms.insert(0, item) + self.db["sent_direct_messages"] = sent_dms + pub.sendMessage("sent-dm", data=item, user=self.db["user_name"]) diff --git a/src/sessions/twitter/templates.py b/src/sessions/twitter/templates.py new file mode 100644 index 00000000..ec54a13d --- /dev/null +++ b/src/sessions/twitter/templates.py @@ -0,0 +1,159 @@ +# -*- coding: utf-8 -*- +import re +import arrow +import languageHandler +from string import Template +from . import utils + +# Define variables that would be available for all template objects. +# This will be used for the edit template dialog. +# Available variables for tweet objects. +tweet_variables = ["date", "display_name", "screen_name", "source", "lang", "text", "image_descriptions"] +dm_variables = ["date", "sender_display_name", "sender_screen_name", "recipient_display_name", "recipient_display_name", "text"] +person_variables = ["display_name", "screen_name", "location", "description", "followers", "following", "listed", "likes", "tweets", "created_at"] + +# Default, translatable templates. +tweet_default_template = _("$display_name, $text $image_descriptions $date. $source") +dm_default_template = _("$sender_display_name, $text $date") +dm_sent_default_template = _("Dm to $recipient_display_name, $text $date") +person_default_template = _("$display_name (@$screen_name). $followers followers, $following following, $tweets tweets. Joined Twitter $created_at.") + +def process_date(field, relative_times=True, offset_seconds=0): + original_date = arrow.get(field, locale="en") + if relative_times == True: + ts = original_date.humanize(locale=languageHandler.curLang[:2]) + else: + ts = original_date.shift(seconds=offset_seconds).format(_("dddd, MMMM D, YYYY H:m:s"), locale=languageHandler.curLang[:2]) + return ts + +def process_text(tweet): + if hasattr(tweet, "full_text"): + text = tweet.full_text + elif hasattr(tweet, "text"): + text = tweet.text + # Cleanup mentions, so we'll remove more than 2 mentions to make the tweet easier to read. + text = utils.clean_mentions(utils.StripChars(text)) + # Replace URLS for extended version of those. + if hasattr(tweet, "entities"): + text = utils.expand_urls(text, tweet.entities) + text = re.sub(r"https://twitter.com/\w+/status/\d+", "", text) + return text + +def process_image_descriptions(entities): + """ Attempt to extract information for image descriptions. """ + image_descriptions = [] + for media in entities["media"]: + if media.get("ext_alt_text") != None: + image_descriptions.append(media.get("ext_alt_text")) + # Tweets retrieved via the Streaming API have a description field in media photos with image description available. + elif media.get("description") != None: + image_descriptions.append(media.get("description")) + + idescriptions = "" + for image in image_descriptions: + idescriptions += _("Image description: {}.").format(image) + return idescriptions + +def remove_unneeded_variables(template, variables): + for variable in variables: + template = re.sub("\$"+variable, "", template) + return template + +def render_tweet(tweet, template, session, relative_times=False, offset_seconds=0): + """ Renders any given Tweet according to the passed template. + Available data for tweets will be stored in the following variables: + $date: Creation date. + $display_name: User profile name. + $screen_name: User screen name, this is the same name used to reference the user in Twitter. + $ source: Source client from where the current tweet was sent. + $lang: Two letter code for the automatically detected language for the tweet. This detection is performed by Twitter. + $text: Tweet text. + $image_descriptions: Information regarding image descriptions added by twitter users. + """ + global tweet_variables + available_data = dict() + created_at = process_date(tweet.created_at, relative_times, offset_seconds) + available_data.update(date=created_at) + # user. + available_data.update(display_name=session.get_user(tweet.user).name, screen_name=session.get_user(tweet.user).screen_name) + # Source client from where tweet was originated. + available_data.update(source=tweet.source) + if hasattr(tweet, "retweeted_status"): + if hasattr(tweet.retweeted_status, "quoted_status"): + text = "RT @{}: {} Quote from @{}: {}".format(session.get_user(tweet.retweeted_status.user).screen_name, process_text(tweet.retweeted_status), session.get_user(tweet.retweeted_status.quoted_status.user).screen_name, process_text(tweet.retweeted_status.quoted_status)) + else: + text = "RT @{}: {}".format(session.get_user(tweet.retweeted_status.user).screen_name, process_text(tweet.retweeted_status)) + elif hasattr(tweet, "quoted_status"): + text = "{} Quote from @{}: {}".format(process_text(tweet), session.get_user(tweet.quoted_status.user).screen_name, process_text(tweet.quoted_status)) + else: + text = process_text(tweet) + available_data.update(lang=tweet.lang, text=text) + # process image descriptions + image_descriptions = "" + if hasattr(tweet, "quoted_status") and hasattr(tweet.quoted_status, "extended_entities"): + image_descriptions = process_image_descriptions(tweet.quoted_status.extended_entities) + elif hasattr(tweet, "retweeted_status") and hasattr(tweet.retweeted_status, "quoted_status") and hasattr(tweet.retweeted_status.quoted_status, "extended_entities"): + image_descriptions = process_image_descriptions(tweet.retweeted_status.quoted_status.extended_entities) + elif hasattr(tweet, "extended_entities"): + image_descriptions = process_image_descriptions(tweet.extended_entities) + if image_descriptions != "": + available_data.update(image_descriptions=image_descriptions) + result = Template(_(template)).safe_substitute(**available_data) + result = remove_unneeded_variables(result, tweet_variables) + return result + +def render_dm(dm, template, session, relative_times=False, offset_seconds=0): + """ Renders direct messages by using the provided template. + Available data will be stored in the following variables: + $date: Creation date. + $sender_display_name: User profile name for user who sent the dm. + $sender_screen_name: User screen name for user sending the dm, this is the same name used to reference the user in Twitter. + $recipient_display_name: User profile name for user who received the dm. + $recipient_screen_name: User screen name for user receiving the dm, this is the same name used to reference the user in Twitter. + $text: Text of the direct message. + """ + global dm_variables + available_data = dict() + available_data.update(text=utils.expand_urls(dm.message_create["message_data"]["text"], dm.message_create["message_data"]["entities"])) + # Let's remove the last 3 digits in the timestamp string. + # Twitter sends their "epoch" timestamp with 3 digits for milliseconds and arrow doesn't like it. + original_date = arrow.get(int(dm.created_timestamp)) + if relative_times == True: + ts = original_date.humanize(locale=languageHandler.curLang[:2]) + else: + ts = original_date.shift(seconds=offset_seconds) + available_data.update(date=ts) + sender = session.get_user(dm.message_create["sender_id"]) + recipient = session.get_user(dm.message_create["target"]["recipient_id"]) + available_data.update(sender_display_name=sender.name, sender_screen_name=sender.screen_name, recipient_display_name=recipient.name, recipient_screen_name=recipient.screen_name) + result = Template(_(template)).safe_substitute(**available_data) + result = remove_unneeded_variables(result, dm_variables) + return result + +# Sesion object is not used in this function but we keep compatibility across all rendering functions. +def render_person(user, template, session=None, relative_times=True, offset_seconds=0): + """ Renders persons (any Twitter user) by using the provided template. + Available data will be stored in the following variables: + $display_name: The name of the user, as they’ve defined it. Not necessarily a person’s name. Typically capped at 50 characters, but subject to change. + $screen_name: The screen name, handle, or alias that this user identifies themselves with. + $location: The user-defined location for this account’s profile. Not necessarily a location, nor machine-parseable. + $description: The user-defined UTF-8 string describing their account. + $followers: The number of followers this account currently has. This value might be inaccurate. + $following: The number of users this account is following (AKA their “followings”). This value might be inaccurate. + $listed: The number of public lists that this user is a member of. This value might be inaccurate. + $likes: The number of Tweets this user has liked in the account’s lifetime. This value might be inaccurate. + $tweets: The number of Tweets (including retweets) issued by the user. This value might be inaccurate. + $created_at: The date and time that the user account was created on Twitter. + """ + global person_variables + available_data = dict(display_name=user.name, screen_name=user.screen_name, followers=user.followers_count, following=user.friends_count, likes=user.favourites_count, listed=user.listed_count, tweets=user.statuses_count) + # Nullable values. + nullables = ["location", "description"] + for nullable in nullables: + if hasattr(user, nullable) and getattr(user, nullable) != None: + available_data[nullable] = getattr(user, nullable) + created_at = process_date(user.created_at, relative_times=relative_times, offset_seconds=offset_seconds) + available_data.update(created_at=created_at) + result = Template(_(template)).safe_substitute(**available_data) + result = remove_unneeded_variables(result, person_variables) + return result \ No newline at end of file diff --git a/src/sessions/twitter/utils.py b/src/sessions/twitter/utils.py index f84dfaca..c13d3088 100644 --- a/src/sessions/twitter/utils.py +++ b/src/sessions/twitter/utils.py @@ -1,11 +1,10 @@ # -*- coding: utf-8 -*- -import url_shortener, re +import re +import html.entities import output -import config import logging import requests import time -import sound from tweepy.errors import TweepyException, NotFound, Forbidden log = logging.getLogger("twitter.utils") """ Some utilities for the twitter interface.""" @@ -18,6 +17,19 @@ url_re = re.compile(r"(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4 url_re2 = re.compile("(?:\w+://|www\.)[^ ,.?!#%=+][^ \\n\\t]*") bad_chars = '\'\\\n.,[](){}:;"' +def StripChars(s): + """Converts any html entities in s to their unicode-decoded equivalents and returns a string.""" + entity_re = re.compile(r"&(#\d+|\w+);") + def matchFunc(match): + """Nested function to handle a match object. + If we match &blah; and it's not found, &blah; will be returned. + if we match #\d+, unichr(digits) will be returned. + Else, a unicode string will be returned.""" + if match.group(1).startswith('#'): return chr(int(match.group(1)[1:])) + replacement = html.entities.entitydefs.get(match.group(1), "&%s;" % match.group(1)) + return replacement + return str(entity_re.sub(matchFunc, s)) + def find_urls_in_text(text): return url_re2.findall(text) diff --git a/src/setup.py b/src/setup.py index f5bc1f17..b0734eaa 100644 --- a/src/setup.py +++ b/src/setup.py @@ -8,9 +8,9 @@ from requests import certs def get_architecture_files(): if platform.architecture()[0][:2] == "32": - return ["../windows-dependencies/x86/oggenc2.exe", "../windows-dependencies/x86/bootstrap.exe", "../windows-dependencies/x86/libvlc.dll", "../windows-dependencies/x86/libvlccore.dll", "../windows-dependencies/x86/plugins", ["../windows-dependencies/dictionaries", "lib/enchant/data/mingw32/share/enchant/hunspell"], ["../windows-dependencies/x86/Microsoft.VC142.CRT", "."], ["../windows-dependencies/x86/Microsoft.VC142.MFC", "."]] + return ["../windows-dependencies/x86/oggenc2.exe", "../windows-dependencies/x86/bootstrap.exe", "../windows-dependencies/x86/libvlc.dll", "../windows-dependencies/x86/libvlccore.dll", "../windows-dependencies/x86/plugins", ["../windows-dependencies/dictionaries", "lib/enchant/data/mingw32/share/enchant/hunspell"], ["../windows-dependencies/x86/Microsoft.VC142.CRT", "."], ["../windows-dependencies/x86/Microsoft.VC142.MFC", "."], ["../windows-dependencies/x86/Microsoft.VC142.MFCLOC", "."], ["../windows-dependencies/x86/ucrt", "."]] elif platform.architecture()[0][:2] == "64": - return ["../windows-dependencies/x64/oggenc2.exe", "../windows-dependencies/x64/bootstrap.exe", "../windows-dependencies/x64/libvlc.dll", "../windows-dependencies/x64/libvlccore.dll", "../windows-dependencies/x64/plugins", ["../windows-dependencies/dictionaries", "lib/enchant/data/mingw64/share/enchant/hunspell"], ["../windows-dependencies/x64/Microsoft.VC142.CRT", "."], ["../windows-dependencies/x64/Microsoft.VC142.MFC", "."]] + return ["../windows-dependencies/x64/oggenc2.exe", "../windows-dependencies/x64/bootstrap.exe", "../windows-dependencies/x64/libvlc.dll", "../windows-dependencies/x64/libvlccore.dll", "../windows-dependencies/x64/plugins", ["../windows-dependencies/dictionaries", "lib/enchant/data/mingw64/share/enchant/hunspell"], ["../windows-dependencies/x64/Microsoft.VC142.CRT", "."], ["../windows-dependencies/x64/Microsoft.VC142.MFC", "."], ["../windows-dependencies/x64/Microsoft.VC142.MFCLOC", "."], ["../windows-dependencies/x64/ucrt", "."]] def find_sound_lib_datafiles(): import os diff --git a/src/sound.py b/src/sound.py index df47f221..cd0f5a93 100644 --- a/src/sound.py +++ b/src/sound.py @@ -6,7 +6,6 @@ import subprocess import platform import tempfile import glob -import url_shortener import audio_services import paths import sound_lib @@ -121,7 +120,7 @@ class URLStream(object): """ Takes an URL and prepares it to be streamed. This function will try to unshorten the passed URL and, if needed, to transform it into a valid URL.""" log.debug("Preparing URL: %s" % (url,)) self.prepared = False - self.url = url_shortener.unshorten(url) + self.url = url if self.url == None: self.url = url log.debug("Expanded URL: %s" % (self.url,)) diff --git a/src/url_shortener/__init__.py b/src/url_shortener/__init__.py deleted file mode 100644 index 419c8170..00000000 --- a/src/url_shortener/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from __future__ import unicode_literals -from . import shorteners -from . __main__ import * diff --git a/src/url_shortener/__main__.py b/src/url_shortener/__main__.py deleted file mode 100644 index 7e3dcf05..00000000 --- a/src/url_shortener/__main__.py +++ /dev/null @@ -1,46 +0,0 @@ -from __future__ import unicode_literals -from functools import wraps -from . import shorteners - - -def service_selecter (func): - @wraps(func) - def wrapper (*args, **kwargs): - tmp = dict(kwargs) - if 'service' in tmp: - del(tmp['service']) - kwargs['service'] = find_service(kwargs['service'], **tmp) or default_service() - else: - kwargs['service'] = default_service() - return func(*args, **kwargs) - return wrapper - -@service_selecter -def shorten (url, service=None, **kwargs): - return service(**kwargs).shorten(url) - - -@service_selecter -def unshorten (url, service=None, **kwargs): - return service(**kwargs).unshorten(url) - - -def default_service (): - return shorteners.AcortameShortener - -def find_service (service, **kwargs): - for i in shorteners.__all__: - obj = getattr(shorteners, i)(**kwargs) - if obj.name.lower() == service.lower(): - return getattr(shorteners, i) - -def list_services (): - return [getattr(shorteners, i)().name for i in shorteners.__all__] - -def unshorten_any (url): - """Unshortens an URL using any available unshortener. Check to see if unshortened URL was created by a shortener (nested) and unshorten if so.""" - unshortened_url = shorteners.URLShortener().unshorten(url) - # None is returned if URL not unshortened - if unshortened_url: - return unshorten_any(unshortened_url) - return url diff --git a/src/url_shortener/shorteners/__init__.py b/src/url_shortener/shorteners/__init__.py deleted file mode 100644 index aa0b763d..00000000 --- a/src/url_shortener/shorteners/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -from __future__ import unicode_literals -from .url_shortener import URLShortener -from .hkcim import HKCShortener -from . isgd import IsgdShortener -from . onjme import OnjmeShortener -from . tinyarrows import TinyArrowsShortener -from . tinyurl import TinyurlShortener -from . xedcc import XedccShortener -from . clckru import ClckruShortener -from . acortame import AcortameShortener -__all__ = ["HKCShortener", "IsgdShortener", "OnjmeShortener", "TinyArrowsShortener", "TinyurlShortener", "XedccShortener", "ClckruShortener", "AcortameShortener"] diff --git a/src/url_shortener/shorteners/acortame.py b/src/url_shortener/shorteners/acortame.py deleted file mode 100644 index e7adafb6..00000000 --- a/src/url_shortener/shorteners/acortame.py +++ /dev/null @@ -1,30 +0,0 @@ -from __future__ import unicode_literals -from future import standard_library -standard_library.install_aliases() -from . url_shortener import URLShortener -import requests -import urllib.request, urllib.parse, urllib.error -class AcortameShortener (URLShortener): - def __init__(self, *args, **kwargs): - self.name = "acorta.me" - super(AcortameShortener, self).__init__(*args, **kwargs) - - def _shorten (self, url): - answer = url - api = requests.get ("https://acorta.me/api.php?action=shorturl&format=simple&url=" + urllib.parse.quote(url)) - if api.status_code == 200: - answer = api.text - return answer - - def created_url (self, url): - return 'acorta.me' in url - - def unshorten (self, url): - if not 'acorta.me' in url: - #use generic expand method - return super(AcortameShortener, self).unshorten(url) - answer = url - api = requests.get ("https://acorta.me/api.php?action=expand&format=simple&shorturl=" + urllib.parse.quote(url)) - if api.status_code == 200: - answer = api.text - return answer diff --git a/src/url_shortener/shorteners/clckru.py b/src/url_shortener/shorteners/clckru.py deleted file mode 100644 index 9c527ea1..00000000 --- a/src/url_shortener/shorteners/clckru.py +++ /dev/null @@ -1,22 +0,0 @@ -from __future__ import unicode_literals -from future import standard_library -standard_library.install_aliases() -import urllib.request, urllib.parse, urllib.error -import requests -from . url_shortener import URLShortener - - -class ClckruShortener (URLShortener): - def __init__ (self, *args, **kwargs): - self.name = "clck.ru" - super(ClckruShortener, self).__init__(*args, **kwargs) - - def _shorten (self, url): - answer = url - api = requests.get ("http://clck.ru/--?url=" + urllib.parse.quote(url)) - if api.status_code == 200: - answer = api.text - return answer - - def created_url (self, url): - return 'clck.ru' in url diff --git a/src/url_shortener/shorteners/hkcim.py b/src/url_shortener/shorteners/hkcim.py deleted file mode 100644 index 29ecd9ea..00000000 --- a/src/url_shortener/shorteners/hkcim.py +++ /dev/null @@ -1,21 +0,0 @@ -from __future__ import unicode_literals -from future import standard_library -standard_library.install_aliases() -import urllib.request, urllib.parse, urllib.error -import requests -from . url_shortener import URLShortener - -class HKCShortener (URLShortener): - def __init__ (self, *args, **kwargs): - self.name = "HKC.im" - super(HKCShortener, self).__init__(*args, **kwargs) - - def _shorten (self, url): - answer = url - api = requests.get ("http://hkc.im/yourls-api.php?action=shorturl&format=simple&url=" + urllib.parse.quote(url)) - if api.status_code == 200: - answer = api.text - return answer - - def created_url (self, url): - return 'hkc.im' in url.lower() diff --git a/src/url_shortener/shorteners/isgd.py b/src/url_shortener/shorteners/isgd.py deleted file mode 100644 index ee817360..00000000 --- a/src/url_shortener/shorteners/isgd.py +++ /dev/null @@ -1,22 +0,0 @@ -from __future__ import unicode_literals -from future import standard_library -standard_library.install_aliases() -import urllib.request, urllib.parse, urllib.error -import requests -from . url_shortener import URLShortener - - -class IsgdShortener (URLShortener): - def __init__ (self, *args, **kwargs): - self.name = "Is.gd" - super(IsgdShortener, self).__init__(*args, **kwargs) - - def _shorten (self, url): - answer = url - api = requests.get ("http://is.gd/api.php?longurl=" + urllib.parse.quote(url)) - if api.status_code == 200: - answer = api.text - return answer - - def created_url (self, url): - return 'is.gd' in url diff --git a/src/url_shortener/shorteners/onjme.py b/src/url_shortener/shorteners/onjme.py deleted file mode 100644 index c6a21315..00000000 --- a/src/url_shortener/shorteners/onjme.py +++ /dev/null @@ -1,21 +0,0 @@ -from __future__ import unicode_literals -from future import standard_library -standard_library.install_aliases() -import urllib.request, urllib.parse, urllib.error -import requests -from . url_shortener import URLShortener - -class OnjmeShortener (URLShortener): - def __init__ (self, *args, **kwargs): - self.name = "Onj.me" - super(OnjmeShortener, self).__init__(*args, **kwargs) - - def _shorten (self, url): - answer = url - api = requests.get ("http://onj.me/yourls-api.php?action=shorturl&format=simple&url=" + urllib.parse.quote(url)) - if api.status_code == 200: - answer = api.text - return answer - - def created_url (self, url): - return 'onj.me' in url.lower() diff --git a/src/url_shortener/shorteners/tinyarrows.py b/src/url_shortener/shorteners/tinyarrows.py deleted file mode 100644 index 45a8990c..00000000 --- a/src/url_shortener/shorteners/tinyarrows.py +++ /dev/null @@ -1,21 +0,0 @@ -from __future__ import unicode_literals -from future import standard_library -standard_library.install_aliases() -import urllib.request, urllib.parse, urllib.error -import requests -from . url_shortener import URLShortener - -class TinyArrowsShortener (URLShortener): - def __init__ (self, *args, **kwargs): - self.name = "TinyArro.ws" - super(TinyArrowsShortener, self).__init__(*args, **kwargs) - - def _shorten (self, url): - answer = url - api = requests.get("http://tinyarro.ws/api-create.php?utfpure=1&url=%s" % urllib.parse.quote(url)) - if api.status_code == 200: - answer = api.text - return answer.decode('UTF-8') - - def created_url(self, url): - return "tinyarro.ws" in url diff --git a/src/url_shortener/shorteners/tinyurl.py b/src/url_shortener/shorteners/tinyurl.py deleted file mode 100644 index 0a5703a3..00000000 --- a/src/url_shortener/shorteners/tinyurl.py +++ /dev/null @@ -1,20 +0,0 @@ -from __future__ import unicode_literals -from future import standard_library -standard_library.install_aliases() -from .url_shortener import URLShortener -import requests -import urllib.request, urllib.parse, urllib.error -class TinyurlShortener (URLShortener): - def __init__(self, *args, **kwargs): - self.name = "TinyURL.com" - super(TinyurlShortener, self).__init__(*args, **kwargs) - - def _shorten (self, url): - answer = url - api = requests.get ("http://tinyurl.com/api-create.php?url=" + urllib.parse.quote(url)) - if api.status_code == 200: - answer = api.text - return answer - - def created_url (self, url): - return 'tinyurl.com' in url diff --git a/src/url_shortener/shorteners/url_shortener.py b/src/url_shortener/shorteners/url_shortener.py deleted file mode 100644 index cf1d6f76..00000000 --- a/src/url_shortener/shorteners/url_shortener.py +++ /dev/null @@ -1,44 +0,0 @@ -from __future__ import unicode_literals -from builtins import object -import requests - -class URLShortener (object): - - def __init__ (self, *args, **kwargs): - #Stub out arguments, silly object. :( - return super(URLShortener, self).__init__() - - def shorten (self, url): - if self.created_url(url): - return url - else: - return self._shorten(url) - - def _shorten (self, url): - raise NotImplementedError - - def created_url (self, url): - """Returns a boolean indicating whether or not this shortener created a provided url""" - raise NotImplementedError - - def unshorten(self, url): - try: - r=requests.head(url) - if 'location' in list(r.headers.keys()): - if 'dropbox.com' in r.headers['location']: - return handle_dropbox(r.headers['location']) - else: - return r.headers['location'] - else: # if the head method does not work, use get instead. Performance may decrease - r=requests.get(url, allow_redirects=False, stream=True) - # release the connection without downloading the content, we only need the response headers - r.close() - return r.headers['location'] - except: - return url #we cannot expand - -def handle_dropbox(url): - if url.endswith("dl=1"): - return url - else: - return url.replace("dl=0", "dl=1") diff --git a/src/url_shortener/shorteners/xedcc.py b/src/url_shortener/shorteners/xedcc.py deleted file mode 100644 index 117b4f7c..00000000 --- a/src/url_shortener/shorteners/xedcc.py +++ /dev/null @@ -1,21 +0,0 @@ -from __future__ import unicode_literals -from future import standard_library -standard_library.install_aliases() -import urllib.request, urllib.parse, urllib.error -import requests -from . url_shortener import URLShortener - -class XedccShortener (URLShortener): - def __init__ (self, *args, **kwargs): - self.name = "Xed.cc" - super(XedccShortener, self).__init__(*args, **kwargs) - - def _shorten (self, url): - answer = url - api = requests.get ("http://xed.cc/yourls-api.php?action=shorturl&format=simple&url=" + urllib.parse.quote(url)) - if api.status_code == 200: - answer = api.text - return answer - - def created_url (self, url): - return 'xed.cc' in url.lower() diff --git a/src/write_version_data.py b/src/write_version_data.py index a634030f..2136c3a0 100644 --- a/src/write_version_data.py +++ b/src/write_version_data.py @@ -28,11 +28,3 @@ file2 = open("..\\scripts\\twblue.nsi", "w", encoding="utf-8") file2.write(contents) file2.close() print("done") -print("Writing keys to module...") -file3 = open("appkeys.py", "w") -keys = """twitter_api_key = "{}" -twitter_api_secret = "{}" -""".format(os.environ.get("TWITTER_API_KEY"), os.environ.get("TWITTER_API_SECRET")) -file3.write(keys) -file3.close() -print("Wrote set of keys for consumer of {}".format(os.environ.get("TWITTER_API_KEY"))) \ No newline at end of file diff --git a/src/wxUI/buffers/twitter/trends.py b/src/wxUI/buffers/twitter/trends.py index 975a88ca..b9e67101 100644 --- a/src/wxUI/buffers/twitter/trends.py +++ b/src/wxUI/buffers/twitter/trends.py @@ -32,3 +32,5 @@ class trendsPanel(wx.Panel): else: self.list.select_item(0) + def set_focus_in_list(self): + self.list.list.SetFocus() diff --git a/src/wxUI/commonMessageDialogs.py b/src/wxUI/commonMessageDialogs.py index 277ceca7..949589ec 100644 --- a/src/wxUI/commonMessageDialogs.py +++ b/src/wxUI/commonMessageDialogs.py @@ -91,5 +91,9 @@ def existing_filter(): def common_error(reason): return wx.MessageDialog(None, reason, _(u"Error"), wx.OK).ShowModal() +def invalid_configuration(): + return wx.MessageDialog(None, _("The configuration file is invalid."), _("Error"), wx.ICON_ERROR).ShowModal() + def dead_pid(): return wx.MessageDialog(None, _(u"{0} quit unexpectedly the last time it was run. If the problem persists, please report it to the {0} developers.").format(application.name), _(u"Warning"), wx.OK).ShowModal() + diff --git a/src/wxUI/dialogs/__init__.py b/src/wxUI/dialogs/__init__.py index a21239a7..d00a14c0 100644 --- a/src/wxUI/dialogs/__init__.py +++ b/src/wxUI/dialogs/__init__.py @@ -1,3 +1 @@ -from __future__ import absolute_import -from __future__ import unicode_literals -from . import baseDialog, trends, configuration, lists, message, search, find, show_user, update_profile, urlList, userSelection, utils, filterDialogs, userAliasDialogs +from . import baseDialog, trends, configuration, lists, search, find, show_user, update_profile, urlList, userSelection, utils, filterDialogs, userAliasDialogs diff --git a/src/wxUI/dialogs/attach.py b/src/wxUI/dialogs/attach.py deleted file mode 100644 index 0b20a422..00000000 --- a/src/wxUI/dialogs/attach.py +++ /dev/null @@ -1,48 +0,0 @@ -# -*- coding: utf-8 -*- -""" Attach dialog. Taken from socializer: https://github.com/manuelcortez/socializer""" -from __future__ import unicode_literals -import wx -import widgetUtils -from multiplatform_widgets import widgets - -class attachDialog(widgetUtils.BaseDialog): - def __init__(self): - super(attachDialog, self).__init__(None, title=_(u"Add an attachment")) - panel = wx.Panel(self) - sizer = wx.BoxSizer(wx.VERTICAL) - lbl1 = wx.StaticText(panel, wx.ID_ANY, _(u"Attachments")) - self.attachments = widgets.list(panel, _(u"Type"), _(u"Title"), style=wx.LC_REPORT) - box = wx.BoxSizer(wx.HORIZONTAL) - box.Add(lbl1, 0, wx.ALL, 5) - box.Add(self.attachments.list, 0, wx.ALL, 5) - sizer.Add(box, 0, wx.ALL, 5) - static = wx.StaticBox(panel, label=_(u"Add attachments")) - self.photo = wx.Button(panel, wx.ID_ANY, _(u"&Photo")) - self.remove = wx.Button(panel, wx.ID_ANY, _(u"Remove attachment")) - self.remove.Enable(False) - btnsizer = wx.StaticBoxSizer(static, wx.HORIZONTAL) - btnsizer.Add(self.photo, 0, wx.ALL, 5) - sizer.Add(btnsizer, 0, wx.ALL, 5) - ok = wx.Button(panel, wx.ID_OK) - ok.SetDefault() - cancelBtn = wx.Button(panel, wx.ID_CANCEL) - btnSizer = wx.BoxSizer() - btnSizer.Add(ok, 0, wx.ALL, 5) - btnSizer.Add(cancelBtn, 0, wx.ALL, 5) - sizer.Add(btnSizer, 0, wx.ALL, 5) - panel.SetSizer(sizer) - self.SetClientSize(sizer.CalcMin()) - - def get_image(self): - openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) - if openFileDialog.ShowModal() == wx.ID_CANCEL: - return (None, None) - dsc = self.ask_description() - return (openFileDialog.GetPath(), dsc) - - def ask_description(self): - dlg = wx.TextEntryDialog(self, _(u"please provide a description"), _(u"Description")) - dlg.ShowModal() - result = dlg.GetValue() - dlg.Destroy() - return result diff --git a/src/wxUI/dialogs/configuration.py b/src/wxUI/dialogs/configuration.py index 1bc5de9c..e8220ae9 100644 --- a/src/wxUI/dialogs/configuration.py +++ b/src/wxUI/dialogs/configuration.py @@ -233,6 +233,20 @@ class other_buffers(wx.Panel): buffers_list.append(self.buffers.get_text_column(i, 0)) return buffers_list +class templates(wx.Panel, baseDialog.BaseWXDialog): + def __init__(self, parent, tweet_template, dm_template, sent_dm_template, person_template): + super(templates, self).__init__(parent) + sizer = wx.BoxSizer(wx.VERTICAL) + self.tweet = wx.Button(self, wx.ID_ANY, _("Edit template for tweets. Current template: {}").format(tweet_template)) + sizer.Add(self.tweet, 0, wx.ALL, 5) + self.dm = wx.Button(self, wx.ID_ANY, _("Edit template for direct messages. Current template: {}").format(dm_template)) + sizer.Add(self.dm, 0, wx.ALL, 5) + self.sent_dm = wx.Button(self, wx.ID_ANY, _("Edit template for sent direct messages. Current template: {}").format(sent_dm_template)) + sizer.Add(self.sent_dm, 0, wx.ALL, 5) + self.person = wx.Button(self, wx.ID_ANY, _("Edit template for persons. Current template: {}").format(person_template)) + sizer.Add(self.person, 0, wx.ALL, 5) + self.SetSizer(sizer) + class ignoredClients(wx.Panel): def __init__(self, parent, choices): super(ignoredClients, self).__init__(parent=parent) @@ -380,6 +394,10 @@ class configurationDialog(baseDialog.BaseWXDialog): self.ignored_clients = ignoredClients(self.notebook, ignored_clients_list) self.notebook.AddPage(self.ignored_clients, _(u"Ignored clients")) + def create_templates(self, tweet_template, dm_template, sent_dm_template, person_template): + self.templates = templates(self.notebook, tweet_template=tweet_template, dm_template=dm_template, sent_dm_template=sent_dm_template, person_template=person_template) + self.notebook.AddPage(self.templates, _("Templates")) + def create_sound(self, output_devices, input_devices, soundpacks): self.sound = sound(self.notebook, output_devices, input_devices, soundpacks) self.notebook.AddPage(self.sound, _(u"Sound")) diff --git a/src/wxUI/dialogs/message.py b/src/wxUI/dialogs/message.py deleted file mode 100644 index 8eadfdd9..00000000 --- a/src/wxUI/dialogs/message.py +++ /dev/null @@ -1,471 +0,0 @@ -# -*- coding: utf-8 -*- -import wx -import widgetUtils - -class textLimited(widgetUtils.BaseDialog): - def __init__(self, *args, **kwargs): - super(textLimited, self).__init__(parent=None, *args, **kwargs) - - def createTextArea(self, message="", text=""): - if not hasattr(self, "panel"): - self.panel = wx.Panel(self) - self.label = wx.StaticText(self.panel, -1, message) - self.SetTitle(str(len(text))) - self.text = wx.TextCtrl(self.panel, -1, text, size=(439, -1),style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER) -# font = self.text.GetFont() -# dc = wx.WindowDC(self.text) -# dc.SetFont(font) -# x, y = dc.GetTextExtent("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") -# self.text.SetSize((x, y)) - self.Bind(wx.EVT_CHAR_HOOK, self.handle_keys, self.text) - self.text.SetFocus() - self.textBox = wx.BoxSizer(wx.HORIZONTAL) - self.textBox.Add(self.label, 0, wx.ALL, 5) - self.textBox.Add(self.text, 0, wx.ALL, 5) - - def text_focus(self): - self.text.SetFocus() - - def get_text(self): - return self.text.GetValue() - - def set_text(self, text): - return self.text.ChangeValue(text) - - def set_title(self, new_title): - return self.SetTitle(new_title) - - def enable_button(self, buttonName): - if hasattr(self, buttonName): - return getattr(self, buttonName).Enable() - - def disable_button(self, buttonName): - if hasattr(self, buttonName): - return getattr(self, buttonName).Disable() - - def onSelect(self, ev): - self.text.SelectAll() - - def handle_keys(self, event): - shift=event.ShiftDown() - if event.GetKeyCode() == wx.WXK_RETURN and shift==False and hasattr(self,'okButton'): - wx.PostEvent(self.okButton.GetEventHandler(), wx.PyCommandEvent(wx.EVT_BUTTON.typeId,wx.ID_OK)) - else: - event.Skip() - - def set_cursor_at_end(self): - self.text.SetInsertionPoint(len(self.text.GetValue())) - - def set_cursor_at_position(self, position): - self.text.SetInsertionPoint(position) - - def get_position(self): - return self.text.GetInsertionPoint() - - def popup_menu(self, menu): - self.PopupMenu(menu, self.text.GetPosition()) - -class tweet(textLimited): - def createControls(self, title, message, text): - self.mainBox = wx.BoxSizer(wx.VERTICAL) - self.createTextArea(message, text) - self.mainBox.Add(self.textBox, 0, wx.ALL, 5) - self.long_tweet = wx.CheckBox(self.panel, -1, _(u"&Long tweet")) - self.upload_image = wx.Button(self.panel, -1, _(u"&Upload image..."), size=wx.DefaultSize) - self.spellcheck = wx.Button(self.panel, -1, _("Check &spelling..."), size=wx.DefaultSize) - self.attach = wx.Button(self.panel, -1, _(u"&Attach audio..."), size=wx.DefaultSize) - self.shortenButton = wx.Button(self.panel, -1, _(u"Sh&orten URL"), size=wx.DefaultSize) - self.unshortenButton = wx.Button(self.panel, -1, _(u"&Expand URL"), size=wx.DefaultSize) - self.shortenButton.Disable() - self.unshortenButton.Disable() - self.translateButton = wx.Button(self.panel, -1, _(u"&Translate..."), size=wx.DefaultSize) - self.autocompletionButton = wx.Button(self.panel, -1, _(u"Auto&complete users")) - self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Sen&d"), size=wx.DefaultSize) - self.okButton.SetDefault() - cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize) - self.buttonsBox1 = wx.BoxSizer(wx.HORIZONTAL) - self.buttonsBox1.Add(self.upload_image, 0, wx.ALL, 10) - self.buttonsBox1.Add(self.spellcheck, 0, wx.ALL, 10) - self.buttonsBox1.Add(self.attach, 0, wx.ALL, 10) - self.mainBox.Add(self.buttonsBox1, 0, wx.ALL, 10) - self.buttonsBox2 = wx.BoxSizer(wx.HORIZONTAL) - self.buttonsBox2.Add(self.shortenButton, 0, wx.ALL, 10) - self.buttonsBox2.Add(self.unshortenButton, 0, wx.ALL, 10) - self.buttonsBox2.Add(self.translateButton, 0, wx.ALL, 10) - self.mainBox.Add(self.buttonsBox2, 0, wx.ALL, 10) - self.ok_cancelSizer = wx.BoxSizer(wx.HORIZONTAL) - self.ok_cancelSizer.Add(self.autocompletionButton, 0, wx.ALL, 10) - self.ok_cancelSizer.Add(self.okButton, 0, wx.ALL, 10) - self.ok_cancelSizer.Add(cancelButton, 0, wx.ALL, 10) - self.mainBox.Add(self.ok_cancelSizer) - selectId = wx.ID_ANY - self.Bind(wx.EVT_MENU, self.onSelect, id=selectId) - self.accel_tbl = wx.AcceleratorTable([ - (wx.ACCEL_CTRL, ord('A'), selectId), - ]) - self.SetAcceleratorTable(self.accel_tbl) - self.panel.SetSizer(self.mainBox) - - def __init__(self, title, message, text, *args, **kwargs): - super(tweet, self).__init__() - self.shift=False - self.createControls(message, title, text) - self.SetClientSize(self.mainBox.CalcMin()) - - def get_image(self): - openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) - if openFileDialog.ShowModal() == wx.ID_CANCEL: - return None - return open(openFileDialog.GetPath(), "rb") - - -class retweet(tweet): - def createControls(self, title, message, text): - self.mainBox = wx.BoxSizer(wx.VERTICAL) - self.createTextArea(message, "") - label = wx.StaticText(self.panel, -1, _(u"Retweet")) - self.text2 = wx.TextCtrl(self.panel, -1, text, size=(439, -1), style=wx.TE_MULTILINE|wx.TE_READONLY) - self.retweetBox = wx.BoxSizer(wx.HORIZONTAL) - self.retweetBox.Add(label, 0, wx.ALL, 5) - self.retweetBox.Add(self.text2, 0, wx.ALL, 5) - self.mainBox.Add(self.textBox, 0, wx.ALL, 5) - self.mainBox.Add(self.retweetBox, 0, wx.ALL, 5) - self.upload_image = wx.Button(self.panel, -1, _(u"&Upload image..."), size=wx.DefaultSize) - self.spellcheck = wx.Button(self.panel, -1, _("Check &spelling..."), size=wx.DefaultSize) - self.attach = wx.Button(self.panel, -1, _(u"&Attach audio..."), size=wx.DefaultSize) - self.shortenButton = wx.Button(self.panel, -1, _(u"Sh&orten URL"), size=wx.DefaultSize) - self.unshortenButton = wx.Button(self.panel, -1, _(u"&Expand URL"), size=wx.DefaultSize) - self.shortenButton.Disable() - self.unshortenButton.Disable() - self.translateButton = wx.Button(self.panel, -1, _(u"&Translate..."), size=wx.DefaultSize) - self.autocompletionButton = wx.Button(self.panel, -1, _(u"Auto&complete users")) - self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Sen&d"), size=wx.DefaultSize) - self.okButton.SetDefault() - cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize) - self.buttonsBox1 = wx.BoxSizer(wx.HORIZONTAL) - self.buttonsBox1.Add(self.upload_image, 0, wx.ALL, 10) - self.buttonsBox1.Add(self.spellcheck, 0, wx.ALL, 10) - self.buttonsBox1.Add(self.attach, 0, wx.ALL, 10) - self.mainBox.Add(self.buttonsBox1, 0, wx.ALL, 10) - self.buttonsBox2 = wx.BoxSizer(wx.HORIZONTAL) - self.buttonsBox2.Add(self.shortenButton, 0, wx.ALL, 10) - self.buttonsBox2.Add(self.unshortenButton, 0, wx.ALL, 10) - self.buttonsBox2.Add(self.translateButton, 0, wx.ALL, 10) - self.mainBox.Add(self.buttonsBox2, 0, wx.ALL, 10) - self.ok_cancelSizer = wx.BoxSizer(wx.HORIZONTAL) - self.ok_cancelSizer.Add(self.autocompletionButton, 0, wx.ALL, 10) - self.ok_cancelSizer.Add(self.okButton, 0, wx.ALL, 10) - self.ok_cancelSizer.Add(cancelButton, 0, wx.ALL, 10) - self.mainBox.Add(self.ok_cancelSizer) - selectId = wx.ID_ANY - self.Bind(wx.EVT_MENU, self.onSelect, id=selectId) - self.accel_tbl = wx.AcceleratorTable([ - (wx.ACCEL_CTRL, ord('A'), selectId), - ]) - self.SetAcceleratorTable(self.accel_tbl) - self.panel.SetSizer(self.mainBox) - - def __init__(self, title, message, text, *args, **kwargs): - super(tweet, self).__init__() - self.createControls(message, title, text) -# self.onTimer(wx.EVT_CHAR_HOOK) - self.SetClientSize(self.mainBox.CalcMin()) - - def get_image(self): - openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) - if openFileDialog.ShowModal() == wx.ID_CANCEL: - return None - return open(openFileDialog.GetPath(), "rb") - -class dm(textLimited): - def createControls(self, title, message, users): - self.panel = wx.Panel(self) - self.mainBox = wx.BoxSizer(wx.VERTICAL) - label = wx.StaticText(self.panel, -1, _(u"&Recipient")) - self.cb = wx.ComboBox(self.panel, -1, choices=users, value=users[0], size=wx.DefaultSize) - self.autocompletionButton = wx.Button(self.panel, -1, _(u"Auto&complete users")) - self.createTextArea(message, text="") - userBox = wx.BoxSizer(wx.HORIZONTAL) - userBox.Add(label, 0, wx.ALL, 5) - userBox.Add(self.cb, 0, wx.ALL, 5) - userBox.Add(self.autocompletionButton, 0, wx.ALL, 5) - self.mainBox.Add(userBox, 0, wx.ALL, 5) - self.mainBox.Add(self.textBox, 0, wx.ALL, 5) - self.spellcheck = wx.Button(self.panel, -1, _("Check &spelling..."), size=wx.DefaultSize) - self.attach = wx.Button(self.panel, -1, _(u"&Attach audio..."), size=wx.DefaultSize) - self.shortenButton = wx.Button(self.panel, -1, _(u"Sh&orten URL"), size=wx.DefaultSize) - self.unshortenButton = wx.Button(self.panel, -1, _(u"&Expand URL"), size=wx.DefaultSize) - self.shortenButton.Disable() - self.unshortenButton.Disable() - self.translateButton = wx.Button(self.panel, -1, _(u"&Translate..."), size=wx.DefaultSize) - self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Sen&d"), size=wx.DefaultSize) - self.okButton.SetDefault() - cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize) - self.buttonsBox = wx.BoxSizer(wx.HORIZONTAL) - self.buttonsBox.Add(self.spellcheck, 0, wx.ALL, 5) - self.buttonsBox.Add(self.attach, 0, wx.ALL, 5) - self.mainBox.Add(self.buttonsBox, 0, wx.ALL, 5) - self.buttonsBox1 = wx.BoxSizer(wx.HORIZONTAL) - self.buttonsBox1.Add(self.shortenButton, 0, wx.ALL, 5) - self.buttonsBox1.Add(self.unshortenButton, 0, wx.ALL, 5) - self.buttonsBox1.Add(self.translateButton, 0, wx.ALL, 5) - self.mainBox.Add(self.buttonsBox1, 0, wx.ALL, 5) - self.buttonsBox3 = wx.BoxSizer(wx.HORIZONTAL) - self.buttonsBox3.Add(self.okButton, 0, wx.ALL, 5) - self.buttonsBox3.Add(cancelButton, 0, wx.ALL, 5) - self.mainBox.Add(self.buttonsBox3, 0, wx.ALL, 5) - self.panel.SetSizer(self.mainBox) - self.SetClientSize(self.mainBox.CalcMin()) - - def __init__(self, title, message, users, *args, **kwargs): - super(dm, self).__init__() - self.createControls(title, message, users) -# self.onTimer(wx.EVT_CHAR_HOOK) -# self.SetClientSize(self.mainBox.CalcMin()) - - def get_user(self): - return self.cb.GetValue() - - def set_user(self, user): - return self.cb.SetValue(user) - -class reply(textLimited): - - def get_image(self): - openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) - if openFileDialog.ShowModal() == wx.ID_CANCEL: - return None - return open(openFileDialog.GetPath(), "rb") - - def createControls(self, title, message, text): - self.mainBox = wx.BoxSizer(wx.VERTICAL) - self.createTextArea(message, text) - self.mainBox.Add(self.textBox, 0, wx.ALL, 5) - self.usersbox = wx.BoxSizer(wx.VERTICAL) - self.mentionAll = wx.CheckBox(self.panel, -1, _(u"&Mention to all"), size=wx.DefaultSize) - self.mentionAll.Disable() - self.usersbox.Add(self.mentionAll, 0, wx.ALL, 5) - self.checkboxes = [] - for i in self.users: - user_checkbox = wx.CheckBox(self.panel, -1, "@"+i, size=wx.DefaultSize) - self.checkboxes.append(user_checkbox) - self.usersbox.Add(self.checkboxes[-1], 0, wx.ALL, 5) - self.mainBox.Add(self.usersbox, 0, wx.ALL, 10) - self.long_tweet = wx.CheckBox(self.panel, -1, _(u"&Long tweet")) - self.upload_image = wx.Button(self.panel, -1, _(u"&Upload image..."), size=wx.DefaultSize) - self.spellcheck = wx.Button(self.panel, -1, _("Check &spelling..."), size=wx.DefaultSize) - self.attach = wx.Button(self.panel, -1, _(u"&Attach audio..."), size=wx.DefaultSize) - self.shortenButton = wx.Button(self.panel, -1, _(u"Sh&orten URL"), size=wx.DefaultSize) - self.unshortenButton = wx.Button(self.panel, -1, _(u"&Expand URL"), size=wx.DefaultSize) - self.shortenButton.Disable() - self.unshortenButton.Disable() - self.translateButton = wx.Button(self.panel, -1, _(u"&Translate..."), size=wx.DefaultSize) - self.autocompletionButton = wx.Button(self.panel, -1, _(u"Auto&complete users")) - self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Sen&d"), size=wx.DefaultSize) - self.okButton.SetDefault() - cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize) - self.buttonsBox1 = wx.BoxSizer(wx.HORIZONTAL) - self.buttonsBox1.Add(self.upload_image, 0, wx.ALL, 10) - self.buttonsBox1.Add(self.spellcheck, 0, wx.ALL, 10) - self.buttonsBox1.Add(self.attach, 0, wx.ALL, 10) - self.mainBox.Add(self.buttonsBox1, 0, wx.ALL, 10) - self.buttonsBox2 = wx.BoxSizer(wx.HORIZONTAL) - self.buttonsBox2.Add(self.shortenButton, 0, wx.ALL, 10) - self.buttonsBox2.Add(self.unshortenButton, 0, wx.ALL, 10) - self.buttonsBox2.Add(self.translateButton, 0, wx.ALL, 10) - self.mainBox.Add(self.buttonsBox2, 0, wx.ALL, 10) - self.ok_cancelSizer = wx.BoxSizer(wx.HORIZONTAL) - self.ok_cancelSizer.Add(self.autocompletionButton, 0, wx.ALL, 10) - self.ok_cancelSizer.Add(self.okButton, 0, wx.ALL, 10) - self.ok_cancelSizer.Add(cancelButton, 0, wx.ALL, 10) - self.mainBox.Add(self.ok_cancelSizer, 0, wx.ALL, 10) - selectId = wx.ID_ANY - self.Bind(wx.EVT_MENU, self.onSelect, id=selectId) - self.accel_tbl = wx.AcceleratorTable([ - (wx.ACCEL_CTRL, ord('A'), selectId), - ]) - self.SetAcceleratorTable(self.accel_tbl) - self.panel.SetSizer(self.mainBox) - - def __init__(self, title, message, text, users=[], *args, **kwargs): - self.users = users - super(reply, self).__init__() - self.shift=False - self.createControls(message, title, text) - self.SetClientSize(self.mainBox.CalcMin()) - -class viewTweet(widgetUtils.BaseDialog): - def set_title(self, lenght): - self.SetTitle(_(u"Tweet - %i characters ") % (lenght,)) - - def __init__(self, text, rt_count, favs_count, source, date="", *args, **kwargs): - super(viewTweet, self).__init__(None, size=(850,850)) - panel = wx.Panel(self) - label = wx.StaticText(panel, -1, _(u"Tweet")) - self.text = wx.TextCtrl(panel, -1, text, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180)) - dc = wx.WindowDC(self.text) - dc.SetFont(self.text.GetFont()) - (x, y) = dc.GetMultiLineTextExtent("0"*140) - self.text.SetSize((x, y)) - self.text.SetFocus() - textBox = wx.BoxSizer(wx.HORIZONTAL) - textBox.Add(label, 0, wx.ALL, 5) - textBox.Add(self.text, 1, wx.EXPAND, 5) - mainBox = wx.BoxSizer(wx.VERTICAL) - mainBox.Add(textBox, 0, wx.ALL, 5) - label2 = wx.StaticText(panel, -1, _(u"Image description")) - self.image_description = wx.TextCtrl(panel, -1, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180)) - dc = wx.WindowDC(self.image_description) - dc.SetFont(self.image_description.GetFont()) - (x, y) = dc.GetMultiLineTextExtent("0"*450) - self.image_description.SetSize((x, y)) - self.image_description.Enable(False) - iBox = wx.BoxSizer(wx.HORIZONTAL) - iBox.Add(label2, 0, wx.ALL, 5) - iBox.Add(self.image_description, 1, wx.EXPAND, 5) - mainBox.Add(iBox, 0, wx.ALL, 5) - rtCountLabel = wx.StaticText(panel, -1, _(u"Retweets: ")) - rtCount = wx.TextCtrl(panel, -1, rt_count, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) - rtBox = wx.BoxSizer(wx.HORIZONTAL) - rtBox.Add(rtCountLabel, 0, wx.ALL, 5) - rtBox.Add(rtCount, 0, wx.ALL, 5) - favsCountLabel = wx.StaticText(panel, -1, _(u"Likes: ")) - favsCount = wx.TextCtrl(panel, -1, favs_count, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) - favsBox = wx.BoxSizer(wx.HORIZONTAL) - favsBox.Add(favsCountLabel, 0, wx.ALL, 5) - favsBox.Add(favsCount, 0, wx.ALL, 5) - sourceLabel = wx.StaticText(panel, -1, _(u"Source: ")) - sourceTweet = wx.TextCtrl(panel, -1, source, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) - sourceBox = wx.BoxSizer(wx.HORIZONTAL) - sourceBox.Add(sourceLabel, 0, wx.ALL, 5) - sourceBox.Add(sourceTweet, 0, wx.ALL, 5) - dateLabel = wx.StaticText(panel, -1, _(u"Date: ")) - dateTweet = wx.TextCtrl(panel, -1, date, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) - dc = wx.WindowDC(dateTweet) - dc.SetFont(dateTweet.GetFont()) - (x, y) = dc.GetTextExtent("0"*100) - dateTweet.SetSize((x, y)) - dateBox = wx.BoxSizer(wx.HORIZONTAL) - dateBox.Add(dateLabel, 0, wx.ALL, 5) - dateBox.Add(dateTweet, 0, wx.ALL, 5) - infoBox = wx.BoxSizer(wx.HORIZONTAL) - infoBox.Add(rtBox, 0, wx.ALL, 5) - infoBox.Add(favsBox, 0, wx.ALL, 5) - infoBox.Add(sourceBox, 0, wx.ALL, 5) - mainBox.Add(infoBox, 0, wx.ALL, 5) - mainBox.Add(dateBox, 0, wx.ALL, 5) - self.share = wx.Button(panel, wx.ID_ANY, _("Copy link to clipboard")) - self.share.Enable(False) - self.spellcheck = wx.Button(panel, -1, _("Check &spelling..."), size=wx.DefaultSize) - self.unshortenButton = wx.Button(panel, -1, _(u"&Expand URL"), size=wx.DefaultSize) - self.unshortenButton.Disable() - self.translateButton = wx.Button(panel, -1, _(u"&Translate..."), size=wx.DefaultSize) - cancelButton = wx.Button(panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize) - cancelButton.SetDefault() - buttonsBox = wx.BoxSizer(wx.HORIZONTAL) - buttonsBox.Add(self.share, 0, wx.ALL, 5) - buttonsBox.Add(self.spellcheck, 0, wx.ALL, 5) - buttonsBox.Add(self.unshortenButton, 0, wx.ALL, 5) - buttonsBox.Add(self.translateButton, 0, wx.ALL, 5) - buttonsBox.Add(cancelButton, 0, wx.ALL, 5) - mainBox.Add(buttonsBox, 0, wx.ALL, 5) - selectId = wx.ID_ANY - self.Bind(wx.EVT_MENU, self.onSelect, id=selectId) - self.accel_tbl = wx.AcceleratorTable([ - (wx.ACCEL_CTRL, ord('A'), selectId), - ]) - self.SetAcceleratorTable(self.accel_tbl) - panel.SetSizer(mainBox) - self.SetClientSize(mainBox.CalcMin()) - - def set_text(self, text): - self.text.ChangeValue(text) - - def get_text(self): - return self.text.GetValue() - - def set_image_description(self, desc): - self.image_description.Enable(True) - if len(self.image_description.GetValue()) == 0: - self.image_description.SetValue(desc) - else: - self.image_description.SetValue(self.image_description.GetValue()+"\n"+desc) - - def text_focus(self): - self.text.SetFocus() - - def onSelect(self, ev): - self.text.SelectAll() - - def enable_button(self, buttonName): - if hasattr(self, buttonName): - return getattr(self, buttonName).Enable() - -class viewNonTweet(widgetUtils.BaseDialog): - - def __init__(self, text, date="", *args, **kwargs): - super(viewNonTweet, self).__init__(None, size=(850,850)) - self.SetTitle(_(u"View")) - panel = wx.Panel(self) - label = wx.StaticText(panel, -1, _(u"Item")) - self.text = wx.TextCtrl(parent=panel, id=-1, value=text, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180)) - dc = wx.WindowDC(self.text) - dc.SetFont(self.text.GetFont()) - (x, y) = dc.GetMultiLineTextExtent("0"*140) - self.text.SetSize((x, y)) - self.text.SetFocus() - textBox = wx.BoxSizer(wx.HORIZONTAL) - textBox.Add(label, 0, wx.ALL, 5) - textBox.Add(self.text, 1, wx.EXPAND, 5) - mainBox = wx.BoxSizer(wx.VERTICAL) - mainBox.Add(textBox, 0, wx.ALL, 5) - if date != "": - dateLabel = wx.StaticText(panel, -1, _(u"Date: ")) - date = wx.TextCtrl(panel, -1, date, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) - dc = wx.WindowDC(date) - dc.SetFont(date.GetFont()) - (x, y) = dc.GetTextExtent("0"*100) - date.SetSize((x, y)) - dateBox = wx.BoxSizer(wx.HORIZONTAL) - dateBox.Add(dateLabel, 0, wx.ALL, 5) - dateBox.Add(date, 0, wx.ALL, 5) - mainBox.Add(dateBox, 0, wx.ALL, 5) - self.share = wx.Button(panel, wx.ID_ANY, _("Copy link to clipboard")) - self.share.Enable(False) - self.spellcheck = wx.Button(panel, -1, _("Check &spelling..."), size=wx.DefaultSize) - self.unshortenButton = wx.Button(panel, -1, _(u"&Expand URL"), size=wx.DefaultSize) - self.unshortenButton.Disable() - self.translateButton = wx.Button(panel, -1, _(u"&Translate..."), size=wx.DefaultSize) - cancelButton = wx.Button(panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize) - cancelButton.SetDefault() - buttonsBox = wx.BoxSizer(wx.HORIZONTAL) - buttonsBox.Add(self.share, 0, wx.ALL, 5) - buttonsBox.Add(self.spellcheck, 0, wx.ALL, 5) - buttonsBox.Add(self.unshortenButton, 0, wx.ALL, 5) - buttonsBox.Add(self.translateButton, 0, wx.ALL, 5) - buttonsBox.Add(cancelButton, 0, wx.ALL, 5) - mainBox.Add(buttonsBox, 0, wx.ALL, 5) - selectId = wx.ID_ANY - self.Bind(wx.EVT_MENU, self.onSelect, id=selectId) - self.accel_tbl = wx.AcceleratorTable([ - (wx.ACCEL_CTRL, ord('A'), selectId), - ]) - self.SetAcceleratorTable(self.accel_tbl) - panel.SetSizer(mainBox) - self.SetClientSize(mainBox.CalcMin()) - - def onSelect(self, ev): - self.text.SelectAll() - - def set_text(self, text): - self.text.ChangeValue(text) - - def get_text(self): - return self.text.GetValue() - - def text_focus(self): - self.text.SetFocus() - - def enable_button(self, buttonName): - if hasattr(self, buttonName): - return getattr(self, buttonName).Enable() diff --git a/src/wxUI/dialogs/twitterDialogs/__init__.py b/src/wxUI/dialogs/twitterDialogs/__init__.py new file mode 100644 index 00000000..f067ea11 --- /dev/null +++ b/src/wxUI/dialogs/twitterDialogs/__init__.py @@ -0,0 +1,2 @@ +from .tweetDialogs import tweet, reply, dm, viewTweet, viewNonTweet, poll +from .templateDialogs import EditTemplateDialog \ No newline at end of file diff --git a/src/wxUI/dialogs/twitterDialogs/templateDialogs.py b/src/wxUI/dialogs/twitterDialogs/templateDialogs.py new file mode 100644 index 00000000..9efa96aa --- /dev/null +++ b/src/wxUI/dialogs/twitterDialogs/templateDialogs.py @@ -0,0 +1,52 @@ +# -*- coding: UTF-8 -*- +import wx +import output +from typing import List + +class EditTemplateDialog(wx.Dialog): + def __init__(self, template: str, variables: List[str] = [], default_template: str = "", *args, **kwds) -> None: + super(EditTemplateDialog, self).__init__(parent=None, title=_("Edit Template"), *args, **kwds) + self.default_template = default_template + mainSizer = wx.BoxSizer(wx.VERTICAL) + sizer_1 = wx.BoxSizer(wx.HORIZONTAL) + mainSizer.Add(sizer_1, 1, wx.EXPAND, 0) + label_1 = wx.StaticText(self, wx.ID_ANY, _("Edit template")) + sizer_1.Add(label_1, 0, 0, 0) + self.template = wx.TextCtrl(self, wx.ID_ANY, template) + sizer_1.Add(self.template, 0, 0, 0) + sizer_2 = wx.StaticBoxSizer(wx.StaticBox(self, wx.ID_ANY, _("Available variables")), wx.HORIZONTAL) + mainSizer.Add(sizer_2, 1, wx.EXPAND, 0) + self.variables = wx.ListBox(self, wx.ID_ANY, choices=["$"+v for v in variables]) + self.variables.Bind(wx.EVT_CHAR_HOOK, self.on_keypress) + sizer_2.Add(self.variables, 0, 0, 0) + sizer_3 = wx.StdDialogButtonSizer() + mainSizer.Add(sizer_3, 0, wx.ALIGN_RIGHT | wx.ALL, 4) + self.button_SAVE = wx.Button(self, wx.ID_SAVE) + self.button_SAVE.SetDefault() + sizer_3.AddButton(self.button_SAVE) + self.button_CANCEL = wx.Button(self, wx.ID_CANCEL) + sizer_3.AddButton(self.button_CANCEL) + self.button_RESTORE = wx.Button(self, wx.ID_ANY, _("Restore template")) + self.button_RESTORE.Bind(wx.EVT_BUTTON, self.on_restore) + sizer_3.AddButton(self.button_CANCEL) + sizer_3.Realize() + self.SetSizer(mainSizer) + mainSizer.Fit(self) + self.SetAffirmativeId(self.button_SAVE.GetId()) + self.SetEscapeId(self.button_CANCEL.GetId()) + self.Layout() + + def on_keypress(self, event, *args, **kwargs): + if event.GetKeyCode() == wx.WXK_RETURN: + self.template.ChangeValue(self.template.GetValue()+self.variables.GetStringSelection()+", ") + output.speak(self.template.GetValue()+self.variables.GetStringSelection()+", ") + return + event.Skip() + + def on_restore(self, *args, **kwargs) -> None: + self.template.ChangeValue(self.default_template) + output.speak(_("Restored template to {}.").format(self.default_template)) + self.template.SetFocus() + +def invalid_template() -> None: + wx.MessageDialog(None, _("the template you have specified include variables that do not exists for the object. Please fix the template and try again. For your reference, you can see a list of all available variables in the variables list while editing your template."), _("Invalid template"), wx.ICON_ERROR).ShowModal() \ No newline at end of file diff --git a/src/wxUI/dialogs/twitterDialogs/tweetDialogs.py b/src/wxUI/dialogs/twitterDialogs/tweetDialogs.py new file mode 100644 index 00000000..b917a25b --- /dev/null +++ b/src/wxUI/dialogs/twitterDialogs/tweetDialogs.py @@ -0,0 +1,542 @@ +""" GUI dialogs for tweet writing and displaying. """ +import wx +from typing import List + +class tweet(wx.Dialog): + def __init__(self, title: str, caption: str, message: str = "", max_length: int = 280, thread_mode: bool = True, *args, **kwds) -> None: + """ Creates the basic Tweet dialog. This might be considered the base class for other dialogs. + title str: title to be used in the dialog. + caption str: This is the text to be placed alongside the text field. + message str: Text to be inserted in the tweet. + max_length int: Maximum amount of characters the tweet will accept. By default is 280 chahracters. + thread_mode bool: If set to False, disables the button that allows to make threads by adding more tweets. + """ + super(tweet, self).__init__(parent=None, *args, **kwds) + self.SetTitle(title) + self.create_controls(max_length=max_length, caption=caption, message=message, thread_mode=thread_mode) + + def create_controls(self, message: str, caption: str, max_length: int, thread_mode: bool) -> None: + panel = wx.Panel(self) + mainBox = wx.BoxSizer(wx.VERTICAL) + text_sizer = wx.BoxSizer(wx.HORIZONTAL) + mainBox.Add(text_sizer, 1, wx.EXPAND, 0) + label_1 = wx.StaticText(panel, wx.ID_ANY, caption) + text_sizer.Add(label_1, 0, 0, 0) + self.text = wx.TextCtrl(panel, wx.ID_ANY, "", size=(444, -1), style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER) + self.Bind(wx.EVT_CHAR_HOOK, self.handle_keys, self.text) + text_sizer.Add(self.text, 1, wx.EXPAND, 0) + list_sizer = wx.BoxSizer(wx.HORIZONTAL) + mainBox.Add(list_sizer, 1, wx.EXPAND, 0) + Attachment_sizer = wx.BoxSizer(wx.VERTICAL) + list_sizer.Add(Attachment_sizer, 1, wx.EXPAND, 0) + label_2 = wx.StaticText(panel, wx.ID_ANY, _("Attachments")) + Attachment_sizer.Add(label_2, 0, 0, 0) + self.attachments = wx.ListCtrl(panel, wx.ID_ANY, style=wx.BORDER_SUNKEN | wx.LC_HRULES | wx.LC_REPORT | wx.LC_SINGLE_SEL | wx.LC_VRULES) + self.attachments.AppendColumn(_("File")) + self.attachments.AppendColumn(_("Type")) + self.attachments.AppendColumn(_("Description")) + Attachment_sizer.Add(self.attachments, 1, wx.EXPAND, 0) + self.remove_attachment = wx.Button(panel, wx.ID_ANY, _("Delete attachment")) + self.remove_attachment.Enable(False) + Attachment_sizer.Add(self.remove_attachment, 0, 0, 0) + tweet_sizer = wx.BoxSizer(wx.VERTICAL) + list_sizer.Add(tweet_sizer, 1, wx.EXPAND, 0) + label_3 = wx.StaticText(panel, wx.ID_ANY, _("Added Tweets")) + tweet_sizer.Add(label_3, 0, 0, 0) + self.tweets = wx.ListCtrl(panel, wx.ID_ANY, style=wx.BORDER_SUNKEN | wx.LC_HRULES | wx.LC_REPORT | wx.LC_SINGLE_SEL | wx.LC_VRULES) + self.tweets.AppendColumn(_("Text")) + self.tweets.AppendColumn(_("Attachments")) + self.tweets.Enable(False) + tweet_sizer.Add(self.tweets, 1, wx.EXPAND, 0) + self.remove_tweet = wx.Button(panel, wx.ID_ANY, _("Delete tweet")) + self.remove_tweet.Enable(False) + tweet_sizer.Add(self.remove_tweet, 0, 0, 0) + btn_sizer_1 = wx.BoxSizer(wx.HORIZONTAL) + mainBox.Add(btn_sizer_1, 1, wx.EXPAND, 0) + self.add = wx.Button(panel, wx.ID_ANY, _("A&dd...")) + btn_sizer_1.Add(self.add, 0, 0, 0) + self.add_tweet = wx.Button(panel, wx.ID_ANY, _("Add t&weet")) + self.add_tweet.Enable(thread_mode) + btn_sizer_1.Add(self.add_tweet, 0, 0, 0) + self.add_audio = wx.Button(panel, wx.ID_ANY, _("&Attach audio...")) + btn_sizer_1.Add(self.add_audio, 0, 0, 0) + btn_sizer_2 = wx.BoxSizer(wx.HORIZONTAL) + mainBox.Add(btn_sizer_2, 1, wx.EXPAND, 0) + self.autocomplete_users = wx.Button(panel, wx.ID_ANY, _("Auto&complete users")) + btn_sizer_2.Add(self.autocomplete_users, 0, 0, 0) + self.spellcheck = wx.Button(panel, wx.ID_ANY, _("Check &spelling...")) + btn_sizer_2.Add(self.spellcheck, 0, 0, 0) + self.translate = wx.Button(panel, wx.ID_ANY, _("&Translate")) + btn_sizer_2.Add(self.translate, 0, 0, 0) + ok_cancel_sizer = wx.StdDialogButtonSizer() + mainBox.Add(ok_cancel_sizer, 0, wx.ALIGN_RIGHT | wx.ALL, 4) + self.send = wx.Button(panel, wx.ID_OK, _("Sen&d")) + self.send.SetDefault() + ok_cancel_sizer.Add(self.send, 0, 0, 0) + self.cancel = wx.Button(panel, wx.ID_CANCEL, "") + ok_cancel_sizer.AddButton(self.cancel) + ok_cancel_sizer.Realize() + panel.SetSizer(mainBox) + self.Fit() + self.SetAffirmativeId(self.send.GetId()) + self.SetEscapeId(self.cancel.GetId()) + self.Layout() + + def handle_keys(self, event: wx.Event, *args, **kwargs) -> None: + """ Allows to react to certain keyboard events from the text control. """ + shift=event.ShiftDown() + if event.GetKeyCode() == wx.WXK_RETURN and shift==False and hasattr(self,'send'): + self.EndModal(wx.ID_OK) + else: + event.Skip() + + def reset_controls(self) -> None: + """ Resetss text control and attachments to their default, empty values. This is used while adding more tweets in a thread. """ + self.text.ChangeValue("") + self.attachments.DeleteAllItems() + + def add_item(self, list_type: str = "attachment", item: List[str] = []) -> None: + """ Adds an item to a list control. Item should be a list with the same amount of items for each column present in the ListCtrl. """ + if list_type == "attachment": + self.attachments.Append(item) + else: + self.tweets.Append(item) + + def remove_item(self, list_type: str = "attachment") -> None: + if list_type == "attachment": + item = self.attachments.GetFocusedItem() + if item > -1: + self.attachments.DeleteItem(item) + else: + item = self.tweets.GetFocusedItem() + if item > -1: + self.tweets.DeleteItem(item) + + def attach_menu(self, event=None, enabled=True, *args, **kwargs): + menu = wx.Menu() + self.add_image = menu.Append(wx.ID_ANY, _("Image")) + self.add_image.Enable(enabled) + self.add_video = menu.Append(wx.ID_ANY, _("Video")) + self.add_video.Enable(enabled) + self.add_poll = menu.Append(wx.ID_ANY, _("Poll")) + self.add_poll.Enable(enabled) + return menu + + def ask_description(self): + dlg = wx.TextEntryDialog(self, _(u"please provide a description"), _(u"Description")) + dlg.ShowModal() + result = dlg.GetValue() + dlg.Destroy() + return result + + def get_image(self): + openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) + if openFileDialog.ShowModal() == wx.ID_CANCEL: + return (None, None) + dsc = self.ask_description() + return (openFileDialog.GetPath(), dsc) + + def get_video(self): + openFileDialog = wx.FileDialog(self, _("Select the video to be uploaded"), "", "", _("Video files (*.mp4)|*.mp4"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) + if openFileDialog.ShowModal() == wx.ID_CANCEL: + return None + return openFileDialog.GetPath() + + def unable_to_attach_file(self, *args, **kwargs): + return wx.MessageDialog(self, _("It is not possible to add more attachments. Please make sure your tweet complies with Twitter'S attachment rules. You can add only one video or GIF in every tweet, and a maximum of 4 photos."), _("Error adding attachment"), wx.ICON_ERROR).ShowModal() + +class reply(tweet): + + def __init__(self, users: List[str] = [], *args, **kwargs) -> None: + self.users = users + super(reply, self).__init__(*args, **kwargs) + + def create_controls(self, message: str, caption: str, max_length: int, thread_mode: bool) -> None: + panel = wx.Panel(self) + mainBox = wx.BoxSizer(wx.VERTICAL) + text_sizer = wx.BoxSizer(wx.HORIZONTAL) + mainBox.Add(text_sizer, 1, wx.EXPAND, 0) + label_1 = wx.StaticText(panel, wx.ID_ANY, caption) + text_sizer.Add(label_1, 0, 0, 0) + self.text = wx.TextCtrl(panel, wx.ID_ANY, "", size=(500, 200), style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER) + self.Bind(wx.EVT_CHAR_HOOK, self.handle_keys, self.text) + text_sizer.Add(self.text, 1, wx.EXPAND, 0) + list_sizer = wx.BoxSizer(wx.HORIZONTAL) + mainBox.Add(list_sizer, 1, wx.EXPAND, 0) + Attachment_sizer = wx.BoxSizer(wx.VERTICAL) + list_sizer.Add(Attachment_sizer, 1, wx.EXPAND, 0) + label_2 = wx.StaticText(panel, wx.ID_ANY, _("Attachments")) + Attachment_sizer.Add(label_2, 0, 0, 0) + self.attachments = wx.ListCtrl(panel, wx.ID_ANY, style=wx.BORDER_SUNKEN | wx.LC_HRULES | wx.LC_REPORT | wx.LC_SINGLE_SEL | wx.LC_VRULES) + self.attachments.AppendColumn(_("File")) + self.attachments.AppendColumn(_("Type")) + self.attachments.AppendColumn(_("Description")) + Attachment_sizer.Add(self.attachments, 1, wx.EXPAND, 0) + self.remove_attachment = wx.Button(panel, wx.ID_ANY, _("Delete attachment")) + self.remove_attachment.Enable(False) + Attachment_sizer.Add(self.remove_attachment, 0, 0, 0) + user_sizer = wx.BoxSizer(wx.VERTICAL) + list_sizer.Add(user_sizer, 0, 0, 0) + self.mention_all = wx.CheckBox(panel, -1, _(u"&Mention to all"), size=wx.DefaultSize) + self.mention_all.Disable() + user_sizer.Add(self.mention_all, 0, wx.ALL, 5) + self.checkboxes = [] + for i in self.users: + user_checkbox = wx.CheckBox(panel, -1, "@"+i, size=wx.DefaultSize) + self.checkboxes.append(user_checkbox) + user_sizer.Add(self.checkboxes[-1], 0, wx.ALL, 5) + btn_sizer_1 = wx.BoxSizer(wx.HORIZONTAL) + mainBox.Add(btn_sizer_1, 1, wx.EXPAND, 0) + self.add = wx.Button(panel, wx.ID_ANY, _("A&dd...")) + btn_sizer_1.Add(self.add, 0, 0, 0) + self.add_audio = wx.Button(panel, wx.ID_ANY, _("&Attach audio...")) + btn_sizer_1.Add(self.add_audio, 0, 0, 0) + btn_sizer_2 = wx.BoxSizer(wx.HORIZONTAL) + mainBox.Add(btn_sizer_2, 1, wx.EXPAND, 0) + self.autocomplete_users = wx.Button(panel, wx.ID_ANY, _("Auto&complete users")) + btn_sizer_2.Add(self.autocomplete_users, 0, 0, 0) + self.spellcheck = wx.Button(panel, wx.ID_ANY, _("Check &spelling...")) + btn_sizer_2.Add(self.spellcheck, 0, 0, 0) + self.translate = wx.Button(panel, wx.ID_ANY, _("&Translate")) + btn_sizer_2.Add(self.translate, 0, 0, 0) + ok_cancel_sizer = wx.StdDialogButtonSizer() + mainBox.Add(ok_cancel_sizer, 0, wx.ALIGN_RIGHT | wx.ALL, 4) + self.send = wx.Button(panel, wx.ID_OK, _("Sen&d")) + self.send.SetDefault() + ok_cancel_sizer.Add(self.send, 0, 0, 0) + self.cancel = wx.Button(panel, wx.ID_CANCEL, "") + ok_cancel_sizer.AddButton(self.cancel) + ok_cancel_sizer.Realize() + panel.SetSizer(mainBox) + self.Fit() + self.SetAffirmativeId(self.send.GetId()) + self.SetEscapeId(self.cancel.GetId()) + self.Layout() + + def attach_menu(self, event=None, enabled=True, *args, **kwargs): + menu = wx.Menu() + self.add_image = menu.Append(wx.ID_ANY, _("Image")) + self.add_image.Enable(enabled) + self.add_video = menu.Append(wx.ID_ANY, _("Video")) + self.add_video.Enable(enabled) + return menu + +class dm(tweet): + + def __init__(self, users: List[str] = [], *args, **kwargs) -> None: + self.users = users + super(dm, self).__init__(*args, **kwargs) + + def create_controls(self, message: str, caption: str, max_length: int, thread_mode: bool) -> None: + panel = wx.Panel(self) + mainBox = wx.BoxSizer(wx.VERTICAL) + label_recipient = wx.StaticText(panel, -1, _("&Recipient")) + self.cb = wx.ComboBox(panel, -1, choices=self.users, value=self.users[0], size=wx.DefaultSize) + self.autocomplete_users = wx.Button(panel, -1, _(u"Auto&complete users")) + recipient_sizer = wx.BoxSizer(wx.HORIZONTAL) + recipient_sizer.Add(label_recipient, 0, 0, 0) + recipient_sizer.Add(self.cb, 1, wx.EXPAND, 0) + mainBox.Add(recipient_sizer, 0, wx.EXPAND, 0) + text_sizer = wx.BoxSizer(wx.HORIZONTAL) + mainBox.Add(text_sizer, 1, wx.EXPAND, 0) + label_1 = wx.StaticText(panel, wx.ID_ANY, caption) + text_sizer.Add(label_1, 0, 0, 0) + self.text = wx.TextCtrl(panel, wx.ID_ANY, "", size=(500, 200), style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER) + self.Bind(wx.EVT_CHAR_HOOK, self.handle_keys, self.text) + self.text.SetFocus() + text_sizer.Add(self.text, 1, wx.EXPAND, 0) + list_sizer = wx.BoxSizer(wx.HORIZONTAL) + mainBox.Add(list_sizer, 1, wx.EXPAND, 0) + Attachment_sizer = wx.BoxSizer(wx.VERTICAL) + list_sizer.Add(Attachment_sizer, 1, wx.EXPAND, 0) + label_2 = wx.StaticText(panel, wx.ID_ANY, _("Attachments")) + Attachment_sizer.Add(label_2, 0, 0, 0) + self.attachments = wx.ListCtrl(panel, wx.ID_ANY, style=wx.BORDER_SUNKEN | wx.LC_HRULES | wx.LC_REPORT | wx.LC_SINGLE_SEL | wx.LC_VRULES) + self.attachments.AppendColumn(_("File")) + self.attachments.AppendColumn(_("Type")) + self.attachments.AppendColumn(_("Description")) + Attachment_sizer.Add(self.attachments, 1, wx.EXPAND, 0) + self.remove_attachment = wx.Button(panel, wx.ID_ANY, _("Delete attachment")) + self.remove_attachment.Enable(False) + Attachment_sizer.Add(self.remove_attachment, 0, 0, 0) + btn_sizer_1 = wx.BoxSizer(wx.HORIZONTAL) + mainBox.Add(btn_sizer_1, 1, wx.EXPAND, 0) + self.add = wx.Button(panel, wx.ID_ANY, _("A&dd...")) + btn_sizer_1.Add(self.add, 0, 0, 0) + self.add_audio = wx.Button(panel, wx.ID_ANY, _("&Attach audio...")) + btn_sizer_1.Add(self.add_audio, 0, 0, 0) + btn_sizer_2 = wx.BoxSizer(wx.HORIZONTAL) + mainBox.Add(btn_sizer_2, 1, wx.EXPAND, 0) + self.spellcheck = wx.Button(panel, wx.ID_ANY, _("Check &spelling...")) + btn_sizer_2.Add(self.spellcheck, 0, 0, 0) + self.translate = wx.Button(panel, wx.ID_ANY, _("&Translate")) + btn_sizer_2.Add(self.translate, 0, 0, 0) + ok_cancel_sizer = wx.StdDialogButtonSizer() + mainBox.Add(ok_cancel_sizer, 0, wx.ALIGN_RIGHT | wx.ALL, 4) + self.send = wx.Button(panel, wx.ID_OK, _("Sen&d")) + self.send.SetDefault() + ok_cancel_sizer.Add(self.send, 0, 0, 0) + self.cancel = wx.Button(panel, wx.ID_CANCEL, "") + ok_cancel_sizer.AddButton(self.cancel) + ok_cancel_sizer.Realize() + panel.SetSizer(mainBox) + self.Fit() + self.SetAffirmativeId(self.send.GetId()) + self.SetEscapeId(self.cancel.GetId()) + self.Layout() + + def get_image(self): + openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) + if openFileDialog.ShowModal() == wx.ID_CANCEL: + return (None, None) + return (openFileDialog.GetPath(), "") + + def attach_menu(self, event=None, enabled=True, *args, **kwargs): + menu = wx.Menu() + self.add_image = menu.Append(wx.ID_ANY, _("Image")) + self.add_image.Enable(enabled) + self.add_video = menu.Append(wx.ID_ANY, _("Video")) + self.add_video.Enable(enabled) + return menu + +class viewTweet(wx.Dialog): + def set_title(self, lenght): + self.SetTitle(_(u"Tweet - %i characters ") % (lenght,)) + + def __init__(self, text, rt_count, favs_count, source, date="", *args, **kwargs): + super(viewTweet, self).__init__(None, size=(850,850)) + panel = wx.Panel(self) + label = wx.StaticText(panel, -1, _(u"Tweet")) + self.text = wx.TextCtrl(panel, -1, text, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180)) + dc = wx.WindowDC(self.text) + dc.SetFont(self.text.GetFont()) + (x, y) = dc.GetMultiLineTextExtent("W"*280) + self.text.SetSize((x, y)) + self.text.SetFocus() + textBox = wx.BoxSizer(wx.HORIZONTAL) + textBox.Add(label, 0, wx.ALL, 5) + textBox.Add(self.text, 1, wx.EXPAND, 5) + mainBox = wx.BoxSizer(wx.VERTICAL) + mainBox.Add(textBox, 0, wx.ALL, 5) + label2 = wx.StaticText(panel, -1, _(u"Image description")) + self.image_description = wx.TextCtrl(panel, -1, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180)) + dc = wx.WindowDC(self.image_description) + dc.SetFont(self.image_description.GetFont()) + (x, y) = dc.GetMultiLineTextExtent("0"*450) + self.image_description.SetSize((x, y)) + self.image_description.Enable(False) + iBox = wx.BoxSizer(wx.HORIZONTAL) + iBox.Add(label2, 0, wx.ALL, 5) + iBox.Add(self.image_description, 1, wx.EXPAND, 5) + mainBox.Add(iBox, 0, wx.ALL, 5) + rtCountLabel = wx.StaticText(panel, -1, _(u"Retweets: ")) + rtCount = wx.TextCtrl(panel, -1, rt_count, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) + rtBox = wx.BoxSizer(wx.HORIZONTAL) + rtBox.Add(rtCountLabel, 0, wx.ALL, 5) + rtBox.Add(rtCount, 0, wx.ALL, 5) + favsCountLabel = wx.StaticText(panel, -1, _(u"Likes: ")) + favsCount = wx.TextCtrl(panel, -1, favs_count, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) + favsBox = wx.BoxSizer(wx.HORIZONTAL) + favsBox.Add(favsCountLabel, 0, wx.ALL, 5) + favsBox.Add(favsCount, 0, wx.ALL, 5) + sourceLabel = wx.StaticText(panel, -1, _(u"Source: ")) + sourceTweet = wx.TextCtrl(panel, -1, source, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) + sourceBox = wx.BoxSizer(wx.HORIZONTAL) + sourceBox.Add(sourceLabel, 0, wx.ALL, 5) + sourceBox.Add(sourceTweet, 0, wx.ALL, 5) + dateLabel = wx.StaticText(panel, -1, _(u"Date: ")) + dateTweet = wx.TextCtrl(panel, -1, date, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) + dc = wx.WindowDC(dateTweet) + dc.SetFont(dateTweet.GetFont()) + (x, y) = dc.GetTextExtent("0"*100) + dateTweet.SetSize((x, y)) + dateBox = wx.BoxSizer(wx.HORIZONTAL) + dateBox.Add(dateLabel, 0, wx.ALL, 5) + dateBox.Add(dateTweet, 0, wx.ALL, 5) + infoBox = wx.BoxSizer(wx.HORIZONTAL) + infoBox.Add(rtBox, 0, wx.ALL, 5) + infoBox.Add(favsBox, 0, wx.ALL, 5) + infoBox.Add(sourceBox, 0, wx.ALL, 5) + mainBox.Add(infoBox, 0, wx.ALL, 5) + mainBox.Add(dateBox, 0, wx.ALL, 5) + self.share = wx.Button(panel, wx.ID_ANY, _("Copy link to clipboard")) + self.share.Enable(False) + self.spellcheck = wx.Button(panel, -1, _("Check &spelling..."), size=wx.DefaultSize) + self.translateButton = wx.Button(panel, -1, _(u"&Translate..."), size=wx.DefaultSize) + cancelButton = wx.Button(panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize) + cancelButton.SetDefault() + buttonsBox = wx.BoxSizer(wx.HORIZONTAL) + buttonsBox.Add(self.share, 0, wx.ALL, 5) + buttonsBox.Add(self.spellcheck, 0, wx.ALL, 5) + buttonsBox.Add(self.translateButton, 0, wx.ALL, 5) + buttonsBox.Add(cancelButton, 0, wx.ALL, 5) + mainBox.Add(buttonsBox, 0, wx.ALL, 5) + selectId = wx.ID_ANY + self.Bind(wx.EVT_MENU, self.onSelect, id=selectId) + self.accel_tbl = wx.AcceleratorTable([ + (wx.ACCEL_CTRL, ord('A'), selectId), + ]) + self.SetAcceleratorTable(self.accel_tbl) + panel.SetSizer(mainBox) + self.SetClientSize(mainBox.CalcMin()) + + def set_text(self, text): + self.text.ChangeValue(text) + + def get_text(self): + return self.text.GetValue() + + def set_image_description(self, desc): + self.image_description.Enable(True) + if len(self.image_description.GetValue()) == 0: + self.image_description.SetValue(desc) + else: + self.image_description.SetValue(self.image_description.GetValue()+"\n"+desc) + + def text_focus(self): + self.text.SetFocus() + + def onSelect(self, ev): + self.text.SelectAll() + + def enable_button(self, buttonName): + if hasattr(self, buttonName): + return getattr(self, buttonName).Enable() + +class viewNonTweet(wx.Dialog): + + def __init__(self, text, date="", *args, **kwargs): + super(viewNonTweet, self).__init__(None, size=(850,850)) + self.SetTitle(_(u"View")) + panel = wx.Panel(self) + label = wx.StaticText(panel, -1, _(u"Item")) + self.text = wx.TextCtrl(parent=panel, id=-1, value=text, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180)) + dc = wx.WindowDC(self.text) + dc.SetFont(self.text.GetFont()) + (x, y) = dc.GetMultiLineTextExtent("0"*140) + self.text.SetSize((x, y)) + self.text.SetFocus() + textBox = wx.BoxSizer(wx.HORIZONTAL) + textBox.Add(label, 0, wx.ALL, 5) + textBox.Add(self.text, 1, wx.EXPAND, 5) + mainBox = wx.BoxSizer(wx.VERTICAL) + mainBox.Add(textBox, 0, wx.ALL, 5) + if date != "": + dateLabel = wx.StaticText(panel, -1, _(u"Date: ")) + date = wx.TextCtrl(panel, -1, date, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) + dc = wx.WindowDC(date) + dc.SetFont(date.GetFont()) + (x, y) = dc.GetTextExtent("0"*100) + date.SetSize((x, y)) + dateBox = wx.BoxSizer(wx.HORIZONTAL) + dateBox.Add(dateLabel, 0, wx.ALL, 5) + dateBox.Add(date, 0, wx.ALL, 5) + mainBox.Add(dateBox, 0, wx.ALL, 5) + self.share = wx.Button(panel, wx.ID_ANY, _("Copy link to clipboard")) + self.share.Enable(False) + self.spellcheck = wx.Button(panel, -1, _("Check &spelling..."), size=wx.DefaultSize) + self.unshortenButton = wx.Button(panel, -1, _(u"&Expand URL"), size=wx.DefaultSize) + self.unshortenButton.Disable() + self.translateButton = wx.Button(panel, -1, _(u"&Translate..."), size=wx.DefaultSize) + cancelButton = wx.Button(panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize) + cancelButton.SetDefault() + buttonsBox = wx.BoxSizer(wx.HORIZONTAL) + buttonsBox.Add(self.share, 0, wx.ALL, 5) + buttonsBox.Add(self.spellcheck, 0, wx.ALL, 5) + buttonsBox.Add(self.unshortenButton, 0, wx.ALL, 5) + buttonsBox.Add(self.translateButton, 0, wx.ALL, 5) + buttonsBox.Add(cancelButton, 0, wx.ALL, 5) + mainBox.Add(buttonsBox, 0, wx.ALL, 5) + selectId = wx.ID_ANY + self.Bind(wx.EVT_MENU, self.onSelect, id=selectId) + self.accel_tbl = wx.AcceleratorTable([ + (wx.ACCEL_CTRL, ord('A'), selectId), + ]) + self.SetAcceleratorTable(self.accel_tbl) + panel.SetSizer(mainBox) + self.SetClientSize(mainBox.CalcMin()) + + def onSelect(self, ev): + self.text.SelectAll() + + def set_text(self, text): + self.text.ChangeValue(text) + + def get_text(self): + return self.text.GetValue() + + def text_focus(self): + self.text.SetFocus() + + def enable_button(self, buttonName): + if hasattr(self, buttonName): + return getattr(self, buttonName).Enable() + +class poll(wx.Dialog): + def __init__(self, *args, **kwds): + super(poll, self).__init__(parent=None, id=wx.NewId(), title=_("Add a poll")) + sizer_1 = wx.BoxSizer(wx.VERTICAL) + period_sizer = wx.BoxSizer(wx.HORIZONTAL) + sizer_1.Add(period_sizer, 1, wx.EXPAND, 0) + label_period = wx.StaticText(self, wx.ID_ANY, _("Participation time (in days)")) + period_sizer.Add(label_period, 0, 0, 0) + self.period = wx.SpinCtrl(self, wx.ID_ANY) + self.period.SetFocus() + self.period.SetRange(1, 7) + self.period.SetValue(7) + period_sizer.Add(self.period, 0, 0, 0) + sizer_2 = wx.StaticBoxSizer(wx.StaticBox(self, wx.ID_ANY, _("Choices")), wx.VERTICAL) + sizer_1.Add(sizer_2, 1, wx.EXPAND, 0) + option1_sizer = wx.BoxSizer(wx.HORIZONTAL) + sizer_2.Add(option1_sizer, 1, wx.EXPAND, 0) + label_2 = wx.StaticText(self, wx.ID_ANY, _("Option 1")) + option1_sizer.Add(label_2, 0, 0, 0) + self.option1 = wx.TextCtrl(self, wx.ID_ANY, "") + self.option1.SetMaxLength(25) + option1_sizer.Add(self.option1, 0, 0, 0) + option2_sizer = wx.BoxSizer(wx.HORIZONTAL) + sizer_2.Add(option2_sizer, 1, wx.EXPAND, 0) + label_3 = wx.StaticText(self, wx.ID_ANY, _("Option 2")) + option2_sizer.Add(label_3, 0, 0, 0) + self.option2 = wx.TextCtrl(self, wx.ID_ANY, "") + self.option2.SetMaxLength(25) + option2_sizer.Add(self.option2, 0, 0, 0) + option3_sizer = wx.BoxSizer(wx.HORIZONTAL) + sizer_2.Add(option3_sizer, 1, wx.EXPAND, 0) + label_4 = wx.StaticText(self, wx.ID_ANY, _("Option 3")) + option3_sizer.Add(label_4, 0, 0, 0) + self.option3 = wx.TextCtrl(self, wx.ID_ANY, "") + self.option3.SetMaxLength(25) + option3_sizer.Add(self.option3, 0, 0, 0) + option4_sizer = wx.BoxSizer(wx.HORIZONTAL) + sizer_2.Add(option4_sizer, 1, wx.EXPAND, 0) + label_5 = wx.StaticText(self, wx.ID_ANY, _("Option 4")) + option4_sizer.Add(label_5, 0, 0, 0) + self.option4 = wx.TextCtrl(self, wx.ID_ANY, "") + self.option4.SetMaxLength(25) + option4_sizer.Add(self.option4, 0, 0, 0) + btn_sizer = wx.StdDialogButtonSizer() + sizer_1.Add(btn_sizer, 0, wx.ALIGN_RIGHT | wx.ALL, 4) + self.button_OK = wx.Button(self, wx.ID_OK) + self.button_OK.SetDefault() + self.button_OK.Bind(wx.EVT_BUTTON, self.validate_data) + btn_sizer.AddButton(self.button_OK) + self.button_CANCEL = wx.Button(self, wx.ID_CANCEL, "") + btn_sizer.AddButton(self.button_CANCEL) + btn_sizer.Realize() + self.SetSizer(sizer_1) + sizer_1.Fit(self) + self.SetAffirmativeId(self.button_OK.GetId()) + self.SetEscapeId(self.button_CANCEL.GetId()) + self.Layout() + + def get_options(self): + controls = [self.option1, self.option2, self.option3, self.option4] + options = [option.GetValue() for option in controls if option.GetValue() != ""] + return options + + def validate_data(self, *args, **kwargs): + options = self.get_options() + if len(options) < 2: + return wx.MessageDialog(self, _("Please make sure you have provided at least two options for the poll."), _("Not enough information"), wx.ICON_ERROR).ShowModal() + self.EndModal(wx.ID_OK) \ No newline at end of file diff --git a/updates/updates.json b/updates/updates.json index ad94bf92..15f31f98 100644 --- a/updates/updates.json +++ b/updates/updates.json @@ -1,4 +1,4 @@ -{"current_version": "11", +{"current_version": "2021.02.23", "description": "Snapshot version.", "date": "unknown", "downloads": diff --git a/windows-dependencies b/windows-dependencies index 27a7c419..1ee41752 160000 --- a/windows-dependencies +++ b/windows-dependencies @@ -1 +1 @@ -Subproject commit 27a7c419835c5fed4ba77bc31d0e1aff50a78f2a +Subproject commit 1ee4175276e8dcb04c23cd0b76ff516d5986c698