diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..6a00526b --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +*.pyc +*~ +src/build/ +src/dist/ +src/config/ +src/config1/ +src/config2/ +src/config3/ +src/dropbox/ +src/logs/ +src/documentation/ +src/oggenc2.exe +src/bootstrap.exe +src/Microsoft.VC90.CRT +src/Microsoft.VC90.MFC +src/launcher.bat \ No newline at end of file diff --git a/contributors.txt b/contributors.txt new file mode 100644 index 00000000..ef2039e0 --- /dev/null +++ b/contributors.txt @@ -0,0 +1,33 @@ +Manuel E. Cortéz +Johana Hidrobo +Marcelo Sosa +Isabel del Castillo +José Manuel Delicado +David Picón +Vicente Llopis +Javier Dorado +Guillem León +Marco Serrano +Bryner Villalobos +Robert Spangler +Paweł Masarczyk +Odenilton Júnior Santos +Burak +Alexander Jaszyn +Salva Doménech +Juan Carlos Rivilla +Sukil Etxenike +Javier Currás +Alba Quinteiro +Jani Kinnunen +Mohammed Al Shara +Robert Osztolykan +Rémy Ruiz +Jorge Almeida +Jose Maria ortiz silva +Pablo Perello +Michael Lau +Paris-Apps +Salvadora Melguizo +Holly Scott-Gardner +Anibal Hernández \ No newline at end of file diff --git a/src/Conf.defaults b/src/Conf.defaults new file mode 100644 index 00000000..c07ba643 --- /dev/null +++ b/src/Conf.defaults @@ -0,0 +1,88 @@ +[twitter] +user_key = string(default="") +user_secret = string(default="") +user_name = string(default="") +ignored_clients = list(default=list()) + +[general] +language = string(default="system") +relative_times = boolean(default=True) +hide_gui = boolean(default=False) +voice_enabled = boolean(default=False) +max_api_calls = integer(default=1) +max_tweets_per_call = integer(default=100) +reverse_timelines = boolean(default=False) +time_to_check_streams = integer(default=30) +announce_stream_status = boolean(default=True) + +[sound] +volume = float(default=1.0) +input_device = string(default="Default") +output_device = string(default="Default") +current_soundpack = string(default="default") +global_mute = boolean(default=False) +sndup_api_key = string(default="") + +[other_buffers] +show_friends = boolean(default=True) +show_followers = boolean(default=True) +show_favourites = boolean(default=True) +show_events = boolean(default=True) +show_blocks = boolean(default=False) +show_muted_users = boolean(default=False) +timelines = list(default=list()) +tweet_searches = list(default=list()) +lists = list(default=list()) +favourites_timelines = list(default=list()) +muted_buffers = list(default=list()) +autoread_buffers = list(default=list()) + +[mysc] +spelling_language = string(default="") + +[services] +dropbox_token=string(default="") + +[keymap] +up = string(default="control+win+up") +down = string(default="control+win+down") +left = string(default="control+win+left") +right = string(default="control+win+right") +conversation_up = string(default="control+win+shift+up") +conversation_down = string(default="control+win+shift+down") +show_hide = string(default="control+win+m") +compose = string(default="control+win+n") +reply = string(default="control+win+r") +retweet = string(default="control+win+shift+r") +dm = string(default="control+win+d") +fav = string(default="alt+win+f") +unfav = string(default="alt+shift+win+f") +action = string(default="control+win+s") +details = string(default="control+win+alt+n") +view = string(default="control+win+v") +close = string(default="control+win+f4") +open_timeline = string(default="control+win+i") +delete_buffer = string(default="control+win+shift+i") +url = string(default="control+win+return") +audio = string(default="control+win+alt+return") +volume_up = string(default="control+win+alt+up") +volume_down = string(default="control+win+alt+down") +go_home = string(default="control+win+home") +go_end = string(default="control+win+end") +go_page_up = string(default="control+win+pageup") +go_page_down = string(default="control+win+pagedown") +update_profile = string(default="alt+win+p") +delete = string(default="control+win+delete") +clear_list = string(default="control+win+shift+delete") +repeat_item = string(default="control+win+space") +copy_to_clipboard = string(default="control+win+c") +add_to_list = string(default="control+win+a") +remove_from_list = string(default="control+win+shift+a") +toggle_mute = string(default="control+win+shift+m") +toggle_global_mute = string(default="alt+win+m") +toggle_autoread = string(default="control+win+e") +search = string(default="control+win+-") +edit_keystrokes = string(default="control+win+k") +view_user_lists = string(default="control+win+l") +get_more_items = string(default="alt+win+pageup") +connect_streams = string(default="win+alt+c") \ No newline at end of file diff --git a/src/accessible_output2/__init__.py b/src/accessible_output2/__init__.py new file mode 100644 index 00000000..311513af --- /dev/null +++ b/src/accessible_output2/__init__.py @@ -0,0 +1,29 @@ +import ctypes +import os +import types +from platform_utils import paths + +def load_library(libname): + if paths.is_frozen(): + libfile = os.path.join(paths.embedded_data_path(), 'accessible_output2', 'lib', libname) + else: + libfile = os.path.join(paths.module_path(), 'lib', libname) + return ctypes.windll[libfile] + +def get_output_classes(): + import outputs + module_type = types.ModuleType + classes = [m.output_class for m in outputs.__dict__.itervalues() if type(m) == module_type and hasattr(m, 'output_class')] + return sorted(classes, key=lambda c: c.priority) + +def find_datafiles(): + import os + import platform + from glob import glob + import accessible_output2 + if platform.system() != 'Windows': + return [] + path = os.path.join(accessible_output2.__path__[0], 'lib', '*.dll') + results = glob(path) + dest_dir = os.path.join('accessible_output2', 'lib') + return [(dest_dir, results)] diff --git a/src/accessible_output2/lib/PCTKUSR.dll b/src/accessible_output2/lib/PCTKUSR.dll new file mode 100644 index 00000000..82cc23a3 Binary files /dev/null and b/src/accessible_output2/lib/PCTKUSR.dll differ diff --git a/src/accessible_output2/lib/PCTKUSR64.dll b/src/accessible_output2/lib/PCTKUSR64.dll new file mode 100644 index 00000000..614f282f Binary files /dev/null and b/src/accessible_output2/lib/PCTKUSR64.dll differ diff --git a/src/accessible_output2/lib/SAAPI32.dll b/src/accessible_output2/lib/SAAPI32.dll new file mode 100644 index 00000000..0384e7de Binary files /dev/null and b/src/accessible_output2/lib/SAAPI32.dll differ diff --git a/src/accessible_output2/lib/dolapi.dll b/src/accessible_output2/lib/dolapi.dll new file mode 100644 index 00000000..c77f215c Binary files /dev/null and b/src/accessible_output2/lib/dolapi.dll differ diff --git a/src/accessible_output2/lib/jfwapi.dll b/src/accessible_output2/lib/jfwapi.dll new file mode 100644 index 00000000..e0528234 Binary files /dev/null and b/src/accessible_output2/lib/jfwapi.dll differ diff --git a/src/accessible_output2/lib/nvdaControllerClient32.dll b/src/accessible_output2/lib/nvdaControllerClient32.dll new file mode 100644 index 00000000..1d061b18 Binary files /dev/null and b/src/accessible_output2/lib/nvdaControllerClient32.dll differ diff --git a/src/accessible_output2/lib/nvdaControllerClient64.dll b/src/accessible_output2/lib/nvdaControllerClient64.dll new file mode 100644 index 00000000..6b4fff78 Binary files /dev/null and b/src/accessible_output2/lib/nvdaControllerClient64.dll differ diff --git a/src/accessible_output2/outputs/__init__.py b/src/accessible_output2/outputs/__init__.py new file mode 100644 index 00000000..04510740 --- /dev/null +++ b/src/accessible_output2/outputs/__init__.py @@ -0,0 +1,16 @@ +import platform +if platform.system() == 'Windows': + import nvda + import jaws + import sapi5 + import window_eyes + import system_access + import dolphin + import pc_talker + #import sapi4 +elif platform.system() == "Darwin": + import voiceover +elif platform.system() == "Linux": + import speechDispatcher + +import auto diff --git a/src/accessible_output2/outputs/auto.py b/src/accessible_output2/outputs/auto.py new file mode 100644 index 00000000..808f8f5e --- /dev/null +++ b/src/accessible_output2/outputs/auto.py @@ -0,0 +1,42 @@ +import platform +import accessible_output2 +from base import Output, OutputError + +class Auto(Output): + + def __init__(self): + if platform.system() == "Darwin": + import voiceover + self.outputs = [voiceover.VoiceOver()] + elif platform.system() == "Linux": + import speechDispatcher + self.outputs = [speechDispatcher.SpeechDispatcher()] + elif platform.system() == "Windows": + output_classes = accessible_output2.get_output_classes() + self.outputs = [] + for output in output_classes: + try: + self.outputs.append(output()) + except OutputError: + pass + + def get_first_available_output(self): + for output in self.outputs: + if output.is_active(): + return output + return None + + def speak(self, *args, **kwargs): + output = self.get_first_available_output() + if output: + output.speak(*args, **kwargs) + + def braille(self, *args, **kwargs): + output = self.get_first_available_output() + if output: + output.braille(*args, **kwargs) + + def output(self, *args, **kwargs): + output = self.get_first_available_output() + if output: + output.speak(*args, **kwargs) diff --git a/src/accessible_output2/outputs/base.py b/src/accessible_output2/outputs/base.py new file mode 100644 index 00000000..f08266bd --- /dev/null +++ b/src/accessible_output2/outputs/base.py @@ -0,0 +1,31 @@ +from accessible_output2 import load_library +import platform + +class OutputError(Exception): + pass + +class Output(object): + name = "Unnamed Output" #The name of this output + lib32 = None #name of 32-bit lib + lib64 = None #name of 64-bit lib + priority = 100 #Where to sort in the list of available outputs for automaticly speaking + + def __init__(self): + is_32bit = platform.architecture()[0] == "32bit" + if self.lib32 and is_32bit: + self.lib = load_library(self.lib32) + elif self.lib64: + self.lib = load_library(self.lib64) + + def output(self, text, **options): + output = False + if hasattr(self, 'speak') and callable(self.speak): + self.speak(text, **options) + output = True + if hasattr(self, 'braille') and callable(self.braille): + self.braille(text, **options) + output = True + if not output: + raise RuntimeError("Output %r does not have any method defined to output" % self) + + diff --git a/src/accessible_output2/outputs/dolphin.py b/src/accessible_output2/outputs/dolphin.py new file mode 100644 index 00000000..f9ac82c5 --- /dev/null +++ b/src/accessible_output2/outputs/dolphin.py @@ -0,0 +1,27 @@ +import os + +from base import Output + +class Dolphin (Output): + """Supports dolphin products.""" + + name = 'Dolphin' + lib32 = 'dolapi.dll' + + def speak(self, text, interrupt=0): + if interrupt: + self.silence() + #If we don't call this, the API won't let us speak. + if self.is_active(): + self.lib.DolAccess_Command(unicode(text), (len(text)*2)+2, 1) + + def silence(self): + self.lib.DolAccess_Action(141) + + def is_active(self): + try: + return self.lib.DolAccess_GetSystem() in (1, 4, 8) + except: + return False + +output_class = Dolphin diff --git a/src/accessible_output2/outputs/jaws.py b/src/accessible_output2/outputs/jaws.py new file mode 100644 index 00000000..90f34fbc --- /dev/null +++ b/src/accessible_output2/outputs/jaws.py @@ -0,0 +1,33 @@ +import win32gui +from libloader.com import load_com +import pywintypes + +from base import Output, OutputError + +class Jaws (Output): + """Output supporting the Jaws for Windows screen reader.""" + + name = 'jaws' + + def __init__(self, *args, **kwargs): + super (Jaws, self).__init__(*args, **kwargs) + try: + self.object = load_com("FreedomSci.JawsApi", "jfwapi") + except pywintypes.com_error: + raise OutputError + + def braille(self, text, **options): + # HACK: replace " with ', Jaws doesn't seem to understand escaping them with \ + text = text.replace('"', "'") + self.object.RunFunction("BrailleString(\"%s\")" % text) + + def speak(self, text, interrupt=False): + self.object.SayString(' %s' % text, interrupt) + + def is_active(self): + try: + return self.object.SayString('',0) == True or win32gui.FindWindow("JFWUI2", "JAWS") != 0 + except: + return False + +output_class = Jaws diff --git a/src/accessible_output2/outputs/nvda.py b/src/accessible_output2/outputs/nvda.py new file mode 100644 index 00000000..a6f373ef --- /dev/null +++ b/src/accessible_output2/outputs/nvda.py @@ -0,0 +1,31 @@ +import os +import platform + +from platform_utils import paths +from libloader import load_library +from base import Output + +class NVDA(Output): + """Supports The NVDA screen reader""" + name = "NVDA" + lib32 = 'nvdaControllerClient32.dll' + lib64 = 'nvdaControllerClient64.dll' + + def is_active(self): + try: + return self.lib.nvdaController_testIfRunning() == 0 + except: + return False + + def braille(self, text, **options): + self.lib.nvdaController_brailleMessage(unicode(text)) + + def speak(self, text, interrupt=False): + if interrupt: + self.silence() + self.lib.nvdaController_speakText(unicode(text)) + + def silence(self): + self.lib.nvdaController_cancelSpeech() + +output_class = NVDA diff --git a/src/accessible_output2/outputs/pc_talker.py b/src/accessible_output2/outputs/pc_talker.py new file mode 100644 index 00000000..66bafb3a --- /dev/null +++ b/src/accessible_output2/outputs/pc_talker.py @@ -0,0 +1,19 @@ +import ctypes +from base import Output + +class PCTalker(Output): + lib32 = 'pctkusr.dll' + lib64 = 'pctkusr64.dll' + + def speak(self, text, interrupt=False): + if interrupt: + self.silence() + self.lib.PCTKPRead(text.encode('cp932', 'replace')) + + def silence(self): + self.lib.PCTKVReset() + + def is_active(self): + return self.lib.PCTKStatus() != 0 + +output_class = PCTalker diff --git a/src/accessible_output2/outputs/sapi4.py b/src/accessible_output2/outputs/sapi4.py new file mode 100644 index 00000000..ebd5b1bf --- /dev/null +++ b/src/accessible_output2/outputs/sapi4.py @@ -0,0 +1,141 @@ +from libloader.com import load_com +from base import Output + +import logging +log = logging.getLogger(__name__) + +class Sapi4(Output): + + name = 'sapi4' + priority = 102 + + def __init__(self): + sapi4 = load_com("{EEE78591-FE22-11D0-8BEF-0060081841DE}") + self._voiceNo = sapi4.Find(0) + sapi4.Select(self._voiceNo) + sapi4.Speak(" ") + self.__object = sapi4 + self._voice_list = self._available_voices() + + def _set_capabilities(self): + sapi4 = self.__object + try: + sapi4.Pitch = sapi4.Pitch + self._min_pitch = sapi4.MinPitch + self._max_pitch = sapi4.MaxPitch + self._has_pitch = True + except: + self._min_pitch = 0 + self._max_pitch = 0 + self._has_pitch = False + try: + sapi4.Speed = sapi4.Speed + self._min_rate = sapi4.MinSpeed + self._max_rate = sapi4.MaxSpeed + self._has_rate = True + except: + self._min_rate = 0 + self._max_rate = 0 + self._has_rate = False + try: + sapi4.VolumeLeft = sapi4.VolumeLeft + self._min_volume = sapi4.MinVolumeLeft + self._max_volume = sapi4.MaxVolumeLeft + self._has_volume = True + except: + self._min_volume = 0 + self._max_volume = 0 + self._has_volume = False + + def _available_voices(self): + voice_list = [] + for voice_no in range(1, self.__object.CountEngines): + voice_list.append(self.__object.ModeName(voice_no)) + return voice_list + + @property + def available_voices(self): + return self._voice_list + + def list_voices(self): + return self.available_voices + + def get_voice(self): + return self.__object.ModeName(self._voice_no) + + def set_voice(self, value): + self._voice_no = self.list_voices().index(value) + 1 + self.__object.Select(self._voice_no) + self.silence() + self.__object.Speak(" ") + self._set_capabilities() + + def get_pitch(self): + if self.has_pitch: + return self.__object.Pitch + + def set_pitch(self, value): + if self.has_pitch: + self.__object.Pitch = value + + def get_rate(self): + if self.has_rate: + return self.__object.Speed + + def set_rate(self, value): + if self.has_rate: + self.__object.Speed = value + + def get_volume(self): + if self.has_volume: + return self.__object.VolumeLeft + + def set_volume(self, value): + if self.has_volume: + self.__object.VolumeLeft = value + + @property + def has_pitch(self): + return self._has_pitch + + @property + def has_rate(self): + return self._has_rate + + @property + def has_volume(self): + return self._has_volume + + @property + def min_pitch(self): + return self._min_pitch + + @property + def max_pitch(self): + return self._max_pitch + + @property + def min_rate(self): + return self._min_rate + + @property + def max_rate(self): + return self._max_rate + + @property + def min_volume(self): + return self._min_volume + + @property + def max_volume(self): + return self._max_volume + + def speak(self, text, interrupt=False): + if interrupt: + self.silence() + self.__object.Speak(text) + + def silence(self): + self.__object.AudioReset() + +output_class = Sapi4 diff --git a/src/accessible_output2/outputs/sapi5.py b/src/accessible_output2/outputs/sapi5.py new file mode 100644 index 00000000..9e8a2fa6 --- /dev/null +++ b/src/accessible_output2/outputs/sapi5.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- +import config +from collections import OrderedDict +from libloader.com import load_com +from base import Output, OutputError +import pywintypes +import logging +log = logging.getLogger(__name__) + +class SAPI5(Output): + has_volume = True + has_rate = True + has_pitch = True + min_pitch = -10 + max_pitch = 10 + min_rate = -10 + max_rate = 10 + min_volume = 0 + max_volume = 100 + name = "sapi5" + priority = 101 + + def __init__(self): + if config.main["general"]["voice_enabled"] == False: raise OutputError + try: + self.object = load_com("SAPI.SPVoice") + self._voices = self._available_voices() + except pywintypes.com_error: + raise OutputError + self._pitch = 0 + + def _available_voices(self): + _voices = OrderedDict() + for v in self.object.GetVoices(): + _voices[v.GetDescription()] = v + return _voices + + def list_voices(self): + return self.available_voices.keys() + + def get_voice(self): + return self.object.Voice.GetDescription() + + def set_voice(self, value): + log.debug("Setting SAPI5 voice to \"%s\"" % value) + self.object.Voice = self.available_voices[value] + # For some reason SAPI5 does not reset audio after changing the voice + # By setting the audio device after changing voices seems to fix this + # This was noted from information at: + # http://lists.nvaccess.org/pipermail/nvda-dev/2011-November/022464.html + self.object.AudioOutput = self.object.AudioOutput + + def get_pitch(self): + return self._pitch + + def set_pitch(self, value): + log.debug("Setting pitch to %d" % value) + self._pitch = value + + def get_rate(self): + return self.object.Rate + + def set_rate(self, value): + log.debug("Setting rate to %d" % value) + self.object.Rate = value + + def get_volume(self): + return self.object.Volume + + def set_volume(self, value): + self.object.Volume = value + + def speak(self, text, interrupt=False): + if interrupt: + self.silence() + # We need to do the pitch in XML here + textOutput = "%s" % (round(self._pitch), text.replace("<", "<")) + self.object.Speak(textOutput, 1|8) + + def silence(self): + self.object.Speak("", 3) + + def is_active(self): + if self.object: + return True + return False + +output_class = SAPI5 diff --git a/src/accessible_output2/outputs/speechDispatcher.py b/src/accessible_output2/outputs/speechDispatcher.py new file mode 100644 index 00000000..33c558c9 --- /dev/null +++ b/src/accessible_output2/outputs/speechDispatcher.py @@ -0,0 +1,29 @@ +from base import Output, OutputError +import atexit + +class SpeechDispatcher(Output): + """Supports speech dispatcher on Linux. + Note that it will take the configuration from the speech dispatcher, the user will need configure voice, language, punctuation and rate before use this module. + """ + name = 'SpeechDispatcher' + + def __init__(self, *args, **kwargs): + super(SpeechDispatcher, self).__init__(*args, **kwargs) + try: + import speechd + self.spd = speechd.SSIPClient("TWBlue") + except ImportError: + raise OutputError + atexit.register(self.on_exit_event) + + def speak(self, text, interupt=False): + if interupt == True: + self.spd.cancel() + self.spd.speak(text) + + def is_active(self): + return True + + def on_exit_event(self): + self.spd.close() + del self.spd diff --git a/src/accessible_output2/outputs/speechd/__init__.py b/src/accessible_output2/outputs/speechd/__init__.py new file mode 100644 index 00000000..5b59f0c5 --- /dev/null +++ b/src/accessible_output2/outputs/speechd/__init__.py @@ -0,0 +1,18 @@ +# Copyright (C) 2001, 2002 Brailcom, o.p.s. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +from .client import * + diff --git a/src/accessible_output2/outputs/speechd/client.py b/src/accessible_output2/outputs/speechd/client.py new file mode 100644 index 00000000..8d343633 --- /dev/null +++ b/src/accessible_output2/outputs/speechd/client.py @@ -0,0 +1,1125 @@ +# Copyright (C) 2003-2008 Brailcom, o.p.s. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +"""Python API to Speech Dispatcher + +Basic Python client API to Speech Dispatcher is provided by the 'SSIPClient' +class. This interface maps directly to available SSIP commands and logic. + +A more convenient interface is provided by the 'Speaker' class. + +""" + +#TODO: Blocking variants for speak, char, key, sound_icon. + +import socket, sys, os, subprocess, time, tempfile + +try: + import threading +except: + import dummy_threading as threading + +from . import paths + +class CallbackType(object): + """Constants describing the available types of callbacks""" + INDEX_MARK = 'index_marks' + """Index mark events are reported when the place they were + included into the text by the client application is reached + when speaking them""" + BEGIN = 'begin' + """The begin event is reported when Speech Dispatcher starts + actually speaking the message.""" + END = 'end' + """The end event is reported after the message has terminated and + there is no longer any sound from it being produced""" + CANCEL = 'cancel' + """The cancel event is reported when a message is canceled either + on request of the user, because of prioritization of messages or + due to an error""" + PAUSE = 'pause' + """The pause event is reported after speaking of a message + was paused. It no longer produces any audio.""" + RESUME = 'resume' + """The resume event is reported right after speaking of a message + was resumed after previous pause.""" + +class SSIPError(Exception): + """Common base class for exceptions during SSIP communication.""" + +class SSIPCommunicationError(SSIPError): + """Exception raised when trying to operate on a closed connection.""" + + _additional_exception = None + + def __init__(self, description=None, original_exception=None, **kwargs): + self._original_exception = original_exception + self._description = description + super(SSIPError, self).__init__(**kwargs) + + def original_exception(self): + """Return the original exception if any + + If this exception is secondary, being caused by a lower + level exception, return this original exception, otherwise + None""" + return self._original_exception + + def set_additional_exception(self, exception): + """Set an additional exception + + See method additional_exception(). + """ + self._additional_exception = exception + + def additional_exception(self): + """Return an additional exception + + Additional exceptions araise from failed attempts to resolve + the former problem""" + return self._additional_exception + + def description(self): + """Return error description""" + return self._description + + def __str__(self): + msgs = [] + if self.description(): + msgs.append(self.description()) + if self.original_exception: + msgs.append("Original error: " + str(self.original_exception())) + if self.additional_exception: + msgs.append("Additional error: " + str(self.additional_exception())) + return "\n".join(msgs) + +class SSIPResponseError(Exception): + def __init__(self, code, msg, data): + Exception.__init__(self, "%s: %s" % (code, msg)) + self._code = code + self._msg = msg + self._data = data + + def code(self): + """Return the server response error code as integer number.""" + return self._code + + def msg(self): + """Return server response error message as string.""" + return self._msg + + +class SSIPCommandError(SSIPResponseError): + """Exception raised on error response after sending command.""" + + def command(self): + """Return the command string which resulted in this error.""" + return self._data + + +class SSIPDataError(SSIPResponseError): + """Exception raised on error response after sending data.""" + + def data(self): + """Return the data which resulted in this error.""" + return self._data + + +class SpawnError(Exception): + """Indicates failure in server autospawn.""" + +class CommunicationMethod(object): + """Constants describing the possible methods of connection to server.""" + UNIX_SOCKET = 'unix_socket' + """Unix socket communication using a filesystem path""" + INET_SOCKET = 'inet_socket' + """Inet socket communication using a host and port""" + +class _SSIP_Connection(object): + """Implemantation of low level SSIP communication.""" + + _NEWLINE = b"\r\n" + _END_OF_DATA_MARKER = b'.' + _END_OF_DATA_MARKER_ESCAPED = b'..' + _END_OF_DATA = _NEWLINE + _END_OF_DATA_MARKER + _NEWLINE + _END_OF_DATA_ESCAPED = _NEWLINE + _END_OF_DATA_MARKER_ESCAPED + _NEWLINE + # Constants representing \r\n. and \r\n.. + _RAW_DOTLINE = _NEWLINE + _END_OF_DATA_MARKER + _ESCAPED_DOTLINE = _NEWLINE + _END_OF_DATA_MARKER_ESCAPED + + _CALLBACK_TYPE_MAP = {700: CallbackType.INDEX_MARK, + 701: CallbackType.BEGIN, + 702: CallbackType.END, + 703: CallbackType.CANCEL, + 704: CallbackType.PAUSE, + 705: CallbackType.RESUME, + } + + def __init__(self, communication_method, socket_path, host, port): + """Init connection: open the socket to server, + initialize buffers, launch a communication handling + thread. + """ + + if communication_method == CommunicationMethod.UNIX_SOCKET: + socket_family = socket.AF_UNIX + socket_connect_args = socket_path + elif communication_method == CommunicationMethod.INET_SOCKET: + assert host and port + socket_family = socket.AF_INET + socket_connect_args = (socket.gethostbyname(host), port) + else: + raise ValueError("Unsupported communication method") + + try: + self._socket = socket.socket(socket_family, socket.SOCK_STREAM) + self._socket.connect(socket_connect_args) + except socket.error as ex: + raise SSIPCommunicationError("Can't open socket using method " + + communication_method, + original_exception = ex) + + self._buffer = b"" + self._com_buffer = [] + self._callback = None + self._ssip_reply_semaphore = threading.Semaphore(0) + self._communication_thread = \ + threading.Thread(target=self._communication, kwargs={}, + name="SSIP client communication thread") + self._communication_thread.start() + + def close(self): + """Close the server connection, destroy the communication thread.""" + # Read-write shutdown here is necessary, otherwise the socket.recv() + # function in the other thread won't return at last on some platforms. + try: + self._socket.shutdown(socket.SHUT_RDWR) + except socket.error: + pass + self._socket.close() + # Wait for the other thread to terminate + self._communication_thread.join() + + def _communication(self): + """Handle incomming socket communication. + + Listens for all incomming communication on the socket, dispatches + events and puts all other replies into self._com_buffer list in the + already parsed form as (code, msg, data). Each time a new item is + appended to the _com_buffer list, the corresponding semaphore + 'self._ssip_reply_semaphore' is incremented. + + This method is designed to run in a separate thread. The thread can be + interrupted by closing the socket on which it is listening for + reading.""" + + while True: + try: + code, msg, data = self._recv_message() + except IOError: + # If the socket has been closed, exit the thread + sys.exit() + if code//100 != 7: + # This is not an index mark nor an event + self._com_buffer.append((code, msg, data)) + self._ssip_reply_semaphore.release() + continue + # Ignore the event if no callback function has been registered. + if self._callback is not None: + type = self._CALLBACK_TYPE_MAP[code] + if type == CallbackType.INDEX_MARK: + kwargs = {'index_mark': data[2]} + else: + kwargs = {} + # Get message and client ID of the event + msg_id, client_id = map(int, data[:2]) + self._callback(msg_id, client_id, type, **kwargs) + + + def _readline(self): + """Read one whole line from the socket. + + Blocks until the line delimiter ('_NEWLINE') is read. + + """ + pointer = self._buffer.find(self._NEWLINE) + while pointer == -1: + try: + d = self._socket.recv(1024) + except: + raise IOError + if len(d) == 0: + raise IOError + self._buffer += d + pointer = self._buffer.find(self._NEWLINE) + line = self._buffer[:pointer] + self._buffer = self._buffer[pointer+len(self._NEWLINE):] + return line.decode('utf-8') + + def _recv_message(self): + """Read server response or a callback + and return the triplet (code, msg, data).""" + data = [] + c = None + while True: + line = self._readline() + assert len(line) >= 4, "Malformed data received from server!" + code, sep, text = line[:3], line[3], line[4:] + assert code.isalnum() and (c is None or code == c) and \ + sep in ('-', ' '), "Malformed data received from server!" + if sep == ' ': + msg = text + return int(code), msg, tuple(data) + data.append(text) + + def _recv_response(self): + """Read server response from the communication thread + and return the triplet (code, msg, data).""" + # TODO: This check is dumb but seems to work. The main thread + # hangs without it, when the Speech Dispatcher connection is lost. + if not self._communication_thread.isAlive(): + raise SSIPCommunicationError + self._ssip_reply_semaphore.acquire() + # The list is sorted, read the first item + response = self._com_buffer[0] + del self._com_buffer[0] + return response + + def send_command(self, command, *args): + """Send SSIP command with given arguments and read server response. + + Arguments can be of any data type -- they are all stringified before + being sent to the server. + + Returns a triplet (code, msg, data), where 'code' is a numeric SSIP + response code as an integer, 'msg' is an SSIP rsponse message as string + and 'data' is a tuple of strings (all lines of response data) when a + response contains some data. + + 'SSIPCommandError' is raised in case of non 2xx return code. See SSIP + documentation for more information about server responses and codes. + + 'IOError' is raised when the socket was closed by the remote side. + + """ + if __debug__: + if command in ('SET', 'CANCEL', 'STOP',): + assert args[0] in (Scope.SELF, Scope.ALL) \ + or isinstance(args[0], int) + cmd = ' '.join((command,) + tuple(map(str, args))) + try: + self._socket.send(cmd.encode('utf-8') + self._NEWLINE) + except socket.error: + raise SSIPCommunicationError("Speech Dispatcher connection lost.") + code, msg, data = self._recv_response() + if code//100 != 2: + raise SSIPCommandError(code, msg, cmd) + return code, msg, data + + def send_data(self, data): + """Send multiline data and read server response. + + Returned value is the same as for 'send_command()' method. + + 'SSIPDataError' is raised in case of non 2xx return code. See SSIP + documentation for more information about server responses and codes. + + 'IOError' is raised when the socket was closed by the remote side. + + """ + data = data.encode('utf-8') + # Escape the end-of-data marker even if present at the beginning + # The start of the string is also the start of a line. + if data.startswith(self._END_OF_DATA_MARKER): + l = len(self._END_OF_DATA_MARKER) + data = self._END_OF_DATA_MARKER_ESCAPED + data[l:] + + # Escape the end of data marker at the start of each subsequent + # line. We can do that by simply replacing \r\n. with \r\n.., + # since the start of a line is immediately preceded by \r\n, + # when the line is not the beginning of the string. + data = data.replace(self._RAW_DOTLINE, self._ESCAPED_DOTLINE) + + try: + self._socket.send(data + self._END_OF_DATA) + except socket.error: + raise SSIPCommunicationError("Speech Dispatcher connection lost.") + code, msg, response_data = self._recv_response() + if code//100 != 2: + raise SSIPDataError(code, msg, data) + return code, msg, response_data + + def set_callback(self, callback): + """Register a callback function for handling asynchronous events. + + Arguments: + callback -- a callable object (function) which will be called to + handle asynchronous events (arguments described below). Passing + `None' results in removing the callback function and ignoring + events. Just one callback may be registered. Attempts to register + a second callback will result in the former callback being + replaced. + + The callback function must accept three positional arguments + ('message_id', 'client_id', 'event_type') and an optional keyword + argument 'index_mark' (when INDEX_MARK events are turned on). + + Note, that setting the callback function doesn't turn the events on. + The user is responsible to turn them on by sending the appropriate `SET + NOTIFICATION' command. + + """ + self._callback = callback + +class _CallbackHandler(object): + """Internal object which handles callbacks.""" + + def __init__(self, client_id): + self._client_id = client_id + self._callbacks = {} + self._lock = threading.Lock() + + def __call__(self, msg_id, client_id, type, **kwargs): + if client_id != self._client_id: + # TODO: does that ever happen? + return + self._lock.acquire() + try: + try: + callback, event_types = self._callbacks[msg_id] + except KeyError: + pass + else: + if event_types is None or type in event_types: + callback(type, **kwargs) + if type in (CallbackType.END, CallbackType.CANCEL): + del self._callbacks[msg_id] + finally: + self._lock.release() + + def add_callback(self, msg_id, callback, event_types): + self._lock.acquire() + try: + self._callbacks[msg_id] = (callback, event_types) + finally: + self._lock.release() + +class Scope(object): + """An enumeration of valid SSIP command scopes. + + The constants of this class should be used to specify the 'scope' argument + for the 'Client' methods. + + """ + SELF = 'self' + """The command (mostly a setting) applies to current connection only.""" + ALL = 'all' + """The command applies to all current Speech Dispatcher connections.""" + + +class Priority(object): + """An enumeration of valid SSIP message priorities. + + The constants of this class should be used to specify the 'priority' + argument for the 'Client' methods. For more information about message + priorities and their interaction, see the SSIP documentation. + + """ + IMPORTANT = 'important' + TEXT = 'text' + MESSAGE = 'message' + NOTIFICATION = 'notification' + PROGRESS = 'progress' + + +class PunctuationMode(object): + """Constants for selecting a punctuation mode. + + The mode determines which characters should be read. + + """ + ALL = 'all' + """Read all punctuation characters.""" + NONE = 'none' + """Don't read any punctuation character at all.""" + SOME = 'some' + """Only the user-defined punctuation characters are read. + + The set of characters is specified in Speech Dispatcher configuration. + + """ + +class DataMode(object): + """Constants specifying the type of data contained within messages + to be spoken. + + """ + TEXT = 'text' + """Data is plain text.""" + SSML = 'ssml' + """Data is SSML (Speech Synthesis Markup Language).""" + + +class SSIPClient(object): + """Basic Speech Dispatcher client interface. + + This class provides a Python interface to Speech Dispatcher functionality + over an SSIP connection. The API maps directly to available SSIP commands. + Each connection to Speech Dispatcher is represented by one instance of this + class. + + Many commands take the 'scope' argument, thus it is shortly documented + here. It is either one of 'Scope' constants or a number of connection. By + specifying the connection number, you are applying the command to a + particular connection. This feature is only meant to be used by Speech + Dispatcher control application, however. More datails can be found in + Speech Dispatcher documentation. + + """ + + DEFAULT_HOST = '127.0.0.1' + """Default host for server connections.""" + DEFAULT_PORT = 6560 + """Default port number for server connections.""" + DEFAULT_SOCKET_PATH = "speech-dispatcher/speechd.sock" + """Default name of the communication unix socket""" + + def __init__(self, name, component='default', user='unknown', address=None, + autospawn=None, + # Deprecated -> + host=None, port=None, method=None, socket_path=None): + """Initialize the instance and connect to the server. + + Arguments: + name -- client identification string + component -- connection identification string. When one client opens + multiple connections, this can be used to identify each of them. + user -- user identification string (user name). When multi-user + acces is expected, this can be used to identify their connections. + address -- server address as specified in Speech Dispatcher + documentation (e.g. "unix:/run/user/joe/speech-dispatcher/speechd.sock" + or "inet:192.168.0.85:6561") + autospawn -- a flag to specify whether the library should + try to start the server if it determines its not already + running or not + + Deprecated arguments: + method -- communication method to use, one of the constants defined in class + CommunicationMethod + socket_path -- for CommunicationMethod.UNIX_SOCKET, socket + path in filesystem. By default, this is $XDG_RUNTIME_DIR/speech-dispatcher/speechd.sock + where $XDG_RUNTIME_DIR is determined using the XDG Base Directory + Specification. + host -- for CommunicationMethod.INET_SOCKET, server hostname + or IP address as a string. If None, the default value is + taken from SPEECHD_HOST environment variable (if it + exists) or from the DEFAULT_HOST attribute of this class. + port -- for CommunicationMethod.INET_SOCKET method, server + port as number or None. If None, the default value is + taken from SPEECHD_PORT environment variable (if it + exists) or from the DEFAULT_PORT attribute of this class. + + For more information on client identification strings see Speech + Dispatcher documentation. + """ + + _home = os.path.expanduser("~") + _runtime_dir = os.environ.get('XDG_RUNTIME_DIR', os.environ.get('XDG_CACHE_HOME', os.path.join(_home, '.cache'))) + _sock_path = os.path.join(_runtime_dir, self.DEFAULT_SOCKET_PATH) + # Resolve connection parameters: + connection_args = {'communication_method': CommunicationMethod.UNIX_SOCKET, + 'socket_path': _sock_path, + 'host': self.DEFAULT_HOST, + 'port': self.DEFAULT_PORT, + } + # Respect address method argument and SPEECHD_ADDRESS environemt variable + _address = address or os.environ.get("SPEECHD_ADDRESS") + + if _address: + connection_args.update(self._connection_arguments_from_address(_address)) + # Respect the old (deprecated) key arguments and environment variables + # TODO: Remove this section in 0.8 release + else: + # Read the environment variables + env_speechd_host = os.environ.get("SPEECHD_HOST") + try: + env_speechd_port = int(os.environ.get("SPEECHD_PORT")) + except: + env_speechd_port = None + env_speechd_socket_path = os.environ.get("SPEECHD_SOCKET") + # Prefer old (deprecated) function arguments, but if + # not specified and old (deprecated) environment variable + # is set, use the value of the environment variable + if method: + connection_args['method'] = method + if port: + connection_args['port'] = port + elif env_speechd_port: + connection_args['port'] = env_speechd_port + if socket_path: + connection_args['socket_path'] = socket_path + elif env_speechd_socket_path: + connection_args['socket_path'] = env_speechd_socket_path + self._connect_with_autospawn(connection_args, autospawn) + self._initialize_connection(user, name, component) + + def _connect_with_autospawn(self, connection_args, autospawn): + """Establish new connection (and/or autospawn server)""" + try: + self._conn = _SSIP_Connection(**connection_args) + except SSIPCommunicationError as ce: + # Suppose server might not be running, try the autospawn mechanism + if autospawn != False: + # Autospawn is however not guaranteed to start the server. The server + # will decide, based on it's configuration, whether to honor the request. + try: + self._server_spawn(connection_args) + except SpawnError as se: + ce.set_additional_exception(se) + raise ce + self._conn = _SSIP_Connection(**connection_args) + else: + raise + + def _initialize_connection(self, user, name, component): + """Initialize connection -- Set client name, get id, register callbacks etc.""" + full_name = '%s:%s:%s' % (user, name, component) + self._conn.send_command('SET', Scope.SELF, 'CLIENT_NAME', full_name) + code, msg, data = self._conn.send_command('HISTORY', 'GET', 'CLIENT_ID') + self._client_id = int(data[0]) + self._callback_handler = _CallbackHandler(self._client_id) + self._conn.set_callback(self._callback_handler) + for event in (CallbackType.INDEX_MARK, + CallbackType.BEGIN, + CallbackType.END, + CallbackType.CANCEL, + CallbackType.PAUSE, + CallbackType.RESUME): + self._conn.send_command('SET', 'self', 'NOTIFICATION', event, 'on') + + def _connection_arguments_from_address(self, address): + """Parse a Speech Dispatcher address line and return a dictionary + of connection arguments""" + connection_args = {} + address_params = address.split(":") + try: + _method = address_params[0] + except: + raise SSIPCommunicationErrror("Wrong format of server address") + connection_args['communication_method'] = _method + if _method == CommunicationMethod.UNIX_SOCKET: + try: + connection_args['socket_path'] = address_params[1] + except IndexError: + pass # The additional parameters was not set, let's stay with defaults + elif _method == CommunicationMethod.INET_SOCKET: + try: + connection_args['host'] = address_params[1] + connection_args['port'] = int(address_params[2]) + except ValueError: # Failed conversion to int + raise SSIPCommunicationError("Third parameter of inet_socket address must be a port number") + except IndexError: + pass # The additional parameters was not set, let's stay with defaults + else: + raise SSIPCommunicationError("Unknown communication method in address."); + return connection_args + + def __del__(self): + """Close the connection""" + self.close() + + def _server_spawn(self, connection_args): + """Attempts to spawn the speech-dispatcher server.""" + # Check whether we are not connecting to a remote host + # TODO: This is a hack. inet sockets specific code should + # belong to _SSIPConnection. We do not however have an _SSIPConnection + # yet. + if connection_args['communication_method'] == 'inet_socket': + addrinfos = socket.getaddrinfo(connection_args['host'], + connection_args['port']) + # Check resolved addrinfos for presence of localhost + ip_addresses = [addrinfo[4][0] for addrinfo in addrinfos] + localhost=False + for ip in ip_addresses: + if ip.startswith("127.") or ip == "::1": + connection_args['host'] = ip + localhost=True + if not localhost: + # The hostname didn't resolve on localhost in neither case, + # do not spawn server on localhost... + raise SpawnError( + "Can't start server automatically (autospawn), requested address %s " + "resolves on %s which seems to be a remote host. You must start the " + "server manually or choose another connection address." % (connection_args['host'], + str(ip_addresses),)) + if os.path.exists(paths.SPD_SPAWN_CMD): + connection_params = [] + for param, value in connection_args.items(): + if param not in ["host",]: + connection_params += ["--"+param.replace("_","-"), str(value)] + + server = subprocess.Popen([paths.SPD_SPAWN_CMD, "--spawn"]+connection_params, + stdin=None, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout_reply, stderr_reply = server.communicate() + retcode = server.wait() + if retcode != 0: + raise SpawnError("Server refused to autospawn, stating this reason: %s" % (stderr_reply,)) + return server.pid + else: + raise SpawnError("Can't find Speech Dispatcher spawn command %s" + % (paths.SPD_SPAWN_CMD,)) + + def set_priority(self, priority): + """Set the priority category for the following messages. + + Arguments: + priority -- one of the 'Priority' constants. + + """ + assert priority in (Priority.IMPORTANT, Priority.MESSAGE, + Priority.TEXT, Priority.NOTIFICATION, + Priority.PROGRESS), priority + self._conn.send_command('SET', Scope.SELF, 'PRIORITY', priority) + + def set_data_mode(self, value): + """Set the data mode for further speech commands. + + Arguments: + value - one of the constants defined by the DataMode class. + + """ + if value == DataMode.SSML: + ssip_val = 'on' + elif value == DataMode.TEXT: + ssip_val = 'off' + else: + raise ValueError( + 'Value "%s" is not one of the constants from the DataMode class.' % \ + value) + self._conn.send_command('SET', Scope.SELF, 'SSML_MODE', ssip_val) + + def speak(self, text, callback=None, event_types=None): + """Say given message. + + Arguments: + text -- message text to be spoken. This may be either a UTF-8 + encoded byte string or a Python unicode string. + callback -- a callback handler for asynchronous event notifications. + A callable object (function) which accepts one positional argument + `type' and one keyword argument `index_mark'. See below for more + details. + event_types -- a tuple of event types for which the callback should + be called. Each item must be one of `CallbackType' constants. + None (the default value) means to handle all event types. This + argument is irrelevant when `callback' is not used. + + The callback function will be called whenever one of the events occurs. + The event type will be passed as argument. Its value is one of the + `CallbackType' constants. In case of an index mark event, additional + keyword argument `index_mark' will be passed and will contain the index + mark identifier as specified within the text. + + The callback function should not perform anything complicated and is + not allowed to issue any further SSIP client commands. An attempt to + do so would lead to a deadlock in SSIP communication. + + This method is non-blocking; it just sends the command, given + message is queued on the server and the method returns immediately. + + """ + self._conn.send_command('SPEAK') + result = self._conn.send_data(text) + if callback: + msg_id = int(result[2][0]) + # TODO: Here we risk, that the callback arrives earlier, than we + # add the item to `self._callback_handler'. Such a situation will + # lead to the callback being ignored. + self._callback_handler.add_callback(msg_id, callback, event_types) + return result + + def char(self, char): + """Say given character. + + Arguments: + char -- a character to be spoken. Either a Python unicode string or + a UTF-8 encoded byte string. + + This method is non-blocking; it just sends the command, given + message is queued on the server and the method returns immediately. + + """ + self._conn.send_command('CHAR', char.replace(' ', 'space')) + + def key(self, key): + """Say given key name. + + Arguments: + key -- the key name (as defined in SSIP); string. + + This method is non-blocking; it just sends the command, given + message is queued on the server and the method returns immediately. + + """ + self._conn.send_command('KEY', key) + + def sound_icon(self, sound_icon): + """Output given sound_icon. + + Arguments: + sound_icon -- the name of the sound icon as defined by SSIP; string. + + This method is non-blocking; it just sends the command, given message + is queued on the server and the method returns immediately. + + """ + self._conn.send_command('SOUND_ICON', sound_icon) + + def cancel(self, scope=Scope.SELF): + """Immediately stop speaking and discard messages in queues. + + Arguments: + scope -- see the documentation of this class. + + """ + self._conn.send_command('CANCEL', scope) + + + def stop(self, scope=Scope.SELF): + """Immediately stop speaking the currently spoken message. + + Arguments: + scope -- see the documentation of this class. + + """ + self._conn.send_command('STOP', scope) + + def pause(self, scope=Scope.SELF): + """Pause speaking and postpone other messages until resume. + + This method is non-blocking. However, speaking can continue for a + short while even after it's called (typically to the end of the + sentence). + + Arguments: + scope -- see the documentation of this class. + + """ + self._conn.send_command('PAUSE', scope) + + def resume(self, scope=Scope.SELF): + """Resume speaking of the currently paused messages. + + This method is non-blocking. However, speaking can continue for a + short while even after it's called (typically to the end of the + sentence). + + Arguments: + scope -- see the documentation of this class. + + """ + self._conn.send_command('RESUME', scope) + + def list_output_modules(self): + """Return names of all active output modules as a tuple of strings.""" + code, msg, data = self._conn.send_command('LIST', 'OUTPUT_MODULES') + return data + + def list_synthesis_voices(self): + """Return names of all available voices for the current output module. + + Returns a tuple of tripplets (name, language, dialect). + + 'name' is a string, 'language' is an ISO 639-1 Alpha-2 language code + and 'dialect' is a string. Language and dialect may be None. + + """ + try: + code, msg, data = self._conn.send_command('LIST', 'SYNTHESIS_VOICES') + except SSIPCommandError: + return () + def split(item): + name, lang, dialect = tuple(item.rsplit(' ', 3)) + return (name, lang or None, dialect or None) + return tuple([split(item) for item in data]) + + def set_language(self, language, scope=Scope.SELF): + """Switch to a particular language for further speech commands. + + Arguments: + language -- two letter language code according to RFC 1776 as string. + scope -- see the documentation of this class. + + """ + assert isinstance(language, str) and len(language) == 2 + self._conn.send_command('SET', scope, 'LANGUAGE', language) + + def set_output_module(self, name, scope=Scope.SELF): + """Switch to a particular output module. + + Arguments: + name -- module (string) as returned by 'list_output_modules()'. + scope -- see the documentation of this class. + + """ + self._conn.send_command('SET', scope, 'OUTPUT_MODULE', name) + + def set_pitch(self, value, scope=Scope.SELF): + """Set the pitch for further speech commands. + + Arguments: + value -- integer value within the range from -100 to 100, with 0 + corresponding to the default pitch of the current speech synthesis + output module, lower values meaning lower pitch and higher values + meaning higher pitch. + scope -- see the documentation of this class. + + """ + assert isinstance(value, int) and -100 <= value <= 100, value + self._conn.send_command('SET', scope, 'PITCH', value) + + def set_rate(self, value, scope=Scope.SELF): + """Set the speech rate (speed) for further speech commands. + + Arguments: + value -- integer value within the range from -100 to 100, with 0 + corresponding to the default speech rate of the current speech + synthesis output module, lower values meaning slower speech and + higher values meaning faster speech. + scope -- see the documentation of this class. + + """ + assert isinstance(value, int) and -100 <= value <= 100 + self._conn.send_command('SET', scope, 'RATE', value) + + def set_volume(self, value, scope=Scope.SELF): + """Set the speech volume for further speech commands. + + Arguments: + value -- integer value within the range from -100 to 100, with 100 + corresponding to the default speech volume of the current speech + synthesis output module, lower values meaning softer speech. + scope -- see the documentation of this class. + + """ + assert isinstance(value, int) and -100 <= value <= 100 + self._conn.send_command('SET', scope, 'VOLUME', value) + + def set_punctuation(self, value, scope=Scope.SELF): + """Set the punctuation pronounciation level. + + Arguments: + value -- one of the 'PunctuationMode' constants. + scope -- see the documentation of this class. + + """ + assert value in (PunctuationMode.ALL, PunctuationMode.SOME, + PunctuationMode.NONE), value + self._conn.send_command('SET', scope, 'PUNCTUATION', value) + + def set_spelling(self, value, scope=Scope.SELF): + """Toogle the spelling mode or on off. + + Arguments: + value -- if 'True', all incomming messages will be spelled + instead of being read as normal words. 'False' switches + this behavior off. + scope -- see the documentation of this class. + + """ + assert value in [True, False] + if value == True: + self._conn.send_command('SET', scope, 'SPELLING', "on") + else: + self._conn.send_command('SET', scope, 'SPELLING', "off") + + def set_cap_let_recogn(self, value, scope=Scope.SELF): + """Set capital letter recognition mode. + + Arguments: + value -- one of 'none', 'spell', 'icon'. None means no signalization + of capital letters, 'spell' means capital letters will be spelled + with a syntetic voice and 'icon' means that the capital-letter icon + will be prepended before each capital letter. + scope -- see the documentation of this class. + + """ + assert value in ("none", "spell", "icon") + self._conn.send_command('SET', scope, 'CAP_LET_RECOGN', value) + + def set_voice(self, value, scope=Scope.SELF): + """Set voice by a symbolic name. + + Arguments: + value -- one of the SSIP symbolic voice names: 'MALE1' .. 'MALE3', + 'FEMALE1' ... 'FEMALE3', 'CHILD_MALE', 'CHILD_FEMALE' + scope -- see the documentation of this class. + + Symbolic voice names are mapped to real synthesizer voices in the + configuration of the output module. Use the method + 'set_synthesis_voice()' if you want to work with real voices. + + """ + assert isinstance(value, str) and \ + value.lower() in ("male1", "male2", "male3", "female1", + "female2", "female3", "child_male", + "child_female") + self._conn.send_command('SET', scope, 'VOICE', value) + + def set_synthesis_voice(self, value, scope=Scope.SELF): + """Set voice by its real name. + + Arguments: + value -- voice name as returned by 'list_synthesis_voices()' + scope -- see the documentation of this class. + + """ + self._conn.send_command('SET', scope, 'SYNTHESIS_VOICE', value) + + def set_pause_context(self, value, scope=Scope.SELF): + """Set the amount of context when resuming a paused message. + + Arguments: + value -- a positive or negative value meaning how many chunks of data + after or before the pause should be read when resume() is executed. + scope -- see the documentation of this class. + + """ + assert isinstance(value, int) + self._conn.send_command('SET', scope, 'PAUSE_CONTEXT', value) + + def set_debug(self, val): + """Switch debugging on and off. When switched on, + debugging files will be created in the chosen destination + (see set_debug_destination()) for Speech Dispatcher and all + its running modules. All logging information will then be + written into these files with maximal verbosity until switched + off. You should always first call set_debug_destination. + + The intended use of this functionality is to switch debuging + on for a period of time while the user will repeat the behavior + and then send the logs to the appropriate bug-reporting place. + + Arguments: + val -- a boolean value determining whether debugging + is switched on or off + scope -- see the documentation of this class. + + """ + assert isinstance(val, bool) + if val == True: + ssip_val = "ON" + else: + ssip_val = "OFF" + + self._conn.send_command('SET', scope.ALL, 'DEBUG', ssip_val) + + + def set_debug_destination(self, path): + """Set debug destination. + + Arguments: + path -- path (string) to the directory where debuging + files will be created + scope -- see the documentation of this class. + + """ + assert isinstance(val, string) + + self._conn.send_command('SET', scope.ALL, 'DEBUG_DESTINATION', val) + + def block_begin(self): + """Begin an SSIP block. + + See SSIP documentation for more details about blocks. + + """ + self._conn.send_command('BLOCK', 'BEGIN') + + def block_end(self): + """Close an SSIP block. + + See SSIP documentation for more details about blocks. + + """ + self._conn.send_command('BLOCK', 'END') + + def close(self): + """Close the connection to Speech Dispatcher.""" + if hasattr(self, '_conn'): + self._conn.close() + del self._conn + + +class Client(SSIPClient): + """A DEPRECATED backwards-compatible API. + + This Class is provided only for backwards compatibility with the prevoius + unofficial API. It will be removed in future versions. Please use either + 'SSIPClient' or 'Speaker' interface instead. As deprecated, the API is no + longer documented. + + """ + def __init__(self, name=None, client=None, **kwargs): + name = name or client or 'python' + super(Client, self).__init__(name, **kwargs) + + def say(self, text, priority=Priority.MESSAGE): + self.set_priority(priority) + self.speak(text) + + def char(self, char, priority=Priority.TEXT): + self.set_priority(priority) + super(Client, self).char(char) + + def key(self, key, priority=Priority.TEXT): + self.set_priority(priority) + super(Client, self).key(key) + + def sound_icon(self, sound_icon, priority=Priority.TEXT): + self.set_priority(priority) + super(Client, self).sound_icon(sound_icon) + + +class Speaker(SSIPClient): + """Extended Speech Dispatcher Interface. + + This class provides an extended intercace to Speech Dispatcher + functionality and tries to hide most of the lower level details of SSIP + (such as a more sophisticated handling of blocks and priorities and + advanced event notifications) under a more convenient API. + + Please note that the API is not yet stabilized and thus is subject to + change! Please contact the authors if you plan using it and/or if you have + any suggestions. + + Well, in fact this class is currently not implemented at all. It is just a + draft. The intention is to hide the SSIP details and provide a generic + interface practical for screen readers. + + """ + + +# Deprecated but retained for backwards compatibility + +# This class was introduced in 0.7 but later renamed to CommunicationMethod +class ConnectionMethod(object): + """Constants describing the possible methods of connection to server. + + Retained for backwards compatibility but DEPRECATED. See CommunicationMethod.""" + UNIX_SOCKET = 'unix_socket' + """Unix socket communication using a filesystem path""" + INET_SOCKET = 'inet_socket' + """Inet socket communication using a host and port""" diff --git a/src/accessible_output2/outputs/speechd/paths.py b/src/accessible_output2/outputs/speechd/paths.py new file mode 100644 index 00000000..817bd24a --- /dev/null +++ b/src/accessible_output2/outputs/speechd/paths.py @@ -0,0 +1 @@ +SPD_SPAWN_CMD = "/usr/bin/speech-dispatcher" diff --git a/src/accessible_output2/outputs/system_access.py b/src/accessible_output2/outputs/system_access.py new file mode 100644 index 00000000..cd6099d0 --- /dev/null +++ b/src/accessible_output2/outputs/system_access.py @@ -0,0 +1,23 @@ +from base import Output + +class SystemAccess (Output): + """Supports System Access and System Access Mobile""" + + name = "System Access" + lib32 = 'saapi32.dll' + priority = 99 + + def braille(self, text, **options): + self.lib.SA_BrlShowTextW(unicode(text)) + + def speak(self, text, interrupt=False): + if self.is_active(): + self.dll.SA_SayW(unicode(text)) + + def is_active(self): + try: + return self.dll.SA_IsRunning() + except: + return False + +output_class = SystemAccess diff --git a/src/accessible_output2/outputs/voiceover.py b/src/accessible_output2/outputs/voiceover.py new file mode 100644 index 00000000..a9b96c22 --- /dev/null +++ b/src/accessible_output2/outputs/voiceover.py @@ -0,0 +1,23 @@ +from base import Output, OutputError + +class VoiceOver (Output): + """Supports the VoiceOver screenreader on the Mac. + + Note that this will also output as a message to the braille display if VoiceOver is used with braille. + Calling this module could cause VoiceOver to be started. + """ + name = 'VoiceOver' + + def __init__(self, *args, **kwargs): + super(VoiceOver, self).__init__(*args, **kwargs) + try: + from appscript import app + self.app = app('VoiceOver') + except ImportError: + raise OutputError + + def speak(self, text, interupt=False): + self.app.output(text) + + def is_active(self): + return True diff --git a/src/accessible_output2/outputs/window_eyes.py b/src/accessible_output2/outputs/window_eyes.py new file mode 100644 index 00000000..6dd1c311 --- /dev/null +++ b/src/accessible_output2/outputs/window_eyes.py @@ -0,0 +1,32 @@ +import win32gui +from libloader.com import load_com +from base import Output, OutputError +import pywintypes + +class WindowEyes (Output): + """Speech output supporting the WindowEyes screen reader""" + + name = 'Window-Eyes' + + def __init__(self, *args, **kwargs): + super(WindowEyes, self).__init__(*args, **kwargs) + try: + self.object = load_com("gwspeak.speak") + except pywintypes.com_error: + raise OutputError + + def speak(self, text, interrupt=0): + if interrupt: + self.silence() + self.object.SpeakString(text) + + def silence (self): + self.object.Silence() + + def is_active(self): + try: + return win32gui.FindWindow("GWMExternalControl", "External Control") != 0 + except: + return False + +output_class = WindowEyes diff --git a/src/application.py b/src/application.py new file mode 100644 index 00000000..7dbcf3ca --- /dev/null +++ b/src/application.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +name = 'TW Blue' +snapshot = False +if snapshot == False: + version = "0.47" + update_url = 'http://twblue.com.mx/updates/tw_blue.json' +else: + version = "4" + update_url = 'http://twblue.com.mx/updates/snapshots.json' +author = u"Manuel Cortéz" +authorEmail = "info@twblue.com.mx" +copyright = u"copyright (C) 2013-2014, Manuel cortéz" +description = u"TW Blue is an app designed to use Twitter in a simple and fast way and avoiding, as far as possible, the consumtion of excessive resources of the machine where it’s running. With this app you’ll have access to most twitter features." +translators = [u"Bryner Villalobos (English)", u"Mohammed Al Shara (Arabic)", u"Salva Doménech, Juan Carlos Rivilla(Catalan)", u"Manuel cortéz(Spanish)", u"Sukil Etxenike Arizaleta(Basque)", u"Jani Kinnunen(finnish)", u"Javier Currás, José Manuel Delicado, Alba Quinteiro(Galician)", u"Robert Osztolykan(Hungarian)", u"Paweł Masarczyk(Polish)", u"Odenilton Júnior Santos(Portuguese)", u"Alexander Jaszyn(Russian)", u"Burak (Turkish)"] +url = u"http://twblue.com.mx" +report_bugs_url = "http://twblue.com.mx/errores/api/soap/mantisconnect.php?wsdl" + +# Tokens +app_key = '8pDLbyOW3saYnvSZ4uLFg' +app_secret = 'YsgdrzY9B4yyYvYsyee78rKI3GshjHpenVS9LnFJXY' \ No newline at end of file diff --git a/src/audio_services/__init__.py b/src/audio_services/__init__.py new file mode 100644 index 00000000..556257cc --- /dev/null +++ b/src/audio_services/__init__.py @@ -0,0 +1,22 @@ +from functools import wraps + +def matches_url(url): + def url_setter(func): + @wraps(func) + def internal_url_setter(*args, **kwargs): + return func(*args, **kwargs) + internal_url_setter.url = url + return internal_url_setter + return url_setter + +def find_url_transformer(url): + from audio_services import services + funcs = [] + for i in dir(services): + possible = getattr(services, i) + if callable(possible) and hasattr(possible, 'url'): + funcs.append(possible) + for f in funcs: + if url.lower().startswith(f.url.lower()): + return f + return services.convert_generic_audio diff --git a/src/audio_services/services.py b/src/audio_services/services.py new file mode 100644 index 00000000..637e7146 --- /dev/null +++ b/src/audio_services/services.py @@ -0,0 +1,56 @@ +from audio_services import matches_url +import json +import re +import urllib + +@matches_url('https://audioboom.com') +def convert_audioboom(url): + if "audioboom.com" not in url.lower(): + raise TypeError('%r is not a valid URL' % url) + audio_id = url.split('.com/')[-1] + return 'https://audioboom.com/%s.mp3' % audio_id + +@matches_url('http://q-audio.net') +def convert_q_audio(url): + result = re.match("^https?://q-audio.net/(i|d|download)/(?P[a-z0-9]+/?)$", url, re.I) + if not result or result.group("audio_id") is None: + raise TypeError('%r is not a valid URL' % url) + audio_id = result.group("audio_id") + return 'http://q-audio.net/download/%s' % audio_id + +@matches_url ('http://soundcloud.com/') +def convert_soundcloud (url): + client_id = "df8113ca95c157b6c9731f54b105b473" + permalink = urllib.urlopen ('http://api.soundcloud.com/resolve.json?client_id=%s&url=%s' %(client_id, url)) + if permalink.getcode () == 404: + permalink.close () + raise TypeError('%r is not a valid URL' % url) + else: + resolved_url = permalink.geturl () + permalink.close () + track_url = urllib.urlopen (resolved_url) + track_data = json.loads (track_url.read ()) + track_url.close () + if track_data ['streamable']: + return track_data ['stream_url'] + "?client_id=%s" %client_id + else: + raise TypeError('%r is not streamable' % url) + +@matches_url('http://twup.me') +def convert_twup(url): + result = re.match("^http://twup.me/(?P[A-Za-z0-9]+/?)$", url, re.I) + if not result or result.group("audio_id") is None: + raise TypeError('%r is not a valid URL' % url) + audio_id = result.group("audio_id") + return 'http://twup.me/%s' % audio_id + +@matches_url('http://sndup.net') +def convert_sndup(url): + result = re.match("^http://sndup.net/(?P[a-z0-9]+/?)(|d|l|a)/?$", url, re.I) + if not result or result.group("audio_id") is None: + raise TypeError('%r is not a valid URL' % url) + audio_id = result.group("audio_id") + return 'http://sndup.net/%s/a' % audio_id + +def convert_generic_audio(url): + return url diff --git a/src/cacert.pem b/src/cacert.pem new file mode 100644 index 00000000..e908bb6a --- /dev/null +++ b/src/cacert.pem @@ -0,0 +1,4966 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. +# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. +# Label: "GTE CyberTrust Global Root" +# Serial: 421 +# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db +# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74 +# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36 +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv +b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds +b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH +iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS +r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 +04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r +GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 +3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P +lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division +# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division +# Label: "Thawte Server CA" +# Serial: 1 +# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d +# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c +# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9 +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm +MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx +MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 +dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl +cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 +DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 +yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX +L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj +EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG +7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ +qdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division +# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division +# Label: "Thawte Premium Server CA" +# Serial: 1 +# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a +# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a +# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72 +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy +dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t +MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG +A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl +cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE +VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ +ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR +uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM +pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +# Issuer: O=Equifax OU=Equifax Secure Certificate Authority +# Subject: O=Equifax OU=Equifax Secure Certificate Authority +# Label: "Equifax Secure CA" +# Serial: 903804111 +# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4 +# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a +# SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78 +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV +UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy +dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 +MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx +dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f +BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A +cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC +AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ +MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm +aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw +ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj +IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF +MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA +A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y +7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh +1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 +-----END CERTIFICATE----- + +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Label: "Verisign Class 3 Public Primary Certification Authority" +# Serial: 149843929435818692848040365716851702463 +# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67 +# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2 +# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70 +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do +lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc +AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k +-----END CERTIFICATE----- + +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network +# Label: "Verisign Class 3 Public Primary Certification Authority - G2" +# Serial: 167285380242319648451154478808036881606 +# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9 +# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f +# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 +pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 +13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk +U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i +F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY +oJ2daZH9 +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Label: "GlobalSign Root CA - R2" +# Serial: 4835703278459682885658125 +# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 +# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe +# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority +# Label: "ValiCert Class 1 VA" +# Serial: 1 +# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb +# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e +# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04 +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy +NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y +LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ +TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y +TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 +LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW +I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw +nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority +# Label: "ValiCert Class 2 VA" +# Serial: 1 +# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87 +# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6 +# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy +NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY +dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 +WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS +v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v +UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu +IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority +# Label: "RSA Root Certificate 1" +# Serial: 1 +# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72 +# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb +# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy +NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD +cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs +2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY +JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE +Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ +n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Label: "Verisign Class 3 Public Primary Certification Authority - G3" +# Serial: 206684696279472310254277870180966723415 +# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 +# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 +# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Label: "Verisign Class 4 Public Primary Certification Authority - G3" +# Serial: 314531972711909413743075096039378935511 +# MD5 Fingerprint: db:c8:f2:27:2e:b1:ea:6a:29:23:5d:fe:56:3e:33:df +# SHA1 Fingerprint: c8:ec:8c:87:92:69:cb:4b:ab:39:e9:8d:7e:57:67:f3:14:95:73:9d +# SHA256 Fingerprint: e3:89:36:0d:0f:db:ae:b3:d2:50:58:4b:47:30:31:4e:22:2f:39:c1:56:a0:20:14:4e:8d:96:05:61:79:15:06 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 +GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ ++mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd +U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm +NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY +ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ +ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 +CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq +g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c +2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ +bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Secure Server CA" +# Serial: 927650371 +# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee +# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39 +# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50 +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946069240 +# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 +# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 +# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. +# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. +# Label: "Equifax Secure Global eBusiness CA" +# Serial: 1 +# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc +# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45 +# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07 +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT +ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw +MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj +dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l +c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC +UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc +58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ +o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr +aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA +A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA +Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv +8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. +# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. +# Label: "Equifax Secure eBusiness CA 1" +# Serial: 4 +# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d +# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41 +# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73 +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT +ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw +MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j +LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo +RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu +WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw +Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD +AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK +eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM +zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ +WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN +/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network +# Subject: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network +# Label: "AddTrust Low-Value Services Root" +# Serial: 1 +# MD5 Fingerprint: 1e:42:95:02:33:92:6b:b9:5f:c0:7f:da:d6:b2:4b:fc +# SHA1 Fingerprint: cc:ab:0e:a0:4c:23:01:d6:69:7b:dd:37:9f:cd:12:eb:24:e3:94:9d +# SHA256 Fingerprint: 8c:72:09:27:9a:c0:4e:27:5e:16:d0:7f:d3:b7:75:e8:01:54:b5:96:80:46:e3:1f:52:dd:25:76:63:24:e9:a7 +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw +MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD +VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul +CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n +tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl +dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch +PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC ++Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O +BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl +MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk +ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X +7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz +43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl +pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA +WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Label: "AddTrust External Root" +# Serial: 1 +# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f +# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 +# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network +# Subject: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network +# Label: "AddTrust Public Services Root" +# Serial: 1 +# MD5 Fingerprint: c1:62:3e:23:c5:82:73:9c:03:59:4b:2b:e9:77:49:7f +# SHA1 Fingerprint: 2a:b6:28:48:5e:78:fb:f3:ad:9e:79:10:dd:6b:df:99:72:2c:96:e5 +# SHA256 Fingerprint: 07:91:ca:07:49:b2:07:82:aa:d3:c7:d7:bd:0c:df:c9:48:58:35:84:3e:b2:d7:99:60:09:ce:43:ab:6c:69:27 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx +MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB +ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV +BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV +6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX +GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP +dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH +1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF +62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW +BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL +MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU +cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv +b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 +IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ +iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh +4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm +XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network +# Subject: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network +# Label: "AddTrust Qualified Certificates Root" +# Serial: 1 +# MD5 Fingerprint: 27:ec:39:47:cd:da:5a:af:e2:9a:01:65:21:a9:4c:bb +# SHA1 Fingerprint: 4d:23:78:ec:91:95:39:b5:00:7f:75:8f:03:3b:21:1e:c5:4d:8b:cf +# SHA256 Fingerprint: 80:95:21:08:05:db:4b:bc:35:5e:44:28:d8:fd:6e:c2:cd:e3:ab:5f:b9:7a:99:42:98:8e:b8:f4:dc:d0:60:16 +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 +MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK +EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh +BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq +xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G +87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i +2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U +WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 +0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G +A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr +pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL +ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm +aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv +hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm +hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 +P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y +iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no +xqE= +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Issuer: O=RSA Security Inc OU=RSA Security 2048 V3 +# Subject: O=RSA Security Inc OU=RSA Security 2048 V3 +# Label: "RSA Security 2048 v3" +# Serial: 13297492616345471454730593562152402946 +# MD5 Fingerprint: 77:0d:19:b1:21:fd:00:42:9c:3e:0c:a5:dd:0b:02:8e +# SHA1 Fingerprint: 25:01:90:19:cf:fb:d9:99:1c:b7:68:25:74:8d:94:5f:30:93:95:42 +# SHA256 Fingerprint: af:8b:67:62:a1:e5:28:22:81:61:a9:5d:5c:55:9e:e2:66:27:8f:75:d7:9e:83:01:89:a5:03:50:6a:bd:6b:4c +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 +MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp +dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX +BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy +MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp +eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg +/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl +wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh +AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 +PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu +AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR +MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc +HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ +Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ +f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO +rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch +6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 +7CAFYd4= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. +# Label: "GeoTrust Global CA" +# Serial: 144470 +# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 +# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 +# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Global CA 2 O=GeoTrust Inc. +# Subject: CN=GeoTrust Global CA 2 O=GeoTrust Inc. +# Label: "GeoTrust Global CA 2" +# Serial: 1 +# MD5 Fingerprint: 0e:40:a7:6c:de:03:5d:8f:d1:0f:e4:d1:8d:f9:6c:a9 +# SHA1 Fingerprint: a9:e9:78:08:14:37:58:88:f2:05:19:b0:6d:2b:0d:2b:60:16:90:7d +# SHA256 Fingerprint: ca:2d:82:a0:86:77:07:2f:8a:b6:76:4f:f0:35:67:6c:fe:3e:5e:32:5e:01:21:72:df:3f:92:09:6d:b7:9b:85 +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs +IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg +R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A +PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 +Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL +TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL +5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 +S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe +2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap +EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td +EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv +/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN +A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 +abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF +I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz +4iIprn2DQKi6bA== +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Label: "GeoTrust Universal CA" +# Serial: 1 +# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 +# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 +# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Label: "GeoTrust Universal CA 2" +# Serial: 1 +# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 +# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 +# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +# Issuer: CN=America Online Root Certification Authority 1 O=America Online Inc. +# Subject: CN=America Online Root Certification Authority 1 O=America Online Inc. +# Label: "America Online Root Certification Authority 1" +# Serial: 1 +# MD5 Fingerprint: 14:f1:08:ad:9d:fa:64:e2:89:e7:1c:cf:a8:ad:7d:5e +# SHA1 Fingerprint: 39:21:c1:15:c1:5d:0e:ca:5c:cb:5b:c4:f0:7d:21:d8:05:0b:56:6a +# SHA256 Fingerprint: 77:40:73:12:c6:3a:15:3d:5b:c0:0b:4e:51:75:9c:df:da:c2:37:dc:2a:33:b6:79:46:e9:8e:9b:fa:68:0a:e3 +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk +hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym +1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW +OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb +2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko +O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU +AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF +Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb +LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir +oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C +MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- + +# Issuer: CN=America Online Root Certification Authority 2 O=America Online Inc. +# Subject: CN=America Online Root Certification Authority 2 O=America Online Inc. +# Label: "America Online Root Certification Authority 2" +# Serial: 1 +# MD5 Fingerprint: d6:ed:3c:ca:e2:66:0f:af:10:43:0d:77:9b:04:09:bf +# SHA1 Fingerprint: 85:b5:ff:67:9b:0c:79:96:1f:c8:6e:44:22:00:46:13:db:17:92:84 +# SHA256 Fingerprint: 7d:3b:46:5a:60:14:e5:26:c0:af:fc:ee:21:27:d2:31:17:27:ad:81:1c:26:84:2d:00:6a:f3:73:06:cc:80:bd +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC +206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci +KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 +JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 +BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e +Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B +PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 +Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq +Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ +o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 ++L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj +YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj +FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn +xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 +LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc +obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 +CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe +IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA +DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F +AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX +Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb +AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl +Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw +RY8mkaKO/qk= +-----END CERTIFICATE----- + +# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association +# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association +# Label: "Visa eCommerce Root" +# Serial: 25952180776285836048024890241505565794 +# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 +# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 +# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr +MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl +cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw +CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h +dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l +cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h +2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E +lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV +ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq +299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t +vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL +dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF +AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 +LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd +7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw +++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum CA O=Unizeto Sp. z o.o. +# Subject: CN=Certum CA O=Unizeto Sp. z o.o. +# Label: "Certum Root CA" +# Serial: 65568 +# MD5 Fingerprint: 2c:8f:9f:66:1d:18:90:b1:47:26:9d:8e:86:82:8c:a9 +# SHA1 Fingerprint: 62:52:dc:40:f7:11:43:a2:2f:de:9e:f7:34:8e:06:42:51:b1:81:18 +# SHA256 Fingerprint: d8:e0:fe:bc:1d:b2:e3:8d:00:94:0f:37:d2:7d:41:34:4d:99:3e:73:4b:99:d5:65:6d:97:78:d4:d8:14:36:24 +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E +jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo +ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI +ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu +Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg +AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 +HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA +uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa +TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg +xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q +CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x +O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs +6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +# Issuer: CN=Secure Certificate Services O=Comodo CA Limited +# Subject: CN=Secure Certificate Services O=Comodo CA Limited +# Label: "Comodo Secure Services root" +# Serial: 1 +# MD5 Fingerprint: d3:d9:bd:ae:9f:ac:67:24:b3:c8:1b:52:e1:b9:a9:bd +# SHA1 Fingerprint: 4a:65:d5:f4:1d:ef:39:b8:b8:90:4a:4a:d3:64:81:33:cf:c7:a1:d1 +# SHA256 Fingerprint: bd:81:ce:3b:4f:65:91:d1:1a:67:b5:fc:7a:47:fd:ef:25:52:1b:f9:aa:4e:18:b9:e3:df:2e:34:a7:80:3b:e8 +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp +ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow +fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV +BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM +cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S +HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 +CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk +3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz +6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV +HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv +Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw +Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww +DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 +5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI +gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ +aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl +izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= +-----END CERTIFICATE----- + +# Issuer: CN=Trusted Certificate Services O=Comodo CA Limited +# Subject: CN=Trusted Certificate Services O=Comodo CA Limited +# Label: "Comodo Trusted Services root" +# Serial: 1 +# MD5 Fingerprint: 91:1b:3f:6e:cd:9e:ab:ee:07:fe:1f:71:d2:b3:61:27 +# SHA1 Fingerprint: e1:9f:e3:0e:8b:84:60:9e:80:9b:17:0d:72:a8:c5:ba:6e:14:09:bd +# SHA256 Fingerprint: 3f:06:e5:56:81:d4:96:f5:be:16:9e:b5:38:9f:9f:2b:8f:f6:1e:17:08:df:68:81:72:48:49:cd:5d:27:cb:69 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 +aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla +MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO +BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD +VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW +fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt +TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL +fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW +1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 +kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G +A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v +ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo +dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu +Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ +HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS +jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ +xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn +dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Label: "QuoVadis Root CA" +# Serial: 985026699 +# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 +# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 +# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 +# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 +# Label: "Security Communication Root CA" +# Serial: 0 +# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a +# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 +# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- + +# Issuer: CN=Sonera Class2 CA O=Sonera +# Subject: CN=Sonera Class2 CA O=Sonera +# Label: "Sonera Class 2 Root CA" +# Serial: 29 +# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb +# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 +# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA" +# Serial: 10000010 +# MD5 Fingerprint: 60:84:7c:5a:ce:db:0c:d4:cb:a7:e9:fe:02:c6:a9:c0 +# SHA1 Fingerprint: 10:1d:fa:3f:d5:0b:cb:bb:9b:b5:60:0c:19:55:a4:1a:f4:73:3a:04 +# SHA256 Fingerprint: d4:1d:82:9e:8c:16:59:82:2a:f9:3f:ce:62:bf:fc:de:26:4f:c8:4e:8b:95:0c:5f:f2:75:d0:52:35:46:95:a3 +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO +TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy +MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk +ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn +ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71 +9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO +hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U +tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o +BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh +SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww +OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv +cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA +7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k +/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm +eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6 +u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy +7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- + +# Issuer: O=TDC Internet OU=TDC Internet Root CA +# Subject: O=TDC Internet OU=TDC Internet Root CA +# Label: "TDC Internet Root CA" +# Serial: 986490188 +# MD5 Fingerprint: 91:f4:03:55:20:a1:f8:63:2c:62:de:ac:fb:61:1c:8e +# SHA1 Fingerprint: 21:fc:bd:8e:7f:6c:af:05:1b:d1:b3:43:ec:a8:e7:61:47:f2:0f:8a +# SHA256 Fingerprint: 48:98:c6:88:8c:0c:ff:b0:d3:e3:1a:ca:8a:37:d4:e3:51:5f:f7:46:d0:26:35:d8:66:46:cf:a0:a3:18:5a:e7 +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE +SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg +Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV +BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl +cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA +vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu +Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a +0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 +4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN +eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD +R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG +A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu +dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME +Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 +WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw +HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ +KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO +Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX +wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ +2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 +9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 +jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 +aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- + +# Issuer: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com +# Subject: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com +# Label: "UTN DATACorp SGC Root CA" +# Serial: 91374294542884689855167577680241077609 +# MD5 Fingerprint: b3:a5:3e:77:21:6d:ac:4a:c0:c9:fb:d5:41:3d:ca:06 +# SHA1 Fingerprint: 58:11:9f:0e:12:82:87:ea:50:fd:d9:87:45:6f:4f:78:dc:fa:d6:d4 +# SHA256 Fingerprint: 85:fb:2f:91:dd:12:27:5a:01:45:b6:36:53:4f:84:02:4a:d6:8b:69:b8:ee:88:68:4f:f7:11:37:58:05:b3:48 +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB +kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw +IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG +EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD +VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu +dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 +E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ +D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK +4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq +lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW +bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB +o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT +MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js +LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr +BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB +AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj +j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH +KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv +2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 +mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- + +# Issuer: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com +# Subject: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com +# Label: "UTN USERFirst Hardware Root CA" +# Serial: 91374294542884704022267039221184531197 +# MD5 Fingerprint: 4c:56:41:e5:0d:bb:2b:e8:ca:a3:ed:18:08:ad:43:39 +# SHA1 Fingerprint: 04:83:ed:33:99:ac:36:08:05:87:22:ed:bc:5e:46:00:e3:be:f9:d7 +# SHA256 Fingerprint: 6e:a5:47:41:d0:04:66:7e:ed:1b:48:16:63:4a:a3:a7:9e:6e:4b:96:95:0f:82:79:da:fc:8d:9b:d8:81:21:37 +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB +lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt +SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG +A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe +MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v +d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh +cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn +0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ +M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a +MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd +oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI +DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy +oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 +dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy +bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF +BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli +CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE +CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t +3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS +KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== +-----END CERTIFICATE----- + +# Issuer: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Subject: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Label: "Camerfirma Chambers of Commerce Root" +# Serial: 0 +# MD5 Fingerprint: b0:01:ee:14:d9:af:29:18:94:76:8e:f1:69:33:2a:84 +# SHA1 Fingerprint: 6e:3a:55:a4:19:0c:19:5c:93:84:3c:c0:db:72:2e:31:30:61:f0:b1 +# SHA256 Fingerprint: 0c:25:8a:12:a5:67:4a:ef:25:f2:8b:a7:dc:fa:ec:ee:a3:48:e5:41:e6:f5:cc:4e:e6:3b:71:b3:61:60:6a:c3 +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg +b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa +MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB +ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw +IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B +AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb +unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d +BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq +7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 +0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX +roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG +A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j +aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p +26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA +BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud +EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN +BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB +AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd +p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi +1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc +XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 +eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu +tGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +# Issuer: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Subject: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org +# Label: "Camerfirma Global Chambersign Root" +# Serial: 0 +# MD5 Fingerprint: c5:e6:7b:bf:06:d0:4f:43:ed:c4:7a:65:8a:fb:6b:19 +# SHA1 Fingerprint: 33:9b:6b:14:50:24:9b:55:7a:01:87:72:84:d9:e0:2f:c3:d2:d8:e9 +# SHA256 Fingerprint: ef:3c:b4:17:fc:8e:bf:6f:97:87:6c:9e:4e:ce:39:de:1e:a5:fe:64:91:41:d1:02:8b:7d:11:c0:b2:29:8c:ed +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo +YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 +MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy +NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G +A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA +A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 +Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s +QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV +eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 +B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh +z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T +AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i +ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w +TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH +MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD +VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE +VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B +AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM +bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi +ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG +VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c +ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ +AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Kozjegyzoi (Class A) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Subject: CN=NetLock Kozjegyzoi (Class A) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Label: "NetLock Notary (Class A) Root" +# Serial: 259 +# MD5 Fingerprint: 86:38:6d:5e:49:63:6c:85:5c:db:6d:dc:94:b7:d0:f7 +# SHA1 Fingerprint: ac:ed:5f:65:53:fd:25:ce:01:5f:1f:7a:48:3b:6a:74:9f:61:78:c6 +# SHA256 Fingerprint: 7f:12:cd:5f:7e:5e:29:0e:c7:d8:51:79:d5:b7:2c:20:a5:be:75:08:ff:db:5b:f8:1a:b9:68:4a:7f:c9:f6:67 +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV +MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe +TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 +dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0 +N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC +dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu +MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL +b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD +zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi +3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8 +WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY +Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi +NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC +ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4 +QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0 +YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz +aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm +ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg +ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs +amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv +IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3 +Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6 +ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1 +YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg +dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs +b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G +CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO +xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP +0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ +QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk +f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK +8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Subject: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Label: "NetLock Business (Class B) Root" +# Serial: 105 +# MD5 Fingerprint: 39:16:aa:b9:6a:41:e1:14:69:df:9e:6c:3b:72:dc:b6 +# SHA1 Fingerprint: 87:9f:4b:ee:05:df:98:58:3b:e3:60:d6:33:e7:0d:3f:fe:98:71:af +# SHA256 Fingerprint: 39:df:7b:68:2b:7b:93:8f:84:71:54:81:cc:de:8d:60:d8:f2:2e:c5:98:87:7d:0a:aa:c1:2b:59:18:2b:03:12 +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD +EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 +OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l +dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG +SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK +gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX +iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc +Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E +BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G +SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu +b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh +bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv +Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln +aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 +IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph +biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo +ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP +UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj +YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA +bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 +sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa +n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS +NitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Subject: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Label: "NetLock Express (Class C) Root" +# Serial: 104 +# MD5 Fingerprint: 4f:eb:f1:f0:70:c2:80:63:5d:58:9f:da:12:3c:a9:c4 +# SHA1 Fingerprint: e3:92:51:2f:0a:cf:f5:05:df:f6:de:06:7f:75:37:e1:65:ea:57:4b +# SHA256 Fingerprint: 0b:5e:ed:4e:84:64:03:cf:55:e0:65:84:84:40:ed:2a:82:75:8b:f5:b9:aa:1f:25:3d:46:13:cf:a0:80:ff:3f +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD +EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X +DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw +DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u +c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr +TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA +OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC +2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW +RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P +AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW +ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 +YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz +b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO +ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB +IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs +b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s +YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg +a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g +SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 +aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg +YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg +Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY +ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g +pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 +Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- + +# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Label: "XRamp Global CA Root" +# Serial: 107108908803651509692980124233745014957 +# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Label: "StartCom Certification Authority" +# Serial: 1 +# MD5 Fingerprint: 22:4d:8f:8a:fc:f7:35:c2:bb:57:34:90:7b:8b:22:16 +# SHA1 Fingerprint: 3e:2b:f7:f2:03:1b:96:f3:8c:e6:c4:d8:a8:5d:3e:2d:58:47:6a:0f +# SHA256 Fingerprint: c7:66:a9:be:f2:d4:07:1c:86:3a:31:aa:49:20:e8:13:b2:d1:98:60:8c:b7:b7:cf:e2:11:43:b8:36:df:09:ea +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j +ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js +LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM +BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy +dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh +cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh +YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg +dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp +bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ +YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT +TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ +9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 +jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW +FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz +ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 +ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L +EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu +L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC +O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V +um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh +NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= +-----END CERTIFICATE----- + +# Issuer: O=Government Root Certification Authority +# Subject: O=Government Root Certification Authority +# Label: "Taiwan GRCA" +# Serial: 42023070807708724159991140556527066870 +# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e +# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 +# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Firmaprofesional Root CA" +# Serial: 1 +# MD5 Fingerprint: 11:92:79:40:3c:b1:83:40:e5:ab:66:4a:67:92:80:df +# SHA1 Fingerprint: a9:62:8f:4b:98:a9:1b:48:35:ba:d2:c1:46:32:86:bb:66:64:6a:8c +# SHA256 Fingerprint: c1:cf:0b:52:09:64:35:e3:f1:b7:1d:aa:ec:45:5a:23:11:c8:40:4f:55:83:a9:e2:13:c6:9d:85:7d:94:33:05 +-----BEGIN CERTIFICATE----- +MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMx +IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w +HhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTELMAkGA1UEBhMCRVMx +IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5u +Cp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdY +rv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3z +hxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPay +BQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcL +iam8NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcb +AgMBAAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv +bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0 +MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E +FgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQADggEBAEdz/o0n +VPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq +u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36m +hoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzfl +ZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBp +QWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YGVM+h4k0460tQtcsm9MracEpqoeJ5 +quGnM/b9Sh/22WA= +-----END CERTIFICATE----- + +# Issuer: CN=Wells Fargo Root Certificate Authority O=Wells Fargo OU=Wells Fargo Certification Authority +# Subject: CN=Wells Fargo Root Certificate Authority O=Wells Fargo OU=Wells Fargo Certification Authority +# Label: "Wells Fargo Root CA" +# Serial: 971282334 +# MD5 Fingerprint: 20:0b:4a:7a:88:a7:a9:42:86:8a:5f:74:56:7b:88:05 +# SHA1 Fingerprint: 93:e6:ab:22:03:03:b5:23:28:dc:da:56:9e:ba:e4:d1:d1:cc:fb:65 +# SHA256 Fingerprint: 03:45:8b:6a:be:ec:c2:14:95:3d:97:14:9a:f4:53:91:69:1d:e9:f9:cd:cc:26:47:86:3a:3d:67:c9:5c:24:3b +-----BEGIN CERTIFICATE----- +MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v +dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0MTI4WhcNMjEwMTE0 +MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSww +KgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0G +A1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n13 +5zHCLielTWi5MbqNQ1mXx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHE +SxP9cMIlrCL1dQu3U+SlK93OvRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4O +JgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCu +ltQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCE +AQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMB +AAGjYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcB +CzAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw +b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo +7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZWohDo7qd/ +0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0ROhPs7fpvcmR7 +nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx +x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ +33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= +-----END CERTIFICATE----- + +# Issuer: CN=Swisscom Root CA 1 O=Swisscom OU=Digital Certificate Services +# Subject: CN=Swisscom Root CA 1 O=Swisscom OU=Digital Certificate Services +# Label: "Swisscom Root CA 1" +# Serial: 122348795730808398873664200247279986742 +# MD5 Fingerprint: f8:38:7c:77:88:df:2c:16:68:2e:c2:e2:52:4b:b8:f9 +# SHA1 Fingerprint: 5f:3a:fc:0a:8b:64:f6:86:67:34:74:df:7e:a9:a2:fe:f9:fa:7a:51 +# SHA256 Fingerprint: 21:db:20:12:36:60:bb:2e:d4:18:20:5d:a1:1e:e7:a8:5a:65:e2:bc:6e:55:b5:af:7e:78:99:c8:a2:66:d9:2e +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk +MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 +YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg +Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT +AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp +Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9 +m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih +FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/ +TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F +EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco +kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu +HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF +vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo +19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC +L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW +bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX +JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw +FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j +BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc +K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf +ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik +Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB +sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e +3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR +ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip +mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH +b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf +rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms +hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y +zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6 +MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=Class 2 Primary CA O=Certplus +# Subject: CN=Class 2 Primary CA O=Certplus +# Label: "Certplus Class 2 Primary CA" +# Serial: 177770208045934040241468760488327595043 +# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b +# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb +# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Label: "DST Root CA X3" +# Serial: 91299735575339953335919266965803778155 +# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 +# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 +# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +# Issuer: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES +# Subject: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES +# Label: "DST ACES CA X6" +# Serial: 17771143917277623872238992636097467865 +# MD5 Fingerprint: 21:d8:4c:82:2b:99:09:33:a2:eb:14:24:8d:8e:5f:e8 +# SHA1 Fingerprint: 40:54:da:6f:1c:3f:40:74:ac:ed:0f:ec:cd:db:79:d1:53:fb:90:1d +# SHA256 Fingerprint: 76:7c:95:5a:76:41:2c:89:af:68:8e:90:a1:c7:0f:55:6c:fd:6b:60:25:db:ea:10:41:6d:7e:b6:83:1f:8c:40 +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx +ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w +MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD +VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx +FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu +ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 +gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH +fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a +ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT +ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk +c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto +dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt +aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI +hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk +QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ +h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR +rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 +9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= +-----END CERTIFICATE----- + +# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=(c) 2005 TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. +# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=(c) 2005 TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. +# Label: "TURKTRUST Certificate Services Provider Root 1" +# Serial: 1 +# MD5 Fingerprint: f1:6a:22:18:c9:cd:df:ce:82:1d:1d:b7:78:5c:a9:a5 +# SHA1 Fingerprint: 79:98:a3:08:e1:4d:65:85:e6:c2:1e:15:3a:71:9f:ba:5a:d3:4a:d9 +# SHA256 Fingerprint: 44:04:e3:3b:5e:14:0d:cf:99:80:51:fd:fc:80:28:c7:c8:16:15:c5:ee:73:7b:11:1b:58:82:33:a9:b5:35:a0 +-----BEGIN CERTIFICATE----- +MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg +MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 +dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz +MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy +dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD +VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg +xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu +xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7 +XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k +heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J +YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C +urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1 +JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 +b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV +9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7 +kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh +fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy +B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA +aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS +RGQDJereW26fyfJOrN3H +-----END CERTIFICATE----- + +# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Kasım 2005 +# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Kasım 2005 +# Label: "TURKTRUST Certificate Services Provider Root 2" +# Serial: 1 +# MD5 Fingerprint: 37:a5:6e:d4:b1:25:84:97:b7:fd:56:15:7a:f9:a2:00 +# SHA1 Fingerprint: b4:35:d4:e1:11:9d:1c:66:90:a7:49:eb:b3:94:bd:63:7b:a7:82:b7 +# SHA256 Fingerprint: c4:70:cf:54:7e:23:02:b9:77:fb:29:dd:71:a8:9a:7b:6c:1f:60:77:7b:03:29:f5:60:17:f3:28:bf:4f:6b:e6 +-----BEGIN CERTIFICATE----- +MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS +S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg +SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3 +WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv +bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU +UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw +bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe +LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef +J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh +R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ +Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX +JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p +zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S +Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq +ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 +Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz +gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH +uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS +y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI= +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln +biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF +MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT +d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 +76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ +bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c +6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE +emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd +MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt +MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y +MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y +FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi +aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM +gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB +qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 +lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn +8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 +45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO +UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 +O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC +bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv +GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a +77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC +hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 +92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp +Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w +ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt +Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Label: "SwissSign Silver CA - G2" +# Serial: 5700383053117599563 +# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 +# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb +# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu +IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow +RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY +U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv +Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br +YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF +nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH +6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt +eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ +c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ +MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH +HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf +jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 +5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB +rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c +wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB +AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp +WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 +xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ +2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ +IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 +aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X +em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR +dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ +OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ +hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy +tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Label: "GeoTrust Primary Certification Authority" +# Serial: 32798226551256963324313806436981982369 +# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf +# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 +# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA" +# Serial: 69529181992039203566298953787712940909 +# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 +# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 +# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" +# Serial: 33037644167568058970164719475676101450 +# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c +# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 +# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Label: "Network Solutions Certificate Authority" +# Serial: 116697915152937497490437556386812487904 +# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e +# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce +# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +# Issuer: CN=WellsSecure Public Root Certificate Authority O=Wells Fargo WellsSecure OU=Wells Fargo Bank NA +# Subject: CN=WellsSecure Public Root Certificate Authority O=Wells Fargo WellsSecure OU=Wells Fargo Bank NA +# Label: "WellsSecure Public Root Certificate Authority" +# Serial: 1 +# MD5 Fingerprint: 15:ac:a5:c2:92:2d:79:bc:e8:7f:cb:67:ed:02:cf:36 +# SHA1 Fingerprint: e7:b4:f6:9d:61:ec:90:69:db:7e:90:a7:40:1a:3c:f4:7d:4f:e8:ee +# SHA256 Fingerprint: a7:12:72:ae:aa:a3:cf:e8:72:7f:7f:b3:9f:0f:b3:d1:e5:42:6e:90:60:b0:6e:e6:f1:3e:9a:3c:58:33:cd:43 +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx +IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs +cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v +dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0 +MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl +bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD +DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r +WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU +Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs +HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj +z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf +SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl +AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG +KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P +AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j +BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC +VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX +ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB +ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd +/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB +A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn +k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9 +iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv +2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=IGC/A O=PM/SGDN OU=DCSSI +# Subject: CN=IGC/A O=PM/SGDN OU=DCSSI +# Label: "IGC/A" +# Serial: 245102874772 +# MD5 Fingerprint: 0c:7f:dd:6a:f4:2a:b9:c8:9b:bd:20:7e:a9:db:5c:37 +# SHA1 Fingerprint: 60:d6:89:74:b5:c2:65:9e:8a:0f:c1:88:7c:88:d2:46:69:1b:18:2c +# SHA256 Fingerprint: b9:be:a7:86:0a:96:2e:a3:61:1d:ab:97:ab:6d:a3:e2:1c:10:68:b9:7d:55:57:5e:d0:e1:12:79:c1:1c:89:32 +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT +AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ +TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG +9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw +MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM +BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO +MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 +LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI +s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 +xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 +u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b +F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx +Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd +PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV +HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx +NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF +AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ +L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY +YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a +NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R +0982gaEbeC9xs/FZTEYYKKuF0mBWWg== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1 +# Label: "Security Communication EV RootCA1" +# Serial: 0 +# MD5 Fingerprint: 22:2d:a6:01:ea:7c:0a:f7:f0:6c:56:43:3f:77:76:d3 +# SHA1 Fingerprint: fe:b8:c4:32:dc:f9:76:9a:ce:ae:3d:d8:90:8f:fd:28:86:65:64:7d +# SHA256 Fingerprint: a2:2d:ba:68:1e:97:37:6e:2d:39:7d:72:8a:ae:3a:9b:62:96:b9:fd:ba:60:bc:2e:11:f6:47:f2:c6:75:fb:37 +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz +MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N +IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 +bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE +RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO +zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 +bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF +MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 +VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC +OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW +tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ +q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb +EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ +Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O +VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GA CA" +# Serial: 86718877871133159090080555911823548314 +# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 +# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 +# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0= +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA O=Microsec Ltd. OU=e-Szigno CA +# Subject: CN=Microsec e-Szigno Root CA O=Microsec Ltd. OU=e-Szigno CA +# Label: "Microsec e-Szigno Root CA" +# Serial: 272122594155480254301341951808045322001 +# MD5 Fingerprint: f0:96:b6:2f:c5:10:d5:67:8e:83:25:32:e8:5e:2e:e5 +# SHA1 Fingerprint: 23:88:c9:d3:71:cc:9e:96:3d:ff:7d:3c:a7:ce:fc:d6:25:ec:19:0d +# SHA256 Fingerprint: 32:7a:3d:76:1a:ba:de:a0:34:eb:99:84:06:27:5c:b1:a4:77:6e:fd:ae:2f:df:6d:01:68:ea:1c:4f:55:67:d0 +-----BEGIN CERTIFICATE----- +MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAw +cjELMAkGA1UEBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNy +b3NlYyBMdGQuMRQwEgYDVQQLEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9z +ZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0MDYxMjI4NDRaFw0xNzA0MDYxMjI4 +NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEWMBQGA1UEChMN +TWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMTGU1p +Y3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2u +uO/TEdyB5s87lozWbxXGd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+ +LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/NoqdNAoI/gqyFxuEPkEeZlApxcpMqyabA +vjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjcQR/Ji3HWVBTji1R4P770 +Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJPqW+jqpx +62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcB +AQRbMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3Aw +LQYIKwYBBQUHMAKGIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAP +BgNVHRMBAf8EBTADAQH/MIIBcwYDVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIB +AQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3LmUtc3ppZ25vLmh1L1NaU1ov +MIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0AdAB2AOEAbgB5 +ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn +AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABT +AHoAbwBsAGcA4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABh +ACAAcwB6AGUAcgBpAG4AdAAgAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABo +AHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMAegBpAGcAbgBvAC4AaAB1AC8AUwBa +AFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6Ly93d3cuZS1zemln +bm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NOPU1p +Y3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxP +PU1pY3Jvc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZv +Y2F0aW9uTGlzdDtiaW5hcnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuB +EGluZm9AZS1zemlnbm8uaHWkdzB1MSMwIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWdu +w7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhTWjEWMBQGA1UEChMNTWlj +cm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhVMIGsBgNV +HSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJI +VTERMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDAS +BgNVBAsTC2UtU3ppZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBS +b290IENBghEAzLjnv04pGv2i3GalHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS +8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMTnGZjWS7KXHAM/IO8VbH0jgds +ZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FEaGAHQzAxQmHl +7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a +86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfR +hUZLphK3dehKyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/ +MPMMNz7UwiiAc7EBt51alhQBS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: CN=AC Raíz Certicámara S.A. O=Sociedad Cameral de Certificación Digital - Certicámara S.A. +# Subject: CN=AC Raíz Certicámara S.A. O=Sociedad Cameral de Certificación Digital - Certicámara S.A. +# Label: "AC Ra\xC3\xADz Certic\xC3\xA1mara S.A." +# Serial: 38908203973182606954752843738508300 +# MD5 Fingerprint: 93:2a:3e:f6:fd:23:69:0d:71:20:d4:2b:47:99:2b:a6 +# SHA1 Fingerprint: cb:a1:c5:f8:b0:e3:5e:b8:b9:45:12:d3:f9:34:a2:e9:06:10:d3:36 +# SHA256 Fingerprint: a6:c5:1e:0d:a5:ca:0a:93:09:d2:e4:c0:e4:0c:2a:f9:10:7a:ae:82:03:85:7f:e1:98:e3:e7:69:e3:43:08:5c +-----BEGIN CERTIFICATE----- +MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx +CzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp +ZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa +QUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw +NDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft +ZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu +QS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq +hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG +qentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL +fDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ +Y5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4 +Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ +54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b +MMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j +ilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej +YfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt +A/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF +rEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ +pxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB +lTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy +YS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50 +7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs +YSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6 +xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc +unvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/ +Jre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp +ezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42 +gzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0 +jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+ +XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD +W2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/ +RL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r +MDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk +BYn8eNZcLCZDqQ== +-----END CERTIFICATE----- + +# Issuer: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA +# Subject: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA +# Label: "TC TrustCenter Class 2 CA II" +# Serial: 941389028203453866782103406992443 +# MD5 Fingerprint: ce:78:33:5c:59:78:01:6e:18:ea:b9:36:a0:b9:2e:23 +# SHA1 Fingerprint: ae:50:83:ed:7c:f4:5c:bc:8f:61:c6:21:fe:68:5d:79:42:21:15:6e +# SHA256 Fingerprint: e6:b8:f8:76:64:85:f8:07:ae:7f:8d:ac:16:70:46:1f:07:c0:a1:3e:ef:3a:1f:f7:17:53:8d:7a:ba:d3:91:b4 +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV +BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 +Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1 +OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i +SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc +VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf +tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg +uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J +XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK +8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99 +5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3 +kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6 +Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz +JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 +Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS +GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt +ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8 +au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV +hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI +dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ== +-----END CERTIFICATE----- + +# Issuer: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA +# Subject: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA +# Label: "TC TrustCenter Class 3 CA II" +# Serial: 1506523511417715638772220530020799 +# MD5 Fingerprint: 56:5f:aa:80:61:12:17:f6:67:21:e6:2b:6d:61:56:8e +# SHA1 Fingerprint: 80:25:ef:f4:6e:70:c8:d4:72:24:65:84:fe:40:3b:8a:8d:6a:db:f5 +# SHA256 Fingerprint: 8d:a0:84:fc:f9:9c:e0:77:22:f8:9b:32:05:93:98:06:fa:5c:b8:11:e1:c8:13:f6:a1:08:c7:d3:36:b3:40:8e +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV +BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 +Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1 +OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i +SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc +VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW +Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q +Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2 +1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq +ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1 +Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX +XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6 +Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz +JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 +Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN +irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8 +TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6 +g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB +95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj +S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A== +-----END CERTIFICATE----- + +# Issuer: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA +# Subject: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA +# Label: "TC TrustCenter Universal CA I" +# Serial: 601024842042189035295619584734726 +# MD5 Fingerprint: 45:e1:a5:72:c5:a9:36:64:40:9e:f5:e4:58:84:67:8c +# SHA1 Fingerprint: 6b:2f:34:ad:89:58:be:62:fd:b0:6b:5c:ce:bb:9d:d9:4f:4e:39:f3 +# SHA256 Fingerprint: eb:f3:c0:2a:87:89:b1:fb:7d:51:19:95:d6:63:b7:29:06:d9:13:ce:0d:5e:10:56:8a:8a:77:e2:58:61:67:e7 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV +BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1 +c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx +MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg +R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD +VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR +JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T +fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu +jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z +wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ +fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD +VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G +CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1 +7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn +8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs +ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT +ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/ +2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY +-----END CERTIFICATE----- + +# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Label: "Deutsche Telekom Root CA 2" +# Serial: 38 +# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 +# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf +# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +# Issuer: CN=ComSign Secured CA O=ComSign +# Subject: CN=ComSign Secured CA O=ComSign +# Label: "ComSign Secured CA" +# Serial: 264725503855295744117309814499492384489 +# MD5 Fingerprint: 40:01:25:06:8d:21:43:6a:0e:43:00:9c:e7:43:f3:d5 +# SHA1 Fingerprint: f9:cd:0e:2c:da:76:24:c1:8f:bd:f0:f0:ab:b6:45:b8:f7:fe:d5:7a +# SHA256 Fingerprint: 50:79:41:c7:44:60:a0:b4:70:86:22:0d:4e:99:32:57:2a:b5:d1:b5:bb:cb:89:80:ab:1c:b1:76:51:a8:44:d2 +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAw +PDEbMBkGA1UEAxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWdu +MQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwx +GzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBDQTEQMA4GA1UEChMHQ29tU2lnbjEL +MAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGtWhf +HZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs49oh +gHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sW +v+bznkqH7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ue +Mv5WJDmyVIRD9YTC2LxBkMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr +9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d19guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt +6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUwAwEB/zBEBgNVHR8EPTA7 +MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29tU2lnblNl +Y3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58 +ADsAj8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkq +hkiG9w0BAQUFAAOCAQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7p +iL1DRYHjZiM/EoZNGeQFsOY3wo3aBijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtC +dsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtpFhpFfTMDZflScZAmlaxMDPWL +kz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP51qJThRv4zdL +hfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz +OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== +-----END CERTIFICATE----- + +# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc +# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc +# Label: "Cybertrust Global Root" +# Serial: 4835703278459682877484360 +# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 +# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 +# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Label: "ePKI Root Certification Authority" +# Serial: 28956088682735189655030529057352760477 +# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +# Issuer: CN=TÜBİTAK UEKAE Kök Sertifika Hizmet Sağlayıcısı - Sürüm 3 O=Türkiye Bilimsel ve Teknolojik Araştırma Kurumu - TÜBİTAK OU=Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü - UEKAE/Kamu Sertifikasyon Merkezi +# Subject: CN=TÜBİTAK UEKAE Kök Sertifika Hizmet Sağlayıcısı - Sürüm 3 O=Türkiye Bilimsel ve Teknolojik Araştırma Kurumu - TÜBİTAK OU=Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü - UEKAE/Kamu Sertifikasyon Merkezi +# Label: "T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3" +# Serial: 17 +# MD5 Fingerprint: ed:41:f5:8c:50:c5:2b:9c:73:e6:ee:6c:eb:c2:a8:26 +# SHA1 Fingerprint: 1b:4b:39:61:26:27:6b:64:91:a2:68:6d:d7:02:43:21:2d:1f:1d:96 +# SHA256 Fingerprint: e4:c7:34:30:d7:a5:b5:09:25:df:43:37:0a:0d:21:6e:9a:79:b9:d6:db:83:73:a0:c6:9e:b1:cc:31:c7:c5:2a +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS +MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp +bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw +VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy +YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy +dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2 +ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe +Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx +GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls +aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU +QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh +xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0 +aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr +IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h +gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK +O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO +fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw +lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID +AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP +NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t +wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM +7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh +gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n +oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs +yZyQ2uypQjyttgI= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 CA 1 O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 CA 1 O=Buypass AS-983163327 +# Label: "Buypass Class 2 CA 1" +# Serial: 1 +# MD5 Fingerprint: b8:08:9a:f0:03:cc:1b:0d:c8:6c:0b:76:a1:75:64:23 +# SHA1 Fingerprint: a0:a1:ab:90:c9:fc:84:7b:3b:12:61:e8:97:7d:5f:d3:22:61:d3:cc +# SHA256 Fingerprint: 0f:4e:9c:dd:26:4b:02:55:50:d1:70:80:63:40:21:4f:e9:44:34:c9:b0:2f:69:7e:c7:10:fc:5f:ea:fb:5e:38 +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg +Q2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL +MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD +VQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0 +ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX +l18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB +HfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B +5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3 +WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD +AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP +gcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+ +DKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu +BctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs +h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk +LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 CA 1 O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 CA 1 O=Buypass AS-983163327 +# Label: "Buypass Class 3 CA 1" +# Serial: 2 +# MD5 Fingerprint: df:3c:73:59:81:e7:39:50:81:04:4c:34:a2:cb:b3:7b +# SHA1 Fingerprint: 61:57:3a:11:df:0e:d8:7e:d5:92:65:22:ea:d0:56:d7:44:b3:23:71 +# SHA256 Fingerprint: b7:b1:2b:17:1f:82:1d:aa:99:0c:d0:fe:50:87:b1:28:44:8b:a8:e5:18:4f:84:c5:1e:02:b5:c8:fb:96:2b:24 +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg +Q2xhc3MgMyBDQSAxMB4XDTA1MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzEL +MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD +VQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKxifZg +isRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//z +NIqeKNc0n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI ++MkcVyzwPX6UvCWThOiaAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2R +hzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+ +mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0PAQH/BAQD +AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFP +Bdy7pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27s +EzNxZy5p+qksP2bAEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2 +mSlf56oBzKwzqBwKu5HEA6BvtjT5htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yC +e/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQjel/wroQk5PMr+4okoyeYZdow +dXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 +-----END CERTIFICATE----- + +# Issuer: CN=EBG Elektronik Sertifika Hizmet Sağlayıcısı O=EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. +# Subject: CN=EBG Elektronik Sertifika Hizmet Sağlayıcısı O=EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. +# Label: "EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1" +# Serial: 5525761995591021570 +# MD5 Fingerprint: 2c:20:26:9d:cb:1a:4a:00:85:b5:b7:5a:ae:c2:01:37 +# SHA1 Fingerprint: 8c:96:ba:eb:dd:2b:07:07:48:ee:30:32:66:a0:f3:98:6e:7c:ae:58 +# SHA256 Fingerprint: 35:ae:5b:dd:d8:f7:ae:63:5c:ff:ba:56:82:a8:f0:0b:95:f4:84:62:c7:10:8e:e9:a0:e5:29:2b:07:4a:af:b2 +-----BEGIN CERTIFICATE----- +MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNV +BAMML0VCRyBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMTcwNQYDVQQKDC5FQkcgQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXpt +ZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAeFw0wNjA4MTcwMDIxMDlaFw0xNjA4 +MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25payBTZXJ0aWZpa2Eg +SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2ltIFRl +a25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h +4fuXd7hxlugTlkaDT7byX3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAk +tiHq6yOU/im/+4mRDGSaBUorzAzu8T2bgmmkTPiab+ci2hC6X5L8GCcKqKpE+i4s +tPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfreYteIAbTdgtsApWjluTL +dlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZTqNGFav4 +c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8Um +TDGyY5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z ++kI2sSXFCjEmN1ZnuqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0O +Lna9XvNRiYuoP1Vzv9s6xiQFlpJIqkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMW +OeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vmExH8nYQKE3vwO9D8owrXieqW +fo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0Nokb+Clsi7n2 +l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgw +FoAU587GT/wWZ5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+ +8ygjdsZs93/mQJ7ANtyVDR2tFcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI +6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgmzJNSroIBk5DKd8pNSe/iWtkqvTDO +TLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64kXPBfrAowzIpAoHME +wfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqTbCmY +Iai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJn +xk1Gj7sURT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4Q +DgZxGhBM/nV+/x5XOULK1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9q +Kd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11t +hie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQY9iJSrSq3RZj9W6+YKH4 +7ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9AahH3eU7 +QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +# Issuer: CN=CNNIC ROOT O=CNNIC +# Subject: CN=CNNIC ROOT O=CNNIC +# Label: "CNNIC ROOT" +# Serial: 1228079105 +# MD5 Fingerprint: 21:bc:82:ab:49:c4:13:3b:4b:b2:2b:5c:6b:90:9c:19 +# SHA1 Fingerprint: 8b:af:4c:9b:1d:f0:2a:92:f7:da:12:8e:b9:1b:ac:f4:98:60:4b:6f +# SHA256 Fingerprint: e2:83:93:77:3d:a8:45:a6:79:f2:08:0c:c7:fb:44:a3:b7:a1:c3:79:2c:b7:eb:77:29:fd:cb:6a:8d:99:ae:a7 +-----BEGIN CERTIFICATE----- +MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD +TjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2 +MDcwOTE0WhcNMjcwNDE2MDcwOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMF +Q05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzDo+/hn7E7SIX1mlwh +IhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tizVHa6 +dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZO +V/kbZKKTVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrC +GHn2emU1z5DrvTOTn1OrczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gN +v7Sg2Ca+I19zN38m5pIEo3/PIKe38zrKy5nLAgMBAAGjczBxMBEGCWCGSAGG+EIB +AQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMB +Af8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991SlgrHAsEO +76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnK +OOK5Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvH +ugDnuL8BV8F3RTIMO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7Hgvi +yJA/qIYM/PmLXoXLT1tLYhFHxUV8BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fL +buXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2G8kS1sHNzYDzAgE8yGnLRUhj +2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5mmxE= +-----END CERTIFICATE----- + +# Issuer: O=Japanese Government OU=ApplicationCA +# Subject: O=Japanese Government OU=ApplicationCA +# Label: "ApplicationCA - Japanese Government" +# Serial: 49 +# MD5 Fingerprint: 7e:23:4e:5b:a7:a5:b4:25:e9:00:07:74:11:62:ae:d6 +# SHA1 Fingerprint: 7f:8a:b0:cf:d0:51:87:6a:66:f3:36:0f:47:c8:8d:8c:d3:35:fc:74 +# SHA256 Fingerprint: 2d:47:43:7d:e1:79:51:21:5a:12:f3:c5:8e:51:c7:29:a5:80:26:ef:1f:cc:0a:5f:b3:d9:dc:01:2f:60:0d:19 +-----BEGIN CERTIFICATE----- +MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEc +MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRp +b25DQTAeFw0wNzEyMTIxNTAwMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYT +AkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zlcm5tZW50MRYwFAYDVQQLEw1BcHBs +aWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp23gdE6H +j6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4fl+K +f5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55 +IrmTwcrNwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cw +FO5cjFW6WY2H/CPek9AEjP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDiht +QWEjdnjDuGWk81quzMKq2edY3rZ+nYVunyoKb58DKTCXKB28t89UKU5RMfkntigm +/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRUWssmP3HMlEYNllPqa0jQ +k/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNVBAYTAkpQ +MRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOC +seODvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADlqRHZ3ODrso2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJ +hyzjVOGjprIIC8CFqMjSnHH2HZ9g/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+ +eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYDio+nEhEMy/0/ecGc/WLuo89U +DNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmWdupwX3kSa+Sj +B1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL +rosot4LKGAfmt1t06SAZf7IbiVQ= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G3" +# Serial: 28809105769928564313984085209975885599 +# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 +# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd +# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G2" +# Serial: 71758320672825410020661621085256472406 +# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f +# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 +# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G3" +# Serial: 127614157056681299805556476275995414779 +# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 +# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 +# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G2" +# Serial: 80682863203381065782177908751794619243 +# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a +# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 +# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Universal Root Certification Authority" +# Serial: 85209574734084581917763752644031726877 +# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 +# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 +# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +7M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" +# Serial: 63143484348153506665311985501458640051 +# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 +# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a +# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services) +# Label: "NetLock Arany (Class Gold) Főtanúsítvány" +# Serial: 80544274841616 +# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G2" +# Serial: 10000012 +# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a +# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 +# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX +DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 +qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp +uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU +Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE +pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp +5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M +UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN +GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy +5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv +6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK +eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 +B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ +BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov +L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG +SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS +CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen +5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 +IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK +gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL ++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL +vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm +bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk +N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC +Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z +ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig O=Disig a.s. +# Subject: CN=CA Disig O=Disig a.s. +# Label: "CA Disig" +# Serial: 1 +# MD5 Fingerprint: 3f:45:96:39:e2:50:87:f7:bb:fe:98:0c:3c:20:98:e6 +# SHA1 Fingerprint: 2a:c8:d5:8b:57:ce:bf:2f:49:af:f2:fc:76:8f:51:14:62:90:7a:41 +# SHA256 Fingerprint: 92:bf:51:19:ab:ec:ca:d0:b1:33:2d:c4:e1:d0:5f:ba:75:b5:67:90:44:ee:0c:a2:6e:93:1f:74:4f:2f:33:cf +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzET +MBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UE +AxMIQ0EgRGlzaWcwHhcNMDYwMzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQsw +CQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcg +YS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgmGErE +Nx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnX +mjxUizkDPw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYD +XcDtab86wYqg6I7ZuUUohwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhW +S8+2rT+MitcE5eN4TPWGqvWP+j1scaMtymfraHtuM6kMgiioTGohQBUgDCZbg8Kp +FhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8wgfwwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0PAQH/BAQD +AgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cu +ZGlzaWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5z +ay9jYS9jcmwvY2FfZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2sv +Y2EvY3JsL2NhX2Rpc2lnLmNybDAaBgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEw +DQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59tWDYcPQuBDRIrRhCA/ec8J9B6 +yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3mkkp7M5+cTxq +EEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ +CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeB +EicTXxChds6KezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFN +PGO+I++MzVpQuGhU+QqZMxEA4Z7CRneC9VkGjCFMhwnN5ag= +-----END CERTIFICATE----- + +# Issuer: CN=Juur-SK O=AS Sertifitseerimiskeskus +# Subject: CN=Juur-SK O=AS Sertifitseerimiskeskus +# Label: "Juur-SK" +# Serial: 999181308 +# MD5 Fingerprint: aa:8e:5d:d9:f8:db:0a:58:b7:8d:26:87:6c:82:35:55 +# SHA1 Fingerprint: 40:9d:4b:d9:17:b5:5c:27:b6:9b:64:cb:98:22:44:0d:cd:09:b8:89 +# SHA256 Fingerprint: ec:c3:e9:c3:40:75:03:be:e0:91:aa:95:2f:41:34:8f:f8:8b:aa:86:3b:22:64:be:fa:c8:07:90:15:74:e9:39 +-----BEGIN CERTIFICATE----- +MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcN +AQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZp +dHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMw +MVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQsw +CQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEQ +MA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOB +SvZiF3tfTQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkz +ABpTpyHhOEvWgxutr2TC+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvH +LCu3GFH+4Hv2qEivbDtPL+/40UceJlfwUR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMP +PbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDaTpxt4brNj3pssAki14sL +2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQFMAMBAf8w +ggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwIC +MIHDHoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDk +AGwAagBhAHMAdABhAHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0 +AHMAZQBlAHIAaQBtAGkAcwBrAGUAcwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABz +AGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABrAGkAbgBuAGkAdABhAG0AaQBz +AGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nwcy8wKwYDVR0f +BCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE +FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcY +P2/v6X2+MA4GA1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOi +CfP+JmeaUOTDBS8rNXiRTHyoERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+g +kcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyLabVAyJRld/JXIWY7zoVAtjNjGr95 +HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678IIbsSt4beDI3poHS +na9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkhMp6q +qIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0Z +TbvGRNs2yyqcjg== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Label: "Hongkong Post Root CA 1" +# Serial: 1000 +# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca +# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 +# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Label: "SecureSign RootCA11" +# Serial: 1 +# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 +# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 +# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +# Issuer: CN=ACEDICOM Root O=EDICOM OU=PKI +# Subject: CN=ACEDICOM Root O=EDICOM OU=PKI +# Label: "ACEDICOM Root" +# Serial: 7029493972724711941 +# MD5 Fingerprint: 42:81:a0:e2:1c:e3:55:10:de:55:89:42:65:96:22:e6 +# SHA1 Fingerprint: e0:b4:32:2e:b2:f6:a5:68:b6:54:53:84:48:18:4a:50:36:87:43:84 +# SHA256 Fingerprint: 03:95:0f:b4:9a:53:1f:3e:19:91:94:23:98:df:a9:e0:ea:32:d7:ba:1c:dd:9b:c8:5d:b5:7e:d9:40:0b:43:4a +-----BEGIN CERTIFICATE----- +MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE +AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x +CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW +MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF +RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC +AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7 +09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7 +XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P +Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK +t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb +X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28 +MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU +fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI +2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH +K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae +ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP +BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ +MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw +RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv +bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm +fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3 +gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe +I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i +5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi +ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn +MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ +o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6 +zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN +GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt +r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK +Z05phkOTOPu220+DkdRgfks+KzgHVZhepA== +-----END CERTIFICATE----- + +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Label: "Verisign Class 3 Public Primary Certification Authority" +# Serial: 80507572722862485515306429940691309246 +# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4 +# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b +# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05 +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i +2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ +2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=e-Guven Kok Elektronik Sertifika Hizmet Saglayicisi O=Elektronik Bilgi Guvenligi A.S. +# Subject: CN=e-Guven Kok Elektronik Sertifika Hizmet Saglayicisi O=Elektronik Bilgi Guvenligi A.S. +# Label: "E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi" +# Serial: 91184789765598910059173000485363494069 +# MD5 Fingerprint: 3d:41:29:cb:1e:aa:11:74:cd:5d:b0:62:af:b0:43:5b +# SHA1 Fingerprint: dd:e1:d2:a9:01:80:2e:1d:87:5e:84:b3:80:7e:4b:b1:fd:99:41:34 +# SHA256 Fingerprint: e6:09:07:84:65:a4:19:78:0c:b6:ac:4c:1c:0b:fb:46:53:d9:d9:cc:6e:b3:94:6e:b7:f3:d6:99:97:ba:d5:98 +-----BEGIN CERTIFICATE----- +MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxp +Z2kgQS5TLjE8MDoGA1UEAxMzZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZp +a2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3MDEwNDExMzI0OFoXDTE3MDEwNDEx +MzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0cm9uaWsgQmlsZ2kg +R3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9uaWsg +U2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdU +MZTe1RK6UxYC6lhj71vY8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlT +L/jDj/6z/P2douNffb7tC+Bg62nsM+3YjfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H +5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAIJjjcJRFHLfO6IxClv7wC +90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk9Ok0oSy1 +c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoE +VtstxNulMA0GCSqGSIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLP +qk/CaOv/gKlR6D1id4k9CnU58W5dF4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S +/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwqD2fK/A+JYZ1lpTzlvBNbCNvj +/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4Vwpm+Vganf2X +KWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq +fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 6047274297262753887 +# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 +# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa +# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +# Issuer: CN=Izenpe.com O=IZENPE S.A. +# Subject: CN=Izenpe.com O=IZENPE S.A. +# Label: "Izenpe.com" +# Serial: 917563065490389241595536686991402621 +# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 +MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 +ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD +VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j +b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq +scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO +xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H +LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX +uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD +yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ +JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q +rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN +BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L +hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB +QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ +HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu +Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg +QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB +BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA +A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb +laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 +awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo +JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw +LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT +VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk +LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb +UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ +QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ +naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls +QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Label: "Chambers of Commerce Root - 2008" +# Serial: 11806822484801597146 +# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 +# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c +# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz +IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz +MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj +dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw +EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp +MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 +28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq +VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q +DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR +5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL +ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a +Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl +UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s ++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 +Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx +hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV +HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 ++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN +YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t +L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy +ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt +IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV +HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w +DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW +PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF +5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 +glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH +FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 +pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD +xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG +tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq +jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De +fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ +d0jQ +-----END CERTIFICATE----- + +# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Label: "Global Chambersign Root - 2008" +# Serial: 14541511773111788494 +# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 +# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c +# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx +MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy +cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG +A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl +BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed +KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 +G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 +zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 +ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG +HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 +Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V +yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e +beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r +6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog +zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW +BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr +ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp +ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk +cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt +YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC +CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow +KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI +hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ +UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz +X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x +fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz +a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd +Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd +SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O +AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso +M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge +v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +# Issuer: CN=Certinomis - Autorité Racine O=Certinomis OU=0002 433998903 +# Subject: CN=Certinomis - Autorité Racine O=Certinomis OU=0002 433998903 +# Label: "Certinomis - Autorité Racine" +# Serial: 1 +# MD5 Fingerprint: 7f:30:78:8c:03:e3:ca:c9:0a:e2:c9:ea:1e:aa:55:1a +# SHA1 Fingerprint: 2e:14:da:ec:28:f0:fa:1e:8e:38:9a:4e:ab:eb:26:c0:0a:d3:83:c3 +# SHA256 Fingerprint: fc:bf:e2:88:62:06:f7:2b:27:59:3c:8b:07:02:97:e1:2d:76:9e:d1:0e:d7:93:07:05:a8:09:8e:ff:c1:4d:17 +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET +MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk +BgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4 +Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl +cnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYwJAYDVQQDDB1DZXJ0 +aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jY +F1AMnmHawE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N +8y4oH3DfVS9O7cdxbwlyLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWe +rP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K +/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92NjMD2AR5vpTESOH2VwnHu +7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9qc1pkIuVC +28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6 +lSTClrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1E +nn1So2+WLhl+HPNbxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB +0iSVL1N6aaLwD4ZFjliCK0wi1F6g530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql09 +5gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna4NH4+ej9Uji29YnfAgMBAAGj +WzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQN +jLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9s +ov3/4gbIOZ/xWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZM +OH8oMDX/nyNTt7buFHAAQCvaR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q +619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40nJ+U8/aGH88bc62UeYdocMMzpXDn +2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1BCxMjidPJC+iKunqj +o3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjvJL1v +nxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG +5ERQL1TEqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWq +pdEdnV1j6CTmNhTih60bWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZb +dsLLO7XSAPCjDuGtbkD326C00EauFddEwk01+dIL8hf2rGbVJLJP0RyZwG71fet0 +BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- + +# Issuer: CN=Root CA Generalitat Valenciana O=Generalitat Valenciana OU=PKIGVA +# Subject: CN=Root CA Generalitat Valenciana O=Generalitat Valenciana OU=PKIGVA +# Label: "Root CA Generalitat Valenciana" +# Serial: 994436456 +# MD5 Fingerprint: 2c:8c:17:5e:b1:54:ab:93:17:b5:36:5a:db:d1:c6:f2 +# SHA1 Fingerprint: a0:73:e5:c5:bd:43:61:0d:86:4c:21:13:0a:85:58:57:cc:9c:ea:46 +# SHA256 Fingerprint: 8c:4e:df:d0:43:48:f3:22:96:9e:7e:29:a4:cd:4d:ca:00:46:55:06:1c:16:e1:b0:76:42:2e:f3:42:ad:63:0e +-----BEGIN CERTIFICATE----- +MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJF +UzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJ +R1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcN +MDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3WjBoMQswCQYDVQQGEwJFUzEfMB0G +A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScw +JQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+ +WmmmO3I2F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKj +SgbwJ/BXufjpTjJ3Cj9BZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGl +u6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQD0EbtFpKd71ng+CT516nDOeB0/RSrFOy +A8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXteJajCq+TA81yc477OMUxk +Hl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMBAAGjggM7 +MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBr +aS5ndmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIIC +IwYKKwYBBAG/VQIBADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8A +cgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIA +YQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIAYQBsAGkAdABhAHQAIABWAGEA +bABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQByAGEAYwBpAPMA +bgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA +aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMA +aQBvAG4AYQBtAGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQA +ZQAgAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEA +YwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBuAHQAcgBhACAAZQBuACAAbABhACAA +ZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcA +LgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0dHA6 +Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+y +eAT8MIGVBgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQsw +CQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0G +A1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVu +Y2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRhTvW1yEICKrNcda3Fbcrn +lD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdzCkj+IHLt +b8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg +9J63NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XF +ducTZnV+ZfsBn5OHiJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmC +IoaZM3Fa6hlXPZHNqcCjbgcTpsnt+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= +-----END CERTIFICATE----- + +# Issuer: CN=A-Trust-nQual-03 O=A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH OU=A-Trust-nQual-03 +# Subject: CN=A-Trust-nQual-03 O=A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH OU=A-Trust-nQual-03 +# Label: "A-Trust-nQual-03" +# Serial: 93214 +# MD5 Fingerprint: 49:63:ae:27:f4:d5:95:3d:d8:db:24:86:b8:9c:07:53 +# SHA1 Fingerprint: d3:c0:63:f2:19:ed:07:3e:34:ad:5d:75:0b:32:76:29:ff:d5:9a:f2 +# SHA256 Fingerprint: 79:3c:bf:45:59:b9:fd:e3:8a:b2:2d:f1:68:69:f6:98:81:ae:14:c4:b0:13:9a:c7:88:a7:8a:1a:fc:ca:02:fb +-----BEGIN CERTIFICATE----- +MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJB +VDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp +bSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5R +dWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5RdWFsLTAzMB4XDTA1MDgxNzIyMDAw +MFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgwRgYDVQQKDD9BLVRy +dXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0ZW52 +ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMM +EEEtVHJ1c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCtPWFuA/OQO8BBC4SAzewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUj +lUC5B3ilJfYKvUWG6Nm9wASOhURh73+nyfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZ +znF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPESU7l0+m0iKsMrmKS1GWH +2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4iHQF63n1 +k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs +2e3Vcuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYD +VR0OBAoECERqlWdVeRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAVdRU0VlIXLOThaq/Yy/kgM40ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fG +KOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmrsQd7TZjTXLDR8KdCoLXEjq/+ +8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZdJXDRZslo+S4R +FGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS +mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmE +DNuxUCAKGkq6ahq97BvIxYSazQ== +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Label: "TWCA Root Certification Authority" +# Serial: 1 +# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Label: "Security Communication RootCA2" +# Serial: 0 +# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2011" +# Serial: 0 +# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 +# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d +# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix +RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p +YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw +NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK +EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl +cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz +dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ +fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns +bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD +75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP +FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV +HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp +5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu +b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA +A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p +6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 +dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys +Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI +l7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Label: "Actalis Authentication Root CA" +# Serial: 6271844772424770508 +# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +# Issuer: O=Trustis Limited OU=Trustis FPS Root CA +# Subject: O=Trustis Limited OU=Trustis FPS Root CA +# Label: "Trustis FPS Root CA" +# Serial: 36053640375399034304724988975563710553 +# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d +# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 +# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL +ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx +MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc +MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ +AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH +iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj +vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA +0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB +OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ +BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E +FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 +GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW +zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 +1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE +f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F +jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN +ZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing +# Label: "StartCom Certification Authority" +# Serial: 45 +# MD5 Fingerprint: c9:3b:0d:84:41:fc:a4:76:79:23:08:57:de:10:19:16 +# SHA1 Fingerprint: a3:f1:33:3f:e2:42:bf:cf:c5:d1:4e:8f:39:42:98:40:68:10:d1:a0 +# SHA256 Fingerprint: e1:78:90:ee:09:a3:fb:f4:f4:8b:9c:41:4a:17:d6:37:b7:a5:06:47:e9:bc:75:23:22:72:7f:cc:17:42:a9:11 +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg +Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9 +MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi +U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh +cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk +pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf +OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C +Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT +Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi +HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM +Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w ++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ +Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 +Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B +26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID +AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul +F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC +ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w +ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk +aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0 +YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg +c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93 +d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG +CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF +wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS +Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst +0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc +pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl +CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF +P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK +1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm +KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ +8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm +fyWl8kgAwKQB2j8= +-----END CERTIFICATE----- + +# Issuer: CN=StartCom Certification Authority G2 O=StartCom Ltd. +# Subject: CN=StartCom Certification Authority G2 O=StartCom Ltd. +# Label: "StartCom Certification Authority G2" +# Serial: 59 +# MD5 Fingerprint: 78:4b:fb:9e:64:82:0a:d3:b8:4c:62:f3:64:f2:90:64 +# SHA1 Fingerprint: 31:f1:fd:68:22:63:20:ee:c6:3b:3f:9d:ea:4a:3e:53:7c:7c:39:17 +# SHA256 Fingerprint: c7:ba:65:67:de:93:a7:98:ae:1f:aa:79:1e:71:2d:37:8f:ae:1f:93:c4:39:7f:ea:44:1b:b7:cb:e6:fd:59:95 +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1 +OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG +A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ +JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD +vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo +D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/ +Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW +RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK +HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN +nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM +0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i +UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9 +Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg +TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL +BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX +UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl +6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK +9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ +HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI +wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY +XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l +IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo +hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr +so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 2 Root CA" +# Serial: 2 +# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 3 Root CA" +# Serial: 2 +# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 3" +# Serial: 1 +# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Label: "EE Certification Centre Root CA" +# Serial: 112324828676200291871926431888494945866 +# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f +# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 +# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 +czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG +CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy +MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl +ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS +b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy +euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO +bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw +WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d +MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE +1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ +zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF +BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV +v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG +E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW +iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v +GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= +-----END CERTIFICATE----- + +# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Aralık 2007 +# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Aralık 2007 +# Label: "TURKTRUST Certificate Services Provider Root 2007" +# Serial: 1 +# MD5 Fingerprint: 2b:70:20:56:86:82:a0:18:c8:07:53:12:28:70:21:72 +# SHA1 Fingerprint: f1:7f:6f:b6:31:dc:99:e3:a3:c8:7f:fe:1c:f1:81:10:88:d9:60:33 +# SHA256 Fingerprint: 97:8c:d9:66:f2:fa:a0:7b:a7:aa:95:00:d9:c0:2e:9d:77:f2:cd:ad:a6:ad:6b:a7:4a:f4:b9:1c:66:59:3c:50 +-----BEGIN CERTIFICATE----- +MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc +UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS +S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg +SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx +OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry +b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC +VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE +sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F +ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY +KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG ++7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG +HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P +IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M +733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk +Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW +AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I +aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5 +mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa +XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ +qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9 +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 2009" +# Serial: 623603 +# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +# Serial: 623604 +# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Raiz del Estado Venezolano O=Sistema Nacional de Certificacion Electronica OU=Superintendencia de Servicios de Certificacion Electronica +# Subject: CN=PSCProcert O=Sistema Nacional de Certificacion Electronica OU=Proveedor de Certificados PROCERT +# Label: "PSCProcert" +# Serial: 11 +# MD5 Fingerprint: e6:24:e9:12:01:ae:0c:de:8e:85:c4:ce:a3:12:dd:ec +# SHA1 Fingerprint: 70:c1:8d:74:b4:28:81:0a:e4:fd:a5:75:d7:01:9f:99:b0:3d:50:74 +# SHA256 Fingerprint: 3c:fc:3c:14:d1:f6:84:ff:17:e3:8c:43:ca:44:0c:00:b9:67:ec:93:3e:8b:fe:06:4c:a1:d7:2c:90:f2:ad:b0 +-----BEGIN CERTIFICATE----- +MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9s +YW5vMQswCQYDVQQGEwJWRTEQMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlz +dHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0 +aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBlcmludGVuZGVuY2lh +IGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUwIwYJ +KoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEw +MFoXDTIwMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHBy +b2NlcnQubmV0LnZlMQ8wDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGEx +KjAoBgNVBAsTIVByb3ZlZWRvciBkZSBDZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQG +A1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9u +aWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo9 +7BVCwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74 +BCXfgI8Qhd19L3uA3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38G +ieU89RLAu9MLmV+QfI4tL3czkkohRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9 +JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmOEO8GqQKJ/+MMbpfg353bIdD0 +PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG20qCZyFSTXai2 +0b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH +0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/ +6mnbVSKVUyqUtd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1m +v6JpIzi4mWCZDlZTOpx+FIywBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7 +K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvpr2uKGcfLFFb14dq12fy/czja+eev +bqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/AgEBMDcGA1UdEgQw +MC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0w +MB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFD +gBStuyIdxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0 +b3JpZGFkIGRlIENlcnRpZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xh +bm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQHEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0 +cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5hY2lvbmFsIGRlIENlcnRp +ZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5kZW5jaWEg +ZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkq +hkiG9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQD +AgEGME0GA1UdEQRGMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0w +MDAwMDKgGwYFYIZeAgKgEgwQUklGLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEag +RKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9sY3IvQ0VSVElGSUNBRE8t +UkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNyYWl6LnN1c2Nl +cnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v +Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsG +AQUFBwIBFh5odHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcN +AQELBQADggIBACtZ6yKZu4SqT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS +1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmNg7+mvTV+LFwxNG9s2/NkAZiqlCxB +3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4quxtxj7mkoP3Yldmv +Wb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1n8Gh +HVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHm +pHmJWhSnFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXz +sOfIt+FTvZLm8wyWuevo5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bE +qCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq3TNWOByyrYDT13K9mmyZY+gAu0F2Bbdb +mRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5poLWccret9W6aAjtmcz9 +opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3YeMLEYC/H +YvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km +-----END CERTIFICATE----- + +# Issuer: CN=China Internet Network Information Center EV Certificates Root O=China Internet Network Information Center +# Subject: CN=China Internet Network Information Center EV Certificates Root O=China Internet Network Information Center +# Label: "China Internet Network Information Center EV Certificates Root" +# Serial: 1218379777 +# MD5 Fingerprint: 55:5d:63:00:97:bd:6a:97:f5:67:ab:4b:fb:6e:63:15 +# SHA1 Fingerprint: 4f:99:aa:93:fb:2b:d1:37:26:a1:99:4a:ce:7f:f0:05:f2:93:5d:1e +# SHA256 Fingerprint: 1c:01:c6:f4:db:b2:fe:fc:22:55:8b:2b:ca:32:56:3f:49:84:4a:cf:c3:2b:7b:e4:b0:ff:59:9f:9e:8c:7a:f7 +-----BEGIN CERTIFICATE----- +MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC +Q04xMjAwBgNVBAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24g +Q2VudGVyMUcwRQYDVQQDDD5DaGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0 +aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMgUm9vdDAeFw0xMDA4MzEwNzExMjVa +Fw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAGA1UECgwpQ2hpbmEg +SW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMMPkNo +aW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRp +ZmljYXRlcyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z +7r07eKpkQ0H1UN+U8i6yjUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA// +DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV98YPjUesWgbdYavi7NifFy2cyjw1l1Vx +zUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2HklY0bBoQCxfVWhyXWIQ8 +hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23KzhmBsUs +4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54u +gQEC7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oY +NJKiyoOCWTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E +FgQUfHJLOcfA22KlT5uqGDSSosqDglkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3 +j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd50XPFtQO3WKwMVC/GVhMPMdoG +52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM7+czV0I664zB +echNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws +ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrI +zo9uoV1/A3U05K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATy +wy39FCqQmbkHzJ8= +-----END CERTIFICATE----- + +# Issuer: CN=Swisscom Root CA 2 O=Swisscom OU=Digital Certificate Services +# Subject: CN=Swisscom Root CA 2 O=Swisscom OU=Digital Certificate Services +# Label: "Swisscom Root CA 2" +# Serial: 40698052477090394928831521023204026294 +# MD5 Fingerprint: 5b:04:69:ec:a5:83:94:63:18:a7:86:d0:e4:f2:6e:19 +# SHA1 Fingerprint: 77:47:4f:c6:30:e4:0f:4c:47:64:3f:84:ba:b8:c6:95:4a:8a:41:ec +# SHA256 Fingerprint: f0:9b:12:2c:71:14:f4:a0:9b:d4:ea:4f:4a:99:d5:58:b4:6e:4c:25:cd:81:14:0d:29:c0:56:13:91:4c:38:41 +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBk +MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 +YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg +Q0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2MjUwNzM4MTRaMGQxCzAJBgNVBAYT +AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp +Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvEr +jw0DzpPMLgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r +0rk0X2s682Q2zsKwzxNoysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f +2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJwDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVP +ACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpHWrumnf2U5NGKpV+GY3aF +y6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1aSgJA/MTA +tukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL +6yxSNLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0 +uPoTXGiTOmekl9AbmbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrAL +acywlKinh/LTSlDcX3KwFnUey7QYYpqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velh +k6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3qPyZ7iVNTA6z00yPhOgpD/0Q +VAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw +FDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O +BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqh +b97iEoHF8TwuMA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4R +fbgZPnm3qKhyN2abGu2sEzsOv2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv +/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ82YqZh6NM4OKb3xuqFp1mrjX2lhI +REeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLzo9v/tdhZsnPdTSpx +srpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcsa0vv +aGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciAT +woCqISxxOQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99n +Bjx8Oto0QuFmtEYE3saWmA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5W +t6NlUe07qxS/TFED6F+KBZvuim6c779o+sjaC+NCydAXFJy3SuCvkychVSa1ZC+N +8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TCrvJcwhbtkj6EPnNgiLx2 +9CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX5OfNeOI5 +wSsSnqaeG8XmDtkx2Q== +-----END CERTIFICATE----- + +# Issuer: CN=Swisscom Root EV CA 2 O=Swisscom OU=Digital Certificate Services +# Subject: CN=Swisscom Root EV CA 2 O=Swisscom OU=Digital Certificate Services +# Label: "Swisscom Root EV CA 2" +# Serial: 322973295377129385374608406479535262296 +# MD5 Fingerprint: 7b:30:34:9f:dd:0a:4b:6b:35:ca:31:51:28:5d:ae:ec +# SHA1 Fingerprint: e7:a1:90:29:d3:d5:52:dc:0d:0f:c6:92:d3:ea:88:0d:15:2e:1a:6b +# SHA256 Fingerprint: d9:5f:ea:3c:a4:ee:dc:e7:4c:d7:6e:75:fc:6d:1f:f6:2c:44:1f:0f:a8:bc:77:f0:34:b1:9e:5d:b2:58:01:5d +-----BEGIN CERTIFICATE----- +MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAw +ZzELMAkGA1UEBhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdp +dGFsIENlcnRpZmljYXRlIFNlcnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290 +IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcNMzEwNjI1MDg0NTA4WjBnMQswCQYD +VQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2Vy +dGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYgQ0Eg +MjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7Bx +UglgRCgzo3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD +1ycfMQ4jFrclyxy0uYAyXhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPH +oCE2G3pXKSinLr9xJZDzRINpUKTk4RtiGZQJo/PDvO/0vezbE53PnUgJUmfANykR +HvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8LiqG12W0OfvrSdsyaGOx9/ +5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaHZa0zKcQv +idm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHL +OdAGalNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaC +NYGu+HuB5ur+rPQam3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f +46Fq9mDU5zXNysRojddxyNMkM3OxbPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCB +UWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDixzgHcgplwLa7JSnaFp6LNYth +7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/BAQDAgGGMB0G +A1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED +MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWB +bj2ITY1x0kbBbkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6x +XCX5145v9Ydkn+0UjrgEjihLj6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98T +PLr+flaYC/NUn81ETm484T4VvwYmneTwkLbUwp4wLh/vx3rEUMfqe9pQy3omywC0 +Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7XwgiG/W9mR4U9s70 +WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH59yL +Gn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm +7JFe3VE/23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4S +nr8PyQUQ3nqjsTzyP6WqJ3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VN +vBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyAHmBR3NdUIR7KYndP+tiPsys6DXhyyWhB +WkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/giuMod89a2GQ+fYWVq6nTI +fI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuWl8PVP3wb +I+2ksx0WckNLIOFZfsLorSa/ovc= +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R1 O=Disig a.s. +# Subject: CN=CA Disig Root R1 O=Disig a.s. +# Label: "CA Disig Root R1" +# Serial: 14052245610670616104 +# MD5 Fingerprint: be:ec:11:93:9a:f5:69:21:bc:d7:c1:c0:67:89:cc:2a +# SHA1 Fingerprint: 8e:1c:74:f8:a6:20:b9:e5:8a:f4:61:fa:ec:2b:47:56:51:1a:52:c6 +# SHA256 Fingerprint: f9:6f:23:f4:c3:e7:9c:07:7a:46:98:8d:5a:f5:90:06:76:a0:f0:39:cb:64:5d:d1:75:49:b2:16:c8:24:40:ce +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy +MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk +D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o +OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A +fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe +IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n +oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK +/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj +rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD +3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE +7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC +yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd +qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI +hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR +xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA +SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo +HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB +emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC +AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb +7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x +DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk +F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF +a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT +Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R2 O=Disig a.s. +# Subject: CN=CA Disig Root R2 O=Disig a.s. +# Label: "CA Disig Root R2" +# Serial: 10572350602393338211 +# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- diff --git a/src/commandline.py b/src/commandline.py new file mode 100644 index 00000000..d681c146 --- /dev/null +++ b/src/commandline.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +import argparse +import paths + +parser = argparse.ArgumentParser(description="TW Blue command line launcher") +group = parser.add_mutually_exclusive_group() +group.add_argument("-p", "--portable", help="Use TW Blue as a portable aplication", action="store_true", default=True) +group.add_argument("-i", "--installed", help="Use TW Blue as an installed application. Config files will be saved on the user data directory", action="store_true") +parser.add_argument("-d", "--data-directory", action="store", dest="directory", help="Specifies the directory where TW Blue saves the data files") +args = parser.parse_args() +if args.installed == True: paths.mode = "installed" +elif args.portable == True: + paths.mode = "portable" + if args.directory != None: paths.directory = args.directory diff --git a/src/config.py b/src/config.py new file mode 100644 index 00000000..c4f482c0 --- /dev/null +++ b/src/config.py @@ -0,0 +1,16 @@ +# -*- coding: cp1252 -*- +from config_utils import Configuration, ConfigurationResetException +import paths + +MAINFILE = "session.conf" +MAINSPEC = "Conf.defaults" + +main = None + +def setup (): + global main + try: + main = Configuration(paths.config_path(MAINFILE), paths.app_path(MAINSPEC)) + except ConfigurationResetException: + pass +# return main \ No newline at end of file diff --git a/src/config_utils.py b/src/config_utils.py new file mode 100644 index 00000000..7e636148 --- /dev/null +++ b/src/config_utils.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +from UserDict import UserDict +from configobj import ConfigObj, ParseError +from validate import Validator, VdtValueError +import os + +"""We're using the configobj python package +from http://www.voidspace.org.uk/python/configobj.html """ + +class ConfigurationResetException(Exception): + pass + + +class Configuration (UserDict): + + def __init__ (self, file=None, spec=None, *args, **kwargs): + self.file = file + self.spec = spec + self.validator = Validator() + self.setup_config(file=file, spec=spec) + self.validated = self.config.validate(self.validator, copy=True) + if self.validated: + self.write() + UserDict.__init__(self, self.config) + + def setup_config (self, file, spec): + #The default way -- load from a file + spec = ConfigObj(spec, list_values=False, encoding="utf-8") + try: + self.config = ConfigObj(infile=file, configspec=spec, create_empty=True, stringify=True, encoding="utf-8") + except ParseError: + os.remove(file) + self.config = ConfigObj(infile=file, configspec=spec, create_empty=True, stringify=True) + raise ConfigurationResetException + def __getitem__ (self, *args, **kwargs): + return dict(self.config).__getitem__(*args, **kwargs) + + def __setitem__ (self, *args, **kwargs): + self.config.__setitem__(*args, **kwargs) + UserDict.__setitem__(self, *args, **kwargs) + + def write (self): + if hasattr(self.config, 'write'): + self.config.write() + +class SessionConfiguration (Configuration): + def setup_config (self, file, spec): + #No infile required. + spec = ConfigObj(spec, list_values=False) + self.config = ConfigObj(configspec=spec, stringify=True) diff --git a/src/db.py b/src/db.py new file mode 100644 index 00000000..3e4c957b --- /dev/null +++ b/src/db.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +""" Handles storage from a durus database """ +class db(object): + def __init__(self): + self.settings = {} \ No newline at end of file diff --git a/src/extra/AudioUploader/__init__.py b/src/extra/AudioUploader/__init__.py new file mode 100644 index 00000000..8c0cd2e8 --- /dev/null +++ b/src/extra/AudioUploader/__init__.py @@ -0,0 +1,3 @@ +import gui, transfer, transfer_dialogs, platform +if platform.system() != "Darwin": + import dropbox \ No newline at end of file diff --git a/src/extra/AudioUploader/dropbox_transfer.py b/src/extra/AudioUploader/dropbox_transfer.py new file mode 100644 index 00000000..e693fef4 --- /dev/null +++ b/src/extra/AudioUploader/dropbox_transfer.py @@ -0,0 +1,113 @@ +# -*- coding: utf-8 -*- +import threading +import time +import os +import exceptions +import wx +import dropbox +import config +from mysc import event +from utils import * +from dropbox.rest import ErrorResponse +from StringIO import StringIO + +class UnauthorisedError(exceptions.Exception): + def __init__(self, *args, **kwargs): + super(UnauthorisedError, self).__init__(*args, **kwargs) + +class newChunkedUploader(dropbox.client.ChunkedUploader): + def __init__(self, client, file_obj, length, callback): + super(newChunkedUploader, self).__init__(client, file_obj, length) + self.progress_callback = callback + + def upload_chunked(self, chunk_size = 4 * 1024 * 1024): + while self.offset < self.target_length: + next_chunk_size = min(chunk_size, self.target_length - self.offset) + if self.last_block == None: + self.last_block = self.file_obj.read(next_chunk_size) + + try: + (self.offset, self.upload_id) = self.client.upload_chunk( + StringIO(self.last_block), next_chunk_size, self.offset, self.upload_id) + self.last_block = None + if callable(self.progress_callback): self.progress_callback(self.offset) + except ErrorResponse as e: + reply = e.body + if "offset" in reply and reply['offset'] != 0: + if reply['offset'] > self.offset: + self.last_block = None + self.offset = reply['offset'] + +class dropboxLogin(object): + def __init__(self): + self.logged = False + self.app_key = "c8ikm0gexqvovol" + self.app_secret = "gvvi6fzfecooast" + + def get_url(self): + self.flow = dropbox.client.DropboxOAuth2FlowNoRedirect(self.app_key, self.app_secret) + return self.flow.start() + + def authorise(self, code): + access_token, user_id = self.flow.finish(code) + config.main["services"]["dropbox_token"] = access_token + self.logged = True + +class dropboxUploader(object): + def __init__(self, filename, completed_callback, wxDialog, short_url=False): + if config.main["services"]["dropbox_token"] != "": + self.client = dropbox.client.DropboxClient(config.main["services"]["dropbox_token"]) + else: + raise UnauthorisedError("You need authorise TWBlue") + self.filename = filename + self.short_url = short_url + self.wxDialog = wxDialog + self.file = open(self.filename, "rb") + self.file_size = os.path.getsize(self.filename) + self.uploader = newChunkedUploader(client=self.client, file_obj=self.file, length=self.file_size, callback=self.process) + self.start_time = None + self.completed_callback = completed_callback + self.background_thread = None + self.current = 0 + self.transfer_rate = 0 + + def elapsed_time(self): + if not self.start_time: + return 0 + return time.time() - self.start_time + + def perform_transfer(self): + self.start_time = time.time() + while self.uploader.offset < self.file_size: + self.uploader.upload_chunked(self.file_size/100) + self.transfer_completed() + + def process(self, offset): + progress = {} + self.current = offset + progress["total"] = self.file_size + progress["current"] = self.current + progress["percent"] = int((float(progress["current"]) / progress["total"]) * 100) + self.transfer_rate = progress["current"] / self.elapsed_time() + progress["speed"] = '%s/s' % convert_bytes(self.transfer_rate) + if self.transfer_rate: + progress["eta"] = (progress["total"] - progress["current"]) / self.transfer_rate + else: + progress["eta"] = 0 + info = event.event(event.EVT_OBJECT, 1) + info.SetItem(progress) + wx.PostEvent(self.wxDialog, info) + + def perform_threaded(self): + self.background_thread = threading.Thread(target=self.perform_transfer) + self.background_thread.daemon = True + self.background_thread.start() + + def transfer_completed(self): + self.uploader.finish(os.path.basename(self.filename)) + if callable(self.completed_callback): + self.completed_callback() + + def get_url(self): + original = "%s" % (self.client.share(os.path.basename(self.filename), False)["url"]) + return original.replace("dl=0", "dl=1") \ No newline at end of file diff --git a/src/extra/AudioUploader/gui.py b/src/extra/AudioUploader/gui.py new file mode 100644 index 00000000..0388fa65 --- /dev/null +++ b/src/extra/AudioUploader/gui.py @@ -0,0 +1,190 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx +import output +import tempfile +import sound +import os +import config +from mysc.thread_utils import call_threaded +import sound_lib + +class audioDialog(wx.Dialog): + def __init__(self, parent): + self.parent = parent + wx.Dialog.__init__(self, None, -1, _(u"Attach audio")) + self.file = None + self.recorded = False + self.recording = None + self.playing = None + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + self.play = wx.Button(panel, -1, _(u"Play")) + self.play.Bind(wx.EVT_BUTTON, self.onPlay) + self.play.Disable() + self.pause = wx.Button(panel, -1, _(u"Pause")) + self.pause.Bind(wx.EVT_BUTTON, self.onPause) + self.pause.Disable() + self.record = wx.Button(panel, -1, _(u"Record")) + self.record.Bind(wx.EVT_BUTTON, self.onRecord) + self.record.SetFocus() + self.attach_exists = wx.Button(panel, -1, _(u"Add an existing file")) + self.attach_exists.Bind(wx.EVT_BUTTON, self.onAttach) + self.discard = wx.Button(panel, -1, _(u"Discard")) + self.discard.Bind(wx.EVT_BUTTON, self.onDiscard) + self.discard.Disable() + label = wx.StaticText(panel, -1, _(u"Upload to")) + self.services = wx.ComboBox(panel, -1, choices=self.get_available_services(), value=self.get_available_services()[0], style=wx.CB_READONLY) + servicesBox = wx.BoxSizer(wx.HORIZONTAL) + servicesBox.Add(label) + servicesBox.Add(self.services) + self.attach = wx.Button(panel, wx.ID_OK, _(u"Attach")) + self.attach.Disable() + cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Cancel")) + sizer.Add(self.play) + sizer.Add(self.pause) + sizer.Add(self.record) + sizer.Add(self.attach_exists) + sizer.Add(self.discard) + sizer.Add(self.attach) + + def get_available_services(self): + services = [] + if config.main["services"]["dropbox_token"] != "": + services.append("Dropbox") + services.append("SNDUp") + return services + + def onPause(self, ev): + if self.pause.GetLabel() == _(u"Pause"): + self.recording.pause() + self.pause.SetLabel(_(u"Resume")) + elif self.pause.GetLabel() == _(u"Resume"): + self.recording.play() + self.pause.SetLabel(_(U"Pause")) + + def onRecord(self, ev): + if self.recording != None: + self.stop_recording() + self.pause.Disable() + else: + self.start_recording() + self.pause.Enable() + + def start_recording(self): + self.attach_exists.Disable() + self.file = tempfile.mktemp(suffix='.wav') + self.recording = sound.recording(self.file) + self.recording.play() + self.record.SetLabel(_(u"Stop recording")) + output.speak(_(u"Recording")) + + def stop_recording(self): + self.recording.stop() + self.recording.free() + output.speak(_(u"Stopped")) + self.recorded = True + self.record.SetLabel(_(u"Record")) + self.file_attached() + + def file_attached(self): + self.pause.SetLabel(_(u"Pause")) + self.record.Disable() + self.play.Enable() + self.discard.Enable() + self.attach_exists.Disable() + self.attach.Enable() + self.play.SetFocus() + + def onDiscard(self, evt): + evt.Skip() + if self.playing: + self._stop() + if self.recording != None: + self.attach.Disable() + self.play.Disable() + self.file = None + self.record.Enable() + self.attach_exists.Enable() + self.record.SetFocus() + self.discard.Disable() + self.recording = None + output.speak(_(u"Discarded")) + + def onPlay(self, evt): + evt.Skip() + if not self.playing: + call_threaded(self._play) + else: + self._stop() + + def _play(self): + output.speak(_(u"Playing...")) +# try: + self.playing = sound_lib.stream.FileStream(file=unicode(self.file), flags=sound_lib.stream.BASS_UNICODE) + self.playing.play() + self.play.SetLabel(_(u"Stop")) + try: + while self.playing.is_playing: + pass + self.play.SetLabel(_(u"Play")) + self.playing.free() + self.playing = None + except: + pass + + def _stop(self): + output.speak(_(u"Stopped")) + self.playing.stop() + self.playing.free() + self.play.SetLabel(_(u"Play")) + self.playing = None + + def postprocess(self): + if self.file.lower().endswith('.wav'): + output.speak(_(u"Recoding audio...")) + sound.recode_audio(self.file) + self.wav_file = self.file + self.file = '%s.ogg' % self.file[:-4] + + def cleanup(self): + if self.playing and self.playing.is_playing: + self.playing.stop() + if self.recording != None: + if self.recording.is_playing: + self.recording.stop() + try: + self.recording.free() + except: + pass + os.remove(self.file) + if hasattr(self, 'wav_file'): + os.remove(self.wav_file) + del(self.wav_file) + if hasattr(self, 'wav_file') and os.path.exists(self.file): + os.remove(self.file) + + + def onAttach(self, ev): + openFileDialog = wx.FileDialog(self, _(u"Select the audio file to be uploaded"), "", "", _("Audio Files (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) + if openFileDialog.ShowModal() == wx.ID_CANCEL: + return + self.file = openFileDialog.GetPath() + self.file_attached() + ev.Skip() diff --git a/src/extra/AudioUploader/transfer.py b/src/extra/AudioUploader/transfer.py new file mode 100644 index 00000000..506b1cd5 --- /dev/null +++ b/src/extra/AudioUploader/transfer.py @@ -0,0 +1,107 @@ +# -*- coding: utf-8 -*- +import pycurl +import sys +import threading +import time +import json +import wx +from mysc import event +from utils import * + +#__all__ = ['TransferDialog', 'DownloadDialog', 'UploadDialog'] + +class Transfer(object): + + def __init__(self, url=None, filename=None, follow_location=True, completed_callback=None, verbose=False, wxDialog=None, *args, **kwargs): + self.url = url + self.filename = filename + self.curl = pycurl.Curl() + self.start_time = None + self.completed_callback = completed_callback + self.background_thread = None + self.transfer_rate = 0 + self.curl.setopt(self.curl.PROGRESSFUNCTION, self.progress_callback) + self.curl.setopt(self.curl.URL, url) + self.curl.setopt(self.curl.NOPROGRESS, 0) + self.curl.setopt(self.curl.HTTP_VERSION, self.curl.CURL_HTTP_VERSION_1_0) + self.curl.setopt(self.curl.FOLLOWLOCATION, int(follow_location)) + self.curl.setopt(self.curl.VERBOSE, int(verbose)) + self.wxDialog = wxDialog + super(Transfer, self).__init__(*args, **kwargs) + + def elapsed_time(self): + if not self.start_time: + return 0 + return time.time() - self.start_time + + def progress_callback(self, down_total, down_current, up_total, up_current): + progress = {} + progress["total"] = up_total + progress["current"] = up_current +# else: +# print "Killed function" +# return + if progress["current"] == 0: + progress["percent"] = 0 + self.transfer_rate = 0 + else: + progress["percent"] = int((float(progress["current"]) / progress["total"]) * 100) + self.transfer_rate = progress["current"] / self.elapsed_time() + progress["speed"] = '%s/s' % convert_bytes(self.transfer_rate) + if self.transfer_rate: + progress["eta"] = (progress["total"] - progress["current"]) / self.transfer_rate + else: + progress["eta"] = 0 + info = event.event(event.EVT_OBJECT, 1) + info.SetItem(progress) + wx.PostEvent(self.wxDialog, info) + + def perform_transfer(self): + self.start_time = time.time() + self.curl.perform() + self.curl.close() + wx.CallAfter(self.complete_transfer) + + def perform_threaded(self): + self.background_thread = threading.Thread(target=self.perform_transfer) + self.background_thread.daemon = True + self.background_thread.start() + + def complete_transfer(self): + if callable(self.completed_callback): + self.curl.close() + self.completed_callback() + +class Upload(Transfer): + + def __init__(self, field=None, filename=None, *args, **kwargs): + super(Upload, self).__init__(filename=filename, *args, **kwargs) + self.response = dict() + self.curl.setopt(self.curl.POST, 1) + if isinstance(filename, unicode): + local_filename = filename.encode(sys.getfilesystemencoding()) + else: + local_filename = filename + self.curl.setopt(self.curl.HTTPPOST, [(field, (self.curl.FORM_FILE, local_filename, self.curl.FORM_FILENAME, filename.encode("utf-8")))]) + self.curl.setopt(self.curl.HEADERFUNCTION, self.header_callback) + self.curl.setopt(self.curl.WRITEFUNCTION, self.body_callback) + + def header_callback(self, content): + self.response['header'] = content + + def body_callback(self, content): + self.response['body'] = content + + def get_url(self): + return json.loads(self.response['body'])['url'] + +class Download(Transfer): + + def __init__(self, follow_location=True, *args, **kwargs): + super(Download, self).__init__(*args, **kwargs) + self.download_file = open(self.filename, 'wb') + self.curl.setopt(self.curl.WRITEFUNCTION, self.download_file.write) + + def complete_transfer(self): + self.download_file.close() + super(DownloadDialog, self).complete_transfer() \ No newline at end of file diff --git a/src/extra/AudioUploader/transfer_dialogs.py b/src/extra/AudioUploader/transfer_dialogs.py new file mode 100644 index 00000000..46e48a40 --- /dev/null +++ b/src/extra/AudioUploader/transfer_dialogs.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +import wx +from mysc import event +from utils import * + +__all__ = ['TransferDialog', 'DownloadDialog', 'UploadDialog'] + +class TransferDialog(wx.Dialog): + + def __init__(self, filename, *args, **kwargs): + super(TransferDialog, self).__init__(*args, **kwargs) + self.pane = wx.Panel(self) + self.progress_bar = wx.Gauge(parent=self.pane) + fileBox = wx.BoxSizer(wx.HORIZONTAL) + fileLabel = wx.StaticText(self.pane, -1, _(u"File")) + self.file = wx.TextCtrl(self.pane, -1, value=filename, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(200, 100)) + self.file.SetFocus() + fileBox.Add(fileLabel) + fileBox.Add(self.file) + currentAmountBox = wx.BoxSizer(wx.HORIZONTAL) + current_amount_label = wx.StaticText(self.pane, -1, _(u"Transferred")) + self.current_amount = wx.TextCtrl(self.pane, -1, value='0', style=wx.TE_READONLY|wx.TE_MULTILINE) + currentAmountBox.Add(current_amount_label) + currentAmountBox.Add(self.current_amount) + totalSizeBox = wx.BoxSizer(wx.HORIZONTAL) + total_size_label = wx.StaticText(self.pane, -1, _(u"Total file size")) + self.total_size = wx.TextCtrl(self.pane, -1, value='0', style=wx.TE_READONLY|wx.TE_MULTILINE) + totalSizeBox.Add(total_size_label) + totalSizeBox.Add(self.total_size) + speedBox = wx.BoxSizer(wx.HORIZONTAL) + speedLabel = wx.StaticText(self.pane, -1, _(u"Transfer rate")) + self.speed = wx.TextCtrl(self.pane, -1, style=wx.TE_READONLY|wx.TE_MULTILINE, value="0 Kb/s") + speedBox.Add(speedLabel) + speedBox.Add(self.speed) + etaBox = wx.BoxSizer(wx.HORIZONTAL) + etaLabel = wx.StaticText(self.pane, -1, _(u"Time left")) + self.eta = wx.TextCtrl(self.pane, -1, style=wx.TE_READONLY|wx.TE_MULTILINE, value="Unknown", size=(200, 100)) + etaBox.Add(etaLabel) + etaBox.Add(self.eta) +# self.create_buttons() + sizer = wx.BoxSizer(wx.VERTICAL) + sizer.Add(fileBox) + sizer.Add(currentAmountBox) + sizer.Add(totalSizeBox) + sizer.Add(speedBox) + sizer.Add(etaBox) + sizer.Add(self.progress_bar) + self.pane.SetSizerAndFit(sizer) + self.Bind(event.MyEVT_OBJECT, self.update) + + def update(self, ev): + data = ev.GetItem() + wx.CallAfter(self.progress_bar.SetValue, data["percent"]) + wx.CallAfter(self.current_amount.SetValue, '%s (%d%%)' % (convert_bytes(data["current"]), data["percent"])) + wx.CallAfter(self.total_size.SetValue, convert_bytes(data["total"])) + wx.CallAfter(self.speed.SetValue, data["speed"]) + if data["eta"]: + wx.CallAfter(self.eta.SetValue, seconds_to_string(data["eta"])) + + def create_buttons(self): + self.cancel_button = wx.Button(parent=self.pane, id=wx.ID_CANCEL) + self.cancel_button.Bind(wx.EVT_BUTTON, self.on_cancel) + +class UploadDialog(TransferDialog): + + def __init__(self, filename=None, *args, **kwargs): + super(UploadDialog, self).__init__(filename=filename, *args, **kwargs) + +class DownloadDialog(TransferDialog): + + def __init__(self, *args, **kwargs): + super(Download, self).__init__(*args, **kwargs) \ No newline at end of file diff --git a/src/extra/AudioUploader/utils.py b/src/extra/AudioUploader/utils.py new file mode 100644 index 00000000..9a20ab26 --- /dev/null +++ b/src/extra/AudioUploader/utils.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +def convert_bytes(n): + K, M, G, T, P = 1 << 10, 1 << 20, 1 << 30, 1 << 40, 1 << 50 + if n >= P: + return '%.2fPb' % (float(n) / T) + elif n >= T: + return '%.2fTb' % (float(n) / T) + elif n >= G: + return '%.2fGb' % (float(n) / G) + elif n >= M: + return '%.2fMb' % (float(n) / M) + elif n >= K: + return '%.2fKb' % (float(n) / K) + else: + return '%d' % n + +def seconds_to_string(seconds, precision=0): + day = seconds // 86400 + hour = seconds // 3600 + min = (seconds // 60) % 60 + sec = seconds - (hour * 3600) - (min * 60) + sec_spec = "." + str(precision) + "f" + sec_string = sec.__format__(sec_spec) + string = "" + if day == 1: + string += _(u"%d day, ") % day + elif day >= 2: + string += _(u"%d days, ") % day + if (hour == 1): + string += _(u"%d hour, ") % hour + elif (hour >= 2): + string += _("%d hours, ") % hour + if (min == 1): + string += _(u"%d minute, ") % min + elif (min >= 2): + string += _(u"%d minutes, ") % min + if sec >= 0 and sec <= 2: + string += _(u"%s second") % sec_string + else: + string += _(u"%s seconds") % sec_string + return string \ No newline at end of file diff --git a/src/extra/SoundsTutorial/__init__.py b/src/extra/SoundsTutorial/__init__.py new file mode 100644 index 00000000..ea9d0162 --- /dev/null +++ b/src/extra/SoundsTutorial/__init__.py @@ -0,0 +1 @@ +import gui \ No newline at end of file diff --git a/src/extra/SoundsTutorial/gui.py b/src/extra/SoundsTutorial/gui.py new file mode 100644 index 00000000..ebb8c2eb --- /dev/null +++ b/src/extra/SoundsTutorial/gui.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +import wx +import config +import os +import paths +import sound + +class soundsTutorial(wx.Dialog): + def __init__(self): + self.actions = [ + _(u"The tweet may contain a playable audio"), + _(u"A timeline has been created"), + _(u"A timeline has been deleted"), + _(u"You've received a direct message"), + _(u"You've sent a direct message"), + _(u"A bug has happened"), + _(u"You've added a tweet to your favourites"), + _(u"Someone's favourites have been updated"), + _(u"There are no more tweets to read"), + _(u"A list has a new tweet"), + _(u"You can't add any more characters on the tweet"), + _(u"You've been mentioned "), + _(u"A new event has happened"), + _(u"TW Blue is ready "), + _(u"You've replied"), + _(u"You've retweeted"), + _(u"A search has been updated"), + _(u"There's a new tweet in the main buffer"), + _(u"You've sent a tweet"), + _(u"There's a new tweet in a timeline"), + _(u"You have a new follower"), + _(u"You've turned the volume up or down")] + self.files = os.listdir(paths.sound_path("default")) + super(soundsTutorial, self).__init__(None, -1) + if len(self.actions) > len(self.files): + wx.MessageDialog(None, _(u"It seems as though the currently used sound pack needs an update. %i fails are still be required to use this function. Make sure to obtain the needed lacking sounds or to contact with the sound pack developer.") % (len(self.actions) - len(self.files)), _(u"Error"), wx.ICON_ERROR).ShowModal() + self.Destroy() + self.SetTitle(_(u"Sounds tutorial")) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + label = wx.StaticText(panel, -1, _(u"Press enter to listen to the sound for the selected event")) + self.items = wx.ListBox(panel, 1, choices=self.actions, style=wx.LB_SINGLE) + self.items.SetSelection(0) + listBox = wx.BoxSizer(wx.HORIZONTAL) + listBox.Add(label) + listBox.Add(self.items) + play = wx.Button(panel, 1, (u"Play")) + play.SetDefault() + self.Bind(wx.EVT_BUTTON, self.onPlay, play) + close = wx.Button(panel, wx.ID_CANCEL) + btnBox = wx.BoxSizer(wx.HORIZONTAL) + btnBox.Add(play) + btnBox.Add(close) + sizer.Add(listBox) + sizer.Add(btnBox) + panel.SetSizer(sizer) + + def onPlay(self, ev): + sound.player.play(self.files[self.items.GetSelection()]) \ No newline at end of file diff --git a/src/extra/SpellChecker/__init__.py b/src/extra/SpellChecker/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/extra/SpellChecker/gui.py b/src/extra/SpellChecker/gui.py new file mode 100644 index 00000000..801559d5 --- /dev/null +++ b/src/extra/SpellChecker/gui.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx +import output +import config +import languageHandler +from enchant.checker import SpellChecker +from enchant.errors import DictNotFoundError + +class spellCheckerDialog(wx.Dialog): + def __init__(self, text, dictionary): + super(spellCheckerDialog, self).__init__(None, 1) + try: + if config.main["general"]["language"] == "system": self.checker = SpellChecker() + else: self.checker = SpellChecker(languageHandler.getLanguage()) + self.checker.set_text(text) + except DictNotFoundError: + wx.MessageDialog(None, _(u"A bug has happened. There are no dictionaries available for the selected language in TW Blue"), _(u"Error"), wx.ICON_ERROR).ShowModal() + self.Destroy() + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + word = wx.StaticText(panel, -1, _(u"Mis-spelled word")) + self.word = wx.TextCtrl(panel, -1) + wordBox = wx.BoxSizer(wx.HORIZONTAL) + wordBox.Add(word) + wordBox.Add(self.word) + context = wx.StaticText(panel, -1, _(u"Context")) + self.context = wx.TextCtrl(panel, -1) + contextBox = wx.BoxSizer(wx.HORIZONTAL) + contextBox.Add(context) + contextBox.Add(self.context) + suggest = wx.StaticText(panel, -1, _(u"Suggestions")) + self.suggestions = wx.ListBox(panel, -1, choices=[], style=wx.LB_SINGLE) + suggestionsBox = wx.BoxSizer(wx.HORIZONTAL) + suggestionsBox.Add(suggest) + suggestionsBox.Add(self.suggestions) + ignore = wx.Button(panel, -1, _(u"Ignore")) + self.Bind(wx.EVT_BUTTON, self.onIgnore, ignore) + ignoreAll = wx.Button(panel, -1, _(u"Ignore all")) + self.Bind(wx.EVT_BUTTON, self.onIgnoreAll, ignoreAll) + replace = wx.Button(panel, -1, _(u"Replace")) + self.Bind(wx.EVT_BUTTON, self.onReplace, replace) + replaceAll = wx.Button(panel, -1, _(u"Replace all")) + self.Bind(wx.EVT_BUTTON, self.onReplaceAll, replaceAll) + close = wx.Button(panel, wx.ID_CANCEL) + btnBox = wx.BoxSizer(wx.HORIZONTAL) + btnBox.Add(ignore) + btnBox.Add(ignoreAll) + btnBox.Add(replace) + btnBox.Add(replaceAll) + btnBox.Add(close) + sizer.Add(wordBox) + sizer.Add(contextBox) + sizer.Add(suggestionsBox) + sizer.Add(btnBox) + panel.SetSizerAndFit(sizer) + self.check() + + def check(self): + try: + self.checker.next() + textToSay = _(u"Mis-spelled word: %s") % (self.checker.word,) + context = u"... %s %s %s" % (self.checker.leading_context(10), self.checker.word, self.checker.trailing_context(10)) + self.SetTitle(textToSay) + output.speak(textToSay) + self.word.SetValue(self.checker.word) + self.context.ChangeValue(context) + self.suggestions.Set(self.checker.suggest()) + self.suggestions.SetFocus() + except StopIteration: + wx.MessageDialog(self, _(u"The spelling review has finished."), _("Finished"), style=wx.OK).ShowModal() + self.EndModal(wx.ID_OK) + except AttributeError: + pass + + def onIgnore(self, ev): + self.check() + + def onIgnoreAll(self, ev): + self.checker.ignore_always(word=self.checker.word) + self.check() + + def onReplace(self, ev): + self.checker.replace(self.suggestions.GetStringSelection()) + self.check() + + def onReplaceAll(self, ev): + self.checker.replace_always(self.suggestions.GetStringSelection()) + self.check() \ No newline at end of file diff --git a/src/extra/__init__.py b/src/extra/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/extra/translator/__init__.py b/src/extra/translator/__init__.py new file mode 100644 index 00000000..446fa201 --- /dev/null +++ b/src/extra/translator/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +from translator import * +import gui \ No newline at end of file diff --git a/src/extra/translator/gui.py b/src/extra/translator/gui.py new file mode 100644 index 00000000..655c2850 --- /dev/null +++ b/src/extra/translator/gui.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx +import translator + +class translateDialog(wx.Dialog): + def __init__(self): + wx.Dialog.__init__(self, None, -1, title=_(u"Translate message")) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + staticSource = wx.StaticText(panel, -1, _(u"Source language")) + self.source_lang = wx.ComboBox(panel, -1, choices=[x[1] for x in translator.available_languages()], style = wx.CB_READONLY) + self.source_lang.SetFocus() + staticDest = wx.StaticText(panel, -1, _(u"Target language")) + self.source_lang.SetSelection(0) + self.dest_lang = wx.ComboBox(panel, -1, choices=[x[1] for x in translator.available_languages()], style = wx.CB_READONLY) + listSizer = wx.BoxSizer(wx.HORIZONTAL) + listSizer.Add(staticSource) + listSizer.Add(self.source_lang) + listSizer.Add(staticDest) + listSizer.Add(self.dest_lang) + ok = wx.Button(panel, wx.ID_OK) + ok.SetDefault() + cancel = wx.Button(panel, wx.ID_CANCEL) + self.SetEscapeId(wx.ID_CANCEL) + + def onOk(self, ev): + self.EndModal(wx.ID_OK) diff --git a/src/extra/translator/translator.py b/src/extra/translator/translator.py new file mode 100644 index 00000000..8e8186d4 --- /dev/null +++ b/src/extra/translator/translator.py @@ -0,0 +1,151 @@ +# -*- coding: utf-8 -*- +import re +try: + import urllib2 as request + from urllib import quote +except: + from urllib import request + from urllib.parse import quote + +class Translator: + string_pattern = r"\"(([^\"\\]|\\.)*)\"" + match_string =re.compile( + r"\,?\[" + + string_pattern + r"\," + + string_pattern + r"\," + + string_pattern + r"\," + + string_pattern + +r"\]") + + def __init__(self): + self.from_lang = "" + self.to_lang = "" + + def translate(self, source): + json5 = self._get_json5_from_google(source) + return self._unescape(self._get_translation_from_json5(json5)) + + def _get_translation_from_json5(self, content): + result = "" + pos = 2 + while True: + m = self.match_string.match(content, pos) + if not m: + break + result += m.group(1) + pos = m.end() + return result + + def _get_json5_from_google(self, source): + escaped_source = quote(source, '') + headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19'} + req = request.Request( + url="http://translate.google.com/translate_a/t?client=t&ie=UTF-8&oe=UTF-8" + +"&sl=%s&tl=%s&text=%s" % (self.from_lang, self.to_lang, escaped_source) + , headers = headers) + r = request.urlopen(req) + return r.read().decode('utf-8') + + def _unescape(self, text): + return re.sub(r"\\.?", lambda x:eval('"%s"'%x.group(0)), text) + +languages = { + "af": _(u"Afrikaans"), + "sq": _(u"Albanian"), + "am": _(u"Amharic"), + "ar": _(u"Arabic"), + "hy": _(u"Armenian"), + "az": _(u"Azerbaijani"), + "eu": _(u"Basque"), + "be": _(u"Belarusian"), + "bn": _(u"Bengali"), + "bh": _(u"Bihari"), + "bg": _(u"Bulgarian"), + "my": _(u"Burmese"), + "ca": _(u"Catalan"), + "chr": _(u"Cherokee"), + "zh": _(u"Chinese"), + "zh-CN": _(u"Chinese_simplified"), + "zh-TW": _(u"Chinese_traditional"), + "hr": _(u"Croatian"), + "cs": _(u"Czech"), + "da": _(u"Danish"), + "dv": _(u"Dhivehi"), + "nl": _(u"Dutch"), + "en": _(u"English"), + "eo": _(u"Esperanto"), + "et": _(u"Estonian"), + "tl": _(u"Filipino"), + "fi": _(u"Finnish"), + "fr": _(u"French"), + "gl": _(u"Galician"), + "ka": _(u"Georgian"), + "de": _(u"German"), + "el": _(u"Greek"), + "gn": _(u"Guarani"), + "gu": _(u"Gujarati"), + "iw": _(u"Hebrew"), + "hi": _(u"Hindi"), + "hu": _(u"Hungarian"), + "is": _(u"Icelandic"), + "id": _(u"Indonesian"), + "iu": _(u"Inuktitut"), + "ga": _(u"Irish"), + "it": _(u"Italian"), + "ja": _(u"Japanese"), + "kn": _(u"Kannada"), + "kk": _(u"Kazakh"), + "km": _(u"Khmer"), + "ko": _(u"Korean"), + "ku": _(u"Kurdish"), + "ky": _(u"Kyrgyz"), + "lo": _(u"Laothian"), + "lv": _(u"Latvian"), + "lt": _(u"Lithuanian"), + "mk": _(u"Macedonian"), + "ms": _(u"Malay"), + "ml": _(u"Malayalam"), + "mt": _(u"Maltese"), + "mr": _(u"Marathi"), + "mn": _(u"Mongolian"), + "ne": _(u"Nepali"), + "no": _(u"Norwegian"), + "or": _(u"Oriya"), + "ps": _(u"Pashto"), + "fa": _(u"Persian"), + "pl": _(u"Polish"), + "pt-PT": _(u"Portuguese"), + "pa": _(u"Punjabi"), + "ro": _(u"Romanian"), + "ru": _(u"Russian"), + "sa": _(u"Sanskrit"), + "sr": _(u"Serbian"), + "sd": _(u"Sindhi"), + "si": _(u"Sinhalese"), + "sk": _(u"Slovak"), + "sl": _(u"Slovenian"), + "es": _(u"Spanish"), + "sw": _(u"Swahili"), + "sv": _(u"Swedish"), + "tg": _(u"Tajik"), + "ta": _(u"Tamil"), + "tl": _(u"Tagalog"), + "te": _(u"Telugu"), + "th": _(u"Thai"), + "bo": _(u"Tibetan"), + "tr": _(u"Turkish"), + "uk": _(u"Ukrainian"), + "ur": _(u"Urdu"), + "uz": _(u"Uzbek"), + "ug": _(u"Uighur"), + "vi": _(u"Vietnamese"), + "cy": _(u"Welsh"), + "yi": _(u"Yiddish") +} + +def available_languages(): + l = languages.keys() + d = languages.values() + l.insert(0, '') + d.insert(0, _(u"autodetect")) + return sorted(zip(l, d)) diff --git a/src/gettext_windows.py b/src/gettext_windows.py new file mode 100644 index 00000000..762d8180 --- /dev/null +++ b/src/gettext_windows.py @@ -0,0 +1,105 @@ +# Copyright (c) 2006, 2007, 2010 Alexander Belchenko +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +"""Helper for standard gettext.py on Windows. + +Module obtains user language code on Windows to use with standard +Python gettext.py library. + +The module provides 2 functions: setup_env and get_language. + +You may use setup_env before initializing gettext functions. + +Or you can use get_language to get the list of language codes suitable +to pass them to gettext.find or gettext.translation function. + +Usage example #1: + +import gettext, gettext_windows +gettext_windows.setup_env() +gettext.install('myapp') + +Usage example #2: + +import gettext, gettext_windows +lang = gettext_windows.get_language() +translation = gettext.translation('myapp', languages=lang) +_ = translation.gettext +""" + +import locale +import os +import sys + +OS_WINDOWS = (sys.platform == 'win32') + + +def setup_env_windows(system_lang=True): + """Check environment variables used by gettext + and setup LANG if there is none. + """ + if _get_lang_env_var() is not None: + return + lang = get_language_windows(system_lang) + if lang: + os.environ['LANGUAGE'] = ':'.join(lang) + +def get_language_windows(system_lang=True): + """Get language code based on current Windows settings. + @return: list of languages. + """ + try: + import ctypes + except ImportError: + return [locale.getdefaultlocale()[0]] + # get all locales using windows API + lcid_user = ctypes.windll.kernel32.GetUserDefaultLCID() + lcid_system = ctypes.windll.kernel32.GetSystemDefaultLCID() + if system_lang and lcid_user != lcid_system: + lcids = [lcid_user, lcid_system] + else: + lcids = [lcid_user] + return filter(None, [locale.windows_locale.get(i) for i in lcids]) or None + + +def setup_env_other(system_lang=True): + pass + +def get_language_other(system_lang=True): + lang = _get_lang_env_var() + if lang is not None: + return lang.split(':') + return None + + +def _get_lang_env_var(): + for i in ('LANGUAGE','LC_ALL','LC_MESSAGES','LANG'): + lang = os.environ.get(i) + if lang: + return lang + return None + + +if OS_WINDOWS: + setup_env = setup_env_windows + get_language = get_language_windows +else: + setup_env = setup_env_other + get_language = get_language_other diff --git a/src/gui/__init__.py b/src/gui/__init__.py new file mode 100644 index 00000000..c4cbd802 --- /dev/null +++ b/src/gui/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +import main, dialogs + diff --git a/src/gui/buffers/__init__.py b/src/gui/buffers/__init__.py new file mode 100644 index 00000000..15f935aa --- /dev/null +++ b/src/gui/buffers/__init__.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +from panels import accountPanel, emptyPanel +from base import * +from dm import * +from events import * +from favourites import * +from lists import * +from people import * +from tweet_searches import * +from user_searches import * \ No newline at end of file diff --git a/src/gui/buffers/base.py b/src/gui/buffers/base.py new file mode 100644 index 00000000..e21ab242 --- /dev/null +++ b/src/gui/buffers/base.py @@ -0,0 +1,364 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx +import gui.dialogs +import twitter +import webbrowser +import config +import sound +import url_shortener +import logging as original_logger +import output +import platform +import datetime +from twitter import prettydate +from multiplatform_widgets import widgets +from mysc import event +from mysc.thread_utils import call_threaded +from twython import TwythonError +log = original_logger.getLogger("buffers.base") + +class basePanel(wx.Panel): + + def bind_events(self): + self.Bind(event.MyEVT_OBJECT, self.update) + self.Bind(event.MyEVT_DELETED, self.Remove) + self.list.list.Bind(wx.EVT_CHAR_HOOK, self.interact) + if self.system == "Windows": + self.list.list.Bind(wx.EVT_LIST_ITEM_FOCUSED, self.onFocus) + else: + self.list.list.Bind(wx.EVT_LISTBOX, self.onFocus) + + def get_message(self, dialog=False): + if dialog == False: return " ".join(self.compose_function(self.db.settings[self.name_buffer][self.list.get_selected()], self.db)) + else: + list = self.compose_function(self.db.settings[self.name_buffer][self.list.get_selected()], self.db) + return " ".join(list[1:-2]) + + def create_list(self): + self.list = widgets.list(self, _(u"User"), _(u"Text"), _(u"Date"), _(u"Client"), style=wx.LC_REPORT|wx.LC_SINGLE_SEL|wx.LC_VRULES) + if self.system == "Windows": + self.list.set_windows_size(0, 30) + self.list.set_windows_size(1, 160) + self.list.set_windows_size(2, 55) + self.list.set_windows_size(3, 42) + self.list.set_size() + + def __init__(self, parent, window, name_buffer, function=None, argumento=None, sound="", timeline=False): + if timeline == False: + self.type = "buffer" + elif timeline == True: + self.type = "timeline" + self.db = window.db + self.twitter = window.twitter + self.name_buffer = name_buffer + self.function = function + self.argumento = argumento + self.sound = sound + self.parent = window + self.compose_function = twitter.compose.compose_tweet + self.system = platform.system() + wx.Panel.__init__(self, parent) + self.sizer = wx.BoxSizer(wx.VERTICAL) + self.create_list() + self.btn = wx.Button(self, -1, _(u"Tweet")) + self.btn.Bind(wx.EVT_BUTTON, self.post_status) + self.retweetBtn = wx.Button(self, -1, _(u"Retweet")) + self.retweetBtn.Bind(wx.EVT_BUTTON, self.onRetweet) + self.responseBtn = wx.Button(self, -1, _(u"Reply")) + self.responseBtn.Bind(wx.EVT_BUTTON, self.onResponse) + self.dmBtn = wx.Button(self, -1, _(u"Direct message")) + self.dmBtn.Bind(wx.EVT_BUTTON, self.onDm) + btnSizer = wx.BoxSizer(wx.HORIZONTAL) + btnSizer.Add(self.btn, 0, wx.ALL, 5) + btnSizer.Add(self.retweetBtn, 0, wx.ALL, 5) + btnSizer.Add(self.responseBtn, 0, wx.ALL, 5) + btnSizer.Add(self.dmBtn, 0, wx.ALL, 5) + self.sizer.Add(btnSizer, 0, wx.ALL, 5) + self.sizer.Add(self.list.list, 0, wx.ALL, 5) + self.bind_events() + self.SetSizer(self.sizer) + + def remove_buffer(self): + if self.type == "timeline": + dlg = wx.MessageDialog(self, _(u"Do you really want to delete this timeline?"), _(u"Attention"), style=wx.ICON_QUESTION|wx.YES_NO) + if dlg.ShowModal() == wx.ID_YES: + names = config.main["other_buffers"]["timelines"] + user = self.name_buffer + log.info(u"Deleting %s's timeline" % user) + if user in names: + names.remove(user) + self.db.settings.pop(user) + pos = self.db.settings["buffers"].index(user) + self.db.settings["buffers"].remove(user) + return pos + elif self.type == "buffer": + output.speak(_(u"This buffer is not a timeline; it can't be deleted.")) + return None + + def remove_invalid_buffer(self): + if self.type == "timeline": + names = config.main["other_buffers"]["timelines"] + user = self.name_buffer + log.info(u"Deleting %s's timeline" % user) + if user in names: + names.remove(user) + self.db.settings.pop(user) + pos = self.db.settings["buffers"].index(user) + self.db.settings["buffers"].remove(user) + return pos + + def Remove(self, ev): +# try: + self.list.remove_item(ev.GetItem()) +# except: +# log.error(u"Cannot delete the %s item from list " % str(ev.GetItem())) + + def destroy_status(self, ev): + index = self.list.get_selected() + try: + self.twitter.twitter.destroy_status(id=self.db.settings[self.name_buffer][index]["id"]) + self.db.settings[self.name_buffer].pop(index) + self.list.remove_item(index) + if index > 0: + self.list.select_item(index-1) + except: + sound.player.play("error.ogg") + + def onFocus(self, ev): + if self.db.settings[self.name_buffer][self.list.get_selected()].has_key("retweeted_status"): tweet = self.db.settings[self.name_buffer][self.list.get_selected()]["retweeted_status"] + else: tweet = self.db.settings[self.name_buffer][self.list.get_selected()] + if config.main["general"]["relative_times"] == True: + # On windows we need only put the new date on the column, but under linux and mac it isn't possible. + if self.system == "Windows": + original_date = datetime.datetime.strptime(tweet["created_at"], "%a %b %d %H:%M:%S +0000 %Y") + date = original_date-datetime.timedelta(seconds=-self.db.settings["utc_offset"]) + ts = prettydate(original_date) + self.list.list.SetStringItem(self.list.get_selected(), 2, ts) + else: + self.list.list.SetString(self.list.get_selected(), " ".join(self.compose_function(self.db.settings[self.name_buffer][self.list.get_selected()], self.db))) + if twitter.utils.is_audio(tweet): + sound.player.play("audio.ogg", False) + + def start_streams(self): + if self.name_buffer == "sent": + num = twitter.starting.start_sent(self.db, self.twitter, self.name_buffer, self.function, param=self.argumento) + else: +# try: + if self.argumento != None: + num = twitter.starting.start_stream(self.db, self.twitter, self.name_buffer, self.function, param=self.argumento) + else: + num = twitter.starting.start_stream(self.db, self.twitter, self.name_buffer, self.function) +# except TwythonError: +# raise TwythonError +# self.parent.delete_invalid_timeline() + if self.sound != "" and num > 0 and self.name_buffer != "home_timeline" and self.name_buffer != "sent": sound.player.play(self.sound) + return num + + def get_more_items(self): + if config.main["general"]["reverse_timelines"] == False: + last_id = self.db.settings[self.name_buffer][0]["id"] + else: + last_id = self.db.settings[self.name_buffer][-1]["id"] + try: + items = twitter.starting.get_more_items(self.function, self.twitter, count=config.main["general"]["max_tweets_per_call"], max_id=last_id) + except TwythonError as e: + output.speak(e.message) + for i in items: + if config.main["general"]["reverse_timelines"] == False: + self.db.settings[self.name_buffer].insert(0, i) + else: + self.db.settings[self.name_buffer].append(i) + if config.main["general"]["reverse_timelines"] == False: + for i in items: + tweet = self.compose_function(i, self.db) + self.list.insert_item(True, *tweet) + else: + for i in items: + tweet = self.compose_function(i, self.db) + self.list.insert_item(False, *tweet) + output.speak(_(u"%s items retrieved") % (len(items))) + + def put_items(self, num): + if self.list.get_count() == 0: + for i in self.db.settings[self.name_buffer]: + tweet = self.compose_function(i, self.db) + self.list.insert_item(False, *tweet) + self.set_list_position() + elif self.list.get_count() > 0: + if config.main["general"]["reverse_timelines"] == False: + for i in self.db.settings[self.name_buffer][:num]: + tweet = self.compose_function(i, self.db) + self.list.insert_item(False, *tweet) + else: + for i in self.db.settings[self.name_buffer][0:num]: + tweet = self.compose_function(i, self.db) + self.list.insert_item(True, *tweet) + + def onDm(self, ev): + if self.name_buffer == "sent": return + if self.name_buffer == "direct_messages": + self.onResponse(ev) + else: + user = self.db.settings[self.name_buffer][self.list.get_selected()]["user"]["screen_name"] + dlg = gui.dialogs.message.dm(_("Direct message to %s") % (user,), "", "", self) + if dlg.ShowModal() == wx.ID_OK: + call_threaded(self.twitter.api_call, call_name="send_direct_message", _sound="dm_sent.ogg", text=dlg.text.GetValue(), screen_name=dlg.cb.GetValue()) +# dlg.Destroy() + if ev != None: + self.list.list.SetFocus() + + def post_status(self, ev=None): + text = gui.dialogs.message.tweet(_(u"Write the tweet here"), _(u"Tweet"), "", self) + if text.ShowModal() == wx.ID_OK: + if text.image == None: + call_threaded(self.twitter.api_call, call_name="update_status", _sound="tweet_send.ogg", status=text.text.GetValue()) + else: + call_threaded(self.twitter.api_call, call_name="update_status_with_media", _sound="tweet_send.ogg", status=text.text.GetValue(), media=text.file) +# text.Destroy() + if ev != None: self.list.list.SetFocus() + + def onRetweet(self, ev): + if self.name_buffer != "direct_messages": + id=self.db.settings[self.name_buffer][self.list.get_selected()]["id"] + ask = wx.MessageDialog(self.parent, _(u"Would you like to add a comment to this tweet?"), _("Retweet"), wx.YES_NO|wx.CANCEL|wx.ICON_QUESTION) + response = ask.ShowModal() + if response == wx.ID_YES: + dlg = gui.dialogs.message.retweet(_(u"Add your comment to the tweet"), "", u"“@%s: %s ”" % (self.db.settings[self.name_buffer][self.list.get_selected()]["user"]["screen_name"], self.db.settings[self.name_buffer][self.list.get_selected()]["text"]), self) + if dlg.ShowModal() == wx.ID_OK: + if dlg.image == None: + call_threaded(self.twitter.api_call, call_name="update_status", _sound="retweet_send.ogg", status=dlg.text.GetValue(), in_reply_to_status_id=dlg.in_reply_to) + else: + call_threaded(self.twitter.call_api, call_name="update_status_with_media", _sound="retweet_send.ogg", status=dlg.text.GetValue(), in_reply_to_status_id=text.in_reply_to, media=dlg.file) +# dlg.Destroy() + if ev != None: + self.list.list.SetFocus() + elif response == wx.ID_NO: + call_threaded(self.twitter.api_call, call_name="retweet", _sound="retweet_send.ogg", id=id) + if ev != None: self.list.list.SetFocus() + ask.Destroy() + + def onResponse(self, ev): + if self.name_buffer == "sent": return + dlg = gui.dialogs.message.reply(_(u"Reply to %s") % (self.db.settings[self.name_buffer][self.list.get_selected()]["user"]["screen_name"]), "", u"@%s " % (self.db.settings[self.name_buffer][self.list.get_selected()]["user"]["screen_name"]), self) + if dlg.ShowModal() == wx.ID_OK: + if dlg.image == None: + call_threaded(self.twitter.api_call, call_name="update_status", _sound="reply_send.ogg", in_reply_to_status_id=dlg.in_reply_to, status=dlg.text.GetValue()) + else: + call_threaded(self.twitter.api_call, call_name="update_status_with_media", _sound="reply_send.ogg", in_reply_to_status_id=dlg.in_reply_to, status=dlg.text.GetValue(), media=dlg.file) +# dlg.Destroy() + if ev != None: self.list.list.SetFocus() + + def update(self, ev): + data = ev.GetItem() + announce = ev.GetAnnounce() + if config.main["general"]["reverse_timelines"] == False: self.db.settings[self.name_buffer].append(data) + else: self.db.settings[self.name_buffer].insert(0, data) + tweet = self.compose_function(data, self.db) + self.list.insert_item(config.main["general"]["reverse_timelines"], *tweet) + if self.name_buffer not in config.main["other_buffers"]["muted_buffers"]: + if self.sound != "": sound.player.play(self.sound) + if announce != "": output.speak(announce) + if self.name_buffer in config.main["other_buffers"]["autoread_buffers"]: + output.speak(" ".join(tweet[:2])) + + def interact(self, ev): + try: + if self.db.settings[self.name_buffer][self.list.get_selected()].has_key("retweeted_status"): tweet = self.db.settings[self.name_buffer][self.list.get_selected()]["retweeted_status"] + else: tweet = self.db.settings[self.name_buffer][self.list.get_selected()] + urls = twitter.utils.find_urls_in_text(tweet["text"]) + except: + urls = [] + if type(ev) is str: event = ev + else: + if ev.GetKeyCode() == wx.WXK_RETURN and ev.ControlDown(): event = "audio" + elif ev.GetKeyCode() == wx.WXK_RETURN: event = "url" + elif ev.GetKeyCode() == wx.WXK_F5: event = "volume_down" + elif ev.GetKeyCode() == wx.WXK_F6: event = "volume_up" + elif ev.GetKeyCode() == wx.WXK_DELETE and ev.ShiftDown(): event = "clear_list" + elif ev.GetKeyCode() == wx.WXK_DELETE: event = "delete_item" + else: + ev.Skip() + return + if event == "audio" and len(urls) > 0: + self.streamer(urls[0]) + elif event == "url": + if len(urls) == 0: return + elif len(urls) == 1: + output.speak(_(u"Opening URL..."), True) + webbrowser.open(urls[0]) + elif len(urls) > 1: + gui.dialogs.urlList.urlList(urls).ShowModal() + elif event == "volume_down": + if config.main["sound"]["volume"] > 0.05: + config.main["sound"]["volume"] = config.main["sound"]["volume"]-0.05 + sound.player.play("volume_changed.ogg", False) + if hasattr(self.parent, "audioStream"): + self.parent.audioStream.stream.volume = config.main["sound"]["volume"] + elif event == "volume_up": + if config.main["sound"]["volume"] < 0.95: + config.main["sound"]["volume"] = config.main["sound"]["volume"]+0.05 + sound.player.play("volume_changed.ogg", False) + if hasattr(self.parent, "audioStream"): + self.parent.audioStream.stream.volume = config.main["sound"]["volume"] + elif event == "clear_list" and self.list.get_count() > 0: + dlg = wx.MessageDialog(self, _(u"Do you really want to empty this buffer? It's tweets will be removed from the list but not from Twitter"), _(u"Empty buffer"), wx.ICON_QUESTION|wx.YES_NO) + if dlg.ShowModal() == wx.ID_YES: + self.db.settings[self.name_buffer] = [] + self.list.clear() + elif event == "delete_item": + dlg = wx.MessageDialog(self, _(u"Do you really want to delete this message?"), _(u"Delete"), wx.ICON_QUESTION|wx.YES_NO) + if dlg.ShowModal() == wx.ID_YES: + self.destroy_status(wx.EVT_MENU) + else: + return + try: + ev.Skip() + except: + pass + + def streamer(self, url): + if hasattr(self.parent, "audioStream"): + if self.parent.audioStream.stream.is_active() == 0: + output.speak(_(u"Playing...")) + self.parent.audioStream = sound.urlStream(url) + try: + self.parent.audioStream.prepare() + self.parent.audioStream.play() + except: + del self.parent.audioStream + output.speak(_(u"Unable to play audio.")) + else: + output.speak(_(u"Audio stopped.")) + self.parent.audioStream.stream.stop() + else: + output.speak(_(u"Playing...")) + self.parent.audioStream = sound.urlStream(url) + try: + self.parent.audioStream.prepare() + self.parent.audioStream.play() + except: + output.speak(_(u"Unable to play audio.")) + del self.parent.audioStream + + def set_list_position(self): + if config.main["general"]["reverse_timelines"] == False: + self.list.select_item(len(self.db.settings[self.name_buffer])-1) + else: + self.list.select_item(0) diff --git a/src/gui/buffers/dm.py b/src/gui/buffers/dm.py new file mode 100644 index 00000000..162fa1eb --- /dev/null +++ b/src/gui/buffers/dm.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx +import sound +import gui.dialogs +import logging as original_logger +from base import basePanel +from mysc.thread_utils import call_threaded +log = original_logger.getLogger("buffers.base") + +class dmPanel(basePanel): + def __init__(self, parent, window, name_buffer, function, argumento=None, sound=""): + """ Class to DM'S. Reply and retweet buttons are not showed and they have your delete method for dm's.""" + super(dmPanel, self).__init__(parent, window, name_buffer, function, argumento=argumento, sound=sound) + self.retweetBtn.Disable() + self.responseBtn.Disable() + + def destroy_status(self, ev): + index = self.list.get_selected() + try: + self.twitter.twitter.destroy_direct_message(id=self.db.settings[self.name_buffer][index]["id"]) + self.db.settings[self.name_buffer].pop(index) + self.remove_item(index) + except: + sound.player.play("error.ogg") + + def onResponse(self, ev): + dlg = gui.dialogs.message.dm(_("Direct message to %s") % (self.db.settings[self.name_buffer][self.list.get_selected()]["sender"]["screen_name"]), "", "", self) + if dlg.ShowModal() == wx.ID_OK: + call_threaded(self.twitter.api_call, call_name="send_direct_message", _sound="dm_sent.ogg", text=dlg.text.GetValue(), screen_name=dlg.cb.GetValue()) + if ev != None: + self.list.list.SetFocus() \ No newline at end of file diff --git a/src/gui/buffers/events.py b/src/gui/buffers/events.py new file mode 100644 index 00000000..0b67d697 --- /dev/null +++ b/src/gui/buffers/events.py @@ -0,0 +1,134 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx +import sound +import config +import platform +import gui.dialogs +import output +import logging as original_logger +from multiplatform_widgets import widgets +from mysc import event +from mysc.thread_utils import call_threaded +log = original_logger.getLogger("buffers.base") + +class eventsPanel(wx.Panel): + """ Buffer to show events. Different than tweets or people.""" + + def get_more_items(self): + output.speak(_(u"This action is not supported for this buffer")) + + def bind_events(self): + self.Bind(event.MyEVT_OBJECT, self.update) + + def put_items(self, items): + pass + + def get_selected_text(self): + if self.list.get_count() == 0: return _(u"Empty") + if self.system == "Windows": + return "%s. %s" % (self.list.list.GetItemText(self.list.get_selected()), self.list.list.GetItemText(self.list.get_selected(), 1)) + else: + return self.list.list.GetStringSelection() + + def get_message(self, dialog=False): + return self.get_selected_text() + + def __init__(self, parent, window, sound=""): + self.type = "event" + self.system = platform.system() + self.name_buffer = "events" + self.parent = window + self.sound = "new_event.ogg" + wx.Panel.__init__(self, parent) + sizer = wx.BoxSizer() + self.list = widgets.list(self, _(u"Date"), _(u"Event"), size=(600,600), style=wx.LC_REPORT|wx.LC_SINGLE_SEL|wx.LC_VRULES) + self.tweet = wx.Button(self, -1, _(u"Tweet")) + self.tweet.Bind(wx.EVT_BUTTON, self.post_status) + self.delete_event = wx.Button(self, -1, _(u"Remove event")) + self.delete_event.Bind(wx.EVT_BUTTON, self.on_delete_event) + self.bind_events() + + def on_delete_event(self, ev): + self.list.remove_item(self.get_selected()) + + def remove_buffer(self): + return None + + def start_streams(self): + return 0 + + def post_status(self, ev=None): + text = gui.dialogs.message.tweet(_(u"Write the tweet here"), _(u"Tweet"), "", self.parent) + if text.ShowModal() == wx.ID_OK: + if text.image == None: + call_threaded(self.parent.twitter.api_call, call_name="update_status", _sound="tweet_send.ogg", status=text.text.GetValue()) + else: + call_threaded(self.parent.twitter.api_call, call_name="update_status_with_media", _sound="tweet_send.ogg", status=text.text.GetValue(), media=text.file) +# text.Destroy() + if ev != None: self.list.list.SetFocus() + + def update(self, ev): + tweet = ev.GetItem() + announce = ev.GetAnnounce() + self.list.insert_item(config.main["general"]["reverse_timelines"], *tweet) + if self.list.get_count() == 1: + self.list.select_item(0) + if self.name_buffer not in config.main["other_buffers"]["muted_buffers"]: + if self.sound != "": sound.player.play(self.sound) +# if announce != "": output.speak(announce) + if self.name_buffer in config.main["other_buffers"]["autoread_buffers"]: + output.speak(" ".join(tweet)) + + def interact(self, ev): + if type(ev) is str: event = ev + else: + if ev.GetKeyCode() == wx.WXK_F5: event = "volume_down" + elif ev.GetKeyCode() == wx.WXK_F6: event = "volume_up" + elif ev.GetKeyCode() == wx.WXK_DELETE and ev.ShiftDown(): event = "clear_list" + elif ev.GetKeyCode() == wx.WXK_DELETE: event = "delete_item" + else: + ev.Skip() + return + if event == "volume_down": + if config.main["sound"]["volume"] > 0.05: + config.main["sound"]["volume"] = config.main["sound"]["volume"]-0.05 + sound.player.play("volume_changed.ogg", False) + if hasattr(self.parent, "audioStream"): + self.parent.audioStream.stream.volume = config.main["sound"]["volume"] + elif event == "volume_up": + if config.main["sound"]["volume"] < 0.95: + config.main["sound"]["volume"] = config.main["sound"]["volume"]+0.05 + sound.player.play("volume_changed.ogg", False) + if hasattr(self.parent, "audioStream"): + self.parent.audioStream.stream.volume = config.main["sound"]["volume"] + elif event == "clear_list" and self.get_count() > 0: + dlg = wx.MessageDialog(self, _(u"Do you really want to empty this buffer? It's tweets will be removed from the list but not from Twitter"), _(u"Empty buffer"), wx.ICON_QUESTION|wx.YES_NO) + if dlg.ShowModal() == wx.ID_YES: + self.list.clear() + elif event == "delete_item": + dlg = wx.MessageDialog(self, _(u"Do you really want to delete this message?"), _(u"Delete"), wx.ICON_QUESTION|wx.YES_NO) + if dlg.ShowModal() == wx.ID_YES: + self.list.remove_item(self.list.get_selected()) + else: + return + try: + ev.Skip() + except: + pass \ No newline at end of file diff --git a/src/gui/buffers/favourites.py b/src/gui/buffers/favourites.py new file mode 100644 index 00000000..e9dea0fd --- /dev/null +++ b/src/gui/buffers/favourites.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx +import twitter +import config +import sound +import logging as original_logger +from base import basePanel +log = original_logger.getLogger("buffers.base") + +class favsPanel(basePanel): + def __init__(self, parent, window, name_buffer, argumento=None, sound=""): + super(favsPanel, self).__init__(parent, window, name_buffer, function="", argumento=argumento, sound=sound) + self.type = "favourites_timeline" + + def start_streams(self): + num = twitter.starting.get_favourites_timeline(self.db, self.twitter, self.name_buffer, param=self.argumento, count=200) + if self.sound != "" and num > 0: + sound.player.play(self.sound) + if self.list.get_count() > 0: self.put_items(num) + return num + return num + + def remove_buffer(self): + dlg = wx.MessageDialog(self, _(u"Do you really want to delete this favourites timeline?"), _(u"Attention"), style=wx.ICON_QUESTION|wx.YES_NO) + if dlg.ShowModal() == wx.ID_YES: + names = config.main["other_buffers"]["favourites_timelines"] + user = self.argumento + log.info(u"Deleting %s's timeline" % user) + if user in names: + names.remove(user) + self.db.settings.pop(self.name_buffer) + pos = self.db.settings["buffers"].index(self.name_buffer) + self.db.settings["buffers"].remove(self.name_buffer) + return pos + + def remove_invalid_buffer(self): + names = config.main["other_buffers"]["favourites_timelines"] + user = self.name_buffer[:-5] + log.info(u"Deleting %s's timeline" % user) + if user in names: + names.remove(user) + self.db.settings.pop(self.name_buffer) + pos = self.db.settings["buffers"].index(self.name_buffer) + self.db.settings["buffers"].remove(self.name_buffer) + return pos \ No newline at end of file diff --git a/src/gui/buffers/lists.py b/src/gui/buffers/lists.py new file mode 100644 index 00000000..1440391f --- /dev/null +++ b/src/gui/buffers/lists.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx +import sound +import config +import twitter +import gui.dialogs +import logging as original_logger +from base import basePanel +from mysc.thread_utils import call_threaded +log = original_logger.getLogger("buffers.base") + +class listPanel(basePanel): + def __init__(self, parent, window, name_buffer, argumento="", sound=""): + super(listPanel, self).__init__(parent, window, name_buffer, argumento=argumento, sound=sound) + self.type = "list" + self.users = [] + self.sound = "list_tweet.ogg" + + def start_streams(self): + self.retrieve_ids() + num = twitter.starting.start_list(self.db, self.twitter, self.name_buffer, list_id=self.argumento) + return num + + def retrieve_ids(self): + self.users = twitter.starting.get_users_list(self.twitter, self.argumento) + + def remove_buffer(self): + if self.type == "list": + dlg = wx.MessageDialog(self, _(u"Do you really want to delete this list?"), _(u"Attention"), style=wx.ICON_QUESTION|wx.YES_NO) + if dlg.ShowModal() == wx.ID_YES: + names = config.main["other_buffers"]["lists"] + user = self.name_buffer[:-5] + log.info(u"Deleting %s's list" % user) + if user in names: + names.remove(user) + self.db.settings.pop(self.name_buffer) + pos = self.db.settings["buffers"].index(self.name_buffer) + self.db.settings["buffers"].remove(self.name_buffer) + return pos + + def remove_invalid_buffer(self): + if self.type == "list": + names = config.main["other_buffers"]["lists"] + user = self.name_buffer[:-5] + log.info(u"Deleting %s's list" % user) + if user in names: + names.remove(user) + self.db.settings.pop(self.name_buffer) + pos = self.db.settings["buffers"].index(self.name_buffer) + self.db.settings["buffers"].remove(self.name_buffer) + return pos \ No newline at end of file diff --git a/src/gui/buffers/panels.py b/src/gui/buffers/panels.py new file mode 100644 index 00000000..f5002612 --- /dev/null +++ b/src/gui/buffers/panels.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx +from multiplatform_widgets import widgets + +class accountPanel(wx.Panel): + def __init__(self, parent): + super(accountPanel, self).__init__(parent=parent) + self.type = "account" + sizer = wx.BoxSizer(wx.VERTICAL) + self.list = widgets.list(self, _(u"Announce")) + sizer.Add(self.list.list, 0, wx.ALL, 5) + self.SetSizer(sizer) + +class emptyPanel(accountPanel): + def __init__(self, parent): + super(emptyPanel, self).__init__(parent=parent) + self.type = "empty" + + def get_more_items(self): + output.speak(_(u"This action is not supported for this buffer")) \ No newline at end of file diff --git a/src/gui/buffers/people.py b/src/gui/buffers/people.py new file mode 100644 index 00000000..6e044447 --- /dev/null +++ b/src/gui/buffers/people.py @@ -0,0 +1,142 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx +import sound +import config +import twitter +import gui.dialogs +import logging as original_logger +import output +from multiplatform_widgets import widgets +from mysc import event +from base import basePanel +from mysc.thread_utils import call_threaded +from twython import TwythonError +log = original_logger.getLogger("buffers.base") + +class peoplePanel(basePanel): + """ Buffer used to show people.""" + def bind_events(self): + self.Bind(event.MyEVT_OBJECT, self.update) + self.Bind(event.MyEVT_DELETED, self.Remove) + self.list.list.Bind(wx.EVT_CHAR_HOOK, self.interact) + + def create_list(self): + self.list = widgets.list(self, _(u"User"), style=wx.LC_REPORT|wx.LC_SINGLE_SEL, size=(800, 800)) + + def __init__(self, parent, window, name_buffer, function, argumento=None, sound="", timeline=False): + self.type = "people" + super(peoplePanel, self).__init__(parent, window, name_buffer, function, argumento=argumento, sound=sound) + self.responseBtn.SetLabel(_(u"Mention")) + self.retweetBtn.Disable() + self.compose_function = twitter.compose.compose_followers_list + + def onDm(self, ev): + if self.name_buffer == "sent": return + if self.name_buffer == "direct_messages": + self.onResponse(ev) + else: + user = self.db.settings[self.name_buffer][self.list.get_selected()]["screen_name"] + dlg = gui.dialogs.message.dm(_("Direct message to %s") % (user,), "", "", self) + if dlg.ShowModal() == wx.ID_OK: + call_threaded(self.twitter.api_call, call_name="send_direct_message", _sound="dm_sent.ogg", text=dlg.text.GetValue(), screen_name=dlg.cb.GetValue()) +# dlg.Destroy() + if ev != None: + self.list.list.SetFocus() + + def onResponse(self, ev): + dlg = gui.dialogs.message.reply(_(u"Reply to %s") % (self.db.settings[self.name_buffer][self.list.get_selected()]["screen_name"]), "", u"@%s " % (self.db.settings[self.name_buffer][self.list.get_selected()]["screen_name"]), self) + if dlg.ShowModal() == wx.ID_OK: + if dlg.image == None: + call_threaded(self.twitter.api_call, call_name="update_status", _sound="reply_send.ogg", in_reply_to_status_id=dlg.in_reply_to, status=dlg.text.GetValue()) + else: + call_threaded(self.twitter.api_call, call_name="update_status_with_media", _sound="reply_send.ogg", in_reply_to_status_id=dlg.in_reply_to, status=dlg.text.GetValue(), media=dlg.file) +# dlg.Destroy() + if ev != None: self.list.list.SetFocus() + + def Remove(self, ev): + try: + index = self.list.get_selected() + self.list.remove_item(ev.GetItem()) + except: + log.error("Unable to delete element %s from the list %s" % (str(ev.GetItem(), self.name_buffer))) + + def start_streams(self): + num = twitter.starting.start_followers(self.db, self.twitter, self.name_buffer, self.function, param=self.argumento) +# sound.player.play(self.sound) + return num + + def put_items(self, num): + if self.list.get_count() > 0: + self.list.clear() + for i in self.db.settings[self.name_buffer]: + f = self.compose_function(i, self.db) + self.list.insert_item(False, *f) + self.set_list_position() + + def get_more_items(self): + if self.name_buffer == "followers": cursor = twitter.starting.followers_cursor + elif self.name_buffer == "friends": cursor = twitter.starting.friends_cursor + try: + items = twitter.starting.get_more_items(self.function, self.twitter, users=True, name=self.name_buffer, count=config.main["general"]["max_tweets_per_call"], cursor=cursor) + except TwythonError as e: + output.speak(e.message) + return + for i in items: + if config.main["general"]["reverse_timelines"] == False: + self.db.settings[self.name_buffer].insert(0, i) + else: + self.db.settings[self.name_buffer].append(i) + if config.main["general"]["reverse_timelines"] == False: + for i in items: + tweet = self.compose_function(i, self.db) + self.list.insert_item(True, *tweet) + else: + for i in items: + tweet = self.compose_function(i, self.db) + self.list.insert_item(False, *tweet) + output.speak(_(u"%s items retrieved") % (len(items))) + + def interact(self, ev): + if type(ev) is str: event = ev + else: + if ev.GetKeyCode() == wx.WXK_RETURN: + event = "url" + elif ev.GetKeyCode() == wx.WXK_F5: + event = "volume_down" + elif ev.GetKeyCode() == wx.WXK_F6: + event = "volume_down" + else: + ev.Skip() + return + if event == "url": + gui.dialogs.show_user.showUserProfile(self.parent.twitter, self.db.settings[self.name_buffer][self.list.get_selected()]["screen_name"]).ShowModal() + elif event == "volume_down": + if config.main["sound"]["volume"] > 0.05: + config.main["sound"]["volume"] = config.main["sound"]["volume"]-0.05 + sound.player.play("volume_changed.ogg") + elif event == "volume_up": + if config.main["sound"]["volume"] < 0.95: + config.main["sound"]["volume"] = config.main["sound"]["volume"]+0.05 + sound.player.play("volume_changed.ogg") + if type(ev) is not str: ev.Skip() + + def remove_buffer(self): + pos = None + return pos diff --git a/src/gui/buffers/trends.py b/src/gui/buffers/trends.py new file mode 100644 index 00000000..1b04de9d --- /dev/null +++ b/src/gui/buffers/trends.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx +import sound +import config +import twitter +import gui.dialogs +import logging as original_logger +from base import basePanel +log = original_logger.getLogger("buffers.base") + +class trendPanel(basePanel): + def __init__(self, parent, window, name_buffer, *args, **kwargs): + super(searchPanel, self).__init__(parent, window, name_buffer, sound) + self.type = "trend" + self.args = kwargs + + def start_streams(self): + num = twitter.starting.search(self.db, self.twitter, self.name_buffer, **self.args) + if num > 0: sound.player.play("search_updated.ogg") + self.put_items(num) + return num + + def remove_buffer(self): + dlg = wx.MessageDialog(self, _(u"Do you really want to delete this search term?"), _(u"Attention"), style=wx.ICON_QUESTION|wx.YES_NO) + if dlg.ShowModal() == wx.ID_YES: + names = config.main["other_buffers"]["tweet_searches"] + user = self.name_buffer[:-7] + log.info(u"Deleting %s's search term" % user) + if user in names: + names.remove(user) + self.db.settings.pop(self.name_buffer) + pos = self.db.settings["buffers"].index(self.name_buffer) + self.db.settings["buffers"].remove(self.name_buffer) + return pos \ No newline at end of file diff --git a/src/gui/buffers/tweet_searches.py b/src/gui/buffers/tweet_searches.py new file mode 100644 index 00000000..b82cc5c9 --- /dev/null +++ b/src/gui/buffers/tweet_searches.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx +import sound +import config +import twitter +import gui.dialogs +import output +import logging as original_logger +from base import basePanel +log = original_logger.getLogger("buffers.base") + +class searchPanel(basePanel): + def __init__(self, parent, window, name_buffer, *args, **kwargs): + super(searchPanel, self).__init__(parent, window, name_buffer, sound) + self.type = "search" + self.args = kwargs + + def load_search(self): + num = self.start_streams() + self.put_items(num) + + def start_streams(self): + num = twitter.starting.search(self.db, self.twitter, self.name_buffer, **self.args) + if num > 0: sound.player.play("search_updated.ogg") + return num + + def remove_buffer(self): + dlg = wx.MessageDialog(self, _(u"Do you really want to delete this search term?"), _(u"Attention"), style=wx.ICON_QUESTION|wx.YES_NO) + if dlg.ShowModal() == wx.ID_YES: + names = config.main["other_buffers"]["tweet_searches"] + user = self.name_buffer[:-7] + log.info(u"Deleting %s's search term" % user) + if user in names: + names.remove(user) + self.db.settings.pop(self.name_buffer) + pos = self.db.settings["buffers"].index(self.name_buffer) + self.db.settings["buffers"].remove(self.name_buffer) + return pos + + def get_more_items(self): + output.speak(_(u"This action is not supported for this buffer")) \ No newline at end of file diff --git a/src/gui/buffers/user_searches.py b/src/gui/buffers/user_searches.py new file mode 100644 index 00000000..1ce972e6 --- /dev/null +++ b/src/gui/buffers/user_searches.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx +import twitter +import logging as original_logger +import sound +from people import peoplePanel +from mysc import event +from multiplatform_widgets import widgets +log = original_logger.getLogger("buffers.base") + +class searchUsersPanel(peoplePanel): + def create_list(self): + """ Returns the list for put the tweets here.""" + self.list = widgets.list(self, _(u"User"), style=wx.LC_REPORT|wx.LC_SINGLE_SEL, size=(800, 800)) + +# def bind_events(self): +# self.Bind(event.MyEVT_OBJECT, self.update) +# self.list.list.Bind(wx.EVT_CHAR_HOOK, self.interact) + + def __init__(self, parent, window, name_buffer, *args, **kwargs): + super(searchUsersPanel, self).__init__(parent, window, name_buffer, function=None) + self.compose_function = twitter.compose.compose_followers_list + self.create_list() + self.args = args + self.kwargs = kwargs + self.type = "timeline" + + def start_streams(self): + num = twitter.starting.search_users(self.db, self.twitter, self.name_buffer, **self.kwargs) + if num > 0: sound.player.play("search_updated.ogg") +# self.put_items(num) + return num + + def load_search(self): + num = self.start_streams() + self.put_items(num) + + def remove_buffer(self): + dlg = wx.MessageDialog(self, _(u"Do you really want to delete this search term?"), _(u"Attention"), style=wx.ICON_QUESTION|wx.YES_NO) + if dlg.ShowModal() == wx.ID_YES: + self.db.settings.pop(self.name_buffer) + pos = self.db.settings["buffers"].index(self.name_buffer) + self.db.settings["buffers"].remove(self.name_buffer) + return pos \ No newline at end of file diff --git a/src/gui/dialogs/__init__.py b/src/gui/dialogs/__init__.py new file mode 100644 index 00000000..a888a3a1 --- /dev/null +++ b/src/gui/dialogs/__init__.py @@ -0,0 +1 @@ +import message, urlList, follow, utils, show_user, update_profile, configuration, lists, search \ No newline at end of file diff --git a/src/gui/dialogs/configuration.py b/src/gui/dialogs/configuration.py new file mode 100644 index 00000000..212a647f --- /dev/null +++ b/src/gui/dialogs/configuration.py @@ -0,0 +1,420 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx +import config +#import gui +from gui import buffers +import sound as snd +import sound_lib +import languageHandler +import logging as original_logger +import os +import webbrowser +import paths +import platform +from mysc import restart +log = original_logger.getLogger("configuration") + +system = platform.system() +class general(wx.Panel): + def __init__(self, parent): + wx.Panel.__init__(self, parent) + sizer = wx.BoxSizer(wx.VERTICAL) + language = wx.StaticText(self, -1, _(u"Language")) + self.langs = languageHandler.getAvailableLanguages() + langs = [] + [langs.append(i[1]) for i in self.langs] + self.codes = [] + [self.codes.append(i[0]) for i in self.langs] + self.language = wx.ListBox(self, -1, choices=langs) + id = self.codes.index(config.main["general"]["language"]) + self.language.SetSelection(id) + self.language.SetSize(self.language.GetBestSize()) + langBox = wx.BoxSizer(wx.HORIZONTAL) + langBox.Add(language, 0, wx.ALL, 5) + langBox.Add(self.language, 0, wx.ALL, 5) + sizer.Add(langBox, 0, wx.ALL, 5) + self.relative_time = wx.CheckBox(self, -1, _(U"Relative times")) + self.relative_time.SetValue(config.main["general"]["relative_times"]) + sizer.Add(self.relative_time, 0, wx.ALL, 5) + if platform.system() == "Windows": + self.disable_sapi5 = wx.CheckBox(self, -1, _(u"Activate Sapi5 when any other screen reader is not being run")) + self.disable_sapi5.SetValue(config.main["general"]["voice_enabled"]) + sizer.Add(self.disable_sapi5, 0, wx.ALL, 5) + self.show_gui = wx.CheckBox(self, -1, _(u"Activate the auto-start of the invisible interface")) + self.show_gui.SetValue(config.main["general"]["hide_gui"]) + sizer.Add(self.show_gui, 0, wx.ALL, 5) + apiCallsBox = wx.BoxSizer(wx.HORIZONTAL) + apiCallsBox.Add(wx.StaticText(self, -1, _(u"API calls when the stream is started (One API call equals to 200 tweetts, two API calls equals 400 tweets, etc):")), 0, wx.ALL, 5) + self.apiCalls = wx.SpinCtrl(self, -1) + self.apiCalls.SetRange(1, 10) + self.apiCalls.SetValue(config.main["general"]["max_api_calls"]) + self.apiCalls.SetSize(self.apiCalls.GetBestSize()) + apiCallsBox.Add(self.apiCalls, 0, wx.ALL, 5) + sizer.Add(apiCallsBox, 0, wx.ALL, 5) + tweetsPerCallBox = wx.BoxSizer(wx.HORIZONTAL) + tweetsPerCallBox.Add(wx.StaticText(self, -1, _(u"Items on each API call")), 0, wx.ALL, 5) + self.itemsPerApiCall = wx.SpinCtrl(self, -1) + self.itemsPerApiCall.SetRange(0, 200) + self.itemsPerApiCall.SetValue(config.main["general"]["max_tweets_per_call"]) + self.itemsPerApiCall.SetSize(self.itemsPerApiCall.GetBestSize()) + tweetsPerCallBox.Add(self.itemsPerApiCall, 0, wx.ALL, 5) + sizer.Add(tweetsPerCallBox, 0, wx.ALL, 5) + self.reverse_timelines = wx.CheckBox(self, -1, _(u"Inverted buffers: The newest tweets will be shown at the beginning of the lists while the oldest at the end")) + self.reverse_timelines.SetValue(config.main["general"]["reverse_timelines"]) + sizer.Add(self.reverse_timelines, 0, wx.ALL, 5) + self.SetSizer(sizer) + +class other_buffers(wx.Panel): + def __init__(self, parent): + wx.Panel.__init__(self, parent) + sizer = wx.BoxSizer(wx.VERTICAL) + self.followers_value = config.main["other_buffers"]["show_followers"] + self.friends_value = config.main["other_buffers"]["show_friends"] + self.favs_value = config.main["other_buffers"]["show_favourites"] + self.events_value = config.main["other_buffers"]["show_events"] + self.blocks_value = config.main["other_buffers"]["show_blocks"] + self.mutes_value = config.main["other_buffers"]["show_muted_users"] + self.followers = wx.CheckBox(self, -1, _(u"Show followers")) + self.followers.SetValue(config.main["other_buffers"]["show_followers"]) + sizer.Add(self.followers, 0, wx.ALL, 5) + self.friends = wx.CheckBox(self, -1, _(u"Show friends")) + self.friends.SetValue(config.main["other_buffers"]["show_friends"]) + sizer.Add(self.friends, 0, wx.ALL, 5) + self.favs = wx.CheckBox(self, -1, _(u"Show favourites")) + self.favs.SetValue(config.main["other_buffers"]["show_favourites"]) + sizer.Add(self.favs, 0, wx.ALL, 5) + self.blocks = wx.CheckBox(self, -1, _(u"Show blocked users")) + self.blocks.SetValue(config.main["other_buffers"]["show_blocks"]) + sizer.Add(self.blocks, 0, wx.ALL, 5) + self.mutes = wx.CheckBox(self, -1, _(u"Show muted users")) + self.mutes.SetValue(config.main["other_buffers"]["show_muted_users"]) + sizer.Add(self.mutes, 0, wx.ALL, 5) + self.events = wx.CheckBox(self, -1, _(u"Show events")) + self.events.SetValue(config.main["other_buffers"]["show_events"]) + sizer.Add(self.events, 0, wx.ALL, 5) + self.SetSizer(sizer) + +class ignoredClients(wx.Panel): + def __init__(self, parent): + super(ignoredClients, self).__init__(parent=parent) + sizer = wx.BoxSizer(wx.VERTICAL) + choices = config.main["twitter"]["ignored_clients"] + label = wx.StaticText(self, -1, _(u"Ignored clients")) + self.clients = wx.ListBox(self, -1, choices=choices) + self.clients.SetSize(self.clients.GetBestSize()) + clientsBox = wx.BoxSizer(wx.HORIZONTAL) + clientsBox.Add(label, 0, wx.ALL, 5) + clientsBox.Add(self.clients, 0, wx.ALL, 5) + add = wx.Button(self, -1, _(u"Add client")) + remove = wx.Button(self, -1, _(u"Remove client")) + self.Bind(wx.EVT_BUTTON, self.add, add) + self.Bind(wx.EVT_BUTTON, self.remove, remove) + btnBox = wx.BoxSizer(wx.HORIZONTAL) + btnBox.Add(add, 0, wx.ALL, 5) + btnBox.Add(remove, 0, wx.ALL, 5) + sizer.Add(clientsBox, 0, wx.ALL, 5) + sizer.Add(btnBox, 0, wx.ALL, 5) + self.SetSizer(sizer) + + def add(self, ev): + entry = wx.TextEntryDialog(self, _(u"Enter the name of the client here"), _(u"Add a new ignored client")) + if entry.ShowModal() == wx.ID_OK: + client = entry.GetValue() + if client not in config.main["twitter"]["ignored_clients"]: + config.main["twitter"]["ignored_clients"].append(client) + self.clients.Append(client) + + def remove(self, ev): + if self.clients.GetCount() == 0: return + id = self.clients.GetSelection() + config.main["twitter"]["ignored_clients"].pop(id) + self.clients.Delete(id) + +class sound(wx.Panel): + def __init__(self, parent): + wx.Panel.__init__(self, parent) + sizer = wx.BoxSizer(wx.VERTICAL) + volume = wx.StaticText(self, -1, _(u"Volume")) + self.volumeCtrl = wx.Slider(self) + self.volumeCtrl.SetRange(0, 100) + self.volumeCtrl.SetValue(config.main["sound"]["volume"]*100) + self.volumeCtrl.SetSize(self.volumeCtrl.GetBestSize()) + volumeBox = wx.BoxSizer(wx.HORIZONTAL) + volumeBox.Add(volume, 0, wx.ALL, 5) + volumeBox.Add(self.volumeCtrl, 0, wx.ALL, 5) + sizer.Add(volumeBox, 0, wx.ALL, 5) + self.global_mute = wx.CheckBox(self, -1, _(u"Global mute")) + self.global_mute.SetValue(config.main["sound"]["global_mute"]) + sizer.Add(self.global_mute, 0, wx.ALL, 5) + self.output_devices = sound_lib.output.Output.get_device_names() + output_label = wx.StaticText(self, -1, _(u"Output device")) + self.output = wx.ComboBox(self, -1, choices=self.output_devices, style=wx.CB_READONLY) + self.output.SetValue(config.main["sound"]["output_device"]) + self.output.SetSize(self.output.GetBestSize()) + outputBox = wx.BoxSizer(wx.HORIZONTAL) + outputBox.Add(output_label, 0, wx.ALL, 5) + outputBox.Add(self.output, 0, wx.ALL, 5) + sizer.Add(outputBox, 0, wx.ALL, 5) + self.input_devices = sound_lib.input.Input.get_device_names() + input_label = wx.StaticText(self, -1, _(u"Input device")) + self.input = wx.ComboBox(self, -1, choices=self.input_devices, style=wx.CB_READONLY) + self.input.SetValue(config.main["sound"]["input_device"]) + self.input.SetSize(self.input.GetBestSize()) + inputBox = wx.BoxSizer(wx.HORIZONTAL) + inputBox.Add(input_label, 0, wx.ALL, 5) + inputBox.Add(self.input, 0, wx.ALL, 5) + sizer.Add(inputBox, 0, wx.ALL, 5) + soundBox = wx.BoxSizer(wx.VERTICAL) + self.soundpacks = [] + [self.soundpacks.append(i) for i in os.listdir(paths.sound_path()) if os.path.isdir(paths.sound_path(i)) == True ] + soundpack_label = wx.StaticText(self, -1, _(u"Sound pack")) + self.soundpack = wx.ComboBox(self, -1, choices=self.soundpacks, style=wx.CB_READONLY) + self.soundpack.SetValue(config.main["sound"]["current_soundpack"]) + self.soundpack.SetSize(self.soundpack.GetBestSize()) + soundBox.Add(soundpack_label, 0, wx.ALL, 5) + soundBox.Add(self.soundpack, 0, wx.ALL, 5) + sizer.Add(soundBox, 0, wx.ALL, 5) + self.SetSizer(sizer) + +class audioServicesPanel(wx.Panel): + def __init__(self, parent): + super(audioServicesPanel, self).__init__(parent) + mainSizer = wx.BoxSizer(wx.VERTICAL) + apiKeyLabel = wx.StaticText(self, -1, _(u"If you've got a SndUp account, enter your API Key here. Whether the API Key is wrong, the App will fail to upload anything to the server. Whether there's no API Key here, then the audio files will be uploaded anonimously")) + self.apiKey = wx.TextCtrl(self, -1) + self.apiKey.SetValue(config.main["sound"]["sndup_api_key"]) + dc = wx.WindowDC(self.apiKey) + dc.SetFont(self.apiKey.GetFont()) + self.apiKey.SetSize(dc.GetTextExtent("0"*100)) + apiKeyBox = wx.BoxSizer(wx.HORIZONTAL) + apiKeyBox.Add(apiKeyLabel, 0, wx.ALL, 5) + apiKeyBox.Add(self.apiKey, 0, wx.ALL, 5) + mainSizer.Add(apiKeyBox, 0, wx.ALL, 5) + first_sizer = wx.BoxSizer(wx.HORIZONTAL) + self.dropbox = wx.Button(self, -1) + if len(config.main["services"]["dropbox_token"]) > 0: + self.dropbox.SetLabel(_(u"Unlink your Dropbox account")) + else: + self.dropbox.SetLabel(_(u"Link your Dropbox account")) + self.dropbox.Bind(wx.EVT_BUTTON, self.onLink_unlink) + first_sizer.Add(self.dropbox, 0, wx.ALL, 5) + mainSizer.Add(first_sizer, 0, wx.ALL, 5) + self.SetSizer(mainSizer) + + def setup_dropbox(self): + from extra.AudioUploader import dropbox_transfer + auth = dropbox_transfer.dropboxLogin() + url = auth.get_url() + wx.MessageDialog(self, _(u"The authorisation request will be shown on your browser. Copy the code tat Dropbox will provide and, in the text box that will appear on TW Blue, paste it. This code is necessary to continue. You only need to do it once."), _(u"Authorisation"), wx.OK).ShowModal() + webbrowser.open(url) + dlg = wx.TextEntryDialog(self, _(u"Enter the code here."), _(u"Verification code")) + if dlg.ShowModal() == wx.ID_CANCEL: + return False + resp = dlg.GetValue() + if resp == "": + self.dropbox.SetLabel(_(u"Link your Dropbox account")) + return False + else: + try: + auth.authorise(resp) + self.dropbox.SetLabel(_(u"Unlink your Dropbox account")) + except: + wx.MessageDialog(self, _(u"Error during authorisation. Try again later."), _(u"Error!"), wx.ICON_ERROR).ShowModal() + self.dropbox.SetLabel(_(u"Link your Dropbox account")) + return False + + def onLink_unlink(self, ev): + if self.dropbox.GetLabel() == _(u"Link your Dropbox account"): + self.setup_dropbox() + else: + self.disconnect_dropbox() + + def disconnect_dropbox(self): + config.main["services"]["dropbox_token"] = "" + self.dropbox.SetLabel(_(u"Link your Dropbox account")) + +class configurationDialog(wx.Dialog): + def __init__(self, parent): + self.parent = parent + wx.Dialog.__init__(self, None, -1) + panel = wx.Panel(self) + self.SetTitle(_(u"TW Blue preferences")) + sizer = wx.BoxSizer(wx.VERTICAL) + notebook = wx.Notebook(panel) + self.general = general(notebook) + notebook.AddPage(self.general, _(u"General")) + self.general.SetFocus() + self.buffers = other_buffers(notebook) + notebook.AddPage(self.buffers, _(u"Show other buffers")) + self.ignored_clients = ignoredClients(notebook) + notebook.AddPage(self.ignored_clients, _(u"Ignored clients")) + self.sound = sound(notebook) + notebook.AddPage(self.sound, _(u"Sound")) + self.services = audioServicesPanel(notebook) + notebook.AddPage(self.services, _(u"Audio Services")) + sizer.Add(notebook, 0, wx.ALL, 5) + ok_cancel_box = wx.BoxSizer(wx.HORIZONTAL) + ok = wx.Button(panel, wx.ID_OK, _(u"Save")) + ok.Bind(wx.EVT_BUTTON, self.onSave) + ok.SetDefault() + cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Close")) + self.SetEscapeId(cancel.GetId()) + ok_cancel_box.Add(ok, 0, wx.ALL, 5) + ok_cancel_box.Add(cancel, 0, wx.ALL, 5) + sizer.Add(ok_cancel_box, 0, wx.ALL, 5) + panel.SetSizer(sizer) + self.SetClientSize(sizer.CalcMin()) + + def check_followers_change(self): + if self.buffers.followers.GetValue() != self.buffers.followers_value: + if self.buffers.followers.GetValue() == True: + log.debug("Creating followers list...") + followers = buffers.peoplePanel(self.parent.nb, self.parent, "followers", self.parent.twitter.twitter.get_followers_list, argumento=self.parent.db.settings["user_name"]) + self.parent.nb.InsertSubPage(self.parent.db.settings["buffers"].index(self.parent.db.settings["user_name"]), followers, _(u"Followers")) + num = followers.start_streams() + followers.put_items(num) + self.parent.db.settings["buffers"].append("followers") + elif self.buffers.followers.GetValue() == False: + self.parent.nb.DeletePage(self.parent.db.settings["buffers"].index("followers")) + self.parent.db.settings.pop("followers") + self.parent.db.settings["buffers"].remove("followers") + + def check_friends_change(self): + if self.buffers.friends.GetValue() != self.buffers.friends_value: + if self.buffers.friends.GetValue() == True: + log.debug("Creating friends list...") + friends = buffers.peoplePanel(self.parent.nb, self.parent, "friends", self.parent.twitter.twitter.get_friends_list, argumento=self.parent.db.settings["user_name"]) + self.parent.nb.InsertSubPage(self.parent.db.settings["buffers"].index(self.parent.db.settings["user_name"]), friends, _(u"friends")) + num = friends.start_streams() + friends.put_items(num) + self.parent.db.settings["buffers"].append("friends") + elif self.buffers.friends.GetValue() == False: + self.parent.nb.DeletePage(self.parent.db.settings["buffers"].index("friends")) + self.parent.db.settings.pop("friends") + self.parent.db.settings["buffers"].remove("friends") + + def check_favs_change(self): + if self.buffers.favs.GetValue() != self.buffers.favs_value: + if self.buffers.favs.GetValue() == True: + log.debug("Creating favorites...") + favs = buffers.basePanel(self.parent.nb, self.parent, "favs", self.parent.twitter.twitter.get_favorites) + self.parent.nb.InsertSubPage(self.parent.db.settings["buffers"].index(self.parent.db.settings["user_name"]), favs, _(u"Favorites")) + num = favs.start_streams() + favs.put_items(num) + self.parent.db.settings["buffers"].append("favs") + elif self.buffers.favs.GetValue() == False: + self.parent.nb.DeletePage(self.parent.db.settings["buffers"].index("favs")) + self.parent.db.settings.pop("favs") + self.parent.db.settings["buffers"].remove("favs") + + def check_events_change(self): + if self.buffers.events.GetValue() != self.buffers.events_value: + if self.buffers.events.GetValue() == True: + log.debug("Creating events...") + events = buffers.eventsPanel(self.parent.nb, self.parent) + self.parent.nb.InsertSubPage(self.parent.db.settings["buffers"].index(self.parent.db.settings["user_name"]), events, _(u"Events")) + self.parent.db.settings["buffers"].append("events") + elif self.buffers.events.GetValue() == False: + self.parent.nb.DeletePage(self.parent.db.settings["buffers"].index("events")) + self.parent.db.settings["buffers"].remove("events") + + def check_blocks_change(self): + if self.buffers.blocks.GetValue() != self.buffers.blocks_value: + if self.buffers.blocks.GetValue() == True: + log.debug("Creating blocked users list...") + blocks = buffers.peoplePanel(self.parent.nb, self.parent, "blocks", self.parent.twitter.twitter.list_blocks) + self.parent.nb.InsertSubPage(self.parent.db.settings["buffers"].index(self.parent.db.settings["user_name"]), blocks, _(u"Blocked users")) + num = blocks.start_streams() + blocks.put_items(num) + self.parent.db.settings["buffers"].append("blocks") + elif self.buffers.blocks.GetValue() == False: + self.parent.nb.DeletePage(self.parent.db.settings["buffers"].index("blocks")) + self.parent.db.settings.pop("blocks") + self.parent.db.settings["buffers"].remove("blocks") + + def check_mutes_change(self): + if self.buffers.mutes.GetValue() != self.buffers.mutes_value: + if self.buffers.mutes.GetValue() == True: + log.debug("Creating muted users list...") + mutes = buffers.peoplePanel(self.parent.nb, self.parent, "muteds", self.parent.twitter.twitter.get_muted_users_list) + self.parent.nb.InsertSubPage(self.parent.db.settings["buffers"].index(self.parent.db.settings["user_name"]), mutes, _(u"Muted users")) + num = mutes.start_streams() + mutes.put_items(num) + self.parent.db.settings["buffers"].append("muteds") + elif self.buffers.mutes.GetValue() == False: + self.parent.nb.DeletePage(self.parent.db.settings["buffers"].index("muteds")) + self.parent.db.settings.pop("muteds") + self.parent.db.settings["buffers"].remove("muteds") + + def onSave(self, ev): + need_restart = False + # Check general settings + if config.main["general"]["language"] != self.general.langs[self.general.language.GetSelection()][0]: + if self.general.langs[self.general.language.GetSelection()][0] in self.general.codes: config.main["general"]["language"] = self.general.langs[self.general.language.GetSelection()][0] + languageHandler.setLanguage(config.main["general"]["language"]) + need_restart = True + if platform.system() == "Windows": + config.main["general"]["voice_enabled"] = self.general.disable_sapi5.GetValue() + config.main["general"]["hide_gui"] = self.general.show_gui.GetValue() + config.main["general"]["max_api_calls"] = self.general.apiCalls.GetValue() + config.main["general"]["max_tweets_per_call"] = self.general.itemsPerApiCall.GetValue() + if config.main["general"]["relative_times"] != self.general.relative_time.GetValue(): + config.main["general"]["relative_times"] = self.general.relative_time.GetValue() + need_restart = True + if config.main["general"]["reverse_timelines"] != self.general.reverse_timelines.GetValue(): + config.main["general"]["reverse_timelines"] = self.general.reverse_timelines.GetValue() + need_restart = True + + ## Check buffers settings + config.main["other_buffers"]["show_followers"] = self.buffers.followers.GetValue() + self.check_followers_change() + config.main["other_buffers"]["show_friends"] = self.buffers.friends.GetValue() + self.check_friends_change() + config.main["other_buffers"]["show_favourites"] = self.buffers.favs.GetValue() + self.check_favs_change() + config.main["other_buffers"]["show_events"] = self.buffers.events.GetValue() + self.check_events_change() + config.main["other_buffers"]["show_blocks"] = self.buffers.blocks.GetValue() + self.check_blocks_change() + config.main["other_buffers"]["show_muted_users"] = self.buffers.mutes.GetValue() + self.check_mutes_change() + + ## Check sound settings + config.main["sound"]["volume"] = self.sound.volumeCtrl.GetValue()/100.0 + config.main["sound"]["global_mute"] = self.sound.global_mute.GetValue() + if system == "Windows": + config.main["sound"]["output_device"] = self.sound.output.GetStringSelection() + config.main["sound"]["input_device"] = self.sound.input.GetValue() + try: + snd.player.input.set_device(snd.player.input.find_device_by_name(config.main["sound"]["input_device"])) + snd.player.output.set_device(snd.player.output.find_device_by_name(config.main["sound"]["output_device"])) + except: + config.main["sound"]["output_device"] = "Default" + config.main["sound"]["input_device"] = "Default" + config.main["sound"]["sndup_api_key"] = self.services.apiKey.GetValue() + config.main["sound"]["current_soundpack"] = self.sound.soundpack.GetStringSelection() + snd.player.check_soundpack() + if need_restart == True: + config.main.write() + wx.MessageDialog(None, _(u"The application requires to be restarted to save these changes. Press OK to do it now."), _("Restart TW Blue"), wx.OK).ShowModal() + restart.restart_program() + + config.main.write() + self.EndModal(wx.ID_OK) diff --git a/src/gui/dialogs/follow.py b/src/gui/dialogs/follow.py new file mode 100644 index 00000000..e5f2a9a6 --- /dev/null +++ b/src/gui/dialogs/follow.py @@ -0,0 +1,151 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx +import config +from mysc import event +import twitter +from twitter import utils +from twython import TwythonError +import output + +class follow(wx.Dialog): + def __init__(self, parent, default="follow"): + self.parent = parent + wx.Dialog.__init__(self, None, -1) + panel = wx.Panel(self) + userSizer = wx.BoxSizer() + self.SetTitle(_(u"Action")) + if self.parent.name_buffer == "followers" or self.parent.name_buffer == "friends": + list = [self.parent.db.settings[self.parent.name_buffer][self.parent.list.get_selected()]["screen_name"]] + else: + try: list =twitter.utils.get_all_users(self.parent.db.settings[self.parent.name_buffer][self.parent.list.get_selected()], self.parent.db) + except KeyError: list = [self.parent.db.settings[self.parent.name_buffer][self.parent.list.get_selected()]["screen_name"]] + self.cb = wx.ComboBox(panel, -1, choices=list, value=list[0]) + self.cb.SetFocus() + userSizer.Add(self.cb) + actionSizer = wx.BoxSizer(wx.VERTICAL) + label2 = wx.StaticText(panel, -1, _(u"Action")) + self.follow = wx.RadioButton(panel, -1, _(u"Follow"), style=wx.RB_GROUP) + self.unfollow = wx.RadioButton(panel, -1, _(u"Unfollow")) + self.mute = wx.RadioButton(panel, -1, _(u"Mute")) + self.unmute = wx.RadioButton(panel, -1, _(u"Unmute")) + self.block = wx.RadioButton(panel, -1, _(u"Block")) + self.unblock = wx.RadioButton(panel, -1, _(u"Unblock")) + self.reportSpam = wx.RadioButton(panel, -1, _(u"Report as spam")) + self.setup_default(default) + actionSizer.Add(label2) + actionSizer.Add(self.follow) + actionSizer.Add(self.unfollow) + actionSizer.Add(self.mute) + actionSizer.Add(self.unmute) + actionSizer.Add(self.block) + actionSizer.Add(self.unblock) + actionSizer.Add(self.reportSpam) + sizer = wx.BoxSizer(wx.VERTICAL) + ok = wx.Button(panel, wx.ID_OK, _(u"OK")) + ok.Bind(wx.EVT_BUTTON, self.onok) + ok.SetDefault() + cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Close")) + btnsizer = wx.BoxSizer() + btnsizer.Add(ok) + btnsizer.Add(cancel) + sizer.Add(userSizer) + sizer.Add(actionSizer) + sizer.Add(btnsizer) + panel.SetSizer(sizer) + self.Bind(wx.EVT_CHAR_HOOK, self.onEscape, self.cb) + + def onEscape(self, ev): + if ev.GetKeyCode() == wx.WXK_RETURN: + self.onok(wx.EVT_BUTTON) + ev.Skip() + + def onok(self, ev): + if self.follow.GetValue() == True: + try: + self.parent.twitter.twitter.create_friendship(screen_name=self.cb.GetValue()) + self.Destroy() + except TwythonError as err: + output.speak("Error %s: %s" % (err.error_code, err.msg), True) + elif self.unfollow.GetValue() == True: + try: + id = self.parent.twitter.twitter.destroy_friendship(screen_name=self.cb.GetValue()) + self.Destroy() + except TwythonError as err: + output.speak("Error %s: %s" % (err.error_code, err.msg), True) + elif self.mute.GetValue() == True: + try: + id = self.parent.twitter.twitter.create_mute(screen_name=self.cb.GetValue()) + if config.main["other_buffers"]["show_muted_users"] == True: + tweet_event = event.event(event.EVT_OBJECT, 1) + tweet_event.SetItem(id) + wx.PostEvent(self.parent.parent.nb.GetPage(self.parent.db.settings["buffers"].index("muteds")), tweet_event) + self.parent.db.settings["muted_users"].append(id["id"]) + self.Destroy() + output.speak(_(u"You've muted to %s") % (id["screen_name"])) + except TwythonError as err: + output.speak("Error %s: %s" % (err.error_code, err.msg), True) + elif self.unmute.GetValue() == True: + try: + id = self.parent.twitter.twitter.destroy_mute(screen_name=self.cb.GetValue()) + if config.main["other_buffers"]["show_muted_users"] == True: + item = utils.find_item(id, self.parent.db.settings["muteds"]) + if item > 0: + deleted_event = event.event(event.EVT_DELETED, 1) + deleted_event.SetItem(item) + wx.PostEvent(self.parent.parent.nb.GetPage(self.parent.db.settings["buffers"].index("muteds")), deleted_event) + if id["id"] in self.parent.db.settings["muted_users"]: self.parent.db.settings["muted_users"].remove(id["id"]) + self.Destroy() + output.speak(_(u"You've unmuted to %s") % (id["screen_name"])) + except TwythonError as err: + output.speak("Error %s: %s" % (err.error_code, err.msg), True) + elif self.reportSpam.GetValue() == True: + try: + self.parent.twitter.twitter.report_spam(screen_name=self.cb.GetValue()) + self.Destroy() + except TwythonError as err: + output.speak("Error %s: %s" % (err.error_code, err.msg), True) + elif self.block.GetValue() == True: + try: + self.parent.twitter.twitter.create_block(screen_name=self.cb.GetValue()) + self.Destroy() + except TwythonError as err: + output.speak("Error %s: %s" % (err.error_code, err.msg), True) + elif self.unblock.GetValue() == True: + try: + self.parent.twitter.twitter.destroy_block(screen_name=self.cb.GetValue()) + self.Destroy() + except TwythonError as err: + output.speak("Error %s: %s" % (err.error_code, err.msg), True) + + def setup_default(self, default): + if default == "follow": + self.follow.SetValue(True) + elif default == "unfollow": + self.unfollow.SetValue(True) + elif default == "mute": + self.mute.SetValue(True) + elif default == "unmute": + self.unmute.SetValue(True) + elif default == "report": + self.reportSpam.SetValue(True) + elif default == "block": + self.block.SetValue(True) + elif default == "unblock": + self.unblock.SetValue(True) \ No newline at end of file diff --git a/src/gui/dialogs/lists.py b/src/gui/dialogs/lists.py new file mode 100644 index 00000000..0b3e3e94 --- /dev/null +++ b/src/gui/dialogs/lists.py @@ -0,0 +1,244 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx +import platform +import output +import config +import gui +from multiplatform_widgets import widgets +from twython import TwythonError +from twitter import compose, utils + +class listViewer(wx.Dialog): + + def __init__(self, parent): + self.twitter = parent.twitter + self.db = parent.db + self.nb = parent.nb + self.parent = parent + wx.Dialog.__init__(self, None) + self.SetTitle(_(u"Lists manager")) + panel = wx.Panel(self) + label = wx.StaticText(panel, -1, _(u"Lists")) + self.lista = widgets.list(panel, _(u"List"), _(u"Description"), _(u"Owner"), _(u"Members"), _(u"mode"), size=(800, 800), style=wx.LC_REPORT|wx.LC_SINGLE_SEL) + self.lista.list.SetFocus() + sizer = wx.BoxSizer(wx.VERTICAL) + sizer.Add(label) + sizer.Add(self.lista.list) + self.createBtn = wx.Button(panel, wx.NewId(), _(u"Create a new list")) + self.createBtn.Bind(wx.EVT_BUTTON, self.onGo) + self.editBtn = wx.Button(panel, -1, _(u"Edit")) + self.Bind(wx.EVT_BUTTON, self.onEdit, self.editBtn) + self.deleteBtn = wx.Button(panel, -1, _(u"Remove")) + self.Bind(wx.EVT_BUTTON, self.onDelete, self.deleteBtn) + self.view = wx.Button(panel, -1, _(u"Open in buffer")) + self.Bind(wx.EVT_BUTTON, self.onView, self.view) +# self.members = wx.Button(panel, -1, _(u"View members")) +# self.members.Disable() +# self.subscriptors = wx.Button(panel, -1, _(u"View subscribers")) +# self.subscriptors.Disable() +# self.get_linkBtn = wx.Button(panel, -1, _(u"Get link for the list")) +# self.get_linkBtn.Bind(wx.EVT_BUTTON, self.onGetLink) + self.cancelBtn = wx.Button(panel, wx.ID_CANCEL) + btnSizer = wx.BoxSizer() + btnSizer.Add(self.createBtn) + btnSizer.Add(self.editBtn) + btnSizer.Add(self.cancelBtn) + panel.SetSizer(sizer) + self.populate_list() + self.lista.select_item(0) + + def onGo(self, ev): + ev.Skip() + dlg = createListDialog() + if dlg.ShowModal() == wx.ID_OK: + name = dlg.name.GetValue() + description = dlg.description.GetValue() + if dlg.public.GetValue() == True: mode = "public" + else: mode = "private" + try: + new_list = self.twitter.twitter.create_list(name=name, description=description, mode=mode) + self.db.settings["lists"].append(new_list) + self.lista.insert_item(False, *compose.compose_list(new_list)) + except TwythonError as e: + output.speak("error %s: %s" % (e.status_code, e.msg)) + else: + return + dlg.Destroy() + + def onEdit(self, ev): + ev.Skip() + if self.lista.get_count() == 0: return + list = self.db.settings["lists"][self.lista.get_selected()] + dlg = editListDialog(list) + if dlg.ShowModal() == wx.ID_OK: + name = dlg.name.GetValue() + description = dlg.description.GetValue() + if dlg.public.GetValue() == True: mode = "public" + else: mode = "private" + try: + self.twitter.twitter.update_list(list_id=self.lists[self.get_selected()]["id"], name=name, description=description, mode=mode) + except TwythonError as e: + output.speak("error %s: %s" % (e.error_code, e.msg)) + else: + return + dlg.Destroy() + + def onDelete(self, ev): + ev.Skip() + if self.lista.get_count() == 0: return + list = self.db.settings["lists"][self.lista.get_selected()]["id"] + dlg = wx.MessageDialog(self, _("Do you really want to delete this list?"), _("Delete"), wx.YES_NO) + if dlg.ShowModal() == wx.ID_YES: + try: + self.twitter.twitter.delete_list(list_id=list) + self.db.settings["lists"].pop(self.lista.get_selected()) + self.remove_item(self.lista.get_selected()) + except TwythonError as e: + output.speak("error %s: %s" % (e.error_code, e.msg)) + dlg.Destroy() + + def onView(self, ev): + ev.Skip() + if self.lista.get_count() == 0: return + list_id = self.db.settings["lists"][self.lista.get_selected()]["id"] + list_updated = self.twitter.twitter.get_specific_list(list_id=list_id) + self.db.settings["lists"][self.lista.get_selected()] = list_updated + if list_updated["slug"] not in config.main["other_buffers"]["lists"]: + config.main["other_buffers"]["lists"].append(list_updated["slug"]) + output.speak(_(u"List opened")) + else: + output.speak(_(u"This list is arready opened.")) + return + listUI = gui.buffers.lists.listPanel(self.nb, self.parent, list_updated["slug"]+"-list", argumento=utils.find_list(list_updated["slug"], self.db.settings["lists"])) + self.nb.AddPage(listUI, _(u"List for %s") % (list_updated["slug"],)) + self.db.settings["buffers"].append(list_updated["slug"]+"-list") + num = listUI.start_streams() + listUI.put_items(num) + listUI.sound = "tweet_timeline.wav" + self.parent.stream2.disconnect() + del self.parent.stream2 + self.parent.get_tls() + + def populate_list(self): + for i in self.db.settings["lists"]: + item = compose.compose_list(i) + self.lista.insert_item(False, *item) + +class userListViewer(listViewer): + def __init__(self, parent, username): + self.username = username + super(userListViewer, self).__init__(parent) + self.SetTitle(_(u"Viewing lists for %s") % (self.username)) + self.createBtn.SetLabel(_(u"Subscribe")) + self.deleteBtn.SetLabel(_(u"Unsubscribe")) + self.editBtn.Disable() + self.view.Disable() + + def populate_list(self): + self.lists = self.twitter.twitter.show_owned_lists(screen_name=self.username, count=200)["lists"] + for i in self.lists: + item = compose.compose_list(i) + self.lista.insert_item(False, *item) + + def onGo(self, ev): + list_id = self.lists[self.lista.get_selected()]["id"] + try: + list = self.twitter.twitter.subscribe_to_list(list_id=list_id) + item = utils.find_item(list["id"], self.db.settings["lists"]) + self.db.settings["lists"].append(list) + except TwythonError as e: + output.speak("error %s: %s" % (e.status_code, e.msg)) + +class createListDialog(wx.Dialog): + + def __init__(self): + wx.Dialog.__init__(self, None, size=(450, 400)) + self.SetTitle(_(u"Create a new list")) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + name = wx.StaticText(panel, -1, _(u"Name (20 characters maximun)")) + self.name = wx.TextCtrl(panel, -1) + nameSizer = wx.BoxSizer(wx.HORIZONTAL) + nameSizer.Add(name) + nameSizer.Add(self.name) + description = wx.StaticText(panel, -1, _(u"Description")) + self.description = wx.TextCtrl(panel, -1) + descriptionSizer = wx.BoxSizer(wx.HORIZONTAL) + descriptionSizer.Add(description) + descriptionSizer.Add(self.description) + mode = wx.StaticText(panel, -1, _(u"Mode")) + self.public = wx.RadioButton(panel, -1, _(u"Public"), style=wx.RB_GROUP) + self.private = wx.RadioButton(panel, -1, _(u"Private")) + modeBox = wx.BoxSizer(wx.HORIZONTAL) + modeBox.Add(mode) + modeBox.Add(self.public) + modeBox.Add(self.private) + ok = wx.Button(panel, wx.ID_OK) + ok.SetDefault() + cancel = wx.Button(panel, wx.ID_CANCEL) + btnBox = wx.BoxSizer(wx.HORIZONTAL) + btnBox.Add(ok) + btnBox.Add(cancel) + sizer.Add(nameSizer) + sizer.Add(descriptionSizer) + sizer.Add(modeBox) + sizer.Add(btnBox) + +class editListDialog(createListDialog): + + def __init__(self, list): + createListDialog.__init__(self) + self.SetTitle(_(u"Editing the list %s") % (list["name"])) + self.name.ChangeValue(list["name"]) + self.description.ChangeValue(list["description"]) + if list["mode"] == "public": + self.public.SetValue(True) + else: + self.private.SetValue(True) + +class addUserListDialog(listViewer): + def __init__(self, parent): + listViewer.__init__(self, parent) + self.SetTitle(_(u"Select a list to add the user")) + self.createBtn.SetLabel(_(u"Add")) + self.createBtn.SetDefault() + self.editBtn.Disable() + self.view.Disable() +# self.subscriptors.Disable() +# self.members.Disable() + self.deleteBtn.Disable() + + def onGo(self, ev): + self.EndModal(wx.ID_OK) + +class removeUserListDialog(listViewer): + def __init__(self, parent): + listViewer.__init__(self, parent) + self.SetTitle(_(u"Select a list to remove the user")) + self.createBtn.SetLabel(_(u"Remove")) + self.createBtn.SetDefault() + self.editBtn.Disable() + self.view.Disable() +# self.subscriptors.Disable() +# self.members.Disable() + self.deleteBtn.Disable() + + def onGo(self, ev): + self.EndModal(wx.ID_OK) \ No newline at end of file diff --git a/src/gui/dialogs/message.py b/src/gui/dialogs/message.py new file mode 100644 index 00000000..0820d37e --- /dev/null +++ b/src/gui/dialogs/message.py @@ -0,0 +1,415 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx +import twitter +import config +import output +import sound +import urlList +import url_shortener +import json +from mysc.thread_utils import call_threaded +from mysc.repeating_timer import RepeatingTimer +from twython import TwythonError +from extra import translator, AudioUploader +import platform +from extra.AudioUploader import transfer +if platform.system() != "Darwin": + from extra.AudioUploader import dropbox_transfer + from extra.SpellChecker import gui as spellCheckerGUI + +class textLimited(wx.Dialog): + def __init__(self, message, title, text, parent): + wx.Dialog.__init__(self, parent) + self.twitter = parent.twitter + self.parent = parent + self.SetTitle(_(u"New tweet")) + self.panel = wx.Panel(self) + + def createTextArea(self, message, text): + self.label = wx.StaticText(self.panel, -1, str(len(text))) + self.text = wx.TextCtrl(self.panel, -1, text) + font = self.text.GetFont() + dc = wx.WindowDC(self.text) + dc.SetFont(font) + x, y = dc.GetTextExtent("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") + self.text.SetSize((x, y)) + self.text.SetFocus() + if platform.system() != "Darwin": + self.text.Bind(wx.EVT_TEXT, self.onTimer) + 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 onCheck(self, ev): + if platform.system() == "Darwin": + return + text = self.text.GetValue() + dlg = spellCheckerGUI.spellCheckerDialog(text, "") + if dlg.ShowModal() == wx.ID_OK: + self.text.ChangeValue(dlg.checker.get_text()) + dlg.Destroy() + + def onAttach(self, ev): + ev.Skip() + self.recording = AudioUploader.gui.audioDialog(self.parent) + if self.recording.ShowModal() != wx.ID_OK: + self.recording.cleanup() + return + self.recording.postprocess() + output.speak(_(u"Attaching...")) + self.uploaderDialog = AudioUploader.transfer_dialogs.UploadDialog(parent=self.parent, title=_(u"Uploading..."), filename=self.recording.file) + if self.recording.services.GetValue() == "Dropbox" and platform.system() != "Darwin": + self.uploader = dropbox_transfer.dropboxUploader(filename=self.recording.file, completed_callback=self.upload_completed, wxDialog=self.uploaderDialog) + elif self.recording.services.GetValue() == "SNDUp": + base_url = 'http://sndup.net/post.php' + if len(config.main["sound"]["sndup_api_key"]) > 0: + url = base_url + '?apikey=' + config.main['sound']['sndup_api_key'] + else: + url = base_url + self.uploader = transfer.Upload(field='file', url=url, filename=self.recording.file, completed_callback=self.upload_completed, wxDialog=self.uploaderDialog) + self.uploaderDialog.Show() + self.uploader.perform_threaded() + + def upload_completed(self): + url = self.uploader.get_url() + self.uploaderDialog.Destroy() + if url != 0: + self.text.SetValue(self.text.GetValue()+url+" #audio") + else: + output.speak(_(u"Unable to upload the audio")) + + def onTranslate(self, ev): + dlg = translator.gui.translateDialog() + selection = dlg.ShowModal() + if selection != wx.ID_CANCEL: + text_to_translate = self.text.GetValue().encode("utf-8") + source = [x[0] for x in translator.available_languages()][dlg.source_lang.GetSelection()] + dest = [x[0] for x in translator.available_languages()][dlg.dest_lang.GetSelection()] + t = translator.translator.Translator() + t.from_lang = source + t.to_lang = dest + msg = t.translate(text_to_translate) + self.text.ChangeValue(msg) + output.speak(_(u"Translated")) + self.text.SetFocus() + else: + return + dlg.Destroy() + + def onSelect(self, ev): + self.text.SelectAll() + + def onShorten(self, ev): + urls = twitter.utils.find_urls_in_text(self.text.GetValue()) + if len(urls) == 0: + output.speak(_(u"There's no URL to be shortened")) + elif len(urls) == 1: + self.text.SetValue(self.text.GetValue().replace(urls[0], url_shortener.shorten(urls[0]))) + output.speak(_(u"URL shortened")) + elif len(urls) > 1: + urlList.shorten(urls, self).ShowModal() + self.text.SetFocus() + + def onUnshorten(self, ev): + urls = twitter.utils.find_urls_in_text(self.text.GetValue()) + if len(urls) == 0: + output.speak(_(u"There's no URL to be expanded")) + elif len(urls) == 1: + self.text.SetValue(self.text.GetValue().replace(urls[0], url_shortener.unshorten(urls[0]))) + output.speak(_(u"URL expanded")) + elif len(urls) > 1: + urlList.unshorten(urls, self).ShowModal() + self.text.SetFocus() + + def onTimer(self, ev): + self.label.SetLabel(str(len(self.text.GetValue()))) + if len(self.text.GetValue()) > 1: + self.shortenButton.Enable() + self.unshortenButton.Enable() + else: + self.shortenButton.Disable() + self.unshortenButton.Disable() + if len(self.text.GetValue()) > 140: + sound.player.play("max_length.ogg") + self.okButton.Disable() + elif len(self.text.GetValue()) <= 140: + self.okButton.Enable() + + def onCancel(self, ev): + self.Destroy() + + +class tweet(textLimited): + def createControls(self, message, title, text): + self.mainBox = wx.BoxSizer(wx.VERTICAL) + self.createTextArea(message, text) + self.mainBox.Add(self.textBox, 0, wx.ALL, 5) + self.upload_image = wx.Button(self.panel, -1, _(u"Upload a picture"), size=wx.DefaultSize) + self.upload_image.Bind(wx.EVT_BUTTON, self.onUpload_image) + if platform.system() != "Darwin": + self.spellcheck = wx.Button(self.panel, -1, _("Spelling correction"), size=wx.DefaultSize) + self.spellcheck.Bind(wx.EVT_BUTTON, self.onCheck) + self.attach = wx.Button(self.panel, -1, _(u"Attach audio"), size=wx.DefaultSize) + self.attach.Bind(wx.EVT_BUTTON, self.onAttach) + self.shortenButton = wx.Button(self.panel, -1, _(u"Shorten URL"), size=wx.DefaultSize) + self.shortenButton.Bind(wx.EVT_BUTTON, self.onShorten) + self.unshortenButton = wx.Button(self.panel, -1, _(u"Expand URL"), size=wx.DefaultSize) + self.unshortenButton.Bind(wx.EVT_BUTTON, self.onUnshorten) + self.shortenButton.Disable() + self.unshortenButton.Disable() + self.translateButton = wx.Button(self.panel, -1, _(u"Translate message"), size=wx.DefaultSize) + self.translateButton.Bind(wx.EVT_BUTTON, self.onTranslate) + self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Send"), size=wx.DefaultSize) + self.okButton.Bind(wx.EVT_BUTTON, self.onSend) + self.okButton.SetDefault() + cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"Close"), size=wx.DefaultSize) + cancelButton.Bind(wx.EVT_BUTTON, self.onCancel) + self.buttonsBox1 = wx.BoxSizer(wx.HORIZONTAL) + self.buttonsBox1.Add(self.upload_image, 0, wx.ALL, 5) + if platform.system() != "Darwin": + self.buttonsBox1.Add(self.spellcheck, 0, wx.ALL, 5) + self.buttonsBox1.Add(self.attach, 0, wx.ALL, 5) + self.mainBox.Add(self.buttonsBox1, 0, wx.ALL, 5) + self.buttonsBox2 = wx.BoxSizer(wx.HORIZONTAL) + self.buttonsBox2.Add(self.shortenButton, 0, wx.ALL, 5) + self.buttonsBox2.Add(self.unshortenButton, 0, wx.ALL, 5) + self.buttonsBox2.Add(self.translateButton, 0, wx.ALL, 5) + self.mainBox.Add(self.buttonsBox2, 0, wx.ALL, 5) + self.ok_cancelSizer = wx.BoxSizer(wx.HORIZONTAL) + self.ok_cancelSizer.Add(self.okButton, 0, wx.ALL, 5) + self.ok_cancelSizer.Add(cancelButton, 0, wx.ALL, 5) + self.mainBox.Add(self.ok_cancelSizer) + selectId = wx.NewId() + 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, message, title, text, parent): + super(tweet, self).__init__(message, title, text, parent) + self.image = None + self.createControls(message, title, text) + self.onTimer(wx.EVT_CHAR_HOOK) + self.SetClientSize(self.mainBox.CalcMin()) + + def onUpload_image(self, ev): + if self.upload_image.GetLabel() == _(u"Discard image"): + self.image = None + del self.file + output.speak(_(u"Discarded")) + self.upload_image.SetLabel(_(u"Upload a picture")) + else: + 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 + self.file = open(openFileDialog.GetPath(), "rb") + self.image = True + self.upload_image.SetLabel(_(u"Discard image")) + ev.Skip() + + def onSend(self, ev): + self.EndModal(wx.ID_OK) + +class retweet(tweet): + def __init__(self, message, title, text, parent): + super(retweet, self).__init__(message, title, text, parent) +# self.createControls(message, title, text) + self.in_reply_to = parent.db.settings[parent.name_buffer][parent.list.get_selected()]["id"] + self.text.SetInsertionPoint(0) + + def onSend(self, ev): + self.EndModal(wx.ID_OK) + +class dm(textLimited): + def createControls(self, message, title, text): + self.mainBox = wx.BoxSizer(wx.VERTICAL) + if self.parent.name_buffer == "followers" or self.parent.name_buffer == "friends": + list = [self.parent.db.settings[self.parent.name_buffer][self.parent.list.get_selected()]["screen_name"]] + else: + list =twitter.utils.get_all_users(self.parent.db.settings[self.parent.name_buffer][self.parent.list.get_selected()], self.parent.db) + label = wx.StaticText(self.panel, -1, _(u"Recipient")) + self.cb = wx.ComboBox(self.panel, -1, choices=list, value=list[0], size=wx.DefaultSize) + self.createTextArea(message, text) + self.mainBox.Add(self.cb, 0, wx.ALL, 5) + self.mainBox.Add(self.textBox, 0, wx.ALL, 5) + if platform.system() != "Darwin": + self.spellcheck = wx.Button(self.panel, -1, _("Spelling correction"), size=wx.DefaultSize) + self.spellcheck.Bind(wx.EVT_BUTTON, self.onCheck) + self.attach = wx.Button(self.panel, -1, _(u"Attach audio"), size=wx.DefaultSize) + self.attach.Bind(wx.EVT_BUTTON, self.onAttach) + self.shortenButton = wx.Button(self.panel, -1, _(u"Shorten URL"), size=wx.DefaultSize) + self.shortenButton.Bind(wx.EVT_BUTTON, self.onShorten) + self.unshortenButton = wx.Button(self.panel, -1, _(u"Expand URL"), size=wx.DefaultSize) + self.unshortenButton.Bind(wx.EVT_BUTTON, self.onUnshorten) + self.shortenButton.Disable() + self.unshortenButton.Disable() + self.translateButton = wx.Button(self.panel, -1, _(u"Translate message"), size=wx.DefaultSize) + self.translateButton.Bind(wx.EVT_BUTTON, self.onTranslate) + self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Send"), size=wx.DefaultSize) + self.okButton.Bind(wx.EVT_BUTTON, self.onSend) + self.okButton.SetDefault() + cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"Close"), size=wx.DefaultSize) + cancelButton.Bind(wx.EVT_BUTTON, self.onCancel) + self.buttonsBox = wx.BoxSizer(wx.HORIZONTAL) + if platform.system() != "Darwin": + 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) + + def __init__(self, message, title, text, parent): + super(dm, self).__init__(message, title, text, parent) + self.parent = parent + self.image = None + self.createControls(message, title, text) + self.onTimer(wx.EVT_CHAR_HOOK) + self.SetClientSize(self.mainBox.CalcMin()) + + def onSend(self, ev): + self.EndModal(wx.ID_OK) + +class reply(tweet): + def __init__(self, message, title, text, parent): + super(reply, self).__init__(message, title, text, parent) + self.in_reply_to = parent.db.settings[parent.name_buffer][parent.list.get_selected()]["id"] + self.text.SetInsertionPoint(len(self.text.GetValue())) + self.mentionAll = wx.Button(self, -1, _(u"Mention to all"), size=wx.DefaultSize) + self.mentionAll.Disable() + self.mentionAll.Bind(wx.EVT_BUTTON, self.mentionAllUsers) + self.buttonsBox1.Add(self.mentionAll, 0, wx.ALL, 5) + self.buttonsBox1.Layout() + self.mainBox.Layout() + self.check_if_users() + self.SetClientSize(self.mainBox.CalcMin()) + + def check_if_users(self): + try: + if len(self.parent.db.settings[self.parent.name_buffer][self.parent.list.get_selected()]["entities"]["user_mentions"]) > 0: + self.mentionAll.Enable() + except KeyError: + pass + + def mentionAllUsers(self, ev): + self.text.SetValue(self.text.GetValue()+twitter.utils.get_all_mentioned(self.parent.db.settings[self.parent.name_buffer][self.parent.list.get_selected()], self.parent.db)) + self.text.SetInsertionPoint(len(self.text.GetValue())) + self.text.SetFocus() + + def onSend(self, ev): + self.EndModal(wx.ID_OK) + +class viewTweet(wx.Dialog): + def __init__(self, tweet): + super(viewTweet, self).__init__(None, size=(850,850)) + self.SetTitle(_(u"Tweet - %i characters ") % (len(tweet))) + panel = wx.Panel(self) + label = wx.StaticText(panel, -1, _(u"Tweet")) + self.text = wx.TextCtrl(panel, -1, tweet, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180)) + dc = wx.WindowDC(self.text) + dc.SetFont(self.text.GetFont()) + (x, y, z) = 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 platform.system() != "Darwin": + spellcheck = wx.Button(panel, -1, _("Spelling correction"), size=wx.DefaultSize) + spellcheck.Bind(wx.EVT_BUTTON, self.onCheck) + self.unshortenButton = wx.Button(panel, -1, _(u"Expand URL"), size=wx.DefaultSize) + self.unshortenButton.Bind(wx.EVT_BUTTON, self.onUnshorten) + self.unshortenButton.Disable() + translateButton = wx.Button(panel, -1, _(u"Translate message"), size=wx.DefaultSize) + translateButton.Bind(wx.EVT_BUTTON, self.onTranslate) + cancelButton = wx.Button(panel, wx.ID_CANCEL, _(u"Close"), size=wx.DefaultSize) + cancelButton.SetDefault() + buttonsBox = wx.BoxSizer(wx.HORIZONTAL) + if platform.system() != "Darwin": + buttonsBox.Add(spellcheck, 0, wx.ALL, 5) + buttonsBox.Add(self.unshortenButton, 0, wx.ALL, 5) + buttonsBox.Add(translateButton, 0, wx.ALL, 5) + buttonsBox.Add(cancelButton, 0, wx.ALL, 5) + mainBox.Add(buttonsBox, 0, wx.ALL, 5) + selectId = wx.NewId() + 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.check_urls() + self.SetClientSize(mainBox.CalcMin()) + + def check_urls(self): + if len(twitter.utils.find_urls_in_text(self.text.GetValue())) > 0: + self.unshortenButton.Enable() + + def onCheck(self, ev): + if platform.system() != "Darwin": return + text = self.text.GetValue() + dlg = spellCheckerGUI.spellCheckerDialog(text, "") + if dlg.ShowModal() == wx.ID_OK: + self.text.ChangeValue(dlg.checker.get_text()) + dlg.Destroy() + + def onTranslate(self, ev): + dlg = translator.gui.translateDialog() + selection = dlg.ShowModal() + if selection != wx.ID_CANCEL: + text_to_translate = self.text.GetValue().encode("utf-8") + source = [x[0] for x in translator.available_languages()][dlg.source_lang.GetSelection()] + dest = [x[0] for x in translator.available_languages()][dlg.dest_lang.GetSelection()] + t = translator.translator.Translator() + t.from_lang = source + t.to_lang = dest + msg = t.translate(text_to_translate) + self.text.ChangeValue(msg) + output.speak(_(u"Translated")) + self.text.SetFocus() + else: + return + dlg.Destroy() + + def onSelect(self, ev): + self.text.SelectAll() + + def onUnshorten(self, ev): + urls = twitter.utils.find_urls_in_text(self.text.GetValue()) + if len(urls) == 0: + output.speak(_(u"There's no URL to be expanded")) + elif len(urls) == 1: + self.text.SetValue(self.text.GetValue().replace(urls[0], url_shortener.unshorten(urls[0]))) + output.speak(_(u"URL expanded")) + elif len(urls) > 1: + urlList.unshorten(urls, self).ShowModal() + self.text.SetFocus() + diff --git a/src/gui/dialogs/search.py b/src/gui/dialogs/search.py new file mode 100644 index 00000000..60c54f55 --- /dev/null +++ b/src/gui/dialogs/search.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx + +class searchDialog(wx.Dialog): + def __init__(self): + super(searchDialog, self).__init__(None, -1) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + self.SetTitle(_(u"Search on Twitter")) + label = wx.StaticText(panel, -1, _(u"Search")) + self.term = wx.TextCtrl(panel, -1,) + dc = wx.WindowDC(self.term) + dc.SetFont(self.term.GetFont()) + self.term.SetSize(dc.GetTextExtent("0"*40)) + sizer.Add(label, 0, wx.ALL, 5) + sizer.Add(self.term, 0, wx.ALL, 5) + self.tweets = wx.RadioButton(panel, -1, _(u"Tweets"), style=wx.RB_GROUP) + self.users = wx.RadioButton(panel, -1, _(u"Users")) + radioSizer = wx.BoxSizer(wx.HORIZONTAL) + radioSizer.Add(self.tweets, 0, wx.ALL, 5) + radioSizer.Add(self.users, 0, wx.ALL, 5) + sizer.Add(radioSizer, 0, wx.ALL, 5) + ok = wx.Button(panel, wx.ID_OK, _(u"OK")) + ok.SetDefault() + cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Close")) + btnsizer = wx.BoxSizer() + btnsizer.Add(ok, 0, wx.ALL, 5) + btnsizer.Add(cancel, 0, wx.ALL, 5) + sizer.Add(btnsizer, 0, wx.ALL, 5) + panel.SetSizer(sizer) + self.SetClientSize(sizer.CalcMin()) diff --git a/src/gui/dialogs/show_user.py b/src/gui/dialogs/show_user.py new file mode 100644 index 00000000..cea5b35b --- /dev/null +++ b/src/gui/dialogs/show_user.py @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx, twitter, config, gui.dialogs, sound, webbrowser + +class showUserProfile(wx.Dialog): + def __init__(self, twitter, screen_name): + self.twitter = twitter + self.screen_name = screen_name + wx.Dialog.__init__(self, None, -1) + self.SetTitle(_(u"Information for %s") % (screen_name)) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + self.get_data() + static = wx.StaticText(panel, -1, _(u"Details")) + sizer.Add(static, 0, wx.ALL, 5) + text = wx.TextCtrl(panel, -1, style=wx.TE_MULTILINE|wx.TE_READONLY) +# dc = wx.WindowDC(text) +# dc.SetFont(text.GetFont()) +# (x, y, z) = dc.GetMultiLineTextExtent("0"*10000) +# text.SetSize((x, y)) + text.SetFocus() + sizer.Add(text, 0, wx.ALL|wx.EXPAND, 5) + self.url = wx.Button(panel, -1, _(u"Go to URL"), size=wx.DefaultSize) + self.url.Bind(wx.EVT_BUTTON, self.onUrl) + self.url.Disable() + close = wx.Button(panel, wx.ID_CANCEL, _(u"Close")) + close.Bind(wx.EVT_BUTTON, self.onClose) + btnSizer = wx.BoxSizer(wx.HORIZONTAL) + btnSizer.Add(self.url, 0, wx.ALL, 5) + btnSizer.Add(close, 0, wx.ALL, 5) + sizer.Add(btnSizer, 0, wx.ALL, 5) + text.ChangeValue(self.compose_string()) + text.SetSize(text.GetBestSize()) + panel.SetSizer(sizer) + self.SetClientSize(sizer.CalcMin()) + + def onUrl(self, ev): + webbrowser.open(self.data["url"]) + + def onClose(self, ev): + self.Destroy() + + def get_data(self): + try: + self.data = self.twitter.twitter.show_user(screen_name=self.screen_name) + except: + wx.MessageDialog(self, _(u"This user does not exist on Twitter"), _(u"Error"), wx.ICON_ERROR).ShowModal() + self.EndModal() + + def compose_string(self): + string = u"" + string = string + _(u"Username: @%s\n") % (self.data["screen_name"]) + string = string + _(u"Name: %s\n") % (self.data["name"]) + if self.data["location"] != "": + string = string + _(u"Location: %s\n") % (self.data["location"]) + if self.data["url"] != None: + string = string+ _(u"URL: %s\n") % (self.data["url"]) + self.url.Enable() + if self.data["description"] != "": + string = string+ _(u"Bio: %s\n") % (self.data["description"]) + if self.data["protected"] == True: protected = _(u"Yes") + else: protected = _(u"No") + string = string+ _(u"Protected: %s\n") % (protected) + string = string+_(u"Followers: %s\n Friends: %s\n") % (self.data["followers_count"], self.data["friends_count"]) + string = string+ _(u"Tweets: %s\n") % (self.data["statuses_count"]) + string = string+ _(u"Favourites: %s") % (self.data["favourites_count"]) + return string \ No newline at end of file diff --git a/src/gui/dialogs/update_profile.py b/src/gui/dialogs/update_profile.py new file mode 100644 index 00000000..fe1f1b32 --- /dev/null +++ b/src/gui/dialogs/update_profile.py @@ -0,0 +1,119 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx +from twython import TwythonError + +class updateProfile(wx.Dialog): + def __init__(self, parent): + self.twitter = parent.twitter + self.parent = parent + super(updateProfile, self).__init__(parent=None, id=-1) + self.SetTitle(_(u"Update your profile")) + panel = wx.Panel(self) + labelName = wx.StaticText(panel, -1, _(u"Name (20 characters maximum)")) + self.name = wx.TextCtrl(panel, -1) + self.name.SetFocus() + dc = wx.WindowDC(self.name) + dc.SetFont(self.name.GetFont()) + self.name.SetSize(dc.GetTextExtent("0"*20)) + labelLocation = wx.StaticText(panel, -1, _(u"Location")) + self.location = wx.TextCtrl(panel, -1) + dc = wx.WindowDC(self.location) + dc.SetFont(self.location.GetFont()) + self.location.SetSize(dc.GetTextExtent("0"*35)) + labelUrl = wx.StaticText(panel, -1, _(u"Website")) + self.url = wx.TextCtrl(panel, -1) + dc = wx.WindowDC(self.url) + dc.SetFont(self.url.GetFont()) + self.url.SetSize(dc.GetTextExtent("0"*22)) + labelDescription = wx.StaticText(panel, -1, _(u"Bio (160 characters maximum)")) + self.description = wx.TextCtrl(panel, -1, size=(400, 400)) + dc = wx.WindowDC(self.description) + dc.SetFont(self.description.GetFont()) + self.description.SetSize(dc.GetTextExtent("0"*160)) + self.image = None + self.upload_image = wx.Button(panel, -1, _(u"Upload a picture")) + self.upload_image.Bind(wx.EVT_BUTTON, self.onUpload_picture) + ok = wx.Button(panel, wx.ID_OK, _(u"Update profile")) + ok.Bind(wx.EVT_BUTTON, self.onUpdateProfile) + ok.SetDefault() + close = wx.Button(panel, wx.ID_CANCEL, _("Close")) + sizer = wx.BoxSizer(wx.VERTICAL) + nameBox = wx.BoxSizer(wx.HORIZONTAL) + nameBox.Add(labelName, 0, wx.ALL, 5) + nameBox.Add(self.name, 0, wx.ALL, 5) + sizer.Add(nameBox, 0, wx.ALL, 5) + locationBox = wx.BoxSizer(wx.HORIZONTAL) + locationBox.Add(labelLocation, 0, wx.ALL, 5) + locationBox.Add(self.location, 0, wx.ALL, 5) + sizer.Add(locationBox, 0, wx.ALL, 5) + urlBox = wx.BoxSizer(wx.HORIZONTAL) + urlBox.Add(labelUrl, 0, wx.ALL, 5) + urlBox.Add(self.url, 0, wx.ALL, 5) + sizer.Add(urlBox, 0, wx.ALL, 5) + descriptionBox = wx.BoxSizer(wx.HORIZONTAL) + descriptionBox.Add(labelDescription, 0, wx.ALL, 5) + descriptionBox.Add(self.description, 0, wx.ALL, 5) + sizer.Add(descriptionBox, 0, wx.ALL, 5) + sizer.Add(self.upload_image, 5, wx.CENTER, 5) + btnBox = wx.BoxSizer(wx.HORIZONTAL) + btnBox.Add(ok, 0, wx.ALL, 5) + btnBox.Add(close, 0, wx.ALL, 5) + sizer.Add(btnBox, 0, wx.ALL, 5) + panel.SetSizer(sizer) + self.SetClientSize(sizer.CalcMin()) + self.get_data() + + def onUpload_picture(self, ev): + if self.upload_image.GetLabel() == _(u"Discard image"): + self.image = None + del self.file + output.speak(_(u"Discarded")) + self.upload_image.SetLabel(_(u"Upload a picture")) + else: + 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 + self.file = open(openFileDialog.GetPath(), "rb") + self.image = True + self.upload_image.SetLabel(_(u"Discard image")) + ev.Skip() + + def onUpdateProfile(self, ev): + try: + if self.image != None: + self.twitter.twitter.update_profile_image(image=self.file) + except TwythonError as e: + output.speak(u"Error %s. %s" % (e.error_code, e.msg)) + try: + f = self.twitter.twitter.update_profile(name=self.name.GetValue(), location=self.location.GetValue(), url=self.url.GetValue(), description=self.description.GetValue()) + self.EndModal(wx.ID_OK) + except TwythonError as e: + output.speak(u"Error %s. %s" % (e.error_code, e.msg)) + return + + def get_data(self): + data = self.twitter.twitter.show_user(screen_name=self.parent.db.settings["user_name"]) + self.name.ChangeValue(data["name"]) + if data["url"] != None: + self.url.ChangeValue(data["url"]) + if len(data["location"]) > 0: + self.location.ChangeValue(data["location"]) + if len(data["description"]) > 0: + self.description.ChangeValue(data["description"]) \ No newline at end of file diff --git a/src/gui/dialogs/urlList.py b/src/gui/dialogs/urlList.py new file mode 100644 index 00000000..65aac035 --- /dev/null +++ b/src/gui/dialogs/urlList.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx +import webbrowser +import url_shortener + +class urlList(wx.Dialog): + def __init__(self, urls): + self.urls = urls + super(urlList, self).__init__(parent=None, title=_(u"Select an URL")) + panel = wx.Panel(self) +# label = wx.StaticText(panel, -1, _(u"Select a URL")) + self.lista = wx.ListBox(panel, -1) + self.lista.SetFocus() + self.populate_list() + self.lista.SetSelection(0) + self.lista.SetSize(self.lista.GetBestSize()) + sizer = wx.BoxSizer(wx.VERTICAL) +# sizer.Add(label, 0, wx.ALL, 5) + sizer.Add(self.lista, 0, wx.ALL, 5) + goBtn = wx.Button(panel, wx.ID_OK) + goBtn.SetDefault() + goBtn.Bind(wx.EVT_BUTTON, self.onGo) + cancelBtn = wx.Button(panel, wx.ID_CANCEL) + btnSizer = wx.BoxSizer() + btnSizer.Add(goBtn, 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 onGo(self, ev): + webbrowser.open(self.lista.GetStringSelection()) + self.Destroy() + + def populate_list(self): + for i in self.urls: + self.lista.Append(i) + +class shorten(urlList): + def __init__(self, urls, parent): + urlList.__init__(self, urls) + self.parent = parent + + def onGo(self, ev): + self.parent.text.SetValue(self.parent.text.GetValue().replace(self.lista.GetStringSelection(), url_shortener.shorten(self.lista.GetStringSelection()))) + self.Destroy() + +class unshorten(shorten): + def __init__(self, urls, parent): + shorten.__init__(self, urls, parent) + + def onGo(self, ev): + self.parent.text.SetValue(self.parent.text.GetValue().replace(self.lista.GetStringSelection(), url_shortener.unshorten(self.lista.GetStringSelection()))) + self.Destroy() \ No newline at end of file diff --git a/src/gui/dialogs/utils.py b/src/gui/dialogs/utils.py new file mode 100644 index 00000000..1f033cb8 --- /dev/null +++ b/src/gui/dialogs/utils.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx, twitter, gui.dialogs, sound, config +from mysc.repeating_timer import RepeatingTimer + +class selectUserDialog(wx.Dialog): + def __init__(self, parent, title): + self.parent = parent + wx.Dialog.__init__(self, None, -1) + panel = wx.Panel(self) + userSizer = wx.BoxSizer() + self.SetTitle(title) + if self.parent.nb.GetCurrentPage().name_buffer == "followers" or self.parent.nb.GetCurrentPage().name_buffer == "friends": + list = [self.parent.db.settings[self.parent.nb.GetCurrentPage().name_buffer][self.parent.nb.GetCurrentPage().list.get_selected()]["screen_name"]] + else: + try: list =twitter.utils.get_all_users(self.parent.db.settings[self.parent.nb.GetCurrentPage().name_buffer][self.parent.nb.GetCurrentPage().list.get_selected()], self.parent.db) + except KeyError: list = [self.parent.db.settings[self.parent.nb.GetCurrentPage().name_buffer][self.parent.nb.GetCurrentPage().list.get_selected()]["screen_name"]] + self.cb = wx.ComboBox(panel, -1, choices=list, value=list[0], size=wx.DefaultSize) + self.cb.SetFocus() + userSizer.Add(wx.StaticText(panel, -1, _(u"User")), 0, wx.ALL, 5) + userSizer.Add(self.cb) + sizer = wx.BoxSizer(wx.VERTICAL) + ok = wx.Button(panel, wx.ID_OK, _(u"OK")) + ok.SetDefault() +# ok.Bind(wx.EVT_BUTTON, self.onok) + cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Close")) + btnsizer = wx.BoxSizer() + btnsizer.Add(ok, 0, wx.ALL, 5) + btnsizer.Add(cancel, 0, wx.ALL, 5) + sizer.Add(userSizer, 0, wx.ALL, 5) + sizer.Add(btnsizer, 0, wx.ALL, 5) + panel.SetSizer(sizer) + self.SetClientSize(sizer.CalcMin()) \ No newline at end of file diff --git a/src/gui/main.py b/src/gui/main.py new file mode 100644 index 00000000..396e345c --- /dev/null +++ b/src/gui/main.py @@ -0,0 +1,969 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx +import dialogs +import buffers +import config +import twitter +import db +import webbrowser +import sound +import updater +import application +import os +import logging as original_logger +import output +import platform +import urllib2 +import sysTrayIcon +import languageHandler +from issueReporter import gui as issueReporterGUI +from sessionmanager import manager +from mysc import event +from mysc.thread_utils import call_threaded +from twython import TwythonError +from urllib2 import URLError +from mysc.repeating_timer import RepeatingTimer +from mysc import localization +if platform.system() == "Windows" or platform.system() == "Linux": + from keyboard_handler.wx_handler import WXKeyboardHandler +from extra import SoundsTutorial +from keystrokeEditor import gui as keystrokeEditorGUI +log = original_logger.getLogger("gui.main") + +class mainFrame(wx.Frame): + """ Main class of the Frame. This is the Main Window.""" + + ### MENU + def makeMenus(self): + """ Creates, bind and returns the menu bar for the application. Also in this function, the accel table is created.""" + menuBar = wx.MenuBar() + + # Application menu + app = wx.Menu() + updateProfile = app.Append(wx.NewId(), _(u"&Update profile")) + self.Bind(wx.EVT_MENU, self.update_profile, updateProfile) + show_hide = app.Append(wx.NewId(), _(u"&Hide window")) + self.Bind(wx.EVT_MENU, self.show_hide, show_hide) + search = app.Append(wx.NewId(), _(u"&Search")) + self.Bind(wx.EVT_MENU, self.search, search) + lists = app.Append(wx.NewId(), _(u"&Lists manager")) + self.Bind(wx.EVT_MENU, self.list_manager, lists) + sounds_tutorial = app.Append(wx.NewId(), _(u"Sounds &tutorial")) + self.Bind(wx.EVT_MENU, self.learn_sounds, sounds_tutorial) + keystroke_editor = app.Append(wx.NewId(), _(u"&Edit keystrokes")) + self.Bind(wx.EVT_MENU, self.edit_keystrokes, keystroke_editor) + prefs = app.Append(wx.ID_PREFERENCES, _(u"&Preferences")) + self.Bind(wx.EVT_MENU, self.preferences, prefs) + close = app.Append(wx.ID_EXIT, _(u"E&xit")) + self.Bind(wx.EVT_MENU, self.close, close) + + # Tweet menu + tweet = wx.Menu() + compose = tweet.Append(wx.NewId(), _(u"&Tweet")) + self.Bind(wx.EVT_MENU, self.compose, compose) + response = tweet.Append(wx.NewId(), _(u"Re&ply")) + self.Bind(wx.EVT_MENU, self.reply, response) + retweet = tweet.Append(wx.NewId(), _(u"&Retweet")) + self.Bind(wx.EVT_MENU, self.retweet, retweet) + fav = tweet.Append(wx.NewId(), _(u"Add to &favourites")) + self.Bind(wx.EVT_MENU, self.fav, fav) + unfav = tweet.Append(wx.NewId(), _(u"Remove from favo&urites")) + self.Bind(wx.EVT_MENU, self.unfav, unfav) + view = tweet.Append(wx.NewId(), _(u"&Show tweet")) + self.Bind(wx.EVT_MENU, self.view, view) + delete = tweet.Append(wx.NewId(), _(u"&Delete")) + self.Bind(wx.EVT_MENU, self.delete, delete) + + # User menu + user = wx.Menu() + follow = user.Append(wx.NewId(), _(u"&Follow")) + self.Bind(wx.EVT_MENU, self.onFollow, follow) + unfollow = user.Append(wx.NewId(), _(u"&Unfollow")) + self.Bind(wx.EVT_MENU, self.onUnfollow, unfollow) + mute = user.Append(wx.NewId(), _(u"&Mute")) + self.Bind(wx.EVT_MENU, self.onMute, mute) + unmute = user.Append(wx.NewId(), _(u"U&nmute")) + self.Bind(wx.EVT_MENU, self.onUnmute, unmute) + report = user.Append(wx.NewId(), _(u"&Report as spam")) + self.Bind(wx.EVT_MENU, self.onReport, report) + block = user.Append(wx.NewId(), _(u"&Block")) + self.Bind(wx.EVT_MENU, self.onBlock, block) + unblock = user.Append(wx.NewId(), _(u"Unb&lock")) + self.Bind(wx.EVT_MENU, self.onUnblock, unblock) + dm = user.Append(wx.NewId(), _(u"Direct me&ssage")) + self.Bind(wx.EVT_MENU, self.dm, dm) + addToList = user.Append(wx.NewId(), _(u"&Add to list")) + self.Bind(wx.EVT_MENU, self.add_to_list, addToList) + removeFromList = user.Append(wx.NewId(), _(u"R&emove from list")) + self.Bind(wx.EVT_MENU, self.remove_from_list, removeFromList) + viewLists = user.Append(wx.NewId(), _(u"&View lists")) + self.Bind(wx.EVT_MENU, self.view_user_lists, viewLists) + details = user.Append(wx.NewId(), _(u"Show user &profile")) + self.Bind(wx.EVT_MENU, self.details, details) + timeline = user.Append(wx.NewId(), _(u"&Timeline")) + self.Bind(wx.EVT_MENU, self.open_timeline, timeline) + favs = user.Append(wx.NewId(), _(u"V&iew favourites")) + self.Bind(wx.EVT_MENU, self.favs_timeline, favs) + + # buffer menu + buffer = wx.Menu() + mute = buffer.Append(wx.NewId(), _(u"&Mute")) + self.Bind(wx.EVT_MENU, self.toggle_mute, mute) + autoread = buffer.Append(wx.NewId(), _(u"&Autoread tweets for this buffer")) + self.Bind(wx.EVT_MENU, self.toggle_autoread, autoread) + clear = buffer.Append(wx.NewId(), _(u"&Clear buffer")) + self.Bind(wx.EVT_MENU, self.clear_list, clear) + deleteTl = buffer.Append(wx.NewId(), _(u"&Remove buffer")) + self.Bind(wx.EVT_MENU, self.delete_buffer, deleteTl) + + # Help Menu + help = wx.Menu() + doc = help.Append(-1, _(u"&Documentation")) + self.Bind(wx.EVT_MENU, self.onManual, doc) + changelog = help.Append(wx.NewId(), _(u"&What's new in this version?")) + self.Bind(wx.EVT_MENU, self.onChangelog, changelog) + check_for_updates = help.Append(wx.NewId(), _(u"&Check for updates")) + self.Bind(wx.EVT_MENU, self.onCheckForUpdates, check_for_updates) + reportError = help.Append(wx.NewId(), _(u"&Report an error")) + self.Bind(wx.EVT_MENU, self.onReportBug, reportError) + visit_website = help.Append(-1, _(u"TW Blue &website")) + self.Bind(wx.EVT_MENU, self.onVisit_website, visit_website) + about = help.Append(-1, _(u"About &TW Blue")) + self.Bind(wx.EVT_MENU, self.onAbout, about) + + # Add all to the menu Bar + menuBar.Append(app, _(u"&Application")) + menuBar.Append(tweet, _(u"&Tweet")) + menuBar.Append(user, _(u"&User")) + menuBar.Append(buffer, _(u"&Buffer")) + menuBar.Append(help, _(u"&Help")) + + downID = wx.NewId() + upID = wx.NewId() + leftID = wx.NewId() + rightID = wx.NewId() + if platform.system() == "Darwin": + self.Bind(wx.EVT_MENU, self.down, id=downID) + self.Bind(wx.EVT_MENU, self.up, id=upID) + self.Bind(wx.EVT_MENU, self.left, id=leftID) + self.Bind(wx.EVT_MENU, self.right, id=rightID) + + # Creates the acceleration table. + self.accel_tbl = wx.AcceleratorTable([ +(wx.ACCEL_CTRL, ord('N'), compose.GetId()), +(wx.ACCEL_CTRL, ord('R'), response.GetId()), +(wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('R'), retweet.GetId()), +(wx.ACCEL_CTRL, ord('F'), fav.GetId()), +(wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('F'), unfav.GetId()), +(wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('V'), view.GetId()), +(wx.ACCEL_CTRL, ord('D'), dm.GetId()), + +(wx.ACCEL_CTRL, ord('Q'), close.GetId()), +(wx.ACCEL_CTRL, ord('S'), follow.GetId()), +(wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('S'), unfollow.GetId()), +(wx.ACCEL_CTRL, ord('K'), block.GetId()), +(wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('K'), report.GetId()), +(wx.ACCEL_CTRL, ord('I'), timeline.GetId()), +(wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('I'), deleteTl.GetId()), +(wx.ACCEL_CTRL, ord('M'), show_hide.GetId()), +(wx.ACCEL_CTRL, ord('P'), updateProfile.GetId()), +(wx.ACCEL_CTRL, wx.WXK_DOWN, downID), +(wx.ACCEL_CTRL, wx.WXK_UP, upID), +(wx.ACCEL_CTRL, wx.WXK_LEFT, leftID), +(wx.ACCEL_CTRL, wx.WXK_RIGHT, rightID), + ]) + + self.SetAcceleratorTable(self.accel_tbl) + return menuBar + + ### MAIN + def __init__(self, authorised=True, user_key=None, user_secret=None): + """ Main function of this class.""" + if authorised == False: + self.user_key = user_key + self.user_secret = user_secret + else: + self.user_key = self.user_secret = None + log.debug("Loading temporal database...") + self.db = db.db() + # Gets the twitter object for future calls to the twitter Rest API. + log.debug("Getting Twitter's Rest API...") + self.twitter = twitter.twitter.twitter() + super(mainFrame, self).__init__(None, -1, "TW Blue", size=(1600, 1600)) + self.Bind(wx.EVT_QUERY_END_SESSION, self.exit) + self.Bind(wx.EVT_END_SESSION, self.exit) + log.debug(u"Creating the system tray icon... ") + sysTray=sysTrayIcon.SysTrayIcon(self) + panel = wx.Panel(self) + self.sizer = wx.BoxSizer(wx.VERTICAL) + self.SetTitle("TW Blue") + try: + updater.update_manager.check_for_update() + except: + pass + self.SetMenuBar(self.makeMenus()) + self.setup_twitter(panel) + + def logging_in_twblue(self, panel): + log.debug("Retrieving username...") + twitter.starting.start_user_info(config=self.db, twitter=self.twitter) + config.main["twitter"]["user_name"] = self.db.settings["user_name"] + self.SetTitle(u"@%s. - TW Blue" % (self.db.settings["user_name"])) + self.nb = wx.Treebook(panel, -1) + self.Bind(wx.EVT_CLOSE, self.close) + self.nb.Bind(wx.EVT_TREEBOOK_PAGE_CHANGED, self.onPageChanged) + # Gets the tabs for home, mentions, send and direct messages. + log.debug("Creating buffers...") + self.db.settings["buffers"] = [] + account = buffers.accountPanel(self.nb) + self.nb.AddPage(account, self.db.settings["user_name"]) + self.db.settings["buffers"].append(self.db.settings["user_name"]) + account_index = self.db.settings["buffers"].index(self.db.settings["user_name"]) + home = buffers.basePanel(self.nb, self, "home_timeline", self.twitter.twitter.get_home_timeline, sound="tweet_received.ogg") + self.nb.InsertSubPage(account_index, home, _(u"Home")) + self.db.settings["buffers"].append("home_timeline") + self.nb.SetSelection(1) + self.nb.GetPage(1).list.list.SetFocus() + mentionsP = buffers.basePanel(self.nb, self, "mentions", self.twitter.twitter.get_mentions_timeline, sound="mention_received.ogg") + self.nb.InsertSubPage(account_index, mentionsP, _("Mentions")) + self.db.settings["buffers"].append("mentions") + dms = buffers.dmPanel(self.nb, self, "direct_messages", self.twitter.twitter.get_direct_messages, sound="dm_received.ogg") + self.nb.InsertSubPage(account_index, dms, _(u"Direct messages")) + self.db.settings["buffers"].append("direct_messages") + sent = buffers.basePanel(self.nb, self, "sent", self.twitter.twitter.get_user_timeline, argumento=self.db.settings["user_name"]) + self.nb.InsertSubPage(account_index, sent, _(u"Sent")) + self.db.settings["buffers"].append("sent") +# If the user has enabled favs from config. + if config.main["other_buffers"]["show_favourites"] == True: + log.debug("Getting Favorited tweets...") + favs = buffers.basePanel(self.nb, self, "favs", self.twitter.twitter.get_favorites) + self.nb.InsertSubPage(account_index, favs, _(u"Favourites")) + self.db.settings["buffers"].append("favs") +# If followers are enabled from config. + if config.main["other_buffers"]["show_followers"] == True: + log.debug("Getting followers...") + followers = buffers.peoplePanel(self.nb, self, "followers", self.twitter.twitter.get_followers_list, argumento=self.db.settings["user_name"], sound="update_followers.ogg") + self.nb.InsertSubPage(account_index, followers, _(u"Followers")) + self.db.settings["buffers"].append("followers") + # Same here but for friends. + if config.main["other_buffers"]["show_friends"] == True: + log.debug("Getting friends...") + friends = buffers.peoplePanel(self.nb, self, "friends", self.twitter.twitter.get_friends_list, argumento=self.db.settings["user_name"]) + self.nb.InsertSubPage(account_index, friends, _(u"Friends")) + self.db.settings["buffers"].append("friends") + if config.main["other_buffers"]["show_blocks"] == True: + blocked = buffers.peoplePanel(self.nb, self, "blocks", self.twitter.twitter.list_blocks) + self.nb.InsertSubPage(account_index, blocked, _(u"Blocked users")) + self.db.settings["buffers"].append("blocks") + if config.main["other_buffers"]["show_muted_users"] == True: + muteds = buffers.peoplePanel(self.nb, self, "muteds", self.twitter.twitter.get_muted_users_list) + self.nb.InsertSubPage(account_index, muteds, _(u"Muted users")) + self.db.settings["buffers"].append("muteds") + if config.main["other_buffers"]["show_events"] == True: + evt = buffers.eventsPanel(self.nb, self, sound="new_event.ogg") + self.nb.InsertSubPage(account_index, evt, _(u"Events")) + self.db.settings["buffers"].append("events") + searches = buffers.emptyPanel(self.nb) + self.nb.InsertSubPage(account_index, searches, _(u"Searches")) + self.db.settings["buffers"].append("searches") + + for i in config.main["other_buffers"]["tweet_searches"]: + self.nb.InsertSubPage(self.db.settings["buffers"].index("searches"), buffers.searchPanel(self.nb, self, "%s-search" % (i,), q=i, count=100), _(u"Search for %s" % (i,))) + self.db.settings["buffers"].append("%s-search" % (i,)) + timelines = buffers.emptyPanel(self.nb) + self.nb.InsertSubPage(account_index, timelines, _(u"Timelines")) + self.db.settings["buffers"].append("timelines") + for i in config.main["other_buffers"]["timelines"]: + self.nb.InsertSubPage(self.db.settings["buffers"].index("timelines"), buffers.basePanel(self.nb, self, i, self.twitter.twitter.get_user_timeline, argumento=i, timeline=True, sound="tweet_timeline.ogg"), _(u"Timeline for %s") % i) + self.db.settings["buffers"].append(i) + lists = buffers.emptyPanel(self.nb) + self.nb.InsertSubPage(account_index, lists, _(u"Lists")) + self.db.settings["buffers"].append("lists") + for i in config.main["other_buffers"]["lists"]: + self.nb.InsertSubPage(self.db.settings["buffers"].index("lists"), buffers.listPanel(self.nb, self, i+"-list", argumento=twitter.utils.find_list(i, self.db.settings["lists"])), _(u"List for %s") % i) + self.db.settings["buffers"].append(i+"-list") + + ## favourites timelines + favs_timelines = buffers.emptyPanel(self.nb) + self.nb.InsertSubPage(account_index, favs_timelines, _(U"Favourites timelines")) + self.db.settings["buffers"].append("favourites_timelines") + for i in config.main["other_buffers"]["favourites_timelines"]: + self.nb.InsertSubPage(self.db.settings["buffers"].index("favourites_timelines"), buffers.favsPanel(self.nb, self, i+"favs", argumento=i, sound="favourites_timeline_updated.ogg"), _(u"Favourites for %s") % i,) + self.db.settings["buffers"].append(i+"favs") + self.fav_stream = RepeatingTimer(180, self.get_fav_buffers) + self.fav_stream.start() + self.sizer.Add(self.nb, 0, wx.ALL, 5) + panel.SetSizer(self.sizer) + self.SetClientSize(self.sizer.CalcMin()) + self.Bind(event.MyEVT_STARTED, self.onInit) + self.Bind(event.EVT_RESULT, self.onMemberAdded) + call_threaded(self.init, run_streams=True) + + def init(self, run_streams=False): + """ Calls the start_stream function for each stream tab.""" + deleted = 0 + for i in range(0, self.nb.GetPageCount()): + if self.nb.GetPage(i).type == "account" or self.nb.GetPage(i).type == "empty": continue + if i == self.nb.GetPageCount() and deleted > 0: + i = i-1 + deleted = deleted-1 + log.debug("Starting stream for %s..." % self.nb.GetPage(i).name_buffer) + info_event = event.infoEvent(event.EVT_STARTED, 1) + try: + if self.nb.GetPage(i).type == "search": + self.nb.GetPage(i).timer = RepeatingTimer(180, self.nb.GetPage(i).load_search) + self.nb.GetPage(i).timer.start() + num = self.nb.GetPage(i).start_streams() + info_event.SetItem(i, num) + wx.PostEvent(self, info_event) + except TwythonError as e: + continue + except UnicodeDecodeError: # This happens when there is a bad internet connection + continue + output.speak(_(u"Ready")) + + if run_streams == True: + self.get_home() + self.get_tls() + self.check_streams = RepeatingTimer(config.main["general"]["time_to_check_streams"], self.check_stream_up) + self.check_streams.start() + # If all it's done, then play a nice sound saying that all it's OK. + sound.player.play("ready.ogg") + + def remove_list(self, id): + for i in range(0, self.nb.GetPageCount()): + if self.nb.GetPage(i).type == "list": + if self.nb.GetPage(i).argumento == id: + pos = self.nb.GetCurrentPage().remove_invalid_buffer() + if pos != None: + self.nb.DeletePage(pos) + self.onMemberAdded() + + def onMemberAdded(self, ev): + self.stream2.disconnect() + del self.stream2 + self.get_tls() + + def get_fav_buffers(self): + for i in config.main["other_buffers"]["favourites_timelines"]: + num = self.nb.GetPage(self.db.settings["buffers"].index(i+"favs")).start_streams() + if num > 0: output.speak(_(u"%s favourites from %s") % (nun, i)) + + def setup_twitter(self, panel): + """ Setting up the connection for twitter, or authenticate if the config file has valid credentials.""" +# try: + self.twitter.login(self.user_key, self.user_secret) + self.logging_in_twblue(panel) + log.info("Authorized in Twitter.") + del self.user_key; del self.user_secret +# except: +# dlg1 = wx.MessageDialog(panel, _(u"Connection error. Try again later."), _(u"Error!"), wx.ICON_ERROR) +# dlg1.ShowModal() +# self.Close(True) + + def get_home(self): + """ Gets the home stream, that manages home timeline, mentions, direct messages and sent.""" + try: + self.stream = twitter.buffers.stream.streamer(application.app_key, application.app_secret, config.main["twitter"]["user_key"], config.main["twitter"]["user_secret"], parent=self) + call_threaded(self.stream.user) + except: + self.stream.disconnect() + + def start_lists(self): + for i in range(0, self.nb.GetPageCount()): + if self.nb.GetPage(i).type == "list": self.nb.GetPage(i).retrieve_ids() + + def get_tls(self): + """ Setting the stream for individual user timelines.""" + try: + self.stream2 = twitter.buffers.indibidual.streamer(application.app_key, application.app_secret, config.main["twitter"]["user_key"], config.main["twitter"]["user_secret"], parent=self) + # The self.ids contains all IDS for the follow argument of the stream. + ids = "" + # If we have more than 0 items on a list, then. + for i in config.main["other_buffers"]["timelines"]: + ids = ids+self.db.settings[i][0]["user"]["id_str"]+", " + for i in range(0, self.nb.GetPageCount()): + if self.nb.GetPage(i).type == "list": + for z in self.nb.GetPage(i).users: + ids+= str(z)+", " + if ids != "": + # try: + call_threaded(self.stream2.statuses.filter, follow=ids) + # except: + # pass + except: + self.stream2.disconnect() + + def check_stream_up(self): + try: + urllib2.urlopen("http://74.125.228.231", timeout=5) + except urllib2.URLError: + if self.stream.connected == True: self.stream.disconnect() + if hasattr(self, "stream2") and self.stream2.connected: self.stream2.disconnect() + if config.main["general"]["announce_stream_status"] == True: output.speak(_(u"Streams disconnected. TW Blue will try to reconnect in a minute.")) + return + if self.stream.connected == False: + del self.stream + if config.main["general"]["announce_stream_status"] == True: output.speak(_(u"Reconnecting streams...")) + call_threaded(self.init) + self.get_home() + if hasattr(self, "stream2") and self.stream2.connected == False: + log.debug("Trying reconnects the timelines stream...") + del self.stream2 + self.get_tls() + + ### Events + + def edit_keystrokes(self, ev=None): + if hasattr(self, "keyboard_handler"): + dlg = keystrokeEditorGUI.keystrokeEditor(parent=self, keyboard_handler=self.keyboard_handler) + else: + dlg = keystrokeEditorGUI.keystrokeEditor(parent=self) + dlg.ShowModal() + dlg.Destroy() + + def search(self, ev=None): + dlg = dialogs.search.searchDialog() + if dlg.ShowModal() == wx.ID_OK: + term = dlg.term.GetValue() + if dlg.tweets.GetValue() == True: + search =buffers.searchPanel(self.nb, self, "%s-search" % (term,), q=term, count=100) + self.nb.InsertSubPage(self.db.settings["buffers"].index("searches"), search, _(u"search for %s") % (term,)) + self.db.settings["buffers"].append("%s-search" % (term,)) + config.main["other_buffers"]["tweet_searches"].append(term) + elif dlg.users.GetValue() == True: + search =buffers.searchUsersPanel(self.nb, self, "%s_search" % (term,), q=term, count=20) + self.nb.InsertSubPage(self.db.settings["buffers"].index("searches"), search, _(u"search users for %s") % (term,)) + self.db.settings["buffers"].append("%s_search" % (term,)) + timer = RepeatingTimer(180, search.load_search) + timer.start() + num = search.start_streams() + search.put_items(num) + dlg.Destroy() + + def learn_sounds(self, ev): + SoundsTutorial.gui.soundsTutorial().ShowModal() + + def view_user_lists(self, ev=None): + userDlg = dialogs.utils.selectUserDialog(parent=self, title=_(u"Select the user")) + if userDlg.ShowModal() == wx.ID_OK: + user = userDlg.cb.GetValue() + else: + return + dlg = dialogs.lists.userListViewer(self, user) + dlg.ShowModal() + userDlg.Destroy() + dlg.Destroy() + + def add_to_list(self, ev=None): + userDlg = dialogs.utils.selectUserDialog(parent=self, title=_(u"Select the user")) + if userDlg.ShowModal() == wx.ID_OK: + user = userDlg.cb.GetValue() + else: + return + dlg = dialogs.lists.addUserListDialog(self) + if dlg.ShowModal() == wx.ID_OK: + try: + list = self.twitter.twitter.add_list_member(list_id=self.db.settings["lists"][dlg.lista.get_selected()]["id"], screen_name=user) + older_list = twitter.utils.find_item(self.db.settings["lists"][dlg.lista.get_selected()]["id"], self.db.settings["lists"]) + if list["mode"] == "private": + self.db.settings["lists"].pop(older_list) + self.db.settings["lists"].append(list) + except TwythonError as e: + output.speak("error %s: %s" % (e.error_code, e.msg)) + userDlg.Destroy() + dlg.Destroy() + + def remove_from_list(self, ev=None): + userDlg = dialogs.utils.selectUserDialog(parent=self, title=_(u"Select the user")) + if userDlg.ShowModal() == wx.ID_OK: + user = userDlg.cb.GetValue() + else: + return + dlg = dialogs.lists.removeUserListDialog(self) + if dlg.ShowModal() == wx.ID_OK: + try: + list = self.twitter.twitter.delete_list_member(list_id=self.db.settings["lists"][dlg.get_selected()]["id"], screen_name=user) + older_list = twitter.utils.find_item(self.db.settings["lists"][dlg.get_selected()]["id"], self.db.settings["lists"]) + if list["mode"] == "private": + self.db.settings["lists"].pop(older_list) + self.db.settings["lists"].append(list) + except TwythonError as e: + output.speak("error %s: %s" % (e.error_code, e.msg)) + userDlg.Destroy() + dlg.Destroy() + + def list_manager(self, ev): + dlg = dialogs.lists.listViewer(self) + dlg.ShowModal() + self.stream2.disconnect() + del self.stream2 + self.get_tls() + dlg.Destroy() + + def onInit(self, ev): + if self.nb.GetPage(ev.GetItem()[0]).type != "search" or self.nb.GetPage(ev.GetItem()[0]).type != "favourites_timeline": self.nb.GetPage(ev.GetItem()[0]).put_items(ev.GetItem()[1]) + + def preferences(self, ev=None): + dlg = dialogs.configuration.configurationDialog(self) + dlg.ShowModal() + dlg.Destroy() + + def update_profile(self, ev=None): + dialogs.update_profile.updateProfile(self).ShowModal() + + def onManual(self, ev): + lang = localization.get("documentation") + os.chdir("documentation/%s" % (lang,)) + webbrowser.open("manual.html") + os.chdir("../../") + + def onChangelog(self, ev): + lang = localization.get("documentation") + os.chdir("documentation/%s" % (lang,)) + webbrowser.open("changes.html") + os.chdir("../../") + + def onVisit_website(self, ev): + webbrowser.open("http://twblue.com.mx") + + def onReportBug(self, ev): + issueReporterGUI.reportBug(self.db.settings["user_name"]).ShowModal() + + def onCheckForUpdates(self, ev): + updater.update_manager.check_for_update(msg=True) + + def details(self, ev=None): + """ This function shows details for the selected user.""" + dlg = dialogs.utils.selectUserDialog(parent=self, title=_(u"User details")) + if dlg.ShowModal() == wx.ID_OK: + dialogs.show_user.showUserProfile(self.twitter, dlg.cb.GetValue()).ShowModal() + dlg.Destroy() + + def delete(self, ev=None): + """ Deleting a tweet or direct message.""" + if self.nb.GetCurrentPage().name_buffer != "followers" and self.nb.GetCurrentPage() != "friends" and self.nb.GetCurrentPage().name_buffer != "events": + dlg = wx.MessageDialog(self, _(u"Do you really want to delete this message? It will be eliminated from Twitter as well."), _(u"Delete"), wx.ICON_QUESTION|wx.YES_NO) + if dlg.ShowModal() == wx.ID_YES: + self.nb.GetCurrentPage().destroy_status(wx.EVT_MENU) + else: + return + + def onPageChanged(self, ev): + """ Announces the new title for the tab.""" + if platform.system() == "Darwin": + output.speak(self.nb.GetPageText(self.nb.GetSelection())+",", True) + + def skip_blank_pages(self, forward=True): + if self.nb.GetCurrentPage().type == "account" or self.nb.GetCurrentPage().type == "empty" and (self.showing == False or platform.system() == "Darwin"): + self.nb.AdvanceSelection(forward) + + def close(self, ev=None): +# if ev == None or hasattr(ev, "GetLoggingOff") == False: + dlg = wx.MessageDialog(self, _(u"Do you really want to close TW Blue?"), _(u"Exit"), wx.YES_NO|wx.ICON_QUESTION) + if dlg.ShowModal() == wx.ID_YES: + self.exit() + dlg.Destroy() +# elif hasattr(ev, "GetLoggingOff") == True: +# self.exit() + + def exit(self, event=None): + config.main.write() + log.debug("Exiting...") + try: + self.check_streams.cancel() + except AttributeError: + pass + sound.player.cleaner.cancel() + try: + self.stream.disconnect() + log.debug("Stream disconnected.") + except: + pass + try: + self.stream2.disconnect() + log.debug(u"Timelines stream disconnected.") + except: + pass + wx.GetApp().ExitMainLoop() + + def onFollow(self, ev=None): + """ Opens the follow dialog.""" + dialogs.follow.follow(self.nb.GetCurrentPage(), "follow").ShowModal() + + def onUnfollow(self, ev=None): + """ Opens the unfollow dialog.""" + dialogs.follow.follow(self.nb.GetCurrentPage(), "unfollow").ShowModal() + + def onMute(self, ev=None): + """ Opens the unfollow dialog.""" + dialogs.follow.follow(self.nb.GetCurrentPage(), "mute").ShowModal() + + def onUnmute(self, ev=None): + """ Opens the unfollow dialog.""" + dialogs.follow.follow(self.nb.GetCurrentPage(), "unmute").ShowModal() + + def onReport(self, ev=None): + """ Opens the report dialog, to report as spam to the specified user.""" + dialogs.follow.follow(self.nb.GetCurrentPage(), "report").ShowModal() + + def onBlock(self, ev=None): + """ Opens the "block" dialog, to block the user that you want.""" + dialogs.follow.follow(self.nb.GetCurrentPage(), "block").ShowModal() + + def onUnblock(self, ev=None): + """ Opens the "block" dialog, to block the user that you want.""" + dialogs.follow.follow(self.nb.GetCurrentPage(), "unblock").ShowModal() + + def action(self, ev=None): + dialogs.follow.follow(self.nb.GetCurrentPage()).ShowModal() + + def compose(self, ev=None): + """ Opens the new tweet dialog.""" + self.nb.GetCurrentPage().post_status(ev) + + def reply(self, ev=None): + """ Opens the response dialog.""" + self.nb.GetCurrentPage().onResponse(ev) + + def dm(self, ev=None): + """ Opens the DM Dialog.""" + # The direct_messages buffer has a method to post a diret messages while the other tabs does has not it. + if self.nb.GetCurrentPage().name_buffer == "direct_messages": + self.nb.GetCurrentPage().onResponse(ev) + elif self.nb.GetCurrentPage().name_buffer == "events": return + else: +# dialogs.message.dm(_(u"Direct message to %s ") % (self.db.settings[self.nb.GetCurrentPage().name_buffer][self.nb.GetCurrentPage().get_selected()]["user"]["screen_name"]), "", "", self.nb.GetCurrentPage()).ShowModal() + self.nb.GetCurrentPage().onDm(ev) + + def retweet(self, ev=None): + if self.nb.GetCurrentPage().name_buffer != "direct_messages" and self.nb.GetCurrentPage().name_buffer != "followers" and self.nb.GetCurrentPage().name_buffer != "friends" and self.nb.GetCurrentPage().name_buffer != "events": + self.nb.GetCurrentPage().onRetweet(ev) + + def view(self, ev=None): + tweet = self.nb.GetCurrentPage().get_message(dialog=True) + dialogs.message.viewTweet(tweet).ShowModal() + + def fav(self, ev=None): + if self.nb.GetCurrentPage().name_buffer != "direct_messages" and self.nb.GetCurrentPage().name_buffer != "followers" and self.nb.GetCurrentPage().name_buffer != "friends": + try: + self.twitter.twitter.create_favorite(id=self.db.settings[self.nb.GetCurrentPage().name_buffer][self.nb.GetCurrentPage().list.get_selected()]["id"]) + sound.player.play("favourite.ogg") + except TwythonError as e: + output.speak(_(u"Error while adding to favourites."), True) + sound.player.play("error.ogg") + + def unfav(self, ev=None): + if self.nb.GetCurrentPage().name_buffer != "direct_messages" and self.nb.GetCurrentPage().name_buffer != "followers" and self.nb.GetCurrentPage().name_buffer != "friends": + try: + self.twitter.twitter.destroy_favorite(id=self.db.settings[self.nb.GetCurrentPage().name_buffer][self.nb.GetCurrentPage().list.get_selected()]["id"]) + except TwythonError as e: + output.speak(_(u"Error while removing from favourites."), True) + sound.player.play("error.ogg") + + def open_timeline(self, ev=None): + dlg = dialogs.utils.selectUserDialog(self, _(u"Individual timeline")) + if dlg.ShowModal() == wx.ID_OK: + user = twitter.utils.if_user_exists(self.twitter.twitter, dlg.cb.GetValue()) + if user == None: + wx.MessageDialog(None, _(u"The user does not exist"), _(u"Error"), wx.ICON_ERROR).ShowModal() + dlg.Destroy() + return + if user not in config.main["other_buffers"]["timelines"]: + config.main["other_buffers"]["timelines"].append(user) + else: + wx.MessageDialog(None, _(u"There's currently a timeline for this user. You are not able to open another"), _(u"Existing timeline"), wx.ICON_ERROR).ShowModal() + dlg.Destroy() + return + sound.player.play("create_timeline.ogg") + st = buffers.basePanel(self.nb, self, user, self.twitter.twitter.get_user_timeline, argumento=user, sound="ready.ogg", timeline=True) + num = st.start_streams() + self.db.settings["buffers"].append(user) + if num == 0: + wx.MessageDialog(None, _(u"This user has no tweets. You can't open a timeline for this user"), _(u"Error!"), wx.ICON_ERROR).ShowModal() + self.db.settings.pop(user) +# self.nb.DeletePage(self.db.settings["buffers"].index(user)) + self.db.settings["buffers"].remove(user) + else: + self.nb.InsertSubPage(self.db.settings["buffers"].index("timelines"), st, _(u"Timeline for %s") % (user)) + st.put_items(num) + st.sound = "tweet_timeline.ogg" + self.stream2.disconnect() + del self.stream2 + self.get_tls() + dlg.Destroy() + + def favs_timeline(self, ev=None): + dlg = dialogs.utils.selectUserDialog(self, _(u"List of favourites")) + if dlg.ShowModal() == wx.ID_OK: + user = twitter.utils.if_user_exists(self.twitter.twitter, dlg.cb.GetValue()) + if user == None: + wx.MessageDialog(None, _(u"The user does not exist"), _(u"Error"), wx.ICON_ERROR).ShowModal() + dlg.Destroy() + return + if user not in config.main["other_buffers"]["favourites_timelines"]: + config.main["other_buffers"]["favourites_timelines"].append(user) + else: + wx.MessageDialog(None, _(u"There's already a list of favourites for this user. You can't create another."), _(u"Existing list"), wx.ICON_ERROR).ShowModal() + dlg.Destroy() + return + sound.player.play("create_timeline.ogg") + st = buffers.favsPanel(self.nb, self, user+"-favs", argumento=user, sound="favourites_timeline_updated.ogg") + self.nb.InsertSubPage(self.db.settings["buffers"].index("favourites_timelines"), st, _(u"Favourites for %s") % (user)) + num = st.start_streams() + self.db.settings["buffers"].append(user+"-favs") + if num == 0: + wx.MessageDialog(None, _(u"This user has no favourites. You can't create a list of favourites for this user."), _(u"Error!"), wx.ICON_ERROR).ShowModal() + self.db.settings.pop(user+"-favs") + self.nb.DeletePage(self.db.settings["buffers"].index(user+"-favs")) + self.db.settings["buffers"].remove(user+"-favs") + st.put_items(num) + dlg.Destroy() + + def onAbout(self, ev=None): + info = wx.AboutDialogInfo() + info.SetName(application.name) + info.SetVersion(application.version) + info.SetDescription(application.description) + info.SetCopyright(application.copyright) + info.SetTranslators(application.translators) +# info.SetLicence(application.licence) + info.AddDeveloper(application.author) + wx.AboutBox(info) + + def delete_buffer(self, ev=None): + pos = self.nb.GetCurrentPage().remove_buffer() + if pos != None: + self.stream2.disconnect() + del self.stream2 + self.nb.DeletePage(self.nb.GetSelection()) + sound.player.play("delete_timeline.ogg") + self.get_tls() + + def delete_invalid_timeline(self): + pos = self.nb.GetCurrentPage().remove_invalid_buffer() + if pos != None: + self.nb.DeletePage(self.nb.GetSelection()) + + ### Hidden Window + def left(self, event=None): + num = self.nb.GetSelection() + if num == 0: + self.nb.ChangeSelection(self.nb.GetPageCount()-1) + else: + self.nb.SetSelection(num-1) + while self.nb.GetCurrentPage().type == "account" or self.nb.GetCurrentPage().type == "empty": self.skip_blank_pages(False) + try: + msg = _(u"%s, %s of %s") % (self.nb.GetPageText(self.nb.GetSelection()), self.nb.GetCurrentPage().list.get_selected()+1, self.nb.GetCurrentPage().list.get_count()) + except: + msg = _(u"%s. Empty") % (self.nb.GetPageText(self.nb.GetSelection())) + output.speak(msg, 1) + + def right(self, event=None): + num = self.nb.GetSelection() + if num+1 == self.nb.GetPageCount(): + self.nb.SetSelection(0) + else: + self.nb.SetSelection(num+1) + while self.nb.GetCurrentPage().type == "account" or self.nb.GetCurrentPage().type == "empty": self.skip_blank_pages(True) + try: + msg = _(u"%s, %s of %s") % (self.nb.GetPageText(self.nb.GetSelection()), self.nb.GetCurrentPage().list.get_selected()+1, self.nb.GetCurrentPage().list.get_count()) + except: + msg = _(u"%s. Empty") % (self.nb.GetPageText(self.nb.GetSelection())) + output.speak(msg, 1) + + def show_hide(self, ev=None): +# if platform.system() == "Linux" or platform.system() == "Darwin": return + keymap = {} + for i in config.main["keymap"]: + if hasattr(self, i): + keymap[config.main["keymap"][i]] = getattr(self, i) + if self.showing == True: + self.keyboard_handler = WXKeyboardHandler(self) + self.keyboard_handler.register_keys(keymap) + self.Hide() + self.showing = False + else: + self.keyboard_handler.unregister_keys(keymap) + del self.keyboard_handler + self.Show() + self.showing = True + + def toggle_global_mute(self, event=None): + if config.main["sound"]["global_mute"] == False: + config.main["sound"]["global_mute"] = True + output.speak(_(u"Global mute on")) + elif config.main["sound"]["global_mute"] == True: + config.main["sound"]["global_mute"] = False + output.speak(_(u"Global mute off")) + + def toggle_mute(self, event=None): + buffer = self.nb.GetCurrentPage().name_buffer + if buffer not in config.main["other_buffers"]["muted_buffers"]: + config.main["other_buffers"]["muted_buffers"].append(buffer) + output.speak(_(u"Buffer mute on")) + elif buffer in config.main["other_buffers"]["muted_buffers"]: + config.main["other_buffers"]["muted_buffers"].remove(buffer) + output.speak(_(u"Buffer mute off")) + + def toggle_autoread(self, event=None): + buffer = self.nb.GetCurrentPage().name_buffer + if buffer not in config.main["other_buffers"]["autoread_buffers"]: + config.main["other_buffers"]["autoread_buffers"].append(buffer) + output.speak(_(u"The auto-reading of new tweets is enabled for this buffer")) + elif buffer in config.main["other_buffers"]["autoread_buffers"]: + config.main["other_buffers"]["autoread_buffers"].remove(buffer) + output.speak(_(u"The auto-reading of new tweets is disabled for this buffer")) + + def repeat_item(self): + output.speak(self.nb.GetCurrentPage().get_message(), 1) + + def copy_to_clipboard(self, event=None): + output.Copy(self.nb.GetCurrentPage().get_message()) + output.speak(_(u"Copied")) + + def clear_list(self, event=None): + self.nb.GetCurrentPage().interact("clear_list") + + def conversation_up(self, evt=None): + if config.main["general"]["reverse_timelines"] == True and evt == None: + self.conversation_down("down") + return + id = self.db.settings[self.nb.GetCurrentPage().name_buffer][self.nb.GetCurrentPage().list.get_selected()]["in_reply_to_status_id_str"] + pos = twitter.utils.find_previous_reply(id, self.db.settings["home_timeline"]) + if pos != None: + self.nb.ChangeSelection(1) + self.nb.GetCurrentPage().list.select_item(pos) + msg = _(u"%s") % (self.nb.GetCurrentPage().get_message()) + output.speak(msg) + + def conversation_down(self, evt=None): + if config.main["general"]["reverse_timelines"] == True and evt == None: + self.conversation_up("up") + return + id = self.db.settings[self.nb.GetCurrentPage().name_buffer][self.nb.GetCurrentPage().list.get_selected()]["id_str"] +# pos = twitter.utils.find_next_reply(id, self.db.settings["home_timeline"]) + pos = twitter.utils.find_next_reply(id, self.db.settings["home_timeline"]) + if pos != None: + self.nb.ChangeSelection(1) + self.nb.GetCurrentPage().list.select_item(pos) + msg = _(u"%s") % (self.nb.GetCurrentPage().get_message()) + output.speak(msg) + + def go_home(self): + self.nb.GetCurrentPage().list.select_item(0) + try: + output.speak(self.nb.GetCurrentPage().get_message(), 1) + except: + pass + + def go_end(self): + self.nb.GetCurrentPage().list.select_item(self.nb.GetCurrentPage().list.get_count()-1) + try: + output.speak(self.nb.GetCurrentPage().get_message(), 1) + except: + pass + + def go_page_up(self): + if self.nb.GetCurrentPage().list.get_selected <= 20: + index = 0 + else: + index = self.nb.GetCurrentPage().list.get_selected() - 20 + self.nb.GetCurrentPage().list.select_item(index) + try: + output.speak(self.nb.GetCurrentPage().get_message(), 1) + except: + pass + + def go_page_down(self): + if self.nb.GetCurrentPage().list.get_selected() >= self.nb.GetCurrentPage().list.get_count() - 20: + index = self.nb.GetCurrentPage().list.get_count()-1 + else: + index = self.nb.GetCurrentPage().list.get_selected() + 20 + self.nb.GetCurrentPage().list.select_item(index) + try: + output.speak(self.nb.GetCurrentPage().get_message(), 1) + except: + pass + + def volume_up(self): + self.nb.GetCurrentPage().interact("volume_up") + + def volume_down(self): + self.nb.GetCurrentPage().interact("volume_down") + + def url(self): + self.nb.GetCurrentPage().interact("url") + + def audio(self): + self.nb.GetCurrentPage().interact("audio") + + def up(self, event=None): + pos = self.nb.GetCurrentPage().list.get_selected() + index = self.nb.GetCurrentPage().list.get_selected()-1 + try: + self.nb.GetCurrentPage().list.select_item(index) + except: + pass + if pos == self.nb.GetCurrentPage().list.get_selected(): + sound.player.play("limit.ogg", False) + try: + output.speak(self.nb.GetCurrentPage().get_message(), 1) + except: + pass + + def down(self, event=None): + index = self.nb.GetCurrentPage().list.get_selected()+1 + pos = self.nb.GetCurrentPage().list.get_selected() + try: + self.nb.GetCurrentPage().list.select_item(index) + except: + pass + if pos == self.nb.GetCurrentPage().list.get_selected(): + sound.player.play("limit.ogg", False) + try: + output.speak(self.nb.GetCurrentPage().get_message(), 1) + except: + pass + + def get_more_items(self): + self.nb.GetCurrentPage().get_more_items() + + def connect_streams(self): + disconnect = False + if self.stream.connected == False: + output.speak(_(u"Trying to reconnect the main stream")) + disconnect = True + del self.stream + call_threaded(self.init) + self.get_home() + if hasattr(self, "stream2") and self.stream2.connected == False: + output.speak(_(u"Trying to reconnect the buffers stream")) + disconnect = True + log.debug("Trying reconnects the timelines stream...") + del self.stream2 + self.get_tls() + if disconnect == False: + output.speak(_(u"All streams are working properly")) + +### Close App + def Destroy(self): + self.sysTray.Destroy() + super(mainFrame, self).Destroy() diff --git a/src/gui/sysTrayIcon.py b/src/gui/sysTrayIcon.py new file mode 100644 index 00000000..d000d2a4 --- /dev/null +++ b/src/gui/sysTrayIcon.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +""" A systray for TW Blue """ +############################################################ +# Copyright (c) 2014 José Manuel Delicado Alcolea +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ + +import wx +import application +import paths +import os + +class SysTrayIcon(wx.TaskBarIcon): + + def __init__(self, frame): + super(SysTrayIcon, self).__init__() + self.frame=frame + icon=wx.Icon(os.path.join(paths.app_path(), "icon.ico"), wx.BITMAP_TYPE_ICO) + self.SetIcon(icon, application.name) + self.menu=wx.Menu() + item=self.menu.Append(wx.ID_ANY, _(u"Tweet")) + self.Bind(wx.EVT_MENU, frame.compose, item) + item=self.menu.Append(wx.ID_ANY, _(u"Preferences")) + self.Bind(wx.EVT_MENU, frame.preferences, item) + item=self.menu.Append(wx.ID_ANY, _(u"Update profile")) + self.Bind(wx.EVT_MENU, frame.update_profile, item) + item=self.menu.Append(wx.ID_ANY, _(u"Show / hide")) + self.Bind(wx.EVT_MENU, frame.show_hide, item) + item=self.menu.Append(wx.ID_ANY, _(u"Documentation")) + self.Bind(wx.EVT_MENU, frame.onManual, item) + item=self.menu.Append(wx.ID_ANY, _(u"Check for updates")) + self.Bind(wx.EVT_MENU, frame.onCheckForUpdates, item) + item=self.menu.Append(wx.ID_ANY, _(u"Exit")) + self.Bind(wx.EVT_MENU, frame.close, item) + self.Bind(wx.EVT_TASKBAR_RIGHT_DOWN, self.onRightClick) + self.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.onLeftClick) + + def onRightClick(self, evt): + self.PopupMenu(self.menu) + + def onLeftClick(self, evt): + if (self.frame.showing): + self.frame.SetFocus() + else: + self.frame.onShow_hide() + + def Destroy(self): + self.menu.Destroy() + super(SysTrayIcon, self).Destroy() diff --git a/src/icon.ico b/src/icon.ico new file mode 100644 index 00000000..ab0f6bd0 Binary files /dev/null and b/src/icon.ico differ diff --git a/src/issueReporter/__init__.py b/src/issueReporter/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/issueReporter/constants.py b/src/issueReporter/constants.py new file mode 100644 index 00000000..c228d285 --- /dev/null +++ b/src/issueReporter/constants.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +categories = ["General"] +reproducibilities = ["always", "sometimes", "random", "have not tried", "unable to duplicate"] +severities = ["block", "crash", "major", "minor", "tweak", "text", "trivial", "feature"] diff --git a/src/issueReporter/get_logs.py b/src/issueReporter/get_logs.py new file mode 100644 index 00000000..faad2b02 --- /dev/null +++ b/src/issueReporter/get_logs.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import paths +import os + +def get_logs_files(): + files = {} + for i in os.listdir(paths.logs_path()): + if i == "debug.log": continue + f = open(paths.logs_path(i), "r") + files[i] = f.readlines() + f.close() + try: os.remove(paths.logs_path("tracebacks.log")) + except: pass + return files + diff --git a/src/issueReporter/gui.py b/src/issueReporter/gui.py new file mode 100644 index 00000000..a65693ea --- /dev/null +++ b/src/issueReporter/gui.py @@ -0,0 +1,124 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx +import application +from suds.client import Client +import constants + +class reportBug(wx.Dialog): + def __init__(self, user_name): + self.user = "informador" + self.user_name = user_name + self.password = "contrasena" + self.url = application.report_bugs_url + self.categories = [_(u"General")] + self.reproducibilities = [_(u"always"), _(u"sometimes"), _(u"random"), _(u"have not tried"), _(u"unable to duplicate")] + self.severities = [_(u"block"), _(u"crash"), _(u"major"), _(u"minor"), _(u"tweak"), _(u"text"), _(u"trivial"), _(u"feature")] + wx.Dialog.__init__(self, None, -1) + self.SetTitle(_(u"Report an error")) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + categoryLabel = wx.StaticText(panel, -1, _(u"Select a category"), size=wx.DefaultSize) + self.category = wx.ComboBox(panel, -1, choices=self.categories, style=wx.CB_READONLY) + self.category.SetSize(self.category.GetBestSize()) + self.category.SetSelection(0) + categoryB = wx.BoxSizer(wx.HORIZONTAL) + categoryB.Add(categoryLabel, 0, wx.ALL, 5) + categoryB.Add(self.category, 0, wx.ALL, 5) + self.category.SetFocus() + sizer.Add(categoryB, 0, wx.ALL, 5) + summaryLabel = wx.StaticText(panel, -1, _(u"Briefly describe what happened. You will be able to thoroughly explain it later"), size=wx.DefaultSize) + self.summary = wx.TextCtrl(panel, -1) + dc = wx.WindowDC(self.summary) + dc.SetFont(self.summary.GetFont()) + self.summary.SetSize(dc.GetTextExtent("a"*80)) +# self.summary.SetFocus() + summaryB = wx.BoxSizer(wx.HORIZONTAL) + summaryB.Add(summaryLabel, 0, wx.ALL, 5) + summaryB.Add(self.summary, 0, wx.ALL, 5) + sizer.Add(summaryB, 0, wx.ALL, 5) + descriptionLabel = wx.StaticText(panel, -1, _(u"Here, you can describe the bug in detail"), size=wx.DefaultSize) + self.description = wx.TextCtrl(panel, -1, style=wx.TE_MULTILINE) + dc = wx.WindowDC(self.description) + dc.SetFont(self.description.GetFont()) + (x, y, z) = dc.GetMultiLineTextExtent("0"*2000) + self.description.SetSize((x, y)) + descBox = wx.BoxSizer(wx.HORIZONTAL) + descBox.Add(descriptionLabel, 0, wx.ALL, 5) + descBox.Add(self.description, 0, wx.ALL, 5) + sizer.Add(descBox, 0, wx.ALL, 5) + reproducibilityLabel = wx.StaticText(panel, -1, _(u"how often does this bug happen?"), size=wx.DefaultSize) + self.reproducibility = wx.ComboBox(panel, -1, choices=self.reproducibilities, style=wx.CB_READONLY) + self.reproducibility.SetSelection(3) + self.reproducibility.SetSize(self.reproducibility.GetBestSize()) + reprB = wx.BoxSizer(wx.HORIZONTAL) + reprB.Add(reproducibilityLabel, 0, wx.ALL, 5) + reprB.Add(self.reproducibility, 0, wx.ALL, 5) + sizer.Add(reprB, 0, wx.ALL, 5) + severityLabel = wx.StaticText(panel, -1, _(u"Select the importance that you think this bug has")) + self.severity = wx.ComboBox(panel, -1, choices=self.severities, style=wx.CB_READONLY) + self.severity.SetSize(self.severity.GetBestSize()) + self.severity.SetSelection(3) + severityB = wx.BoxSizer(wx.HORIZONTAL) + severityB.Add(severityLabel, 0, wx.ALL, 5) + severityB.Add(self.severity, 0, wx.ALL, 5) + sizer.Add(severityB, 0, wx.ALL, 5) + self.agree = wx.CheckBox(panel, -1, _(u"I know that the TW Blue bug system will get my Twitter username to contact me and fix the bug quickly")) + self.agree.SetValue(False) + sizer.Add(self.agree, 0, wx.ALL, 5) + ok = wx.Button(panel, wx.ID_OK, _(u"Send report")) + ok.Bind(wx.EVT_BUTTON, self.onSend) + ok.SetDefault() + cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Cancel")) + btnBox = wx.BoxSizer(wx.HORIZONTAL) + btnBox.Add(ok, 0, wx.ALL, 5) + btnBox.Add(cancel, 0, wx.ALL, 5) + sizer.Add(btnBox, 0, wx.ALL, 5) + panel.SetSizer(sizer) + self.SetClientSize(sizer.CalcMin()) + + def onSend(self, ev): + if self.summary.GetValue() == "" or self.description.GetValue() == "": + wx.MessageDialog(self, _(u"You must fill out both fields"), _(u"Error"), wx.OK|wx.ICON_ERROR).ShowModal() + return + if self.agree.GetValue() == False: + wx.MessageDialog(self, _(u"You need to mark the checkbox to provide us your twitter username to contact to you if is necessary."), _(u"Error"), wx.ICON_ERROR).ShowModal() + return + try: + client = Client(self.url) + issue = client.factory.create('IssueData') + issue.project.name = "TW Blue" + issue.project.id = 0 + issue.summary = self.summary.GetValue(), + issue.description = "Reported by @%s\n\n" % (self.user_name) + self.description.GetValue() + issue.category = constants.categories[self.category.GetSelection()] + issue.reproducibility.name = constants.reproducibilities[self.reproducibility.GetSelection()] + issue.severity.name = constants.severities[self.severity.GetSelection()] + issue.priority.name = "normal" + issue.view_state.name = "public" + issue.resolution.name = "open" + issue.projection.name = "none" + issue.eta.name = "eta" + issue.status.name = "new" + id = client.service.mc_issue_add(self.user, self.password, issue) + wx.MessageDialog(self, _(u"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") % (id), _(u"reported"), wx.OK).ShowModal() + self.EndModal(wx.ID_OK) + except: + wx.MessageDialog(self, _(u"Something unexpected occurred while trying to report the bug. Please, try again later"), _(u"Error while reporting"), wx.ICON_ERROR|wx.OK).ShowModal() + self.EndModal(wx.ID_CANCEL) \ No newline at end of file diff --git a/src/keyboard_handler/__init__.py b/src/keyboard_handler/__init__.py new file mode 100644 index 00000000..144513d0 --- /dev/null +++ b/src/keyboard_handler/__init__.py @@ -0,0 +1,3 @@ +from main import KeyboardHandler, KeyboardHandlerError +#from wx_handler import WXKeyboardHandler +__all__ = ["KeyboardHandler", "KeyboardHandlerError", "WXKeyboardHandler", "WXPanelKeyboardHandler"] diff --git a/src/keyboard_handler/global_handler.py b/src/keyboard_handler/global_handler.py new file mode 100644 index 00000000..2e798f71 --- /dev/null +++ b/src/keyboard_handler/global_handler.py @@ -0,0 +1,7 @@ +import platform +if platform.system() == 'Linux': + from linux import LinuxKeyboardHandler as GlobalKeyboardHandler +elif platform.system() == 'Windows': + from wx_handler import WXKeyboardHandler as GlobalKeyboardHandler +elif platform.system() == 'Darwin': + from osx import OSXKeyboardHandler as GlobalKeyboardHandler diff --git a/src/keyboard_handler/linux.py b/src/keyboard_handler/linux.py new file mode 100644 index 00000000..ba69d7ff --- /dev/null +++ b/src/keyboard_handler/linux.py @@ -0,0 +1,58 @@ +from main import KeyboardHandler +import threading +import thread +import pyatspi +def parse(s): + """parse a string like control+f into (modifier, key). +Unknown modifiers will return ValueError.""" + m = 0 + lst = s.split('+') + if not len(lst): return (0, s) +#Are these right? + d = { + "shift": 1< 1: #more than one key, parse error + raise ValueError, 'unknown modifier %s' % lst[0] + return (m, lst[0].lower()) +class AtspiThread(threading.Thread): + def run(self): + pyatspi.Registry.registerKeystrokeListener(handler, kind=(pyatspi.KEY_PRESSED_EVENT,), + mask=pyatspi.allModifiers()) + pyatspi.Registry.start() +#the keys we registered +keys = {} +def handler(e): + m,k = e.modifiers,e.event_string.lower() +#not sure why we can't catch control+f. Try to fix it. + if (not e.is_text) and e.id >= 97 <= 126: + k = chr(e.id) + if (m,k) not in keys: return False + thread.start_new(keys[(m,k)], ()) + return True #don't pass it on +class LinuxKeyboardHandler(KeyboardHandler): + def __init__(self, *args, **kwargs): + KeyboardHandler.__init__(self, *args, **kwargs) + t = AtspiThread() + t.start() + def register_key(self, key, function): + """key will be a string, such as control+shift+f. +We need to convert that, using parse_key, +into modifier and key to put into our dictionary.""" +#register key so we know if we have it on event receive. + t = parse(key) + keys[t] = function +#if we got this far, the key is valid. + KeyboardHandler.register_key(self, key, function) + + def unregister_key (self, key, function): + KeyboardHandler.unregister_key(self, key, function) + del keys[parse(key)] diff --git a/src/keyboard_handler/main.py b/src/keyboard_handler/main.py new file mode 100644 index 00000000..ea040f73 --- /dev/null +++ b/src/keyboard_handler/main.py @@ -0,0 +1,88 @@ +import platform +import time + +class KeyboardHandlerError (Exception): pass + +class KeyboardHandler(object): + + def __init__(self, repeat_rate=0.0, *args, **kwargs): + self.repeat_rate = repeat_rate #How long between accepting the same keystroke? + self._last_key = None + self._last_keypress_time = 0 + super(KeyboardHandler, self).__init__(*args, **kwargs) + self.active_keys = {} + if not hasattr(self, 'replacement_mods'): + self.replacement_mods = {} + if not hasattr(self, 'replacement_keys'): + self.replacement_keys = {} + + def register_key (self, key, function): + if key in self.active_keys: + raise KeyboardHandlerError, "Key %s is already registered to a function" % key + if not callable(function): + raise TypeError, "Must provide a callable to be invoked upon keypress" + self.active_keys[key] = function + + def unregister_key (self, key, function): + try: + if self.active_keys[key] != function: + raise KeyboardHandlerError, "key %s is not registered to that function" % key + except KeyError: + raise KeyboardHandlerError, "Key %s not currently registered" + del(self.active_keys[key]) + + def unregister_all_keys(self): + for key in list(self.active_keys): + self.unregister_key(key, self.active_keys[key]) + + def handle_key (self, key): + if self.repeat_rate and key == self._last_key and time.time() - self._last_keypress_time < self.repeat_rate: + return + try: + function = self.active_keys[key] + except KeyError: + return + self._last_key = key + self._last_keypress_time = time.time() + return function() + + def register_keys(self, keys): + """Given a mapping of keystrokes to functions, registers all keystrokes""" + for k in keys: + self.register_key(k, keys[k]) + + def unregister_keys(self, keys): + """Given a mapping of keys to their functions, unregisters all provided keys.""" + for k in keys: + self.unregister_key(k, keys[k]) + + def standardize_key(self, key): + """Takes a keystroke and places it in a standard case and order in a list.""" + working = key.split('+') + working = [i.lower() for i in working] + answer = [] + if "control" in working: + answer.append("control") + if "win" in working: + answer.append("win") + if "alt" in working: + answer.append("alt") + if "shift" in working: + answer.append("shift") + if working[-1] not in answer: + answer.append(working[-1]) + return answer + + def standardize_keymap(self, keymap): + """Given a keymap, returns the keymap standardized.""" + full = {} + for i in keymap: + answer = "" + new = self.standardize_key(keymap[i]) + for (c, j) in enumerate(new): + if c < len(new)-1: + answer = "%s%s+" % (answer, j) + else: + answer = "%s%s" % (answer, j) + full[i] = answer + return full diff --git a/src/keyboard_handler/osx.py b/src/keyboard_handler/osx.py new file mode 100644 index 00000000..12884859 --- /dev/null +++ b/src/keyboard_handler/osx.py @@ -0,0 +1,56 @@ +from AppKit import * +from PyObjCTools import AppHelper +from Carbon.CarbonEvt import RegisterEventHotKey, GetApplicationEventTarget +from Carbon.Events import cmdKey, controlKey +import struct +from threading import Thread + +from main import KeyboardHandler + +kEventHotKeyPressedSubtype = 6 +kEventHotKeyReleasedSubtype = 9 + +class OSXKeyboardHandler(KeyboardHandler): + + def __init__(self): + super(OSXKeyboardHandler, self).__init__() + self.replacement_keys = dict() + self.app = KeyboardCapturingNSApplication.alloc().init() + self._event_thread = Thread(target=AppHelper.runEventLoop) + self._event_thread.start() + + def register_key (self, key, function): + super(OSXKeyboardHandler, self).register_key(key, function) + k, m = self.parse_key(key) + key_id = RegisterEventHotKey(k, m, (0, 0), GetApplicationEventTarget(), 0) + self.key_ids[key] = key_id + + def unregister_key (self, key, function): + super(OSXKeyboardHandler, self).unregister_key(key, function) + key_id = self.key_ids[key] + raise NotImplementedError + + def parse_key (self, key): + key=key.split("+") + #replacements + #Modifier keys: + for index, item in enumerate(key[0:-1]): + if self.replacement_mods.has_key(item): + key[index] = self.replacement_mods[item] + if self.replacement_keys.has_key(key[-1]): + key[-1] = self.replacement_keys[key[-1]] + elif len(key[-1])==1: + key[-1] = ord(str(key[-1]))-36 + mods = 0 + for i in key[:-1]: + mods = mods|i + return [key[-1], mods] + +class KeyboardCapturingNSApplication(NSApplication): + + def sendEvent_(self, theEvent): + if theEvent.type() == NSSystemDefined and theEvent.subtype() == kEventHotKeyPressedSubtype: + self.activateIgnoringOtherApps_(True) + NSRunAlertPanel(u'Hot Key Pressed', u'Hot Key Pressed', None, None, None) + super(NSApplication, self).sendEvent_(theEvent) + diff --git a/src/keyboard_handler/windows.py b/src/keyboard_handler/windows.py new file mode 100644 index 00000000..4197400b --- /dev/null +++ b/src/keyboard_handler/windows.py @@ -0,0 +1,40 @@ +import win32api +import win32con + +from main import KeyboardHandler + +class WindowsKeyboardHandler(KeyboardHandler): + + def __init__ (self, *args, **kwargs): + super(WindowsKeyboardHandler, self).__init__(*args, **kwargs) + #Setup the replacement dictionaries. + for i in dir(win32con): + if i.startswith("VK_"): + key = i[3:].lower() + self.replacement_keys[key] = getattr(win32con, i) + elif i.startswith("MOD_"): + key = i[4:].lower() + self.replacement_mods[key] = getattr(win32con, i) + self.replacement_keys .update(dict(pageup=win32con.VK_PRIOR, pagedown=win32con.VK_NEXT)) + + def parse_key (self, keystroke, separator="+"): + keystroke = str(keystroke) #We don't want unicode + keystroke = [self.keycode_from_key(i) for i in keystroke.split(separator)] + mods = 0 + for i in keystroke[:-1]: + mods = mods | i #or everything together + return (mods, keystroke[-1]) + + def keycode_from_key(self, key): + if key in self.replacement_mods: + return self.replacement_mods[key] + if key in self.replacement_keys: + return self.replacement_keys[key] + if len(key) == 1: + return win32api.VkKeyScanEx(key, win32api.GetKeyboardLayout()) + + def is_key_pressed(self, key): + """Returns if the given key was pressed. Requires an active message loop or will simply give if the key was pressed recently.""" + key = self.keycode_from_key(key) + return win32api.GetAsyncKeyState(key) + diff --git a/src/keyboard_handler/wx_handler.py b/src/keyboard_handler/wx_handler.py new file mode 100644 index 00000000..55c24208 --- /dev/null +++ b/src/keyboard_handler/wx_handler.py @@ -0,0 +1,119 @@ +import functools +import wx +import platform +from main import KeyboardHandler + +__all__ = ['WXKeyboardHandler', 'WXControlKeyboardHandler'] + + +def call_after(func): + def wrapper(*args, **kwargs): + wx.CallAfter(func, *args, **kwargs) + functools.update_wrapper(wrapper, func) + return wrapper + + +class BaseWXKeyboardHandler(KeyboardHandler): + + def __init__(self, *args, **kwargs): + super(BaseWXKeyboardHandler, self).__init__(*args, **kwargs) + #Setup the replacement dictionaries. + for i in dir(wx): + if i.startswith('WXK_'): + key = i[4:].lower() + self.replacement_keys[key] = getattr(wx, i) + elif i.startswith('MOD_'): + key = i[4:].lower() + self.replacement_mods[key] = getattr(wx, i) + + def parse_key (self, keystroke, separator="+"): + keystroke = [self.keycode_from_key(i) for i in keystroke.split(separator)] + mods = 0 + for i in keystroke[:-1]: + mods = mods | i #or everything together + return (mods, keystroke[-1]) + + def keycode_from_key(self, key): + if key in self.replacement_mods: + result = self.replacement_mods[key] + elif key in self.replacement_keys: + result = self.replacement_keys[key] + if result >= 277: + result -= 277 + elif len(key) == 1: + result = ord(key.upper()) + print "result: ", result + return result + + + +#try: +if platform.system() == "Windows": + from windows import WindowsKeyboardHandler as keyboard_handler +elif platform.system() == "Linux": + from linux import LinuxKeyboardHandler as keyboard_handler +elif platform.system() == "Darwin": + from osx import OSXKeyboardHandler as keyboard_handler + +class WXKeyboardHandler(keyboard_handler): + def __init__ (self, parent, *args, **kwargs): + super(WXKeyboardHandler, self).__init__(*args, **kwargs) + self.parent = parent + self.key_ids = {} + + @call_after + def register_key(self, key, function): + super(WXKeyboardHandler, self).register_key(key, function) + key_id = wx.NewId() + parsed = self.parse_key(key) + self.parent.RegisterHotKey(key_id, *parsed) + self.parent.Bind(wx.EVT_HOTKEY, lambda evt: self.process_key(evt, key_id), id=key_id) + self.key_ids[key] = key_id + + @call_after + def unregister_key (self, key, function): + super(WXKeyboardHandler, self).unregister_key(key, function) + if key not in self.key_ids: + return #there's nothing we can do. + key_id = self.key_ids[key] + self.parent.UnregisterHotKey(key_id) + self.parent.Unbind( wx.EVT_HOTKEY, id=key_id) + self.key_ids.pop(key) + + def process_key (self, evt, id): + evt.Skip() + key_ids = self.key_ids.keys() + for i in key_ids: + if self.key_ids.get(i) == id: + self.handle_key(i) + +class WXControlKeyboardHandler(wx.StaticText, KeyboardHandler): + + def __init__(self, parent=None, *a, **k): + wx.StaticText.__init__(self, parent=parent) + KeyboardHandler.__init__(self, *a, **k) + self.wx_replacements = {} + for i in [d for d in dir(wx) if d.startswith('WXK_')]: + self.wx_replacements[getattr(wx, i)] = i[4:].lower() + self.Bind(wx.EVT_KEY_DOWN, self.process_key, self) + self.SetFocus() + + def process_key(self, evt): + keycode = evt.GetKeyCode() + keyname = self.wx_replacements.get(keycode, None) + modifiers = "" + replacements = ( (evt.ControlDown(), 'control+'), + (evt.AltDown(), 'alt+'), + (evt.ShiftDown(), 'shift+'), + (evt.MetaDown(), 'win+') + ) + for mod, ch in (replacements): + if mod: + modifiers += ch + if keyname is None: + if 27 < keycode < 256: + keyname = chr(keycode).lower() + else: + keyname = "(%s)unknown" % keycode + key = modifiers + keyname + self.handle_key(key) diff --git a/src/keystrokeEditor/__init__.py b/src/keystrokeEditor/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/keystrokeEditor/constants.py b/src/keystrokeEditor/constants.py new file mode 100644 index 00000000..c2b2a6fa --- /dev/null +++ b/src/keystrokeEditor/constants.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +actions = { +"up": _(u"Go up up on the current list"), +"down": _(u"Go down up on the current list"), +"left": _(u"Go to the previous tab"), +"right": _(u"Go to the next tab"), +"conversation_up": _(u"Move up one tweet in the conversation"), +"conversation_down": _(u"Move down one tweet in the conversation"), +"show_hide": _(u"Show the graphical interface"), +"compose": _(u"New tweet"), +"reply": _(u"Reply to a tweet"), +"retweet": _(u"Retweet"), +"dm": _(u"Send direct message"), +"fav": _(u"Mark as favourite"), +"unfav": _(u"Remove from favourites"), +"action": _(u"Open the actions dialogue"), +"details": _(u"See user details"), +"view": _(u"Show tweet"), +"close": _(u"Quit"), +"open_timeline": _(u"Open user timeline"), +"delete_buffer": _(u"Remove buffer"), +"url": _(u"Open URL on the current tweet, or further information for a friend or follower"), +"audio": _(u"Attempt to play audio"), +"volume_up": _(u"Increase volume by 5%"), +"volume_down": _(u"Decrease volume by 5%"), +"go_home": _(u"Go to the first element on the list"), +"go_end": _(u"Go to the last element on the list"), +"go_page_up": _(u"Move 20 elements up on the current list"), +"go_page_down": _(u"Move 20 elements down on the current list"), +"update_profile": _(u"Edit profile"), +"delete": _(u"Remove a tweet or direct message"), +"clear_list": _(u"Empty the buffer removing all the elements"), +"repeat_item": _(u"Listen the current message"), +"copy_to_clipboard": _(u"Copy to clipboard"), +"add_to_list": _(u"Add to list"), +"remove_from_list": _(u"Remove from list"), +"toggle_mute": _(u"Mutes/unmutes the active buffer"), +"toggle_global_mute": _(u"Globally mute/unmute TW Blue"), +"toggle_autoread": _(u"toggles the automatic reading of incoming tweets in the active buffer"), +"search": _(u"Search on twitter"), +"edit_keystrokes": _(u"Shows the keystroke editor"), +"view_user_lists": _(u"Show lists for a specified user"), +} \ No newline at end of file diff --git a/src/keystrokeEditor/gui.py b/src/keystrokeEditor/gui.py new file mode 100644 index 00000000..de31b762 --- /dev/null +++ b/src/keystrokeEditor/gui.py @@ -0,0 +1,119 @@ +# -*- coding: utf-8 -*- +import config +import wx +import constants +from multiplatform_widgets import widgets +from constants import actions + +class keystrokeEditor(wx.Dialog): + def __init__(self, parent=None, keyboard_handler=None): + super(keystrokeEditor, self).__init__(parent=parent, id=-1, title=_(u"Keystroke editor")) + panel = wx.Panel(self) + self.parent = parent + self.keyboard_handler = keyboard_handler or None + self.actions = [] + sizer = wx.BoxSizer(wx.VERTICAL) + keysText = wx.StaticText(panel, -1, _(u"Select a keystroke to edit")) + self.keys = widgets.list(self, _(u"Action"), _(u"Keystroke"), style=wx.LC_REPORT|wx.LC_SINGLE_SEL, size=(400, 450)) + self.keys.list.SetFocus() + firstSizer = wx.BoxSizer(wx.HORIZONTAL) + firstSizer.Add(keysText) + firstSizer.Add(self.keys.list) + edit = wx.Button(panel, -1, _(u"Edit")) + self.Bind(wx.EVT_BUTTON, self.edit, edit) + edit.SetDefault() + + close = wx.Button(panel, wx.ID_CANCEL, _(u"Close")) + secondSizer = wx.BoxSizer(wx.HORIZONTAL) + secondSizer.Add(edit) + secondSizer.Add(close) + sizer.Add(firstSizer) + sizer.Add(secondSizer) + panel.SetSizerAndFit(sizer) + self.put_keystrokes() + + def put_keystrokes(self): + for i in config.main["keymap"]: + action = actions[i] + self.actions.append(i) + keystroke = config.main["keymap"][i] + self.keys.insert_item(False, *[action, keystroke]) + + def edit(self, ev): + action = self.actions[self.keys.get_selected()] + dlg = editKeystroke(self.parent, action, config.main["keymap"][action], self.keyboard_handler) + if dlg.ShowModal() == wx.ID_OK: + pos = self.keys.get_selected() + self.keys.clear() + self.put_keystrokes() + self.keys.select_item(pos) + # dlg.Destroy() + +class editKeystroke(wx.Dialog): + def __init__(self, parent, action, keystroke, keyboard_handler): + super(editKeystroke, self).__init__(parent=None, id=-1, title=_(u"Editing keystroke")) + self.parent = parent + self.keyboard_handler = keyboard_handler + self.action = action + self.keystroke = keystroke + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + self.control = wx.CheckBox(panel, -1, _(u"Control")) + self.alt = wx.CheckBox(panel, -1, _(u"Alt")) + self.shift = wx.CheckBox(panel, -1, _(u"Shift")) + self.win = wx.CheckBox(panel, -1, _(u"Windows")) + sizer1 = wx.BoxSizer(wx.HORIZONTAL) + sizer1.Add(self.control) + sizer1.Add(self.alt) + sizer1.Add(self.shift) + sizer1.Add(self.win) + charLabel = wx.StaticText(panel, -1, _(u"Key")) + self.key = wx.TextCtrl(panel, -1) +# self.key.SetMaxLength(1) + sizer2 = wx.BoxSizer(wx.HORIZONTAL) + sizer2.Add(charLabel) + sizer2.Add(self.key) + ok = wx.Button(panel, wx.ID_OK, _(u"OK")) + ok.SetDefault() + self.Bind(wx.EVT_BUTTON, self.ok, ok) + cancel = wx.Button(panel, wx.ID_CANCEL) + sizer3 = wx.BoxSizer(wx.HORIZONTAL) + sizer3.Add(ok) + sizer3.Add(cancel) + sizer.Add(sizer1) + sizer.Add(sizer2) + sizer.Add(sizer3) + panel.SetSizerAndFit(sizer) + self.set_default() + + def set_default(self): + for i in self.keystroke.split("+"): + if hasattr(self, i): + key = getattr(self, i) + key.SetValue(True) + self.key.SetValue(self.keystroke.split("+")[-1]) + + def ok(self, ev): + keys = [] + if self.win.GetValue() == False: + wx.MessageDialog(self, _(u"You need to use the Windows key"), _(u"Invalid keystroke"), wx.OK|wx.ICON_ERROR).ShowModal() + return + if self.control.GetValue() == True: + keys.append("control") + if self.win.GetValue() == True: + keys.append("win") + if self.alt.GetValue() == True: + keys.append("alt") + if self.shift.GetValue() == True: + keys.append("shift") + if self.key.GetValue() != "": + keys.append(self.key.GetValue()) + else: + wx.MessageDialog(self, _(u"You must provide a character for the keystroke"), _(u"Invalid keystroke"), wx.ICON_ERROR).ShowModal() + return + config.main["keymap"][self.action] = "+".join(keys) + if self.keyboard_handler != None: + self.keyboard_handler.unregister_key(self.keystroke, getattr(self.parent, self.action)) + self.keyboard_handler.register_key(config.main["keymap"][self.action], getattr(self.parent, self.action)) + + self.EndModal(wx.ID_OK) \ No newline at end of file diff --git a/src/languageHandler.py b/src/languageHandler.py new file mode 100644 index 00000000..3af9c6b3 --- /dev/null +++ b/src/languageHandler.py @@ -0,0 +1,180 @@ +import __builtin__ +import os +import sys +import ctypes +import locale +import gettext +import paths +import platform + +# A fix for the mac locales +#if platform.system() == 'Darwin': + +#a few Windows locale constants +LOCALE_SLANGUAGE=0x2 +LOCALE_SLANGDISPLAYNAME=0x6f + +curLang="en" + +def localeNameToWindowsLCID(localeName): + """Retreave the Windows locale identifier (LCID) for the given locale name + @param localeName: a string of 2letterLanguage_2letterCountry or or just 2letterLanguage + @type localeName: string + @returns: a Windows LCID + @rtype: integer + """ + #Windows Vista is able to convert locale names to LCIDs + func_LocaleNameToLCID=getattr(ctypes.windll.kernel32,'LocaleNameToLCID',None) + if func_LocaleNameToLCID is not None: + localeName=localeName.replace('_','-') + LCID=func_LocaleNameToLCID(unicode(localeName),0) + else: #Windows doesn't have this functionality, manually search Python's windows_locale dictionary for the LCID + localeName=locale.normalize(localeName) + if '.' in localeName: + localeName=localeName.split('.')[0] + LCList=[x[0] for x in locale.windows_locale.iteritems() if x[1]==localeName] + if len(LCList)>0: + LCID=LCList[0] + else: + LCID=0 + return LCID + +def getLanguageDescription(language): + """Finds out the description (localized full name) of a given local name""" + desc=None + if platform.system() == "Windows": + LCID=localeNameToWindowsLCID(language) + if LCID!=0: + buf=ctypes.create_unicode_buffer(1024) + if '_' not in language: + res=ctypes.windll.kernel32.GetLocaleInfoW(LCID,LOCALE_SLANGDISPLAYNAME,buf,1024) + else: + res=0 + if res==0: + res=ctypes.windll.kernel32.GetLocaleInfoW(LCID,LOCALE_SLANGUAGE,buf,1024) + desc=buf.value + elif platform.system() == "Linux" or not desc: + desc={ + "am":pgettext("languageName","Amharic"), + "an":pgettext("languageName","Aragonese"), + "es":pgettext("languageName","Spanish"), + "pt":pgettext("languageName","Portuguese"), + "ru":pgettext("languageName","Russian"), + "it":pgettext("languageName","italian"), + "tr":pgettext("languageName","Turkey"), + "gl":pgettext("languageName","Galician"), + "ca":pgettext("languageName","Catala"), + "eu":pgettext("languageName","Vasque"), + "pl":pgettext("languageName","polish"), + "ar":pgettext("languageName","Arabic"), + "ne":pgettext("languageName","Nepali"), + "sr":pgettext("languageName","Serbian (Latin)"), + }.get(language,None) + return desc + +def getAvailableLanguages(): + """generates a list of locale names, plus their full localized language and country names. + @rtype: list of tuples + """ + #Make a list of all the locales found in NVDA's locale dir + l=[x for x in os.listdir(paths.locale_path()) if not x.startswith('.')] + l=[x for x in l if os.path.isfile(paths.locale_path('%s/LC_MESSAGES/twblue.mo' % x))] + #Make sure that en (english) is in the list as it may not have any locale files, but is default + if 'en' not in l: + l.append('en') + l.sort() + #For each locale, ask Windows for its human readable display name + d=[] + for i in l: + desc=getLanguageDescription(i) + label="%s, %s"%(desc,i) if desc else i + d.append(label) + #include a 'user default, windows' language, which just represents the default language for this user account + l.append("system") + # Translators: the label for the Windows default NVDA interface language. + d.append(_("User default")) + #return a zipped up version of both the lists (a list with tuples of locale,label) + return zip(l,d) + +def makePgettext(translations): + """Obtaina pgettext function for use with a gettext translations instance. + pgettext is used to support message contexts, + but Python 2.7's gettext module doesn't support this, + so NVDA must provide its own implementation. + """ + if isinstance(translations, gettext.GNUTranslations): + def pgettext(context, message): + message = unicode(message) + try: + # Look up the message with its context. + return translations._catalog[u"%s\x04%s" % (context, message)] + except KeyError: + return message + else: + def pgettext(context, message): + return unicode(message) + return pgettext + +def setLanguage(lang): + system = platform.system() + global curLang + try: + if lang=="system": + if system == "Windows": + windowsLCID=ctypes.windll.kernel32.GetUserDefaultUILanguage() + localeName=locale.windows_locale[windowsLCID] + elif system == "Darwin": + import Foundation + localeName = Foundation.NSLocale.currentLocale().identifier() +# trans=gettext.translation('twblue', localedir=paths.locale_path(), languages=[localeName]) +# curLang=localeName + else: + localeName=locale.getdefaultlocale()[0] + trans=gettext.translation('twblue', localedir=paths.locale_path(), languages=[localeName]) + curLang=localeName + + else: + trans=gettext.translation("twblue", localedir=paths.locale_path(), languages=[lang]) + curLang=lang + localeChanged=False + #Try setting Python's locale to lang + try: + locale.setlocale(locale.LC_ALL, lang) + localeChanged=True + except: + pass + if not localeChanged and '_' in lang: + #Python couldn'tsupport the language_country locale, just try language. + try: + locale.setlocale(locale.LC_ALL, lang.split('_')[0]) + except: + pass + #Set the windows locale for this thread (NVDA core) to this locale. + if system == "Windows": + LCID=localeNameToWindowsLCID(lang) + ctypes.windll.kernel32.SetThreadLocale(LCID) + except IOError: + trans=gettext.translation("twblue",fallback=True) + curLang="en" + trans.install(unicode=True) + # Install our pgettext function. + __builtin__.__dict__["pgettext"] = makePgettext(trans) + +def getLanguage(): + return curLang + +def normalizeLanguage(lang): + """ + Normalizes a language-dialect string in to a standard form we can deal with. + Converts any dash to underline, and makes sure that language is lowercase and dialect is upercase. + """ + lang=lang.replace('-','_') + ld=lang.split('_') + ld[0]=ld[0].lower() + #Filter out meta languages such as x-western + if ld[0]=='x': + return None + if len(ld)>=2: + ld[1]=ld[1].upper() + return "_".join(ld) + diff --git a/src/libloader/__init__.py b/src/libloader/__init__.py new file mode 100644 index 00000000..b7635386 --- /dev/null +++ b/src/libloader/__init__.py @@ -0,0 +1,7 @@ +from .libloader import * + +__version__ = 0.1 +__author__ = 'Christopher Toth ' +__doc__ = """ +Quickly and easily load shared libraries from various platforms. Also includes a libloader.com module for loading com modules on Windows. +""" diff --git a/src/libloader/com.py b/src/libloader/com.py new file mode 100644 index 00000000..75d9ac8e --- /dev/null +++ b/src/libloader/com.py @@ -0,0 +1,21 @@ +from pywintypes import com_error +from win32com.client import gencache + +def prepare_gencache(): + gencache.is_readonly = False + gencache.GetGeneratePath() + + + +def load_com(*names): + result = None + for name in names: + try: + result = gencache.EnsureDispatch(name) + break + except com_error: + continue + if result is None: + raise com_error("Unable to load any of the provided com objects.") + return result + diff --git a/src/libloader/libloader.py b/src/libloader/libloader.py new file mode 100644 index 00000000..6ab2c0e2 --- /dev/null +++ b/src/libloader/libloader.py @@ -0,0 +1,56 @@ +import ctypes +import collections +import platform +import os + +TYPES = { + 'Linux': { + 'loader': ctypes.CDLL, + 'functype': ctypes.CFUNCTYPE, + 'prefix': 'lib', + 'extension': '.so' + }, + 'Darwin': { + 'loader': ctypes.CDLL, + 'functype': ctypes.CFUNCTYPE, + 'prefix': 'lib', + 'extension': '.dylib' + }, +} +if platform.system() == 'Windows': + TYPES['Windows'] = { + 'loader': ctypes.WinDLL, + 'functype': ctypes.WINFUNCTYPE, + 'prefix': "", + 'extension': '.dll' + } + +class LibraryLoadError(OSError): pass + +def load_library(library, x86_path='.', x64_path='.', *args, **kwargs): + lib = find_library_path(library, x86_path=x86_path, x64_path=x64_path) + loaded = _do_load(lib, *args, **kwargs) + if loaded is not None: + return loaded + raise LibraryLoadError('unable to load %r. Provided library path: %r' % (library, path)) + +def _do_load(file, *args, **kwargs): + loader = TYPES[platform.system()]['loader'] + return loader(file, *args, **kwargs) + +def find_library_path(libname, x86_path='.', x64_path='.'): + libname = '%s%s' % (TYPES[platform.system()]['prefix'], libname) + if platform.architecture()[0] == '64bit': + path = os.path.join(x64_path, libname) + else: + path = os.path.join(x86_path, libname) + ext = get_library_extension() + path = '%s%s' % (path, ext) + return os.path.abspath(path) + + +def get_functype(): + return TYPES[platform.system()]['functype'] + +def get_library_extension(): + return TYPES[platform.system()]['extension'] diff --git a/src/locales/EU/LC_MESSAGES/twblue.mo b/src/locales/EU/LC_MESSAGES/twblue.mo new file mode 100644 index 00000000..39e189f4 Binary files /dev/null and b/src/locales/EU/LC_MESSAGES/twblue.mo differ diff --git a/src/locales/EU/LC_MESSAGES/twblue.po b/src/locales/EU/LC_MESSAGES/twblue.po new file mode 100644 index 00000000..16473893 --- /dev/null +++ b/src/locales/EU/LC_MESSAGES/twblue.po @@ -0,0 +1,2460 @@ +msgid "" +msgstr "" +"Project-Id-Version: TW Blue 0.46\n" +"POT-Creation-Date: 2014-09-07 07:44+Hora de verano central (México)\n" +"PO-Revision-Date: 2014-09-07 15:09+0100\n" +"Last-Translator: Sukil Echenique \n" +"Language-Team: Sukil Etxenike Arizaleta \n" +"Language: eu\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.6.8\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" + +#: ../src\extra\AudioUploader\gui.py:31 ../src\gui\dialogs\message.py:169 +#: ../src\gui\dialogs\message.py:256 +msgid "Attach audio" +msgstr "Audioa atxiki" + +#: ../src\extra\AudioUploader\gui.py:38 ../src\extra\AudioUploader\gui.py:146 +#: ../src\extra\AudioUploader\gui.py:156 +msgid "Play" +msgstr "Erreproduzitu" + +#: ../src\extra\AudioUploader\gui.py:41 ../src\extra\AudioUploader\gui.py:75 +#: ../src\extra\AudioUploader\gui.py:80 ../src\extra\AudioUploader\gui.py:107 +msgid "Pause" +msgstr "Pausatu" + +#: ../src\extra\AudioUploader\gui.py:44 ../src\extra\AudioUploader\gui.py:103 +msgid "Record" +msgstr "Grabatu" + +#: ../src\extra\AudioUploader\gui.py:47 +msgid "Add an existing file" +msgstr "Fitxategi bat gehitu" + +#: ../src\extra\AudioUploader\gui.py:49 +msgid "Discard" +msgstr "Baztertu" + +#: ../src\extra\AudioUploader\gui.py:52 +msgid "Upload to" +msgstr "Nora igo:" + +#: ../src\extra\AudioUploader\gui.py:57 +msgid "Attach" +msgstr "Atxiki" + +#: ../src\extra\AudioUploader\gui.py:59 ../src\issueReporter\gui.py:88 +msgid "Cancel" +msgstr "Utzi" + +#: ../src\extra\AudioUploader\gui.py:77 ../src\extra\AudioUploader\gui.py:78 +msgid "Resume" +msgstr "Jarraitu" + +#: ../src\extra\AudioUploader\gui.py:95 +msgid "Stop recording" +msgstr "Grabazioa gelditu" + +#: ../src\extra\AudioUploader\gui.py:96 +msgid "Recording" +msgstr "Grabatzen" + +#: ../src\extra\AudioUploader\gui.py:101 ../src\extra\AudioUploader\gui.py:153 +msgid "Stopped" +msgstr "Gelditua" + +#: ../src\extra\AudioUploader\gui.py:128 ../src\gui\dialogs\message.py:218 +#: ../src\gui\dialogs\update_profile.py:87 +msgid "Discarded" +msgstr "Baztertua" + +#: ../src\extra\AudioUploader\gui.py:138 ../src\gui\buffers\base.py:303 +#: ../src\gui\buffers\base.py:315 +msgid "Playing..." +msgstr "Erreproduzitzen..." + +#: ../src\extra\AudioUploader\gui.py:142 +msgid "Stop" +msgstr "Gelditu" + +#: ../src\extra\AudioUploader\gui.py:161 +msgid "Recoding audio..." +msgstr "Audioa errekodifikatzen..." + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Audio Files (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" +msgstr "Audio fitxategiak(*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Select the audio file to be uploaded" +msgstr "Igo nahi duzun audio fitxategia hautatu" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:15 +msgid "File" +msgstr "Fitxategia" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:21 +msgid "Transferred" +msgstr "Bidalia" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:26 +msgid "Total file size" +msgstr "Artxibuaren neurria" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:31 +msgid "Transfer rate" +msgstr "Bidalketaren abiadura" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:36 +msgid "Time left" +msgstr "Gelditzen den denbora" + +#: ../src\extra\AudioUploader\utils.py:27 +msgid "%d day, " +msgstr "Egun %d, " + +#: ../src\extra\AudioUploader\utils.py:29 +msgid "%d days, " +msgstr "%d egun, " + +#: ../src\extra\AudioUploader\utils.py:31 +msgid "%d hour, " +msgstr "Ordu %d, " + +#: ../src\extra\AudioUploader\utils.py:33 +msgid "%d hours, " +msgstr "%d ordu, " + +#: ../src\extra\AudioUploader\utils.py:35 +msgid "%d minute, " +msgstr "Minutu %d, " + +#: ../src\extra\AudioUploader\utils.py:37 +msgid "%d minutes, " +msgstr "%d minutu, " + +#: ../src\extra\AudioUploader\utils.py:39 +msgid "%s second" +msgstr "Segundu %s" + +#: ../src\extra\AudioUploader\utils.py:41 +msgid "%s seconds" +msgstr "%s segundu" + +#: ../src\extra\SoundsTutorial\gui.py:11 +msgid "The tweet may contain a playable audio" +msgstr "Txioak audio bat eduki dezake" + +#: ../src\extra\SoundsTutorial\gui.py:12 +msgid "A timeline has been created" +msgstr "Denbora lerro bat egin da" + +#: ../src\extra\SoundsTutorial\gui.py:13 +msgid "A timeline has been deleted" +msgstr "Denbora lerro bat ezabatu da" + +#: ../src\extra\SoundsTutorial\gui.py:14 +msgid "You've received a direct message" +msgstr "Zuzeneko mezu bat jaso duzu" + +#: ../src\extra\SoundsTutorial\gui.py:15 +msgid "You've sent a direct message" +msgstr "Zuzeneko mezu bat bidali duzu" + +#: ../src\extra\SoundsTutorial\gui.py:16 +msgid "A bug has happened" +msgstr "Bug bat gertatu da" + +#: ../src\extra\SoundsTutorial\gui.py:17 +msgid "You've added a tweet to your favourites" +msgstr "Txio bat gogokoetara gehitu duzu" + +#: ../src\extra\SoundsTutorial\gui.py:18 +msgid "Someone's favourites have been updated" +msgstr "Norbaiten gogokoak eguneratuak izan dira" + +#: ../src\extra\SoundsTutorial\gui.py:19 +msgid "There are no more tweets to read" +msgstr "Ez dago txio gehiago" + +#: ../src\extra\SoundsTutorial\gui.py:20 +msgid "A list has a new tweet" +msgstr "Txio berri bat dago zerrenda batean" + +#: ../src\extra\SoundsTutorial\gui.py:21 +msgid "You can't add any more characters on the tweet" +msgstr "You can't add any more characters on the tweet" + +#: ../src\extra\SoundsTutorial\gui.py:22 +msgid "You've been mentioned " +msgstr "Aipatua izan zara" + +#: ../src\extra\SoundsTutorial\gui.py:23 +msgid "A new event has happened" +msgstr "Gertaera bat gertatu da" + +#: ../src\extra\SoundsTutorial\gui.py:24 +msgid "TW Blue is ready " +msgstr "TW Blue prest dago" + +#: ../src\extra\SoundsTutorial\gui.py:25 +msgid "You've replied" +msgstr "Erantzun duzu" + +#: ../src\extra\SoundsTutorial\gui.py:26 +msgid "You've retweeted" +msgstr "Bertxiotu duzu" + +#: ../src\extra\SoundsTutorial\gui.py:27 +msgid "A search has been updated" +msgstr "Bilaketa bat eguneratu da" + +#: ../src\extra\SoundsTutorial\gui.py:28 +msgid "There's a new tweet in the main buffer" +msgstr "Txio berri bat dago \"hasiera\" bufferrean" + +#: ../src\extra\SoundsTutorial\gui.py:29 +msgid "You've sent a tweet" +msgstr "Txio bat bidali duzu" + +#: ../src\extra\SoundsTutorial\gui.py:30 +msgid "There's a new tweet in a timeline" +msgstr "Denbora lerro batean txio bat dago" + +#: ../src\extra\SoundsTutorial\gui.py:31 +msgid "You have a new follower" +msgstr "Jarraitzaile berri bat duzu" + +#: ../src\extra\SoundsTutorial\gui.py:32 +msgid "You've turned the volume up or down" +msgstr "Bolumena jaitsi edo igo duzu" + +#: ../src\extra\SoundsTutorial\gui.py:36 +msgid "" +"It seems as though the currently used sound pack needs an update. %i fails " +"are still be required to use this function. Make sure to obtain the needed " +"lacking sounds or to contact with the sound pack developer." +msgstr "" +"Erabiltzen ari zaren soinu pakak eguneratze bat behar duela ematen du. %y " +"fitxategi falta dira funtzio hau erabiltzeko. Jaitsi behar diren soinuak edo " +"jarri harremanetan garatzailearekin." + +#: ../src\extra\SoundsTutorial\gui.py:36 ../src\extra\SpellChecker\gui.py:34 +#: ../src\gui\dialogs\show_user.py:63 ../src\gui\main.py:703 +#: ../src\gui\main.py:734 ../src\issueReporter\gui.py:98 +#: ../src\issueReporter\gui.py:101 +msgid "Error" +msgstr "Errorea" + +#: ../src\extra\SoundsTutorial\gui.py:38 ../src\gui\main.py:68 +msgid "Sounds tutorial" +msgstr "Soinuen tutoriala" + +#: ../src\extra\SoundsTutorial\gui.py:41 +msgid "Press enter to listen to the sound for the selected event" +msgstr "Sakatu enter aukeratutako gertaeraren soinua entzuteko" + +#: ../src\extra\SpellChecker\gui.py:34 +msgid "" +"A bug has happened. There are no dictionaries available for the selected " +"language in TW Blue" +msgstr "" +"Bug bat gertatu da. Ez dago hiztegiirik TW Bluen aukeratutako " +"hizkuntzarentzat" + +#: ../src\extra\SpellChecker\gui.py:38 +msgid "Mis-spelled word" +msgstr "Gaizki idatzitako hitza" + +#: ../src\extra\SpellChecker\gui.py:43 +msgid "Context" +msgstr "Kontestua" + +#: ../src\extra\SpellChecker\gui.py:48 +msgid "Suggestions" +msgstr "Iradokizunak" + +#: ../src\extra\SpellChecker\gui.py:53 +msgid "Ignore" +msgstr "Ezikusi" + +#: ../src\extra\SpellChecker\gui.py:55 +msgid "Ignore all" +msgstr "Guztiak ezikusi" + +#: ../src\extra\SpellChecker\gui.py:57 +msgid "Replace" +msgstr "Aldatu" + +#: ../src\extra\SpellChecker\gui.py:59 +msgid "Replace all" +msgstr "Guztiak aldatu" + +#: ../src\extra\SpellChecker\gui.py:78 +msgid "Mis-spelled word: %s" +msgstr "Gaizki idatzitako hitza: %s" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "Finished" +msgstr "Bukatua" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "The spelling review has finished." +msgstr "Ortografiaren egiaztapena bukatu da" + +#: ../src\extra\translator\gui.py:24 ../src\gui\dialogs\message.py:177 +#: ../src\gui\dialogs\message.py:264 ../src\gui\dialogs\message.py:350 +msgid "Translate message" +msgstr "Mezua itzuli" + +#: ../src\extra\translator\gui.py:27 +msgid "Source language" +msgstr "Jatorrizko hizkuntza" + +#: ../src\extra\translator\gui.py:30 +msgid "Target language" +msgstr "Helburu hizkuntza" + +#: ../src\extra\translator\translator.py:53 +msgid "Afrikaans" +msgstr "Africaans" + +#: ../src\extra\translator\translator.py:54 +msgid "Albanian" +msgstr "Albaniera" + +#: ../src\extra\translator\translator.py:55 +msgid "Amharic" +msgstr "amharera" + +#: ../src\extra\translator\translator.py:56 +msgid "Arabic" +msgstr "Arabiera" + +#: ../src\extra\translator\translator.py:57 +msgid "Armenian" +msgstr "Armeniera" + +#: ../src\extra\translator\translator.py:58 +msgid "Azerbaijani" +msgstr "Azerbaijanera" + +#: ../src\extra\translator\translator.py:59 +msgid "Basque" +msgstr "Euskara" + +#: ../src\extra\translator\translator.py:60 +msgid "Belarusian" +msgstr "Bielorrusiera" + +#: ../src\extra\translator\translator.py:61 +msgid "Bengali" +msgstr "Bengalera" + +#: ../src\extra\translator\translator.py:62 +msgid "Bihari" +msgstr "Bihari" + +#: ../src\extra\translator\translator.py:63 +msgid "Bulgarian" +msgstr "Bulgariera" + +#: ../src\extra\translator\translator.py:64 +msgid "Burmese" +msgstr "Birmaniera" + +#: ../src\extra\translator\translator.py:65 +msgid "Catalan" +msgstr "Katalana" + +#: ../src\extra\translator\translator.py:66 +msgid "Cherokee" +msgstr "Cherokee" + +#: ../src\extra\translator\translator.py:67 +msgid "Chinese" +msgstr "Txinera" + +#: ../src\extra\translator\translator.py:68 +msgid "Chinese_simplified" +msgstr "Txinera sinplifikatua" + +#: ../src\extra\translator\translator.py:69 +msgid "Chinese_traditional" +msgstr "Txinera tradizionala" + +#: ../src\extra\translator\translator.py:70 +msgid "Croatian" +msgstr "Kroaziera" + +#: ../src\extra\translator\translator.py:71 +msgid "Czech" +msgstr "Txekiera" + +#: ../src\extra\translator\translator.py:72 +msgid "Danish" +msgstr "Daniera" + +#: ../src\extra\translator\translator.py:73 +msgid "Dhivehi" +msgstr "Maldivera" + +#: ../src\extra\translator\translator.py:74 +msgid "Dutch" +msgstr "Neerlandera" + +#: ../src\extra\translator\translator.py:75 +msgid "English" +msgstr "Ingelesa" + +#: ../src\extra\translator\translator.py:76 +msgid "Esperanto" +msgstr "Esperantoa" + +#: ../src\extra\translator\translator.py:77 +msgid "Estonian" +msgstr "Estoniera" + +#: ../src\extra\translator\translator.py:78 +msgid "Filipino" +msgstr "Filipinera" + +#: ../src\extra\translator\translator.py:79 +msgid "Finnish" +msgstr "Suomiera" + +#: ../src\extra\translator\translator.py:80 +msgid "French" +msgstr "Frantsesa" + +#: ../src\extra\translator\translator.py:81 +msgid "Galician" +msgstr "Galiziera" + +#: ../src\extra\translator\translator.py:82 +msgid "Georgian" +msgstr "Georgiera" + +#: ../src\extra\translator\translator.py:83 +msgid "German" +msgstr "Alemana" + +#: ../src\extra\translator\translator.py:84 +msgid "Greek" +msgstr "Greziera" + +#: ../src\extra\translator\translator.py:85 +msgid "Guarani" +msgstr "Guaraniera" + +#: ../src\extra\translator\translator.py:86 +msgid "Gujarati" +msgstr "Gujaratera" + +#: ../src\extra\translator\translator.py:87 +msgid "Hebrew" +msgstr "Hebreera" + +#: ../src\extra\translator\translator.py:88 +msgid "Hindi" +msgstr "Hindi" + +#: ../src\extra\translator\translator.py:89 +msgid "Hungarian" +msgstr "Hungariera" + +#: ../src\extra\translator\translator.py:90 +msgid "Icelandic" +msgstr "Islandiera" + +#: ../src\extra\translator\translator.py:91 +msgid "Indonesian" +msgstr "Indonesiera" + +#: ../src\extra\translator\translator.py:92 +msgid "Inuktitut" +msgstr "Inuktitutera" + +#: ../src\extra\translator\translator.py:93 +msgid "Irish" +msgstr "Irlandera" + +#: ../src\extra\translator\translator.py:94 +msgid "Italian" +msgstr "Italiera" + +#: ../src\extra\translator\translator.py:95 +msgid "Japanese" +msgstr "Japoniera" + +#: ../src\extra\translator\translator.py:96 +msgid "Kannada" +msgstr "Kannada" + +#: ../src\extra\translator\translator.py:97 +msgid "Kazakh" +msgstr "Kazakera" + +#: ../src\extra\translator\translator.py:98 +msgid "Khmer" +msgstr "Khmerera" + +#: ../src\extra\translator\translator.py:99 +msgid "Korean" +msgstr "Koreera" + +#: ../src\extra\translator\translator.py:100 +msgid "Kurdish" +msgstr "Kurduera" + +#: ../src\extra\translator\translator.py:101 +msgid "Kyrgyz" +msgstr "Kirjizera" + +#: ../src\extra\translator\translator.py:102 +msgid "Laothian" +msgstr "Laosera" + +#: ../src\extra\translator\translator.py:103 +msgid "Latvian" +msgstr "Letoniera" + +#: ../src\extra\translator\translator.py:104 +msgid "Lithuanian" +msgstr "Lituaniera" + +#: ../src\extra\translator\translator.py:105 +msgid "Macedonian" +msgstr "Mazedoniera" + +#: ../src\extra\translator\translator.py:106 +msgid "Malay" +msgstr "Malaisiera" + +#: ../src\extra\translator\translator.py:107 +msgid "Malayalam" +msgstr "Malabarera" + +#: ../src\extra\translator\translator.py:108 +msgid "Maltese" +msgstr "Maltera" + +#: ../src\extra\translator\translator.py:109 +msgid "Marathi" +msgstr "Maratera" + +#: ../src\extra\translator\translator.py:110 +msgid "Mongolian" +msgstr "Mongoliera" + +#: ../src\extra\translator\translator.py:111 +msgid "Nepali" +msgstr "Nepalera" + +#: ../src\extra\translator\translator.py:112 +msgid "Norwegian" +msgstr "Norbegiera" + +#: ../src\extra\translator\translator.py:113 +msgid "Oriya" +msgstr "Oriya" + +#: ../src\extra\translator\translator.py:114 +msgid "Pashto" +msgstr "Paxtuera" + +#: ../src\extra\translator\translator.py:115 +msgid "Persian" +msgstr "Persiera" + +#: ../src\extra\translator\translator.py:116 +msgid "Polish" +msgstr "Poloniera" + +#: ../src\extra\translator\translator.py:117 +msgid "Portuguese" +msgstr "Portugesa" + +#: ../src\extra\translator\translator.py:118 +msgid "Punjabi" +msgstr "Punjabera" + +#: ../src\extra\translator\translator.py:119 +msgid "Romanian" +msgstr "Errumaniera" + +#: ../src\extra\translator\translator.py:120 +msgid "Russian" +msgstr "Errusiera" + +#: ../src\extra\translator\translator.py:121 +msgid "Sanskrit" +msgstr "Sanskrito" + +#: ../src\extra\translator\translator.py:122 +msgid "Serbian" +msgstr "Serbiera" + +#: ../src\extra\translator\translator.py:123 +msgid "Sindhi" +msgstr "Sindi" + +#: ../src\extra\translator\translator.py:124 +msgid "Sinhalese" +msgstr "Sinhala" + +#: ../src\extra\translator\translator.py:125 +msgid "Slovak" +msgstr "Eslobakiera" + +#: ../src\extra\translator\translator.py:126 +msgid "Slovenian" +msgstr "Eslobeniera" + +#: ../src\extra\translator\translator.py:127 +msgid "Spanish" +msgstr "Gaztelera" + +#: ../src\extra\translator\translator.py:128 +msgid "Swahili" +msgstr "Swahili" + +#: ../src\extra\translator\translator.py:129 +msgid "Swedish" +msgstr "Suediera" + +#: ../src\extra\translator\translator.py:130 +msgid "Tajik" +msgstr "Tajikera" + +#: ../src\extra\translator\translator.py:131 +msgid "Tamil" +msgstr "Tamilera" + +#: ../src\extra\translator\translator.py:132 +msgid "Tagalog" +msgstr "Taglo" + +#: ../src\extra\translator\translator.py:133 +msgid "Telugu" +msgstr "Telugu" + +#: ../src\extra\translator\translator.py:134 +msgid "Thai" +msgstr "Tailandiera" + +#: ../src\extra\translator\translator.py:135 +msgid "Tibetan" +msgstr "Tibetera" + +#: ../src\extra\translator\translator.py:136 +msgid "Turkish" +msgstr "Turkiera" + +#: ../src\extra\translator\translator.py:137 +msgid "Ukrainian" +msgstr "Ukrainera" + +#: ../src\extra\translator\translator.py:138 +msgid "Urdu" +msgstr "Urdu" + +#: ../src\extra\translator\translator.py:139 +msgid "Uzbek" +msgstr "Uzbekera" + +#: ../src\extra\translator\translator.py:140 +msgid "Uighur" +msgstr "Uigurrera" + +#: ../src\extra\translator\translator.py:141 +msgid "Vietnamese" +msgstr "Vietnamera" + +#: ../src\extra\translator\translator.py:142 +msgid "Welsh" +msgstr "Gales" + +#: ../src\extra\translator\translator.py:143 +msgid "Yiddish" +msgstr "Yiddisha" + +#: ../src\extra\translator\translator.py:150 +msgid "autodetect" +msgstr "Hauteman automatikoki" + +#: ../src\gui\buffers\base.py:54 +msgid "Client" +msgstr "Aplikazioa" + +#: ../src\gui\buffers\base.py:54 +msgid "Text" +msgstr "Testua" + +#: ../src\gui\buffers\base.py:54 ../src\gui\buffers\events.py:57 +msgid "Date" +msgstr "Data" + +#: ../src\gui\buffers\base.py:54 ../src\gui\buffers\people.py:39 +#: ../src\gui\buffers\user_searches.py:31 ../src\gui\dialogs\utils.py:36 +#: ../src\gui\main.py:154 +msgid "User" +msgstr "Erabiltzailea" + +#: ../src\gui\buffers\base.py:73 ../src\gui\buffers\base.py:192 +#: ../src\gui\buffers\events.py:58 ../src\gui\buffers\events.py:74 +#: ../src\gui\dialogs\message.py:332 ../src\gui\main.py:79 +#: ../src\gui\main.py:153 ../src\gui\sysTrayIcon.py:34 +msgid "Tweet" +msgstr "Txio" + +#: ../src\gui\buffers\base.py:75 ../src\gui\buffers\base.py:204 +#: ../src\gui\main.py:83 ../src\keystrokeEditor\constants.py:13 +msgid "Retweet" +msgstr "Bertxiotu" + +#: ../src\gui\buffers\base.py:77 ../src\gui\main.py:81 +msgid "Reply" +msgstr "erantzun" + +#: ../src\gui\buffers\base.py:79 ../src\gui\main.py:110 +msgid "Direct message" +msgstr "Zuzeneko mezua" + +#: ../src\gui\buffers\base.py:92 +msgid "Do you really want to delete this timeline?" +msgstr "Ziur zaude denbora lerro hau ezabatu nahi duzula?" + +#: ../src\gui\buffers\base.py:92 ../src\gui\buffers\favourites.py:41 +#: ../src\gui\buffers\lists.py:46 ../src\gui\buffers\trends.py:41 +#: ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Attention" +msgstr "Atentzioa" + +#: ../src\gui\buffers\base.py:104 +msgid "This buffer is not a timeline; it can't be deleted." +msgstr "buffer hau ez da denbora lerro bat, ezin da ezabatu." + +#: ../src\gui\buffers\base.py:184 ../src\gui\buffers\dm.py:44 +#: ../src\gui\buffers\people.py:54 +msgid "Direct message to %s" +msgstr "Zuzeneko mezua %s(r)i" + +#: ../src\gui\buffers\base.py:192 ../src\gui\buffers\events.py:74 +msgid "Write the tweet here" +msgstr "Idatzi txioa hemen" + +#: ../src\gui\buffers\base.py:204 +msgid "Would you like to add a comment to this tweet?" +msgstr "Txio honi iruzkin bat gehitu nahi al zenioke?" + +#: ../src\gui\buffers\base.py:207 +msgid "Add your comment to the tweet" +msgstr "Txioari iruzkin bat erantsi" + +#: ../src\gui\buffers\base.py:223 ../src\gui\buffers\people.py:62 +msgid "Reply to %s" +msgstr "%s(r)i erantzun" + +#: ../src\gui\buffers\base.py:268 +msgid "Opening URL..." +msgstr "URLa irekitzen..." + +#: ../src\gui\buffers\base.py:285 ../src\gui\buffers\events.py:118 +msgid "" +"Do you really want to empty this buffer? It's tweets will be removed from " +"the list but not from Twitter" +msgstr "" +"Ziur zaude buffer honen osagaiak ezabatu nahi dituzula? Txioak bufferretik " +"kenduko dira, baina ez twitterretik." + +#: ../src\gui\buffers\base.py:285 ../src\gui\buffers\events.py:118 +msgid "Empty buffer" +msgstr "Bufferraren osagaiak ezabatu" + +#: ../src\gui\buffers\base.py:290 ../src\gui\buffers\events.py:122 +msgid "Do you really want to delete this message?" +msgstr "Ziur zaude mezu hau ezabatu nahi duzula?" + +#: ../src\gui\buffers\base.py:290 ../src\gui\buffers\events.py:122 +#: ../src\gui\dialogs\lists.py:107 ../src\gui\main.py:91 +#: ../src\gui\main.py:577 +msgid "Delete" +msgstr "Ezabatu" + +#: ../src\gui\buffers\base.py:310 ../src\gui\buffers\base.py:321 +msgid "Unable to play audio." +msgstr "Ezin izan da audioa erreproduzitu" + +#: ../src\gui\buffers\base.py:312 +msgid "Audio stopped." +msgstr "Audioa gelditua" + +#: ../src\gui\buffers\events.py:40 +msgid "Empty" +msgstr "Hutsa" + +#: ../src\gui\buffers\events.py:57 +msgid "Event" +msgstr "Gertaera" + +#: ../src\gui\buffers\events.py:60 +msgid "Remove event" +msgstr "Gertaera ezabatu" + +#: ../src\gui\buffers\favourites.py:41 +msgid "Do you really want to delete this favourites timeline?" +msgstr "Ziur zaude gogokoen denbora lerro hau ezabatu nahi duzula?" + +#: ../src\gui\buffers\lists.py:46 ../src\gui\dialogs\lists.py:107 +msgid "Do you really want to delete this list?" +msgstr "Ziur zaude zerrenda hau ezabatu nahi duzula?" + +#: ../src\gui\buffers\panels.py:27 +msgid "Announce" +msgstr "Berriak" + +#: ../src\gui\buffers\people.py:44 +msgid "Mention" +msgstr "Aipamena" + +#: ../src\gui\buffers\trends.py:41 ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Do you really want to delete this search term?" +msgstr "Ziur zaude bilaketa hau ezabatu nahi duzula?" + +#: ../src\gui\dialogs\configuration.py:39 +msgid "Language" +msgstr "Hizkuntza" + +#: ../src\gui\dialogs\configuration.py:53 +msgid "Relative times" +msgstr "Denbora erlatiboa" + +#: ../src\gui\dialogs\configuration.py:57 +msgid "Activate Sapi5 when any other screen reader is not being run" +msgstr "Aktibatu SAPI 5 beste pantaila irakurgailu bat piztua ez dagoenean" + +#: ../src\gui\dialogs\configuration.py:60 +msgid "Activate the auto-start of the invisible interface" +msgstr "Interfaze ikusezinaren hasiera automatikoa aktibatu" + +#: ../src\gui\dialogs\configuration.py:64 +msgid "" +"API calls when the stream is started (One API call equals to 200 tweetts, " +"two API calls equals 400 tweets, etc):" +msgstr "" +"APIari deiak Streama hastean (dei bat = 200 txio, 2 dei = 400 txio, etab.):" + +#: ../src\gui\dialogs\configuration.py:72 +msgid "Items on each API call" +msgstr "item kopurua APIari dei bakoitzean " + +#: ../src\gui\dialogs\configuration.py:79 +msgid "" +"Inverted buffers: The newest tweets will be shown at the beginning of the " +"lists while the oldest at the end" +msgstr "" +"Buffer alderantzizkatuak: Txio berriak zerrenden hasieran agertuko dira, " +"zaharrenak bukaeran" + +#: ../src\gui\dialogs\configuration.py:94 +msgid "Show followers" +msgstr "Jarraitzaileak erakutsi" + +#: ../src\gui\dialogs\configuration.py:97 +msgid "Show friends" +msgstr "Lagunak erakutsi" + +#: ../src\gui\dialogs\configuration.py:100 +msgid "Show favourites" +msgstr "Gogokoak erakutsi" + +#: ../src\gui\dialogs\configuration.py:103 +msgid "Show blocked users" +msgstr "Blokeatutako erabiltzaileak erakutsi" + +#: ../src\gui\dialogs\configuration.py:106 +msgid "Show muted users" +msgstr "Isildutako erabiltzaileak ikusi" + +#: ../src\gui\dialogs\configuration.py:109 +msgid "Show events" +msgstr "Gertaerak erakutsi" + +#: ../src\gui\dialogs\configuration.py:119 +#: ../src\gui\dialogs\configuration.py:267 +msgid "Ignored clients" +msgstr "Aplikazio ezikusiak" + +#: ../src\gui\dialogs\configuration.py:125 +msgid "Add client" +msgstr "Aplikazioa gehitu" + +#: ../src\gui\dialogs\configuration.py:126 +msgid "Remove client" +msgstr "Aplikazioa kendu" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Add a new ignored client" +msgstr "Aplikazio ezikusi bat gehitu" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Enter the name of the client here" +msgstr "Sartu aplikazioaren izena hemen" + +#: ../src\gui\dialogs\configuration.py:154 +msgid "Volume" +msgstr "Bolumena" + +#: ../src\gui\dialogs\configuration.py:163 +msgid "Global mute" +msgstr "Isiltze orokorra" + +#: ../src\gui\dialogs\configuration.py:167 +msgid "Output device" +msgstr "Irteera dispositiboa" + +#: ../src\gui\dialogs\configuration.py:176 +msgid "Input device" +msgstr "Sarrera dispositiboa" + +#: ../src\gui\dialogs\configuration.py:184 +msgid "" +"If you've got a SndUp account, enter your API Key here. Whether the API Key " +"is wrong, the App will fail to upload anything to the server. Whether " +"there's no API Key here, then the audio files will be uploaded anonimously" +msgstr "" +"SndUpen kontua baduzu, idatzi zure API kodea hemen. API kodea okerra bada, " +"aplikazioak ezingo du ezer zerbitzura igo. Ez baduzu API koderik idazten, " +"audioak igorlerik gabe igoko dira." + +#: ../src\gui\dialogs\configuration.py:197 +msgid "Sound pack" +msgstr "Soinu packa" + +#: ../src\gui\dialogs\configuration.py:213 +#: ../src\gui\dialogs\configuration.py:237 +msgid "Unlink your Dropbox account" +msgstr "Zure dropbox kontua elkartzeari utzi" + +#: ../src\gui\dialogs\configuration.py:215 +#: ../src\gui\dialogs\configuration.py:232 +#: ../src\gui\dialogs\configuration.py:240 +#: ../src\gui\dialogs\configuration.py:244 +#: ../src\gui\dialogs\configuration.py:251 +msgid "Link your Dropbox account" +msgstr "Zure dropbox kontua elkartu" + +#: ../src\gui\dialogs\configuration.py:225 +msgid "" +"The authorisation request will be shown on your browser. Copy the code tat " +"Dropbox will provide and, in the text box that will appear on TW Blue, paste " +"it. This code is necessary to continue. You only need to do it once." +msgstr "" +"Jarraitzeko beharrezkoa den baimenaren eskaria irekiko da nabigatzailean. " +"Kopiatu eta itsasi koadroan Dropboxek emango dizun kodea. Behin soilik egin " +"behar da hau." + +#: ../src\gui\dialogs\configuration.py:225 ../src\sessionmanager\gui.py:83 +msgid "Authorisation" +msgstr "Baimena" + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Enter the code here." +msgstr "Sartu kodea hemen" + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Verification code" +msgstr "Baimentzeko kodea" + +#: ../src\gui\dialogs\configuration.py:239 +msgid "Error during authorisation. Try again later." +msgstr "Errorea baimentzean. Mesedez, saiatu beranduago." + +#: ../src\gui\dialogs\configuration.py:239 ../src\gui\main.py:718 +#: ../src\gui\main.py:749 +msgid "Error!" +msgstr "Errorea!" + +#: ../src\gui\dialogs\configuration.py:258 +msgid "TW Blue preferences" +msgstr "TW Blueren hobespenak" + +#: ../src\gui\dialogs\configuration.py:262 ../src\issueReporter\gui.py:30 +msgid "General" +msgstr "Orokorra" + +#: ../src\gui\dialogs\configuration.py:265 +msgid "Show other buffers" +msgstr "Erakutsi beste bufferrak" + +#: ../src\gui\dialogs\configuration.py:269 +msgid "Sound" +msgstr "Soinua" + +#: ../src\gui\dialogs\configuration.py:271 +msgid "Audio Services" +msgstr "Audio zerbitzua" + +#: ../src\gui\dialogs\configuration.py:274 +msgid "Save" +msgstr "gorde" + +#: ../src\gui\dialogs\configuration.py:277 ../src\gui\dialogs\follow.py:64 +#: ../src\gui\dialogs\message.py:182 ../src\gui\dialogs\message.py:269 +#: ../src\gui\dialogs\message.py:352 ../src\gui\dialogs\search.py:42 +#: ../src\gui\dialogs\show_user.py:42 ../src\gui\dialogs\update_profile.py:56 +#: ../src\gui\dialogs\utils.py:42 ../src\keystrokeEditor\gui.py:26 +msgid "Close" +msgstr "Itxi" + +#: ../src\gui\dialogs\configuration.py:290 ../src\gui\main.py:272 +msgid "Followers" +msgstr "Jarraitzaileak" + +#: ../src\gui\dialogs\configuration.py:304 +msgid "friends" +msgstr "Lagunak" + +#: ../src\gui\dialogs\configuration.py:318 +msgid "Favorites" +msgstr "Gogokoak" + +#: ../src\gui\dialogs\configuration.py:332 ../src\gui\main.py:290 +msgid "Events" +msgstr "Gertaerak" + +#: ../src\gui\dialogs\configuration.py:343 ../src\gui\main.py:282 +msgid "Blocked users" +msgstr "Blokeatutako erabiltzaileak" + +#: ../src\gui\dialogs\configuration.py:357 ../src\gui\main.py:286 +msgid "Muted users" +msgstr "Isildutako erabiltzaileak" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "Restart TW Blue" +msgstr "TW Blue berrabiazi" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "" +"The application requires to be restarted to save these changes. Press OK to " +"do it now." +msgstr "" +"Aplikazioa berrabiazi behar da aldaketa hauek gertatzeko. Sakatu OK orain " +"egiteko." + +#: ../src\gui\dialogs\follow.py:33 ../src\gui\dialogs\follow.py:43 +#: ../src\keystrokeEditor\gui.py:17 +msgid "Action" +msgstr "Eragiketa" + +#: ../src\gui\dialogs\follow.py:44 ../src\gui\main.py:96 +msgid "Follow" +msgstr "Jarraitu" + +#: ../src\gui\dialogs\follow.py:45 ../src\gui\main.py:98 +msgid "Unfollow" +msgstr "Jarraitzeari utzi" + +#: ../src\gui\dialogs\follow.py:46 ../src\gui\main.py:100 +#: ../src\gui\main.py:127 +msgid "Mute" +msgstr "Isildu" + +#: ../src\gui\dialogs\follow.py:47 ../src\gui\main.py:102 +msgid "Unmute" +msgstr "Isiltzeari utzi" + +#: ../src\gui\dialogs\follow.py:48 ../src\gui\main.py:106 +msgid "Block" +msgstr "Blokeatu" + +#: ../src\gui\dialogs\follow.py:49 ../src\gui\main.py:108 +msgid "Unblock" +msgstr "Desblokeatu" + +#: ../src\gui\dialogs\follow.py:50 ../src\gui\main.py:104 +msgid "Report as spam" +msgstr "Spam bezala salatu" + +#: ../src\gui\dialogs\follow.py:61 ../src\gui\dialogs\search.py:40 +#: ../src\gui\dialogs\utils.py:39 ../src\keystrokeEditor\gui.py:76 +msgid "OK" +msgstr "Onartu" + +#: ../src\gui\dialogs\follow.py:101 +msgid "You've muted to %s" +msgstr "%s isildu duzu" + +#: ../src\gui\dialogs\follow.py:115 +msgid "You've unmuted to %s" +msgstr "%s isiltzeari utzi duzu" + +#: ../src\gui\dialogs\lists.py:36 ../src\gui\main.py:66 +msgid "Lists manager" +msgstr "Zerrenden kudeatzailea" + +#: ../src\gui\dialogs\lists.py:38 ../src\gui\main.py:309 +msgid "Lists" +msgstr "Zerrendak" + +#: ../src\gui\dialogs\lists.py:39 +msgid "List" +msgstr "Zerrenda" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Members" +msgstr "Kideak" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Owner" +msgstr "Jabea" + +#: ../src\gui\dialogs\lists.py:39 +msgid "mode" +msgstr "Modua" + +#: ../src\gui\dialogs\lists.py:39 ../src\gui\dialogs\lists.py:181 +msgid "Description" +msgstr "Deskribapena" + +#: ../src\gui\dialogs\lists.py:44 ../src\gui\dialogs\lists.py:173 +msgid "Create a new list" +msgstr "Zerrenda berri bat sortu" + +#: ../src\gui\dialogs\lists.py:46 ../src\keystrokeEditor\gui.py:22 +msgid "Edit" +msgstr "Aldatu" + +#: ../src\gui\dialogs\lists.py:48 ../src\gui\dialogs\lists.py:235 +msgid "Remove" +msgstr "Ezabatu" + +#: ../src\gui\dialogs\lists.py:50 +msgid "Open in buffer" +msgstr "Buffer batean ireki" + +#: ../src\gui\dialogs\lists.py:125 +msgid "List opened" +msgstr "Zerrenda ireki" + +#: ../src\gui\dialogs\lists.py:127 +msgid "This list is arready opened." +msgstr "Zerrenda hau jada irekita dago" + +#: ../src\gui\dialogs\lists.py:130 ../src\gui\main.py:312 +msgid "List for %s" +msgstr "%s zerrenda" + +#: ../src\gui\dialogs\lists.py:148 +msgid "Viewing lists for %s" +msgstr "%s(r)en zerrendak ikusten" + +#: ../src\gui\dialogs\lists.py:149 +msgid "Subscribe" +msgstr "Harpidetu" + +#: ../src\gui\dialogs\lists.py:150 +msgid "Unsubscribe" +msgstr "Harpidetzeari utzi" + +#: ../src\gui\dialogs\lists.py:176 +msgid "Name (20 characters maximun)" +msgstr "Izena (gehienez 20 karaktere)" + +#: ../src\gui\dialogs\lists.py:186 +msgid "Mode" +msgstr "Modua" + +#: ../src\gui\dialogs\lists.py:187 +msgid "Public" +msgstr "Publikoa" + +#: ../src\gui\dialogs\lists.py:188 +msgid "Private" +msgstr "Privatua" + +#: ../src\gui\dialogs\lists.py:208 +msgid "Editing the list %s" +msgstr "%S ZERRENDA ALDATZEN" + +#: ../src\gui\dialogs\lists.py:219 +msgid "Select a list to add the user" +msgstr "Hautatu zerrenda bat erabiltzailea bertan gehitzeko" + +#: ../src\gui\dialogs\lists.py:220 +msgid "Add" +msgstr "Gehitu" + +#: ../src\gui\dialogs\lists.py:234 +msgid "Select a list to remove the user" +msgstr "Hautatu zerrenda bat erabiltzailea bertatik kentzeko" + +#: ../src\gui\dialogs\message.py:42 ../src\keystrokeEditor\constants.py:11 +msgid "New tweet" +msgstr "Txio berri bat" + +#: ../src\gui\dialogs\message.py:76 +msgid "Attaching..." +msgstr "Atxikitzen..." + +#: ../src\gui\dialogs\message.py:77 +msgid "Uploading..." +msgstr "Igotzen..." + +#: ../src\gui\dialogs\message.py:96 +msgid "Unable to upload the audio" +msgstr "Ezinezkoa izan da audioa igotzea" + +#: ../src\gui\dialogs\message.py:110 ../src\gui\dialogs\message.py:395 +msgid "Translated" +msgstr "Itzulia" + +#: ../src\gui\dialogs\message.py:122 +msgid "There's no URL to be shortened" +msgstr "Ez dago laburtzeko URLrik " + +#: ../src\gui\dialogs\message.py:125 +msgid "URL shortened" +msgstr "URLa laburtua" + +#: ../src\gui\dialogs\message.py:133 ../src\gui\dialogs\message.py:407 +msgid "There's no URL to be expanded" +msgstr "Ez dago zabaltzeko URLrik" + +#: ../src\gui\dialogs\message.py:136 ../src\gui\dialogs\message.py:410 +msgid "URL expanded" +msgstr "URLa zabalduta" + +#: ../src\gui\dialogs\message.py:164 ../src\gui\dialogs\message.py:219 +#: ../src\gui\dialogs\update_profile.py:51 +#: ../src\gui\dialogs\update_profile.py:88 +msgid "Upload a picture" +msgstr "Argazki bat igo" + +#: ../src\gui\dialogs\message.py:167 ../src\gui\dialogs\message.py:254 +#: ../src\gui\dialogs\message.py:345 +msgid "Spelling correction" +msgstr "Ortografiaren egiaztapena " + +#: ../src\gui\dialogs\message.py:171 ../src\gui\dialogs\message.py:258 +msgid "Shorten URL" +msgstr "URLa laburtu" + +#: ../src\gui\dialogs\message.py:173 ../src\gui\dialogs\message.py:260 +#: ../src\gui\dialogs\message.py:347 +msgid "Expand URL" +msgstr "URLa zabaldu" + +#: ../src\gui\dialogs\message.py:179 ../src\gui\dialogs\message.py:266 +msgid "Send" +msgstr "Bidali" + +#: ../src\gui\dialogs\message.py:215 ../src\gui\dialogs\message.py:226 +#: ../src\gui\dialogs\update_profile.py:84 +#: ../src\gui\dialogs\update_profile.py:95 +msgid "Discard image" +msgstr "Irudia baztertu" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" +msgstr "Irudiak (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Select the picture to be uploaded" +msgstr "Aukeratu igo nahi duzun irudia" + +#: ../src\gui\dialogs\message.py:248 +msgid "Recipient" +msgstr "hartzailea" + +#: ../src\gui\dialogs\message.py:303 +msgid "Mention to all" +msgstr "Aipamena guztiei" + +#: ../src\gui\dialogs\message.py:330 +msgid "Tweet - %i characters " +msgstr "Txioa - %i karaktere" + +#: ../src\gui\dialogs\search.py:26 +msgid "Search on Twitter" +msgstr "Bilatu Twitterren" + +#: ../src\gui\dialogs\search.py:27 ../src\gui\main.py:64 +msgid "Search" +msgstr "Bilatu" + +#: ../src\gui\dialogs\search.py:34 +msgid "Tweets" +msgstr "Txioak" + +#: ../src\gui\dialogs\search.py:35 +msgid "Users" +msgstr "Erabiltzaileak" + +#: ../src\gui\dialogs\show_user.py:26 +msgid "Information for %s" +msgstr "%s(r)en xehetasunak" + +#: ../src\gui\dialogs\show_user.py:30 +msgid "Details" +msgstr "Xehetasunak" + +#: ../src\gui\dialogs\show_user.py:39 +msgid "Go to URL" +msgstr "URLera joan" + +#: ../src\gui\dialogs\show_user.py:63 +msgid "This user does not exist on Twitter" +msgstr "Erabiltzaile hau ez da twitterren existitzen" + +#: ../src\gui\dialogs\show_user.py:68 +msgid "Username: @%s\n" +msgstr "Erabiltzaile izena: @%s\n" + +#: ../src\gui\dialogs\show_user.py:69 +msgid "Name: %s\n" +msgstr "Izena: %s\n" + +#: ../src\gui\dialogs\show_user.py:71 +msgid "Location: %s\n" +msgstr "Kokapena: %s\n" + +#: ../src\gui\dialogs\show_user.py:73 +msgid "URL: %s\n" +msgstr "URLa: %s\n" + +#: ../src\gui\dialogs\show_user.py:76 +msgid "Bio: %s\n" +msgstr "Bio: %s\n" + +#: ../src\gui\dialogs\show_user.py:77 +msgid "Yes" +msgstr "Bai" + +#: ../src\gui\dialogs\show_user.py:78 +msgid "No" +msgstr "Ez" + +#: ../src\gui\dialogs\show_user.py:79 +msgid "Protected: %s\n" +msgstr "Babestua: %s\n" + +#: ../src\gui\dialogs\show_user.py:80 +msgid "" +"Followers: %s\n" +" Friends: %s\n" +msgstr "" +"Jarraitzaileak: %s\n" +" Lagunak: %s\n" + +#: ../src\gui\dialogs\show_user.py:81 +msgid "Tweets: %s\n" +msgstr "Txioak: %s\n" + +#: ../src\gui\dialogs\show_user.py:82 +msgid "Favourites: %s" +msgstr "Gogokoak: %s" + +#: ../src\gui\dialogs\update_profile.py:27 +msgid "Update your profile" +msgstr "Zure profila eguneratu" + +#: ../src\gui\dialogs\update_profile.py:29 +msgid "Name (20 characters maximum)" +msgstr "Izena (gehienez 20 karaktere)" + +#: ../src\gui\dialogs\update_profile.py:35 +msgid "Location" +msgstr "Kokapena" + +#: ../src\gui\dialogs\update_profile.py:40 +msgid "Website" +msgstr "Webgunea" + +#: ../src\gui\dialogs\update_profile.py:45 +msgid "Bio (160 characters maximum)" +msgstr "Bioa (gehienez 160 karaktere)" + +#: ../src\gui\dialogs\update_profile.py:53 ../src\gui\main.py:60 +#: ../src\gui\sysTrayIcon.py:38 +msgid "Update profile" +msgstr "Profila eguneratu" + +#: ../src\gui\dialogs\urlList.py:26 +msgid "Select an URL" +msgstr "Aukeratu URL bat" + +#: ../src\gui\main.py:62 +msgid "Hide window" +msgstr "Leihoa ezkutatu" + +#: ../src\gui\main.py:70 +msgid "Edit keystrokes" +msgstr "Teklatu lasterbideak aldatu" + +#: ../src\gui\main.py:72 ../src\gui\sysTrayIcon.py:36 +msgid "Preferences" +msgstr "Hobespenak" + +#: ../src\gui\main.py:74 ../src\gui\main.py:597 ../src\gui\sysTrayIcon.py:46 +msgid "Exit" +msgstr "Irten" + +#: ../src\gui\main.py:85 +msgid "Add to favourites" +msgstr "Gogokoetara gehitu" + +#: ../src\gui\main.py:87 ../src\keystrokeEditor\constants.py:16 +msgid "Remove from favourites" +msgstr "Gogokoetatik kendu" + +#: ../src\gui\main.py:89 ../src\keystrokeEditor\constants.py:19 +msgid "Show tweet" +msgstr "Txioa ikusi" + +#: ../src\gui\main.py:112 ../src\keystrokeEditor\constants.py:36 +msgid "Add to list" +msgstr "Zerrendara gehitu" + +#: ../src\gui\main.py:114 ../src\keystrokeEditor\constants.py:37 +msgid "Remove from list" +msgstr "Zerrendatik kendu" + +#: ../src\gui\main.py:116 +msgid "View lists" +msgstr "Zerrendak ikusi" + +#: ../src\gui\main.py:118 +msgid "Show user profile" +msgstr "Erabiltzailearen profila ikusi" + +#: ../src\gui\main.py:120 +msgid "Timeline" +msgstr "Denbora lerroa" + +#: ../src\gui\main.py:122 +msgid "View favourites" +msgstr "Gogokoak ikusi" + +#: ../src\gui\main.py:129 +msgid "Autoread tweets for this buffer" +msgstr "Buffer honetako txioak automatikoki irakurri" + +#: ../src\gui\main.py:131 +msgid "Clear buffer" +msgstr "Bufferraren osagaiak ezabatu" + +#: ../src\gui\main.py:133 ../src\keystrokeEditor\constants.py:22 +msgid "Remove buffer" +msgstr "Bufferra kendu" + +#: ../src\gui\main.py:138 ../src\gui\sysTrayIcon.py:42 +msgid "Documentation" +msgstr "Laguntza" + +#: ../src\gui\main.py:140 +msgid "What's new in this version?" +msgstr "Zer da berri bertsio honetan?" + +#: ../src\gui\main.py:142 ../src\gui\sysTrayIcon.py:44 +msgid "Check for updates" +msgstr "Eguneratzeak bilatu" + +#: ../src\gui\main.py:144 ../src\issueReporter\gui.py:34 +msgid "Report an error" +msgstr "Errore bati buruz berri eman" + +#: ../src\gui\main.py:146 +msgid "TW Blue website" +msgstr "TW Blueren webgunea" + +#: ../src\gui\main.py:148 +msgid "About TW Blue" +msgstr "TW Blueri buruz" + +#: ../src\gui\main.py:152 +msgid "Application" +msgstr "Aplikazioa" + +#: ../src\gui\main.py:155 +msgid "Buffer" +msgstr "Bufferra" + +#: ../src\gui\main.py:156 +msgid "Help" +msgstr "Laguntza" + +#: ../src\gui\main.py:249 +msgid "Home" +msgstr "Hasiera" + +#: ../src\gui\main.py:254 +msgid "Mentions" +msgstr "Aipamenak" + +#: ../src\gui\main.py:257 +msgid "Direct messages" +msgstr "Zuzeneko mezuak" + +#: ../src\gui\main.py:260 +msgid "Sent" +msgstr "Bidaliak" + +#: ../src\gui\main.py:266 +msgid "Favourites" +msgstr "Gogokoak" + +#: ../src\gui\main.py:278 +msgid "Friends" +msgstr "Lagunak" + +#: ../src\gui\main.py:293 +msgid "Searches" +msgstr "Bilaketak" + +#: ../src\gui\main.py:303 +msgid "Timelines" +msgstr "Denbora lerroak" + +#: ../src\gui\main.py:306 ../src\gui\main.py:714 +msgid "Timeline for %s" +msgstr "%s(r)en denbora lerroa" + +#: ../src\gui\main.py:317 +msgid "Favourites timelines" +msgstr "Gogokoen denbora lerroa" + +#: ../src\gui\main.py:320 ../src\gui\main.py:745 +msgid "Favourites for %s" +msgstr "%s(r)en gogokoak" + +#: ../src\gui\main.py:361 +msgid "Ready" +msgstr "Prest" + +#: ../src\gui\main.py:388 +msgid "%s favourites from %s" +msgstr "%s gogoko %s(r)enak" + +#: ../src\gui\main.py:435 +msgid "Streams disconnected. TW Blue will try to reconnect in a minute." +msgstr "Streamak deskonektatuak. TW Blue berriz konektatzen saiatuko da." + +#: ../src\gui\main.py:439 +msgid "Reconnecting streams..." +msgstr "Streamak konektatzen" + +#: ../src\gui\main.py:463 +msgid "search for %s" +msgstr "%s bilatu" + +#: ../src\gui\main.py:468 +msgid "search users for %s" +msgstr "%s bilatu erabiltzaileetan" + +#: ../src\gui\main.py:479 ../src\gui\main.py:490 ../src\gui\main.py:509 +msgid "Select the user" +msgstr "Erabiltzailea aukeratu" + +#: ../src\gui\main.py:569 +msgid "User details" +msgstr "Erabiltzailearen Xehetasunak" + +#: ../src\gui\main.py:577 +msgid "" +"Do you really want to delete this message? It will be eliminated from " +"Twitter as well." +msgstr "Mezu hau ezabatu nahi duzu? Twitterretik ere ezabatuko da." + +#: ../src\gui\main.py:597 +msgid "Do you really want to close TW Blue?" +msgstr "TW Bluetik irten nahi duzu?" + +#: ../src\gui\main.py:687 +msgid "Error while adding to favourites." +msgstr "Errorea gogokoetara gehitzean." + +#: ../src\gui\main.py:695 +msgid "Error while removing from favourites." +msgstr "Errorea gogokoetatik kentzean." + +#: ../src\gui\main.py:699 +msgid "Individual timeline" +msgstr "Denbora lerro indibiduala" + +#: ../src\gui\main.py:703 ../src\gui\main.py:734 +msgid "The user does not exist" +msgstr "Erabiltzailea ez da existitzen" + +#: ../src\gui\main.py:709 +msgid "Existing timeline" +msgstr "Denbora lerro hau existitzen da" + +#: ../src\gui\main.py:709 +msgid "" +"There's currently a timeline for this user. You are not able to open another" +msgstr "" +"Erabiltzaile honetarako jada denbora lerro bat dago. Ezin da beste bat ireki." + +#: ../src\gui\main.py:718 +msgid "This user has no tweets. You can't open a timeline for this user" +msgstr "Erabiltzaile honek ez du Txiorik. Ezin duzu denbora lerro bat ireki." + +#: ../src\gui\main.py:730 +msgid "List of favourites" +msgstr "Gogokoen zerrenda" + +#: ../src\gui\main.py:740 +msgid "Existing list" +msgstr "Zerrenda hau existitzen da" + +#: ../src\gui\main.py:740 +msgid "" +"There's already a list of favourites for this user. You can't create another." +msgstr "" +"Erabiltzaile honetarako jada gogokoen buffer bat dago. Ezin da beste bat " +"ireki." + +#: ../src\gui\main.py:749 +msgid "" +"This user has no favourites. You can't create a list of favourites for this " +"user." +msgstr "" +"Erabiltzaile honek ez du gogokorik. Ezin duzu gogokoen zerrenda bat ireki." + +#: ../src\gui\main.py:791 ../src\gui\main.py:804 +msgid "%s, %s of %s" +msgstr "%s, %s %s(e)tik" + +#: ../src\gui\main.py:793 ../src\gui\main.py:806 +msgid "%s. Empty" +msgstr "%s. Hutsa" + +#: ../src\gui\main.py:829 +msgid "Global mute on" +msgstr "Isiltasun orokorra aktibatua" + +#: ../src\gui\main.py:832 +msgid "Global mute off" +msgstr "Isiltasun globala desaktibatua" + +#: ../src\gui\main.py:838 +msgid "Buffer mute on" +msgstr "Bufferra isildu aktibatua" + +#: ../src\gui\main.py:841 +msgid "Buffer mute off" +msgstr "Bufferra isildu desaktibatua" + +#: ../src\gui\main.py:847 +msgid "The auto-reading of new tweets is enabled for this buffer" +msgstr "Tweet berrien irakurketa automatikoa aktibatua dago buffer honetarako " + +#: ../src\gui\main.py:850 +msgid "The auto-reading of new tweets is disabled for this buffer" +msgstr "" +"Tweet berrien irakurketa automatikoa desaktibatua dago buffer honetarako " + +#: ../src\gui\main.py:857 +msgid "Copied" +msgstr "Kopiatua" + +#: ../src\gui\main.py:868 ../src\gui\main.py:877 +msgid "%s" +msgstr "%s" + +#: ../src\gui\sysTrayIcon.py:40 +msgid "Show / hide" +msgstr "Erakutsi / ezkutatu" + +#: ../src\issueReporter\gui.py:31 +msgid "always" +msgstr "Beti" + +#: ../src\issueReporter\gui.py:31 +msgid "have not tried" +msgstr "Ez da saiakerarik egin" + +#: ../src\issueReporter\gui.py:31 +msgid "random" +msgstr "Ausaz" + +#: ../src\issueReporter\gui.py:31 +msgid "sometimes" +msgstr "Batzutan" + +#: ../src\issueReporter\gui.py:31 +msgid "unable to duplicate" +msgstr "Ezin izan da " + +#: ../src\issueReporter\gui.py:32 +msgid "block" +msgstr "Blokeoa" + +#: ../src\issueReporter\gui.py:32 +msgid "crash" +msgstr "Errorea" + +#: ../src\issueReporter\gui.py:32 +msgid "feature" +msgstr "Ezaugarria" + +#: ../src\issueReporter\gui.py:32 +msgid "major" +msgstr "Handia" + +#: ../src\issueReporter\gui.py:32 +msgid "minor" +msgstr "Txikia" + +#: ../src\issueReporter\gui.py:32 +msgid "text" +msgstr "Testua" + +#: ../src\issueReporter\gui.py:32 +msgid "trivial" +msgstr "Tribiala" + +#: ../src\issueReporter\gui.py:32 +msgid "tweak" +msgstr "Aldaketa" + +#: ../src\issueReporter\gui.py:37 +msgid "Select a category" +msgstr "Kategoria bat aukeratu" + +#: ../src\issueReporter\gui.py:46 +msgid "" +"Briefly describe what happened. You will be able to thoroughly explain it " +"later" +msgstr "" +"Deskribatu laburki zer gertatu den. Gero gehiago zehazteko aukera edukiko " +"duzu." + +#: ../src\issueReporter\gui.py:56 +msgid "Here, you can describe the bug in detail" +msgstr "Hemen, errorea deskriba dezakezu" + +#: ../src\issueReporter\gui.py:66 +msgid "how often does this bug happen?" +msgstr "Zenbat aldiz gertatzen da errore hau?" + +#: ../src\issueReporter\gui.py:74 +msgid "Select the importance that you think this bug has" +msgstr "Aukeratu zure ustez errore honek duen garrantzia:" + +#: ../src\issueReporter\gui.py:82 +msgid "" +"I know that the TW Blue bug system will get my Twitter username to contact " +"me and fix the bug quickly" +msgstr "" +"Badakit TW Blueren errore sistemak nire Twitter erabiltzailea hartuko duela, " +"nirekin kontaktuan jartzeko eta ahal den azkarren errorea konpontzeko" + +#: ../src\issueReporter\gui.py:85 +msgid "Send report" +msgstr "Informazioa bidali" + +#: ../src\issueReporter\gui.py:98 +msgid "You must fill out both fields" +msgstr "Bi koadroak bete behar dituzu" + +#: ../src\issueReporter\gui.py:101 +msgid "" +"You need to mark the checkbox to provide us your twitter username to contact " +"to you if is necessary." +msgstr "" +"Kontrol-laukia markatu behar duzu zure erabiltzaile izena emateko. Horrela, " +"beharrezkoa baldin bada zurekin kontaktuan jarriko gara." + +#: ../src\issueReporter\gui.py:120 +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 "" +"Mila esker errore honi buruz berri emateagatik! Agian hurrengo bertsioko " +"aldaketa zerrendan ikusiko duzu. %i zenbakidun erroreari buruz eman duzu " +"informazioa." + +#: ../src\issueReporter\gui.py:120 +msgid "reported" +msgstr "Berri emanda" + +#: ../src\issueReporter\gui.py:123 +msgid "Error while reporting" +msgstr "Errorea berri ematean" + +#: ../src\issueReporter\gui.py:123 +msgid "" +"Something unexpected occurred while trying to report the bug. Please, try " +"again later" +msgstr "" +"Ustekabeko zerbait gertatu da erroreari buruz berri ematean. Mesedez, saiatu " +"berriro beranduago." + +#: ../src\keystrokeEditor\constants.py:4 +msgid "Go up up on the current list" +msgstr "Gora joan zerrendan" + +#: ../src\keystrokeEditor\constants.py:5 +msgid "Go down up on the current list" +msgstr "Behera joan zerrendan" + +#: ../src\keystrokeEditor\constants.py:6 +msgid "Go to the previous tab" +msgstr "Joan aurreko bufferrera" + +#: ../src\keystrokeEditor\constants.py:7 +msgid "Go to the next tab" +msgstr "Hurrengo bufferrera joan" + +#: ../src\keystrokeEditor\constants.py:8 +msgid "Move up one tweet in the conversation" +msgstr "Elkarrizketan gora joan" + +#: ../src\keystrokeEditor\constants.py:9 +msgid "Move down one tweet in the conversation" +msgstr "Ellkarrizketan behera joan" + +#: ../src\keystrokeEditor\constants.py:10 +msgid "Show the graphical interface" +msgstr "nterfaze grafikoa erakutsi" + +#: ../src\keystrokeEditor\constants.py:12 +msgid "Reply to a tweet" +msgstr "Txio bati erantzun" + +#: ../src\keystrokeEditor\constants.py:14 +msgid "Send direct message" +msgstr "Zuzeneko mezua bidali" + +#: ../src\keystrokeEditor\constants.py:15 +msgid "Mark as favourite" +msgstr "Gogokoetara gehitu" + +#: ../src\keystrokeEditor\constants.py:17 +msgid "Open the actions dialogue" +msgstr "Ekintzen dialogoa ireki" + +#: ../src\keystrokeEditor\constants.py:18 +msgid "See user details" +msgstr "Erabiltzailearen Xehetasunak ikusi" + +#: ../src\keystrokeEditor\constants.py:20 +msgid "Quit" +msgstr "Irten" + +#: ../src\keystrokeEditor\constants.py:21 +msgid "Open user timeline" +msgstr "Erabiltzailearen denbora lerroa ireki" + +#: ../src\keystrokeEditor\constants.py:23 +msgid "" +"Open URL on the current tweet, or further information for a friend or " +"follower" +msgstr "" +"Ireki URL bat txio honetan, edo ikusi informazio gehiago jarraitzaile edo " +"lagun bati buruz" + +#: ../src\keystrokeEditor\constants.py:24 +msgid "Attempt to play audio" +msgstr "Audioa erreproduzitzen saiatu" + +#: ../src\keystrokeEditor\constants.py:25 +msgid "Increase volume by 5%" +msgstr "Bolumena %5 igo" + +#: ../src\keystrokeEditor\constants.py:26 +msgid "Decrease volume by 5%" +msgstr "Bolumena %5 jaitsi" + +#: ../src\keystrokeEditor\constants.py:27 +msgid "Go to the first element on the list" +msgstr "Joan zerrendaren lehen osagaira" + +#: ../src\keystrokeEditor\constants.py:28 +msgid "Go to the last element on the list" +msgstr "Joan zerrendaren azken osagaira" + +#: ../src\keystrokeEditor\constants.py:29 +msgid "Move 20 elements up on the current list" +msgstr "Mugitu 20 osagai gora zerrenda honetan" + +#: ../src\keystrokeEditor\constants.py:30 +msgid "Move 20 elements down on the current list" +msgstr "Mugitu 20 osagai behera zerrenda honetan" + +#: ../src\keystrokeEditor\constants.py:31 +msgid "Edit profile" +msgstr "Profila aldatu" + +#: ../src\keystrokeEditor\constants.py:32 +msgid "Remove a tweet or direct message" +msgstr "Tweet bat edo zuzeneko mezu bat ezabatu" + +#: ../src\keystrokeEditor\constants.py:33 +msgid "Empty the buffer removing all the elements" +msgstr "Hustu bufferra, osagai guztiak ezabatuz" + +#: ../src\keystrokeEditor\constants.py:34 +msgid "Listen the current message" +msgstr "Mezu hau entzun" + +#: ../src\keystrokeEditor\constants.py:35 +msgid "Copy to clipboard" +msgstr "Kopiatu" + +#: ../src\keystrokeEditor\constants.py:38 +msgid "Mutes/unmutes the active buffer" +msgstr "Buffer hau isildu edo isiltzeari utzi" + +#: ../src\keystrokeEditor\constants.py:39 +msgid "Globally mute/unmute TW Blue" +msgstr "TW Blue osoa isildu edo isiltzeari utzi" + +#: ../src\keystrokeEditor\constants.py:40 +msgid "toggles the automatic reading of incoming tweets in the active buffer" +msgstr "Buffer honen tweeten irakurketa automatikoa aktibatu edo desaktibatu" + +#: ../src\keystrokeEditor\constants.py:41 +msgid "Search on twitter" +msgstr "Bilatu Twitterren" + +#: ../src\keystrokeEditor\constants.py:42 +msgid "Shows the keystroke editor" +msgstr "Teklatu lasterbideen editorea erakusten du" + +#: ../src\keystrokeEditor\constants.py:43 +msgid "Show lists for a specified user" +msgstr "Erabiltzaile baten zerrendak ikusi" + +#: ../src\keystrokeEditor\gui.py:10 +msgid "Keystroke editor" +msgstr "Teklatu lastrbideen editorea" + +#: ../src\keystrokeEditor\gui.py:16 +msgid "Select a keystroke to edit" +msgstr "Aukeratu konbinazio bat aldatzeko" + +#: ../src\keystrokeEditor\gui.py:17 +msgid "Keystroke" +msgstr "Lasterbidea" + +#: ../src\keystrokeEditor\gui.py:54 +msgid "Editing keystroke" +msgstr "Konbinazioa aldatzen" + +#: ../src\keystrokeEditor\gui.py:61 +msgid "Control" +msgstr "KTRL" + +#: ../src\keystrokeEditor\gui.py:62 +msgid "Alt" +msgstr "Alt" + +#: ../src\keystrokeEditor\gui.py:63 +msgid "Shift" +msgstr "Shift" + +#: ../src\keystrokeEditor\gui.py:64 +msgid "Windows" +msgstr "Windows" + +#: ../src\keystrokeEditor\gui.py:70 +msgid "Key" +msgstr "Tekla" + +#: ../src\keystrokeEditor\gui.py:99 +msgid "You need to use the Windows key" +msgstr "Windows tekla erabili behar duzu" + +#: ../src\keystrokeEditor\gui.py:99 ../src\keystrokeEditor\gui.py:112 +msgid "Invalid keystroke" +msgstr "Baliogabeko lasterbidea" + +#: ../src\keystrokeEditor\gui.py:112 +msgid "You must provide a character for the keystroke" +msgstr "Konbinazioak karaktere bat eduki behar du" + +#: ../src\languageHandler.py:95 +msgid "User default" +msgstr "Lehenetsia" + +#: ../src\sessionmanager\gui.py:19 +msgid "Session manager" +msgstr "Sesioen kudeatzailea" + +#: ../src\sessionmanager\gui.py:23 +msgid "Select a twitter account to start TW Blue" +msgstr "Aukeratu Twitter kontu bat TW Blue hasteko" + +#: ../src\sessionmanager\gui.py:25 +msgid "Account" +msgstr "Kontua" + +#: ../src\sessionmanager\gui.py:30 +msgid "New account" +msgstr "Kontu berria" + +#: ../src\sessionmanager\gui.py:67 +msgid "Account Error" +msgstr "Errorea kontuarekin" + +#: ../src\sessionmanager\gui.py:67 +msgid "You need to configure an account." +msgstr "Kontu bat konfiguratuta izan behar duzu" + +#: ../src\sessionmanager\gui.py:83 +msgid "" +"The request for the required Twitter authorization to continue will be " +"opened on your browser. You only need to do it once. Would you like to " +"autorhise a new account now?" +msgstr "" +"Jarraitzeko beharrezkoa den Twiterren baimenaren eskaria irekiko da " +"nabigatzailean. Behin soilik egin behar da hau." + +#: ../src\sessionmanager\gui.py:94 +msgid "Invalid user token" +msgstr "Baliogabeko egiaztapen kodea" + +#: ../src\sessionmanager\gui.py:94 +msgid "" +"Your access token is invalid or the authorisation has failed. Please try " +"again." +msgstr "" +"Zure egiaztapen kodea okerra da edo autorizazioak akats bat izan du. " +"Mesedez, saiatu berriro." + +#: ../src\sessionmanager\gui.py:97 +msgid "Authorised account %d" +msgstr "Baimendutako kontua %d" + +#: ../src\twitter\buffers\indibidual.py:26 +msgid "One tweet from %s" +msgstr "%s(r)en Txio bat" + +#: ../src\twitter\buffers\indibidual.py:35 +msgid "One tweet from %s in the list %s" +msgstr "%s(r)en txio bat %s zerrendan" + +#: ../src\twitter\buffers\stream.py:57 +msgid "One mention from %s " +msgstr "%s(r)en aipamen bat" + +#: ../src\twitter\buffers\stream.py:69 +msgid "One direct message" +msgstr "Zuzeneko mezu bat" + +#: ../src\twitter\compose.py:22 +msgid "About a week ago" +msgstr "Duela aste bat" + +#: ../src\twitter\compose.py:24 +msgid "About {} weeks ago" +msgstr "Duela {} aste" + +#: ../src\twitter\compose.py:26 +msgid "A month ago" +msgstr "Duela hilabete bat" + +#: ../src\twitter\compose.py:28 +msgid "About {} months ago" +msgstr "Duela {} hilabet" + +#: ../src\twitter\compose.py:30 +msgid "About a year ago" +msgstr "Duela urte bat" + +#: ../src\twitter\compose.py:32 +msgid "About {} years ago" +msgstr "Duela {} urte" + +#: ../src\twitter\compose.py:34 +msgid "About 1 day ago" +msgstr "Duela egun bat" + +#: ../src\twitter\compose.py:36 +msgid "About {} days ago" +msgstr "Duela {} egun" + +#: ../src\twitter\compose.py:38 +msgid "just now" +msgstr "Orain" + +#: ../src\twitter\compose.py:40 +msgid "{} seconds ago" +msgstr "duela {} segundu" + +#: ../src\twitter\compose.py:42 +msgid "1 minute ago" +msgstr "Duela minutu bat" + +#: ../src\twitter\compose.py:44 +msgid "{} minutes ago" +msgstr "Duela {} minutu" + +#: ../src\twitter\compose.py:46 +msgid "About 1 hour ago" +msgstr "Duela ordu bat" + +#: ../src\twitter\compose.py:48 +msgid "About {} hours ago" +msgstr "Duela {} ordu" + +#: ../src\twitter\compose.py:52 +msgid "January" +msgstr "Urtarrilak" + +#: ../src\twitter\compose.py:53 +msgid "February" +msgstr "Otsailak" + +#: ../src\twitter\compose.py:54 +msgid "March" +msgstr "Martxoak" + +#: ../src\twitter\compose.py:55 +msgid "April" +msgstr "Apirilak" + +#: ../src\twitter\compose.py:56 +msgid "May" +msgstr "Maiatzak" + +#: ../src\twitter\compose.py:57 +msgid "June" +msgstr "Ekainak" + +#: ../src\twitter\compose.py:58 +msgid "July" +msgstr "Uztailak" + +#: ../src\twitter\compose.py:59 +msgid "August" +msgstr "Abuztuak" + +#: ../src\twitter\compose.py:60 +msgid "September" +msgstr "Irailak" + +#: ../src\twitter\compose.py:61 +msgid "October" +msgstr "Urriak" + +#: ../src\twitter\compose.py:62 +msgid "November" +msgstr "Azaroak" + +#: ../src\twitter\compose.py:63 +msgid "December" +msgstr "Abenduak" + +#: ../src\twitter\compose.py:66 +msgid "Sunday" +msgstr "Igandea" + +#: ../src\twitter\compose.py:67 +msgid "Monday" +msgstr "Asteleehna" + +#: ../src\twitter\compose.py:68 +msgid "Tuesday" +msgstr "Asteartea" + +#: ../src\twitter\compose.py:69 +msgid "Wednesday" +msgstr "Asteazkena" + +#: ../src\twitter\compose.py:70 +msgid "Thursday" +msgstr "Osteguna" + +#: ../src\twitter\compose.py:71 +msgid "Friday" +msgstr "Ostirala" + +#: ../src\twitter\compose.py:72 +msgid "Saturday" +msgstr "Larunbata" + +#: ../src\twitter\compose.py:75 +msgid "sun" +msgstr "ig" + +#: ../src\twitter\compose.py:76 +msgid "mon" +msgstr "al" + +#: ../src\twitter\compose.py:77 +msgid "tue" +msgstr "ar" + +#: ../src\twitter\compose.py:78 +msgid "wed" +msgstr "az" + +#: ../src\twitter\compose.py:79 +msgid "thu" +msgstr "og" + +#: ../src\twitter\compose.py:80 +msgid "fri" +msgstr "ol" + +#: ../src\twitter\compose.py:81 +msgid "sat" +msgstr "lr" + +#: ../src\twitter\compose.py:85 +msgid "jan" +msgstr "urt" + +#: ../src\twitter\compose.py:86 +msgid "feb" +msgstr "ots" + +#: ../src\twitter\compose.py:87 +msgid "mar" +msgstr "mar" + +#: ../src\twitter\compose.py:88 +msgid "apr" +msgstr "api" + +#: ../src\twitter\compose.py:89 +msgid "may" +msgstr "mai" + +#: ../src\twitter\compose.py:90 +msgid "jun" +msgstr "eka" + +#: ../src\twitter\compose.py:91 +msgid "jul" +msgstr "uzt" + +#: ../src\twitter\compose.py:92 +msgid "aug" +msgstr "abu" + +#: ../src\twitter\compose.py:93 +msgid "sep" +msgstr "ira" + +#: ../src\twitter\compose.py:94 +msgid "oct" +msgstr "urr" + +#: ../src\twitter\compose.py:95 +msgid "nov" +msgstr "aza" + +#: ../src\twitter\compose.py:96 +msgid "dec" +msgstr "abe" + +#: ../src\twitter\compose.py:152 +msgid "Dm to %s " +msgstr "Zuzeneko mezua %s(r)i" + +#: ../src\twitter\compose.py:185 +msgid "Unavailable" +msgstr "Ez dago erabilgarri" + +#: ../src\twitter\compose.py:186 +msgid "" +"%s (@%s). %s followers, %s friends, %s tweets. Last tweet on %s. Joined " +"Twitter on %s" +msgstr "" +"%s (@%s). %s jarraitzaile, %s lagun, %s txio. Azken txioa %s(e)an. %s(e)an " +"Twitterrera elkartu zen." + +#: ../src\twitter\compose.py:190 +msgid "You've blocked %s" +msgstr "%s blokeatu duzu." + +#: ../src\twitter\compose.py:192 +msgid "You've unblocked %s" +msgstr "%s desblokeatu duzu" + +#: ../src\twitter\compose.py:195 +msgid "%s(@%s) has followed you" +msgstr "Orain %s(e)k (@%s) jarraitzen zaitu" + +#: ../src\twitter\compose.py:197 +msgid "You've followed %s(@%s)" +msgstr "Orain %s (@%s) jarraitzen duzu" + +#: ../src\twitter\compose.py:199 +msgid "You've unfollowed %s (@%s)" +msgstr "Orain ez duzu %s (@%s) jarraitzen" + +#: ../src\twitter\compose.py:202 +msgid "You've added to favourites: %s, %s" +msgstr "Gogokoetara gehitu duzu: %s, %s" + +#: ../src\twitter\compose.py:204 +msgid "%s(@%s) has marked as favorite: %s" +msgstr "%s(e)k (@%s) gogokoetara gehitu du: %s" + +#: ../src\twitter\compose.py:206 +msgid "You've removed from favourites: %s, %s" +msgstr "Gogokoetatik kendu duzu: %s, %s" + +#: ../src\twitter\compose.py:207 +msgid "%s(@%s) has removed from favourites: %s" +msgstr "%s(e)k (@%s) gogokoetatik kendu du: %s" + +#: ../src\twitter\compose.py:209 +msgid "You've created the list %s" +msgstr "%s zerrenda egin duzu" + +#: ../src\twitter\compose.py:211 +msgid "You've deleted the list %s" +msgstr "%s zerrenda ezabatu duzu" + +#: ../src\twitter\compose.py:213 +msgid "You've updated the list %s" +msgstr "%s zerrenda eguneratu duzu" + +#: ../src\twitter\compose.py:215 +msgid "You've added %s(@%s) to the list %s" +msgstr "%s(@%s) %s zerrendara gehitu duzu." + +#: ../src\twitter\compose.py:216 +msgid "%s(@%s) has added you to the list %s" +msgstr "%s(e)k (@%s) %s zerrendara gehitu zaitu" + +#: ../src\twitter\compose.py:218 +msgid "You'be removed %s(@%s) from the list %s" +msgstr "%s(@%s) %s zerrendatik kendu duzu." + +#: ../src\twitter\compose.py:219 +msgid "%s(@%s) has removed you from the list %s" +msgstr "%s(e)k (@%s) %s zerrendatik kendu zaitu." + +#: ../src\twitter\compose.py:221 +msgid "You've subscribed to the list %s, which is owned by %s(@%s)" +msgstr "%s zerrendara harpidetu zara. Zerrenda honen jabea %s(@%s) da." + +#: ../src\twitter\compose.py:222 +msgid "%s(@%s) has suscribed you to the list %s" +msgstr "%s(e)k (@%s) %s zerrendara harpidetu zaitu." + +#: ../src\twitter\compose.py:224 +msgid "You've unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "%s zerrenda harpidetzeari utzi diozu. Zerrenda honen jabea %s(@%s) da" + +#: ../src\twitter\compose.py:225 +msgid "You've been unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "" +"%s zerrendaren harpidetu bezala kendua izan zara. Zerrenda honen jabea %s(@" +"%s) da" + +#: ../src\twitter\compose.py:226 +msgid "Unknown" +msgstr "ezezaguna" + +#: ../src\twitter\compose.py:232 +msgid "No description available" +msgstr "Ez dago deskripziorik" + +#: ../src\twitter\compose.py:236 +msgid "private" +msgstr "Pribatua" + +#: ../src\twitter\compose.py:237 +msgid "public" +msgstr "Publikoa" + +#: ../src\twitter\twitter.py:73 +msgid "%s failed. Reason: %s" +msgstr "%s eragiketak ez du arrakasta izan. Arrazoia: %s" + +#: ../src\twitter\twitter.py:80 +msgid "%s succeeded." +msgstr "%s eragiketak arrakasta izan du." + +#: ../src\updater\update_manager.py:14 +msgid "Your TW Blue version is up to date" +msgstr "Zure TW Blueren bertsioa eguneratuta dago." + +#: ../src\updater\update_manager.py:14 ../src\updater\update_manager.py:27 +msgid "Update" +msgstr "Eguneratzea" + +#: ../src\updater\update_manager.py:20 +msgid "New version for %s" +msgstr "%s-ren bertsio berri bat" + +#: ../src\updater\update_manager.py:20 +msgid "" +"There's a new TW Blue version available. Would you like to download it now?" +msgstr "TW Blueren bertsio berri bat eskuragarri dago. Orain jaitsi nahi duzu?" + +#: ../src\updater\update_manager.py:22 +msgid "Download in Progress" +msgstr "Deskargatzen..." + +#: ../src\updater\update_manager.py:22 +msgid "Downloading the new version..." +msgstr "Bertsio berria jaisten..." + +#: ../src\updater\update_manager.py:29 +msgid "Done!" +msgstr "Egina!" + +#: ../src\updater\update_manager.py:29 +msgid "" +"The new TW Blue version has been downloaded and installed. Press OK to start " +"the application." +msgstr "" +"TW Blueren bertsio berria jaitsia eta instalatua izan da. Sakatu OK " +"aplikazioa abiatzeko." + +#~ msgid "Tweet - %i characters" +#~ msgstr "Txioa - %i karaktere" + +#~ msgid "%A, %B %d, %Y at %I:%M:%S %p" +#~ msgstr "%A, %Y-ko %B %d, %I:%M:%S %p" + +#~ msgid "View members" +#~ msgstr "Kideak ikusi" + +#~ msgid "View subscribers" +#~ msgstr "Harpidetuak ikusi" + +#~ msgid "Mention to %s" +#~ msgstr "Aipamena %s-(r)i" + +#~ msgid "Ouner" +#~ msgstr "Jabea" + +#~ msgid "Successfully following %s" +#~ msgstr "Arrakasta %s jarraitzen" + +#~ msgid "%s has been reported as spam" +#~ msgstr "%s spam bezala salatu da" + +#~ msgid "%s has been blocked" +#~ msgstr "%s blokeatua izan da" + +#~ msgid "User's information" +#~ msgstr "Erabiltzailearen xehetasunak" + +#~ msgid "You've unblock %s" +#~ msgstr "%s desblokeatu duzu." + +#~ msgid "Clear" +#~ msgstr "Limpiar" diff --git a/src/locales/ar/lc_messages/twblue.mo b/src/locales/ar/lc_messages/twblue.mo new file mode 100644 index 00000000..f03c8517 Binary files /dev/null and b/src/locales/ar/lc_messages/twblue.mo differ diff --git a/src/locales/ar/lc_messages/twblue.po b/src/locales/ar/lc_messages/twblue.po new file mode 100644 index 00000000..59187b36 --- /dev/null +++ b/src/locales/ar/lc_messages/twblue.po @@ -0,0 +1,2438 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: TW Blue 0.46\n" +"POT-Creation-Date: 2014-09-07 07:44+Hora de verano central (México)\n" +"PO-Revision-Date: 2014-09-07 19:45+0300\n" +"Last-Translator: Sukil Echenique \n" +"Language-Team: Mohammed Al Shara \n" +"Language: ar\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 1.6.9\n" +"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n" +"X-Poedit-Bookmarks: -1,-1,-1,-1,-1,-1,409,-1,-1,-1\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: ../src\extra\AudioUploader\gui.py:31 ../src\gui\dialogs\message.py:169 +#: ../src\gui\dialogs\message.py:256 +msgid "Attach audio" +msgstr "إرفق مقطع صوتي" + +#: ../src\extra\AudioUploader\gui.py:38 ../src\extra\AudioUploader\gui.py:146 +#: ../src\extra\AudioUploader\gui.py:156 +msgid "Play" +msgstr "تشغيل" + +#: ../src\extra\AudioUploader\gui.py:41 ../src\extra\AudioUploader\gui.py:75 +#: ../src\extra\AudioUploader\gui.py:80 ../src\extra\AudioUploader\gui.py:107 +msgid "Pause" +msgstr "إيقاف مؤقت" + +#: ../src\extra\AudioUploader\gui.py:44 ../src\extra\AudioUploader\gui.py:103 +msgid "Record" +msgstr "تسجيل" + +#: ../src\extra\AudioUploader\gui.py:47 +msgid "Add an existing file" +msgstr "إضف ملف موجود" + +#: ../src\extra\AudioUploader\gui.py:49 +msgid "Discard" +msgstr "التراجع" + +#: ../src\extra\AudioUploader\gui.py:52 +msgid "Upload to" +msgstr "إرفع إلى" + +#: ../src\extra\AudioUploader\gui.py:57 +msgid "Attach" +msgstr "إرفق" + +#: ../src\extra\AudioUploader\gui.py:59 ../src\issueReporter\gui.py:88 +msgid "Cancel" +msgstr "إلغاء" + +#: ../src\extra\AudioUploader\gui.py:77 ../src\extra\AudioUploader\gui.py:78 +msgid "Resume" +msgstr "متابعة" + +#: ../src\extra\AudioUploader\gui.py:95 +msgid "Stop recording" +msgstr "إيقاف التسجيل" + +#: ../src\extra\AudioUploader\gui.py:96 +msgid "Recording" +msgstr "جاري التسجيل" + +#: ../src\extra\AudioUploader\gui.py:101 ../src\extra\AudioUploader\gui.py:153 +msgid "Stopped" +msgstr "تم إيقافه" + +#: ../src\extra\AudioUploader\gui.py:128 ../src\gui\dialogs\message.py:218 +#: ../src\gui\dialogs\update_profile.py:87 +msgid "Discarded" +msgstr "تم التراجع" + +#: ../src\extra\AudioUploader\gui.py:138 ../src\gui\buffers\base.py:303 +#: ../src\gui\buffers\base.py:315 +msgid "Playing..." +msgstr "جاري التشغيل" + +#: ../src\extra\AudioUploader\gui.py:142 +msgid "Stop" +msgstr "إيقاف" + +#: ../src\extra\AudioUploader\gui.py:161 +msgid "Recoding audio..." +msgstr "جاري تسجيل الصوت" + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Audio Files (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" +msgstr "الملفات الصوتية (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Select the audio file to be uploaded" +msgstr "إختر الملف الصوتي الذي تريد رفعه" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:15 +msgid "File" +msgstr "ملف" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:21 +msgid "Transferred" +msgstr "تم النقله" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:26 +msgid "Total file size" +msgstr "الحجم الكلي للملف" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:31 +msgid "Transfer rate" +msgstr "سرعة التحميل" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:36 +msgid "Time left" +msgstr "الوقت المتبقي" + +#: ../src\extra\AudioUploader\utils.py:27 +msgid "%d day, " +msgstr "%d يوم" + +#: ../src\extra\AudioUploader\utils.py:29 +msgid "%d days, " +msgstr "%d أيام" + +#: ../src\extra\AudioUploader\utils.py:31 +msgid "%d hour, " +msgstr "%d ساعة" + +#: ../src\extra\AudioUploader\utils.py:33 +msgid "%d hours, " +msgstr "%d ساعات" + +#: ../src\extra\AudioUploader\utils.py:35 +msgid "%d minute, " +msgstr "%d دقيقة" + +#: ../src\extra\AudioUploader\utils.py:37 +msgid "%d minutes, " +msgstr "%d دقائق" + +#: ../src\extra\AudioUploader\utils.py:39 +msgid "%s second" +msgstr "%s ثانية" + +#: ../src\extra\AudioUploader\utils.py:41 +msgid "%s seconds" +msgstr "%s ثواني" + +#: ../src\extra\SoundsTutorial\gui.py:11 +msgid "The tweet may contain a playable audio" +msgstr "قد تتضمن التغريدة مقطع صوتي يمكن تشغيله" + +#: ../src\extra\SoundsTutorial\gui.py:12 +msgid "A timeline has been created" +msgstr "تم إنشاء السياق الزمني" + +#: ../src\extra\SoundsTutorial\gui.py:13 +msgid "A timeline has been deleted" +msgstr "تم حذف السياق الزمني" + +#: ../src\extra\SoundsTutorial\gui.py:14 +msgid "You've received a direct message" +msgstr "وصلك رسالة خاصة" + +#: ../src\extra\SoundsTutorial\gui.py:15 +msgid "You've sent a direct message" +msgstr "لقد قمت بإرسال رسالة خاصة" + +#: ../src\extra\SoundsTutorial\gui.py:16 +msgid "A bug has happened" +msgstr "حدث عطل" + +#: ../src\extra\SoundsTutorial\gui.py:17 +msgid "You've added a tweet to your favourites" +msgstr "لقد قمت بإضافة تغريدة إلى مفضلتك" + +#: ../src\extra\SoundsTutorial\gui.py:18 +msgid "Someone's favourites have been updated" +msgstr "تم تحديث مفضلات شخص ما" + +#: ../src\extra\SoundsTutorial\gui.py:19 +msgid "There are no more tweets to read" +msgstr "لا يوجد أي تغريدات للقراءة" + +#: ../src\extra\SoundsTutorial\gui.py:20 +msgid "A list has a new tweet" +msgstr "تمت إضافة تغريدة إلى قائمة" + +#: ../src\extra\SoundsTutorial\gui.py:21 +msgid "You can't add any more characters on the tweet" +msgstr "لا يمكن إضافة أي تحرف إلى التغريدة" + +#: ../src\extra\SoundsTutorial\gui.py:22 +msgid "You've been mentioned " +msgstr "تمت الإشارة إليك" + +#: ../src\extra\SoundsTutorial\gui.py:23 +msgid "A new event has happened" +msgstr "هناك حدث جديد" + +#: ../src\extra\SoundsTutorial\gui.py:24 +msgid "TW Blue is ready " +msgstr "برنامج TW Blue جاهز" + +#: ../src\extra\SoundsTutorial\gui.py:25 +msgid "You've replied" +msgstr "لقد قمت بالرد" + +#: ../src\extra\SoundsTutorial\gui.py:26 +msgid "You've retweeted" +msgstr "لقد قمت بإعادة التغريد" + +#: ../src\extra\SoundsTutorial\gui.py:27 +msgid "A search has been updated" +msgstr "تم تحديث بحث" + +#: ../src\extra\SoundsTutorial\gui.py:28 +msgid "There's a new tweet in the main buffer" +msgstr "هناك تغريدة جديدة في الصفحة الرئيسية" + +#: ../src\extra\SoundsTutorial\gui.py:29 +msgid "You've sent a tweet" +msgstr "لقد قمت بإرسال تغريدة جديدة" + +#: ../src\extra\SoundsTutorial\gui.py:30 +msgid "There's a new tweet in a timeline" +msgstr "هناك تغريدة جديدة في السياق الزمني" + +#: ../src\extra\SoundsTutorial\gui.py:31 +msgid "You have a new follower" +msgstr "لديك متابع جديد" + +#: ../src\extra\SoundsTutorial\gui.py:32 +msgid "You've turned the volume up or down" +msgstr "لقد قمت بتخفيض أو رفع مستوى الصوت" + +#: ../src\extra\SoundsTutorial\gui.py:36 +msgid "" +"It seems as though the currently used sound pack needs an update. %i fails " +"are still be required to use this function. Make sure to obtain the needed " +"lacking sounds or to contact with the sound pack developer." +msgstr "" +"يبدو أن حزمة الأصوات المستخدمة حاليا تحتاج إلى ترقية. قم بالتأكد من حصولك " +"على الأصوات الناقصة أو تواصل مع مطور حزمة الأصوات هذه." + +#: ../src\extra\SoundsTutorial\gui.py:36 ../src\extra\SpellChecker\gui.py:34 +#: ../src\gui\dialogs\show_user.py:63 ../src\gui\main.py:703 +#: ../src\gui\main.py:734 ../src\issueReporter\gui.py:98 +#: ../src\issueReporter\gui.py:101 +msgid "Error" +msgstr "خطء" + +#: ../src\extra\SoundsTutorial\gui.py:38 ../src\gui\main.py:68 +msgid "Sounds tutorial" +msgstr "مُعَلِم الأصوات" + +#: ../src\extra\SoundsTutorial\gui.py:41 +msgid "Press enter to listen to the sound for the selected event" +msgstr "إضغط مفتاح الدخول لسماع الصوت" + +#: ../src\extra\SpellChecker\gui.py:34 +msgid "" +"A bug has happened. There are no dictionaries available for the selected " +"language in TW Blue" +msgstr "لقد حدث خطء. لا يوجد قاموس للغة المختارة في TW Blue" + +#: ../src\extra\SpellChecker\gui.py:38 +msgid "Mis-spelled word" +msgstr "كلمة فيها خطء إملائي" + +#: ../src\extra\SpellChecker\gui.py:43 +msgid "Context" +msgstr "السياق" + +#: ../src\extra\SpellChecker\gui.py:48 +msgid "Suggestions" +msgstr "إقتراحات" + +#: ../src\extra\SpellChecker\gui.py:53 +msgid "Ignore" +msgstr "تجاهل" + +#: ../src\extra\SpellChecker\gui.py:55 +msgid "Ignore all" +msgstr "تجاهل الكل" + +#: ../src\extra\SpellChecker\gui.py:57 +msgid "Replace" +msgstr "إستبدل" + +#: ../src\extra\SpellChecker\gui.py:59 +msgid "Replace all" +msgstr "إستبدل الكل" + +#: ../src\extra\SpellChecker\gui.py:78 +msgid "Mis-spelled word: %s" +msgstr "كلمة فيها خطء إملائي %s" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "Finished" +msgstr "إنتها" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "The spelling review has finished." +msgstr "تم إستكمال التدقيق الإملائي" + +#: ../src\extra\translator\gui.py:24 ../src\gui\dialogs\message.py:177 +#: ../src\gui\dialogs\message.py:264 ../src\gui\dialogs\message.py:350 +msgid "Translate message" +msgstr "ترجم الرسالة" + +#: ../src\extra\translator\gui.py:27 +msgid "Source language" +msgstr "اللغة الأصلية" + +#: ../src\extra\translator\gui.py:30 +msgid "Target language" +msgstr "اللغة الهدف" + +#: ../src\extra\translator\translator.py:53 +msgid "Afrikaans" +msgstr "الإفريقية" + +#: ../src\extra\translator\translator.py:54 +msgid "Albanian" +msgstr "الألبانية" + +#: ../src\extra\translator\translator.py:55 +msgid "Amharic" +msgstr "الأمهارية" + +#: ../src\extra\translator\translator.py:56 +msgid "Arabic" +msgstr "العربية" + +#: ../src\extra\translator\translator.py:57 +msgid "Armenian" +msgstr "الأرمينية" + +#: ../src\extra\translator\translator.py:58 +msgid "Azerbaijani" +msgstr "Azerbaijani" + +#: ../src\extra\translator\translator.py:59 +msgid "Basque" +msgstr "Basque" + +#: ../src\extra\translator\translator.py:60 +msgid "Belarusian" +msgstr "Belarusian" + +#: ../src\extra\translator\translator.py:61 +msgid "Bengali" +msgstr "بنغالي" + +#: ../src\extra\translator\translator.py:62 +msgid "Bihari" +msgstr "Bihari" + +#: ../src\extra\translator\translator.py:63 +msgid "Bulgarian" +msgstr "بللغاري" + +#: ../src\extra\translator\translator.py:64 +msgid "Burmese" +msgstr "Burmese" + +#: ../src\extra\translator\translator.py:65 +msgid "Catalan" +msgstr "Catalan" + +#: ../src\extra\translator\translator.py:66 +msgid "Cherokee" +msgstr "Cherokee" + +#: ../src\extra\translator\translator.py:67 +msgid "Chinese" +msgstr "الصينية" + +#: ../src\extra\translator\translator.py:68 +msgid "Chinese_simplified" +msgstr "الصينية المبسطة" + +#: ../src\extra\translator\translator.py:69 +msgid "Chinese_traditional" +msgstr "الصينية التقليدية " + +#: ../src\extra\translator\translator.py:70 +msgid "Croatian" +msgstr "Croatian" + +#: ../src\extra\translator\translator.py:71 +msgid "Czech" +msgstr "Czech" + +#: ../src\extra\translator\translator.py:72 +msgid "Danish" +msgstr "Danish" + +#: ../src\extra\translator\translator.py:73 +msgid "Dhivehi" +msgstr "Dhivehi" + +#: ../src\extra\translator\translator.py:74 +msgid "Dutch" +msgstr "Dutch" + +#: ../src\extra\translator\translator.py:75 +msgid "English" +msgstr "الإنجليزية" + +#: ../src\extra\translator\translator.py:76 +msgid "Esperanto" +msgstr "Esperanto" + +#: ../src\extra\translator\translator.py:77 +msgid "Estonian" +msgstr "Estonian" + +#: ../src\extra\translator\translator.py:78 +msgid "Filipino" +msgstr "الفلبينية" + +#: ../src\extra\translator\translator.py:79 +msgid "Finnish" +msgstr "الينيقي" + +#: ../src\extra\translator\translator.py:80 +msgid "French" +msgstr "الفرنسية" + +#: ../src\extra\translator\translator.py:81 +msgid "Galician" +msgstr "Galician" + +#: ../src\extra\translator\translator.py:82 +msgid "Georgian" +msgstr "Georgian" + +#: ../src\extra\translator\translator.py:83 +msgid "German" +msgstr "الألمانيةGerman" + +#: ../src\extra\translator\translator.py:84 +msgid "Greek" +msgstr "اليونانية" + +#: ../src\extra\translator\translator.py:85 +msgid "Guarani" +msgstr "Guarani" + +#: ../src\extra\translator\translator.py:86 +msgid "Gujarati" +msgstr "Gujarati" + +#: ../src\extra\translator\translator.py:87 +msgid "Hebrew" +msgstr "العبرية" + +#: ../src\extra\translator\translator.py:88 +msgid "Hindi" +msgstr "الهندية" + +#: ../src\extra\translator\translator.py:89 +msgid "Hungarian" +msgstr "هنجاري" + +#: ../src\extra\translator\translator.py:90 +msgid "Icelandic" +msgstr "Icelandic" + +#: ../src\extra\translator\translator.py:91 +msgid "Indonesian" +msgstr "الإندونيسية" + +#: ../src\extra\translator\translator.py:92 +msgid "Inuktitut" +msgstr "Inuktitut" + +#: ../src\extra\translator\translator.py:93 +msgid "Irish" +msgstr "الأيرلندلية" + +#: ../src\extra\translator\translator.py:94 +msgid "Italian" +msgstr "الإيطالية" + +#: ../src\extra\translator\translator.py:95 +msgid "Japanese" +msgstr "اليابانية" + +#: ../src\extra\translator\translator.py:96 +msgid "Kannada" +msgstr "Kannada" + +#: ../src\extra\translator\translator.py:97 +msgid "Kazakh" +msgstr "Kazakh" + +#: ../src\extra\translator\translator.py:98 +msgid "Khmer" +msgstr "Khmer" + +#: ../src\extra\translator\translator.py:99 +msgid "Korean" +msgstr "الكورية" + +#: ../src\extra\translator\translator.py:100 +msgid "Kurdish" +msgstr "الكردية" + +#: ../src\extra\translator\translator.py:101 +msgid "Kyrgyz" +msgstr "Kyrgyz" + +#: ../src\extra\translator\translator.py:102 +msgid "Laothian" +msgstr "Laothian" + +#: ../src\extra\translator\translator.py:103 +msgid "Latvian" +msgstr "الاتيفية" + +#: ../src\extra\translator\translator.py:104 +msgid "Lithuanian" +msgstr "الثوانية" + +#: ../src\extra\translator\translator.py:105 +msgid "Macedonian" +msgstr "المسدونية" + +#: ../src\extra\translator\translator.py:106 +msgid "Malay" +msgstr "المالية" + +#: ../src\extra\translator\translator.py:107 +msgid "Malayalam" +msgstr "Malayalam" + +#: ../src\extra\translator\translator.py:108 +msgid "Maltese" +msgstr "Maltese" + +#: ../src\extra\translator\translator.py:109 +msgid "Marathi" +msgstr "Marathi" + +#: ../src\extra\translator\translator.py:110 +msgid "Mongolian" +msgstr "Mongolian" + +#: ../src\extra\translator\translator.py:111 +msgid "Nepali" +msgstr "Nepali" + +#: ../src\extra\translator\translator.py:112 +msgid "Norwegian" +msgstr "النرويجية" + +#: ../src\extra\translator\translator.py:113 +msgid "Oriya" +msgstr "Oriya" + +#: ../src\extra\translator\translator.py:114 +msgid "Pashto" +msgstr "Pashto" + +#: ../src\extra\translator\translator.py:115 +msgid "Persian" +msgstr "فارسي" + +#: ../src\extra\translator\translator.py:116 +msgid "Polish" +msgstr "البولندية" + +#: ../src\extra\translator\translator.py:117 +msgid "Portuguese" +msgstr "البرتغالية" + +#: ../src\extra\translator\translator.py:118 +msgid "Punjabi" +msgstr "Punjabi" + +#: ../src\extra\translator\translator.py:119 +msgid "Romanian" +msgstr "الرومانية" + +#: ../src\extra\translator\translator.py:120 +msgid "Russian" +msgstr "الروسية" + +#: ../src\extra\translator\translator.py:121 +msgid "Sanskrit" +msgstr "السنسكريتية" + +#: ../src\extra\translator\translator.py:122 +msgid "Serbian" +msgstr "الصربية" + +#: ../src\extra\translator\translator.py:123 +msgid "Sindhi" +msgstr "Sindhi" + +#: ../src\extra\translator\translator.py:124 +msgid "Sinhalese" +msgstr "Sinhalese" + +#: ../src\extra\translator\translator.py:125 +msgid "Slovak" +msgstr "السلوفاكية" + +#: ../src\extra\translator\translator.py:126 +msgid "Slovenian" +msgstr "السلوفية" + +#: ../src\extra\translator\translator.py:127 +msgid "Spanish" +msgstr "الإسبانية" + +#: ../src\extra\translator\translator.py:128 +msgid "Swahili" +msgstr "السواحيلي" + +#: ../src\extra\translator\translator.py:129 +msgid "Swedish" +msgstr "السويدية" + +#: ../src\extra\translator\translator.py:130 +msgid "Tajik" +msgstr "Tajik" + +#: ../src\extra\translator\translator.py:131 +msgid "Tamil" +msgstr "Tamil" + +#: ../src\extra\translator\translator.py:132 +msgid "Tagalog" +msgstr "Tagalog" + +#: ../src\extra\translator\translator.py:133 +msgid "Telugu" +msgstr "Telugu" + +#: ../src\extra\translator\translator.py:134 +msgid "Thai" +msgstr "Thai" + +#: ../src\extra\translator\translator.py:135 +msgid "Tibetan" +msgstr "Tibetan" + +#: ../src\extra\translator\translator.py:136 +msgid "Turkish" +msgstr "التركية" + +#: ../src\extra\translator\translator.py:137 +msgid "Ukrainian" +msgstr "الأكرونية" + +#: ../src\extra\translator\translator.py:138 +msgid "Urdu" +msgstr "الأوردية" + +#: ../src\extra\translator\translator.py:139 +msgid "Uzbek" +msgstr "الأوباكستانية" + +#: ../src\extra\translator\translator.py:140 +msgid "Uighur" +msgstr "Uighur" + +#: ../src\extra\translator\translator.py:141 +msgid "Vietnamese" +msgstr "الفيتمينية" + +#: ../src\extra\translator\translator.py:142 +msgid "Welsh" +msgstr "Welsh" + +#: ../src\extra\translator\translator.py:143 +msgid "Yiddish" +msgstr "Yiddish" + +#: ../src\extra\translator\translator.py:150 +msgid "autodetect" +msgstr "إستكشاف ألي" + +#: ../src\gui\buffers\base.py:54 +msgid "Client" +msgstr "برنامج التحكم" + +#: ../src\gui\buffers\base.py:54 +msgid "Text" +msgstr "النص" + +#: ../src\gui\buffers\base.py:54 ../src\gui\buffers\events.py:57 +msgid "Date" +msgstr "تاريخ" + +#: ../src\gui\buffers\base.py:54 ../src\gui\buffers\people.py:39 +#: ../src\gui\buffers\user_searches.py:31 ../src\gui\dialogs\utils.py:36 +#: ../src\gui\main.py:154 +msgid "User" +msgstr "المستخدم" + +#: ../src\gui\buffers\base.py:73 ../src\gui\buffers\base.py:192 +#: ../src\gui\buffers\events.py:58 ../src\gui\buffers\events.py:74 +#: ../src\gui\dialogs\message.py:332 ../src\gui\main.py:79 +#: ../src\gui\main.py:153 ../src\gui\sysTrayIcon.py:34 +msgid "Tweet" +msgstr "تغريدة" + +#: ../src\gui\buffers\base.py:75 ../src\gui\buffers\base.py:204 +#: ../src\gui\main.py:83 ../src\keystrokeEditor\constants.py:13 +msgid "Retweet" +msgstr "إعادة التغريد" + +#: ../src\gui\buffers\base.py:77 ../src\gui\main.py:81 +msgid "Reply" +msgstr "الرد" + +#: ../src\gui\buffers\base.py:79 ../src\gui\main.py:110 +msgid "Direct message" +msgstr "رسالة خاصة" + +#: ../src\gui\buffers\base.py:92 +msgid "Do you really want to delete this timeline?" +msgstr "هل أنت متأكد من أنك تريد حذف السياق الزمني هذا؟" + +#: ../src\gui\buffers\base.py:92 ../src\gui\buffers\favourites.py:41 +#: ../src\gui\buffers\lists.py:46 ../src\gui\buffers\trends.py:41 +#: ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Attention" +msgstr "تنبيه" + +#: ../src\gui\buffers\base.py:104 +msgid "This buffer is not a timeline; it can't be deleted." +msgstr "هذه الصفحة ليست سياق زمني ولا يمكن حذفها" + +#: ../src\gui\buffers\base.py:184 ../src\gui\buffers\dm.py:44 +#: ../src\gui\buffers\people.py:54 +msgid "Direct message to %s" +msgstr "رسالة خاصة ل%s" + +#: ../src\gui\buffers\base.py:192 ../src\gui\buffers\events.py:74 +msgid "Write the tweet here" +msgstr "إكتب التغريدة هنا" + +#: ../src\gui\buffers\base.py:204 +msgid "Would you like to add a comment to this tweet?" +msgstr "هل ترغب بإضافة تعليق إلى هذه التغريدة؟" + +#: ../src\gui\buffers\base.py:207 +msgid "Add your comment to the tweet" +msgstr "إضف تعليقك للتغريدة" + +#: ../src\gui\buffers\base.py:223 ../src\gui\buffers\people.py:62 +msgid "Reply to %s" +msgstr "الرد على %s" + +#: ../src\gui\buffers\base.py:268 +msgid "Opening URL..." +msgstr "إفتح عنوان جديد" + +#: ../src\gui\buffers\base.py:285 ../src\gui\buffers\events.py:118 +msgid "" +"Do you really want to empty this buffer? It's tweets will be removed from " +"the list but not from Twitter" +msgstr "" +"هل أنت متأكد من رغبتك بإفراغ هذه الصفحة؟ ستزال التغريدات من هذه الصفحة وليس " +"من تويتر" + +#: ../src\gui\buffers\base.py:285 ../src\gui\buffers\events.py:118 +msgid "Empty buffer" +msgstr "إفراغ السياق الزمني" + +#: ../src\gui\buffers\base.py:290 ../src\gui\buffers\events.py:122 +msgid "Do you really want to delete this message?" +msgstr "هل أنت متأكد من رغبتك بحذف هذه الرسالة؟" + +#: ../src\gui\buffers\base.py:290 ../src\gui\buffers\events.py:122 +#: ../src\gui\dialogs\lists.py:107 ../src\gui\main.py:91 +#: ../src\gui\main.py:577 +msgid "Delete" +msgstr "حذف" + +#: ../src\gui\buffers\base.py:310 ../src\gui\buffers\base.py:321 +msgid "Unable to play audio." +msgstr "لا يمكن تشغيل المقطع الصوتي" + +#: ../src\gui\buffers\base.py:312 +msgid "Audio stopped." +msgstr "تم إيقاف تشغيل المقطع الصوتي" + +#: ../src\gui\buffers\events.py:40 +msgid "Empty" +msgstr "إفراغ" + +#: ../src\gui\buffers\events.py:57 +msgid "Event" +msgstr "حدث" + +#: ../src\gui\buffers\events.py:60 +msgid "Remove event" +msgstr "حذف الحدث" + +#: ../src\gui\buffers\favourites.py:41 +msgid "Do you really want to delete this favourites timeline?" +msgstr "هل أنت متأكد من رغبتك بحذف السياق الزمني للمفضلة؟" + +#: ../src\gui\buffers\lists.py:46 ../src\gui\dialogs\lists.py:107 +msgid "Do you really want to delete this list?" +msgstr "هل أنت متأكد من رغبتك بإزالة هذه القائمة؟" + +#: ../src\gui\buffers\panels.py:27 +msgid "Announce" +msgstr "أعلن" + +#: ../src\gui\buffers\people.py:44 +msgid "Mention" +msgstr "إشارة" + +#: ../src\gui\buffers\trends.py:41 ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Do you really want to delete this search term?" +msgstr "هل أنت متأكد أنك ترغب بحذف مصطلح البحث؟" + +#: ../src\gui\dialogs\configuration.py:39 +msgid "Language" +msgstr "اللغة" + +#: ../src\gui\dialogs\configuration.py:53 +msgid "Relative times" +msgstr "أوقات نسبية" + +#: ../src\gui\dialogs\configuration.py:57 +msgid "Activate Sapi5 when any other screen reader is not being run" +msgstr "تشغيل sapi5 عندما لا يكون أي قارء للشاشة يعمل" + +#: ../src\gui\dialogs\configuration.py:60 +msgid "Activate the auto-start of the invisible interface" +msgstr "التشغيل التلقائي لواجهة التطبيق الخفية" + +#: ../src\gui\dialogs\configuration.py:64 +msgid "" +"API calls when the stream is started (One API call equals to 200 tweetts, " +"two API calls equals 400 tweets, etc):" +msgstr "" +"عدد مرات طلبات تويتر في المرة الواحدة. مرة واحدة تعني مئتين تغريدة ومرتين " +"تعني 400 تغريدة" + +#: ../src\gui\dialogs\configuration.py:72 +msgid "Items on each API call" +msgstr "عدد العناصر في كل تحديث" + +#: ../src\gui\dialogs\configuration.py:79 +msgid "" +"Inverted buffers: The newest tweets will be shown at the beginning of the " +"lists while the oldest at the end" +msgstr "" +"عكس عرض التغريدات بحيث تكون التغريدة الأحدث في بداية القائمة فيما تكةن " +"التغريدة الأقدم في نهايتها." + +#: ../src\gui\dialogs\configuration.py:94 +msgid "Show followers" +msgstr "أظهر قائمة في المتابعين" + +#: ../src\gui\dialogs\configuration.py:97 +msgid "Show friends" +msgstr "إظهار قائمة في الأصدقاء" + +#: ../src\gui\dialogs\configuration.py:100 +msgid "Show favourites" +msgstr "إظهار قائمة المفضلات" + +#: ../src\gui\dialogs\configuration.py:103 +msgid "Show blocked users" +msgstr "إظهر المستخدمين المحذورين" + +#: ../src\gui\dialogs\configuration.py:106 +msgid "Show muted users" +msgstr "إظهر المستخدمين المكتومين" + +#: ../src\gui\dialogs\configuration.py:109 +msgid "Show events" +msgstr "إظهار الأحداث" + +#: ../src\gui\dialogs\configuration.py:119 +#: ../src\gui\dialogs\configuration.py:267 +msgid "Ignored clients" +msgstr "التطبيقات التي تم تجاهلها" + +#: ../src\gui\dialogs\configuration.py:125 +msgid "Add client" +msgstr "أضف تطبيق" + +#: ../src\gui\dialogs\configuration.py:126 +msgid "Remove client" +msgstr "إحذف تطبيق" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Add a new ignored client" +msgstr "إضف تطبيق متجاهل جديد" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Enter the name of the client here" +msgstr "أدخل إسم التطبيق هنا" + +#: ../src\gui\dialogs\configuration.py:154 +msgid "Volume" +msgstr "مستوا الصوت" + +#: ../src\gui\dialogs\configuration.py:163 +msgid "Global mute" +msgstr "الكتم العام" + +#: ../src\gui\dialogs\configuration.py:167 +msgid "Output device" +msgstr "جهاز إخراج الصوت" + +#: ../src\gui\dialogs\configuration.py:176 +msgid "Input device" +msgstr "جهاز إدخال الصوت" + +#: ../src\gui\dialogs\configuration.py:184 +msgid "" +"If you've got a SndUp account, enter your API Key here. Whether the API Key " +"is wrong, the App will fail to upload anything to the server. Whether " +"there's no API Key here, then the audio files will be uploaded anonimously" +msgstr "" +"إذا كان لديك حساب SndUp الرجاء إدخال رقم مفتاح الحساب هنا. إذا كان الرقم " +"خاطئا فإن التطبيق سيفشل برفع أي شيء إلى الخادم. أما إذا لم يكن لديك حساب " +"فإن الملفات سترفع بإسم مجهول." + +#: ../src\gui\dialogs\configuration.py:197 +msgid "Sound pack" +msgstr "حزمة صوت" + +#: ../src\gui\dialogs\configuration.py:213 +#: ../src\gui\dialogs\configuration.py:237 +msgid "Unlink your Dropbox account" +msgstr "فك ربط حساب الدروب بوكس." + +#: ../src\gui\dialogs\configuration.py:215 +#: ../src\gui\dialogs\configuration.py:232 +#: ../src\gui\dialogs\configuration.py:240 +#: ../src\gui\dialogs\configuration.py:244 +#: ../src\gui\dialogs\configuration.py:251 +msgid "Link your Dropbox account" +msgstr "إربط حساب الدروب بوكس الخاص بك." + +#: ../src\gui\dialogs\configuration.py:225 +msgid "" +"The authorisation request will be shown on your browser. Copy the code tat " +"Dropbox will provide and, in the text box that will appear on TW Blue, paste " +"it. This code is necessary to continue. You only need to do it once." +msgstr "" +"سيظهر طلب التحقق في متصفحك. الرجاء نسخ رمز التحقق الذي سيعطيه الدروب بوكس " +"وإلصقه في المربع الذي سيظهره TW Blue. هذا الرمز ضروري كي تتمكن من المتابعة. " +"تحتاج إلى فعل ذلك مرة واحدة فقط." + +#: ../src\gui\dialogs\configuration.py:225 ../src\sessionmanager\gui.py:83 +msgid "Authorisation" +msgstr "التحقق" + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Enter the code here." +msgstr "إدخل الرمزهنا." + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Verification code" +msgstr "رمز التحقق" + +#: ../src\gui\dialogs\configuration.py:239 +#, fuzzy +msgid "Error during authorisation. Try again later." +msgstr "خطء في الإتصال. الرجاء المحاولة مرة أخرى لاحقا." + +#: ../src\gui\dialogs\configuration.py:239 ../src\gui\main.py:718 +#: ../src\gui\main.py:749 +msgid "Error!" +msgstr "خطء" + +#: ../src\gui\dialogs\configuration.py:258 +msgid "TW Blue preferences" +msgstr "خيارات إعداد TW Blue" + +#: ../src\gui\dialogs\configuration.py:262 ../src\issueReporter\gui.py:30 +msgid "General" +msgstr "عام" + +#: ../src\gui\dialogs\configuration.py:265 +msgid "Show other buffers" +msgstr "إظهر الصفحات الأخرى" + +#: ../src\gui\dialogs\configuration.py:269 +msgid "Sound" +msgstr "الصوت" + +#: ../src\gui\dialogs\configuration.py:271 +msgid "Audio Services" +msgstr "خدمات الصوت" + +#: ../src\gui\dialogs\configuration.py:274 +msgid "Save" +msgstr "حفظ" + +#: ../src\gui\dialogs\configuration.py:277 ../src\gui\dialogs\follow.py:64 +#: ../src\gui\dialogs\message.py:182 ../src\gui\dialogs\message.py:269 +#: ../src\gui\dialogs\message.py:352 ../src\gui\dialogs\search.py:42 +#: ../src\gui\dialogs\show_user.py:42 ../src\gui\dialogs\update_profile.py:56 +#: ../src\gui\dialogs\utils.py:42 ../src\keystrokeEditor\gui.py:26 +msgid "Close" +msgstr "إغلاق" + +#: ../src\gui\dialogs\configuration.py:290 ../src\gui\main.py:272 +msgid "Followers" +msgstr "المتابعين" + +#: ../src\gui\dialogs\configuration.py:304 +msgid "friends" +msgstr "الأصدقاء" + +#: ../src\gui\dialogs\configuration.py:318 +msgid "Favorites" +msgstr "المفضلات" + +#: ../src\gui\dialogs\configuration.py:332 ../src\gui\main.py:290 +msgid "Events" +msgstr "الأحداث" + +#: ../src\gui\dialogs\configuration.py:343 ../src\gui\main.py:282 +msgid "Blocked users" +msgstr "المستخدمين المحذورين" + +#: ../src\gui\dialogs\configuration.py:357 ../src\gui\main.py:286 +msgid "Muted users" +msgstr "المستخدمين الذين تم كتمهم" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "Restart TW Blue" +msgstr "إعادة تشغيل TW Blue" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "" +"The application requires to be restarted to save these changes. Press OK to " +"do it now." +msgstr "" +"يحتاج التطبيق إلى إعادة التشغيل لحفظ التغيرات. إضغط على زر موافق لتفعل ذلك " +"الآن." + +#: ../src\gui\dialogs\follow.py:33 ../src\gui\dialogs\follow.py:43 +#: ../src\keystrokeEditor\gui.py:17 +msgid "Action" +msgstr "الإجراء" + +#: ../src\gui\dialogs\follow.py:44 ../src\gui\main.py:96 +msgid "Follow" +msgstr "متابعة" + +#: ../src\gui\dialogs\follow.py:45 ../src\gui\main.py:98 +msgid "Unfollow" +msgstr "إلغاء المتابعة" + +#: ../src\gui\dialogs\follow.py:46 ../src\gui\main.py:100 +#: ../src\gui\main.py:127 +msgid "Mute" +msgstr "كتم" + +#: ../src\gui\dialogs\follow.py:47 ../src\gui\main.py:102 +msgid "Unmute" +msgstr "ألغاء الكتم" + +#: ../src\gui\dialogs\follow.py:48 ../src\gui\main.py:106 +msgid "Block" +msgstr "حذر" + +#: ../src\gui\dialogs\follow.py:49 ../src\gui\main.py:108 +msgid "Unblock" +msgstr "إلغاء الحذر" + +#: ../src\gui\dialogs\follow.py:50 ../src\gui\main.py:104 +msgid "Report as spam" +msgstr "إبلاغ برسائل غير مرغوب بها" + +#: ../src\gui\dialogs\follow.py:61 ../src\gui\dialogs\search.py:40 +#: ../src\gui\dialogs\utils.py:39 ../src\keystrokeEditor\gui.py:76 +msgid "OK" +msgstr "موافق" + +#: ../src\gui\dialogs\follow.py:101 +msgid "You've muted to %s" +msgstr "لقد قمت بكتم %s" + +#: ../src\gui\dialogs\follow.py:115 +msgid "You've unmuted to %s" +msgstr "لقد قمت بإلغاء كتم %s" + +#: ../src\gui\dialogs\lists.py:36 ../src\gui\main.py:66 +msgid "Lists manager" +msgstr "مدير القوائم" + +#: ../src\gui\dialogs\lists.py:38 ../src\gui\main.py:309 +msgid "Lists" +msgstr "القوائم" + +#: ../src\gui\dialogs\lists.py:39 +msgid "List" +msgstr "القائمة" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Members" +msgstr "الإعضاء" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Owner" +msgstr "المالك" + +#: ../src\gui\dialogs\lists.py:39 +msgid "mode" +msgstr "النمط" + +#: ../src\gui\dialogs\lists.py:39 ../src\gui\dialogs\lists.py:181 +msgid "Description" +msgstr "الوصف" + +#: ../src\gui\dialogs\lists.py:44 ../src\gui\dialogs\lists.py:173 +msgid "Create a new list" +msgstr "إنشء قائمة جديدة" + +#: ../src\gui\dialogs\lists.py:46 ../src\keystrokeEditor\gui.py:22 +msgid "Edit" +msgstr "حرر" + +#: ../src\gui\dialogs\lists.py:48 ../src\gui\dialogs\lists.py:235 +msgid "Remove" +msgstr "حذف" + +#: ../src\gui\dialogs\lists.py:50 +msgid "Open in buffer" +msgstr "إفتح في صفحة جديدة" + +#: ../src\gui\dialogs\lists.py:125 +msgid "List opened" +msgstr "تم فتح القائمة" + +#: ../src\gui\dialogs\lists.py:127 +msgid "This list is arready opened." +msgstr "هذه القائمة بالفعل مفتوحة" + +#: ../src\gui\dialogs\lists.py:130 ../src\gui\main.py:312 +msgid "List for %s" +msgstr "قوائم %s" + +#: ../src\gui\dialogs\lists.py:148 +msgid "Viewing lists for %s" +msgstr "عرض القوائم ل%s" + +#: ../src\gui\dialogs\lists.py:149 +msgid "Subscribe" +msgstr "إشترك" + +#: ../src\gui\dialogs\lists.py:150 +msgid "Unsubscribe" +msgstr "إلغاء الإشتراك" + +#: ../src\gui\dialogs\lists.py:176 +msgid "Name (20 characters maximun)" +msgstr "الإسم, 20 حرف على الأكثر" + +#: ../src\gui\dialogs\lists.py:186 +msgid "Mode" +msgstr "النمط" + +#: ../src\gui\dialogs\lists.py:187 +msgid "Public" +msgstr "عامة" + +#: ../src\gui\dialogs\lists.py:188 +msgid "Private" +msgstr "خاصة" + +#: ../src\gui\dialogs\lists.py:208 +msgid "Editing the list %s" +msgstr "جاري تحرير القائمة %s" + +#: ../src\gui\dialogs\lists.py:219 +msgid "Select a list to add the user" +msgstr "إختر القائمة لإضافة المستخدم لها" + +#: ../src\gui\dialogs\lists.py:220 +msgid "Add" +msgstr "إضافة" + +#: ../src\gui\dialogs\lists.py:234 +msgid "Select a list to remove the user" +msgstr "إختر القائمة التي تريد حذف المستخدم منها" + +#: ../src\gui\dialogs\message.py:42 ../src\keystrokeEditor\constants.py:11 +msgid "New tweet" +msgstr "تغريدة جديدة" + +#: ../src\gui\dialogs\message.py:76 +msgid "Attaching..." +msgstr "جاري الإرفاق" + +#: ../src\gui\dialogs\message.py:77 +msgid "Uploading..." +msgstr "جاري التحميل" + +#: ../src\gui\dialogs\message.py:96 +msgid "Unable to upload the audio" +msgstr "غير قادر على تحميل الصوت" + +#: ../src\gui\dialogs\message.py:110 ../src\gui\dialogs\message.py:395 +msgid "Translated" +msgstr "تم ترجمته" + +#: ../src\gui\dialogs\message.py:122 +msgid "There's no URL to be shortened" +msgstr "لا يوجد رابط كي يتم تقصيره" + +#: ../src\gui\dialogs\message.py:125 +msgid "URL shortened" +msgstr "تم تقصير الرابط" + +#: ../src\gui\dialogs\message.py:133 ../src\gui\dialogs\message.py:407 +msgid "There's no URL to be expanded" +msgstr "لا يوجط رابط يمكن فك تقصيره" + +#: ../src\gui\dialogs\message.py:136 ../src\gui\dialogs\message.py:410 +msgid "URL expanded" +msgstr "تم إلغاء تقصير الرابط" + +#: ../src\gui\dialogs\message.py:164 ../src\gui\dialogs\message.py:219 +#: ../src\gui\dialogs\update_profile.py:51 +#: ../src\gui\dialogs\update_profile.py:88 +msgid "Upload a picture" +msgstr "قم بتحميل صورة" + +#: ../src\gui\dialogs\message.py:167 ../src\gui\dialogs\message.py:254 +#: ../src\gui\dialogs\message.py:345 +msgid "Spelling correction" +msgstr "تصحيح إملائي" + +#: ../src\gui\dialogs\message.py:171 ../src\gui\dialogs\message.py:258 +msgid "Shorten URL" +msgstr "قصر الرابط" + +#: ../src\gui\dialogs\message.py:173 ../src\gui\dialogs\message.py:260 +#: ../src\gui\dialogs\message.py:347 +msgid "Expand URL" +msgstr "قم بفك تقصير الرابط" + +#: ../src\gui\dialogs\message.py:179 ../src\gui\dialogs\message.py:266 +msgid "Send" +msgstr "إرسال" + +#: ../src\gui\dialogs\message.py:215 ../src\gui\dialogs\message.py:226 +#: ../src\gui\dialogs\update_profile.py:84 +#: ../src\gui\dialogs\update_profile.py:95 +msgid "Discard image" +msgstr "التراجع عن الصورة" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" +msgstr "ملفات الصور (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Select the picture to be uploaded" +msgstr "إختر الصورة التي ترغب بتحميلها" + +#: ../src\gui\dialogs\message.py:248 +msgid "Recipient" +msgstr "المرسل إليه" + +#: ../src\gui\dialogs\message.py:303 +msgid "Mention to all" +msgstr "الإشارة إلى الجميع" + +#: ../src\gui\dialogs\message.py:330 +msgid "Tweet - %i characters " +msgstr "تغريدة - %i أحرف" + +#: ../src\gui\dialogs\search.py:26 +msgid "Search on Twitter" +msgstr "البحث في تويتر" + +#: ../src\gui\dialogs\search.py:27 ../src\gui\main.py:64 +msgid "Search" +msgstr "البحث" + +#: ../src\gui\dialogs\search.py:34 +msgid "Tweets" +msgstr "التغريدات" + +#: ../src\gui\dialogs\search.py:35 +msgid "Users" +msgstr "المستخدمون" + +#: ../src\gui\dialogs\show_user.py:26 +msgid "Information for %s" +msgstr "معلومات عن %s" + +#: ../src\gui\dialogs\show_user.py:30 +msgid "Details" +msgstr "التفاصيل" + +#: ../src\gui\dialogs\show_user.py:39 +msgid "Go to URL" +msgstr "فتح الرابط" + +#: ../src\gui\dialogs\show_user.py:63 +msgid "This user does not exist on Twitter" +msgstr "هذا المستخدم غير موجود في تويتر" + +#: ../src\gui\dialogs\show_user.py:68 +msgid "Username: @%s\n" +msgstr "إسم المستخدم: @%s\n" + +#: ../src\gui\dialogs\show_user.py:69 +msgid "Name: %s\n" +msgstr "الإسم: %s\n" + +#: ../src\gui\dialogs\show_user.py:71 +msgid "Location: %s\n" +msgstr "المكان: %s\n" + +#: ../src\gui\dialogs\show_user.py:73 +msgid "URL: %s\n" +msgstr "رابط لصفحة: %s\n" + +#: ../src\gui\dialogs\show_user.py:76 +msgid "Bio: %s\n" +msgstr "السيرة الذاتية: %s\n" + +#: ../src\gui\dialogs\show_user.py:77 +msgid "Yes" +msgstr "نعم" + +#: ../src\gui\dialogs\show_user.py:78 +msgid "No" +msgstr "لا" + +#: ../src\gui\dialogs\show_user.py:79 +msgid "Protected: %s\n" +msgstr "حساب محمي: %s\n" + +#: ../src\gui\dialogs\show_user.py:80 +msgid "" +"Followers: %s\n" +" Friends: %s\n" +msgstr "" +"المتابعين : %s\n" +" الإصدقاء: %s\n" + +#: ../src\gui\dialogs\show_user.py:81 +msgid "Tweets: %s\n" +msgstr "التغريدات: %s\n" + +#: ../src\gui\dialogs\show_user.py:82 +msgid "Favourites: %s" +msgstr "المفضلات: %s" + +#: ../src\gui\dialogs\update_profile.py:27 +msgid "Update your profile" +msgstr "حدث ملفك الشخصي" + +#: ../src\gui\dialogs\update_profile.py:29 +msgid "Name (20 characters maximum)" +msgstr "الإسم, 20 حرف على الأكثر" + +#: ../src\gui\dialogs\update_profile.py:35 +msgid "Location" +msgstr "المكان" + +#: ../src\gui\dialogs\update_profile.py:40 +msgid "Website" +msgstr "الموقع الإلكتروني" + +#: ../src\gui\dialogs\update_profile.py:45 +msgid "Bio (160 characters maximum)" +msgstr "السيرة الذاتية, 160 حرف على الأكثر" + +#: ../src\gui\dialogs\update_profile.py:53 ../src\gui\main.py:60 +#: ../src\gui\sysTrayIcon.py:38 +msgid "Update profile" +msgstr "حدث ملفك الشخصي" + +#: ../src\gui\dialogs\urlList.py:26 +#, fuzzy +msgid "Select an URL" +msgstr "إختر الرابط" + +#: ../src\gui\main.py:62 +msgid "Hide window" +msgstr "إخفاء شاشة التطبيق" + +#: ../src\gui\main.py:70 +msgid "Edit keystrokes" +msgstr "حرر مفاتيح الإختصار" + +#: ../src\gui\main.py:72 ../src\gui\sysTrayIcon.py:36 +msgid "Preferences" +msgstr "الخيارات" + +#: ../src\gui\main.py:74 ../src\gui\main.py:597 ../src\gui\sysTrayIcon.py:46 +msgid "Exit" +msgstr "الخروج" + +#: ../src\gui\main.py:85 +msgid "Add to favourites" +msgstr "إضف إلى التفضيلات" + +#: ../src\gui\main.py:87 ../src\keystrokeEditor\constants.py:16 +msgid "Remove from favourites" +msgstr "حذف من التفضيلات" + +#: ../src\gui\main.py:89 ../src\keystrokeEditor\constants.py:19 +msgid "Show tweet" +msgstr "إظهار التغريدة" + +#: ../src\gui\main.py:112 ../src\keystrokeEditor\constants.py:36 +msgid "Add to list" +msgstr "الإضافة إلى قائمة" + +#: ../src\gui\main.py:114 ../src\keystrokeEditor\constants.py:37 +msgid "Remove from list" +msgstr "حذف من قائمة" + +#: ../src\gui\main.py:116 +msgid "View lists" +msgstr "عرض القوائم" + +#: ../src\gui\main.py:118 +msgid "Show user profile" +msgstr "إظهار الملف الشخصي للمستخدم" + +#: ../src\gui\main.py:120 +msgid "Timeline" +msgstr "السياق الزمني" + +#: ../src\gui\main.py:122 +msgid "View favourites" +msgstr "عرض التفضيلات" + +#: ../src\gui\main.py:129 +msgid "Autoread tweets for this buffer" +msgstr "التغريدات التلقائية لهذه الصفحة" + +#: ../src\gui\main.py:131 +msgid "Clear buffer" +msgstr "مسح التغريدات من الصفحة" + +#: ../src\gui\main.py:133 ../src\keystrokeEditor\constants.py:22 +msgid "Remove buffer" +msgstr "حذف الصفحة" + +#: ../src\gui\main.py:138 ../src\gui\sysTrayIcon.py:42 +msgid "Documentation" +msgstr "دليل المستخدم" + +#: ../src\gui\main.py:140 +msgid "What's new in this version?" +msgstr "ما هو الجديد في هذا الإصدار" + +#: ../src\gui\main.py:142 ../src\gui\sysTrayIcon.py:44 +msgid "Check for updates" +msgstr "فحص التحديثات الجديدة" + +#: ../src\gui\main.py:144 ../src\issueReporter\gui.py:34 +msgid "Report an error" +msgstr "إبلغ عن عطل" + +#: ../src\gui\main.py:146 +msgid "TW Blue website" +msgstr "موقع TW Blue الإلكتروني" + +#: ../src\gui\main.py:148 +msgid "About TW Blue" +msgstr "حول TW Blue" + +#: ../src\gui\main.py:152 +msgid "Application" +msgstr "خيارات التطبيق" + +#: ../src\gui\main.py:155 +msgid "Buffer" +msgstr "الصفحة" + +#: ../src\gui\main.py:156 +msgid "Help" +msgstr "المساعدة" + +#: ../src\gui\main.py:249 +msgid "Home" +msgstr "الصفحة الرئيسية" + +#: ../src\gui\main.py:254 +msgid "Mentions" +msgstr "الإشارات" + +#: ../src\gui\main.py:257 +msgid "Direct messages" +msgstr "الرسائل الخاصة" + +#: ../src\gui\main.py:260 +msgid "Sent" +msgstr "المرسلات" + +#: ../src\gui\main.py:266 +msgid "Favourites" +msgstr "التفضيلات" + +#: ../src\gui\main.py:278 +msgid "Friends" +msgstr "الإصدقاء" + +#: ../src\gui\main.py:293 +#, fuzzy +msgid "Searches" +msgstr "البحث" + +#: ../src\gui\main.py:303 +#, fuzzy +msgid "Timelines" +msgstr "السياق الزمني" + +#: ../src\gui\main.py:306 ../src\gui\main.py:714 +msgid "Timeline for %s" +msgstr "السياق الزمني الخاص ب%s" + +#: ../src\gui\main.py:317 +#, fuzzy +msgid "Favourites timelines" +msgstr "المفضلات: %s" + +#: ../src\gui\main.py:320 ../src\gui\main.py:745 +msgid "Favourites for %s" +msgstr "التفضيلات الخاصة ب%s" + +#: ../src\gui\main.py:361 +msgid "Ready" +msgstr "جاهز" + +#: ../src\gui\main.py:388 +msgid "%s favourites from %s" +msgstr "%s التفضيلات من %s" + +#: ../src\gui\main.py:435 +msgid "Streams disconnected. TW Blue will try to reconnect in a minute." +msgstr "تم قطع الإتصال. سيحاول TW Blue إعادة الإتصال في خلال دقيقة" + +#: ../src\gui\main.py:439 +msgid "Reconnecting streams..." +msgstr "جاري إعادة الإتصال" + +#: ../src\gui\main.py:463 +msgid "search for %s" +msgstr "البحث عن %s" + +#: ../src\gui\main.py:468 +msgid "search users for %s" +msgstr "البحث في المستخدمين عن المستخدم %s" + +#: ../src\gui\main.py:479 ../src\gui\main.py:490 ../src\gui\main.py:509 +msgid "Select the user" +msgstr "إختر المستخدم" + +#: ../src\gui\main.py:569 +msgid "User details" +msgstr "تفاصيل المستخدم" + +#: ../src\gui\main.py:577 +msgid "" +"Do you really want to delete this message? It will be eliminated from " +"Twitter as well." +msgstr "هل أنت متأكد من رغبة بحذف هذه الرسالة؟ سيتم إزالتها من تويتر." + +#: ../src\gui\main.py:597 +msgid "Do you really want to close TW Blue?" +msgstr "هل أنت متأكد من رغبتك في إغلاق TW Blue?" + +#: ../src\gui\main.py:687 +msgid "Error while adding to favourites." +msgstr "حدث خطء أثناء الإضافة إلى التفضيلات" + +#: ../src\gui\main.py:695 +msgid "Error while removing from favourites." +msgstr "حدث خطء أثناء الإزالة من التفضيلات" + +#: ../src\gui\main.py:699 +msgid "Individual timeline" +msgstr "السياق الزمني الفردي" + +#: ../src\gui\main.py:703 ../src\gui\main.py:734 +msgid "The user does not exist" +msgstr "المستخدم غير موجود" + +#: ../src\gui\main.py:709 +msgid "Existing timeline" +msgstr "السياق الزمني موجود مسبقا" + +#: ../src\gui\main.py:709 +msgid "" +"There's currently a timeline for this user. You are not able to open another" +msgstr "يوجد بالفعل سياق زمني مفتوح خاص بهذا المستخدم. لا يمكن فتح آخر." + +#: ../src\gui\main.py:718 +msgid "This user has no tweets. You can't open a timeline for this user" +msgstr "هذا المستخدم لا يوجد له أي تغريدات. لا يمكن فتح سياق زمني خاص به." + +#: ../src\gui\main.py:730 +msgid "List of favourites" +msgstr "إظهار تفضيلاتك" + +#: ../src\gui\main.py:740 +msgid "Existing list" +msgstr "القوائم الموجودة" + +#: ../src\gui\main.py:740 +msgid "" +"There's already a list of favourites for this user. You can't create another." +msgstr "يوجد بالفعل قائمة بالتفضيلات لهذا المستخدم. لا يمكن إنشاء أخرى." + +#: ../src\gui\main.py:749 +msgid "" +"This user has no favourites. You can't create a list of favourites for this " +"user." +msgstr "لا توجد تفضيلات لهذا المستخدم, لا يمكن إنشاء قائمة بتفضيلاته." + +#: ../src\gui\main.py:791 ../src\gui\main.py:804 +msgid "%s, %s of %s" +msgstr "%s, %sالخاصة ب%s" + +#: ../src\gui\main.py:793 ../src\gui\main.py:806 +msgid "%s. Empty" +msgstr "%s فارغة" + +#: ../src\gui\main.py:829 +msgid "Global mute on" +msgstr "تم تشغيل الكتم الكلي." + +#: ../src\gui\main.py:832 +msgid "Global mute off" +msgstr "تم تعطيل الكتم الكلي" + +#: ../src\gui\main.py:838 +msgid "Buffer mute on" +msgstr "تم تشغيل الكتم الخاص بهذه الصفحة." + +#: ../src\gui\main.py:841 +msgid "Buffer mute off" +msgstr "تم تعطيل الكتم الخاص بهذه الصفحة." + +#: ../src\gui\main.py:847 +msgid "The auto-reading of new tweets is enabled for this buffer" +msgstr "القراءة التلقائية للتغريدات الجديدة مفعلة لهذه الصفحة." + +#: ../src\gui\main.py:850 +msgid "The auto-reading of new tweets is disabled for this buffer" +msgstr "القراءة التلقائية للتغريدات الجديدة معطلة لهذه الصفحة." + +#: ../src\gui\main.py:857 +msgid "Copied" +msgstr "تم النسخ" + +#: ../src\gui\main.py:868 ../src\gui\main.py:877 +msgid "%s" +msgstr "%s" + +#: ../src\gui\sysTrayIcon.py:40 +msgid "Show / hide" +msgstr "الإظهار او الإخفاء" + +#: ../src\issueReporter\gui.py:31 +msgid "always" +msgstr "دائما" + +#: ../src\issueReporter\gui.py:31 +msgid "have not tried" +msgstr "لم تحاول" + +#: ../src\issueReporter\gui.py:31 +msgid "random" +msgstr "عشوائي" + +#: ../src\issueReporter\gui.py:31 +msgid "sometimes" +msgstr "بعض الأحيان" + +#: ../src\issueReporter\gui.py:31 +#, fuzzy +msgid "unable to duplicate" +msgstr "غير قادر على تحميل الصوت" + +#: ../src\issueReporter\gui.py:32 +#, fuzzy +msgid "block" +msgstr "إلغاء الحذر" + +#: ../src\issueReporter\gui.py:32 +msgid "crash" +msgstr "توقف عن العمل" + +#: ../src\issueReporter\gui.py:32 +msgid "feature" +msgstr "ميزة" + +#: ../src\issueReporter\gui.py:32 +msgid "major" +msgstr "" + +#: ../src\issueReporter\gui.py:32 +msgid "minor" +msgstr "" + +#: ../src\issueReporter\gui.py:32 +#, fuzzy +msgid "text" +msgstr "السياق" + +#: ../src\issueReporter\gui.py:32 +msgid "trivial" +msgstr "" + +#: ../src\issueReporter\gui.py:32 +msgid "tweak" +msgstr "" + +#: ../src\issueReporter\gui.py:37 +#, fuzzy +msgid "Select a category" +msgstr "إختر المستخدم" + +#: ../src\issueReporter\gui.py:46 +msgid "" +"Briefly describe what happened. You will be able to thoroughly explain it " +"later" +msgstr "إوصف ما حدث بإختصار. ستكون قادر على تفسيره لاحقا." + +#: ../src\issueReporter\gui.py:56 +msgid "Here, you can describe the bug in detail" +msgstr "هنا بإمكانك وصف العطل بالتفاصيل" + +#: ../src\issueReporter\gui.py:66 +msgid "how often does this bug happen?" +msgstr "" + +#: ../src\issueReporter\gui.py:74 +msgid "Select the importance that you think this bug has" +msgstr "" + +#: ../src\issueReporter\gui.py:82 +msgid "" +"I know that the TW Blue bug system will get my Twitter username to contact " +"me and fix the bug quickly" +msgstr "" + +#: ../src\issueReporter\gui.py:85 +msgid "Send report" +msgstr "إرسال بلاغ العطل" + +#: ../src\issueReporter\gui.py:98 +msgid "You must fill out both fields" +msgstr "يجب تعبئة كِلا الحقلين" + +#: ../src\issueReporter\gui.py:101 +msgid "" +"You need to mark the checkbox to provide us your twitter username to contact " +"to you if is necessary." +msgstr "" + +#: ../src\issueReporter\gui.py:120 +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 "" +"شكرا على الإبلاغ بهذا العطل. قد يتم إصلاحه فيي إصدارات قادمة. لقد قمت " +"بالإبلاغ بالعطل رقم %i" + +#: ../src\issueReporter\gui.py:120 +msgid "reported" +msgstr "تم التبليغ" + +#: ../src\issueReporter\gui.py:123 +msgid "Error while reporting" +msgstr "حدث خطء أثناء التبليغ عن العطل" + +#: ../src\issueReporter\gui.py:123 +msgid "" +"Something unexpected occurred while trying to report the bug. Please, try " +"again later" +msgstr "" +"شيء غير متوقع حدث في أثناء الإبلاغ عن العطل. الرجاء المحاولة ثانيا لاحقا." + +#: ../src\keystrokeEditor\constants.py:4 +msgid "Go up up on the current list" +msgstr "إذهب إلى الأعلى في القائمة الحالية" + +#: ../src\keystrokeEditor\constants.py:5 +msgid "Go down up on the current list" +msgstr "إذهب إلى الأسفل في القائمة الحالية" + +#: ../src\keystrokeEditor\constants.py:6 +msgid "Go to the previous tab" +msgstr "إذهب إلى التبويبة السابقة" + +#: ../src\keystrokeEditor\constants.py:7 +msgid "Go to the next tab" +msgstr "إذهب إلى التبويبة القادمة" + +#: ../src\keystrokeEditor\constants.py:8 +msgid "Move up one tweet in the conversation" +msgstr "تحرك تغريدة واحدة إلى الأعلى في المحادثة" + +#: ../src\keystrokeEditor\constants.py:9 +msgid "Move down one tweet in the conversation" +msgstr "تحرك تغريدة واحدة إلى الأسفل في المحادثة" + +#: ../src\keystrokeEditor\constants.py:10 +msgid "Show the graphical interface" +msgstr "إظهار واجهة المستخدم." + +#: ../src\keystrokeEditor\constants.py:12 +msgid "Reply to a tweet" +msgstr "الرد على التغريدة" + +#: ../src\keystrokeEditor\constants.py:14 +msgid "Send direct message" +msgstr "إرسل رسالة خاصة " + +#: ../src\keystrokeEditor\constants.py:15 +msgid "Mark as favourite" +msgstr "إضف إلى المفضلات" + +#: ../src\keystrokeEditor\constants.py:17 +msgid "Open the actions dialogue" +msgstr "إفتح صندوق حوار الخيارات" + +#: ../src\keystrokeEditor\constants.py:18 +msgid "See user details" +msgstr "إظهر تفاصيل المستخدم" + +#: ../src\keystrokeEditor\constants.py:20 +msgid "Quit" +msgstr "الخروج" + +#: ../src\keystrokeEditor\constants.py:21 +msgid "Open user timeline" +msgstr "إفتح سياق المستخدم" + +#: ../src\keystrokeEditor\constants.py:23 +msgid "" +"Open URL on the current tweet, or further information for a friend or " +"follower" +msgstr "إفتح الرابط في التغريدة الحالية أو إفتح معلومات عن الصديق أو المتابع" + +#: ../src\keystrokeEditor\constants.py:24 +msgid "Attempt to play audio" +msgstr "حاول تشغيل المقطع الصوتي" + +#: ../src\keystrokeEditor\constants.py:25 +msgid "Increase volume by 5%" +msgstr "زيادة علو الصوت %5" + +#: ../src\keystrokeEditor\constants.py:26 +msgid "Decrease volume by 5%" +msgstr "إنقاص علو الصوت %5" + +#: ../src\keystrokeEditor\constants.py:27 +msgid "Go to the first element on the list" +msgstr "إذهب إلى أول عنصر في القائمة" + +#: ../src\keystrokeEditor\constants.py:28 +msgid "Go to the last element on the list" +msgstr "إذهب إلى أخر عنصر في القائمة" + +#: ../src\keystrokeEditor\constants.py:29 +msgid "Move 20 elements up on the current list" +msgstr "تحرك عشرين تغريدة إلى الأعلى في القائمة الحالية" + +#: ../src\keystrokeEditor\constants.py:30 +msgid "Move 20 elements down on the current list" +msgstr "تحرك عشرين تغريدة إلى الأسفل في القائمة الحالية" + +#: ../src\keystrokeEditor\constants.py:31 +msgid "Edit profile" +msgstr "حرر ملفك الشخصي" + +#: ../src\keystrokeEditor\constants.py:32 +msgid "Remove a tweet or direct message" +msgstr "حذف تغريدة أو رسالة خاصة" + +#: ../src\keystrokeEditor\constants.py:33 +msgid "Empty the buffer removing all the elements" +msgstr "إفرغ الصفحة وحذف جميع العناصر" + +#: ../src\keystrokeEditor\constants.py:34 +msgid "Listen the current message" +msgstr "إستمع إلى التغريدة الحالية" + +#: ../src\keystrokeEditor\constants.py:35 +msgid "Copy to clipboard" +msgstr "إنسخ إلى لوحة النسخ" + +#: ../src\keystrokeEditor\constants.py:38 +msgid "Mutes/unmutes the active buffer" +msgstr "كتم / إلغاء كتم الصفحة الفعالة" + +#: ../src\keystrokeEditor\constants.py:39 +msgid "Globally mute/unmute TW Blue" +msgstr "الكتم العام / عدم الكتم العام للبرنامجج" + +#: ../src\keystrokeEditor\constants.py:40 +msgid "toggles the automatic reading of incoming tweets in the active buffer" +msgstr "تفعيل القراءة التلقائية للتغريدات الجديدة في هذه الصفحة." + +#: ../src\keystrokeEditor\constants.py:41 +msgid "Search on twitter" +msgstr "البحث في تويتر" + +#: ../src\keystrokeEditor\constants.py:42 +msgid "Shows the keystroke editor" +msgstr "يظهر محرر مفاتيح الإختصار" + +#: ../src\keystrokeEditor\constants.py:43 +msgid "Show lists for a specified user" +msgstr "إظهار القوائم لمستخدم محدد" + +#: ../src\keystrokeEditor\gui.py:10 +msgid "Keystroke editor" +msgstr "محرر مفاتيح الإختصار" + +#: ../src\keystrokeEditor\gui.py:16 +msgid "Select a keystroke to edit" +msgstr "إختر مفتاح الإختصار الذي تود تحريره" + +#: ../src\keystrokeEditor\gui.py:17 +msgid "Keystroke" +msgstr "مفتاح الإختصار" + +#: ../src\keystrokeEditor\gui.py:54 +msgid "Editing keystroke" +msgstr "جاري تحرير مفتاح الإختصار" + +#: ../src\keystrokeEditor\gui.py:61 +msgid "Control" +msgstr "مفتاح التحكم" + +#: ../src\keystrokeEditor\gui.py:62 +msgid "Alt" +msgstr "مفتاح القائمة" + +#: ../src\keystrokeEditor\gui.py:63 +msgid "Shift" +msgstr "مفتاح التبويبة" + +#: ../src\keystrokeEditor\gui.py:64 +msgid "Windows" +msgstr "مفتاح الويندوز" + +#: ../src\keystrokeEditor\gui.py:70 +msgid "Key" +msgstr "مفتاح" + +#: ../src\keystrokeEditor\gui.py:99 +msgid "You need to use the Windows key" +msgstr "تحتاج إلى إستخدام مفتاح الويندوز" + +#: ../src\keystrokeEditor\gui.py:99 ../src\keystrokeEditor\gui.py:112 +msgid "Invalid keystroke" +msgstr "مفتاح إختصار غير مقبول" + +#: ../src\keystrokeEditor\gui.py:112 +msgid "You must provide a character for the keystroke" +msgstr "يجب أن تختار حرفا لمفتاح الإختصار" + +#: ../src\languageHandler.py:95 +msgid "User default" +msgstr "الإفتراضي للمستخدم" + +#: ../src\sessionmanager\gui.py:19 +msgid "Session manager" +msgstr "مدير الجلسة" + +#: ../src\sessionmanager\gui.py:23 +msgid "Select a twitter account to start TW Blue" +msgstr "إختر حساب تويتر كي تبدء به البرنامج" + +#: ../src\sessionmanager\gui.py:25 +msgid "Account" +msgstr "حسابفك ربط حساب الدروب بوكس." + +#: ../src\sessionmanager\gui.py:30 +msgid "New account" +msgstr "حساب جديد" + +#: ../src\sessionmanager\gui.py:67 +msgid "Account Error" +msgstr "خطء في الحساب" + +#: ../src\sessionmanager\gui.py:67 +msgid "You need to configure an account." +msgstr "عليك أن تثبت حساب" + +#: ../src\sessionmanager\gui.py:83 +#, fuzzy +msgid "" +"The request for the required Twitter authorization to continue will be " +"opened on your browser. You only need to do it once. Would you like to " +"autorhise a new account now?" +msgstr "" +"سيتم فتح الطلب التحقق الخاص بتويتر في متصفح الشبكة عندك. إنسخ الرمز الرقمي " +"الذي ستجده للمتابعة. أنت بحاجة لفعل هذا فقط مرة واحدة." + +#: ../src\sessionmanager\gui.py:94 +#, fuzzy +msgid "Invalid user token" +msgstr "مفتاح إختصار غير مقبول" + +#: ../src\sessionmanager\gui.py:94 +msgid "" +"Your access token is invalid or the authorisation has failed. Please try " +"again." +msgstr "" + +#: ../src\sessionmanager\gui.py:97 +msgid "Authorised account %d" +msgstr "حساب مرخص %d" + +#: ../src\twitter\buffers\indibidual.py:26 +msgid "One tweet from %s" +msgstr "تغريدة واحدة من %s" + +#: ../src\twitter\buffers\indibidual.py:35 +msgid "One tweet from %s in the list %s" +msgstr "تغريدة واحدة من %s في القائمة %s" + +#: ../src\twitter\buffers\stream.py:57 +msgid "One mention from %s " +msgstr "إشارة واحدة من %s" + +#: ../src\twitter\buffers\stream.py:69 +msgid "One direct message" +msgstr "رسالة خاصة واحدة" + +#: ../src\twitter\compose.py:22 +msgid "About a week ago" +msgstr "قبل حوالي أسبوع" + +#: ../src\twitter\compose.py:24 +msgid "About {} weeks ago" +msgstr "قبل حوالي {} اسابيع" + +#: ../src\twitter\compose.py:26 +msgid "A month ago" +msgstr "قبل شهر" + +#: ../src\twitter\compose.py:28 +msgid "About {} months ago" +msgstr "قبل حوالي {} أشهر" + +#: ../src\twitter\compose.py:30 +msgid "About a year ago" +msgstr "قبل حوالي سنة" + +#: ../src\twitter\compose.py:32 +msgid "About {} years ago" +msgstr "قبل حوالي {} سنين" + +#: ../src\twitter\compose.py:34 +msgid "About 1 day ago" +msgstr "قبل يوم واحد" + +#: ../src\twitter\compose.py:36 +msgid "About {} days ago" +msgstr "قبل حوالي {} أيام" + +#: ../src\twitter\compose.py:38 +msgid "just now" +msgstr "الآن" + +#: ../src\twitter\compose.py:40 +msgid "{} seconds ago" +msgstr "قبل {} ثواني" + +#: ../src\twitter\compose.py:42 +msgid "1 minute ago" +msgstr "قبل دقيقة واحدة" + +#: ../src\twitter\compose.py:44 +msgid "{} minutes ago" +msgstr "قبل حوالي {} دقائق" + +#: ../src\twitter\compose.py:46 +msgid "About 1 hour ago" +msgstr "قبل ساعة واحدة" + +#: ../src\twitter\compose.py:48 +msgid "About {} hours ago" +msgstr "قبل حوالي {} ساعات" + +#: ../src\twitter\compose.py:52 +msgid "January" +msgstr "كانون الثاني" + +#: ../src\twitter\compose.py:53 +msgid "February" +msgstr "شباط" + +#: ../src\twitter\compose.py:54 +msgid "March" +msgstr "آذار" + +#: ../src\twitter\compose.py:55 +msgid "April" +msgstr "نيسان" + +#: ../src\twitter\compose.py:56 +msgid "May" +msgstr "أيار" + +#: ../src\twitter\compose.py:57 +msgid "June" +msgstr "حزيران" + +#: ../src\twitter\compose.py:58 +msgid "July" +msgstr "تموز" + +#: ../src\twitter\compose.py:59 +msgid "August" +msgstr "آب" + +#: ../src\twitter\compose.py:60 +msgid "September" +msgstr "أيلول" + +#: ../src\twitter\compose.py:61 +msgid "October" +msgstr "تشرين الأول" + +#: ../src\twitter\compose.py:62 +msgid "November" +msgstr "تشرين الثاني" + +#: ../src\twitter\compose.py:63 +msgid "December" +msgstr "كانون الأول" + +#: ../src\twitter\compose.py:66 +msgid "Sunday" +msgstr "الأحد" + +#: ../src\twitter\compose.py:67 +msgid "Monday" +msgstr "الإثنين" + +#: ../src\twitter\compose.py:68 +msgid "Tuesday" +msgstr "الثلاثاء" + +#: ../src\twitter\compose.py:69 +msgid "Wednesday" +msgstr "الأربعاء" + +#: ../src\twitter\compose.py:70 +msgid "Thursday" +msgstr "الخميس" + +#: ../src\twitter\compose.py:71 +msgid "Friday" +msgstr "الجمعة" + +#: ../src\twitter\compose.py:72 +msgid "Saturday" +msgstr "السبت" + +#: ../src\twitter\compose.py:75 +msgid "sun" +msgstr "الأحد" + +#: ../src\twitter\compose.py:76 +msgid "mon" +msgstr "الإثنين" + +#: ../src\twitter\compose.py:77 +msgid "tue" +msgstr "الثلاثاء" + +#: ../src\twitter\compose.py:78 +msgid "wed" +msgstr "الأربعاء" + +#: ../src\twitter\compose.py:79 +msgid "thu" +msgstr "الخميس" + +#: ../src\twitter\compose.py:80 +msgid "fri" +msgstr "الجمعة" + +#: ../src\twitter\compose.py:81 +msgid "sat" +msgstr "السبت" + +#: ../src\twitter\compose.py:85 +#, fuzzy +msgid "jan" +msgstr "كانون الثاني" + +#: ../src\twitter\compose.py:86 +msgid "feb" +msgstr "شباط" + +#: ../src\twitter\compose.py:87 +msgid "mar" +msgstr "أذار" + +#: ../src\twitter\compose.py:88 +msgid "apr" +msgstr "نيسان" + +#: ../src\twitter\compose.py:89 +msgid "may" +msgstr "أيار" + +#: ../src\twitter\compose.py:90 +msgid "jun" +msgstr "حزيران" + +#: ../src\twitter\compose.py:91 +msgid "jul" +msgstr "تموز" + +#: ../src\twitter\compose.py:92 +msgid "aug" +msgstr "أب" + +#: ../src\twitter\compose.py:93 +msgid "sep" +msgstr "أيلول" + +#: ../src\twitter\compose.py:94 +msgid "oct" +msgstr "تشرين الأول" + +#: ../src\twitter\compose.py:95 +msgid "nov" +msgstr "تشرين الثاني" + +#: ../src\twitter\compose.py:96 +msgid "dec" +msgstr "كانون الأول" + +#: ../src\twitter\compose.py:152 +msgid "Dm to %s " +msgstr "رسالة خاصة إلى %s" + +#: ../src\twitter\compose.py:185 +msgid "Unavailable" +msgstr "غير متوفر" + +#: ../src\twitter\compose.py:186 +msgid "" +"%s (@%s). %s followers, %s friends, %s tweets. Last tweet on %s. Joined " +"Twitter on %s" +msgstr "" +"%s (@%s). %s متابعين, %s إصدقاء, %s تغريدات. آخر تغريدة في %s. إنضم إلى " +"تويتر on %s" + +#: ../src\twitter\compose.py:190 +msgid "You've blocked %s" +msgstr "لقد قمت بحذر %s" + +#: ../src\twitter\compose.py:192 +msgid "You've unblocked %s" +msgstr "لقد قمت بفك الحذر عن %s" + +#: ../src\twitter\compose.py:195 +msgid "%s(@%s) has followed you" +msgstr "%s(@%s) قام بمتابعتك" + +#: ../src\twitter\compose.py:197 +msgid "You've followed %s(@%s)" +msgstr "لقد قمت بمتابعة %s(@%s)" + +#: ../src\twitter\compose.py:199 +msgid "You've unfollowed %s (@%s)" +msgstr "لقد قمت بإلغاء متابعة %s (@%s)" + +#: ../src\twitter\compose.py:202 +msgid "You've added to favourites: %s, %s" +msgstr "لقد قمت بإضافة %s, %s إلى التفضيلات" + +#: ../src\twitter\compose.py:204 +msgid "%s(@%s) has marked as favorite: %s" +msgstr "%s(@%s) hقام بتحديد : %s كتفضيلة" + +#: ../src\twitter\compose.py:206 +msgid "You've removed from favourites: %s, %s" +msgstr "لقد قمت بحذف %s, %s من التفضيلات" + +#: ../src\twitter\compose.py:207 +msgid "%s(@%s) has removed from favourites: %s" +msgstr "%s(@%s) قام بحذف %s من التفضيلات" + +#: ../src\twitter\compose.py:209 +msgid "You've created the list %s" +msgstr "لقم قمت بإنشاء القائمة %s" + +#: ../src\twitter\compose.py:211 +msgid "You've deleted the list %s" +msgstr "لقد قمت بحذف القائمة %s" + +#: ../src\twitter\compose.py:213 +msgid "You've updated the list %s" +msgstr "لقد قمت بتحديث القائمة %s" + +#: ../src\twitter\compose.py:215 +msgid "You've added %s(@%s) to the list %s" +msgstr "لقد قمت بإضافة %s(@%s) إلى القائمة %s" + +#: ../src\twitter\compose.py:216 +msgid "%s(@%s) has added you to the list %s" +msgstr "%s(@%s) قام بإضفتك إلى القائمة %s" + +#: ../src\twitter\compose.py:218 +msgid "You'be removed %s(@%s) from the list %s" +msgstr "لقد قمت بحذف %s(@%s) من القائمة %s" + +#: ../src\twitter\compose.py:219 +msgid "%s(@%s) has removed you from the list %s" +msgstr "%s(@%s) قام بحذفك من القائمة %s" + +#: ../src\twitter\compose.py:221 +msgid "You've subscribed to the list %s, which is owned by %s(@%s)" +msgstr "لقد قمت بالإشتراك بالقائمة %s, التي يملكها %s(@%s)" + +#: ../src\twitter\compose.py:222 +msgid "%s(@%s) has suscribed you to the list %s" +msgstr "%s(@%s) قام بمشاركتك في القائمة %s" + +#: ../src\twitter\compose.py:224 +msgid "You've unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "لقد قمت بإلغاء الإشتراك في القائمة %s, واالتي يملكها %s(@%s)" + +#: ../src\twitter\compose.py:225 +msgid "You've been unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "لقد أُلغِيَ إشتراكك في القائمة %s, التي يملكها %s(@%s)" + +#: ../src\twitter\compose.py:226 +msgid "Unknown" +msgstr "غير معروف" + +#: ../src\twitter\compose.py:232 +msgid "No description available" +msgstr "لا يوجد وصف" + +#: ../src\twitter\compose.py:236 +msgid "private" +msgstr "خاصة" + +#: ../src\twitter\compose.py:237 +msgid "public" +msgstr "عامة" + +#: ../src\twitter\twitter.py:73 +msgid "%s failed. Reason: %s" +msgstr "فشل %s بسبب %s" + +#: ../src\twitter\twitter.py:80 +msgid "%s succeeded." +msgstr "نجح %s" + +#: ../src\updater\update_manager.py:14 +msgid "Your TW Blue version is up to date" +msgstr "لديك النسخة الأخيرة من البرنامج" + +#: ../src\updater\update_manager.py:14 ../src\updater\update_manager.py:27 +msgid "Update" +msgstr "حَدِث" + +#: ../src\updater\update_manager.py:20 +msgid "New version for %s" +msgstr "إصدار جديد من %s" + +#: ../src\updater\update_manager.py:20 +msgid "" +"There's a new TW Blue version available. Would you like to download it now?" +msgstr "يوجد إصدار جديد من TW Blue, هل ترغب بتحميله؟" + +#: ../src\updater\update_manager.py:22 +msgid "Download in Progress" +msgstr "جاري التحميل" + +#: ../src\updater\update_manager.py:22 +msgid "Downloading the new version..." +msgstr "جاري تحميل الإصدار الجديد" + +#: ../src\updater\update_manager.py:29 +msgid "Done!" +msgstr "تم الإنتهاء" + +#: ../src\updater\update_manager.py:29 +msgid "" +"The new TW Blue version has been downloaded and installed. Press OK to start " +"the application." +msgstr "" +"الإصدار الجديد من TW Blue تم تحميله وتنصيبه. إضغط على زر موافق لبدء تشغيل " +"التطبيق." + +#~ msgid "Tweet - %i characters" +#~ msgstr "التغريدة %i أحرف" + +#~ msgid "%A, %B %d, %Y at %I:%M:%S %p" +#~ msgstr "%A, %B %d, %Y at %I:%M:%S %p" + +#~ msgid "View members" +#~ msgstr "عرض الأعضاء" + +#~ msgid "View subscribers" +#~ msgstr "عرض المشتركين" + +#~ msgid "Mention to %s" +#~ msgstr "تمت الإشارة إل%s" + +#~ msgid "Ouner" +#~ msgstr "المالك" diff --git a/src/locales/ca/LC_MESSAGES/twblue.mo b/src/locales/ca/LC_MESSAGES/twblue.mo new file mode 100644 index 00000000..f5a29680 Binary files /dev/null and b/src/locales/ca/LC_MESSAGES/twblue.mo differ diff --git a/src/locales/ca/LC_MESSAGES/twblue.po b/src/locales/ca/LC_MESSAGES/twblue.po new file mode 100644 index 00000000..66e59cc1 --- /dev/null +++ b/src/locales/ca/LC_MESSAGES/twblue.po @@ -0,0 +1,2462 @@ +msgid "" +msgstr "" +"Project-Id-Version: TW Blue 0.46\n" +"POT-Creation-Date: 2014-09-07 07:44+Hora de verano central (México)\n" +"PO-Revision-Date: 2014-09-03 22:25+0100\n" +"Last-Translator: Joan Rabat \n" +"Language-Team: Salva Doménech, Juan Carlos Rivilla, Ángel Heras Parilla " +"\n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.6.9\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" + +#: ../src\extra\AudioUploader\gui.py:31 ../src\gui\dialogs\message.py:169 +#: ../src\gui\dialogs\message.py:256 +msgid "Attach audio" +msgstr "Adjuntar audio" + +#: ../src\extra\AudioUploader\gui.py:38 ../src\extra\AudioUploader\gui.py:146 +#: ../src\extra\AudioUploader\gui.py:156 +msgid "Play" +msgstr "Reproduir" + +#: ../src\extra\AudioUploader\gui.py:41 ../src\extra\AudioUploader\gui.py:75 +#: ../src\extra\AudioUploader\gui.py:80 ../src\extra\AudioUploader\gui.py:107 +msgid "Pause" +msgstr "Pausa" + +#: ../src\extra\AudioUploader\gui.py:44 ../src\extra\AudioUploader\gui.py:103 +msgid "Record" +msgstr "Grabar" + +#: ../src\extra\AudioUploader\gui.py:47 +msgid "Add an existing file" +msgstr "Afegir un fitxer existent" + +#: ../src\extra\AudioUploader\gui.py:49 +msgid "Discard" +msgstr "Descartar" + +#: ../src\extra\AudioUploader\gui.py:52 +msgid "Upload to" +msgstr "Enviar a:" + +#: ../src\extra\AudioUploader\gui.py:57 +msgid "Attach" +msgstr "Adjuntar" + +#: ../src\extra\AudioUploader\gui.py:59 ../src\issueReporter\gui.py:88 +msgid "Cancel" +msgstr "Cancel·lar" + +#: ../src\extra\AudioUploader\gui.py:77 ../src\extra\AudioUploader\gui.py:78 +msgid "Resume" +msgstr "Continúa" + +#: ../src\extra\AudioUploader\gui.py:95 +msgid "Stop recording" +msgstr "Aturar grabació" + +#: ../src\extra\AudioUploader\gui.py:96 +msgid "Recording" +msgstr "Grabant" + +#: ../src\extra\AudioUploader\gui.py:101 ../src\extra\AudioUploader\gui.py:153 +msgid "Stopped" +msgstr "Aturat" + +#: ../src\extra\AudioUploader\gui.py:128 ../src\gui\dialogs\message.py:218 +#: ../src\gui\dialogs\update_profile.py:87 +msgid "Discarded" +msgstr "Descartat" + +#: ../src\extra\AudioUploader\gui.py:138 ../src\gui\buffers\base.py:303 +#: ../src\gui\buffers\base.py:315 +msgid "Playing..." +msgstr "Reproduïnt..." + +#: ../src\extra\AudioUploader\gui.py:142 +msgid "Stop" +msgstr "Aturar" + +#: ../src\extra\AudioUploader\gui.py:161 +msgid "Recoding audio..." +msgstr "Recodificant audio..." + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Audio Files (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" +msgstr "Arxius d'audio (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Select the audio file to be uploaded" +msgstr "Selecciona el fitxer d'audio que vols carregar" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:15 +msgid "File" +msgstr "Fitxer" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:21 +msgid "Transferred" +msgstr "Transferit" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:26 +msgid "Total file size" +msgstr "Mida total del fitxer" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:31 +msgid "Transfer rate" +msgstr "Velocitat de transferencia" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:36 +msgid "Time left" +msgstr "Temps restant" + +#: ../src\extra\AudioUploader\utils.py:27 +msgid "%d day, " +msgstr "%d dia, " + +#: ../src\extra\AudioUploader\utils.py:29 +msgid "%d days, " +msgstr "%d dies, " + +#: ../src\extra\AudioUploader\utils.py:31 +msgid "%d hour, " +msgstr "%d hora, " + +#: ../src\extra\AudioUploader\utils.py:33 +msgid "%d hours, " +msgstr "%d hores, " + +#: ../src\extra\AudioUploader\utils.py:35 +msgid "%d minute, " +msgstr "%d minut, " + +#: ../src\extra\AudioUploader\utils.py:37 +msgid "%d minutes, " +msgstr "%d minuts, " + +#: ../src\extra\AudioUploader\utils.py:39 +msgid "%s second" +msgstr "%s segon" + +#: ../src\extra\AudioUploader\utils.py:41 +msgid "%s seconds" +msgstr "%s segons" + +#: ../src\extra\SoundsTutorial\gui.py:11 +msgid "The tweet may contain a playable audio" +msgstr "El tuit pot contenir un audio reproduible." + +#: ../src\extra\SoundsTutorial\gui.py:12 +msgid "A timeline has been created" +msgstr "La línia temporal s'ha creat" + +#: ../src\extra\SoundsTutorial\gui.py:13 +msgid "A timeline has been deleted" +msgstr "La línia temporal s'ha esborrat" + +#: ../src\extra\SoundsTutorial\gui.py:14 +msgid "You've received a direct message" +msgstr "Has rebut un missatge directe" + +#: ../src\extra\SoundsTutorial\gui.py:15 +msgid "You've sent a direct message" +msgstr "Has enviat un missatge directe." + +#: ../src\extra\SoundsTutorial\gui.py:16 +msgid "A bug has happened" +msgstr "Hi ha hagut un problema." + +#: ../src\extra\SoundsTutorial\gui.py:17 +msgid "You've added a tweet to your favourites" +msgstr "Has afegit un tuit als favorits." + +#: ../src\extra\SoundsTutorial\gui.py:18 +msgid "Someone's favourites have been updated" +msgstr "Els favorits d'algú s'han actualitzat." + +#: ../src\extra\SoundsTutorial\gui.py:19 +msgid "There are no more tweets to read" +msgstr "No hi ha més twits per llegir" + +#: ../src\extra\SoundsTutorial\gui.py:20 +msgid "A list has a new tweet" +msgstr "Una llista té un nou twit" + +#: ../src\extra\SoundsTutorial\gui.py:21 +msgid "You can't add any more characters on the tweet" +msgstr "No pots afegir més caràcters al tuit." + +#: ../src\extra\SoundsTutorial\gui.py:22 +msgid "You've been mentioned " +msgstr "Has sigut mencionat" + +#: ../src\extra\SoundsTutorial\gui.py:23 +msgid "A new event has happened" +msgstr "hi ha hagut un nou esdeveniment." + +#: ../src\extra\SoundsTutorial\gui.py:24 +msgid "TW Blue is ready " +msgstr "TW Blue és a punt." + +#: ../src\extra\SoundsTutorial\gui.py:25 +msgid "You've replied" +msgstr "Has contestat" + +#: ../src\extra\SoundsTutorial\gui.py:26 +msgid "You've retweeted" +msgstr "Has retuitejat." + +#: ../src\extra\SoundsTutorial\gui.py:27 +msgid "A search has been updated" +msgstr "Una recerca s'ha actualitzat." + +#: ../src\extra\SoundsTutorial\gui.py:28 +msgid "There's a new tweet in the main buffer" +msgstr "Hi ha un nou tuit al buffer principal." + +#: ../src\extra\SoundsTutorial\gui.py:29 +msgid "You've sent a tweet" +msgstr "Has enviat un tuit" + +#: ../src\extra\SoundsTutorial\gui.py:30 +msgid "There's a new tweet in a timeline" +msgstr "Hi ha un nou tuit a una línia temporal." + +#: ../src\extra\SoundsTutorial\gui.py:31 +msgid "You have a new follower" +msgstr "Tens un nou seguidor." + +#: ../src\extra\SoundsTutorial\gui.py:32 +msgid "You've turned the volume up or down" +msgstr "Has apujat o abaixat el volum." + +#: ../src\extra\SoundsTutorial\gui.py:36 +msgid "" +"It seems as though the currently used sound pack needs an update. %i fails " +"are still be required to use this function. Make sure to obtain the needed " +"lacking sounds or to contact with the sound pack developer." +msgstr "" +"Sembla que el paquet de sons actualment utilitzat necessita una " +"actualització. %i fitxers son necesaris per a fer aquesta funció. Asegurat " +"de aconseguir els sons necessaris o contacta amb el creador del paquet." + +#: ../src\extra\SoundsTutorial\gui.py:36 ../src\extra\SpellChecker\gui.py:34 +#: ../src\gui\dialogs\show_user.py:63 ../src\gui\main.py:703 +#: ../src\gui\main.py:734 ../src\issueReporter\gui.py:98 +#: ../src\issueReporter\gui.py:101 +msgid "Error" +msgstr "Error" + +#: ../src\extra\SoundsTutorial\gui.py:38 ../src\gui\main.py:68 +msgid "Sounds tutorial" +msgstr "Tutorial de sons" + +#: ../src\extra\SoundsTutorial\gui.py:41 +msgid "Press enter to listen to the sound for the selected event" +msgstr "Prem enter per escoltar el so per al esdeveniment seleccionat." + +#: ../src\extra\SpellChecker\gui.py:34 +msgid "" +"A bug has happened. There are no dictionaries available for the selected " +"language in TW Blue" +msgstr "" +"Hi ha hagut un problema. No hi ha diccionaris disponibles per a l'idioma " +"seleccionat a TW Blue." + +#: ../src\extra\SpellChecker\gui.py:38 +msgid "Mis-spelled word" +msgstr "Paraula mal escrita" + +#: ../src\extra\SpellChecker\gui.py:43 +msgid "Context" +msgstr "Context" + +#: ../src\extra\SpellChecker\gui.py:48 +msgid "Suggestions" +msgstr "Sugeriments" + +#: ../src\extra\SpellChecker\gui.py:53 +msgid "Ignore" +msgstr "Ignorar" + +#: ../src\extra\SpellChecker\gui.py:55 +msgid "Ignore all" +msgstr "Ignorar tot" + +#: ../src\extra\SpellChecker\gui.py:57 +msgid "Replace" +msgstr "Reemplaçar" + +#: ../src\extra\SpellChecker\gui.py:59 +msgid "Replace all" +msgstr "Reemplaçar tots." + +#: ../src\extra\SpellChecker\gui.py:78 +msgid "Mis-spelled word: %s" +msgstr "Paraula mal escrita: %s" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "Finished" +msgstr "Finalitzat" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "The spelling review has finished." +msgstr "La revisió d'escriptura s'ha finalitzat." + +#: ../src\extra\translator\gui.py:24 ../src\gui\dialogs\message.py:177 +#: ../src\gui\dialogs\message.py:264 ../src\gui\dialogs\message.py:350 +msgid "Translate message" +msgstr "Traduir missatge" + +#: ../src\extra\translator\gui.py:27 +msgid "Source language" +msgstr "Llengua d'origen" + +#: ../src\extra\translator\gui.py:30 +msgid "Target language" +msgstr "Llengua de destinació" + +#: ../src\extra\translator\translator.py:53 +msgid "Afrikaans" +msgstr "Africà" + +#: ../src\extra\translator\translator.py:54 +msgid "Albanian" +msgstr "Albanès" + +#: ../src\extra\translator\translator.py:55 +msgid "Amharic" +msgstr "Amharic" + +#: ../src\extra\translator\translator.py:56 +msgid "Arabic" +msgstr "Àrab" + +#: ../src\extra\translator\translator.py:57 +msgid "Armenian" +msgstr "Armenià" + +#: ../src\extra\translator\translator.py:58 +msgid "Azerbaijani" +msgstr "Acerbajà" + +#: ../src\extra\translator\translator.py:59 +msgid "Basque" +msgstr "Euskera" + +#: ../src\extra\translator\translator.py:60 +msgid "Belarusian" +msgstr "Bielorús" + +#: ../src\extra\translator\translator.py:61 +msgid "Bengali" +msgstr "Bengali" + +#: ../src\extra\translator\translator.py:62 +msgid "Bihari" +msgstr "Bihari" + +#: ../src\extra\translator\translator.py:63 +msgid "Bulgarian" +msgstr "Bùlgar" + +#: ../src\extra\translator\translator.py:64 +msgid "Burmese" +msgstr "Birmà" + +#: ../src\extra\translator\translator.py:65 +msgid "Catalan" +msgstr "Català" + +#: ../src\extra\translator\translator.py:66 +msgid "Cherokee" +msgstr "Cheroqui" + +#: ../src\extra\translator\translator.py:67 +msgid "Chinese" +msgstr "xinès" + +#: ../src\extra\translator\translator.py:68 +msgid "Chinese_simplified" +msgstr "xinèss simplificat" + +#: ../src\extra\translator\translator.py:69 +msgid "Chinese_traditional" +msgstr "xinés tradicional" + +#: ../src\extra\translator\translator.py:70 +msgid "Croatian" +msgstr "Croat" + +#: ../src\extra\translator\translator.py:71 +msgid "Czech" +msgstr "Txec" + +#: ../src\extra\translator\translator.py:72 +msgid "Danish" +msgstr "Danès" + +#: ../src\extra\translator\translator.py:73 +msgid "Dhivehi" +msgstr "Dhivehi" + +#: ../src\extra\translator\translator.py:74 +msgid "Dutch" +msgstr "Holandès" + +#: ../src\extra\translator\translator.py:75 +msgid "English" +msgstr "Anglès" + +#: ../src\extra\translator\translator.py:76 +msgid "Esperanto" +msgstr "Esperanto" + +#: ../src\extra\translator\translator.py:77 +msgid "Estonian" +msgstr "Estonià" + +#: ../src\extra\translator\translator.py:78 +msgid "Filipino" +msgstr "Filipí" + +#: ../src\extra\translator\translator.py:79 +msgid "Finnish" +msgstr "Finès" + +#: ../src\extra\translator\translator.py:80 +msgid "French" +msgstr "Francès" + +#: ../src\extra\translator\translator.py:81 +msgid "Galician" +msgstr "Gallec" + +#: ../src\extra\translator\translator.py:82 +msgid "Georgian" +msgstr "Georgià" + +#: ../src\extra\translator\translator.py:83 +msgid "German" +msgstr "Alemany" + +#: ../src\extra\translator\translator.py:84 +msgid "Greek" +msgstr "Grec" + +#: ../src\extra\translator\translator.py:85 +msgid "Guarani" +msgstr "Guaraní" + +#: ../src\extra\translator\translator.py:86 +msgid "Gujarati" +msgstr "Guiaratí" + +#: ../src\extra\translator\translator.py:87 +msgid "Hebrew" +msgstr "Hebreu" + +#: ../src\extra\translator\translator.py:88 +msgid "Hindi" +msgstr "Hindi" + +#: ../src\extra\translator\translator.py:89 +msgid "Hungarian" +msgstr "Hongarès" + +#: ../src\extra\translator\translator.py:90 +msgid "Icelandic" +msgstr "Islandès" + +#: ../src\extra\translator\translator.py:91 +msgid "Indonesian" +msgstr "Indonesi" + +#: ../src\extra\translator\translator.py:92 +msgid "Inuktitut" +msgstr "Inuktitut" + +#: ../src\extra\translator\translator.py:93 +msgid "Irish" +msgstr "Irlandès" + +#: ../src\extra\translator\translator.py:94 +msgid "Italian" +msgstr "Italià" + +#: ../src\extra\translator\translator.py:95 +msgid "Japanese" +msgstr "Japonès" + +#: ../src\extra\translator\translator.py:96 +msgid "Kannada" +msgstr "Canarès" + +#: ../src\extra\translator\translator.py:97 +msgid "Kazakh" +msgstr "Kazakh" + +#: ../src\extra\translator\translator.py:98 +msgid "Khmer" +msgstr "Camboià" + +#: ../src\extra\translator\translator.py:99 +msgid "Korean" +msgstr "Coreà" + +#: ../src\extra\translator\translator.py:100 +msgid "Kurdish" +msgstr "Kurd" + +#: ../src\extra\translator\translator.py:101 +msgid "Kyrgyz" +msgstr "Kirguís" + +#: ../src\extra\translator\translator.py:102 +msgid "Laothian" +msgstr "Lao" + +#: ../src\extra\translator\translator.py:103 +msgid "Latvian" +msgstr "Letó" + +#: ../src\extra\translator\translator.py:104 +msgid "Lithuanian" +msgstr "Lituà" + +#: ../src\extra\translator\translator.py:105 +msgid "Macedonian" +msgstr "Macedoni" + +#: ../src\extra\translator\translator.py:106 +msgid "Malay" +msgstr "Malai" + +#: ../src\extra\translator\translator.py:107 +msgid "Malayalam" +msgstr "Malayalam" + +#: ../src\extra\translator\translator.py:108 +msgid "Maltese" +msgstr "Maltès" + +#: ../src\extra\translator\translator.py:109 +msgid "Marathi" +msgstr "Maratí" + +#: ../src\extra\translator\translator.py:110 +msgid "Mongolian" +msgstr "Mongol" + +#: ../src\extra\translator\translator.py:111 +msgid "Nepali" +msgstr "Nepalí" + +#: ../src\extra\translator\translator.py:112 +msgid "Norwegian" +msgstr "Noruec" + +#: ../src\extra\translator\translator.py:113 +msgid "Oriya" +msgstr "Oriia" + +#: ../src\extra\translator\translator.py:114 +msgid "Pashto" +msgstr "Pastú" + +#: ../src\extra\translator\translator.py:115 +msgid "Persian" +msgstr "Persa" + +#: ../src\extra\translator\translator.py:116 +msgid "Polish" +msgstr "Polac" + +#: ../src\extra\translator\translator.py:117 +msgid "Portuguese" +msgstr "Portuguès" + +#: ../src\extra\translator\translator.py:118 +msgid "Punjabi" +msgstr "Paniabí" + +#: ../src\extra\translator\translator.py:119 +msgid "Romanian" +msgstr "Romanè" + +#: ../src\extra\translator\translator.py:120 +msgid "Russian" +msgstr "Rus" + +#: ../src\extra\translator\translator.py:121 +msgid "Sanskrit" +msgstr "Sànstrit" + +#: ../src\extra\translator\translator.py:122 +msgid "Serbian" +msgstr "Serbi" + +#: ../src\extra\translator\translator.py:123 +msgid "Sindhi" +msgstr "Sindhi" + +#: ../src\extra\translator\translator.py:124 +msgid "Sinhalese" +msgstr "Cingalès" + +#: ../src\extra\translator\translator.py:125 +msgid "Slovak" +msgstr "Eslovac" + +#: ../src\extra\translator\translator.py:126 +msgid "Slovenian" +msgstr "Esloveni" + +#: ../src\extra\translator\translator.py:127 +msgid "Spanish" +msgstr "Espanyol" + +#: ../src\extra\translator\translator.py:128 +msgid "Swahili" +msgstr "Suahili" + +#: ../src\extra\translator\translator.py:129 +msgid "Swedish" +msgstr "Suec" + +#: ../src\extra\translator\translator.py:130 +msgid "Tajik" +msgstr "Tajik" + +#: ../src\extra\translator\translator.py:131 +msgid "Tamil" +msgstr "Tamil" + +#: ../src\extra\translator\translator.py:132 +msgid "Tagalog" +msgstr "Tagal" + +#: ../src\extra\translator\translator.py:133 +msgid "Telugu" +msgstr "Telugú" + +#: ../src\extra\translator\translator.py:134 +msgid "Thai" +msgstr "Tailandès" + +#: ../src\extra\translator\translator.py:135 +msgid "Tibetan" +msgstr "tibetà" + +#: ../src\extra\translator\translator.py:136 +msgid "Turkish" +msgstr "Turc" + +#: ../src\extra\translator\translator.py:137 +msgid "Ukrainian" +msgstr "Ucraïnès" + +#: ../src\extra\translator\translator.py:138 +msgid "Urdu" +msgstr "Urdu" + +#: ../src\extra\translator\translator.py:139 +msgid "Uzbek" +msgstr "Uzbec" + +#: ../src\extra\translator\translator.py:140 +msgid "Uighur" +msgstr "Uigur" + +#: ../src\extra\translator\translator.py:141 +msgid "Vietnamese" +msgstr "Vietnamita" + +#: ../src\extra\translator\translator.py:142 +msgid "Welsh" +msgstr "Galès" + +#: ../src\extra\translator\translator.py:143 +msgid "Yiddish" +msgstr "Yiddish" + +#: ../src\extra\translator\translator.py:150 +msgid "autodetect" +msgstr "Autodetectar" + +#: ../src\gui\buffers\base.py:54 +msgid "Client" +msgstr "Client" + +#: ../src\gui\buffers\base.py:54 +msgid "Text" +msgstr "Text" + +#: ../src\gui\buffers\base.py:54 ../src\gui\buffers\events.py:57 +msgid "Date" +msgstr "data" + +#: ../src\gui\buffers\base.py:54 ../src\gui\buffers\people.py:39 +#: ../src\gui\buffers\user_searches.py:31 ../src\gui\dialogs\utils.py:36 +#: ../src\gui\main.py:154 +msgid "User" +msgstr "Usuari" + +#: ../src\gui\buffers\base.py:73 ../src\gui\buffers\base.py:192 +#: ../src\gui\buffers\events.py:58 ../src\gui\buffers\events.py:74 +#: ../src\gui\dialogs\message.py:332 ../src\gui\main.py:79 +#: ../src\gui\main.py:153 ../src\gui\sysTrayIcon.py:34 +msgid "Tweet" +msgstr "Tuit" + +#: ../src\gui\buffers\base.py:75 ../src\gui\buffers\base.py:204 +#: ../src\gui\main.py:83 ../src\keystrokeEditor\constants.py:13 +msgid "Retweet" +msgstr "Retuit" + +#: ../src\gui\buffers\base.py:77 ../src\gui\main.py:81 +msgid "Reply" +msgstr "Respondre" + +#: ../src\gui\buffers\base.py:79 ../src\gui\main.py:110 +msgid "Direct message" +msgstr "Missatge directe" + +#: ../src\gui\buffers\base.py:92 +msgid "Do you really want to delete this timeline?" +msgstr "Realment vols eliminar aquesta línia temporal?" + +#: ../src\gui\buffers\base.py:92 ../src\gui\buffers\favourites.py:41 +#: ../src\gui\buffers\lists.py:46 ../src\gui\buffers\trends.py:41 +#: ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Attention" +msgstr "Alerta" + +#: ../src\gui\buffers\base.py:104 +msgid "This buffer is not a timeline; it can't be deleted." +msgstr "Aquest buffer no es una liniatemporal; no es pot eliminar." + +#: ../src\gui\buffers\base.py:184 ../src\gui\buffers\dm.py:44 +#: ../src\gui\buffers\people.py:54 +msgid "Direct message to %s" +msgstr "Missatge directe a %s" + +#: ../src\gui\buffers\base.py:192 ../src\gui\buffers\events.py:74 +msgid "Write the tweet here" +msgstr "Escriu el tuit aquí" + +#: ../src\gui\buffers\base.py:204 +msgid "Would you like to add a comment to this tweet?" +msgstr "T'agradaria afegirun comentari a aquest tuit?" + +#: ../src\gui\buffers\base.py:207 +msgid "Add your comment to the tweet" +msgstr "Afegeix el teu comentari al tuit" + +#: ../src\gui\buffers\base.py:223 ../src\gui\buffers\people.py:62 +msgid "Reply to %s" +msgstr "Respondre a %s" + +#: ../src\gui\buffers\base.py:268 +msgid "Opening URL..." +msgstr "Obrint URL..." + +#: ../src\gui\buffers\base.py:285 ../src\gui\buffers\events.py:118 +msgid "" +"Do you really want to empty this buffer? It's tweets will be removed from " +"the list but not from Twitter" +msgstr "" +"Estàs segur de que vols buidar aquest buffer? Els tuits seràn eliminats de " +"la llista, però no de Twitter." + +#: ../src\gui\buffers\base.py:285 ../src\gui\buffers\events.py:118 +msgid "Empty buffer" +msgstr "Buidar buffer" + +#: ../src\gui\buffers\base.py:290 ../src\gui\buffers\events.py:122 +msgid "Do you really want to delete this message?" +msgstr "Realment vols eliminar aquest missatge?" + +#: ../src\gui\buffers\base.py:290 ../src\gui\buffers\events.py:122 +#: ../src\gui\dialogs\lists.py:107 ../src\gui\main.py:91 +#: ../src\gui\main.py:577 +msgid "Delete" +msgstr "Eliminar" + +#: ../src\gui\buffers\base.py:310 ../src\gui\buffers\base.py:321 +msgid "Unable to play audio." +msgstr "Impossible reproduir audio" + +#: ../src\gui\buffers\base.py:312 +msgid "Audio stopped." +msgstr "Audio aturat" + +#: ../src\gui\buffers\events.py:40 +msgid "Empty" +msgstr "Buit" + +#: ../src\gui\buffers\events.py:57 +msgid "Event" +msgstr "Esdeveniment" + +#: ../src\gui\buffers\events.py:60 +msgid "Remove event" +msgstr "Eliminar esdeveniment" + +#: ../src\gui\buffers\favourites.py:41 +msgid "Do you really want to delete this favourites timeline?" +msgstr "Realment vols eliminar aquesta líniade favorits?" + +#: ../src\gui\buffers\lists.py:46 ../src\gui\dialogs\lists.py:107 +msgid "Do you really want to delete this list?" +msgstr "Realment vols eliminar aquesta llista?" + +#: ../src\gui\buffers\panels.py:27 +msgid "Announce" +msgstr "Anuncia" + +#: ../src\gui\buffers\people.py:44 +msgid "Mention" +msgstr "Menció" + +#: ../src\gui\buffers\trends.py:41 ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Do you really want to delete this search term?" +msgstr "Segur que vols esborrar aquest terme de cerca?" + +#: ../src\gui\dialogs\configuration.py:39 +msgid "Language" +msgstr "Idioma" + +#: ../src\gui\dialogs\configuration.py:53 +msgid "Relative times" +msgstr "Temps relatius" + +#: ../src\gui\dialogs\configuration.py:57 +msgid "Activate Sapi5 when any other screen reader is not being run" +msgstr "Activar Sapi5 quan no hi ha un altre lector de pantalla funcionant" + +#: ../src\gui\dialogs\configuration.py:60 +msgid "Activate the auto-start of the invisible interface" +msgstr "Activar l'inici automàtic de la interfície invisible" + +#: ../src\gui\dialogs\configuration.py:64 +msgid "" +"API calls when the stream is started (One API call equals to 200 tweetts, " +"two API calls equals 400 tweets, etc):" +msgstr "" +"Trucades a la API quan el stream s'inicïi (una trucada equival a 200 tuits, " +"2 a 400 tuits, etc):" + +#: ../src\gui\dialogs\configuration.py:72 +msgid "Items on each API call" +msgstr "Elements per cada trucada a la API" + +#: ../src\gui\dialogs\configuration.py:79 +msgid "" +"Inverted buffers: The newest tweets will be shown at the beginning of the " +"lists while the oldest at the end" +msgstr "" +"Buffers invertits: els nous tuits es mostraràn al inici de les llistes y els " +"antics al final" + +#: ../src\gui\dialogs\configuration.py:94 +msgid "Show followers" +msgstr "Veure seguidors" + +#: ../src\gui\dialogs\configuration.py:97 +msgid "Show friends" +msgstr "Veure amics" + +#: ../src\gui\dialogs\configuration.py:100 +msgid "Show favourites" +msgstr "Veure favorits" + +#: ../src\gui\dialogs\configuration.py:103 +msgid "Show blocked users" +msgstr "Veure usuaris bloquejats" + +#: ../src\gui\dialogs\configuration.py:106 +msgid "Show muted users" +msgstr "Veure usuaris silenciats" + +#: ../src\gui\dialogs\configuration.py:109 +msgid "Show events" +msgstr "Veure esdeveniments." + +#: ../src\gui\dialogs\configuration.py:119 +#: ../src\gui\dialogs\configuration.py:267 +msgid "Ignored clients" +msgstr "Clients ignorats" + +#: ../src\gui\dialogs\configuration.py:125 +msgid "Add client" +msgstr "Afegir client" + +#: ../src\gui\dialogs\configuration.py:126 +msgid "Remove client" +msgstr "Esborrar client" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Add a new ignored client" +msgstr "Afegir un nou client ignorat " + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Enter the name of the client here" +msgstr "Introdueix el nom del client aquí." + +#: ../src\gui\dialogs\configuration.py:154 +msgid "Volume" +msgstr "Volum." + +#: ../src\gui\dialogs\configuration.py:163 +msgid "Global mute" +msgstr "Silenci global" + +#: ../src\gui\dialogs\configuration.py:167 +msgid "Output device" +msgstr "Dispositiu de sortida" + +#: ../src\gui\dialogs\configuration.py:176 +msgid "Input device" +msgstr "Dispositiu d'entrada" + +#: ../src\gui\dialogs\configuration.py:184 +msgid "" +"If you've got a SndUp account, enter your API Key here. Whether the API Key " +"is wrong, the App will fail to upload anything to the server. Whether " +"there's no API Key here, then the audio files will be uploaded anonimously" +msgstr "" +"Si tens un compte a SndUp, introdueix el teu API Key aquí. Si l'API Key és " +"incorrecte, el programa no podrá enviar res al servidor. Si no hi ha API Key " +"aqí, els audios s'enviaran de manera anònima" + +#: ../src\gui\dialogs\configuration.py:197 +msgid "Sound pack" +msgstr "Paquet de sons" + +#: ../src\gui\dialogs\configuration.py:213 +#: ../src\gui\dialogs\configuration.py:237 +msgid "Unlink your Dropbox account" +msgstr "Desvincular compte de Dropbox" + +#: ../src\gui\dialogs\configuration.py:215 +#: ../src\gui\dialogs\configuration.py:232 +#: ../src\gui\dialogs\configuration.py:240 +#: ../src\gui\dialogs\configuration.py:244 +#: ../src\gui\dialogs\configuration.py:251 +msgid "Link your Dropbox account" +msgstr "Vincular el teu compte de Dropbox" + +#: ../src\gui\dialogs\configuration.py:225 +msgid "" +"The authorisation request will be shown on your browser. Copy the code tat " +"Dropbox will provide and, in the text box that will appear on TW Blue, paste " +"it. This code is necessary to continue. You only need to do it once." +msgstr "" +"La sol·licitud d'autorització apareixerà al teu navegador. Copia el codi que " +"dropbox et facilitarà i, en el camp de text que apareixerà a TW Blue, " +"enganxa'l. Aquest codi es necessari per continuar. Només ho has de fer una " +"vegada." + +#: ../src\gui\dialogs\configuration.py:225 ../src\sessionmanager\gui.py:83 +msgid "Authorisation" +msgstr "Autorització" + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Enter the code here." +msgstr "Introdueix el codi aquí" + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Verification code" +msgstr "Codi de verificació" + +#: ../src\gui\dialogs\configuration.py:239 +msgid "Error during authorisation. Try again later." +msgstr "Error durant l'autorització. Si et plau, prova-ho més tard." + +#: ../src\gui\dialogs\configuration.py:239 ../src\gui\main.py:718 +#: ../src\gui\main.py:749 +msgid "Error!" +msgstr "Error!" + +#: ../src\gui\dialogs\configuration.py:258 +msgid "TW Blue preferences" +msgstr "Preferències de TW Blue" + +#: ../src\gui\dialogs\configuration.py:262 ../src\issueReporter\gui.py:30 +msgid "General" +msgstr "General" + +#: ../src\gui\dialogs\configuration.py:265 +msgid "Show other buffers" +msgstr "Mostrar altres buffers" + +#: ../src\gui\dialogs\configuration.py:269 +msgid "Sound" +msgstr "So" + +#: ../src\gui\dialogs\configuration.py:271 +msgid "Audio Services" +msgstr "Serveis d'audio" + +#: ../src\gui\dialogs\configuration.py:274 +msgid "Save" +msgstr "Desar" + +#: ../src\gui\dialogs\configuration.py:277 ../src\gui\dialogs\follow.py:64 +#: ../src\gui\dialogs\message.py:182 ../src\gui\dialogs\message.py:269 +#: ../src\gui\dialogs\message.py:352 ../src\gui\dialogs\search.py:42 +#: ../src\gui\dialogs\show_user.py:42 ../src\gui\dialogs\update_profile.py:56 +#: ../src\gui\dialogs\utils.py:42 ../src\keystrokeEditor\gui.py:26 +msgid "Close" +msgstr "Tancar" + +#: ../src\gui\dialogs\configuration.py:290 ../src\gui\main.py:272 +msgid "Followers" +msgstr "Seguidors" + +#: ../src\gui\dialogs\configuration.py:304 +msgid "friends" +msgstr "Amics" + +#: ../src\gui\dialogs\configuration.py:318 +msgid "Favorites" +msgstr "Favorits" + +#: ../src\gui\dialogs\configuration.py:332 ../src\gui\main.py:290 +msgid "Events" +msgstr "Esdeveniments" + +#: ../src\gui\dialogs\configuration.py:343 ../src\gui\main.py:282 +msgid "Blocked users" +msgstr "Usuaris bloquejats" + +#: ../src\gui\dialogs\configuration.py:357 ../src\gui\main.py:286 +msgid "Muted users" +msgstr "Usuaris silenciats" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "Restart TW Blue" +msgstr "Reiniciar TW Blue" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "" +"The application requires to be restarted to save these changes. Press OK to " +"do it now." +msgstr "" +"El programa necessita reiniciar perquè els canvis facin efecte. Prem " +"acceptar per fer-ho ara." + +#: ../src\gui\dialogs\follow.py:33 ../src\gui\dialogs\follow.py:43 +#: ../src\keystrokeEditor\gui.py:17 +msgid "Action" +msgstr "Acció" + +#: ../src\gui\dialogs\follow.py:44 ../src\gui\main.py:96 +msgid "Follow" +msgstr "Seguir" + +#: ../src\gui\dialogs\follow.py:45 ../src\gui\main.py:98 +msgid "Unfollow" +msgstr "Deixar de seguir" + +#: ../src\gui\dialogs\follow.py:46 ../src\gui\main.py:100 +#: ../src\gui\main.py:127 +msgid "Mute" +msgstr "Silenciar" + +#: ../src\gui\dialogs\follow.py:47 ../src\gui\main.py:102 +msgid "Unmute" +msgstr "Dessilenciar" + +#: ../src\gui\dialogs\follow.py:48 ../src\gui\main.py:106 +msgid "Block" +msgstr "Bloquejar" + +#: ../src\gui\dialogs\follow.py:49 ../src\gui\main.py:108 +msgid "Unblock" +msgstr "Desbloquejar" + +#: ../src\gui\dialogs\follow.py:50 ../src\gui\main.py:104 +msgid "Report as spam" +msgstr "Reportar com a spam" + +#: ../src\gui\dialogs\follow.py:61 ../src\gui\dialogs\search.py:40 +#: ../src\gui\dialogs\utils.py:39 ../src\keystrokeEditor\gui.py:76 +msgid "OK" +msgstr "Acceptar" + +#: ../src\gui\dialogs\follow.py:101 +msgid "You've muted to %s" +msgstr "Has silenciat a %s(@%s)" + +#: ../src\gui\dialogs\follow.py:115 +msgid "You've unmuted to %s" +msgstr "Has dessilenciat a %s(@%s)" + +#: ../src\gui\dialogs\lists.py:36 ../src\gui\main.py:66 +msgid "Lists manager" +msgstr "Gestor de llistes" + +#: ../src\gui\dialogs\lists.py:38 ../src\gui\main.py:309 +msgid "Lists" +msgstr "Llistes" + +#: ../src\gui\dialogs\lists.py:39 +msgid "List" +msgstr "Llista" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Members" +msgstr "Membres" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Owner" +msgstr "Propietari" + +#: ../src\gui\dialogs\lists.py:39 +msgid "mode" +msgstr "Manera" + +#: ../src\gui\dialogs\lists.py:39 ../src\gui\dialogs\lists.py:181 +msgid "Description" +msgstr "Descripció" + +#: ../src\gui\dialogs\lists.py:44 ../src\gui\dialogs\lists.py:173 +msgid "Create a new list" +msgstr "Crear una nova llista" + +#: ../src\gui\dialogs\lists.py:46 ../src\keystrokeEditor\gui.py:22 +msgid "Edit" +msgstr "Editar" + +#: ../src\gui\dialogs\lists.py:48 ../src\gui\dialogs\lists.py:235 +msgid "Remove" +msgstr "Esborrar" + +#: ../src\gui\dialogs\lists.py:50 +msgid "Open in buffer" +msgstr "Obrir en buffer" + +#: ../src\gui\dialogs\lists.py:125 +msgid "List opened" +msgstr "Llista oberta" + +#: ../src\gui\dialogs\lists.py:127 +msgid "This list is arready opened." +msgstr "Aquesta llista ja està oberta" + +#: ../src\gui\dialogs\lists.py:130 ../src\gui\main.py:312 +msgid "List for %s" +msgstr "Llista %s" + +#: ../src\gui\dialogs\lists.py:148 +msgid "Viewing lists for %s" +msgstr "Veient les llistes de %s" + +#: ../src\gui\dialogs\lists.py:149 +msgid "Subscribe" +msgstr "Donar-se d'alta" + +#: ../src\gui\dialogs\lists.py:150 +msgid "Unsubscribe" +msgstr "Donar-se de baixa" + +#: ../src\gui\dialogs\lists.py:176 +msgid "Name (20 characters maximun)" +msgstr "Nom (màxim vint caràcters)" + +#: ../src\gui\dialogs\lists.py:186 +msgid "Mode" +msgstr "Manera" + +#: ../src\gui\dialogs\lists.py:187 +msgid "Public" +msgstr "Públic" + +#: ../src\gui\dialogs\lists.py:188 +msgid "Private" +msgstr "Privat" + +#: ../src\gui\dialogs\lists.py:208 +msgid "Editing the list %s" +msgstr "Editant la llista %s" + +#: ../src\gui\dialogs\lists.py:219 +msgid "Select a list to add the user" +msgstr "Selecciona una llista per a afegir a l'usuari" + +#: ../src\gui\dialogs\lists.py:220 +msgid "Add" +msgstr "Afegir" + +#: ../src\gui\dialogs\lists.py:234 +msgid "Select a list to remove the user" +msgstr "Selecciona una llista per esborrar a l'usuari" + +#: ../src\gui\dialogs\message.py:42 ../src\keystrokeEditor\constants.py:11 +msgid "New tweet" +msgstr "Tuit nou" + +#: ../src\gui\dialogs\message.py:76 +msgid "Attaching..." +msgstr "Adjuntant..." + +#: ../src\gui\dialogs\message.py:77 +msgid "Uploading..." +msgstr "Carregant..." + +#: ../src\gui\dialogs\message.py:96 +msgid "Unable to upload the audio" +msgstr "Impossible carregar l'audio" + +#: ../src\gui\dialogs\message.py:110 ../src\gui\dialogs\message.py:395 +msgid "Translated" +msgstr "Traduït" + +#: ../src\gui\dialogs\message.py:122 +msgid "There's no URL to be shortened" +msgstr "No hi ha cap adreça per escurçar." + +#: ../src\gui\dialogs\message.py:125 +msgid "URL shortened" +msgstr "Adreça escurçada." + +#: ../src\gui\dialogs\message.py:133 ../src\gui\dialogs\message.py:407 +msgid "There's no URL to be expanded" +msgstr "No hi ha cap adreça per expandir." + +#: ../src\gui\dialogs\message.py:136 ../src\gui\dialogs\message.py:410 +msgid "URL expanded" +msgstr "Adreça expandida" + +#: ../src\gui\dialogs\message.py:164 ../src\gui\dialogs\message.py:219 +#: ../src\gui\dialogs\update_profile.py:51 +#: ../src\gui\dialogs\update_profile.py:88 +msgid "Upload a picture" +msgstr "Carregar una fotografia" + +#: ../src\gui\dialogs\message.py:167 ../src\gui\dialogs\message.py:254 +#: ../src\gui\dialogs\message.py:345 +msgid "Spelling correction" +msgstr "Correcció d'escriptura." + +#: ../src\gui\dialogs\message.py:171 ../src\gui\dialogs\message.py:258 +msgid "Shorten URL" +msgstr "Escurçar adreça" + +#: ../src\gui\dialogs\message.py:173 ../src\gui\dialogs\message.py:260 +#: ../src\gui\dialogs\message.py:347 +msgid "Expand URL" +msgstr "Expandir adreça" + +#: ../src\gui\dialogs\message.py:179 ../src\gui\dialogs\message.py:266 +msgid "Send" +msgstr "Enviar" + +#: ../src\gui\dialogs\message.py:215 ../src\gui\dialogs\message.py:226 +#: ../src\gui\dialogs\update_profile.py:84 +#: ../src\gui\dialogs\update_profile.py:95 +msgid "Discard image" +msgstr "Descartar imatge" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" +msgstr "Fitxers d'imatge (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Select the picture to be uploaded" +msgstr "Selecciona la fotografia per carregar." + +#: ../src\gui\dialogs\message.py:248 +msgid "Recipient" +msgstr "Destinatari" + +#: ../src\gui\dialogs\message.py:303 +msgid "Mention to all" +msgstr "Mencionar a tothom" + +#: ../src\gui\dialogs\message.py:330 +msgid "Tweet - %i characters " +msgstr "Tuit - %i caràcters" + +#: ../src\gui\dialogs\search.py:26 +msgid "Search on Twitter" +msgstr "Cerca a Twitter" + +#: ../src\gui\dialogs\search.py:27 ../src\gui\main.py:64 +msgid "Search" +msgstr "Cerca" + +#: ../src\gui\dialogs\search.py:34 +msgid "Tweets" +msgstr "Tuits" + +#: ../src\gui\dialogs\search.py:35 +msgid "Users" +msgstr "Usuaris" + +#: ../src\gui\dialogs\show_user.py:26 +msgid "Information for %s" +msgstr "Detalls per a %s" + +#: ../src\gui\dialogs\show_user.py:30 +msgid "Details" +msgstr "Detalls" + +#: ../src\gui\dialogs\show_user.py:39 +msgid "Go to URL" +msgstr "Anar a l'adreça" + +#: ../src\gui\dialogs\show_user.py:63 +msgid "This user does not exist on Twitter" +msgstr "Aquest usuari no existeix a Twitter." + +#: ../src\gui\dialogs\show_user.py:68 +msgid "Username: @%s\n" +msgstr "Nom d'usuari: @%s\n" + +#: ../src\gui\dialogs\show_user.py:69 +msgid "Name: %s\n" +msgstr "Nom: %s\n" + +#: ../src\gui\dialogs\show_user.py:71 +msgid "Location: %s\n" +msgstr "Localització: %s\n" + +#: ../src\gui\dialogs\show_user.py:73 +msgid "URL: %s\n" +msgstr "URL: %s\n" + +#: ../src\gui\dialogs\show_user.py:76 +msgid "Bio: %s\n" +msgstr "Descripció: %s\n" + +#: ../src\gui\dialogs\show_user.py:77 +msgid "Yes" +msgstr "Sí" + +#: ../src\gui\dialogs\show_user.py:78 +msgid "No" +msgstr "No" + +#: ../src\gui\dialogs\show_user.py:79 +msgid "Protected: %s\n" +msgstr "Protegit: %s\n" + +#: ../src\gui\dialogs\show_user.py:80 +msgid "" +"Followers: %s\n" +" Friends: %s\n" +msgstr "" +"Seguidors: %s\n" +" Amics: %s\n" + +#: ../src\gui\dialogs\show_user.py:81 +msgid "Tweets: %s\n" +msgstr "Tuits: %s\n" + +#: ../src\gui\dialogs\show_user.py:82 +msgid "Favourites: %s" +msgstr "Favorits: %s" + +#: ../src\gui\dialogs\update_profile.py:27 +msgid "Update your profile" +msgstr "Actualitzar el teu perfil" + +#: ../src\gui\dialogs\update_profile.py:29 +msgid "Name (20 characters maximum)" +msgstr "Nom (màxim vint caràcters)" + +#: ../src\gui\dialogs\update_profile.py:35 +msgid "Location" +msgstr "Localització" + +#: ../src\gui\dialogs\update_profile.py:40 +msgid "Website" +msgstr "Lloc web" + +#: ../src\gui\dialogs\update_profile.py:45 +msgid "Bio (160 characters maximum)" +msgstr "Descripció (màxim 160 caràcters)" + +#: ../src\gui\dialogs\update_profile.py:53 ../src\gui\main.py:60 +#: ../src\gui\sysTrayIcon.py:38 +msgid "Update profile" +msgstr "Actualitzar perfil" + +#: ../src\gui\dialogs\urlList.py:26 +msgid "Select an URL" +msgstr "Selecciona una adreça" + +#: ../src\gui\main.py:62 +msgid "Hide window" +msgstr "Amagar finestra" + +#: ../src\gui\main.py:70 +msgid "Edit keystrokes" +msgstr "Editar combinacions de teclat" + +#: ../src\gui\main.py:72 ../src\gui\sysTrayIcon.py:36 +msgid "Preferences" +msgstr "Preferències" + +#: ../src\gui\main.py:74 ../src\gui\main.py:597 ../src\gui\sysTrayIcon.py:46 +msgid "Exit" +msgstr "Sortir" + +#: ../src\gui\main.py:85 +msgid "Add to favourites" +msgstr "Afegir a favorit" + +#: ../src\gui\main.py:87 ../src\keystrokeEditor\constants.py:16 +msgid "Remove from favourites" +msgstr "Esborrar de favorits" + +#: ../src\gui\main.py:89 ../src\keystrokeEditor\constants.py:19 +msgid "Show tweet" +msgstr "Veure tuit" + +#: ../src\gui\main.py:112 ../src\keystrokeEditor\constants.py:36 +msgid "Add to list" +msgstr "Afegir a llista" + +#: ../src\gui\main.py:114 ../src\keystrokeEditor\constants.py:37 +msgid "Remove from list" +msgstr "Eliminar de llista" + +#: ../src\gui\main.py:116 +msgid "View lists" +msgstr "Veure llistes" + +#: ../src\gui\main.py:118 +msgid "Show user profile" +msgstr "Veure perfil de l'usuari" + +#: ../src\gui\main.py:120 +msgid "Timeline" +msgstr "Línia temporal" + +#: ../src\gui\main.py:122 +msgid "View favourites" +msgstr "¿¿¿Veure favorits" + +#: ../src\gui\main.py:129 +msgid "Autoread tweets for this buffer" +msgstr "Llegir automàticament els tuits d'aquest buffer." + +#: ../src\gui\main.py:131 +msgid "Clear buffer" +msgstr "Netejar buffer" + +#: ../src\gui\main.py:133 ../src\keystrokeEditor\constants.py:22 +msgid "Remove buffer" +msgstr "Esborrar buffer" + +#: ../src\gui\main.py:138 ../src\gui\sysTrayIcon.py:42 +msgid "Documentation" +msgstr "Documentació" + +#: ../src\gui\main.py:140 +msgid "What's new in this version?" +msgstr "Què hi ha de nou en aquesta versió?" + +#: ../src\gui\main.py:142 ../src\gui\sysTrayIcon.py:44 +msgid "Check for updates" +msgstr "Cercar actualitzacions" + +#: ../src\gui\main.py:144 ../src\issueReporter\gui.py:34 +msgid "Report an error" +msgstr "Reportar un problema" + +#: ../src\gui\main.py:146 +msgid "TW Blue website" +msgstr "Pàgina web de TWBlue" + +#: ../src\gui\main.py:148 +msgid "About TW Blue" +msgstr "Sobre TW Blue" + +#: ../src\gui\main.py:152 +msgid "Application" +msgstr "Aplicació" + +#: ../src\gui\main.py:155 +msgid "Buffer" +msgstr "Buffer" + +#: ../src\gui\main.py:156 +msgid "Help" +msgstr "Ajuda" + +#: ../src\gui\main.py:249 +msgid "Home" +msgstr "Principal" + +#: ../src\gui\main.py:254 +msgid "Mentions" +msgstr "Mencions" + +#: ../src\gui\main.py:257 +msgid "Direct messages" +msgstr "Missatges directes" + +#: ../src\gui\main.py:260 +msgid "Sent" +msgstr "Enviats" + +#: ../src\gui\main.py:266 +msgid "Favourites" +msgstr "Favorits" + +#: ../src\gui\main.py:278 +msgid "Friends" +msgstr "Amics" + +#: ../src\gui\main.py:293 +msgid "Searches" +msgstr "Recerques" + +#: ../src\gui\main.py:303 +msgid "Timelines" +msgstr "Línies temporals" + +#: ../src\gui\main.py:306 ../src\gui\main.py:714 +msgid "Timeline for %s" +msgstr "Línia temporal de %s" + +#: ../src\gui\main.py:317 +msgid "Favourites timelines" +msgstr "Línies temporals favorites" + +#: ../src\gui\main.py:320 ../src\gui\main.py:745 +msgid "Favourites for %s" +msgstr "Favorits de %s" + +#: ../src\gui\main.py:361 +msgid "Ready" +msgstr "Preparat" + +#: ../src\gui\main.py:388 +msgid "%s favourites from %s" +msgstr "%s favorits de %s" + +#: ../src\gui\main.py:435 +msgid "Streams disconnected. TW Blue will try to reconnect in a minute." +msgstr "Streams desconnectats. TW Blue provarà de connectar-se en un minut." + +#: ../src\gui\main.py:439 +msgid "Reconnecting streams..." +msgstr "Reconectant els streams..." + +#: ../src\gui\main.py:463 +msgid "search for %s" +msgstr "Cercar per %s" + +#: ../src\gui\main.py:468 +msgid "search users for %s" +msgstr "Cercar usuaris per %s" + +#: ../src\gui\main.py:479 ../src\gui\main.py:490 ../src\gui\main.py:509 +msgid "Select the user" +msgstr "Selecciona l'usuari" + +#: ../src\gui\main.py:569 +msgid "User details" +msgstr "Detalls de l'usuari" + +#: ../src\gui\main.py:577 +msgid "" +"Do you really want to delete this message? It will be eliminated from " +"Twitter as well." +msgstr "" +"Estàs segur de que vols esborrar aquest missatge? Tambè s'esborrarà de " +"Twitter." + +#: ../src\gui\main.py:597 +msgid "Do you really want to close TW Blue?" +msgstr "Estàs segur de que vols sortir de TW Blue?" + +#: ../src\gui\main.py:687 +msgid "Error while adding to favourites." +msgstr "Error afegint a favorit" + +#: ../src\gui\main.py:695 +msgid "Error while removing from favourites." +msgstr "Error esborrant de favorits" + +#: ../src\gui\main.py:699 +msgid "Individual timeline" +msgstr "Línia temporal individual" + +#: ../src\gui\main.py:703 ../src\gui\main.py:734 +msgid "The user does not exist" +msgstr "L'usuari no existeix" + +#: ../src\gui\main.py:709 +msgid "Existing timeline" +msgstr "Linea temporal existent" + +#: ../src\gui\main.py:709 +msgid "" +"There's currently a timeline for this user. You are not able to open another" +msgstr "" +"Ja hi ha una línia temporal per aquest usuari. No pots obrirne una altra." + +#: ../src\gui\main.py:718 +msgid "This user has no tweets. You can't open a timeline for this user" +msgstr "Aquest usuari no té tuits. No pots obrir la seva línia temporal." + +#: ../src\gui\main.py:730 +msgid "List of favourites" +msgstr "Llista de favorits" + +#: ../src\gui\main.py:740 +msgid "Existing list" +msgstr "Llista existent" + +#: ../src\gui\main.py:740 +msgid "" +"There's already a list of favourites for this user. You can't create another." +msgstr "" +"Ja hi ha una llista de favorits d'aquest usuari. No pots crear-ne una altra." + +#: ../src\gui\main.py:749 +msgid "" +"This user has no favourites. You can't create a list of favourites for this " +"user." +msgstr "" +"Aquest usuari no té tuits favorits. No pots obrir una llista dels seus tuits " +"favorits." + +#: ../src\gui\main.py:791 ../src\gui\main.py:804 +msgid "%s, %s of %s" +msgstr "%s, %s de %s" + +#: ../src\gui\main.py:793 ../src\gui\main.py:806 +msgid "%s. Empty" +msgstr "%s. buit" + +#: ../src\gui\main.py:829 +msgid "Global mute on" +msgstr "Silenci global activat" + +#: ../src\gui\main.py:832 +msgid "Global mute off" +msgstr "Silenci global desactivat" + +#: ../src\gui\main.py:838 +msgid "Buffer mute on" +msgstr "Silenci de buffer activat" + +#: ../src\gui\main.py:841 +msgid "Buffer mute off" +msgstr "Silenci de buffer desactivat" + +#: ../src\gui\main.py:847 +msgid "The auto-reading of new tweets is enabled for this buffer" +msgstr "La lectura automàtica de tuits per a aquest buffer està activada." + +#: ../src\gui\main.py:850 +msgid "The auto-reading of new tweets is disabled for this buffer" +msgstr "La lectura automàtica de tuits per a aquest buffer està desactivada." + +#: ../src\gui\main.py:857 +msgid "Copied" +msgstr "Copiat" + +#: ../src\gui\main.py:868 ../src\gui\main.py:877 +msgid "%s" +msgstr "%s" + +#: ../src\gui\sysTrayIcon.py:40 +msgid "Show / hide" +msgstr "Veure/ amagar" + +#: ../src\issueReporter\gui.py:31 +msgid "always" +msgstr "Sempre" + +#: ../src\issueReporter\gui.py:31 +msgid "have not tried" +msgstr "no s'ha intentat" + +#: ../src\issueReporter\gui.py:31 +msgid "random" +msgstr "aleatori" + +#: ../src\issueReporter\gui.py:31 +msgid "sometimes" +msgstr "a vegades" + +#: ../src\issueReporter\gui.py:31 +msgid "unable to duplicate" +msgstr "Impossible duplicar." + +#: ../src\issueReporter\gui.py:32 +msgid "block" +msgstr "bloquejar" + +#: ../src\issueReporter\gui.py:32 +msgid "crash" +msgstr "error" + +#: ../src\issueReporter\gui.py:32 +msgid "feature" +msgstr "característica" + +#: ../src\issueReporter\gui.py:32 +msgid "major" +msgstr "major" + +#: ../src\issueReporter\gui.py:32 +msgid "minor" +msgstr "menor" + +#: ../src\issueReporter\gui.py:32 +msgid "text" +msgstr "text" + +#: ../src\issueReporter\gui.py:32 +msgid "trivial" +msgstr "Trivial" + +#: ../src\issueReporter\gui.py:32 +msgid "tweak" +msgstr "configuració" + +#: ../src\issueReporter\gui.py:37 +msgid "Select a category" +msgstr "selecciona una categoria" + +#: ../src\issueReporter\gui.py:46 +msgid "" +"Briefly describe what happened. You will be able to thoroughly explain it " +"later" +msgstr "" +"Descriu en poques paraules el que ha passat. Desprès podràs explicar-ho més " +"profundament" + +#: ../src\issueReporter\gui.py:56 +msgid "Here, you can describe the bug in detail" +msgstr "Aquí pots descriure amb detall el problema" + +#: ../src\issueReporter\gui.py:66 +msgid "how often does this bug happen?" +msgstr "Amb quina freqüència té lloc aquest error?" + +#: ../src\issueReporter\gui.py:74 +msgid "Select the importance that you think this bug has" +msgstr "Selecciona la importància que creus que té aquest bug del programa" + +#: ../src\issueReporter\gui.py:82 +msgid "" +"I know that the TW Blue bug system will get my Twitter username to contact " +"me and fix the bug quickly" +msgstr "" +"Jo sé que el sistema de bugs de TW Blue obtindrà el meu nom d'usuari per " +"contactar-me i solucionar el bug ràpidament." + +#: ../src\issueReporter\gui.py:85 +msgid "Send report" +msgstr "Enviar report" + +#: ../src\issueReporter\gui.py:98 +msgid "You must fill out both fields" +msgstr "Has d'omplir els dos camps" + +#: ../src\issueReporter\gui.py:101 +msgid "" +"You need to mark the checkbox to provide us your twitter username to contact " +"to you if is necessary." +msgstr "" +"Necessites marcar la casella per donar-nos el teu nom d'usuari de Twitter " +"per contactar amb tu si és necessari." + +#: ../src\issueReporter\gui.py:120 +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 "" +"Gracies per reportar aquest problema! Tant de bó puguis veure'l entre la " +"llista de millores de pròximes versions. Has reportat el problema nombre %i" + +#: ../src\issueReporter\gui.py:120 +msgid "reported" +msgstr "Reportat" + +#: ../src\issueReporter\gui.py:123 +msgid "Error while reporting" +msgstr "Error reportant" + +#: ../src\issueReporter\gui.py:123 +msgid "" +"Something unexpected occurred while trying to report the bug. Please, try " +"again later" +msgstr "" +"Alguna cosa inesperada ha passat quan s'intentaba reportar el teu problema. " +"Si et plau, prova-ho de nou més tard." + +#: ../src\keystrokeEditor\constants.py:4 +msgid "Go up up on the current list" +msgstr "Va a dalt en la llista actual" + +#: ../src\keystrokeEditor\constants.py:5 +msgid "Go down up on the current list" +msgstr "Va a baix en la llista actual" + +#: ../src\keystrokeEditor\constants.py:6 +msgid "Go to the previous tab" +msgstr "Anar a la pestanya anterior" + +#: ../src\keystrokeEditor\constants.py:7 +msgid "Go to the next tab" +msgstr "Anar a la pestanya següent" + +#: ../src\keystrokeEditor\constants.py:8 +msgid "Move up one tweet in the conversation" +msgstr "Anar un tuit amunt a la conversa" + +#: ../src\keystrokeEditor\constants.py:9 +msgid "Move down one tweet in the conversation" +msgstr "Anar un tuit avall a la conversa" + +#: ../src\keystrokeEditor\constants.py:10 +msgid "Show the graphical interface" +msgstr "Activar la visualització gràfica" + +#: ../src\keystrokeEditor\constants.py:12 +msgid "Reply to a tweet" +msgstr "Respondre un twit." + +#: ../src\keystrokeEditor\constants.py:14 +msgid "Send direct message" +msgstr "Enviar Missatge Directe" + +#: ../src\keystrokeEditor\constants.py:15 +msgid "Mark as favourite" +msgstr "Marcar com a favorit" + +#: ../src\keystrokeEditor\constants.py:17 +msgid "Open the actions dialogue" +msgstr "Obrir diàlec d'accions" + +#: ../src\keystrokeEditor\constants.py:18 +msgid "See user details" +msgstr "Veure detalls de l'usuari" + +#: ../src\keystrokeEditor\constants.py:20 +msgid "Quit" +msgstr "Sortir" + +#: ../src\keystrokeEditor\constants.py:21 +msgid "Open user timeline" +msgstr "Obrir línia temporal" + +#: ../src\keystrokeEditor\constants.py:23 +msgid "" +"Open URL on the current tweet, or further information for a friend or " +"follower" +msgstr "" +"Obrir adreça al twit actual, o sol·licitar més informació a buffers d'usuaris" + +#: ../src\keystrokeEditor\constants.py:24 +msgid "Attempt to play audio" +msgstr "Provar de reproduir audio" + +#: ../src\keystrokeEditor\constants.py:25 +msgid "Increase volume by 5%" +msgstr "Augmentar Volum 5%" + +#: ../src\keystrokeEditor\constants.py:26 +msgid "Decrease volume by 5%" +msgstr "Baixar Volum 5%" + +#: ../src\keystrokeEditor\constants.py:27 +msgid "Go to the first element on the list" +msgstr "Anar al primer element DE LA LLISTA" + +#: ../src\keystrokeEditor\constants.py:28 +msgid "Go to the last element on the list" +msgstr "Anar al darrer element de la llista" + +#: ../src\keystrokeEditor\constants.py:29 +msgid "Move 20 elements up on the current list" +msgstr "Moure's 20 elements cap amunt en la llista actual" + +#: ../src\keystrokeEditor\constants.py:30 +msgid "Move 20 elements down on the current list" +msgstr "Moure's 20 elements cap avall en la llista actual" + +#: ../src\keystrokeEditor\constants.py:31 +msgid "Edit profile" +msgstr "Editar perfil" + +#: ../src\keystrokeEditor\constants.py:32 +msgid "Remove a tweet or direct message" +msgstr "Esborrar un tuit o missatge directe" + +#: ../src\keystrokeEditor\constants.py:33 +msgid "Empty the buffer removing all the elements" +msgstr "Buidar buffer, eliminant tos els elements" + +#: ../src\keystrokeEditor\constants.py:34 +msgid "Listen the current message" +msgstr "Escoltar el missatge actual" + +#: ../src\keystrokeEditor\constants.py:35 +msgid "Copy to clipboard" +msgstr "Copiar al portapapers" + +#: ../src\keystrokeEditor\constants.py:38 +msgid "Mutes/unmutes the active buffer" +msgstr "Activar o desactivar el so al buffer actiu" + +#: ../src\keystrokeEditor\constants.py:39 +msgid "Globally mute/unmute TW Blue" +msgstr "Activar o desactivar el silenci global de TW Blue" + +#: ../src\keystrokeEditor\constants.py:40 +msgid "toggles the automatic reading of incoming tweets in the active buffer" +msgstr "Commutar la lectura automàtica de tuits per a aquest buffer" + +#: ../src\keystrokeEditor\constants.py:41 +msgid "Search on twitter" +msgstr "Cerca a Twitter" + +#: ../src\keystrokeEditor\constants.py:42 +msgid "Shows the keystroke editor" +msgstr "Mostrar l'editor de combinacions de teclat" + +#: ../src\keystrokeEditor\constants.py:43 +msgid "Show lists for a specified user" +msgstr "Veure llistes de l'usuari específic" + +#: ../src\keystrokeEditor\gui.py:10 +msgid "Keystroke editor" +msgstr "Editor de combinacions de teclat" + +#: ../src\keystrokeEditor\gui.py:16 +msgid "Select a keystroke to edit" +msgstr "Selecciona una combinació de teclat per editar-la" + +#: ../src\keystrokeEditor\gui.py:17 +msgid "Keystroke" +msgstr "Combinació de teclat" + +#: ../src\keystrokeEditor\gui.py:54 +msgid "Editing keystroke" +msgstr "Editant combinació de tecles" + +#: ../src\keystrokeEditor\gui.py:61 +msgid "Control" +msgstr "Control" + +#: ../src\keystrokeEditor\gui.py:62 +msgid "Alt" +msgstr "Alt" + +#: ../src\keystrokeEditor\gui.py:63 +msgid "Shift" +msgstr "Shift" + +#: ../src\keystrokeEditor\gui.py:64 +msgid "Windows" +msgstr "Windows" + +#: ../src\keystrokeEditor\gui.py:70 +msgid "Key" +msgstr "Tecla" + +#: ../src\keystrokeEditor\gui.py:99 +msgid "You need to use the Windows key" +msgstr "Necessites utilitzar la tecla Windows" + +#: ../src\keystrokeEditor\gui.py:99 ../src\keystrokeEditor\gui.py:112 +msgid "Invalid keystroke" +msgstr "Combinació de teclat invàlida" + +#: ../src\keystrokeEditor\gui.py:112 +msgid "You must provide a character for the keystroke" +msgstr "Has de triar una lletra per a la cominació ràpida de teclat" + +#: ../src\languageHandler.py:95 +msgid "User default" +msgstr "Usuari per defecte" + +#: ../src\sessionmanager\gui.py:19 +msgid "Session manager" +msgstr "Gestor de sessió" + +#: ../src\sessionmanager\gui.py:23 +msgid "Select a twitter account to start TW Blue" +msgstr "Selecciona un compte de Twitter per començar a TWBlue" + +#: ../src\sessionmanager\gui.py:25 +msgid "Account" +msgstr "Compte" + +#: ../src\sessionmanager\gui.py:30 +msgid "New account" +msgstr "Compte nou" + +#: ../src\sessionmanager\gui.py:67 +msgid "Account Error" +msgstr "Problema de compte" + +#: ../src\sessionmanager\gui.py:67 +msgid "You need to configure an account." +msgstr "Necessites configurar un compte" + +#: ../src\sessionmanager\gui.py:83 +msgid "" +"The request for the required Twitter authorization to continue will be " +"opened on your browser. You only need to do it once. Would you like to " +"autorhise a new account now?" +msgstr "" +"La Sol·licitud per a l'autorització del teu compte de Twitter s'obrirá al " +"navigador. Només has de fer això una vegada. Vols autoritzar un compte de " +"Twitter ara?" + +#: ../src\sessionmanager\gui.py:94 +msgid "Invalid user token" +msgstr "Token d'usuari invàlid" + +#: ../src\sessionmanager\gui.py:94 +msgid "" +"Your access token is invalid or the authorisation has failed. Please try " +"again." +msgstr "" +"El teu token d'accés és invàlid o l'autorització ha fallat. Si et plau, " +"prova-ho de nou." + +#: ../src\sessionmanager\gui.py:97 +msgid "Authorised account %d" +msgstr "Compte autoritzat" + +#: ../src\twitter\buffers\indibidual.py:26 +msgid "One tweet from %s" +msgstr "Un tuit de %s" + +#: ../src\twitter\buffers\indibidual.py:35 +msgid "One tweet from %s in the list %s" +msgstr "Un tuit de %s en la llista %s" + +#: ../src\twitter\buffers\stream.py:57 +msgid "One mention from %s " +msgstr "Una menció de %s" + +#: ../src\twitter\buffers\stream.py:69 +msgid "One direct message" +msgstr "Un missatge directe" + +#: ../src\twitter\compose.py:22 +msgid "About a week ago" +msgstr "Fa una setmana" + +#: ../src\twitter\compose.py:24 +msgid "About {} weeks ago" +msgstr "Fa {} setmanes" + +#: ../src\twitter\compose.py:26 +msgid "A month ago" +msgstr "Fa un mes" + +#: ../src\twitter\compose.py:28 +msgid "About {} months ago" +msgstr "Fa {} messos" + +#: ../src\twitter\compose.py:30 +msgid "About a year ago" +msgstr "Fa un any" + +#: ../src\twitter\compose.py:32 +msgid "About {} years ago" +msgstr "Fa {} anys" + +#: ../src\twitter\compose.py:34 +msgid "About 1 day ago" +msgstr "Fa un dia" + +#: ../src\twitter\compose.py:36 +msgid "About {} days ago" +msgstr "Fa {} dies" + +#: ../src\twitter\compose.py:38 +msgid "just now" +msgstr "Ara mateix" + +#: ../src\twitter\compose.py:40 +msgid "{} seconds ago" +msgstr "Fa %s segons" + +#: ../src\twitter\compose.py:42 +msgid "1 minute ago" +msgstr "Fa 1 minut" + +#: ../src\twitter\compose.py:44 +msgid "{} minutes ago" +msgstr "Fa {} minuts" + +#: ../src\twitter\compose.py:46 +msgid "About 1 hour ago" +msgstr "Fa una hora" + +#: ../src\twitter\compose.py:48 +msgid "About {} hours ago" +msgstr "Fa {} hores" + +#: ../src\twitter\compose.py:52 +msgid "January" +msgstr "Jener" + +#: ../src\twitter\compose.py:53 +msgid "February" +msgstr "Febrer" + +#: ../src\twitter\compose.py:54 +msgid "March" +msgstr "Març" + +#: ../src\twitter\compose.py:55 +msgid "April" +msgstr "Abril" + +#: ../src\twitter\compose.py:56 +msgid "May" +msgstr "Maig" + +#: ../src\twitter\compose.py:57 +msgid "June" +msgstr "Juny" + +#: ../src\twitter\compose.py:58 +msgid "July" +msgstr "Juliol" + +#: ../src\twitter\compose.py:59 +msgid "August" +msgstr "Agost" + +#: ../src\twitter\compose.py:60 +msgid "September" +msgstr "Setembre" + +#: ../src\twitter\compose.py:61 +msgid "October" +msgstr "Octubre" + +#: ../src\twitter\compose.py:62 +msgid "November" +msgstr "Novembre" + +#: ../src\twitter\compose.py:63 +msgid "December" +msgstr "Decembre" + +#: ../src\twitter\compose.py:66 +msgid "Sunday" +msgstr "Diumenge" + +#: ../src\twitter\compose.py:67 +msgid "Monday" +msgstr "Dilluns" + +#: ../src\twitter\compose.py:68 +msgid "Tuesday" +msgstr "Dimars" + +#: ../src\twitter\compose.py:69 +msgid "Wednesday" +msgstr "Dimecres" + +#: ../src\twitter\compose.py:70 +msgid "Thursday" +msgstr "Dijous" + +#: ../src\twitter\compose.py:71 +msgid "Friday" +msgstr "Divendres" + +#: ../src\twitter\compose.py:72 +msgid "Saturday" +msgstr "Disabte" + +#: ../src\twitter\compose.py:75 +msgid "sun" +msgstr "Diumenge" + +#: ../src\twitter\compose.py:76 +msgid "mon" +msgstr "Dilluns" + +#: ../src\twitter\compose.py:77 +msgid "tue" +msgstr "Dimarts" + +#: ../src\twitter\compose.py:78 +msgid "wed" +msgstr "Dimecres" + +#: ../src\twitter\compose.py:79 +msgid "thu" +msgstr "Dijous" + +#: ../src\twitter\compose.py:80 +msgid "fri" +msgstr "Divendres" + +#: ../src\twitter\compose.py:81 +msgid "sat" +msgstr "Dissabte" + +#: ../src\twitter\compose.py:85 +msgid "jan" +msgstr "Jener" + +#: ../src\twitter\compose.py:86 +msgid "feb" +msgstr "Febrer" + +#: ../src\twitter\compose.py:87 +msgid "mar" +msgstr "Març" + +#: ../src\twitter\compose.py:88 +msgid "apr" +msgstr "Abril" + +#: ../src\twitter\compose.py:89 +msgid "may" +msgstr "Maig" + +#: ../src\twitter\compose.py:90 +msgid "jun" +msgstr "Juny" + +#: ../src\twitter\compose.py:91 +msgid "jul" +msgstr "Juliol" + +#: ../src\twitter\compose.py:92 +msgid "aug" +msgstr "Agost" + +#: ../src\twitter\compose.py:93 +msgid "sep" +msgstr "Setembre" + +#: ../src\twitter\compose.py:94 +msgid "oct" +msgstr "Octubre" + +#: ../src\twitter\compose.py:95 +msgid "nov" +msgstr "Novembre" + +#: ../src\twitter\compose.py:96 +msgid "dec" +msgstr "Decembre" + +#: ../src\twitter\compose.py:152 +msgid "Dm to %s " +msgstr "dm a %s" + +#: ../src\twitter\compose.py:185 +msgid "Unavailable" +msgstr "No disponible" + +#: ../src\twitter\compose.py:186 +msgid "" +"%s (@%s). %s followers, %s friends, %s tweets. Last tweet on %s. Joined " +"Twitter on %s" +msgstr "" +"%s (@%s). %s seguidors, %s amics, %s tuits. Últim tuit el %s. Es va unir a " +"Twitter el %s" + +#: ../src\twitter\compose.py:190 +msgid "You've blocked %s" +msgstr "Has bloquejat a %s" + +#: ../src\twitter\compose.py:192 +msgid "You've unblocked %s" +msgstr "has desbloquejat %s" + +#: ../src\twitter\compose.py:195 +msgid "%s(@%s) has followed you" +msgstr "%s(@%s) ha començat a seguirte" + +#: ../src\twitter\compose.py:197 +msgid "You've followed %s(@%s)" +msgstr "Has seguit a %s(@%s)" + +#: ../src\twitter\compose.py:199 +msgid "You've unfollowed %s (@%s)" +msgstr "Has deixat de seguir a %s(@%s)" + +#: ../src\twitter\compose.py:202 +msgid "You've added to favourites: %s, %s" +msgstr "Has afegit a favorits: %s, %s" + +#: ../src\twitter\compose.py:204 +msgid "%s(@%s) has marked as favorite: %s" +msgstr "%s(@%s) ha marcat com a favorit: %s" + +#: ../src\twitter\compose.py:206 +msgid "You've removed from favourites: %s, %s" +msgstr "Has esborrat delsteus favorits: %s, %s" + +#: ../src\twitter\compose.py:207 +msgid "%s(@%s) has removed from favourites: %s" +msgstr "%s(@%s) ha esborrat dels seus favorits: %s" + +#: ../src\twitter\compose.py:209 +msgid "You've created the list %s" +msgstr "Has creat la llista %s" + +#: ../src\twitter\compose.py:211 +msgid "You've deleted the list %s" +msgstr "Has esborrat la llista %s" + +#: ../src\twitter\compose.py:213 +msgid "You've updated the list %s" +msgstr "Has actualitzat la lista %s" + +#: ../src\twitter\compose.py:215 +msgid "You've added %s(@%s) to the list %s" +msgstr "Has afegit a %s(@%s) a la llista %s" + +#: ../src\twitter\compose.py:216 +msgid "%s(@%s) has added you to the list %s" +msgstr "%s(@%s) t'a afegit a la llista %s" + +#: ../src\twitter\compose.py:218 +msgid "You'be removed %s(@%s) from the list %s" +msgstr "Has esborrat a %s(@%s) de la llista %s" + +#: ../src\twitter\compose.py:219 +msgid "%s(@%s) has removed you from the list %s" +msgstr "%s(@%s) t'ha eliminat de la llista %s" + +#: ../src\twitter\compose.py:221 +msgid "You've subscribed to the list %s, which is owned by %s(@%s)" +msgstr "T'has subscrit a la llista %s, propietat de %s(@%s)" + +#: ../src\twitter\compose.py:222 +msgid "%s(@%s) has suscribed you to the list %s" +msgstr "%s(@%s) t'ha subscrit a la llista %s" + +#: ../src\twitter\compose.py:224 +msgid "You've unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "T'has donat de baixa de la llista %s, propietat de %s(@%s)" + +#: ../src\twitter\compose.py:225 +msgid "You've been unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "Has sigut donat de baixa de la llista %s, propietat de %s(@%s)" + +#: ../src\twitter\compose.py:226 +msgid "Unknown" +msgstr "Desconegut" + +#: ../src\twitter\compose.py:232 +msgid "No description available" +msgstr "No hi ha descripció disponible" + +#: ../src\twitter\compose.py:236 +msgid "private" +msgstr "Privat" + +#: ../src\twitter\compose.py:237 +msgid "public" +msgstr "Públic" + +#: ../src\twitter\twitter.py:73 +msgid "%s failed. Reason: %s" +msgstr "%s ha fallat. Raó: %s" + +#: ../src\twitter\twitter.py:80 +msgid "%s succeeded." +msgstr "%s amb èxit" + +#: ../src\updater\update_manager.py:14 +msgid "Your TW Blue version is up to date" +msgstr "La teva versió de TWBlue està actualitzada" + +#: ../src\updater\update_manager.py:14 ../src\updater\update_manager.py:27 +msgid "Update" +msgstr "Actualitzat" + +#: ../src\updater\update_manager.py:20 +msgid "New version for %s" +msgstr "Nova versió de %s" + +#: ../src\updater\update_manager.py:20 +msgid "" +"There's a new TW Blue version available. Would you like to download it now?" +msgstr "" +"Hi ha una nova versió de TW Blue disponible. T'agradaria descarregar'la?" + +#: ../src\updater\update_manager.py:22 +msgid "Download in Progress" +msgstr "Descàrrega en progrés" + +#: ../src\updater\update_manager.py:22 +msgid "Downloading the new version..." +msgstr "Descarregant la nova versió" + +#: ../src\updater\update_manager.py:29 +msgid "Done!" +msgstr "Fet!" + +#: ../src\updater\update_manager.py:29 +msgid "" +"The new TW Blue version has been downloaded and installed. Press OK to start " +"the application." +msgstr "" +"La nova versió de TW Blue s'ha descarregat i instal·lat amb èxit. Prem " +"acceptar per iniciar l'aplicació." + +#~ msgid "Tweet - %i characters" +#~ msgstr "Tuit - %i caràcters" + +#~ msgid "%A, %B %d, %Y at %I:%M:%S %p" +#~ msgstr "%A, %d de %B del %Y a les %I:%M:%S %p" + +#~ msgid "View members" +#~ msgstr "¿¿¿Veure membres" + +#~ msgid "View subscribers" +#~ msgstr "Veure subscriptors" + +#~ msgid "Mention to %s" +#~ msgstr "Mencionar a %s" + +#~ msgid "Ouner" +#~ msgstr "propietari" + +#~ msgid "Successfully following %s" +#~ msgstr "Èxit seguint a %s" + +#~ msgid "%s has been reported as spam" +#~ msgstr "%s ha sigut reportat com spam" + +#~ msgid "%s has been blocked" +#~ msgstr "%s ha sigut bloquejat" + +#~ msgid "User's information" +#~ msgstr "Detalls de l'usuari" + +#~ msgid "You've unblock %s" +#~ msgstr "Has desbloquejat a %s" + +#~ msgid "Clear" +#~ msgstr "Limpiar" diff --git a/src/locales/es/LC_MESSAGES/twblue.mo b/src/locales/es/LC_MESSAGES/twblue.mo new file mode 100644 index 00000000..a4bb7071 Binary files /dev/null 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 new file mode 100644 index 00000000..b6b98a46 --- /dev/null +++ b/src/locales/es/LC_MESSAGES/twblue.po @@ -0,0 +1,2614 @@ +msgid "" +msgstr "" +"Project-Id-Version: TW Blue 0.44\n" +"POT-Creation-Date: 2014-10-13 09:35+Hora de verano central (México)\n" +"PO-Revision-Date: 2014-10-13 09:45-0600\n" +"Last-Translator: Manuel Cortéz \n" +"Language-Team: Manuel Cortez \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.6.7\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" + +#: ../src\extra\AudioUploader\gui.py:31 ../src\gui\dialogs\message.py:169 +#: ../src\gui\dialogs\message.py:257 +msgid "Attach audio" +msgstr "Adjuntar audio" + +#: ../src\extra\AudioUploader\gui.py:38 ../src\extra\AudioUploader\gui.py:146 +#: ../src\extra\AudioUploader\gui.py:156 +msgid "Play" +msgstr "Reproducir" + +#: ../src\extra\AudioUploader\gui.py:41 ../src\extra\AudioUploader\gui.py:75 +#: ../src\extra\AudioUploader\gui.py:80 ../src\extra\AudioUploader\gui.py:107 +msgid "Pause" +msgstr "Pausa" + +#: ../src\extra\AudioUploader\gui.py:44 ../src\extra\AudioUploader\gui.py:103 +msgid "Record" +msgstr "Grabar" + +#: ../src\extra\AudioUploader\gui.py:47 +msgid "Add an existing file" +msgstr "Añadir un archivo existente" + +#: ../src\extra\AudioUploader\gui.py:49 +msgid "Discard" +msgstr "Descartar" + +#: ../src\extra\AudioUploader\gui.py:52 +msgid "Upload to" +msgstr "Subir a" + +#: ../src\extra\AudioUploader\gui.py:57 +msgid "Attach" +msgstr "Adjuntar" + +#: ../src\extra\AudioUploader\gui.py:59 ../src\issueReporter\gui.py:88 +msgid "Cancel" +msgstr "Cancelar" + +#: ../src\extra\AudioUploader\gui.py:77 ../src\extra\AudioUploader\gui.py:78 +msgid "Resume" +msgstr "Reanudar" + +#: ../src\extra\AudioUploader\gui.py:95 +msgid "Stop recording" +msgstr "Detener grabación" + +#: ../src\extra\AudioUploader\gui.py:96 +msgid "Recording" +msgstr "Grabando" + +#: ../src\extra\AudioUploader\gui.py:101 ../src\extra\AudioUploader\gui.py:153 +msgid "Stopped" +msgstr "Stopped" + +#: ../src\extra\AudioUploader\gui.py:128 ../src\gui\dialogs\message.py:218 +#: ../src\gui\dialogs\update_profile.py:87 +msgid "Discarded" +msgstr "Descartado" + +#: ../src\extra\AudioUploader\gui.py:138 ../src\gui\buffers\base.py:339 +#: ../src\gui\buffers\base.py:351 +msgid "Playing..." +msgstr "Reproduciendo..." + +#: ../src\extra\AudioUploader\gui.py:142 +msgid "Stop" +msgstr "Detener" + +#: ../src\extra\AudioUploader\gui.py:161 +msgid "Recoding audio..." +msgstr "Recodificando audio..." + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Audio Files (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" +msgstr "Archivos de audio (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Select the audio file to be uploaded" +msgstr "Selecciona el archivo de audio que deseas subir" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:15 +msgid "File" +msgstr "Archivo" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:21 +msgid "Transferred" +msgstr "Transferido" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:26 +msgid "Total file size" +msgstr "Tamaño total del archivo" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:31 +msgid "Transfer rate" +msgstr "Velocidad de transferencia" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:36 +msgid "Time left" +msgstr "Tiempo restante" + +#: ../src\extra\AudioUploader\utils.py:27 +msgid "%d day, " +msgstr "%d día, " + +#: ../src\extra\AudioUploader\utils.py:29 +msgid "%d days, " +msgstr "%d días, " + +#: ../src\extra\AudioUploader\utils.py:31 +msgid "%d hour, " +msgstr "%d hora, " + +#: ../src\extra\AudioUploader\utils.py:33 +msgid "%d hours, " +msgstr "%d horas, " + +#: ../src\extra\AudioUploader\utils.py:35 +msgid "%d minute, " +msgstr "%d minuto, " + +#: ../src\extra\AudioUploader\utils.py:37 +msgid "%d minutes, " +msgstr "%d minutos, " + +#: ../src\extra\AudioUploader\utils.py:39 +msgid "%s second" +msgstr "%s segundo" + +#: ../src\extra\AudioUploader\utils.py:41 +msgid "%s seconds" +msgstr "%s segundos" + +#: ../src\extra\SoundsTutorial\gui.py:11 +msgid "The tweet may contain a playable audio" +msgstr "El tuit puede contener un audio reproducible" + +#: ../src\extra\SoundsTutorial\gui.py:12 +msgid "A timeline has been created" +msgstr "Una línea temporal ha sido creada" + +#: ../src\extra\SoundsTutorial\gui.py:13 +msgid "A timeline has been deleted" +msgstr "Una línea temporal se ha eliminado" + +#: ../src\extra\SoundsTutorial\gui.py:14 +msgid "You've received a direct message" +msgstr "Has recivido un mensaje directo" + +#: ../src\extra\SoundsTutorial\gui.py:15 +msgid "You've sent a direct message" +msgstr "Has enviado un mensaje directo" + +#: ../src\extra\SoundsTutorial\gui.py:16 +msgid "A bug has happened" +msgstr "Ha ocurrido un error" + +#: ../src\extra\SoundsTutorial\gui.py:17 +msgid "You've added a tweet to your favourites" +msgstr "Has marcado un tuit como favorito" + +#: ../src\extra\SoundsTutorial\gui.py:18 +msgid "Someone's favourites have been updated" +msgstr "Los favoritos de alguien se han actualizado" + +#: ../src\extra\SoundsTutorial\gui.py:19 +msgid "There are no more tweets to read" +msgstr "No hay más tuits por leer" + +#: ../src\extra\SoundsTutorial\gui.py:20 +msgid "A list has a new tweet" +msgstr "Una lista tiene un nuevo tuit" + +#: ../src\extra\SoundsTutorial\gui.py:21 +msgid "You can't add any more characters on the tweet" +msgstr "No puedes añadir más caracteres al tit" + +#: ../src\extra\SoundsTutorial\gui.py:22 +msgid "You've been mentioned " +msgstr "Has sido mencionado" + +#: ../src\extra\SoundsTutorial\gui.py:23 +msgid "A new event has happened" +msgstr "Ha ocurrido un nuevo evento" + +#: ../src\extra\SoundsTutorial\gui.py:24 +msgid "TW Blue is ready " +msgstr "TW Blue está listo" + +#: ../src\extra\SoundsTutorial\gui.py:25 +msgid "You've replied" +msgstr "Has enviado una respuesta" + +#: ../src\extra\SoundsTutorial\gui.py:26 +msgid "You've retweeted" +msgstr "Has hecho un retuit" + +#: ../src\extra\SoundsTutorial\gui.py:27 +msgid "A search has been updated" +msgstr "Una búsqueda se ha actualizado" + +#: ../src\extra\SoundsTutorial\gui.py:28 +msgid "There's a new tweet in the main buffer" +msgstr "Hay un nuevo tuit en el buffer principal" + +#: ../src\extra\SoundsTutorial\gui.py:29 +msgid "You've sent a tweet" +msgstr "Has enviado un tuit" + +#: ../src\extra\SoundsTutorial\gui.py:30 +msgid "There's a new tweet in a timeline" +msgstr "Hay un nuevo tuit en una línea temporal" + +#: ../src\extra\SoundsTutorial\gui.py:31 +msgid "You have a new follower" +msgstr "Tienes un nuevo seguidor" + +#: ../src\extra\SoundsTutorial\gui.py:32 +msgid "You've turned the volume up or down" +msgstr "Has subido o bajado el volumen" + +#: ../src\extra\SoundsTutorial\gui.py:36 +msgid "" +"It seems as though the currently used sound pack needs an update. %i fails " +"are still be required to use this function. Make sure to obtain the needed " +"lacking sounds or to contact with the sound pack developer." +msgstr "" +"Parece que el paquete de sonidos que estás utilizando necesita ser " +"actualizado. Faltan %i archivos para poder utilizar esta función. Asegúrate " +"de completar los sonidos restantes o de ponerte en contacto con el creador " +"del paquete." + +#: ../src\extra\SoundsTutorial\gui.py:36 ../src\extra\SpellChecker\gui.py:34 +#: ../src\gui\dialogs\show_user.py:63 ../src\gui\main.py:680 +#: ../src\gui\main.py:712 ../src\issueReporter\gui.py:98 +#: ../src\issueReporter\gui.py:101 +msgid "Error" +msgstr "Error" + +#: ../src\extra\SoundsTutorial\gui.py:38 +msgid "Sounds tutorial" +msgstr "Tutorial de sonidos" + +#: ../src\extra\SoundsTutorial\gui.py:41 +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\gui.py:34 +msgid "" +"A bug has happened. There are no dictionaries available for the selected " +"language in TW Blue" +msgstr "" +"Ha ocurrido un error. No se encuentran diccionarios disponibles para el " +"idioma seleccionado en TW Blue." + +#: ../src\extra\SpellChecker\gui.py:38 +msgid "Mis-spelled word" +msgstr "Palabra mal escrita" + +#: ../src\extra\SpellChecker\gui.py:43 +msgid "Context" +msgstr "Contexto" + +#: ../src\extra\SpellChecker\gui.py:48 +msgid "Suggestions" +msgstr "Sugerencias" + +#: ../src\extra\SpellChecker\gui.py:53 +msgid "Ignore" +msgstr "Ignorar" + +#: ../src\extra\SpellChecker\gui.py:55 +msgid "Ignore all" +msgstr "Ignorar todo" + +#: ../src\extra\SpellChecker\gui.py:57 +msgid "Replace" +msgstr "Reemplazar" + +#: ../src\extra\SpellChecker\gui.py:59 +msgid "Replace all" +msgstr "Reemplazar todo" + +#: ../src\extra\SpellChecker\gui.py:78 +msgid "Mis-spelled word: %s" +msgstr "Palabra mal escrita: %s" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "Finished" +msgstr "Finalizado" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "The spelling review has finished." +msgstr "La revisión ortográfica ha finalizado." + +#: ../src\extra\translator\gui.py:24 ../src\gui\dialogs\message.py:177 +#: ../src\gui\dialogs\message.py:265 ../src\gui\dialogs\message.py:351 +msgid "Translate message" +msgstr "Traducir mensaje" + +#: ../src\extra\translator\gui.py:27 +msgid "Source language" +msgstr "Idioma de origen" + +#: ../src\extra\translator\gui.py:30 +msgid "Target language" +msgstr "Idioma de destino" + +#: ../src\extra\translator\translator.py:53 +msgid "Afrikaans" +msgstr "Africano" + +#: ../src\extra\translator\translator.py:54 +msgid "Albanian" +msgstr "Albanés" + +#: ../src\extra\translator\translator.py:55 +msgid "Amharic" +msgstr "Amárico" + +#: ../src\extra\translator\translator.py:56 +msgid "Arabic" +msgstr "Árabe" + +#: ../src\extra\translator\translator.py:57 +msgid "Armenian" +msgstr "Armenio" + +#: ../src\extra\translator\translator.py:58 +msgid "Azerbaijani" +msgstr "Acerí" + +#: ../src\extra\translator\translator.py:59 +msgid "Basque" +msgstr "Vasco" + +#: ../src\extra\translator\translator.py:60 +msgid "Belarusian" +msgstr "Bielorruso" + +#: ../src\extra\translator\translator.py:61 +msgid "Bengali" +msgstr "Bengalí" + +#: ../src\extra\translator\translator.py:62 +msgid "Bihari" +msgstr "Bihari" + +#: ../src\extra\translator\translator.py:63 +msgid "Bulgarian" +msgstr "Búlgaro" + +#: ../src\extra\translator\translator.py:64 +msgid "Burmese" +msgstr "Birmano" + +#: ../src\extra\translator\translator.py:65 +msgid "Catalan" +msgstr "Catalán" + +#: ../src\extra\translator\translator.py:66 +msgid "Cherokee" +msgstr "Cheroqui" + +#: ../src\extra\translator\translator.py:67 +msgid "Chinese" +msgstr "Chino" + +#: ../src\extra\translator\translator.py:68 +msgid "Chinese_simplified" +msgstr "Chino simplificado" + +#: ../src\extra\translator\translator.py:69 +msgid "Chinese_traditional" +msgstr "Chino tradicional" + +#: ../src\extra\translator\translator.py:70 +msgid "Croatian" +msgstr "Croata" + +#: ../src\extra\translator\translator.py:71 +msgid "Czech" +msgstr "Checo" + +#: ../src\extra\translator\translator.py:72 +msgid "Danish" +msgstr "Danés" + +#: ../src\extra\translator\translator.py:73 +msgid "Dhivehi" +msgstr "Dhivehi" + +#: ../src\extra\translator\translator.py:74 +msgid "Dutch" +msgstr "Holandés" + +#: ../src\extra\translator\translator.py:75 +msgid "English" +msgstr "Inglés" + +#: ../src\extra\translator\translator.py:76 +msgid "Esperanto" +msgstr "Esperanto" + +#: ../src\extra\translator\translator.py:77 +msgid "Estonian" +msgstr "Estonio" + +#: ../src\extra\translator\translator.py:78 +msgid "Filipino" +msgstr "Filipino" + +#: ../src\extra\translator\translator.py:79 +msgid "Finnish" +msgstr "Finés" + +#: ../src\extra\translator\translator.py:80 +msgid "French" +msgstr "Francés" + +#: ../src\extra\translator\translator.py:81 +msgid "Galician" +msgstr "Gallego" + +#: ../src\extra\translator\translator.py:82 +msgid "Georgian" +msgstr "Georgiano" + +#: ../src\extra\translator\translator.py:83 +msgid "German" +msgstr "Alemán" + +#: ../src\extra\translator\translator.py:84 +msgid "Greek" +msgstr "Griego" + +#: ../src\extra\translator\translator.py:85 +msgid "Guarani" +msgstr "Guaraní" + +#: ../src\extra\translator\translator.py:86 +msgid "Gujarati" +msgstr "Guyaratí" + +#: ../src\extra\translator\translator.py:87 +msgid "Hebrew" +msgstr "Hebreo" + +#: ../src\extra\translator\translator.py:88 +msgid "Hindi" +msgstr "Hindi" + +#: ../src\extra\translator\translator.py:89 +msgid "Hungarian" +msgstr "Húngaro" + +#: ../src\extra\translator\translator.py:90 +msgid "Icelandic" +msgstr "Islandés" + +#: ../src\extra\translator\translator.py:91 +msgid "Indonesian" +msgstr "Indonesio" + +#: ../src\extra\translator\translator.py:92 +msgid "Inuktitut" +msgstr "Inuktitut" + +#: ../src\extra\translator\translator.py:93 +msgid "Irish" +msgstr "Irlandés" + +#: ../src\extra\translator\translator.py:94 +msgid "Italian" +msgstr "Italiano" + +#: ../src\extra\translator\translator.py:95 +msgid "Japanese" +msgstr "Japonés" + +#: ../src\extra\translator\translator.py:96 +msgid "Kannada" +msgstr "Canarés" + +#: ../src\extra\translator\translator.py:97 +msgid "Kazakh" +msgstr "Kazajo" + +#: ../src\extra\translator\translator.py:98 +msgid "Khmer" +msgstr "Camboyano" + +#: ../src\extra\translator\translator.py:99 +msgid "Korean" +msgstr "Coreano" + +#: ../src\extra\translator\translator.py:100 +msgid "Kurdish" +msgstr "Kurdo" + +#: ../src\extra\translator\translator.py:101 +msgid "Kyrgyz" +msgstr "Kirguís" + +#: ../src\extra\translator\translator.py:102 +msgid "Laothian" +msgstr "Lao" + +#: ../src\extra\translator\translator.py:103 +msgid "Latvian" +msgstr "Letón" + +#: ../src\extra\translator\translator.py:104 +msgid "Lithuanian" +msgstr "Lituano" + +#: ../src\extra\translator\translator.py:105 +msgid "Macedonian" +msgstr "Macedonio" + +#: ../src\extra\translator\translator.py:106 +msgid "Malay" +msgstr "Malayo" + +#: ../src\extra\translator\translator.py:107 +msgid "Malayalam" +msgstr "Malayalam" + +#: ../src\extra\translator\translator.py:108 +msgid "Maltese" +msgstr "Maltés" + +#: ../src\extra\translator\translator.py:109 +msgid "Marathi" +msgstr "Maratí" + +#: ../src\extra\translator\translator.py:110 +msgid "Mongolian" +msgstr "Mongol" + +#: ../src\extra\translator\translator.py:111 +msgid "Nepali" +msgstr "Nepalí" + +#: ../src\extra\translator\translator.py:112 +msgid "Norwegian" +msgstr "Noruego" + +#: ../src\extra\translator\translator.py:113 +msgid "Oriya" +msgstr "Oriya" + +#: ../src\extra\translator\translator.py:114 +msgid "Pashto" +msgstr "Pastú" + +#: ../src\extra\translator\translator.py:115 +msgid "Persian" +msgstr "Persa" + +#: ../src\extra\translator\translator.py:116 +msgid "Polish" +msgstr "Polaco" + +#: ../src\extra\translator\translator.py:117 +msgid "Portuguese" +msgstr "Portugués" + +#: ../src\extra\translator\translator.py:118 +msgid "Punjabi" +msgstr "Panyabí" + +#: ../src\extra\translator\translator.py:119 +msgid "Romanian" +msgstr "Rumano" + +#: ../src\extra\translator\translator.py:120 +msgid "Russian" +msgstr "Ruso" + +#: ../src\extra\translator\translator.py:121 +msgid "Sanskrit" +msgstr "Sánscrito" + +#: ../src\extra\translator\translator.py:122 +msgid "Serbian" +msgstr "Serbio" + +#: ../src\extra\translator\translator.py:123 +msgid "Sindhi" +msgstr "Sindhi" + +#: ../src\extra\translator\translator.py:124 +msgid "Sinhalese" +msgstr "Cingalés" + +#: ../src\extra\translator\translator.py:125 +msgid "Slovak" +msgstr "Eslovaco" + +#: ../src\extra\translator\translator.py:126 +msgid "Slovenian" +msgstr "Esloveno" + +#: ../src\extra\translator\translator.py:127 +msgid "Spanish" +msgstr "Español" + +#: ../src\extra\translator\translator.py:128 +msgid "Swahili" +msgstr "Suajili" + +#: ../src\extra\translator\translator.py:129 +msgid "Swedish" +msgstr "Sueco" + +#: ../src\extra\translator\translator.py:130 +msgid "Tajik" +msgstr "Tayiko" + +#: ../src\extra\translator\translator.py:131 +msgid "Tamil" +msgstr "Tamil" + +#: ../src\extra\translator\translator.py:132 +msgid "Tagalog" +msgstr "Tagalo" + +#: ../src\extra\translator\translator.py:133 +msgid "Telugu" +msgstr "Telugú" + +#: ../src\extra\translator\translator.py:134 +msgid "Thai" +msgstr "Tailandés" + +#: ../src\extra\translator\translator.py:135 +msgid "Tibetan" +msgstr "Tibetano" + +#: ../src\extra\translator\translator.py:136 +msgid "Turkish" +msgstr "Turco" + +#: ../src\extra\translator\translator.py:137 +msgid "Ukrainian" +msgstr "Ucraniano" + +#: ../src\extra\translator\translator.py:138 +msgid "Urdu" +msgstr "Urdu" + +#: ../src\extra\translator\translator.py:139 +msgid "Uzbek" +msgstr "Uzbeco" + +#: ../src\extra\translator\translator.py:140 +msgid "Uighur" +msgstr "Uigur" + +#: ../src\extra\translator\translator.py:141 +msgid "Vietnamese" +msgstr "Vietnamita" + +#: ../src\extra\translator\translator.py:142 +msgid "Welsh" +msgstr "Galés" + +#: ../src\extra\translator\translator.py:143 +msgid "Yiddish" +msgstr "Yídish" + +#: ../src\extra\translator\translator.py:150 +msgid "autodetect" +msgstr "Autodetectar" + +#: ../src\gui\buffers\base.py:55 +msgid "Client" +msgstr "Cliente" + +#: ../src\gui\buffers\base.py:55 +msgid "Text" +msgstr "Texto" + +#: ../src\gui\buffers\base.py:55 ../src\gui\buffers\events.py:61 +msgid "Date" +msgstr "Fecha" + +#: ../src\gui\buffers\base.py:55 ../src\gui\buffers\people.py:41 +#: ../src\gui\buffers\user_searches.py:31 ../src\gui\dialogs\utils.py:36 +msgid "User" +msgstr "Usuario" + +#: ../src\gui\buffers\base.py:80 ../src\gui\buffers\base.py:228 +#: ../src\gui\buffers\events.py:62 ../src\gui\buffers\events.py:78 +#: ../src\gui\dialogs\message.py:333 ../src\gui\sysTrayIcon.py:34 +msgid "Tweet" +msgstr "Tuit" + +#: ../src\gui\buffers\base.py:82 ../src\gui\buffers\base.py:240 +#: ../src\keystrokeEditor\constants.py:13 +msgid "Retweet" +msgstr "Retuit" + +#: ../src\gui\buffers\base.py:84 +msgid "Reply" +msgstr "Responder" + +#: ../src\gui\buffers\base.py:86 +msgid "Direct message" +msgstr "Mensaje directo" + +#: ../src\gui\buffers\base.py:100 +msgid "Do you really want to delete this timeline?" +msgstr "¿Realmente deseas eliminar esta línea temporal?" + +#: ../src\gui\buffers\base.py:100 ../src\gui\buffers\favourites.py:41 +#: ../src\gui\buffers\lists.py:46 ../src\gui\buffers\trends.py:41 +#: ../src\gui\buffers\tweet_searches.py:45 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Attention" +msgstr "Atención" + +#: ../src\gui\buffers\base.py:112 +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\gui\buffers\base.py:196 ../src\gui\buffers\people.py:114 +msgid "%s items retrieved" +msgstr "%s elementos recuperados" + +#: ../src\gui\buffers\base.py:220 ../src\gui\buffers\dm.py:44 +#: ../src\gui\buffers\people.py:56 +msgid "Direct message to %s" +msgstr "Mensaje directo a %s" + +#: ../src\gui\buffers\base.py:228 ../src\gui\buffers\events.py:78 +msgid "Write the tweet here" +msgstr "Escribe el tuit aquí" + +#: ../src\gui\buffers\base.py:240 +msgid "Would you like to add a comment to this tweet?" +msgstr "¿Te gustaría añadir un comentario a este tuit?" + +#: ../src\gui\buffers\base.py:243 +msgid "Add your comment to the tweet" +msgstr "Añade tu comentario al tuit" + +#: ../src\gui\buffers\base.py:259 ../src\gui\buffers\people.py:64 +msgid "Reply to %s" +msgstr "Responder a %s" + +#: ../src\gui\buffers\base.py:304 +msgid "Opening URL..." +msgstr "Abriendo URL..." + +#: ../src\gui\buffers\base.py:321 ../src\gui\buffers\events.py:122 +msgid "" +"Do you really want to empty this buffer? It's tweets will be removed from " +"the list but not from Twitter" +msgstr "" +"¿Realmente quieres vaciar el contenido de este buffer? Los tweets serán " +"eliminados de la lista, pero no de Twitter" + +#: ../src\gui\buffers\base.py:321 ../src\gui\buffers\events.py:122 +msgid "Empty buffer" +msgstr "Vaciar buffer" + +#: ../src\gui\buffers\base.py:326 ../src\gui\buffers\events.py:126 +msgid "Do you really want to delete this message?" +msgstr "¿Realmente quieres eliminar este mensaje?" + +#: ../src\gui\buffers\base.py:326 ../src\gui\buffers\events.py:126 +#: ../src\gui\dialogs\lists.py:107 ../src\gui\main.py:557 +msgid "Delete" +msgstr "Eliminar" + +#: ../src\gui\buffers\base.py:346 ../src\gui\buffers\base.py:357 +msgid "Unable to play audio." +msgstr "Imposible reproducir audio" + +#: ../src\gui\buffers\base.py:348 +msgid "Audio stopped." +msgstr "Audio detenido" + +#: ../src\gui\buffers\events.py:35 ../src\gui\buffers\panels.py:37 +#: ../src\gui\buffers\tweet_searches.py:58 +msgid "This action is not supported for this buffer" +msgstr "Esta acción no se encuentra soportada para este buffer" + +#: ../src\gui\buffers\events.py:44 +msgid "Empty" +msgstr "Vacío" + +#: ../src\gui\buffers\events.py:61 +msgid "Event" +msgstr "Evento" + +#: ../src\gui\buffers\events.py:64 +msgid "Remove event" +msgstr "Eliminar evento" + +#: ../src\gui\buffers\favourites.py:41 +msgid "Do you really want to delete this favourites timeline?" +msgstr "¿Realmente deseas eliminar esta línea temporal de favoritos?" + +#: ../src\gui\buffers\lists.py:46 ../src\gui\dialogs\lists.py:107 +msgid "Do you really want to delete this list?" +msgstr "¿Realmente deseas eliminar esta lista?" + +#: ../src\gui\buffers\panels.py:27 +msgid "Announce" +msgstr "Anuncio" + +#: ../src\gui\buffers\people.py:46 +msgid "Mention" +msgstr "Mención" + +#: ../src\gui\buffers\trends.py:41 ../src\gui\buffers\tweet_searches.py:45 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Do you really want to delete this search term?" +msgstr "¿Realmente deseas eliminar esté término de búsqueda?" + +#: ../src\gui\dialogs\configuration.py:39 +msgid "Language" +msgstr "Idioma" + +#: ../src\gui\dialogs\configuration.py:53 +msgid "Relative times" +msgstr "Tiempos relativos" + +#: ../src\gui\dialogs\configuration.py:57 +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\gui\dialogs\configuration.py:60 +msgid "Activate the auto-start of the invisible interface" +msgstr "Activar el inicio automático de la interfaz invisible" + +#: ../src\gui\dialogs\configuration.py:64 +msgid "" +"API calls when the stream is started (One API call equals to 200 tweetts, " +"two API calls equals 400 tweets, etc):" +msgstr "" +"Llamadas a la API cuando el stream se inicie (una llamada equivale a 200 " +"tuits, 2 a 400 tuits, etc):" + +#: ../src\gui\dialogs\configuration.py:72 +msgid "Items on each API call" +msgstr "Elementos por cada llamada a la API" + +#: ../src\gui\dialogs\configuration.py:79 +msgid "" +"Inverted buffers: The newest tweets will be shown at the beginning of the " +"lists while the oldest at the end" +msgstr "" +"Buffers invertidos: los nuevos tweets se mostrarán al principio de las " +"listas y los viejos al final" + +#: ../src\gui\dialogs\configuration.py:94 +msgid "Show followers" +msgstr "Mostrar seguidores" + +#: ../src\gui\dialogs\configuration.py:97 +msgid "Show friends" +msgstr "Mostrar amigos" + +#: ../src\gui\dialogs\configuration.py:100 +msgid "Show favourites" +msgstr "Mostrar favoritos" + +#: ../src\gui\dialogs\configuration.py:103 +msgid "Show blocked users" +msgstr "Mostrar usuarios bloqueados" + +#: ../src\gui\dialogs\configuration.py:106 +msgid "Show muted users" +msgstr "Mostrar usuarios silenciados" + +#: ../src\gui\dialogs\configuration.py:109 +msgid "Show events" +msgstr "Mostrar eventos" + +#: ../src\gui\dialogs\configuration.py:119 +#: ../src\gui\dialogs\configuration.py:267 +msgid "Ignored clients" +msgstr "Clientes ignorados" + +#: ../src\gui\dialogs\configuration.py:125 +msgid "Add client" +msgstr "Añadir cliente" + +#: ../src\gui\dialogs\configuration.py:126 +msgid "Remove client" +msgstr "Quitar cliente" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Add a new ignored client" +msgstr "Añadir un nuevo clienteClientes ignorados" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Enter the name of the client here" +msgstr "Introduce el nombre del cliente" + +#: ../src\gui\dialogs\configuration.py:154 +msgid "Volume" +msgstr "Volumen" + +#: ../src\gui\dialogs\configuration.py:163 +msgid "Global mute" +msgstr "Silencio global" + +#: ../src\gui\dialogs\configuration.py:167 +msgid "Output device" +msgstr "Dispositivo de salida" + +#: ../src\gui\dialogs\configuration.py:176 +msgid "Input device" +msgstr "Dispositivo de entrada" + +#: ../src\gui\dialogs\configuration.py:187 +msgid "Sound pack" +msgstr "Paquete de sonidos" + +#: ../src\gui\dialogs\configuration.py:200 +msgid "" +"If you've got a SndUp account, enter your API Key here. Whether the API Key " +"is wrong, the App will fail to upload anything to the server. Whether " +"there's no API Key here, then the audio files will be uploaded anonimously" +msgstr "" +"Si tienes cuenta en SndUp, introduce tu API Key aquí. Si el API Key es " +"incorrecto, el programa no podrá subir nada al servicio. Si no hay API Key " +"aquí, los audios se subirán de manera anónima" + +#: ../src\gui\dialogs\configuration.py:213 +#: ../src\gui\dialogs\configuration.py:237 +msgid "Unlink your Dropbox account" +msgstr "Desconectar tu cuenta de Dropbox" + +#: ../src\gui\dialogs\configuration.py:215 +#: ../src\gui\dialogs\configuration.py:232 +#: ../src\gui\dialogs\configuration.py:240 +#: ../src\gui\dialogs\configuration.py:244 +#: ../src\gui\dialogs\configuration.py:251 +msgid "Link your Dropbox account" +msgstr "Conectar tu cuenta de Dropbox" + +#: ../src\gui\dialogs\configuration.py:225 +msgid "" +"The authorisation request will be shown on your browser. Copy the code tat " +"Dropbox will provide and, in the text box that will appear on TW Blue, paste " +"it. This code is necessary to continue. You only need to do it once." +msgstr "" +"Será mostrada la solicitud de autorización en tu navegador web. Copia el " +"código que te proporcionará Dropbox, y pégalo en el cuadro de edición de TW " +"Blue. Este código es necesario para continuar. Solo tienes que hacer esto " +"una vez." + +#: ../src\gui\dialogs\configuration.py:225 ../src\sessionmanager\gui.py:83 +msgid "Authorisation" +msgstr "Autorización" + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Enter the code here." +msgstr "Introduce el código aquí" + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Verification code" +msgstr "Código de verificación" + +#: ../src\gui\dialogs\configuration.py:239 +msgid "Error during authorisation. Try again later." +msgstr "Error durante la autorización. Inténtalo de nuevo más tarde" + +#: ../src\gui\dialogs\configuration.py:239 ../src\gui\main.py:694 +#: ../src\gui\main.py:727 +msgid "Error!" +msgstr "¡Error!" + +#: ../src\gui\dialogs\configuration.py:258 +msgid "TW Blue preferences" +msgstr "Preferencias de TW Blue" + +#: ../src\gui\dialogs\configuration.py:262 ../src\issueReporter\gui.py:30 +msgid "General" +msgstr "General" + +#: ../src\gui\dialogs\configuration.py:265 +msgid "Show other buffers" +msgstr "Mostrar otros buffers" + +#: ../src\gui\dialogs\configuration.py:269 +msgid "Sound" +msgstr "Sonido" + +#: ../src\gui\dialogs\configuration.py:271 +msgid "Audio Services" +msgstr "Servicios de audio" + +#: ../src\gui\dialogs\configuration.py:274 +msgid "Save" +msgstr "Guardar" + +#: ../src\gui\dialogs\configuration.py:277 ../src\gui\dialogs\follow.py:64 +#: ../src\gui\dialogs\message.py:182 ../src\gui\dialogs\message.py:270 +#: ../src\gui\dialogs\message.py:353 ../src\gui\dialogs\search.py:42 +#: ../src\gui\dialogs\show_user.py:42 ../src\gui\dialogs\update_profile.py:56 +#: ../src\gui\dialogs\utils.py:42 ../src\keystrokeEditor\gui.py:26 +msgid "Close" +msgstr "Cerrar" + +#: ../src\gui\dialogs\configuration.py:290 ../src\gui\main.py:263 +msgid "Followers" +msgstr "Seguidores" + +#: ../src\gui\dialogs\configuration.py:304 +msgid "friends" +msgstr "Amigos" + +#: ../src\gui\dialogs\configuration.py:318 +msgid "Favorites" +msgstr "Favoritos" + +#: ../src\gui\dialogs\configuration.py:332 ../src\gui\main.py:281 +msgid "Events" +msgstr "Eventos" + +#: ../src\gui\dialogs\configuration.py:343 ../src\gui\main.py:273 +msgid "Blocked users" +msgstr "Usuarios bloqueados" + +#: ../src\gui\dialogs\configuration.py:357 ../src\gui\main.py:277 +msgid "Muted users" +msgstr "Usuarios silenciados" + +#: ../src\gui\dialogs\configuration.py:416 +msgid "Restart TW Blue" +msgstr "Reiniciar TW Blue" + +#: ../src\gui\dialogs\configuration.py:416 +msgid "" +"The application requires to be restarted to save these changes. Press OK to " +"do it now." +msgstr "" +"Estos cambios reqieren que reinicies la aplicación. Presiona aceptar para " +"hacerlo ahora." + +#: ../src\gui\dialogs\follow.py:33 ../src\gui\dialogs\follow.py:43 +#: ../src\keystrokeEditor\gui.py:17 +msgid "Action" +msgstr "Acción" + +#: ../src\gui\dialogs\follow.py:44 +msgid "Follow" +msgstr "Seguir" + +#: ../src\gui\dialogs\follow.py:45 +msgid "Unfollow" +msgstr "Dejar de seguir" + +#: ../src\gui\dialogs\follow.py:46 +msgid "Mute" +msgstr "Silenciar" + +#: ../src\gui\dialogs\follow.py:47 +msgid "Unmute" +msgstr "Desactivar silencio" + +#: ../src\gui\dialogs\follow.py:48 +msgid "Block" +msgstr "Bloquear" + +#: ../src\gui\dialogs\follow.py:49 +msgid "Unblock" +msgstr "desbloquear" + +#: ../src\gui\dialogs\follow.py:50 +msgid "Report as spam" +msgstr "Reportar como spam" + +#: ../src\gui\dialogs\follow.py:61 ../src\gui\dialogs\search.py:40 +#: ../src\gui\dialogs\utils.py:39 ../src\keystrokeEditor\gui.py:76 +msgid "OK" +msgstr "Aceptar" + +#: ../src\gui\dialogs\follow.py:101 +msgid "You've muted to %s" +msgstr "Has silenciado a %s" + +#: ../src\gui\dialogs\follow.py:115 +msgid "You've unmuted to %s" +msgstr "Has desactivado el silencio para %s" + +#: ../src\gui\dialogs\lists.py:36 +msgid "Lists manager" +msgstr "Gestor de listas" + +#: ../src\gui\dialogs\lists.py:38 ../src\gui\main.py:297 +msgid "Lists" +msgstr "Listas" + +#: ../src\gui\dialogs\lists.py:39 +msgid "List" +msgstr "Lista" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Members" +msgstr "Miembros" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Owner" +msgstr "propietario" + +#: ../src\gui\dialogs\lists.py:39 +msgid "mode" +msgstr "Modo" + +#: ../src\gui\dialogs\lists.py:39 ../src\gui\dialogs\lists.py:181 +msgid "Description" +msgstr "Descripción" + +#: ../src\gui\dialogs\lists.py:44 ../src\gui\dialogs\lists.py:173 +msgid "Create a new list" +msgstr "Crear nueva lista" + +#: ../src\gui\dialogs\lists.py:46 ../src\keystrokeEditor\gui.py:22 +msgid "Edit" +msgstr "Editar" + +#: ../src\gui\dialogs\lists.py:48 ../src\gui\dialogs\lists.py:235 +msgid "Remove" +msgstr "Borrar" + +#: ../src\gui\dialogs\lists.py:50 +msgid "Open in buffer" +msgstr "Abrir en buffer" + +#: ../src\gui\dialogs\lists.py:125 +msgid "List opened" +msgstr "Lista abierta" + +#: ../src\gui\dialogs\lists.py:127 +msgid "This list is arready opened." +msgstr "Esta lista ya está abierta." + +#: ../src\gui\dialogs\lists.py:130 ../src\gui\main.py:300 +msgid "List for %s" +msgstr "Lista %s" + +#: ../src\gui\dialogs\lists.py:148 +msgid "Viewing lists for %s" +msgstr "Viendo las listas de %s" + +#: ../src\gui\dialogs\lists.py:149 +msgid "Subscribe" +msgstr "Darte de alta" + +#: ../src\gui\dialogs\lists.py:150 +msgid "Unsubscribe" +msgstr "Darse de baja" + +#: ../src\gui\dialogs\lists.py:176 +msgid "Name (20 characters maximun)" +msgstr "Nombre (máximo 20 caracteres)" + +#: ../src\gui\dialogs\lists.py:186 +msgid "Mode" +msgstr "Modo" + +#: ../src\gui\dialogs\lists.py:187 +msgid "Public" +msgstr "Público" + +#: ../src\gui\dialogs\lists.py:188 +msgid "Private" +msgstr "Privado" + +#: ../src\gui\dialogs\lists.py:208 +msgid "Editing the list %s" +msgstr "Editando la lista %s" + +#: ../src\gui\dialogs\lists.py:219 +msgid "Select a list to add the user" +msgstr "Selecciona una lista para añadir al usuario" + +#: ../src\gui\dialogs\lists.py:220 +msgid "Add" +msgstr "Añadir" + +#: ../src\gui\dialogs\lists.py:234 +msgid "Select a list to remove the user" +msgstr "Selecciona una lista para quitar al usuario" + +#: ../src\gui\dialogs\message.py:42 ../src\keystrokeEditor\constants.py:11 +msgid "New tweet" +msgstr "Nuevo tuit" + +#: ../src\gui\dialogs\message.py:76 +msgid "Attaching..." +msgstr "Adjuntando..." + +#: ../src\gui\dialogs\message.py:77 +msgid "Uploading..." +msgstr "Subiendo..." + +#: ../src\gui\dialogs\message.py:96 +msgid "Unable to upload the audio" +msgstr "Imposible subir el audio" + +#: ../src\gui\dialogs\message.py:110 ../src\gui\dialogs\message.py:396 +msgid "Translated" +msgstr "Traducido" + +#: ../src\gui\dialogs\message.py:122 +msgid "There's no URL to be shortened" +msgstr "No hay ninguna URL para acortar" + +#: ../src\gui\dialogs\message.py:125 +msgid "URL shortened" +msgstr "URL Acortada" + +#: ../src\gui\dialogs\message.py:133 ../src\gui\dialogs\message.py:408 +msgid "There's no URL to be expanded" +msgstr "No hay ninguna URL para expandir" + +#: ../src\gui\dialogs\message.py:136 ../src\gui\dialogs\message.py:411 +msgid "URL expanded" +msgstr "URL expandida" + +#: ../src\gui\dialogs\message.py:164 ../src\gui\dialogs\message.py:219 +#: ../src\gui\dialogs\update_profile.py:51 +#: ../src\gui\dialogs\update_profile.py:88 +msgid "Upload a picture" +msgstr "Subir una foto" + +#: ../src\gui\dialogs\message.py:167 ../src\gui\dialogs\message.py:255 +#: ../src\gui\dialogs\message.py:346 +msgid "Spelling correction" +msgstr "Corrección ortográfica" + +#: ../src\gui\dialogs\message.py:171 ../src\gui\dialogs\message.py:259 +msgid "Shorten URL" +msgstr "Acortar URL" + +#: ../src\gui\dialogs\message.py:173 ../src\gui\dialogs\message.py:261 +#: ../src\gui\dialogs\message.py:348 +msgid "Expand URL" +msgstr "Expandir URL" + +#: ../src\gui\dialogs\message.py:179 ../src\gui\dialogs\message.py:267 +msgid "Send" +msgstr "Enviar" + +#: ../src\gui\dialogs\message.py:215 ../src\gui\dialogs\message.py:226 +#: ../src\gui\dialogs\update_profile.py:84 +#: ../src\gui\dialogs\update_profile.py:95 +msgid "Discard image" +msgstr "Descartar foto" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" +msgstr "Archivos de imagen (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Select the picture to be uploaded" +msgstr "Selecciona una foto para subir" + +#: ../src\gui\dialogs\message.py:249 +msgid "Recipient" +msgstr "Destinatario" + +#: ../src\gui\dialogs\message.py:304 +msgid "Mention to all" +msgstr "Mencionar a todos" + +#: ../src\gui\dialogs\message.py:331 +msgid "Tweet - %i characters " +msgstr "Tuit - %i caracteres" + +#: ../src\gui\dialogs\search.py:26 +msgid "Search on Twitter" +msgstr "Buscar en Twitter" + +#: ../src\gui\dialogs\search.py:27 +msgid "Search" +msgstr "Buscar" + +#: ../src\gui\dialogs\search.py:34 +msgid "Tweets" +msgstr "Tuits" + +#: ../src\gui\dialogs\search.py:35 +msgid "Users" +msgstr "Usuarios" + +#: ../src\gui\dialogs\show_user.py:26 +msgid "Information for %s" +msgstr "Detalles para %s" + +#: ../src\gui\dialogs\show_user.py:30 +msgid "Details" +msgstr "Detalles" + +#: ../src\gui\dialogs\show_user.py:39 +msgid "Go to URL" +msgstr "Ir a URL" + +#: ../src\gui\dialogs\show_user.py:63 +msgid "This user does not exist on Twitter" +msgstr "No existe ese usuario en Twitter" + +#: ../src\gui\dialogs\show_user.py:68 +msgid "Username: @%s\n" +msgstr "Nombre de usuario: @%s\n" + +#: ../src\gui\dialogs\show_user.py:69 +msgid "Name: %s\n" +msgstr "Nombre: %s\n" + +#: ../src\gui\dialogs\show_user.py:71 +msgid "Location: %s\n" +msgstr "Ubicación: %s\n" + +#: ../src\gui\dialogs\show_user.py:73 +msgid "URL: %s\n" +msgstr "URL: %s\n" + +#: ../src\gui\dialogs\show_user.py:76 +msgid "Bio: %s\n" +msgstr "Descripción: %s\n" + +#: ../src\gui\dialogs\show_user.py:77 +msgid "Yes" +msgstr "Sí" + +#: ../src\gui\dialogs\show_user.py:78 +msgid "No" +msgstr "No" + +#: ../src\gui\dialogs\show_user.py:79 +msgid "Protected: %s\n" +msgstr "Protegido: %s\n" + +#: ../src\gui\dialogs\show_user.py:80 +msgid "" +"Followers: %s\n" +" Friends: %s\n" +msgstr "" +"Seguidores: %s\n" +" Amigos: %s\n" + +#: ../src\gui\dialogs\show_user.py:81 +msgid "Tweets: %s\n" +msgstr "Tuits: %s\n" + +#: ../src\gui\dialogs\show_user.py:82 +msgid "Favourites: %s" +msgstr "Favoritos: %s" + +#: ../src\gui\dialogs\update_profile.py:27 +msgid "Update your profile" +msgstr "Actualizar tu perfil" + +#: ../src\gui\dialogs\update_profile.py:29 +msgid "Name (20 characters maximum)" +msgstr "Nombre (máximo 20 caracteres)" + +#: ../src\gui\dialogs\update_profile.py:35 +msgid "Location" +msgstr "Ubicación" + +#: ../src\gui\dialogs\update_profile.py:40 +msgid "Website" +msgstr "Sitio web" + +#: ../src\gui\dialogs\update_profile.py:45 +msgid "Bio (160 characters maximum)" +msgstr "Descripción (máximo 160 caracteres)" + +#: ../src\gui\dialogs\update_profile.py:53 ../src\gui\sysTrayIcon.py:38 +msgid "Update profile" +msgstr "Actualizar perfil" + +#: ../src\gui\dialogs\urlList.py:26 +msgid "Select an URL" +msgstr "Selecciona una URL" + +#: ../src\gui\main.py:60 +msgid "&Update profile" +msgstr "Actuali&zar perfil" + +#: ../src\gui\main.py:62 +msgid "&Hide window" +msgstr "Esconder &ventana" + +#: ../src\gui\main.py:64 +msgid "&Search" +msgstr "&Buscar" + +#: ../src\gui\main.py:66 +msgid "&Lists manager" +msgstr "Gestor de &listas" + +#: ../src\gui\main.py:68 +msgid "Sounds &tutorial" +msgstr "Tutorial de &sonidos" + +#: ../src\gui\main.py:70 +msgid "&Edit keystrokes" +msgstr "Editar combinaciones de &teclas" + +#: ../src\gui\main.py:72 +msgid "&Preferences" +msgstr "&Preferencias" + +#: ../src\gui\main.py:74 +msgid "E&xit" +msgstr "S&alir" + +#: ../src\gui\main.py:79 ../src\gui\main.py:153 +msgid "&Tweet" +msgstr "&Tuit" + +#: ../src\gui\main.py:81 +msgid "Re&ply" +msgstr "Res&ponder" + +#: ../src\gui\main.py:83 +msgid "&Retweet" +msgstr "&Retuit" + +#: ../src\gui\main.py:85 +msgid "Add to &favourites" +msgstr "&Marcar como favorito" + +#: ../src\gui\main.py:87 +msgid "Remove from favo&urites" +msgstr "&Quitar de favoritos" + +#: ../src\gui\main.py:89 +msgid "&Show tweet" +msgstr "&Ver tuit" + +#: ../src\gui\main.py:91 +msgid "&Delete" +msgstr "&Eliminar" + +#: ../src\gui\main.py:96 +msgid "&Follow" +msgstr "&Seguir" + +#: ../src\gui\main.py:98 +msgid "&Unfollow" +msgstr "&Dejar de seguir" + +#: ../src\gui\main.py:100 ../src\gui\main.py:127 +msgid "&Mute" +msgstr "S&ilenciar" + +#: ../src\gui\main.py:102 +msgid "U&nmute" +msgstr "Desactivar si&lencio" + +#: ../src\gui\main.py:104 +msgid "&Report as spam" +msgstr "&Reportar como spam" + +#: ../src\gui\main.py:106 +msgid "&Block" +msgstr "&Bloquear" + +#: ../src\gui\main.py:108 +msgid "Unb&lock" +msgstr "desbl&oquear" + +#: ../src\gui\main.py:110 +msgid "Direct me&ssage" +msgstr "&Mensaje directo" + +#: ../src\gui\main.py:112 +msgid "&Add to list" +msgstr "&Añadir a lista" + +#: ../src\gui\main.py:114 +msgid "R&emove from list" +msgstr "&Quitar de lista" + +#: ../src\gui\main.py:116 +msgid "&View lists" +msgstr "&Ver listas" + +#: ../src\gui\main.py:118 +msgid "Show user &profile" +msgstr "Ve&r perfil del usuario" + +#: ../src\gui\main.py:120 +msgid "&Timeline" +msgstr "Lí&nea temporal" + +#: ../src\gui\main.py:122 +msgid "V&iew favourites" +msgstr "Ver &favoritos" + +#: ../src\gui\main.py:129 +msgid "&Autoread tweets for this buffer" +msgstr "&Lectura automática de tuits para este buffer" + +#: ../src\gui\main.py:131 +msgid "&Clear buffer" +msgstr "&Vaciar buffer" + +#: ../src\gui\main.py:133 +msgid "&Remove buffer" +msgstr "&Eliminar buffer" + +#: ../src\gui\main.py:138 +msgid "&Documentation" +msgstr "&Documentación" + +#: ../src\gui\main.py:140 +msgid "&What's new in this version?" +msgstr "¿&Qué hay de nuevo en esta versión?" + +#: ../src\gui\main.py:142 +msgid "&Check for updates" +msgstr "&Comprobar actualizaciones" + +#: ../src\gui\main.py:144 +msgid "&Report an error" +msgstr "&Reportar un error" + +#: ../src\gui\main.py:146 +msgid "TW Blue &website" +msgstr "Sitio &web de TW Blue" + +#: ../src\gui\main.py:148 +msgid "About &TW Blue" +msgstr "&Sobre TW Blue" + +#: ../src\gui\main.py:152 +msgid "&Application" +msgstr "&Aplicación" + +#: ../src\gui\main.py:154 +msgid "&User" +msgstr "&Usuario" + +#: ../src\gui\main.py:155 +msgid "&Buffer" +msgstr "&Buffer" + +#: ../src\gui\main.py:156 +msgid "&Help" +msgstr "Ay&uda" + +#: ../src\gui\main.py:240 +msgid "Home" +msgstr "Principal" + +#: ../src\gui\main.py:245 +msgid "Mentions" +msgstr "Menciones" + +#: ../src\gui\main.py:248 +msgid "Direct messages" +msgstr "Mensajes directos" + +#: ../src\gui\main.py:251 +msgid "Sent" +msgstr "Enviados" + +#: ../src\gui\main.py:257 +msgid "Favourites" +msgstr "Favoritos" + +#: ../src\gui\main.py:269 +msgid "Friends" +msgstr "Amigos" + +#: ../src\gui\main.py:284 +msgid "Searches" +msgstr "Búsquedas" + +#: ../src\gui\main.py:291 +msgid "Timelines" +msgstr "Líneas temporales" + +#: ../src\gui\main.py:294 ../src\gui\main.py:699 +msgid "Timeline for %s" +msgstr "Línea temporal de %s" + +#: ../src\gui\main.py:305 +msgid "Favourites timelines" +msgstr "Líneas temporales de favoritos" + +#: ../src\gui\main.py:308 ../src\gui\main.py:723 +msgid "Favourites for %s" +msgstr "Favoritos de %s" + +#: ../src\gui\main.py:340 +msgid "Ready" +msgstr "Listo" + +#: ../src\gui\main.py:367 +msgid "%s favourites from %s" +msgstr "%s favoritos de %s" + +#: ../src\gui\main.py:414 +msgid "Streams disconnected. TW Blue will try to reconnect in a minute." +msgstr "Streams desconectados. TW blue intentará conectarse en un minuto" + +#: ../src\gui\main.py:418 +msgid "Reconnecting streams..." +msgstr "Conectando los streams..." + +#: ../src\gui\main.py:442 +msgid "search for %s" +msgstr "Buscar %s" + +#: ../src\gui\main.py:447 +msgid "search users for %s" +msgstr "Buscar usuarios para %s" + +#: ../src\gui\main.py:459 ../src\gui\main.py:470 ../src\gui\main.py:489 +msgid "Select the user" +msgstr "Selecciona un usuario" + +#: ../src\gui\main.py:549 +msgid "User details" +msgstr "Detalles del usuario" + +#: ../src\gui\main.py:557 +msgid "" +"Do you really want to delete this message? It will be eliminated from " +"Twitter as well." +msgstr "" +"¿Realmente quieres borrar este mensaje? También se eliminará de Twitter." + +#: ../src\gui\main.py:574 +msgid "Do you really want to close TW Blue?" +msgstr "¿Realmente deseas salir de TW Blue?" + +#: ../src\gui\main.py:574 ../src\gui\sysTrayIcon.py:46 +msgid "Exit" +msgstr "Salir" + +#: ../src\gui\main.py:664 +msgid "Error while adding to favourites." +msgstr "Error al marcar como favorito" + +#: ../src\gui\main.py:672 +msgid "Error while removing from favourites." +msgstr "Error al quitar de favoritos" + +#: ../src\gui\main.py:676 +msgid "Individual timeline" +msgstr "Línea temporal individual" + +#: ../src\gui\main.py:680 ../src\gui\main.py:712 +msgid "The user does not exist" +msgstr "El usuario no existe" + +#: ../src\gui\main.py:686 +msgid "Existing timeline" +msgstr "Línea temporal existente" + +#: ../src\gui\main.py:686 +msgid "" +"There's currently a timeline for this user. You are not able to open another" +msgstr "Ya hay una línea temporal para este usuario. No se puede abrir otra" + +#: ../src\gui\main.py:694 +msgid "This user has no tweets. You can't open a timeline for this user" +msgstr "Este usuario no tiene tuits. NO puedes abrirle una línea temporal." + +#: ../src\gui\main.py:708 +msgid "List of favourites" +msgstr "Lista de favoritos" + +#: ../src\gui\main.py:718 +msgid "Existing list" +msgstr "Lista existente" + +#: ../src\gui\main.py:718 +msgid "" +"There's already a list of favourites for this user. You can't create another." +msgstr "" +"Actualmente ya hay una lista de favoritos abierta para este usuario. No " +"puedes crear otra." + +#: ../src\gui\main.py:727 +msgid "" +"This user has no favourites. You can't create a list of favourites for this " +"user." +msgstr "" +"Este usuario no tiene favoritos. No puedes crear una lista de favoritos para " +"él." + +#: ../src\gui\main.py:768 ../src\gui\main.py:781 +msgid "%s, %s of %s" +msgstr "%s, %s de %s" + +#: ../src\gui\main.py:770 ../src\gui\main.py:783 +msgid "%s. Empty" +msgstr "%s. Vacío" + +#: ../src\gui\main.py:806 +msgid "Global mute on" +msgstr "Silencio global, activado" + +#: ../src\gui\main.py:809 +msgid "Global mute off" +msgstr "Silencio global, desactivado" + +#: ../src\gui\main.py:815 +msgid "Buffer mute on" +msgstr "Silenciar buffer, activado" + +#: ../src\gui\main.py:818 +msgid "Buffer mute off" +msgstr "Silenciar buffer, desactivado" + +#: ../src\gui\main.py:824 +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\gui\main.py:827 +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\gui\main.py:834 +msgid "Copied" +msgstr "Copiado" + +#: ../src\gui\main.py:845 ../src\gui\main.py:854 +msgid "%s" +msgstr "%s" + +#: ../src\gui\sysTrayIcon.py:36 +msgid "Preferences" +msgstr "Preferencias" + +#: ../src\gui\sysTrayIcon.py:40 +msgid "Show / hide" +msgstr "Mostrar / esconder" + +#: ../src\gui\sysTrayIcon.py:42 +msgid "Documentation" +msgstr "Documentación" + +#: ../src\gui\sysTrayIcon.py:44 +msgid "Check for updates" +msgstr "Comprobar actualizaciones" + +#: ../src\issueReporter\gui.py:31 +msgid "always" +msgstr "Siempre" + +#: ../src\issueReporter\gui.py:31 +msgid "have not tried" +msgstr "No se ha intentado" + +#: ../src\issueReporter\gui.py:31 +msgid "random" +msgstr "Aleatoriamente" + +#: ../src\issueReporter\gui.py:31 +msgid "sometimes" +msgstr "A veces" + +#: ../src\issueReporter\gui.py:31 +msgid "unable to duplicate" +msgstr "Imposible de reproducir" + +#: ../src\issueReporter\gui.py:32 +msgid "block" +msgstr "Bloqueo" + +#: ../src\issueReporter\gui.py:32 +msgid "crash" +msgstr "Fallo" + +#: ../src\issueReporter\gui.py:32 +msgid "feature" +msgstr "Característica" + +#: ../src\issueReporter\gui.py:32 +msgid "major" +msgstr "Mayor" + +#: ../src\issueReporter\gui.py:32 +msgid "minor" +msgstr "Menor" + +#: ../src\issueReporter\gui.py:32 +msgid "text" +msgstr "Texto" + +#: ../src\issueReporter\gui.py:32 +msgid "trivial" +msgstr "Trivial" + +#: ../src\issueReporter\gui.py:32 +msgid "tweak" +msgstr "ajuste" + +#: ../src\issueReporter\gui.py:34 +msgid "Report an error" +msgstr "Reportar un error" + +#: ../src\issueReporter\gui.py:37 +msgid "Select a category" +msgstr "Selecciona una categoría" + +#: ../src\issueReporter\gui.py:46 +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\gui.py:56 +msgid "Here, you can describe the bug in detail" +msgstr "Aquí puedes describir el error en detalle" + +#: ../src\issueReporter\gui.py:66 +msgid "how often does this bug happen?" +msgstr "¿Qué tan a menudo ocurre este error?" + +#: ../src\issueReporter\gui.py:74 +msgid "Select the importance that you think this bug has" +msgstr "Selecciona la importancia que consideras que tiene este error" + +#: ../src\issueReporter\gui.py:82 +msgid "" +"I know that the TW Blue bug system will get my Twitter username to contact " +"me and fix the bug quickly" +msgstr "" +"Sé que el sistema de errores de TW Blue obtendrá mi nombre de usuario de " +"Twitter para contactarme y resolver el error rápidamente" + +#: ../src\issueReporter\gui.py:85 +msgid "Send report" +msgstr "Enviar reporte" + +#: ../src\issueReporter\gui.py:98 +msgid "You must fill out both fields" +msgstr "Debes llenar ambos campos" + +#: ../src\issueReporter\gui.py:101 +msgid "" +"You need to mark the checkbox to provide us your twitter username to contact " +"to you if is necessary." +msgstr "" +"Necesitas marcar la casilla para proporcionarnos tu nombre de usuario de " +"Twitter para poder contactarte si es necesario" + +#: ../src\issueReporter\gui.py:120 +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\gui.py:120 +msgid "reported" +msgstr "Reportado" + +#: ../src\issueReporter\gui.py:123 +msgid "Error while reporting" +msgstr "Error al reportar" + +#: ../src\issueReporter\gui.py:123 +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:4 +msgid "Go up up on the current list" +msgstr "Va arriba en la lista actual" + +#: ../src\keystrokeEditor\constants.py:5 +msgid "Go down up on the current list" +msgstr "Va abajo en la lista actual" + +#: ../src\keystrokeEditor\constants.py:6 +msgid "Go to the previous tab" +msgstr "va a la pestaña anterior" + +#: ../src\keystrokeEditor\constants.py:7 +msgid "Go to the next tab" +msgstr "Va a la pestaña siguiente" + +#: ../src\keystrokeEditor\constants.py:8 +msgid "Move up one tweet in the conversation" +msgstr "Ir un tuit hacia arriba en la conversación" + +#: ../src\keystrokeEditor\constants.py:9 +msgid "Move down one tweet in the conversation" +msgstr "Ir un tuit hacia abajo en la conversación" + +#: ../src\keystrokeEditor\constants.py:10 +msgid "Show the graphical interface" +msgstr "Mostrar la interfaz gráfica" + +#: ../src\keystrokeEditor\constants.py:12 +msgid "Reply to a tweet" +msgstr "Responder a un tuit" + +#: ../src\keystrokeEditor\constants.py:14 +msgid "Send direct message" +msgstr "Enviar mensaje directo" + +#: ../src\keystrokeEditor\constants.py:15 +msgid "Mark as favourite" +msgstr "Marcar como favorito" + +#: ../src\keystrokeEditor\constants.py:16 +msgid "Remove from favourites" +msgstr "Quitar de favoritos" + +#: ../src\keystrokeEditor\constants.py:17 +msgid "Open the 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 "Remove buffer" +msgstr "Eliminar buffer" + +#: ../src\keystrokeEditor\constants.py:23 +msgid "" +"Open URL on the current tweet, or further information for a friend or " +"follower" +msgstr "" +"Abrir URL en el tuit anterior, o solicitar más información en buffers de " +"usuarios" + +#: ../src\keystrokeEditor\constants.py:24 +msgid "Attempt to play audio" +msgstr "Intentar reproducir audio" + +#: ../src\keystrokeEditor\constants.py:25 +msgid "Increase volume by 5%" +msgstr "Subir volumen en un 5%" + +#: ../src\keystrokeEditor\constants.py:26 +msgid "Decrease volume by 5%" +msgstr "Bajar volumen en un 5%" + +#: ../src\keystrokeEditor\constants.py:27 +msgid "Go to the first element on the list" +msgstr "Ir al primer elemento de la lista" + +#: ../src\keystrokeEditor\constants.py:28 +msgid "Go to the last element on the list" +msgstr "IR al último elemento de la lista" + +#: ../src\keystrokeEditor\constants.py:29 +msgid "Move 20 elements up on the current list" +msgstr "Moverse 20 elementos hacia arriba en la lista actual" + +#: ../src\keystrokeEditor\constants.py:30 +msgid "Move 20 elements down on the current list" +msgstr "Moverse 20 elementos hacia abajo en la lista actual" + +#: ../src\keystrokeEditor\constants.py:31 +msgid "Edit profile" +msgstr "Editar perfil" + +#: ../src\keystrokeEditor\constants.py:32 +msgid "Remove a tweet or direct message" +msgstr "Eliminar tuit o mensaje directo" + +#: ../src\keystrokeEditor\constants.py:33 +msgid "Empty the buffer removing all the elements" +msgstr "Vaciar buffer, removiendo todos los elementos" + +#: ../src\keystrokeEditor\constants.py:34 +msgid "Listen the current message" +msgstr "Escuchar el mensaje actual" + +#: ../src\keystrokeEditor\constants.py:35 +msgid "Copy to clipboard" +msgstr "Copiar al portapapeles" + +#: ../src\keystrokeEditor\constants.py:36 +msgid "Add to list" +msgstr "Añadir a lista" + +#: ../src\keystrokeEditor\constants.py:37 +msgid "Remove from list" +msgstr "Quitar de lista" + +#: ../src\keystrokeEditor\constants.py:38 +msgid "Mutes/unmutes the active buffer" +msgstr "Silenciar o des-silenciar el buffer activo" + +#: ../src\keystrokeEditor\constants.py:39 +msgid "Globally mute/unmute TW Blue" +msgstr "Activar o desactivar el silencio global de TW Blue" + +#: ../src\keystrokeEditor\constants.py:40 +msgid "toggles 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:41 +msgid "Search on twitter" +msgstr "Buscar en Twitter" + +#: ../src\keystrokeEditor\constants.py:42 +msgid "Shows the keystroke editor" +msgstr "Mostrar el editor de combinaciones de teclado" + +#: ../src\keystrokeEditor\constants.py:43 +msgid "Show lists for a specified user" +msgstr "Mostrar listas para un usuario específico" + +#: ../src\keystrokeEditor\gui.py:10 +msgid "Keystroke editor" +msgstr "Editor de combinaciones de teclado" + +#: ../src\keystrokeEditor\gui.py:16 +msgid "Select a keystroke to edit" +msgstr "Selecciona una combinación de teclado para editarla" + +#: ../src\keystrokeEditor\gui.py:17 +msgid "Keystroke" +msgstr "Combinación de teclado" + +#: ../src\keystrokeEditor\gui.py:54 +msgid "Editing keystroke" +msgstr "Editando combinación de teclas" + +#: ../src\keystrokeEditor\gui.py:61 +msgid "Control" +msgstr "Control" + +#: ../src\keystrokeEditor\gui.py:62 +msgid "Alt" +msgstr "alt" + +#: ../src\keystrokeEditor\gui.py:63 +msgid "Shift" +msgstr "Shift" + +#: ../src\keystrokeEditor\gui.py:64 +msgid "Windows" +msgstr "Windows" + +#: ../src\keystrokeEditor\gui.py:70 +msgid "Key" +msgstr "Tecla" + +#: ../src\keystrokeEditor\gui.py:99 +msgid "You need to use the Windows key" +msgstr "Necesitas usar la tecla de windows" + +#: ../src\keystrokeEditor\gui.py:99 ../src\keystrokeEditor\gui.py:112 +msgid "Invalid keystroke" +msgstr "Combinación de teclado inválida" + +#: ../src\keystrokeEditor\gui.py:112 +msgid "You must provide a character for the keystroke" +msgstr "Debes proporcionar una letra para el atajo de teclado" + +#: ../src\languageHandler.py:95 +msgid "User default" +msgstr "Idioma predeterminado" + +#: ../src\sessionmanager\gui.py:19 +msgid "Session manager" +msgstr "Administrador de sesiones" + +#: ../src\sessionmanager\gui.py:23 +msgid "Select a twitter account to start TW Blue" +msgstr "Selecciona una cuenta de Twitter para iniciar TW Blue" + +#: ../src\sessionmanager\gui.py:25 +msgid "Account" +msgstr "Cuenta" + +#: ../src\sessionmanager\gui.py:30 +msgid "New account" +msgstr "Nueva cuenta" + +#: ../src\sessionmanager\gui.py:67 +msgid "Account Error" +msgstr "Error en la cuenta" + +#: ../src\sessionmanager\gui.py:67 +msgid "You need to configure an account." +msgstr "Necesitas configurar una cuenta" + +#: ../src\sessionmanager\gui.py:83 +msgid "" +"The request for the required Twitter authorization to continue will be " +"opened on your browser. You only need to do it once. Would you like to " +"autorhise a new account now?" +msgstr "" +"Se abrirá el navegador web con la solicitud de autorización de twitter que " +"necesitas para continuar. Solo necesitas hacer esto una vez. ¿Quieres " +"actualizar una nueva cuenta ahora?" + +#: ../src\sessionmanager\gui.py:94 +msgid "Invalid user token" +msgstr "Código de acceso inválido" + +#: ../src\sessionmanager\gui.py:94 +msgid "" +"Your access token is invalid or the authorisation has failed. Please try " +"again." +msgstr "" +"El código de acceso es incorrecto o la autorización ha fallado. Por favor, " +"inténtalo de nuevo." + +#: ../src\sessionmanager\gui.py:97 +msgid "Authorised account %d" +msgstr "Cuenta autorizada %d" + +#: ../src\twitter\buffers\indibidual.py:26 +msgid "One tweet from %s" +msgstr "Un tuit de %s" + +#: ../src\twitter\buffers\indibidual.py:35 +msgid "One tweet from %s in the list %s" +msgstr "Un tuit de %s en la lista %s" + +#: ../src\twitter\buffers\stream.py:57 +msgid "One mention from %s " +msgstr "Una mención de %s" + +#: ../src\twitter\buffers\stream.py:69 +msgid "One direct message" +msgstr "Un mensaje directo" + +#: ../src\twitter\compose.py:22 +msgid "About a week ago" +msgstr "Hace una semana" + +#: ../src\twitter\compose.py:24 +msgid "About {} weeks ago" +msgstr "Hace {} semanas" + +#: ../src\twitter\compose.py:26 +msgid "A month ago" +msgstr "Hace un mes" + +#: ../src\twitter\compose.py:28 +msgid "About {} months ago" +msgstr "Hace {} meses" + +#: ../src\twitter\compose.py:30 +msgid "About a year ago" +msgstr "Hace un año" + +#: ../src\twitter\compose.py:32 +msgid "About {} years ago" +msgstr "Hace {} años" + +#: ../src\twitter\compose.py:34 +msgid "About 1 day ago" +msgstr "Hace un día" + +#: ../src\twitter\compose.py:36 +msgid "About {} days ago" +msgstr "Hace {} días" + +#: ../src\twitter\compose.py:38 +msgid "just now" +msgstr "Ahora mismo" + +#: ../src\twitter\compose.py:40 +msgid "{} seconds ago" +msgstr "hace {} segundos" + +#: ../src\twitter\compose.py:42 +msgid "1 minute ago" +msgstr "Hace un minuto" + +#: ../src\twitter\compose.py:44 +msgid "{} minutes ago" +msgstr "hace {} minutos" + +#: ../src\twitter\compose.py:46 +msgid "About 1 hour ago" +msgstr "Hace una hora" + +#: ../src\twitter\compose.py:48 +msgid "About {} hours ago" +msgstr "Hace {} horas" + +#: ../src\twitter\compose.py:52 +msgid "January" +msgstr "Enero" + +#: ../src\twitter\compose.py:53 +msgid "February" +msgstr "Febrero" + +#: ../src\twitter\compose.py:54 +msgid "March" +msgstr "Marzo" + +#: ../src\twitter\compose.py:55 +msgid "April" +msgstr "Abril" + +#: ../src\twitter\compose.py:56 +msgid "May" +msgstr "Mayo" + +#: ../src\twitter\compose.py:57 +msgid "June" +msgstr "Junio" + +#: ../src\twitter\compose.py:58 +msgid "July" +msgstr "Julio" + +#: ../src\twitter\compose.py:59 +msgid "August" +msgstr "Agosto" + +#: ../src\twitter\compose.py:60 +msgid "September" +msgstr "Septiembre" + +#: ../src\twitter\compose.py:61 +msgid "October" +msgstr "Octubre" + +#: ../src\twitter\compose.py:62 +msgid "November" +msgstr "Noviembre" + +#: ../src\twitter\compose.py:63 +msgid "December" +msgstr "Diciembre" + +#: ../src\twitter\compose.py:66 +msgid "Sunday" +msgstr "Domingo" + +#: ../src\twitter\compose.py:67 +msgid "Monday" +msgstr "Lunes" + +#: ../src\twitter\compose.py:68 +msgid "Tuesday" +msgstr "Martes" + +#: ../src\twitter\compose.py:69 +msgid "Wednesday" +msgstr "Miércoles" + +#: ../src\twitter\compose.py:70 +msgid "Thursday" +msgstr "Jueves" + +#: ../src\twitter\compose.py:71 +msgid "Friday" +msgstr "Viernes" + +#: ../src\twitter\compose.py:72 +msgid "Saturday" +msgstr "Sábado" + +#: ../src\twitter\compose.py:75 +msgid "sun" +msgstr "dom" + +#: ../src\twitter\compose.py:76 +msgid "mon" +msgstr "lun" + +#: ../src\twitter\compose.py:77 +msgid "tue" +msgstr "mar" + +#: ../src\twitter\compose.py:78 +msgid "wed" +msgstr "mié" + +#: ../src\twitter\compose.py:79 +msgid "thu" +msgstr "jue" + +#: ../src\twitter\compose.py:80 +msgid "fri" +msgstr "vie" + +#: ../src\twitter\compose.py:81 +msgid "sat" +msgstr "sáb" + +#: ../src\twitter\compose.py:85 +msgid "jan" +msgstr "ene" + +#: ../src\twitter\compose.py:86 +msgid "feb" +msgstr "feb" + +#: ../src\twitter\compose.py:87 +msgid "mar" +msgstr "marAmárico" + +#: ../src\twitter\compose.py:88 +msgid "apr" +msgstr "abr" + +#: ../src\twitter\compose.py:89 +msgid "may" +msgstr "mayMayo" + +#: ../src\twitter\compose.py:90 +msgid "jun" +msgstr "jun" + +#: ../src\twitter\compose.py:91 +msgid "jul" +msgstr "jul" + +#: ../src\twitter\compose.py:92 +msgid "aug" +msgstr "ago" + +#: ../src\twitter\compose.py:93 +msgid "sep" +msgstr "sep" + +#: ../src\twitter\compose.py:94 +msgid "oct" +msgstr "oct" + +#: ../src\twitter\compose.py:95 +msgid "nov" +msgstr "nov" + +#: ../src\twitter\compose.py:96 +msgid "dec" +msgstr "dic" + +#: ../src\twitter\compose.py:147 ../src\twitter\compose.py:173 +#: ../src\twitter\compose.py:183 +msgid "%A, %B %d, %Y at %I:%M:%S %p" +msgstr "%A, %d de %B del %Y a las %I:%M:%S %p" + +#: ../src\twitter\compose.py:152 +msgid "Dm to %s " +msgstr "dm a %s" + +#: ../src\twitter\compose.py:185 +msgid "Unavailable" +msgstr "No disponible" + +#: ../src\twitter\compose.py:186 +msgid "" +"%s (@%s). %s followers, %s friends, %s tweets. Last tweet on %s. Joined " +"Twitter on %s" +msgstr "" +"%s (@%s). %s seguidores, %s amigos, %s tuits. Último tuit el %s. Se unió a " +"Twitter el %s" + +#: ../src\twitter\compose.py:190 +msgid "You've blocked %s" +msgstr "Has bloqueado a %s" + +#: ../src\twitter\compose.py:192 +msgid "You've unblocked %s" +msgstr "Has desbloqueado a %s" + +#: ../src\twitter\compose.py:195 +msgid "%s(@%s) has followed you" +msgstr "%s(@%s) ha empezado a seguirte" + +#: ../src\twitter\compose.py:197 +msgid "You've followed %s(@%s)" +msgstr "Ahora sigues a %s(@%s)" + +#: ../src\twitter\compose.py:199 +msgid "You've unfollowed %s (@%s)" +msgstr "Has dejado de seguir a %s(@%s)" + +#: ../src\twitter\compose.py:202 +msgid "You've added to favourites: %s, %s" +msgstr "Has marcado como favorito: %s, %s" + +#: ../src\twitter\compose.py:204 +msgid "%s(@%s) has marked as favorite: %s" +msgstr "%s(@%s) ha marcado como favorito: %s" + +#: ../src\twitter\compose.py:206 +msgid "You've removed from favourites: %s, %s" +msgstr "Has eliminado de tus favoritos: %s, %s" + +#: ../src\twitter\compose.py:207 +msgid "%s(@%s) has removed from favourites: %s" +msgstr "%s(@%s) ha quitado de sus favoritos: %s" + +#: ../src\twitter\compose.py:209 +msgid "You've created the list %s" +msgstr "Has creado la lista %s" + +#: ../src\twitter\compose.py:211 +msgid "You've deleted the list %s" +msgstr "Has eliminado la lista %s" + +#: ../src\twitter\compose.py:213 +msgid "You've updated the list %s" +msgstr "Has actualizado la lista %s" + +#: ../src\twitter\compose.py:215 +msgid "You've added %s(@%s) to the list %s" +msgstr "Has añadido a %s(@%s) a la lista %s" + +#: ../src\twitter\compose.py:216 +msgid "%s(@%s) has added you to the list %s" +msgstr "%s(@%s) te ha añadido a la lista %s" + +#: ../src\twitter\compose.py:218 +msgid "You'be removed %s(@%s) from the list %s" +msgstr "Has qitado a %s(@%s) de la lista %s" + +#: ../src\twitter\compose.py:219 +msgid "%s(@%s) has removed you from the list %s" +msgstr "%s(@%s) te ha eliminado de la lista %s" + +#: ../src\twitter\compose.py:221 +msgid "You've subscribed to the list %s, which is owned by %s(@%s)" +msgstr "Te has dado de alta en la lista %s, propiedad de %s(@%s)" + +#: ../src\twitter\compose.py:222 +msgid "%s(@%s) has suscribed you to the list %s" +msgstr "%s(@%s) te ha suscrito a la lista %s" + +#: ../src\twitter\compose.py:224 +msgid "You've unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "Te has dado de baja de la lista %s, propiedad de %s(@%s)" + +#: ../src\twitter\compose.py:225 +msgid "You've been unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "Has sido dado de baja de la lista %s, propiedad de %s(@%s)" + +#: ../src\twitter\compose.py:226 +msgid "Unknown" +msgstr "Desconocido" + +#: ../src\twitter\compose.py:232 +msgid "No description available" +msgstr "No hay una descripción disponible" + +#: ../src\twitter\compose.py:236 +msgid "private" +msgstr "Privado" + +#: ../src\twitter\compose.py:237 +msgid "public" +msgstr "público" + +#: ../src\twitter\twitter.py:74 +msgid "%s failed. Reason: %s" +msgstr "%s falló. Razón: %s" + +#: ../src\twitter\twitter.py:81 +msgid "%s succeeded." +msgstr "%s con éxito" + +#: ../src\updater\update_manager.py:14 +msgid "Your TW Blue version is up to date" +msgstr "Tu versión de TW Blue está actualizada" + +#: ../src\updater\update_manager.py:14 ../src\updater\update_manager.py:27 +msgid "Update" +msgstr "Actualización" + +#: ../src\updater\update_manager.py:20 +msgid "New version for %s" +msgstr "Nueva versión de %s" + +#: ../src\updater\update_manager.py:20 +msgid "" +"There's a new TW Blue version available. Would you like to download it now?" +msgstr "" +"Hay disponible una nueva versión de TW Blue. ¿Te gustaría descargarla ahora?" + +#: ../src\updater\update_manager.py:22 +msgid "Download in Progress" +msgstr "Descarga en progreso" + +#: ../src\updater\update_manager.py:22 +msgid "Downloading the new version..." +msgstr "Descargando la nueva versión..." + +#: ../src\updater\update_manager.py:29 +msgid "Done!" +msgstr "¡Hecho!" + +#: ../src\updater\update_manager.py:29 +msgid "" +"The new TW Blue version has been downloaded and installed. Press OK to start " +"the application." +msgstr "" +"La nueva versión de TW Blue ha sido descargada e instalada. Presiona aceptar " +"para iniciar la aplicación." + +#, fuzzy +#~ msgid "This action is not supported for this buffer." +#~ msgstr "" +#~ "La lectura automática de nuevos tuits para este buffer está activada" + +#~ msgid "Tweet - %i characters" +#~ msgstr "Tuit - %i caracteres" + +#~ msgid "Subscrive" +#~ msgstr "Darte de alta" + +#~ msgid "Unsubscrive" +#~ msgstr "Darse de baja" + +#~ msgid "" +#~ "TW Blue is an app designed to use Twitter in a simple and fast way and " +#~ "avoiding, as far as possible, the consumtion of excessive resources of " +#~ "the machine where it’s running. With this app you’ll have access to most " +#~ "twitter features." +#~ msgstr "" +#~ "TW Blue es una aplicación diseñada para usar Twitter de manera fácil y " +#~ "rápida, y evitando, en la medida de lo posible, el consumo excesivo de " +#~ "recursos en la máquina donde se ejecuta. Con esta aplicación tendrás " +#~ "acceso a la mayoría de las características de Twitter." + +#~ msgid "Bryner Villalobos (English)" +#~ msgstr "Bryner Villalobos (Inglés)" + +#~ msgid "Burak (Turkish)" +#~ msgstr "Burak(Turco)" + +#~ msgid "Jani Kinnunen(finnish)" +#~ msgstr "Jani Kinnunen(Finlandés)" + +#~ msgid "Javier Curras, José Manuel Delicado, Alba Quinteiro(Galician)" +#~ msgstr "Javier Currás, José Manuel Delicado, Alba Quinteiro(Gallego)" + +#~ msgid "Manuel cortéz(Spanish)" +#~ msgstr "Manuel cortéz(Español)" + +#~ msgid "Mohammed Al Shara (Arabic)" +#~ msgstr "Mohammed Al Shara (Árabe)" + +#~ msgid "Odenilton Júnior Santos(Portuguese)" +#~ msgstr "Odenilton Júnior Santos(Portugués)" + +#~ msgid "Paweł Masarczyk(Polish)" +#~ msgstr "Paweł Masarczyk(Polaco)" + +#~ msgid "Robert Osztolykan(Hungarian)" +#~ msgstr "Robert Osztolykan(Húngaro)" + +#~ msgid "Salva Doménech, Juan Carlos Rivilla(Catalan)" +#~ msgstr "Salva Doménech, Juan Carlos Rivilla(Catalán)" + +#~ msgid "Sukil Etxenike Arizaleta(Basque)" +#~ msgstr "Sukil Etxenike Arizaleta(Vasco)" + +#~ msgid "View members" +#~ msgstr "¿¿¿Ver miembros" + +#~ msgid "View subscribers" +#~ msgstr "Ver suscriptores" + +#~ msgid "Mention to %s" +#~ msgstr "Mencionar a %s" + +#~ msgid "Ouner" +#~ msgstr "propietario" diff --git a/src/locales/fi/LC_MESSAGES/twblue.mo b/src/locales/fi/LC_MESSAGES/twblue.mo new file mode 100644 index 00000000..e2f3ab15 Binary files /dev/null and b/src/locales/fi/LC_MESSAGES/twblue.mo differ diff --git a/src/locales/fi/LC_MESSAGES/twblue.po b/src/locales/fi/LC_MESSAGES/twblue.po new file mode 100644 index 00000000..bee57b18 --- /dev/null +++ b/src/locales/fi/LC_MESSAGES/twblue.po @@ -0,0 +1,2432 @@ +msgid "" +msgstr "" +"Project-Id-Version: TW Blue\n" +"POT-Creation-Date: 2014-09-07 07:44+Hora de verano central (México)\n" +"PO-Revision-Date: 2014-09-07 22:22+0200\n" +"Last-Translator: Jani Kinnunen \n" +"Language-Team: Jani Kinnunen \n" +"Language: fi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.6.9\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-SearchPath-0: d:\\twblue\\src\n" + +#: ../src\extra\AudioUploader\gui.py:31 ../src\gui\dialogs\message.py:169 +#: ../src\gui\dialogs\message.py:256 +msgid "Attach audio" +msgstr "Liitä äänitiedosto" + +#: ../src\extra\AudioUploader\gui.py:38 ../src\extra\AudioUploader\gui.py:146 +#: ../src\extra\AudioUploader\gui.py:156 +msgid "Play" +msgstr "Toista" + +#: ../src\extra\AudioUploader\gui.py:41 ../src\extra\AudioUploader\gui.py:75 +#: ../src\extra\AudioUploader\gui.py:80 ../src\extra\AudioUploader\gui.py:107 +msgid "Pause" +msgstr "Keskeytä" + +#: ../src\extra\AudioUploader\gui.py:44 ../src\extra\AudioUploader\gui.py:103 +msgid "Record" +msgstr "Nauhoita" + +#: ../src\extra\AudioUploader\gui.py:47 +msgid "Add an existing file" +msgstr "Lisää olemassa oleva tiedosto" + +#: ../src\extra\AudioUploader\gui.py:49 +msgid "Discard" +msgstr "Hylkää" + +#: ../src\extra\AudioUploader\gui.py:52 +msgid "Upload to" +msgstr "Lähetä palveluun" + +#: ../src\extra\AudioUploader\gui.py:57 +msgid "Attach" +msgstr "Liitä" + +#: ../src\extra\AudioUploader\gui.py:59 ../src\issueReporter\gui.py:88 +msgid "Cancel" +msgstr "Peruuta" + +#: ../src\extra\AudioUploader\gui.py:77 ../src\extra\AudioUploader\gui.py:78 +msgid "Resume" +msgstr "Jatka" + +#: ../src\extra\AudioUploader\gui.py:95 +msgid "Stop recording" +msgstr "Keskeytä nauhoitus" + +#: ../src\extra\AudioUploader\gui.py:96 +msgid "Recording" +msgstr "Nauhoitetaan" + +#: ../src\extra\AudioUploader\gui.py:101 ../src\extra\AudioUploader\gui.py:153 +msgid "Stopped" +msgstr "Keskeytetty" + +#: ../src\extra\AudioUploader\gui.py:128 ../src\gui\dialogs\message.py:218 +#: ../src\gui\dialogs\update_profile.py:87 +msgid "Discarded" +msgstr "Hylätty" + +#: ../src\extra\AudioUploader\gui.py:138 ../src\gui\buffers\base.py:303 +#: ../src\gui\buffers\base.py:315 +msgid "Playing..." +msgstr "Toistetaan..." + +#: ../src\extra\AudioUploader\gui.py:142 +msgid "Stop" +msgstr "Keskeytä" + +#: ../src\extra\AudioUploader\gui.py:161 +msgid "Recoding audio..." +msgstr "Uudelleenkoodataan ääntä..." + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Audio Files (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" +msgstr "Äänitiedostot (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Select the audio file to be uploaded" +msgstr "Valitse lähetettävä äänitiedosto" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:15 +msgid "File" +msgstr "Tiedosto" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:21 +msgid "Transferred" +msgstr "Siirretty" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:26 +msgid "Total file size" +msgstr "Tiedoston koko yhteensä" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:31 +msgid "Transfer rate" +msgstr "Siirtonopeus" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:36 +msgid "Time left" +msgstr "Aikaa jäljellä" + +#: ../src\extra\AudioUploader\utils.py:27 +msgid "%d day, " +msgstr "%d päivä, " + +#: ../src\extra\AudioUploader\utils.py:29 +msgid "%d days, " +msgstr "%d päivää, " + +#: ../src\extra\AudioUploader\utils.py:31 +msgid "%d hour, " +msgstr "%d tunti, " + +#: ../src\extra\AudioUploader\utils.py:33 +msgid "%d hours, " +msgstr "%d tuntia, " + +#: ../src\extra\AudioUploader\utils.py:35 +msgid "%d minute, " +msgstr "%d minuutti, " + +#: ../src\extra\AudioUploader\utils.py:37 +msgid "%d minutes, " +msgstr "%d minuuttia, " + +#: ../src\extra\AudioUploader\utils.py:39 +msgid "%s second" +msgstr "%s sekunti" + +#: ../src\extra\AudioUploader\utils.py:41 +msgid "%s seconds" +msgstr "%s sekuntia" + +#: ../src\extra\SoundsTutorial\gui.py:11 +msgid "The tweet may contain a playable audio" +msgstr "Twiitti saattaa sisältää äänitallenteen" + +#: ../src\extra\SoundsTutorial\gui.py:12 +msgid "A timeline has been created" +msgstr "Aikajana on luotu" + +#: ../src\extra\SoundsTutorial\gui.py:13 +msgid "A timeline has been deleted" +msgstr "Aikajana on poistettu" + +#: ../src\extra\SoundsTutorial\gui.py:14 +msgid "You've received a direct message" +msgstr "Sait yksityisviestin" + +#: ../src\extra\SoundsTutorial\gui.py:15 +msgid "You've sent a direct message" +msgstr "Lähetit yksityisviestin" + +#: ../src\extra\SoundsTutorial\gui.py:16 +msgid "A bug has happened" +msgstr "Tapahtui ohjelmavirhe" + +#: ../src\extra\SoundsTutorial\gui.py:17 +msgid "You've added a tweet to your favourites" +msgstr "Lisäsit twiitin suosikkeihisi" + +#: ../src\extra\SoundsTutorial\gui.py:18 +msgid "Someone's favourites have been updated" +msgstr "Jonkun käyttäjän suosikit on päivitetty" + +#: ../src\extra\SoundsTutorial\gui.py:19 +msgid "There are no more tweets to read" +msgstr "Ei enempää luettavia twiittejä" + +#: ../src\extra\SoundsTutorial\gui.py:20 +msgid "A list has a new tweet" +msgstr "Listalla on uusi twiitti" + +#: ../src\extra\SoundsTutorial\gui.py:21 +msgid "You can't add any more characters on the tweet" +msgstr "Et voi kirjoittaa twiittiin enempää" + +#: ../src\extra\SoundsTutorial\gui.py:22 +msgid "You've been mentioned " +msgstr "Sinut on mainittu " + +#: ../src\extra\SoundsTutorial\gui.py:23 +msgid "A new event has happened" +msgstr "Uusi tapahtuma" + +#: ../src\extra\SoundsTutorial\gui.py:24 +msgid "TW Blue is ready " +msgstr "TW Blue on valmis" + +#: ../src\extra\SoundsTutorial\gui.py:25 +msgid "You've replied" +msgstr "Vastasit twiittiin" + +#: ../src\extra\SoundsTutorial\gui.py:26 +msgid "You've retweeted" +msgstr "Lähetit uudelleentwiittauksen" + +#: ../src\extra\SoundsTutorial\gui.py:27 +msgid "A search has been updated" +msgstr "Haku on päivitetty" + +#: ../src\extra\SoundsTutorial\gui.py:28 +msgid "There's a new tweet in the main buffer" +msgstr "Pääpuskurissa on uusi twiitti" + +#: ../src\extra\SoundsTutorial\gui.py:29 +msgid "You've sent a tweet" +msgstr "Lähetit twiitin" + +#: ../src\extra\SoundsTutorial\gui.py:30 +msgid "There's a new tweet in a timeline" +msgstr "Aikajanalla on uusi twiitti" + +#: ../src\extra\SoundsTutorial\gui.py:31 +msgid "You have a new follower" +msgstr "Sinulla on uusi seuraaja" + +#: ../src\extra\SoundsTutorial\gui.py:32 +msgid "You've turned the volume up or down" +msgstr "Olet lisännyt tai vähentänyt äänenvoimakkuutta" + +#: ../src\extra\SoundsTutorial\gui.py:36 +msgid "" +"It seems as though the currently used sound pack needs an update. %i fails " +"are still be required to use this function. Make sure to obtain the needed " +"lacking sounds or to contact with the sound pack developer." +msgstr "" +"Vaikuttaa siltä, että nykyinen äänipaketti tarvitsee päivityksen. Sen " +"käyttämiseen tarvitaan vielä %i tiedostoa. Varmista, että puuttuvat " +"tiedostot ovat käytettävissä tai ota yhteyttä äänipaketin tekijään." + +#: ../src\extra\SoundsTutorial\gui.py:36 ../src\extra\SpellChecker\gui.py:34 +#: ../src\gui\dialogs\show_user.py:63 ../src\gui\main.py:703 +#: ../src\gui\main.py:734 ../src\issueReporter\gui.py:98 +#: ../src\issueReporter\gui.py:101 +msgid "Error" +msgstr "Virhe" + +#: ../src\extra\SoundsTutorial\gui.py:38 ../src\gui\main.py:68 +msgid "Sounds tutorial" +msgstr "Tutustu ääniin" + +#: ../src\extra\SoundsTutorial\gui.py:41 +msgid "Press enter to listen to the sound for the selected event" +msgstr "Paina Enteriä kuunnellaksesi valitun tapahtuman äänen" + +#: ../src\extra\SpellChecker\gui.py:34 +msgid "" +"A bug has happened. There are no dictionaries available for the selected " +"language in TW Blue" +msgstr "Tapahtui virhe. TW Bluessa ei ole sanastoja valitulle kielelle." + +#: ../src\extra\SpellChecker\gui.py:38 +msgid "Mis-spelled word" +msgstr "Väärin kirjoitettu sana" + +#: ../src\extra\SpellChecker\gui.py:43 +msgid "Context" +msgstr "Asiayhteys" + +#: ../src\extra\SpellChecker\gui.py:48 +msgid "Suggestions" +msgstr "Ehdotukset" + +#: ../src\extra\SpellChecker\gui.py:53 +msgid "Ignore" +msgstr "Ohita" + +#: ../src\extra\SpellChecker\gui.py:55 +msgid "Ignore all" +msgstr "Ohita kaikki" + +#: ../src\extra\SpellChecker\gui.py:57 +msgid "Replace" +msgstr "Korvaa" + +#: ../src\extra\SpellChecker\gui.py:59 +msgid "Replace all" +msgstr "Korvaa kaikki" + +#: ../src\extra\SpellChecker\gui.py:78 +msgid "Mis-spelled word: %s" +msgstr "Väärin kirjoitettu sana: %s" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "Finished" +msgstr "Valmis" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "The spelling review has finished." +msgstr "Kieliasun tarkistus päättynyt." + +#: ../src\extra\translator\gui.py:24 ../src\gui\dialogs\message.py:177 +#: ../src\gui\dialogs\message.py:264 ../src\gui\dialogs\message.py:350 +msgid "Translate message" +msgstr "Käännä viesti" + +#: ../src\extra\translator\gui.py:27 +msgid "Source language" +msgstr "Lähdekieli" + +#: ../src\extra\translator\gui.py:30 +msgid "Target language" +msgstr "Kohdekieli" + +#: ../src\extra\translator\translator.py:53 +msgid "Afrikaans" +msgstr "afrikaans" + +#: ../src\extra\translator\translator.py:54 +msgid "Albanian" +msgstr "albania" + +#: ../src\extra\translator\translator.py:55 +msgid "Amharic" +msgstr "amhara" + +#: ../src\extra\translator\translator.py:56 +msgid "Arabic" +msgstr "arabia" + +#: ../src\extra\translator\translator.py:57 +msgid "Armenian" +msgstr "armenia" + +#: ../src\extra\translator\translator.py:58 +msgid "Azerbaijani" +msgstr "azeri" + +#: ../src\extra\translator\translator.py:59 +msgid "Basque" +msgstr "baski" + +#: ../src\extra\translator\translator.py:60 +msgid "Belarusian" +msgstr "valkovenäjä" + +#: ../src\extra\translator\translator.py:61 +msgid "Bengali" +msgstr "bengali" + +#: ../src\extra\translator\translator.py:62 +msgid "Bihari" +msgstr "bihar" + +#: ../src\extra\translator\translator.py:63 +msgid "Bulgarian" +msgstr "bulgaria" + +#: ../src\extra\translator\translator.py:64 +msgid "Burmese" +msgstr "burma" + +#: ../src\extra\translator\translator.py:65 +msgid "Catalan" +msgstr "katalaani" + +#: ../src\extra\translator\translator.py:66 +msgid "Cherokee" +msgstr "cherokee" + +#: ../src\extra\translator\translator.py:67 +msgid "Chinese" +msgstr "kiina" + +#: ../src\extra\translator\translator.py:68 +msgid "Chinese_simplified" +msgstr "kiina (yksinkertaistettu)" + +#: ../src\extra\translator\translator.py:69 +msgid "Chinese_traditional" +msgstr "kiina (perinteinen)" + +#: ../src\extra\translator\translator.py:70 +msgid "Croatian" +msgstr "kroatia" + +#: ../src\extra\translator\translator.py:71 +msgid "Czech" +msgstr "tshekki" + +#: ../src\extra\translator\translator.py:72 +msgid "Danish" +msgstr "tanska" + +#: ../src\extra\translator\translator.py:73 +msgid "Dhivehi" +msgstr "divehi" + +#: ../src\extra\translator\translator.py:74 +msgid "Dutch" +msgstr "hollanti" + +#: ../src\extra\translator\translator.py:75 +msgid "English" +msgstr "englanti" + +#: ../src\extra\translator\translator.py:76 +msgid "Esperanto" +msgstr "esperanto" + +#: ../src\extra\translator\translator.py:77 +msgid "Estonian" +msgstr "viro" + +#: ../src\extra\translator\translator.py:78 +msgid "Filipino" +msgstr "filipino" + +#: ../src\extra\translator\translator.py:79 +msgid "Finnish" +msgstr "suomi" + +#: ../src\extra\translator\translator.py:80 +msgid "French" +msgstr "ranska" + +#: ../src\extra\translator\translator.py:81 +msgid "Galician" +msgstr "galicia" + +#: ../src\extra\translator\translator.py:82 +msgid "Georgian" +msgstr "georgia" + +#: ../src\extra\translator\translator.py:83 +msgid "German" +msgstr "saksa" + +#: ../src\extra\translator\translator.py:84 +msgid "Greek" +msgstr "kreikka" + +#: ../src\extra\translator\translator.py:85 +msgid "Guarani" +msgstr "guarani" + +#: ../src\extra\translator\translator.py:86 +msgid "Gujarati" +msgstr "gujarati" + +#: ../src\extra\translator\translator.py:87 +msgid "Hebrew" +msgstr "heprea" + +#: ../src\extra\translator\translator.py:88 +msgid "Hindi" +msgstr "hindi" + +#: ../src\extra\translator\translator.py:89 +msgid "Hungarian" +msgstr "unkari" + +#: ../src\extra\translator\translator.py:90 +msgid "Icelandic" +msgstr "islanti" + +#: ../src\extra\translator\translator.py:91 +msgid "Indonesian" +msgstr "indonesia" + +#: ../src\extra\translator\translator.py:92 +msgid "Inuktitut" +msgstr "inuktitut" + +#: ../src\extra\translator\translator.py:93 +msgid "Irish" +msgstr "iiri" + +#: ../src\extra\translator\translator.py:94 +msgid "Italian" +msgstr "italia" + +#: ../src\extra\translator\translator.py:95 +msgid "Japanese" +msgstr "japani" + +#: ../src\extra\translator\translator.py:96 +msgid "Kannada" +msgstr "kannada" + +#: ../src\extra\translator\translator.py:97 +msgid "Kazakh" +msgstr "kazakki" + +#: ../src\extra\translator\translator.py:98 +msgid "Khmer" +msgstr "khmer" + +#: ../src\extra\translator\translator.py:99 +msgid "Korean" +msgstr "korea" + +#: ../src\extra\translator\translator.py:100 +msgid "Kurdish" +msgstr "kurdi" + +#: ../src\extra\translator\translator.py:101 +msgid "Kyrgyz" +msgstr "kirgiisi" + +#: ../src\extra\translator\translator.py:102 +msgid "Laothian" +msgstr "lao" + +#: ../src\extra\translator\translator.py:103 +msgid "Latvian" +msgstr "latvia" + +#: ../src\extra\translator\translator.py:104 +msgid "Lithuanian" +msgstr "liettua" + +#: ../src\extra\translator\translator.py:105 +msgid "Macedonian" +msgstr "makedonia" + +#: ../src\extra\translator\translator.py:106 +msgid "Malay" +msgstr "malaiji" + +#: ../src\extra\translator\translator.py:107 +msgid "Malayalam" +msgstr "malajalam" + +#: ../src\extra\translator\translator.py:108 +msgid "Maltese" +msgstr "malta" + +#: ../src\extra\translator\translator.py:109 +msgid "Marathi" +msgstr "Marathi" + +#: ../src\extra\translator\translator.py:110 +msgid "Mongolian" +msgstr "mongoli" + +#: ../src\extra\translator\translator.py:111 +msgid "Nepali" +msgstr "nepali" + +#: ../src\extra\translator\translator.py:112 +msgid "Norwegian" +msgstr "norja" + +#: ../src\extra\translator\translator.py:113 +msgid "Oriya" +msgstr "orija" + +#: ../src\extra\translator\translator.py:114 +msgid "Pashto" +msgstr "pashtu" + +#: ../src\extra\translator\translator.py:115 +msgid "Persian" +msgstr "persia" + +#: ../src\extra\translator\translator.py:116 +msgid "Polish" +msgstr "puola" + +#: ../src\extra\translator\translator.py:117 +msgid "Portuguese" +msgstr "portugali" + +#: ../src\extra\translator\translator.py:118 +msgid "Punjabi" +msgstr "pandshabi" + +#: ../src\extra\translator\translator.py:119 +msgid "Romanian" +msgstr "romania" + +#: ../src\extra\translator\translator.py:120 +msgid "Russian" +msgstr "venäjä" + +#: ../src\extra\translator\translator.py:121 +msgid "Sanskrit" +msgstr "sanskrit" + +#: ../src\extra\translator\translator.py:122 +msgid "Serbian" +msgstr "serbia" + +#: ../src\extra\translator\translator.py:123 +msgid "Sindhi" +msgstr "sindhi" + +#: ../src\extra\translator\translator.py:124 +msgid "Sinhalese" +msgstr "sinhali" + +#: ../src\extra\translator\translator.py:125 +msgid "Slovak" +msgstr "slovakki" + +#: ../src\extra\translator\translator.py:126 +msgid "Slovenian" +msgstr "slovenia" + +#: ../src\extra\translator\translator.py:127 +msgid "Spanish" +msgstr "espanja" + +#: ../src\extra\translator\translator.py:128 +msgid "Swahili" +msgstr "swahili" + +#: ../src\extra\translator\translator.py:129 +msgid "Swedish" +msgstr "ruotsi" + +#: ../src\extra\translator\translator.py:130 +msgid "Tajik" +msgstr "tadzhikki" + +#: ../src\extra\translator\translator.py:131 +msgid "Tamil" +msgstr "tamili" + +#: ../src\extra\translator\translator.py:132 +msgid "Tagalog" +msgstr "tagalog" + +#: ../src\extra\translator\translator.py:133 +msgid "Telugu" +msgstr "telugu" + +#: ../src\extra\translator\translator.py:134 +msgid "Thai" +msgstr "thai" + +#: ../src\extra\translator\translator.py:135 +msgid "Tibetan" +msgstr "tiibet" + +#: ../src\extra\translator\translator.py:136 +msgid "Turkish" +msgstr "turkki" + +#: ../src\extra\translator\translator.py:137 +msgid "Ukrainian" +msgstr "ukraina" + +#: ../src\extra\translator\translator.py:138 +msgid "Urdu" +msgstr "urdu" + +#: ../src\extra\translator\translator.py:139 +msgid "Uzbek" +msgstr "Uzbek" + +#: ../src\extra\translator\translator.py:140 +msgid "Uighur" +msgstr "uiguuri" + +#: ../src\extra\translator\translator.py:141 +msgid "Vietnamese" +msgstr "vietnam" + +#: ../src\extra\translator\translator.py:142 +msgid "Welsh" +msgstr "wales" + +#: ../src\extra\translator\translator.py:143 +msgid "Yiddish" +msgstr "jiddish" + +#: ../src\extra\translator\translator.py:150 +msgid "autodetect" +msgstr "tunnista automaattisesti" + +#: ../src\gui\buffers\base.py:54 +msgid "Client" +msgstr "Asiakasohjelma" + +#: ../src\gui\buffers\base.py:54 +msgid "Text" +msgstr "Teksti" + +#: ../src\gui\buffers\base.py:54 ../src\gui\buffers\events.py:57 +msgid "Date" +msgstr "Päiväys" + +#: ../src\gui\buffers\base.py:54 ../src\gui\buffers\people.py:39 +#: ../src\gui\buffers\user_searches.py:31 ../src\gui\dialogs\utils.py:36 +#: ../src\gui\main.py:154 +msgid "User" +msgstr "Käyttäjä" + +#: ../src\gui\buffers\base.py:73 ../src\gui\buffers\base.py:192 +#: ../src\gui\buffers\events.py:58 ../src\gui\buffers\events.py:74 +#: ../src\gui\dialogs\message.py:332 ../src\gui\main.py:79 +#: ../src\gui\main.py:153 ../src\gui\sysTrayIcon.py:34 +msgid "Tweet" +msgstr "Twiittaa" + +#: ../src\gui\buffers\base.py:75 ../src\gui\buffers\base.py:204 +#: ../src\gui\main.py:83 ../src\keystrokeEditor\constants.py:13 +msgid "Retweet" +msgstr "Uudelleentwiittaa" + +#: ../src\gui\buffers\base.py:77 ../src\gui\main.py:81 +msgid "Reply" +msgstr "Vastaa" + +#: ../src\gui\buffers\base.py:79 ../src\gui\main.py:110 +msgid "Direct message" +msgstr "Yksityisviesti" + +#: ../src\gui\buffers\base.py:92 +msgid "Do you really want to delete this timeline?" +msgstr "Haluatko varmasti poistaa tämän aikajanan?" + +#: ../src\gui\buffers\base.py:92 ../src\gui\buffers\favourites.py:41 +#: ../src\gui\buffers\lists.py:46 ../src\gui\buffers\trends.py:41 +#: ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Attention" +msgstr "Huomio" + +#: ../src\gui\buffers\base.py:104 +msgid "This buffer is not a timeline; it can't be deleted." +msgstr "Tämä puskuri ei ole aikajana. Sitä ei voi poistaa." + +#: ../src\gui\buffers\base.py:184 ../src\gui\buffers\dm.py:44 +#: ../src\gui\buffers\people.py:54 +msgid "Direct message to %s" +msgstr "Yksityisviesti käyttäjälle %s" + +#: ../src\gui\buffers\base.py:192 ../src\gui\buffers\events.py:74 +msgid "Write the tweet here" +msgstr "Kirjoita twiitti tähän" + +#: ../src\gui\buffers\base.py:204 +msgid "Would you like to add a comment to this tweet?" +msgstr "Haluatko lisätä kommentin tähän twiittiin?" + +#: ../src\gui\buffers\base.py:207 +msgid "Add your comment to the tweet" +msgstr "Lisää kommenttisi twiittiin" + +#: ../src\gui\buffers\base.py:223 ../src\gui\buffers\people.py:62 +msgid "Reply to %s" +msgstr "Vastaa käyttäjälle %s" + +#: ../src\gui\buffers\base.py:268 +msgid "Opening URL..." +msgstr "Avataan URL..." + +#: ../src\gui\buffers\base.py:285 ../src\gui\buffers\events.py:118 +msgid "" +"Do you really want to empty this buffer? It's tweets will be removed from " +"the list but not from Twitter" +msgstr "" +"Haluatko varmasti tyhjentää tämän puskurin? Sen twiitit poistetaan listasta, " +"mutta ei Twitteristä." + +#: ../src\gui\buffers\base.py:285 ../src\gui\buffers\events.py:118 +msgid "Empty buffer" +msgstr "Tyhjennä puskuri" + +#: ../src\gui\buffers\base.py:290 ../src\gui\buffers\events.py:122 +msgid "Do you really want to delete this message?" +msgstr "Haluatko varmasti poistaa tämän viestin?" + +#: ../src\gui\buffers\base.py:290 ../src\gui\buffers\events.py:122 +#: ../src\gui\dialogs\lists.py:107 ../src\gui\main.py:91 +#: ../src\gui\main.py:577 +msgid "Delete" +msgstr "Poista" + +#: ../src\gui\buffers\base.py:310 ../src\gui\buffers\base.py:321 +msgid "Unable to play audio." +msgstr "Ääntä ei voi toistaa." + +#: ../src\gui\buffers\base.py:312 +msgid "Audio stopped." +msgstr "Äänen toistaminen keskeytetty." + +#: ../src\gui\buffers\events.py:40 +msgid "Empty" +msgstr "Tyhjä" + +#: ../src\gui\buffers\events.py:57 +msgid "Event" +msgstr "Tapahtuma" + +#: ../src\gui\buffers\events.py:60 +msgid "Remove event" +msgstr "Poista tapahtuma" + +#: ../src\gui\buffers\favourites.py:41 +msgid "Do you really want to delete this favourites timeline?" +msgstr "Haluatko varmasti poistaa tämän suosikkiaikajanan?" + +#: ../src\gui\buffers\lists.py:46 ../src\gui\dialogs\lists.py:107 +msgid "Do you really want to delete this list?" +msgstr "Haluatko varmasti poistaa tämän listan?" + +#: ../src\gui\buffers\panels.py:27 +msgid "Announce" +msgstr "Ilmoita" + +#: ../src\gui\buffers\people.py:44 +msgid "Mention" +msgstr "Mainitse" + +#: ../src\gui\buffers\trends.py:41 ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Do you really want to delete this search term?" +msgstr "Haluatko varmasti poistaa tämän hakutermin?" + +#: ../src\gui\dialogs\configuration.py:39 +msgid "Language" +msgstr "Kieli" + +#: ../src\gui\dialogs\configuration.py:53 +msgid "Relative times" +msgstr "Suhteelliset ajat" + +#: ../src\gui\dialogs\configuration.py:57 +msgid "Activate Sapi5 when any other screen reader is not being run" +msgstr "Käytä SAPI5:tä, kun ruudunlukuohjelma ei ole käytössä" + +#: ../src\gui\dialogs\configuration.py:60 +msgid "Activate the auto-start of the invisible interface" +msgstr "Ota käyttöön näkymättömän käyttöliittymän automaattinen käynnistys" + +#: ../src\gui\dialogs\configuration.py:64 +msgid "" +"API calls when the stream is started (One API call equals to 200 tweetts, " +"two API calls equals 400 tweets, etc):" +msgstr "" +"API-kutsuja virran käynnistyttyä (1 = 200 twiittiä, 2 = 400 twiittiä jne.):" + +#: ../src\gui\dialogs\configuration.py:72 +msgid "Items on each API call" +msgstr "Kohteita kussakin API-kutsussa" + +#: ../src\gui\dialogs\configuration.py:79 +msgid "" +"Inverted buffers: The newest tweets will be shown at the beginning of the " +"lists while the oldest at the end" +msgstr "" +"Käänteiset puskurit: Uusimmat twiitit näytetään listojen alussa ja vanhat " +"lopussa" + +#: ../src\gui\dialogs\configuration.py:94 +msgid "Show followers" +msgstr "Näytä seuraajat" + +#: ../src\gui\dialogs\configuration.py:97 +msgid "Show friends" +msgstr "Näytä kaverit" + +#: ../src\gui\dialogs\configuration.py:100 +msgid "Show favourites" +msgstr "Näytä suosikit" + +#: ../src\gui\dialogs\configuration.py:103 +msgid "Show blocked users" +msgstr "Näytä estetyt käyttäjät" + +#: ../src\gui\dialogs\configuration.py:106 +msgid "Show muted users" +msgstr "Näytä mykistetyt käyttäjät" + +#: ../src\gui\dialogs\configuration.py:109 +msgid "Show events" +msgstr "Näytä tapahtumat" + +#: ../src\gui\dialogs\configuration.py:119 +#: ../src\gui\dialogs\configuration.py:267 +msgid "Ignored clients" +msgstr "Ohitettavat asiakasohjelmat" + +#: ../src\gui\dialogs\configuration.py:125 +msgid "Add client" +msgstr "Lisää" + +#: ../src\gui\dialogs\configuration.py:126 +msgid "Remove client" +msgstr "Poista" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Add a new ignored client" +msgstr "Lisää uusi ohitettava asiakasohjelma" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Enter the name of the client here" +msgstr "Syötä asiakasohjelman nimi tähän" + +#: ../src\gui\dialogs\configuration.py:154 +msgid "Volume" +msgstr "Äänenvoimakkuus" + +#: ../src\gui\dialogs\configuration.py:163 +msgid "Global mute" +msgstr "Yleismykistys" + +#: ../src\gui\dialogs\configuration.py:167 +msgid "Output device" +msgstr "Ulostulolaite" + +#: ../src\gui\dialogs\configuration.py:176 +msgid "Input device" +msgstr "Sisääntulolaite" + +#: ../src\gui\dialogs\configuration.py:184 +msgid "" +"If you've got a SndUp account, enter your API Key here. Whether the API Key " +"is wrong, the App will fail to upload anything to the server. Whether " +"there's no API Key here, then the audio files will be uploaded anonimously" +msgstr "" +"Mikäli sinulla on SndUp-tili, kirjoita API-avaimesi tähän. Jos API-avain on " +"väärin, sovellus ei voi lähettää palvelimelle mitään. Ellei API-avainta " +"anneta, äänitiedostot lähetetään nimettömänä." + +#: ../src\gui\dialogs\configuration.py:197 +msgid "Sound pack" +msgstr "Äänipaketti" + +#: ../src\gui\dialogs\configuration.py:213 +#: ../src\gui\dialogs\configuration.py:237 +msgid "Unlink your Dropbox account" +msgstr "Poista Dropbox-tilin liitos" + +#: ../src\gui\dialogs\configuration.py:215 +#: ../src\gui\dialogs\configuration.py:232 +#: ../src\gui\dialogs\configuration.py:240 +#: ../src\gui\dialogs\configuration.py:244 +#: ../src\gui\dialogs\configuration.py:251 +msgid "Link your Dropbox account" +msgstr "Liitä Dropbox-tili" + +#: ../src\gui\dialogs\configuration.py:225 +msgid "" +"The authorisation request will be shown on your browser. Copy the code tat " +"Dropbox will provide and, in the text box that will appear on TW Blue, paste " +"it. This code is necessary to continue. You only need to do it once." +msgstr "" +"Valtuutuspyyntö näytetään selaimessa. Kopioi Dropboxin antama koodi ja " +"liitä se TW Bluessa olevaan tekstikenttään. Tämä koodi on välttämätön " +"Dropbox-tilin liittämiseksi. Sinun tarvitsee tehdä tämä vain kerran." + +#: ../src\gui\dialogs\configuration.py:225 ../src\sessionmanager\gui.py:83 +msgid "Authorisation" +msgstr "Käyttäjän varmistus" + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Enter the code here." +msgstr "Syötä koodi tähän." + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Verification code" +msgstr "Vahvistuskoodi" + +#: ../src\gui\dialogs\configuration.py:239 +msgid "Error during authorisation. Try again later." +msgstr "Valtuutuksessa tapahtui virhe. Yritä myöhemmin uudelleen." + +#: ../src\gui\dialogs\configuration.py:239 ../src\gui\main.py:718 +#: ../src\gui\main.py:749 +msgid "Error!" +msgstr "Virhe!" + +#: ../src\gui\dialogs\configuration.py:258 +msgid "TW Blue preferences" +msgstr "TW Bluen asetukset" + +#: ../src\gui\dialogs\configuration.py:262 ../src\issueReporter\gui.py:30 +msgid "General" +msgstr "Yleiset" + +#: ../src\gui\dialogs\configuration.py:265 +msgid "Show other buffers" +msgstr "Näytä muut puskurit" + +#: ../src\gui\dialogs\configuration.py:269 +msgid "Sound" +msgstr "Ääni" + +#: ../src\gui\dialogs\configuration.py:271 +msgid "Audio Services" +msgstr "Äänipalvelut" + +#: ../src\gui\dialogs\configuration.py:274 +msgid "Save" +msgstr "Tallenna" + +#: ../src\gui\dialogs\configuration.py:277 ../src\gui\dialogs\follow.py:64 +#: ../src\gui\dialogs\message.py:182 ../src\gui\dialogs\message.py:269 +#: ../src\gui\dialogs\message.py:352 ../src\gui\dialogs\search.py:42 +#: ../src\gui\dialogs\show_user.py:42 ../src\gui\dialogs\update_profile.py:56 +#: ../src\gui\dialogs\utils.py:42 ../src\keystrokeEditor\gui.py:26 +msgid "Close" +msgstr "Sulje" + +#: ../src\gui\dialogs\configuration.py:290 ../src\gui\main.py:272 +msgid "Followers" +msgstr "Seuraajat" + +#: ../src\gui\dialogs\configuration.py:304 +msgid "friends" +msgstr "Kaverit" + +#: ../src\gui\dialogs\configuration.py:318 +msgid "Favorites" +msgstr "Suosikit" + +#: ../src\gui\dialogs\configuration.py:332 ../src\gui\main.py:290 +msgid "Events" +msgstr "Tapahtumat" + +#: ../src\gui\dialogs\configuration.py:343 ../src\gui\main.py:282 +msgid "Blocked users" +msgstr "Estetyt käyttäjät" + +#: ../src\gui\dialogs\configuration.py:357 ../src\gui\main.py:286 +msgid "Muted users" +msgstr "Mykistetyt käyttäjät" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "Restart TW Blue" +msgstr "Käynnistä TW Blue uudelleen" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "" +"The application requires to be restarted to save these changes. Press OK to " +"do it now." +msgstr "" +"Sovellus on käynnistettävä uudelleen, jotta muutokset voidaan tallentaa. " +"Hyväksy painamalla OK." + +#: ../src\gui\dialogs\follow.py:33 ../src\gui\dialogs\follow.py:43 +#: ../src\keystrokeEditor\gui.py:17 +msgid "Action" +msgstr "Toiminto" + +#: ../src\gui\dialogs\follow.py:44 ../src\gui\main.py:96 +msgid "Follow" +msgstr "Seuraa" + +#: ../src\gui\dialogs\follow.py:45 ../src\gui\main.py:98 +msgid "Unfollow" +msgstr "Lopeta seuraaminen" + +#: ../src\gui\dialogs\follow.py:46 ../src\gui\main.py:100 +#: ../src\gui\main.py:127 +msgid "Mute" +msgstr "Mykistä" + +#: ../src\gui\dialogs\follow.py:47 ../src\gui\main.py:102 +msgid "Unmute" +msgstr "Mykistys pois" + +#: ../src\gui\dialogs\follow.py:48 ../src\gui\main.py:106 +msgid "Block" +msgstr "Estä" + +#: ../src\gui\dialogs\follow.py:49 ../src\gui\main.py:108 +msgid "Unblock" +msgstr "Poista esto" + +#: ../src\gui\dialogs\follow.py:50 ../src\gui\main.py:104 +msgid "Report as spam" +msgstr "Ilmoita roskatwiittaajaksi" + +#: ../src\gui\dialogs\follow.py:61 ../src\gui\dialogs\search.py:40 +#: ../src\gui\dialogs\utils.py:39 ../src\keystrokeEditor\gui.py:76 +msgid "OK" +msgstr "OK" + +#: ../src\gui\dialogs\follow.py:101 +msgid "You've muted to %s" +msgstr "Olet mykistänyt aikajanan %s" + +#: ../src\gui\dialogs\follow.py:115 +msgid "You've unmuted to %s" +msgstr "Olet poistanut aikajanan %s mykistyksen" + +#: ../src\gui\dialogs\lists.py:36 ../src\gui\main.py:66 +msgid "Lists manager" +msgstr "Listojen hallinta" + +#: ../src\gui\dialogs\lists.py:38 ../src\gui\main.py:309 +msgid "Lists" +msgstr "Listat" + +#: ../src\gui\dialogs\lists.py:39 +msgid "List" +msgstr "Lista" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Members" +msgstr "Jäsenet" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Owner" +msgstr "Omistaja" + +#: ../src\gui\dialogs\lists.py:39 +msgid "mode" +msgstr "tila" + +#: ../src\gui\dialogs\lists.py:39 ../src\gui\dialogs\lists.py:181 +msgid "Description" +msgstr "Kuvaus" + +#: ../src\gui\dialogs\lists.py:44 ../src\gui\dialogs\lists.py:173 +msgid "Create a new list" +msgstr "Luo uusi lista" + +#: ../src\gui\dialogs\lists.py:46 ../src\keystrokeEditor\gui.py:22 +msgid "Edit" +msgstr "Muokkaa" + +#: ../src\gui\dialogs\lists.py:48 ../src\gui\dialogs\lists.py:235 +msgid "Remove" +msgstr "Poista" + +#: ../src\gui\dialogs\lists.py:50 +msgid "Open in buffer" +msgstr "Avaa puskurissa" + +#: ../src\gui\dialogs\lists.py:125 +msgid "List opened" +msgstr "Lista avattu" + +#: ../src\gui\dialogs\lists.py:127 +msgid "This list is arready opened." +msgstr "Tämä lista on jo avattu." + +#: ../src\gui\dialogs\lists.py:130 ../src\gui\main.py:312 +msgid "List for %s" +msgstr "Käyttäjän %s lista" + +#: ../src\gui\dialogs\lists.py:148 +msgid "Viewing lists for %s" +msgstr "Näytetään käytäjän %s listat" + +#: ../src\gui\dialogs\lists.py:149 +msgid "Subscribe" +msgstr "Tilaa" + +#: ../src\gui\dialogs\lists.py:150 +msgid "Unsubscribe" +msgstr "Peruuta tilaus" + +#: ../src\gui\dialogs\lists.py:176 +msgid "Name (20 characters maximun)" +msgstr "Nimi (enintään 20 merkkiä)" + +#: ../src\gui\dialogs\lists.py:186 +msgid "Mode" +msgstr "Tila" + +#: ../src\gui\dialogs\lists.py:187 +msgid "Public" +msgstr "Julkinen" + +#: ../src\gui\dialogs\lists.py:188 +msgid "Private" +msgstr "Yksityinen" + +#: ../src\gui\dialogs\lists.py:208 +msgid "Editing the list %s" +msgstr "Muokataan listaa %s" + +#: ../src\gui\dialogs\lists.py:219 +msgid "Select a list to add the user" +msgstr "Valitse lista, johon käyttäjä lisätään" + +#: ../src\gui\dialogs\lists.py:220 +msgid "Add" +msgstr "Lisää" + +#: ../src\gui\dialogs\lists.py:234 +msgid "Select a list to remove the user" +msgstr "Valitse lista, josta käyttäjä poistetaan" + +#: ../src\gui\dialogs\message.py:42 ../src\keystrokeEditor\constants.py:11 +msgid "New tweet" +msgstr "Uusi twiitti" + +#: ../src\gui\dialogs\message.py:76 +msgid "Attaching..." +msgstr "Lisätään liitteeksi..." + +#: ../src\gui\dialogs\message.py:77 +msgid "Uploading..." +msgstr "Lähetetään..." + +#: ../src\gui\dialogs\message.py:96 +msgid "Unable to upload the audio" +msgstr "Äänitiedostoa ei voi lähettää" + +#: ../src\gui\dialogs\message.py:110 ../src\gui\dialogs\message.py:395 +msgid "Translated" +msgstr "Käännetty" + +#: ../src\gui\dialogs\message.py:122 +msgid "There's no URL to be shortened" +msgstr "Lyhennettävää URL-osoitetta ei ole" + +#: ../src\gui\dialogs\message.py:125 +msgid "URL shortened" +msgstr "URL-osoite lyhennetty" + +#: ../src\gui\dialogs\message.py:133 ../src\gui\dialogs\message.py:407 +msgid "There's no URL to be expanded" +msgstr "Laajennettavaa URL-osoitetta ei ole" + +#: ../src\gui\dialogs\message.py:136 ../src\gui\dialogs\message.py:410 +msgid "URL expanded" +msgstr "URL-osoite laajennettu" + +#: ../src\gui\dialogs\message.py:164 ../src\gui\dialogs\message.py:219 +#: ../src\gui\dialogs\update_profile.py:51 +#: ../src\gui\dialogs\update_profile.py:88 +msgid "Upload a picture" +msgstr "Lähetä kuva" + +#: ../src\gui\dialogs\message.py:167 ../src\gui\dialogs\message.py:254 +#: ../src\gui\dialogs\message.py:345 +msgid "Spelling correction" +msgstr "Oikeinkirjoituksen tarkistus" + +#: ../src\gui\dialogs\message.py:171 ../src\gui\dialogs\message.py:258 +msgid "Shorten URL" +msgstr "Lyhennä URL" + +#: ../src\gui\dialogs\message.py:173 ../src\gui\dialogs\message.py:260 +#: ../src\gui\dialogs\message.py:347 +msgid "Expand URL" +msgstr "Laajenna URL" + +#: ../src\gui\dialogs\message.py:179 ../src\gui\dialogs\message.py:266 +msgid "Send" +msgstr "Lähetä" + +#: ../src\gui\dialogs\message.py:215 ../src\gui\dialogs\message.py:226 +#: ../src\gui\dialogs\update_profile.py:84 +#: ../src\gui\dialogs\update_profile.py:95 +msgid "Discard image" +msgstr "Hylkää kuva" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" +msgstr "Kuvatiedostot (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Select the picture to be uploaded" +msgstr "Valitse lähetettävä kuva" + +#: ../src\gui\dialogs\message.py:248 +msgid "Recipient" +msgstr "Vastaanottaja" + +#: ../src\gui\dialogs\message.py:303 +msgid "Mention to all" +msgstr "Maininta kaikille" + +#: ../src\gui\dialogs\message.py:330 +msgid "Tweet - %i characters " +msgstr "Twiitti - %i merkkiä " + +#: ../src\gui\dialogs\search.py:26 +msgid "Search on Twitter" +msgstr "Etsi Twitteristä" + +#: ../src\gui\dialogs\search.py:27 ../src\gui\main.py:64 +msgid "Search" +msgstr "Haku" + +#: ../src\gui\dialogs\search.py:34 +msgid "Tweets" +msgstr "Twiitit" + +#: ../src\gui\dialogs\search.py:35 +msgid "Users" +msgstr "Käyttäjät" + +#: ../src\gui\dialogs\show_user.py:26 +msgid "Information for %s" +msgstr "Käyttäjän %s tiedot" + +#: ../src\gui\dialogs\show_user.py:30 +msgid "Details" +msgstr "Tiedot" + +#: ../src\gui\dialogs\show_user.py:39 +msgid "Go to URL" +msgstr "Siirry URL-osoitteeseen" + +#: ../src\gui\dialogs\show_user.py:63 +msgid "This user does not exist on Twitter" +msgstr "Tätä käyttäjää ei ole Twitterissä" + +#: ../src\gui\dialogs\show_user.py:68 +msgid "Username: @%s\n" +msgstr "Käyttäjänimi: @%s\n" + +#: ../src\gui\dialogs\show_user.py:69 +msgid "Name: %s\n" +msgstr "Nimi: %s\n" + +#: ../src\gui\dialogs\show_user.py:71 +msgid "Location: %s\n" +msgstr "Sijainti: %s\n" + +#: ../src\gui\dialogs\show_user.py:73 +msgid "URL: %s\n" +msgstr "URL: %s\n" + +#: ../src\gui\dialogs\show_user.py:76 +msgid "Bio: %s\n" +msgstr "Kuvaus: %s\n" + +#: ../src\gui\dialogs\show_user.py:77 +msgid "Yes" +msgstr "Kyllä" + +#: ../src\gui\dialogs\show_user.py:78 +msgid "No" +msgstr "Ei" + +#: ../src\gui\dialogs\show_user.py:79 +msgid "Protected: %s\n" +msgstr "Suojattu: %s\n" + +#: ../src\gui\dialogs\show_user.py:80 +msgid "" +"Followers: %s\n" +" Friends: %s\n" +msgstr "" +"Seuraajia: %s\n" +" Friends: %s\n" + +#: ../src\gui\dialogs\show_user.py:81 +msgid "Tweets: %s\n" +msgstr "Twiittejä: %s\n" + +#: ../src\gui\dialogs\show_user.py:82 +msgid "Favourites: %s" +msgstr "Suosikkeja: %s" + +#: ../src\gui\dialogs\update_profile.py:27 +msgid "Update your profile" +msgstr "Päivitä profiilisi" + +#: ../src\gui\dialogs\update_profile.py:29 +msgid "Name (20 characters maximum)" +msgstr "Nimi (enintään 20 merkkiä)" + +#: ../src\gui\dialogs\update_profile.py:35 +msgid "Location" +msgstr "Sijainti" + +#: ../src\gui\dialogs\update_profile.py:40 +msgid "Website" +msgstr "Verkkosivu" + +#: ../src\gui\dialogs\update_profile.py:45 +msgid "Bio (160 characters maximum)" +msgstr "Kuvaus (enintään 160 merkkiä)" + +#: ../src\gui\dialogs\update_profile.py:53 ../src\gui\main.py:60 +#: ../src\gui\sysTrayIcon.py:38 +msgid "Update profile" +msgstr "Päivitä profiili" + +#: ../src\gui\dialogs\urlList.py:26 +msgid "Select an URL" +msgstr "Valitse URL" + +#: ../src\gui\main.py:62 +msgid "Hide window" +msgstr "Piilota ikkuna" + +#: ../src\gui\main.py:70 +msgid "Edit keystrokes" +msgstr "Muokkaa näppäinkomentoja" + +#: ../src\gui\main.py:72 ../src\gui\sysTrayIcon.py:36 +msgid "Preferences" +msgstr "Asetukset" + +#: ../src\gui\main.py:74 ../src\gui\main.py:597 ../src\gui\sysTrayIcon.py:46 +msgid "Exit" +msgstr "Lopeta" + +#: ../src\gui\main.py:85 +msgid "Add to favourites" +msgstr "Lisää suosikkeihin" + +#: ../src\gui\main.py:87 ../src\keystrokeEditor\constants.py:16 +msgid "Remove from favourites" +msgstr "Poista suosikeista" + +#: ../src\gui\main.py:89 ../src\keystrokeEditor\constants.py:19 +msgid "Show tweet" +msgstr "Näytä twiitti" + +#: ../src\gui\main.py:112 ../src\keystrokeEditor\constants.py:36 +msgid "Add to list" +msgstr "Lisää listaan" + +#: ../src\gui\main.py:114 ../src\keystrokeEditor\constants.py:37 +msgid "Remove from list" +msgstr "Poista listasta" + +#: ../src\gui\main.py:116 +msgid "View lists" +msgstr "Näytä listat" + +#: ../src\gui\main.py:118 +msgid "Show user profile" +msgstr "Näytä käyttäjän profiili" + +#: ../src\gui\main.py:120 +msgid "Timeline" +msgstr "Aikajana" + +#: ../src\gui\main.py:122 +msgid "View favourites" +msgstr "Näytä suosikit" + +#: ../src\gui\main.py:129 +msgid "Autoread tweets for this buffer" +msgstr "Lue tämän puskurin twiitit automaattisesti" + +#: ../src\gui\main.py:131 +msgid "Clear buffer" +msgstr "Tyhjennä puskuri" + +#: ../src\gui\main.py:133 ../src\keystrokeEditor\constants.py:22 +msgid "Remove buffer" +msgstr "Poista puskuri" + +#: ../src\gui\main.py:138 ../src\gui\sysTrayIcon.py:42 +msgid "Documentation" +msgstr "Ohje" + +#: ../src\gui\main.py:140 +msgid "What's new in this version?" +msgstr "Mitä uutta tässä versiossa?" + +#: ../src\gui\main.py:142 ../src\gui\sysTrayIcon.py:44 +msgid "Check for updates" +msgstr "Tarkista päivitykset" + +#: ../src\gui\main.py:144 ../src\issueReporter\gui.py:34 +msgid "Report an error" +msgstr "Ilmoita virheestä" + +#: ../src\gui\main.py:146 +msgid "TW Blue website" +msgstr "TW Bluen verkkosivu" + +#: ../src\gui\main.py:148 +msgid "About TW Blue" +msgstr "Tietoja TW Bluesta" + +#: ../src\gui\main.py:152 +msgid "Application" +msgstr "Sovellus" + +#: ../src\gui\main.py:155 +msgid "Buffer" +msgstr "Puskuri" + +#: ../src\gui\main.py:156 +msgid "Help" +msgstr "Ohje" + +#: ../src\gui\main.py:249 +msgid "Home" +msgstr "Koti" + +#: ../src\gui\main.py:254 +msgid "Mentions" +msgstr "Maininnat" + +#: ../src\gui\main.py:257 +msgid "Direct messages" +msgstr "Yksityisviestit" + +#: ../src\gui\main.py:260 +msgid "Sent" +msgstr "Lähetetyt" + +#: ../src\gui\main.py:266 +msgid "Favourites" +msgstr "Suosikit" + +#: ../src\gui\main.py:278 +msgid "Friends" +msgstr "Kaverit" + +#: ../src\gui\main.py:293 +msgid "Searches" +msgstr "Haut" + +#: ../src\gui\main.py:303 +msgid "Timelines" +msgstr "Aikajanat" + +#: ../src\gui\main.py:306 ../src\gui\main.py:714 +msgid "Timeline for %s" +msgstr "Käyttäjän %s aikajana" + +#: ../src\gui\main.py:317 +msgid "Favourites timelines" +msgstr "Suosikkien aikajanat" + +#: ../src\gui\main.py:320 ../src\gui\main.py:745 +msgid "Favourites for %s" +msgstr "Käyttäjän %s suosikit" + +#: ../src\gui\main.py:361 +msgid "Ready" +msgstr "Valmis" + +#: ../src\gui\main.py:388 +msgid "%s favourites from %s" +msgstr "%s suosikkia käyttäjältä %s" + +#: ../src\gui\main.py:435 +msgid "Streams disconnected. TW Blue will try to reconnect in a minute." +msgstr "" +"Virtojen yhteys katkaistu. TW Blue yrittää yhdistää uudelleen hetken " +"kuluttua." + +#: ../src\gui\main.py:439 +msgid "Reconnecting streams..." +msgstr "Yhdistetään virrat uudelleen..." + +#: ../src\gui\main.py:463 +msgid "search for %s" +msgstr "Etsi termiä %s" + +#: ../src\gui\main.py:468 +msgid "search users for %s" +msgstr "Etsi käyttäjää %s" + +#: ../src\gui\main.py:479 ../src\gui\main.py:490 ../src\gui\main.py:509 +msgid "Select the user" +msgstr "Valitse käyttäjä" + +#: ../src\gui\main.py:569 +msgid "User details" +msgstr "Käyttäjän tiedot" + +#: ../src\gui\main.py:577 +msgid "" +"Do you really want to delete this message? It will be eliminated from " +"Twitter as well." +msgstr "" +"Haluatko varmasti poistaa tämän viestin? Se poistetaan myös Twitteristä." + +#: ../src\gui\main.py:597 +msgid "Do you really want to close TW Blue?" +msgstr "Haluatko varmasti sulkea TW Bluen?" + +#: ../src\gui\main.py:687 +msgid "Error while adding to favourites." +msgstr "Virhe lisättäessä suosikkeihin." + +#: ../src\gui\main.py:695 +msgid "Error while removing from favourites." +msgstr "Virhe poistettaessa suosikeista." + +#: ../src\gui\main.py:699 +msgid "Individual timeline" +msgstr "Käyttäjän aikajana" + +#: ../src\gui\main.py:703 ../src\gui\main.py:734 +msgid "The user does not exist" +msgstr "Käyttäjää ei ole" + +#: ../src\gui\main.py:709 +msgid "Existing timeline" +msgstr "Nykyinen aikajana" + +#: ../src\gui\main.py:709 +msgid "" +"There's currently a timeline for this user. You are not able to open another" +msgstr "Tälle käyttäjälle on jo aikajana. Et voi avata toista." + +#: ../src\gui\main.py:718 +msgid "This user has no tweets. You can't open a timeline for this user" +msgstr "Tällä käyttäjällä ei ole twiittejä. Aikajanaa ei voi avata." + +#: ../src\gui\main.py:730 +msgid "List of favourites" +msgstr "Suosikkilista" + +#: ../src\gui\main.py:740 +msgid "Existing list" +msgstr "Nykyinen lista" + +#: ../src\gui\main.py:740 +msgid "" +"There's already a list of favourites for this user. You can't create another." +msgstr "Tälle käyttäjälle on jo suosikkilista. Et voi luoda toista." + +#: ../src\gui\main.py:749 +msgid "" +"This user has no favourites. You can't create a list of favourites for this " +"user." +msgstr "Tällä käyttäjällä ei ole suosikkeja. Et voi luoda suosikkilistaa." + +#: ../src\gui\main.py:791 ../src\gui\main.py:804 +msgid "%s, %s of %s" +msgstr "%s, %s / %s" + +#: ../src\gui\main.py:793 ../src\gui\main.py:806 +msgid "%s. Empty" +msgstr "%s. Tyhjä" + +#: ../src\gui\main.py:829 +msgid "Global mute on" +msgstr "Yleismykistys päällä" + +#: ../src\gui\main.py:832 +msgid "Global mute off" +msgstr "Yleismykistys pois päältä" + +#: ../src\gui\main.py:838 +msgid "Buffer mute on" +msgstr "Puskurin mykistys päällä" + +#: ../src\gui\main.py:841 +msgid "Buffer mute off" +msgstr "Puskurin mykistys pois päältä" + +#: ../src\gui\main.py:847 +msgid "The auto-reading of new tweets is enabled for this buffer" +msgstr "Tämän puskurin uusien twiittien automaattinen lukeminen on käytössä" + +#: ../src\gui\main.py:850 +msgid "The auto-reading of new tweets is disabled for this buffer" +msgstr "" +"Tämän puskurin uusien twiittien automaattinen lukeminen ei ole käytössä" + +#: ../src\gui\main.py:857 +msgid "Copied" +msgstr "Kopioitu" + +#: ../src\gui\main.py:868 ../src\gui\main.py:877 +msgid "%s" +msgstr "%s" + +#: ../src\gui\sysTrayIcon.py:40 +msgid "Show / hide" +msgstr "Näytä / piilota" + +#: ../src\issueReporter\gui.py:31 +msgid "always" +msgstr "Aina" + +#: ../src\issueReporter\gui.py:31 +msgid "have not tried" +msgstr "en ole kokeillut" + +#: ../src\issueReporter\gui.py:31 +msgid "random" +msgstr "Satunnaisesti" + +#: ../src\issueReporter\gui.py:31 +msgid "sometimes" +msgstr "Toisinaan" + +#: ../src\issueReporter\gui.py:31 +msgid "unable to duplicate" +msgstr "Ei voi toistaa" + +#: ../src\issueReporter\gui.py:32 +msgid "block" +msgstr "Estä" + +#: ../src\issueReporter\gui.py:32 +msgid "crash" +msgstr "Kaatuminen" + +#: ../src\issueReporter\gui.py:32 +msgid "feature" +msgstr "Ominaisuus" + +#: ../src\issueReporter\gui.py:32 +msgid "major" +msgstr "Merkittävä" + +#: ../src\issueReporter\gui.py:32 +msgid "minor" +msgstr "Merkityksetön" + +#: ../src\issueReporter\gui.py:32 +msgid "text" +msgstr "Teksti" + +#: ../src\issueReporter\gui.py:32 +msgid "trivial" +msgstr "Epäolennainen" + +#: ../src\issueReporter\gui.py:32 +msgid "tweak" +msgstr "Hienosäätö" + +#: ../src\issueReporter\gui.py:37 +msgid "Select a category" +msgstr "Valitse kategoria" + +#: ../src\issueReporter\gui.py:46 +msgid "" +"Briefly describe what happened. You will be able to thoroughly explain it " +"later" +msgstr "" +"Kerro lyhyesti, mitä tapahtui. Voit kuvailla virhettä perusteellisesti " +"myöhemmin." + +#: ../src\issueReporter\gui.py:56 +msgid "Here, you can describe the bug in detail" +msgstr "Tässä voit kuvailla virhettä yksityiskohtaisesti" + +#: ../src\issueReporter\gui.py:66 +msgid "how often does this bug happen?" +msgstr "Kuinka usein tämä virhe esiintyy?" + +#: ../src\issueReporter\gui.py:74 +msgid "Select the importance that you think this bug has" +msgstr "Valitse tärkeys, joka on mielestäsi sopiva tälle virheelle" + +#: ../src\issueReporter\gui.py:82 +msgid "" +"I know that the TW Blue bug system will get my Twitter username to contact " +"me and fix the bug quickly" +msgstr "" +"Tiedän, että TW Bluen virheidenraportointijärjestelmä pääsee käsiksi Twitter-" +"käyttäjänimeeni, jotta minuun voidaan ottaa yhteyttä virheen nopeaa " +"korjaamista varten" + +#: ../src\issueReporter\gui.py:85 +msgid "Send report" +msgstr "Lähetä raportti" + +#: ../src\issueReporter\gui.py:98 +msgid "You must fill out both fields" +msgstr "Sinun on täytettävä molemmat kentät" + +#: ../src\issueReporter\gui.py:101 +msgid "" +"You need to mark the checkbox to provide us your twitter username to contact " +"to you if is necessary." +msgstr "" +"Sinun on valittava Twitter-käyttäjänimesi lähettämisen salliva valintaruutu, " +"jotta voimme ottaa tarvittaessa yhteyttä." + +#: ../src\issueReporter\gui.py:120 +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 "" +"Kiitos, että ilmoitit tästä virheestä! Saatat ehkä nähdä sen korjattuna " +"tulevien versioiden muutoslistoissa. Ilmoittamasi virheen numero on %i." + +#: ../src\issueReporter\gui.py:120 +msgid "reported" +msgstr "ilmoitettu" + +#: ../src\issueReporter\gui.py:123 +msgid "Error while reporting" +msgstr "Virhe ilmoitettaessa virheestä" + +#: ../src\issueReporter\gui.py:123 +msgid "" +"Something unexpected occurred while trying to report the bug. Please, try " +"again later" +msgstr "" +"Jotain odottamatonta tapahtui yritettäessä ilmoittaa virheestä. Yritä " +"myöhemmin uudelleen." + +#: ../src\keystrokeEditor\constants.py:4 +msgid "Go up up on the current list" +msgstr "Siirry ylöspäin nykyisessä listassa" + +#: ../src\keystrokeEditor\constants.py:5 +msgid "Go down up on the current list" +msgstr "Siirry alaspäin nykyisessä listassa" + +#: ../src\keystrokeEditor\constants.py:6 +msgid "Go to the previous tab" +msgstr "Siirry edelliselle välilehdelle" + +#: ../src\keystrokeEditor\constants.py:7 +msgid "Go to the next tab" +msgstr "Siirry seuraavalle välilehdelle" + +#: ../src\keystrokeEditor\constants.py:8 +msgid "Move up one tweet in the conversation" +msgstr "Siirry keskustelussa yksi twiitti ylöspäin" + +#: ../src\keystrokeEditor\constants.py:9 +msgid "Move down one tweet in the conversation" +msgstr "Siirry keskustelussa yksi twiitti alaspäin" + +#: ../src\keystrokeEditor\constants.py:10 +msgid "Show the graphical interface" +msgstr "Näytä graafinen käyttöliittymä" + +#: ../src\keystrokeEditor\constants.py:12 +msgid "Reply to a tweet" +msgstr "Vastaa twiittiin" + +#: ../src\keystrokeEditor\constants.py:14 +msgid "Send direct message" +msgstr "Lähetä yksityisviesti" + +#: ../src\keystrokeEditor\constants.py:15 +msgid "Mark as favourite" +msgstr "Merkitse suosikiksi" + +#: ../src\keystrokeEditor\constants.py:17 +msgid "Open the actions dialogue" +msgstr "Avaa Toiminnot-valintaikkuna" + +#: ../src\keystrokeEditor\constants.py:18 +msgid "See user details" +msgstr "Näytä käyttäjän tiedot" + +#: ../src\keystrokeEditor\constants.py:20 +msgid "Quit" +msgstr "Lopeta" + +#: ../src\keystrokeEditor\constants.py:21 +msgid "Open user timeline" +msgstr "Avaa käyttäjän aikajana" + +#: ../src\keystrokeEditor\constants.py:23 +msgid "" +"Open URL on the current tweet, or further information for a friend or " +"follower" +msgstr "" +"Avaa nykyisen twiitin sisältämä URL-osoite tai lisätiedot kaverista tai " +"seuraajasta" + +#: ../src\keystrokeEditor\constants.py:24 +msgid "Attempt to play audio" +msgstr "Yritetään toistaa ääntä" + +#: ../src\keystrokeEditor\constants.py:25 +msgid "Increase volume by 5%" +msgstr "Lisää äänenvoimakkuutta 5%" + +#: ../src\keystrokeEditor\constants.py:26 +msgid "Decrease volume by 5%" +msgstr "Vähennä äänenvoimakkuutta 5%" + +#: ../src\keystrokeEditor\constants.py:27 +msgid "Go to the first element on the list" +msgstr "Siirry listan ensimmäiseen kohteeseen" + +#: ../src\keystrokeEditor\constants.py:28 +msgid "Go to the last element on the list" +msgstr "Siirry listan viimeiseen kohteeseen" + +#: ../src\keystrokeEditor\constants.py:29 +msgid "Move 20 elements up on the current list" +msgstr "Siirry 20 kohdetta ylöspäin nykyisessä listassa" + +#: ../src\keystrokeEditor\constants.py:30 +msgid "Move 20 elements down on the current list" +msgstr "Siirry 20 kohdetta alaspäin nykyisessä listassa" + +#: ../src\keystrokeEditor\constants.py:31 +msgid "Edit profile" +msgstr "Muokkaa profiilia" + +#: ../src\keystrokeEditor\constants.py:32 +msgid "Remove a tweet or direct message" +msgstr "Poista twiitti tai yksityisviesti" + +#: ../src\keystrokeEditor\constants.py:33 +msgid "Empty the buffer removing all the elements" +msgstr "Tyhjennä puskuri poistamalla kaikki kohteet" + +#: ../src\keystrokeEditor\constants.py:34 +msgid "Listen the current message" +msgstr "Kuuntele nykyinen viesti" + +#: ../src\keystrokeEditor\constants.py:35 +msgid "Copy to clipboard" +msgstr "Kopioi leikepöydälle" + +#: ../src\keystrokeEditor\constants.py:38 +msgid "Mutes/unmutes the active buffer" +msgstr "Mykistää aktiivisen puskurin tai poistaa sen mykistyksen" + +#: ../src\keystrokeEditor\constants.py:39 +msgid "Globally mute/unmute TW Blue" +msgstr "Ota käyttöön TW Bluen yleismykistys tai poista se käytöstä" + +#: ../src\keystrokeEditor\constants.py:40 +msgid "toggles the automatic reading of incoming tweets in the active buffer" +msgstr "" +"Ottaa käyttöön tai poistaa käytöstä saapuvien twiittien automaattisen " +"lukemisen aktiivisessa puskurissa" + +#: ../src\keystrokeEditor\constants.py:41 +msgid "Search on twitter" +msgstr "Etsi Twitteristä" + +#: ../src\keystrokeEditor\constants.py:42 +msgid "Shows the keystroke editor" +msgstr "Avaa näppäinkomentojen editorin" + +#: ../src\keystrokeEditor\constants.py:43 +msgid "Show lists for a specified user" +msgstr "Näytä valitun käyttäjän listat" + +#: ../src\keystrokeEditor\gui.py:10 +msgid "Keystroke editor" +msgstr "Näppäinkomentojen editori" + +#: ../src\keystrokeEditor\gui.py:16 +msgid "Select a keystroke to edit" +msgstr "Valitse muokattava näppäinkomento" + +#: ../src\keystrokeEditor\gui.py:17 +msgid "Keystroke" +msgstr "Näppäinkomento" + +#: ../src\keystrokeEditor\gui.py:54 +msgid "Editing keystroke" +msgstr "Muokataan näppäinkomentoa" + +#: ../src\keystrokeEditor\gui.py:61 +msgid "Control" +msgstr "Control" + +#: ../src\keystrokeEditor\gui.py:62 +msgid "Alt" +msgstr "Alt" + +#: ../src\keystrokeEditor\gui.py:63 +msgid "Shift" +msgstr "Shift" + +#: ../src\keystrokeEditor\gui.py:64 +msgid "Windows" +msgstr "Windows" + +#: ../src\keystrokeEditor\gui.py:70 +msgid "Key" +msgstr "Näppäin" + +#: ../src\keystrokeEditor\gui.py:99 +msgid "You need to use the Windows key" +msgstr "Sinun on käytettävä Windows-näppäintä" + +#: ../src\keystrokeEditor\gui.py:99 ../src\keystrokeEditor\gui.py:112 +msgid "Invalid keystroke" +msgstr "Virheellinen näppäinkomento" + +#: ../src\keystrokeEditor\gui.py:112 +msgid "You must provide a character for the keystroke" +msgstr "Sinun on annettava jokin merkki näppäinkomennolle" + +#: ../src\languageHandler.py:95 +msgid "User default" +msgstr "Käyttäjän oletus" + +#: ../src\sessionmanager\gui.py:19 +msgid "Session manager" +msgstr "Istunnon hallinta" + +#: ../src\sessionmanager\gui.py:23 +msgid "Select a twitter account to start TW Blue" +msgstr "Valitse TW Bluessa käytettävä Twitter-tili" + +#: ../src\sessionmanager\gui.py:25 +msgid "Account" +msgstr "Tili" + +#: ../src\sessionmanager\gui.py:30 +msgid "New account" +msgstr "Uusi tili" + +#: ../src\sessionmanager\gui.py:67 +msgid "Account Error" +msgstr "Tilivirhe" + +#: ../src\sessionmanager\gui.py:67 +msgid "You need to configure an account." +msgstr "Sinun on määritettävä tili." + +#: ../src\sessionmanager\gui.py:83 +msgid "" +"The request for the required Twitter authorization to continue will be " +"opened on your browser. You only need to do it once. Would you like to " +"autorhise a new account now?" +msgstr "" +"Twitterin valtuutuspyyntö avataan selaimessa. Sinun tarvitsee hyväksyä se " +"vain kerran. Haluatko valtuuttaa nyt uuden tilin?" + +#: ../src\sessionmanager\gui.py:94 +msgid "Invalid user token" +msgstr "Virheellinen käyttäjätunniste" + +#: ../src\sessionmanager\gui.py:94 +msgid "" +"Your access token is invalid or the authorisation has failed. Please try " +"again." +msgstr "" +"Pääsytunnisteesi on virheellinen tai valtuutus epäonnistui. Yritä uudelleen." + +#: ../src\sessionmanager\gui.py:97 +msgid "Authorised account %d" +msgstr "Valtuutettu tili %d" + +#: ../src\twitter\buffers\indibidual.py:26 +msgid "One tweet from %s" +msgstr "Yksi twiitti käyttäjältä %s" + +#: ../src\twitter\buffers\indibidual.py:35 +msgid "One tweet from %s in the list %s" +msgstr "Yksi twiitti käyttäjältä %s listassa %s" + +#: ../src\twitter\buffers\stream.py:57 +msgid "One mention from %s " +msgstr "Yksi maininta käyttäjältä %s " + +#: ../src\twitter\buffers\stream.py:69 +msgid "One direct message" +msgstr "Yksi yksityisviesti" + +#: ../src\twitter\compose.py:22 +msgid "About a week ago" +msgstr "Noin viikko sitten" + +#: ../src\twitter\compose.py:24 +msgid "About {} weeks ago" +msgstr "Noin {} viikkoa sitten" + +#: ../src\twitter\compose.py:26 +msgid "A month ago" +msgstr "Kuukausi sitten" + +#: ../src\twitter\compose.py:28 +msgid "About {} months ago" +msgstr "Noin {} kuukautta sitten" + +#: ../src\twitter\compose.py:30 +msgid "About a year ago" +msgstr "Noin vuosi sitten" + +#: ../src\twitter\compose.py:32 +msgid "About {} years ago" +msgstr "Noin {} vuotta sitten" + +#: ../src\twitter\compose.py:34 +msgid "About 1 day ago" +msgstr "Noin päivä sitten" + +#: ../src\twitter\compose.py:36 +msgid "About {} days ago" +msgstr "Noin {} päivää sitten" + +#: ../src\twitter\compose.py:38 +msgid "just now" +msgstr "paraikaa" + +#: ../src\twitter\compose.py:40 +msgid "{} seconds ago" +msgstr "{} sekuntia sitten" + +#: ../src\twitter\compose.py:42 +msgid "1 minute ago" +msgstr "minuutti sitten" + +#: ../src\twitter\compose.py:44 +msgid "{} minutes ago" +msgstr "{} minuuttia sitten" + +#: ../src\twitter\compose.py:46 +msgid "About 1 hour ago" +msgstr "Noin tunti sitten" + +#: ../src\twitter\compose.py:48 +msgid "About {} hours ago" +msgstr "Noin {} tuntia sitten" + +#: ../src\twitter\compose.py:52 +msgid "January" +msgstr "tammikuu" + +#: ../src\twitter\compose.py:53 +msgid "February" +msgstr "helmikuu" + +#: ../src\twitter\compose.py:54 +msgid "March" +msgstr "maaliskuu" + +#: ../src\twitter\compose.py:55 +msgid "April" +msgstr "huhtikuu" + +#: ../src\twitter\compose.py:56 +msgid "May" +msgstr "toukokuu" + +#: ../src\twitter\compose.py:57 +msgid "June" +msgstr "kesäkuu" + +#: ../src\twitter\compose.py:58 +msgid "July" +msgstr "heinäkuu" + +#: ../src\twitter\compose.py:59 +msgid "August" +msgstr "elokuu" + +#: ../src\twitter\compose.py:60 +msgid "September" +msgstr "syyskuu" + +#: ../src\twitter\compose.py:61 +msgid "October" +msgstr "lokakuu" + +#: ../src\twitter\compose.py:62 +msgid "November" +msgstr "marraskuu" + +#: ../src\twitter\compose.py:63 +msgid "December" +msgstr "joulukuu" + +#: ../src\twitter\compose.py:66 +msgid "Sunday" +msgstr "sunnuntai" + +#: ../src\twitter\compose.py:67 +msgid "Monday" +msgstr "maanantai" + +#: ../src\twitter\compose.py:68 +msgid "Tuesday" +msgstr "tiistai" + +#: ../src\twitter\compose.py:69 +msgid "Wednesday" +msgstr "keskiviikko" + +#: ../src\twitter\compose.py:70 +msgid "Thursday" +msgstr "torstai" + +#: ../src\twitter\compose.py:71 +msgid "Friday" +msgstr "perjantai" + +#: ../src\twitter\compose.py:72 +msgid "Saturday" +msgstr "lauantai" + +#: ../src\twitter\compose.py:75 +msgid "sun" +msgstr "su" + +#: ../src\twitter\compose.py:76 +msgid "mon" +msgstr "ma" + +#: ../src\twitter\compose.py:77 +msgid "tue" +msgstr "ti" + +#: ../src\twitter\compose.py:78 +msgid "wed" +msgstr "ke" + +#: ../src\twitter\compose.py:79 +msgid "thu" +msgstr "to" + +#: ../src\twitter\compose.py:80 +msgid "fri" +msgstr "pe" + +#: ../src\twitter\compose.py:81 +msgid "sat" +msgstr "la" + +#: ../src\twitter\compose.py:85 +msgid "jan" +msgstr "tammi" + +#: ../src\twitter\compose.py:86 +msgid "feb" +msgstr "helmi" + +#: ../src\twitter\compose.py:87 +msgid "mar" +msgstr "maalis" + +#: ../src\twitter\compose.py:88 +msgid "apr" +msgstr "huhti" + +#: ../src\twitter\compose.py:89 +msgid "may" +msgstr "touko" + +#: ../src\twitter\compose.py:90 +msgid "jun" +msgstr "kesä" + +#: ../src\twitter\compose.py:91 +msgid "jul" +msgstr "heinä" + +#: ../src\twitter\compose.py:92 +msgid "aug" +msgstr "elo" + +#: ../src\twitter\compose.py:93 +msgid "sep" +msgstr "syys" + +#: ../src\twitter\compose.py:94 +msgid "oct" +msgstr "loka" + +#: ../src\twitter\compose.py:95 +msgid "nov" +msgstr "marras" + +#: ../src\twitter\compose.py:96 +msgid "dec" +msgstr "joulu" + +#: ../src\twitter\compose.py:152 +msgid "Dm to %s " +msgstr "Yksityisviesti käyttäjälle %s " + +#: ../src\twitter\compose.py:185 +msgid "Unavailable" +msgstr "Ei saatavilla" + +#: ../src\twitter\compose.py:186 +msgid "" +"%s (@%s). %s followers, %s friends, %s tweets. Last tweet on %s. Joined " +"Twitter on %s" +msgstr "" +"%s (@%s). %s seuraajaa, %s kaveria, %s twiittiä. Viimeisin twiitti %s. " +"Liittyi Twitteriin %s." + +#: ../src\twitter\compose.py:190 +msgid "You've blocked %s" +msgstr "Olet estänyt käyttäjän %s" + +#: ../src\twitter\compose.py:192 +msgid "You've unblocked %s" +msgstr "Olet lopettanut käyttäjän %s estämisen" + +#: ../src\twitter\compose.py:195 +msgid "%s(@%s) has followed you" +msgstr "Käyttäjä %s(@%s) seuraa sinua" + +#: ../src\twitter\compose.py:197 +msgid "You've followed %s(@%s)" +msgstr "Aloit seuraamaan käyttäjää %s (@%s)" + +#: ../src\twitter\compose.py:199 +msgid "You've unfollowed %s (@%s)" +msgstr "Lopetit käyttäjän %s (@%s) seuraamisen" + +#: ../src\twitter\compose.py:202 +msgid "You've added to favourites: %s, %s" +msgstr "Olet lisännyt suosikeihin käyttäjän: %s, %s" + +#: ../src\twitter\compose.py:204 +msgid "%s(@%s) has marked as favorite: %s" +msgstr "%s(@%s) on lisännyt suosikin: %s" + +#: ../src\twitter\compose.py:206 +msgid "You've removed from favourites: %s, %s" +msgstr "Olet poistanut suosikeista käyttäjän: %s, %s" + +#: ../src\twitter\compose.py:207 +msgid "%s(@%s) has removed from favourites: %s" +msgstr "Käyttäjä %s(@%s) on poistanut suosikeista käyttäjän: %s" + +#: ../src\twitter\compose.py:209 +msgid "You've created the list %s" +msgstr "Olet luonut listan %s" + +#: ../src\twitter\compose.py:211 +msgid "You've deleted the list %s" +msgstr "Olet poistanut listan %s" + +#: ../src\twitter\compose.py:213 +msgid "You've updated the list %s" +msgstr "Olet päivittänyt listan %s" + +#: ../src\twitter\compose.py:215 +msgid "You've added %s(@%s) to the list %s" +msgstr "Olet lisännyt käyttäjän %s(@%s) listaan %s" + +#: ../src\twitter\compose.py:216 +msgid "%s(@%s) has added you to the list %s" +msgstr "Käyttäjä %s(@%s) on lisännyt sinut listaan %s" + +#: ../src\twitter\compose.py:218 +msgid "You'be removed %s(@%s) from the list %s" +msgstr "Olet poistanut käyttäjän %s(@%s) listasta %s" + +#: ../src\twitter\compose.py:219 +msgid "%s(@%s) has removed you from the list %s" +msgstr "Käyttäjä %s(@%s) on poistanut sinut listasta %s" + +#: ../src\twitter\compose.py:221 +msgid "You've subscribed to the list %s, which is owned by %s(@%s)" +msgstr "Olet nyt listan %s tilaaja, jonka omistaa käyttäjä %s(@%s)" + +#: ../src\twitter\compose.py:222 +msgid "%s(@%s) has suscribed you to the list %s" +msgstr "Käyttäjä %s(@%s) on lisännyt sinut listan %s tilaajaksi" + +#: ../src\twitter\compose.py:224 +msgid "You've unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "Olet peruuttanut listan %s tilauksen, jonka omistaa käyttäjä %s(@%s)" + +#: ../src\twitter\compose.py:225 +msgid "You've been unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "Tilauksesi on peruttu listalta %s, jonka omistaa käyttäjä %s(@%s)" + +#: ../src\twitter\compose.py:226 +msgid "Unknown" +msgstr "Tuntematon" + +#: ../src\twitter\compose.py:232 +msgid "No description available" +msgstr "Kuvausta ei saatavilla" + +#: ../src\twitter\compose.py:236 +msgid "private" +msgstr "yksityinen" + +#: ../src\twitter\compose.py:237 +msgid "public" +msgstr "julkinen" + +#: ../src\twitter\twitter.py:73 +msgid "%s failed. Reason: %s" +msgstr "%s epäonnistui. Syy: %s" + +#: ../src\twitter\twitter.py:80 +msgid "%s succeeded." +msgstr "%s onnistui." + +#: ../src\updater\update_manager.py:14 +msgid "Your TW Blue version is up to date" +msgstr "Käyttämäsi TW Bluen versio on ajan tasalla" + +#: ../src\updater\update_manager.py:14 ../src\updater\update_manager.py:27 +msgid "Update" +msgstr "Päivitä" + +#: ../src\updater\update_manager.py:20 +msgid "New version for %s" +msgstr "Uusi versio sovelluksesta %s" + +#: ../src\updater\update_manager.py:20 +msgid "" +"There's a new TW Blue version available. Would you like to download it now?" +msgstr "Uusi TW Bluen versio on saatavilla. Haluatko ladata sen nyt?" + +#: ../src\updater\update_manager.py:22 +msgid "Download in Progress" +msgstr "Lataus käynnissä" + +#: ../src\updater\update_manager.py:22 +msgid "Downloading the new version..." +msgstr "Ladataan uutta versiota..." + +#: ../src\updater\update_manager.py:29 +msgid "Done!" +msgstr "Valmis!" + +#: ../src\updater\update_manager.py:29 +msgid "" +"The new TW Blue version has been downloaded and installed. Press OK to start " +"the application." +msgstr "" +"Uusi TW Bluen versio on ladattu ja asennettu. Käynnistä se painamalla OK." + +#~ msgid "Tweet - %i characters" +#~ msgstr "Twiitti - %i merkkiä" + +#~ msgid "%A, %B %d, %Y at %I:%M:%S %p" +#~ msgstr "%A, %d. %Bta %Y klo %H:%M:%S" + +#~ msgid "View members" +#~ msgstr "Näytä jäsenet" + +#~ msgid "View subscribers" +#~ msgstr "Näytä tilaajat" diff --git a/src/locales/fr/LC_MESSAGES/twblue.mo b/src/locales/fr/LC_MESSAGES/twblue.mo new file mode 100644 index 00000000..7cf4fefb Binary files /dev/null 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 new file mode 100644 index 00000000..1b5c9000 --- /dev/null +++ b/src/locales/fr/LC_MESSAGES/twblue.po @@ -0,0 +1,2457 @@ +msgid "" +msgstr "" +"Project-Id-Version: TW Blue 0.46\n" +"POT-Creation-Date: 2014-09-07 07:44+Hora de verano central (México)\n" +"PO-Revision-Date: 2014-09-11 10:01+0100\n" +"Last-Translator: Rémy Ruiz \n" +"Language-Team: Rémy Ruiz \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 1.6.8\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" + +#: ../src\extra\AudioUploader\gui.py:31 ../src\gui\dialogs\message.py:169 +#: ../src\gui\dialogs\message.py:256 +msgid "Attach audio" +msgstr "Ajouter audio" + +#: ../src\extra\AudioUploader\gui.py:38 ../src\extra\AudioUploader\gui.py:146 +#: ../src\extra\AudioUploader\gui.py:156 +msgid "Play" +msgstr "Lire" + +#: ../src\extra\AudioUploader\gui.py:41 ../src\extra\AudioUploader\gui.py:75 +#: ../src\extra\AudioUploader\gui.py:80 ../src\extra\AudioUploader\gui.py:107 +msgid "Pause" +msgstr "Pause" + +#: ../src\extra\AudioUploader\gui.py:44 ../src\extra\AudioUploader\gui.py:103 +msgid "Record" +msgstr "Enregistrer" + +#: ../src\extra\AudioUploader\gui.py:47 +msgid "Add an existing file" +msgstr "Ajouter un fichier existant" + +#: ../src\extra\AudioUploader\gui.py:49 +msgid "Discard" +msgstr "Ignorer" + +#: ../src\extra\AudioUploader\gui.py:52 +msgid "Upload to" +msgstr "Charger" + +#: ../src\extra\AudioUploader\gui.py:57 +msgid "Attach" +msgstr "Ajouter " + +#: ../src\extra\AudioUploader\gui.py:59 ../src\issueReporter\gui.py:88 +msgid "Cancel" +msgstr "Annuler" + +#: ../src\extra\AudioUploader\gui.py:77 ../src\extra\AudioUploader\gui.py:78 +msgid "Resume" +msgstr "Reprendre" + +#: ../src\extra\AudioUploader\gui.py:95 +msgid "Stop recording" +msgstr "Arrêter l'enregistrement" + +#: ../src\extra\AudioUploader\gui.py:96 +msgid "Recording" +msgstr "Enregistrement en cours" + +#: ../src\extra\AudioUploader\gui.py:101 ../src\extra\AudioUploader\gui.py:153 +msgid "Stopped" +msgstr "Arrêté" + +#: ../src\extra\AudioUploader\gui.py:128 ../src\gui\dialogs\message.py:218 +#: ../src\gui\dialogs\update_profile.py:87 +msgid "Discarded" +msgstr "Ignoré" + +#: ../src\extra\AudioUploader\gui.py:138 ../src\gui\buffers\base.py:303 +#: ../src\gui\buffers\base.py:315 +msgid "Playing..." +msgstr "Lecture en cours..." + +#: ../src\extra\AudioUploader\gui.py:142 +msgid "Stop" +msgstr "Arrêter" + +#: ../src\extra\AudioUploader\gui.py:161 +msgid "Recoding audio..." +msgstr "Recodage audio..." + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Audio Files (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" +msgstr "Fichiers audio (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Select the audio file to be uploaded" +msgstr "Sélectionnez le fichier audio que vous souhaitez charger" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:15 +msgid "File" +msgstr "Fichier" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:21 +msgid "Transferred" +msgstr "Transféré" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:26 +msgid "Total file size" +msgstr "Taille totale du fichier" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:31 +msgid "Transfer rate" +msgstr "Vitesse du transfert" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:36 +msgid "Time left" +msgstr "Temps restant" + +#: ../src\extra\AudioUploader\utils.py:27 +msgid "%d day, " +msgstr "%d jour, " + +#: ../src\extra\AudioUploader\utils.py:29 +msgid "%d days, " +msgstr "%d jours, " + +#: ../src\extra\AudioUploader\utils.py:31 +msgid "%d hour, " +msgstr "%d heure, " + +#: ../src\extra\AudioUploader\utils.py:33 +msgid "%d hours, " +msgstr "%d heures, " + +#: ../src\extra\AudioUploader\utils.py:35 +msgid "%d minute, " +msgstr "%d minute, " + +#: ../src\extra\AudioUploader\utils.py:37 +msgid "%d minutes, " +msgstr "%d minutes, " + +#: ../src\extra\AudioUploader\utils.py:39 +msgid "%s second" +msgstr "%s seconde" + +#: ../src\extra\AudioUploader\utils.py:41 +msgid "%s seconds" +msgstr "%s secondes" + +#: ../src\extra\SoundsTutorial\gui.py:11 +msgid "The tweet may contain a playable audio" +msgstr "Le tweet peut contenir un audio jouable" + +#: ../src\extra\SoundsTutorial\gui.py:12 +msgid "A timeline has been created" +msgstr "Nouvelle chronologie Créé" + +#: ../src\extra\SoundsTutorial\gui.py:13 +msgid "A timeline has been deleted" +msgstr "Chronologie supprimé" + +#: ../src\extra\SoundsTutorial\gui.py:14 +msgid "You've received a direct message" +msgstr "Vous avez reçu un message direct" + +#: ../src\extra\SoundsTutorial\gui.py:15 +msgid "You've sent a direct message" +msgstr "Vous avez envoyé un message direct" + +#: ../src\extra\SoundsTutorial\gui.py:16 +msgid "A bug has happened" +msgstr "Signaler l'erreur" + +#: ../src\extra\SoundsTutorial\gui.py:17 +msgid "You've added a tweet to your favourites" +msgstr "Vous avez ajouté un tweet à vos favoris" + +#: ../src\extra\SoundsTutorial\gui.py:18 +msgid "Someone's favourites have been updated" +msgstr "Les favoris ont été mis à jour" + +#: ../src\extra\SoundsTutorial\gui.py:19 +msgid "There are no more tweets to read" +msgstr "Il n'y a aucun tweet non lu" + +#: ../src\extra\SoundsTutorial\gui.py:20 +msgid "A list has a new tweet" +msgstr "Une liste a un nouveau tweet" + +#: ../src\extra\SoundsTutorial\gui.py:21 +msgid "You can't add any more characters on the tweet" +msgstr "Vous ne pouvez pas ajouter d'autres caractères au tweet" + +#: ../src\extra\SoundsTutorial\gui.py:22 +msgid "You've been mentioned " +msgstr "Vous avez été mentionné" + +#: ../src\extra\SoundsTutorial\gui.py:23 +msgid "A new event has happened" +msgstr "Un nouveau événement" + +#: ../src\extra\SoundsTutorial\gui.py:24 +msgid "TW Blue is ready " +msgstr "TW Blue est prêt" + +#: ../src\extra\SoundsTutorial\gui.py:25 +msgid "You've replied" +msgstr "Vous avez répondu" + +#: ../src\extra\SoundsTutorial\gui.py:26 +msgid "You've retweeted" +msgstr "Vous avez retweeté" + +#: ../src\extra\SoundsTutorial\gui.py:27 +msgid "A search has been updated" +msgstr "Une recherche a été mis à jour" + +#: ../src\extra\SoundsTutorial\gui.py:28 +msgid "There's a new tweet in the main buffer" +msgstr "Un nouveau tweet dans le tampon principal" + +#: ../src\extra\SoundsTutorial\gui.py:29 +msgid "You've sent a tweet" +msgstr "Vous avez envoyé un tweet" + +#: ../src\extra\SoundsTutorial\gui.py:30 +msgid "There's a new tweet in a timeline" +msgstr "Nouveau tweet dans la chronologie" + +#: ../src\extra\SoundsTutorial\gui.py:31 +msgid "You have a new follower" +msgstr "Vous avez un nouveau follower" + +#: ../src\extra\SoundsTutorial\gui.py:32 +msgid "You've turned the volume up or down" +msgstr "Vous avez réglé le volume" + +#: ../src\extra\SoundsTutorial\gui.py:36 +msgid "" +"It seems as though the currently used sound pack needs an update. %i fails " +"are still be required to use this function. Make sure to obtain the needed " +"lacking sounds or to contact with the sound pack developer." +msgstr "" +"Il semble qu'actuellement le paquet de sons que vous utilisez nécessite une " +"mise à jour. %i fichiers manquants sont encore nécessaires pour utiliser " +"cette fonction. Assurez-vous de compléter les autres sons manquants ou " +"contactez-vous avec le développeur du paquet." + +#: ../src\extra\SoundsTutorial\gui.py:36 ../src\extra\SpellChecker\gui.py:34 +#: ../src\gui\dialogs\show_user.py:63 ../src\gui\main.py:703 +#: ../src\gui\main.py:734 ../src\issueReporter\gui.py:98 +#: ../src\issueReporter\gui.py:101 +msgid "Error" +msgstr "Erreur" + +#: ../src\extra\SoundsTutorial\gui.py:38 ../src\gui\main.py:68 +msgid "Sounds tutorial" +msgstr "Tutoriel de sons" + +#: ../src\extra\SoundsTutorial\gui.py:41 +msgid "Press enter to listen to the sound for the selected event" +msgstr "Appuyez sur entrée pour entendre le son de l'événement sélectionné" + +#: ../src\extra\SpellChecker\gui.py:34 +msgid "" +"A bug has happened. There are no dictionaries available for the selected " +"language in TW Blue" +msgstr "" +"Erreur. Il n'existe aucun dictionnaires disponibles pour la langue " +"sélectionnée dans TW Blue." + +#: ../src\extra\SpellChecker\gui.py:38 +msgid "Mis-spelled word" +msgstr "Mots mal orthographiés" + +#: ../src\extra\SpellChecker\gui.py:43 +msgid "Context" +msgstr "Contexte" + +#: ../src\extra\SpellChecker\gui.py:48 +msgid "Suggestions" +msgstr "Suggestions" + +#: ../src\extra\SpellChecker\gui.py:53 +msgid "Ignore" +msgstr "Ignorer" + +#: ../src\extra\SpellChecker\gui.py:55 +msgid "Ignore all" +msgstr "Ignorer tout" + +#: ../src\extra\SpellChecker\gui.py:57 +msgid "Replace" +msgstr "Remplacer" + +#: ../src\extra\SpellChecker\gui.py:59 +msgid "Replace all" +msgstr "Remplacer tout" + +#: ../src\extra\SpellChecker\gui.py:78 +msgid "Mis-spelled word: %s" +msgstr "Mots mal orthographiés: %s" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "Finished" +msgstr "Terminé" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "The spelling review has finished." +msgstr "La correction orthographique est terminée." + +#: ../src\extra\translator\gui.py:24 ../src\gui\dialogs\message.py:177 +#: ../src\gui\dialogs\message.py:264 ../src\gui\dialogs\message.py:350 +msgid "Translate message" +msgstr "Traduire le message" + +#: ../src\extra\translator\gui.py:27 +msgid "Source language" +msgstr "Langue source" + +#: ../src\extra\translator\gui.py:30 +msgid "Target language" +msgstr "Langue destination" + +#: ../src\extra\translator\translator.py:53 +msgid "Afrikaans" +msgstr "Africain" + +#: ../src\extra\translator\translator.py:54 +msgid "Albanian" +msgstr "Albanais" + +#: ../src\extra\translator\translator.py:55 +msgid "Amharic" +msgstr "Amharique" + +#: ../src\extra\translator\translator.py:56 +msgid "Arabic" +msgstr "Arabe" + +#: ../src\extra\translator\translator.py:57 +msgid "Armenian" +msgstr "Arménien" + +#: ../src\extra\translator\translator.py:58 +msgid "Azerbaijani" +msgstr "Azerbaïdjanais" + +#: ../src\extra\translator\translator.py:59 +msgid "Basque" +msgstr "Basque" + +#: ../src\extra\translator\translator.py:60 +msgid "Belarusian" +msgstr "Biélorusse" + +#: ../src\extra\translator\translator.py:61 +msgid "Bengali" +msgstr "Bengali" + +#: ../src\extra\translator\translator.py:62 +msgid "Bihari" +msgstr "Bihari" + +#: ../src\extra\translator\translator.py:63 +msgid "Bulgarian" +msgstr "Bulgare" + +#: ../src\extra\translator\translator.py:64 +msgid "Burmese" +msgstr "Birman" + +#: ../src\extra\translator\translator.py:65 +msgid "Catalan" +msgstr "Catalan" + +#: ../src\extra\translator\translator.py:66 +msgid "Cherokee" +msgstr "Cherokee" + +#: ../src\extra\translator\translator.py:67 +msgid "Chinese" +msgstr "Chinois" + +#: ../src\extra\translator\translator.py:68 +msgid "Chinese_simplified" +msgstr "Chinois simplifié" + +#: ../src\extra\translator\translator.py:69 +msgid "Chinese_traditional" +msgstr "Chinois traditionnel" + +#: ../src\extra\translator\translator.py:70 +msgid "Croatian" +msgstr "Croate" + +#: ../src\extra\translator\translator.py:71 +msgid "Czech" +msgstr "Tchèque" + +#: ../src\extra\translator\translator.py:72 +msgid "Danish" +msgstr "Danois" + +#: ../src\extra\translator\translator.py:73 +msgid "Dhivehi" +msgstr "Dhivehi" + +#: ../src\extra\translator\translator.py:74 +msgid "Dutch" +msgstr "Néerlandais" + +#: ../src\extra\translator\translator.py:75 +msgid "English" +msgstr "Anglais" + +#: ../src\extra\translator\translator.py:76 +msgid "Esperanto" +msgstr "Esperanto" + +#: ../src\extra\translator\translator.py:77 +msgid "Estonian" +msgstr "Estonien" + +#: ../src\extra\translator\translator.py:78 +msgid "Filipino" +msgstr "Filipino" + +#: ../src\extra\translator\translator.py:79 +msgid "Finnish" +msgstr "Finnois" + +#: ../src\extra\translator\translator.py:80 +msgid "French" +msgstr "Français" + +#: ../src\extra\translator\translator.py:81 +msgid "Galician" +msgstr "Galicien" + +#: ../src\extra\translator\translator.py:82 +msgid "Georgian" +msgstr "Géorgien" + +#: ../src\extra\translator\translator.py:83 +msgid "German" +msgstr "Allemand" + +#: ../src\extra\translator\translator.py:84 +msgid "Greek" +msgstr "Grec" + +#: ../src\extra\translator\translator.py:85 +msgid "Guarani" +msgstr "Guarani" + +#: ../src\extra\translator\translator.py:86 +msgid "Gujarati" +msgstr "Gujarâtî" + +#: ../src\extra\translator\translator.py:87 +msgid "Hebrew" +msgstr "Hébreu" + +#: ../src\extra\translator\translator.py:88 +msgid "Hindi" +msgstr "Hindi" + +#: ../src\extra\translator\translator.py:89 +msgid "Hungarian" +msgstr "Hongrois" + +#: ../src\extra\translator\translator.py:90 +msgid "Icelandic" +msgstr "Islandais" + +#: ../src\extra\translator\translator.py:91 +msgid "Indonesian" +msgstr "Indonésien" + +#: ../src\extra\translator\translator.py:92 +msgid "Inuktitut" +msgstr "Inuktitut" + +#: ../src\extra\translator\translator.py:93 +msgid "Irish" +msgstr "Irlandais" + +#: ../src\extra\translator\translator.py:94 +msgid "Italian" +msgstr "Italien" + +#: ../src\extra\translator\translator.py:95 +msgid "Japanese" +msgstr "Japonais" + +#: ../src\extra\translator\translator.py:96 +msgid "Kannada" +msgstr "Canara" + +#: ../src\extra\translator\translator.py:97 +msgid "Kazakh" +msgstr "Kazakh" + +#: ../src\extra\translator\translator.py:98 +msgid "Khmer" +msgstr "Cambodgien" + +#: ../src\extra\translator\translator.py:99 +msgid "Korean" +msgstr "Coréen" + +#: ../src\extra\translator\translator.py:100 +msgid "Kurdish" +msgstr "Kurde" + +#: ../src\extra\translator\translator.py:101 +msgid "Kyrgyz" +msgstr "Kirghiz" + +#: ../src\extra\translator\translator.py:102 +msgid "Laothian" +msgstr "Laotien" + +#: ../src\extra\translator\translator.py:103 +msgid "Latvian" +msgstr "Letton" + +#: ../src\extra\translator\translator.py:104 +msgid "Lithuanian" +msgstr "Lituanien" + +#: ../src\extra\translator\translator.py:105 +msgid "Macedonian" +msgstr "Macédonien" + +#: ../src\extra\translator\translator.py:106 +msgid "Malay" +msgstr "Malaisien" + +#: ../src\extra\translator\translator.py:107 +msgid "Malayalam" +msgstr "Malayalam" + +#: ../src\extra\translator\translator.py:108 +msgid "Maltese" +msgstr "Maltais" + +#: ../src\extra\translator\translator.py:109 +msgid "Marathi" +msgstr "Marathi" + +#: ../src\extra\translator\translator.py:110 +msgid "Mongolian" +msgstr "Mongol" + +#: ../src\extra\translator\translator.py:111 +msgid "Nepali" +msgstr "Népali" + +#: ../src\extra\translator\translator.py:112 +msgid "Norwegian" +msgstr "Norvégien" + +#: ../src\extra\translator\translator.py:113 +msgid "Oriya" +msgstr "Oriya" + +#: ../src\extra\translator\translator.py:114 +msgid "Pashto" +msgstr "Pashto" + +#: ../src\extra\translator\translator.py:115 +msgid "Persian" +msgstr "Perse" + +#: ../src\extra\translator\translator.py:116 +msgid "Polish" +msgstr "Polonais" + +#: ../src\extra\translator\translator.py:117 +msgid "Portuguese" +msgstr "Portugais" + +#: ../src\extra\translator\translator.py:118 +msgid "Punjabi" +msgstr "Punjabi" + +#: ../src\extra\translator\translator.py:119 +msgid "Romanian" +msgstr "Roumain" + +#: ../src\extra\translator\translator.py:120 +msgid "Russian" +msgstr "Russe" + +#: ../src\extra\translator\translator.py:121 +msgid "Sanskrit" +msgstr "Sanscrit" + +#: ../src\extra\translator\translator.py:122 +msgid "Serbian" +msgstr "Serbe" + +#: ../src\extra\translator\translator.py:123 +msgid "Sindhi" +msgstr "Sindhi" + +#: ../src\extra\translator\translator.py:124 +msgid "Sinhalese" +msgstr "Cinghalais" + +#: ../src\extra\translator\translator.py:125 +msgid "Slovak" +msgstr "Slovaque" + +#: ../src\extra\translator\translator.py:126 +msgid "Slovenian" +msgstr "Slovène" + +#: ../src\extra\translator\translator.py:127 +msgid "Spanish" +msgstr "Espagnol" + +#: ../src\extra\translator\translator.py:128 +msgid "Swahili" +msgstr "Swahili" + +#: ../src\extra\translator\translator.py:129 +msgid "Swedish" +msgstr "Suédois" + +#: ../src\extra\translator\translator.py:130 +msgid "Tajik" +msgstr "Tadjik" + +#: ../src\extra\translator\translator.py:131 +msgid "Tamil" +msgstr "Tamil" + +#: ../src\extra\translator\translator.py:132 +msgid "Tagalog" +msgstr "Tagalog" + +#: ../src\extra\translator\translator.py:133 +msgid "Telugu" +msgstr "Telugu" + +#: ../src\extra\translator\translator.py:134 +msgid "Thai" +msgstr "Thaï" + +#: ../src\extra\translator\translator.py:135 +msgid "Tibetan" +msgstr "Tibétain" + +#: ../src\extra\translator\translator.py:136 +msgid "Turkish" +msgstr "Turc" + +#: ../src\extra\translator\translator.py:137 +msgid "Ukrainian" +msgstr "Ukrainien" + +#: ../src\extra\translator\translator.py:138 +msgid "Urdu" +msgstr "Urdu" + +#: ../src\extra\translator\translator.py:139 +msgid "Uzbek" +msgstr "Ouzbek" + +#: ../src\extra\translator\translator.py:140 +msgid "Uighur" +msgstr "Uighur" + +#: ../src\extra\translator\translator.py:141 +msgid "Vietnamese" +msgstr "Vietnamien" + +#: ../src\extra\translator\translator.py:142 +msgid "Welsh" +msgstr "Gallois" + +#: ../src\extra\translator\translator.py:143 +msgid "Yiddish" +msgstr "Yiddish" + +#: ../src\extra\translator\translator.py:150 +msgid "autodetect" +msgstr "Détection automatique" + +#: ../src\gui\buffers\base.py:54 +msgid "Client" +msgstr "Client" + +#: ../src\gui\buffers\base.py:54 +msgid "Text" +msgstr "Texte" + +#: ../src\gui\buffers\base.py:54 ../src\gui\buffers\events.py:57 +msgid "Date" +msgstr "Date" + +#: ../src\gui\buffers\base.py:54 ../src\gui\buffers\people.py:39 +#: ../src\gui\buffers\user_searches.py:31 ../src\gui\dialogs\utils.py:36 +#: ../src\gui\main.py:154 +msgid "User" +msgstr "Utilisateur" + +#: ../src\gui\buffers\base.py:73 ../src\gui\buffers\base.py:192 +#: ../src\gui\buffers\events.py:58 ../src\gui\buffers\events.py:74 +#: ../src\gui\dialogs\message.py:332 ../src\gui\main.py:79 +#: ../src\gui\main.py:153 ../src\gui\sysTrayIcon.py:34 +msgid "Tweet" +msgstr "Tweet" + +#: ../src\gui\buffers\base.py:75 ../src\gui\buffers\base.py:204 +#: ../src\gui\main.py:83 ../src\keystrokeEditor\constants.py:13 +msgid "Retweet" +msgstr "Retweet" + +#: ../src\gui\buffers\base.py:77 ../src\gui\main.py:81 +msgid "Reply" +msgstr "Répondre" + +#: ../src\gui\buffers\base.py:79 ../src\gui\main.py:110 +msgid "Direct message" +msgstr "Message direct" + +#: ../src\gui\buffers\base.py:92 +msgid "Do you really want to delete this timeline?" +msgstr "Voulez-vous vraiment supprimer cette chronologie ?" + +#: ../src\gui\buffers\base.py:92 ../src\gui\buffers\favourites.py:41 +#: ../src\gui\buffers\lists.py:46 ../src\gui\buffers\trends.py:41 +#: ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Attention" +msgstr "Attention" + +#: ../src\gui\buffers\base.py:104 +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\gui\buffers\base.py:184 ../src\gui\buffers\dm.py:44 +#: ../src\gui\buffers\people.py:54 +msgid "Direct message to %s" +msgstr "Message direct à %s" + +#: ../src\gui\buffers\base.py:192 ../src\gui\buffers\events.py:74 +msgid "Write the tweet here" +msgstr "Écrivez le tweet ici" + +#: ../src\gui\buffers\base.py:204 +msgid "Would you like to add a comment to this tweet?" +msgstr "Vous souhaitez ajouter un commentaire à ce tweet ?" + +#: ../src\gui\buffers\base.py:207 +msgid "Add your comment to the tweet" +msgstr "Ajoutez votre commentaire au tweet" + +#: ../src\gui\buffers\base.py:223 ../src\gui\buffers\people.py:62 +msgid "Reply to %s" +msgstr "Répondre à %s" + +#: ../src\gui\buffers\base.py:268 +msgid "Opening URL..." +msgstr "Ouverture en cours de l'URL..." + +#: ../src\gui\buffers\base.py:285 ../src\gui\buffers\events.py:118 +msgid "" +"Do you really want to empty this buffer? It's tweets will be removed from " +"the list but not from Twitter" +msgstr "" +"Voulez-vous vraiment vider ce tampon ? C'est tweets seront supprimés de la " +"liste, mais pas de Twitter" + +#: ../src\gui\buffers\base.py:285 ../src\gui\buffers\events.py:118 +msgid "Empty buffer" +msgstr "Tampon Vide" + +#: ../src\gui\buffers\base.py:290 ../src\gui\buffers\events.py:122 +msgid "Do you really want to delete this message?" +msgstr "Voulez-vous vraiment supprimer ce message ?" + +#: ../src\gui\buffers\base.py:290 ../src\gui\buffers\events.py:122 +#: ../src\gui\dialogs\lists.py:107 ../src\gui\main.py:91 +#: ../src\gui\main.py:577 +msgid "Delete" +msgstr "Supprimer Tweet" + +#: ../src\gui\buffers\base.py:310 ../src\gui\buffers\base.py:321 +msgid "Unable to play audio." +msgstr "Impossible de lire l'audio." + +#: ../src\gui\buffers\base.py:312 +msgid "Audio stopped." +msgstr "Audio arrêté." + +#: ../src\gui\buffers\events.py:40 +msgid "Empty" +msgstr "Vide" + +#: ../src\gui\buffers\events.py:57 +msgid "Event" +msgstr "Événement" + +#: ../src\gui\buffers\events.py:60 +msgid "Remove event" +msgstr "Supprimer l'événement" + +#: ../src\gui\buffers\favourites.py:41 +msgid "Do you really want to delete this favourites timeline?" +msgstr "Voulez-vous vraiment supprimer cette chronologie des favoris ?" + +#: ../src\gui\buffers\lists.py:46 ../src\gui\dialogs\lists.py:107 +msgid "Do you really want to delete this list?" +msgstr "Voulez-vous vraiment supprimer cette liste ?" + +#: ../src\gui\buffers\panels.py:27 +msgid "Announce" +msgstr "Annonce" + +#: ../src\gui\buffers\people.py:44 +msgid "Mention" +msgstr "Mention" + +#: ../src\gui\buffers\trends.py:41 ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Do you really want to delete this search term?" +msgstr "Voulez-vous vraiment supprimer votre recherche ?" + +#: ../src\gui\dialogs\configuration.py:39 +msgid "Language" +msgstr "Langue" + +#: ../src\gui\dialogs\configuration.py:53 +msgid "Relative times" +msgstr "Temps relatives" + +#: ../src\gui\dialogs\configuration.py:57 +msgid "Activate Sapi5 when any other screen reader is not being run" +msgstr "" +"Activer Sapi5 lorsqu'il n'y a aucun autre lecteur d'écran en cours " +"d'exécution" + +#: ../src\gui\dialogs\configuration.py:60 +msgid "Activate the auto-start of the invisible interface" +msgstr "Activer le démarrage automatique de l'interface invisible" + +#: ../src\gui\dialogs\configuration.py:64 +msgid "" +"API calls when the stream is started (One API call equals to 200 tweetts, " +"two API calls equals 400 tweets, etc):" +msgstr "" +"Appels à l'API lorsqu'il démarre le flux (un appel à l'API équivaut à 200 " +"tweets, 2 appels à l'API équivaut à 400 tweets, etc.):" + +#: ../src\gui\dialogs\configuration.py:72 +msgid "Items on each API call" +msgstr "Éléments pour chaque appel à l'API" + +#: ../src\gui\dialogs\configuration.py:79 +msgid "" +"Inverted buffers: The newest tweets will be shown at the beginning of the " +"lists while the oldest at the end" +msgstr "" +"Tampons inversés: les tweets plus récents seront affichées en haut de la " +"liste alors que les plus ancien à la fin" + +#: ../src\gui\dialogs\configuration.py:94 +msgid "Show followers" +msgstr "Afficher les followers" + +#: ../src\gui\dialogs\configuration.py:97 +msgid "Show friends" +msgstr "Afficher les following" + +#: ../src\gui\dialogs\configuration.py:100 +msgid "Show favourites" +msgstr "Afficher les favoris" + +#: ../src\gui\dialogs\configuration.py:103 +msgid "Show blocked users" +msgstr "Afficher les utilisateurs bloqués" + +#: ../src\gui\dialogs\configuration.py:106 +msgid "Show muted users" +msgstr "Afficher les utilisateurs muet" + +#: ../src\gui\dialogs\configuration.py:109 +msgid "Show events" +msgstr "Afficher les événements" + +#: ../src\gui\dialogs\configuration.py:119 +#: ../src\gui\dialogs\configuration.py:267 +msgid "Ignored clients" +msgstr "Ignorer les clients" + +#: ../src\gui\dialogs\configuration.py:125 +msgid "Add client" +msgstr "Ajouter un client" + +#: ../src\gui\dialogs\configuration.py:126 +msgid "Remove client" +msgstr "Supprimer le client" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Add a new ignored client" +msgstr "Ajouter un nouveau client ignoré" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Enter the name of the client here" +msgstr "Entrez le nom du client ici" + +#: ../src\gui\dialogs\configuration.py:154 +msgid "Volume" +msgstr "Volume" + +#: ../src\gui\dialogs\configuration.py:163 +msgid "Global mute" +msgstr "Tous muet" + +#: ../src\gui\dialogs\configuration.py:167 +msgid "Output device" +msgstr "Périphérique de sortie" + +#: ../src\gui\dialogs\configuration.py:176 +msgid "Input device" +msgstr "Périphérique d'entrée" + +#: ../src\gui\dialogs\configuration.py:184 +msgid "" +"If you've got a SndUp account, enter your API Key here. Whether the API Key " +"is wrong, the App will fail to upload anything to the server. Whether " +"there's no API Key here, then the audio files will be uploaded anonimously" +msgstr "" +"Si vous avez un compte SndUp, veuillez entrer votre API Key ici. Si l'API " +"Key est incorrecte, le programme ne peut pas rien chargé sur ce serveur. Si " +"il n'y a aucune API Key ici, les audios seront chargés anonymement" + +#: ../src\gui\dialogs\configuration.py:197 +msgid "Sound pack" +msgstr "Paquet de sons" + +#: ../src\gui\dialogs\configuration.py:213 +#: ../src\gui\dialogs\configuration.py:237 +msgid "Unlink your Dropbox account" +msgstr "Déconnecter votre compte Dropbox" + +#: ../src\gui\dialogs\configuration.py:215 +#: ../src\gui\dialogs\configuration.py:232 +#: ../src\gui\dialogs\configuration.py:240 +#: ../src\gui\dialogs\configuration.py:244 +#: ../src\gui\dialogs\configuration.py:251 +msgid "Link your Dropbox account" +msgstr "Connecter votre compte Dropbox" + +#: ../src\gui\dialogs\configuration.py:225 +msgid "" +"The authorisation request will be shown on your browser. Copy the code tat " +"Dropbox will provide and, in the text box that will appear on TW Blue, paste " +"it. This code is necessary to continue. You only need to do it once." +msgstr "" +"Une demande d'autorisation s'affiche dans votre navigateur. Copier le code " +"fourni par Dropbox, et le coller dans la zone d'édition qui s'affiche dans " +"TW Blue. Ce code est nécessaire pour continuer. Vous devez seulement le " +"faire une fois." + +#: ../src\gui\dialogs\configuration.py:225 ../src\sessionmanager\gui.py:83 +msgid "Authorisation" +msgstr "Autorisation" + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Enter the code here." +msgstr "Entrez le code ici." + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Verification code" +msgstr "Code de vérification" + +#: ../src\gui\dialogs\configuration.py:239 +msgid "Error during authorisation. Try again later." +msgstr "Erreur pendant l'autorisation. Réessayez plus tard." + +#: ../src\gui\dialogs\configuration.py:239 ../src\gui\main.py:718 +#: ../src\gui\main.py:749 +msgid "Error!" +msgstr "Erreur !" + +#: ../src\gui\dialogs\configuration.py:258 +msgid "TW Blue preferences" +msgstr "Préférences TW Blue" + +#: ../src\gui\dialogs\configuration.py:262 ../src\issueReporter\gui.py:30 +msgid "General" +msgstr "Général" + +#: ../src\gui\dialogs\configuration.py:265 +msgid "Show other buffers" +msgstr "Afficher autres tampons" + +#: ../src\gui\dialogs\configuration.py:269 +msgid "Sound" +msgstr "Audio" + +#: ../src\gui\dialogs\configuration.py:271 +msgid "Audio Services" +msgstr "Services audio" + +#: ../src\gui\dialogs\configuration.py:274 +msgid "Save" +msgstr "Enregistrer" + +#: ../src\gui\dialogs\configuration.py:277 ../src\gui\dialogs\follow.py:64 +#: ../src\gui\dialogs\message.py:182 ../src\gui\dialogs\message.py:269 +#: ../src\gui\dialogs\message.py:352 ../src\gui\dialogs\search.py:42 +#: ../src\gui\dialogs\show_user.py:42 ../src\gui\dialogs\update_profile.py:56 +#: ../src\gui\dialogs\utils.py:42 ../src\keystrokeEditor\gui.py:26 +msgid "Close" +msgstr "Fermer" + +#: ../src\gui\dialogs\configuration.py:290 ../src\gui\main.py:272 +msgid "Followers" +msgstr "Followers" + +#: ../src\gui\dialogs\configuration.py:304 +msgid "friends" +msgstr "following" + +#: ../src\gui\dialogs\configuration.py:318 +msgid "Favorites" +msgstr "Favoris" + +#: ../src\gui\dialogs\configuration.py:332 ../src\gui\main.py:290 +msgid "Events" +msgstr "Événements" + +#: ../src\gui\dialogs\configuration.py:343 ../src\gui\main.py:282 +msgid "Blocked users" +msgstr "Utilisateurs bloqués" + +#: ../src\gui\dialogs\configuration.py:357 ../src\gui\main.py:286 +msgid "Muted users" +msgstr "Utilisateurs muet" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "Restart TW Blue" +msgstr "Redémarrez TW Blue" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "" +"The application requires to be restarted to save these changes. Press OK to " +"do it now." +msgstr "" +"L'application doit être redémarrée pour enregistrer vos modifications. " +"Appuyez sur OK pour le faire maintenant." + +#: ../src\gui\dialogs\follow.py:33 ../src\gui\dialogs\follow.py:43 +#: ../src\keystrokeEditor\gui.py:17 +msgid "Action" +msgstr "Action" + +#: ../src\gui\dialogs\follow.py:44 ../src\gui\main.py:96 +msgid "Follow" +msgstr "Suivre" + +#: ../src\gui\dialogs\follow.py:45 ../src\gui\main.py:98 +msgid "Unfollow" +msgstr "Ne pas suivre" + +#: ../src\gui\dialogs\follow.py:46 ../src\gui\main.py:100 +#: ../src\gui\main.py:127 +msgid "Mute" +msgstr "Muet" + +#: ../src\gui\dialogs\follow.py:47 ../src\gui\main.py:102 +msgid "Unmute" +msgstr "Désactiver muet" + +#: ../src\gui\dialogs\follow.py:48 ../src\gui\main.py:106 +msgid "Block" +msgstr "Bloquer" + +#: ../src\gui\dialogs\follow.py:49 ../src\gui\main.py:108 +msgid "Unblock" +msgstr "Débloquer" + +#: ../src\gui\dialogs\follow.py:50 ../src\gui\main.py:104 +msgid "Report as spam" +msgstr "Signaler comme spam" + +#: ../src\gui\dialogs\follow.py:61 ../src\gui\dialogs\search.py:40 +#: ../src\gui\dialogs\utils.py:39 ../src\keystrokeEditor\gui.py:76 +msgid "OK" +msgstr "OK" + +#: ../src\gui\dialogs\follow.py:101 +msgid "You've muted to %s" +msgstr "Muet activés à %s" + +#: ../src\gui\dialogs\follow.py:115 +msgid "You've unmuted to %s" +msgstr "vous désactivés muet à %s" + +#: ../src\gui\dialogs\lists.py:36 ../src\gui\main.py:66 +msgid "Lists manager" +msgstr "Gestionnaire de listes" + +#: ../src\gui\dialogs\lists.py:38 ../src\gui\main.py:309 +msgid "Lists" +msgstr "Listes" + +#: ../src\gui\dialogs\lists.py:39 +msgid "List" +msgstr "Liste" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Members" +msgstr "Membres" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Owner" +msgstr "Propriétaire" + +#: ../src\gui\dialogs\lists.py:39 +msgid "mode" +msgstr "mode" + +#: ../src\gui\dialogs\lists.py:39 ../src\gui\dialogs\lists.py:181 +msgid "Description" +msgstr "Description" + +#: ../src\gui\dialogs\lists.py:44 ../src\gui\dialogs\lists.py:173 +msgid "Create a new list" +msgstr "Créer une nouvelle liste" + +#: ../src\gui\dialogs\lists.py:46 ../src\keystrokeEditor\gui.py:22 +msgid "Edit" +msgstr "Modifier" + +#: ../src\gui\dialogs\lists.py:48 ../src\gui\dialogs\lists.py:235 +msgid "Remove" +msgstr "Effacer" + +#: ../src\gui\dialogs\lists.py:50 +msgid "Open in buffer" +msgstr "Ouvrir dans un tampon" + +#: ../src\gui\dialogs\lists.py:125 +msgid "List opened" +msgstr "Liste ouverte" + +#: ../src\gui\dialogs\lists.py:127 +msgid "This list is arready opened." +msgstr "Cette liste est déjà ouverte." + +#: ../src\gui\dialogs\lists.py:130 ../src\gui\main.py:312 +msgid "List for %s" +msgstr "Modification de la liste %s" + +#: ../src\gui\dialogs\lists.py:148 +msgid "Viewing lists for %s" +msgstr "Affichage des listes pour %s" + +#: ../src\gui\dialogs\lists.py:149 +msgid "Subscribe" +msgstr "S'abonner" + +#: ../src\gui\dialogs\lists.py:150 +msgid "Unsubscribe" +msgstr "Se désabonner" + +#: ../src\gui\dialogs\lists.py:176 +msgid "Name (20 characters maximun)" +msgstr "Nom (maximum 20 caractères)" + +#: ../src\gui\dialogs\lists.py:186 +msgid "Mode" +msgstr "Mode" + +#: ../src\gui\dialogs\lists.py:187 +msgid "Public" +msgstr "Public" + +#: ../src\gui\dialogs\lists.py:188 +msgid "Private" +msgstr "Privé" + +#: ../src\gui\dialogs\lists.py:208 +msgid "Editing the list %s" +msgstr "Modification de la liste %s" + +#: ../src\gui\dialogs\lists.py:219 +msgid "Select a list to add the user" +msgstr "Sélectionnez une liste pour ajouter l'utilisateur" + +#: ../src\gui\dialogs\lists.py:220 +msgid "Add" +msgstr "Ajouter" + +#: ../src\gui\dialogs\lists.py:234 +msgid "Select a list to remove the user" +msgstr "Sélectionnez une liste pour supprimer l'utilisateur" + +#: ../src\gui\dialogs\message.py:42 ../src\keystrokeEditor\constants.py:11 +msgid "New tweet" +msgstr "Nouveau tweet" + +#: ../src\gui\dialogs\message.py:76 +msgid "Attaching..." +msgstr "Ajout en cours..." + +#: ../src\gui\dialogs\message.py:77 +msgid "Uploading..." +msgstr "Chargement en cours......" + +#: ../src\gui\dialogs\message.py:96 +msgid "Unable to upload the audio" +msgstr "Impossible de charger l'audio" + +#: ../src\gui\dialogs\message.py:110 ../src\gui\dialogs\message.py:395 +msgid "Translated" +msgstr "Traduit" + +#: ../src\gui\dialogs\message.py:122 +msgid "There's no URL to be shortened" +msgstr "Aucune URL à réduire" + +#: ../src\gui\dialogs\message.py:125 +msgid "URL shortened" +msgstr "URL réduite" + +#: ../src\gui\dialogs\message.py:133 ../src\gui\dialogs\message.py:407 +msgid "There's no URL to be expanded" +msgstr "Aucune URL à élargir" + +#: ../src\gui\dialogs\message.py:136 ../src\gui\dialogs\message.py:410 +msgid "URL expanded" +msgstr "URL élargi" + +#: ../src\gui\dialogs\message.py:164 ../src\gui\dialogs\message.py:219 +#: ../src\gui\dialogs\update_profile.py:51 +#: ../src\gui\dialogs\update_profile.py:88 +msgid "Upload a picture" +msgstr "Charger une photo" + +#: ../src\gui\dialogs\message.py:167 ../src\gui\dialogs\message.py:254 +#: ../src\gui\dialogs\message.py:345 +msgid "Spelling correction" +msgstr "Correction orthographique" + +#: ../src\gui\dialogs\message.py:171 ../src\gui\dialogs\message.py:258 +msgid "Shorten URL" +msgstr "Réduire URL" + +#: ../src\gui\dialogs\message.py:173 ../src\gui\dialogs\message.py:260 +#: ../src\gui\dialogs\message.py:347 +msgid "Expand URL" +msgstr "Élargir URL" + +#: ../src\gui\dialogs\message.py:179 ../src\gui\dialogs\message.py:266 +msgid "Send" +msgstr "Envoyer" + +#: ../src\gui\dialogs\message.py:215 ../src\gui\dialogs\message.py:226 +#: ../src\gui\dialogs\update_profile.py:84 +#: ../src\gui\dialogs\update_profile.py:95 +msgid "Discard image" +msgstr "Ignorer la photo" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" +msgstr "Fichiers image (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Select the picture to be uploaded" +msgstr "Sélectionnez la photo à charger" + +#: ../src\gui\dialogs\message.py:248 +msgid "Recipient" +msgstr "Destinataire" + +#: ../src\gui\dialogs\message.py:303 +msgid "Mention to all" +msgstr "Mentionner à tous" + +#: ../src\gui\dialogs\message.py:330 +msgid "Tweet - %i characters " +msgstr "Tweet - %i caractères " + +#: ../src\gui\dialogs\search.py:26 +msgid "Search on Twitter" +msgstr "Rechercher sur Twitter" + +#: ../src\gui\dialogs\search.py:27 ../src\gui\main.py:64 +msgid "Search" +msgstr "Rechercher" + +#: ../src\gui\dialogs\search.py:34 +msgid "Tweets" +msgstr "Tweets" + +#: ../src\gui\dialogs\search.py:35 +msgid "Users" +msgstr "Utilisateurs" + +#: ../src\gui\dialogs\show_user.py:26 +msgid "Information for %s" +msgstr "Détails pour %s" + +#: ../src\gui\dialogs\show_user.py:30 +msgid "Details" +msgstr "Détails" + +#: ../src\gui\dialogs\show_user.py:39 +msgid "Go to URL" +msgstr "Aller à l'URL" + +#: ../src\gui\dialogs\show_user.py:63 +msgid "This user does not exist on Twitter" +msgstr "Cet utilisateur n'existe pas sur Twitter" + +#: ../src\gui\dialogs\show_user.py:68 +msgid "Username: @%s\n" +msgstr "Nom d'utilisateur: @%s\n" + +#: ../src\gui\dialogs\show_user.py:69 +msgid "Name: %s\n" +msgstr "Nom: %s\n" + +#: ../src\gui\dialogs\show_user.py:71 +msgid "Location: %s\n" +msgstr "Localisation: %s\n" + +#: ../src\gui\dialogs\show_user.py:73 +msgid "URL: %s\n" +msgstr "URL: %s\n" + +#: ../src\gui\dialogs\show_user.py:76 +msgid "Bio: %s\n" +msgstr "Description: %s\n" + +#: ../src\gui\dialogs\show_user.py:77 +msgid "Yes" +msgstr "Oui" + +#: ../src\gui\dialogs\show_user.py:78 +msgid "No" +msgstr "Non" + +#: ../src\gui\dialogs\show_user.py:79 +msgid "Protected: %s\n" +msgstr "Protégé: %s\n" + +#: ../src\gui\dialogs\show_user.py:80 +msgid "" +"Followers: %s\n" +" Friends: %s\n" +msgstr "" +"Followers: %s\n" +" Following: %s\n" + +#: ../src\gui\dialogs\show_user.py:81 +msgid "Tweets: %s\n" +msgstr "Tweets: %s\n" + +#: ../src\gui\dialogs\show_user.py:82 +msgid "Favourites: %s" +msgstr "Favoris: %s" + +#: ../src\gui\dialogs\update_profile.py:27 +msgid "Update your profile" +msgstr "Mettre à jour votre profil" + +#: ../src\gui\dialogs\update_profile.py:29 +msgid "Name (20 characters maximum)" +msgstr "Nom (maximum 20 caractères)" + +#: ../src\gui\dialogs\update_profile.py:35 +msgid "Location" +msgstr "Localisation" + +#: ../src\gui\dialogs\update_profile.py:40 +msgid "Website" +msgstr "Site Web" + +#: ../src\gui\dialogs\update_profile.py:45 +msgid "Bio (160 characters maximum)" +msgstr "Description (maximum 160 caractères)" + +#: ../src\gui\dialogs\update_profile.py:53 ../src\gui\main.py:60 +#: ../src\gui\sysTrayIcon.py:38 +msgid "Update profile" +msgstr "Mettre à jour le profil" + +#: ../src\gui\dialogs\urlList.py:26 +msgid "Select an URL" +msgstr "Sélectionnez une URL" + +#: ../src\gui\main.py:62 +msgid "Hide window" +msgstr "Masquer la fenêtre" + +#: ../src\gui\main.py:70 +msgid "Edit keystrokes" +msgstr "Modifier les raccourcis clavier" + +#: ../src\gui\main.py:72 ../src\gui\sysTrayIcon.py:36 +msgid "Preferences" +msgstr "Préférences" + +#: ../src\gui\main.py:74 ../src\gui\main.py:597 ../src\gui\sysTrayIcon.py:46 +msgid "Exit" +msgstr "Sortir" + +#: ../src\gui\main.py:85 +msgid "Add to favourites" +msgstr "Ajouter aux favoris" + +#: ../src\gui\main.py:87 ../src\keystrokeEditor\constants.py:16 +msgid "Remove from favourites" +msgstr "Supprimer des favoris" + +#: ../src\gui\main.py:89 ../src\keystrokeEditor\constants.py:19 +msgid "Show tweet" +msgstr "Voir tweet" + +#: ../src\gui\main.py:112 ../src\keystrokeEditor\constants.py:36 +msgid "Add to list" +msgstr "Ajouter à la liste" + +#: ../src\gui\main.py:114 ../src\keystrokeEditor\constants.py:37 +msgid "Remove from list" +msgstr "Supprimer de la liste" + +#: ../src\gui\main.py:116 +msgid "View lists" +msgstr "Voir la liste" + +#: ../src\gui\main.py:118 +msgid "Show user profile" +msgstr "Voir le profil de l'utilisateur" + +#: ../src\gui\main.py:120 +msgid "Timeline" +msgstr "Chronologie" + +#: ../src\gui\main.py:122 +msgid "View favourites" +msgstr "Voir les favoris" + +#: ../src\gui\main.py:129 +msgid "Autoread tweets for this buffer" +msgstr "Lecture automatique des tweets pour ce tampon" + +#: ../src\gui\main.py:131 +msgid "Clear buffer" +msgstr "Effacer le tampon" + +#: ../src\gui\main.py:133 ../src\keystrokeEditor\constants.py:22 +msgid "Remove buffer" +msgstr "Supprimer le tampon" + +#: ../src\gui\main.py:138 ../src\gui\sysTrayIcon.py:42 +msgid "Documentation" +msgstr "Documentation" + +#: ../src\gui\main.py:140 +msgid "What's new in this version?" +msgstr "Quoi de neuf dans cette version ?" + +#: ../src\gui\main.py:142 ../src\gui\sysTrayIcon.py:44 +msgid "Check for updates" +msgstr "Vérifier les mises à jour" + +#: ../src\gui\main.py:144 ../src\issueReporter\gui.py:34 +msgid "Report an error" +msgstr "Signaler une erreur" + +#: ../src\gui\main.py:146 +msgid "TW Blue website" +msgstr "Site Web de TW Blue" + +#: ../src\gui\main.py:148 +msgid "About TW Blue" +msgstr "A propos de TW Blue" + +#: ../src\gui\main.py:152 +msgid "Application" +msgstr "Application" + +#: ../src\gui\main.py:155 +msgid "Buffer" +msgstr "Tampon" + +#: ../src\gui\main.py:156 +msgid "Help" +msgstr "Aide" + +#: ../src\gui\main.py:249 +msgid "Home" +msgstr "Principal" + +#: ../src\gui\main.py:254 +msgid "Mentions" +msgstr "Mentions" + +#: ../src\gui\main.py:257 +msgid "Direct messages" +msgstr "Messages directs" + +#: ../src\gui\main.py:260 +msgid "Sent" +msgstr "Envoyés" + +#: ../src\gui\main.py:266 +msgid "Favourites" +msgstr "Favoris" + +#: ../src\gui\main.py:278 +msgid "Friends" +msgstr "Following" + +#: ../src\gui\main.py:293 +msgid "Searches" +msgstr "Recherches" + +#: ../src\gui\main.py:303 +msgid "Timelines" +msgstr "Chronologies" + +#: ../src\gui\main.py:306 ../src\gui\main.py:714 +msgid "Timeline for %s" +msgstr "Chronologie de %s" + +#: ../src\gui\main.py:317 +msgid "Favourites timelines" +msgstr "Chronologies des favoris" + +#: ../src\gui\main.py:320 ../src\gui\main.py:745 +msgid "Favourites for %s" +msgstr "Favoris de %s" + +#: ../src\gui\main.py:361 +msgid "Ready" +msgstr "Prêt" + +#: ../src\gui\main.py:388 +msgid "%s favourites from %s" +msgstr "%s favoris de %s" + +#: ../src\gui\main.py:435 +msgid "Streams disconnected. TW Blue will try to reconnect in a minute." +msgstr "Flux déconnectés. TW blue essaie de se reconnecter immédiatement." + +#: ../src\gui\main.py:439 +msgid "Reconnecting streams..." +msgstr "Reconnexion des flux en cours..." + +#: ../src\gui\main.py:463 +msgid "search for %s" +msgstr "recherche pour %s" + +#: ../src\gui\main.py:468 +msgid "search users for %s" +msgstr "recherche d'utilisateurs pour %s" + +#: ../src\gui\main.py:479 ../src\gui\main.py:490 ../src\gui\main.py:509 +msgid "Select the user" +msgstr "Sélectionnez un utilisateur" + +#: ../src\gui\main.py:569 +msgid "User details" +msgstr "Détails de l'utilisateur" + +#: ../src\gui\main.py:577 +msgid "" +"Do you really want to delete this message? It will be eliminated from " +"Twitter as well." +msgstr "" +"Voulez-vous vraiment supprimer ce message ? Il sera également éliminé de " +"Twitter." + +#: ../src\gui\main.py:597 +msgid "Do you really want to close TW Blue?" +msgstr "Voulez-vous vraiment fermer TW Blue ?" + +#: ../src\gui\main.py:687 +msgid "Error while adding to favourites." +msgstr "Erreur lors de l'ajout aux favoris." + +#: ../src\gui\main.py:695 +msgid "Error while removing from favourites." +msgstr "Erreur lors de la suppression des favoris." + +#: ../src\gui\main.py:699 +msgid "Individual timeline" +msgstr "Chronologie individuel" + +#: ../src\gui\main.py:703 ../src\gui\main.py:734 +msgid "The user does not exist" +msgstr "Cet utilisateur n'existe pas sur Twitter" + +#: ../src\gui\main.py:709 +msgid "Existing timeline" +msgstr "Chronologie existante" + +#: ../src\gui\main.py:709 +msgid "" +"There's currently a timeline for this user. You are not able to open another" +msgstr "" +"Une chronologie pour cet utilisateur existe déjà. Impossible d'ouvrir une " +"autre" + +#: ../src\gui\main.py:718 +msgid "This user has no tweets. You can't open a timeline for this user" +msgstr "" +"Cet utilisateur n'a aucun tweets. Vous ne pouvez pas ouvrir une chronologie " +"pour cet utilisateur." + +#: ../src\gui\main.py:730 +msgid "List of favourites" +msgstr "Liste des favoris" + +#: ../src\gui\main.py:740 +msgid "Existing list" +msgstr "Liste existante" + +#: ../src\gui\main.py:740 +msgid "" +"There's already a list of favourites for this user. You can't create another." +msgstr "" +"Il y a déjà une liste de favoris pour cet utilisateur. Vous ne pouvez pas " +"créer une autre." + +#: ../src\gui\main.py:749 +msgid "" +"This user has no favourites. You can't create a list of favourites for this " +"user." +msgstr "" +"Cet utilisateur n'a aucun favori. Vous ne pouvez pas créer une liste de " +"favoris pour cet utilisateur." + +#: ../src\gui\main.py:791 ../src\gui\main.py:804 +msgid "%s, %s of %s" +msgstr "%s, %s de %s" + +#: ../src\gui\main.py:793 ../src\gui\main.py:806 +msgid "%s. Empty" +msgstr "%s. Vide" + +#: ../src\gui\main.py:829 +msgid "Global mute on" +msgstr "Tous muet, activé" + +#: ../src\gui\main.py:832 +msgid "Global mute off" +msgstr "Tous muet, désactivé" + +#: ../src\gui\main.py:838 +msgid "Buffer mute on" +msgstr "Tampon muet activé" + +#: ../src\gui\main.py:841 +msgid "Buffer mute off" +msgstr "Tampon muet désactivé" + +#: ../src\gui\main.py:847 +msgid "The auto-reading of new tweets is enabled for this buffer" +msgstr "La lecture automatique des nouveaux tweets pour ce tampon est activé" + +#: ../src\gui\main.py:850 +msgid "The auto-reading of new tweets is disabled for this buffer" +msgstr "" +"La lecture automatique des nouveaux tweets pour ce tampon est désactivé" + +#: ../src\gui\main.py:857 +msgid "Copied" +msgstr "Copié" + +#: ../src\gui\main.py:868 ../src\gui\main.py:877 +msgid "%s" +msgstr "%s" + +#: ../src\gui\sysTrayIcon.py:40 +msgid "Show / hide" +msgstr "Afficher / masquer" + +#: ../src\issueReporter\gui.py:31 +msgid "always" +msgstr "Toujours" + +#: ../src\issueReporter\gui.py:31 +msgid "have not tried" +msgstr "Pas essayé" + +#: ../src\issueReporter\gui.py:31 +msgid "random" +msgstr "Aléatoire" + +#: ../src\issueReporter\gui.py:31 +msgid "sometimes" +msgstr "Parfois" + +#: ../src\issueReporter\gui.py:31 +msgid "unable to duplicate" +msgstr "Impossible de reproduire" + +#: ../src\issueReporter\gui.py:32 +msgid "block" +msgstr "Blocage" + +#: ../src\issueReporter\gui.py:32 +msgid "crash" +msgstr "Incident" + +#: ../src\issueReporter\gui.py:32 +msgid "feature" +msgstr "Fonctionnalité" + +#: ../src\issueReporter\gui.py:32 +msgid "major" +msgstr "Majeur" + +#: ../src\issueReporter\gui.py:32 +msgid "minor" +msgstr "Mineur" + +#: ../src\issueReporter\gui.py:32 +msgid "text" +msgstr "Texte" + +#: ../src\issueReporter\gui.py:32 +msgid "trivial" +msgstr "Trivial" + +#: ../src\issueReporter\gui.py:32 +msgid "tweak" +msgstr "Réglage" + +#: ../src\issueReporter\gui.py:37 +msgid "Select a category" +msgstr "Sélectionnez une catégorie" + +#: ../src\issueReporter\gui.py:46 +msgid "" +"Briefly describe what happened. You will be able to thoroughly explain it " +"later" +msgstr "" +"Décrivez brièvement ce qui s'est passé. Vous serez en mesure d'expliquer en " +"profondeur par la suite." + +#: ../src\issueReporter\gui.py:56 +msgid "Here, you can describe the bug in detail" +msgstr "Ici vous pouvez décrire l'erreur en détail" + +#: ../src\issueReporter\gui.py:66 +msgid "how often does this bug happen?" +msgstr "Combien de fois se produit cette erreur ?" + +#: ../src\issueReporter\gui.py:74 +msgid "Select the importance that you think this bug has" +msgstr "Sélectionnez l'importance que vous pensez qu'elle a cette erreur" + +#: ../src\issueReporter\gui.py:82 +msgid "" +"I know that the TW Blue bug system will get my Twitter username to contact " +"me and fix the bug quickly" +msgstr "" +"Je sais que le système d'erreurs de TW Blue obtiendra mon nom d'utilisateur " +"de Twitter afin de me contacter et corriger l'erreur rapidement" + +#: ../src\issueReporter\gui.py:85 +msgid "Send report" +msgstr "Envoyer le rapport" + +#: ../src\issueReporter\gui.py:98 +msgid "You must fill out both fields" +msgstr "Vous devez remplir les deux champs" + +#: ../src\issueReporter\gui.py:101 +msgid "" +"You need to mark the checkbox to provide us your twitter username to contact " +"to you if is necessary." +msgstr "" +"Vous devez cocher la case à cocher afin de nous fournir votre nom " +"d'utilisateur de Twitter afin de vous contacter si c'est nécessaire." + +#: ../src\issueReporter\gui.py:120 +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 "" +"Merci d'avoir signalé cette erreur ! ; Dans les versions futures, vous " +"pourrez le trouver dans la liste des changements. Vous avez signalé le " +"numéro d'erreur %i" + +#: ../src\issueReporter\gui.py:120 +msgid "reported" +msgstr "signalé" + +#: ../src\issueReporter\gui.py:123 +msgid "Error while reporting" +msgstr "Erreur lors du signalement du rapport" + +#: ../src\issueReporter\gui.py:123 +msgid "" +"Something unexpected occurred while trying to report the bug. Please, try " +"again later" +msgstr "" +"Quelque chose d'inattendu s'est produit tout en essayant de signaler votre " +"erreur. S'il vous plaît, réessayez plus tard" + +#: ../src\keystrokeEditor\constants.py:4 +msgid "Go up up on the current list" +msgstr "Parcourir la liste actuelle vers le haut" + +#: ../src\keystrokeEditor\constants.py:5 +msgid "Go down up on the current list" +msgstr "Parcourir la liste actuelle vers le bas" + +#: ../src\keystrokeEditor\constants.py:6 +msgid "Go to the previous tab" +msgstr "Aller à l'onglet précédent" + +#: ../src\keystrokeEditor\constants.py:7 +msgid "Go to the next tab" +msgstr "Aller à l'onglet suivant" + +#: ../src\keystrokeEditor\constants.py:8 +msgid "Move up one tweet in the conversation" +msgstr "Aller au tweet précédent dans la conversation" + +#: ../src\keystrokeEditor\constants.py:9 +msgid "Move down one tweet in the conversation" +msgstr "Aller au tweet suivant dans la conversation" + +#: ../src\keystrokeEditor\constants.py:10 +msgid "Show the graphical interface" +msgstr "Afficher l'interface graphique" + +#: ../src\keystrokeEditor\constants.py:12 +msgid "Reply to a tweet" +msgstr "Répondre à un tweet" + +#: ../src\keystrokeEditor\constants.py:14 +msgid "Send direct message" +msgstr "Envoyer un message direct" + +#: ../src\keystrokeEditor\constants.py:15 +msgid "Mark as favourite" +msgstr "Marquer comme favori" + +#: ../src\keystrokeEditor\constants.py:17 +msgid "Open the actions dialogue" +msgstr "Ouvrez la boîte de dialogue des actions" + +#: ../src\keystrokeEditor\constants.py:18 +msgid "See user details" +msgstr "Voir les détails d'un utilisateur" + +#: ../src\keystrokeEditor\constants.py:20 +msgid "Quit" +msgstr "Sortir" + +#: ../src\keystrokeEditor\constants.py:21 +msgid "Open user timeline" +msgstr "Ouvrir une chronologie d'un utilisateur" + +#: ../src\keystrokeEditor\constants.py:23 +msgid "" +"Open URL on the current tweet, or further information for a friend or " +"follower" +msgstr "" +"Ouvrir l'URL dans le tweet actuel, ou voir les détails d'un utilisateur si " +"vous êtes dans la liste following ou follower" + +#: ../src\keystrokeEditor\constants.py:24 +msgid "Attempt to play audio" +msgstr "Lire un audio si disponible" + +#: ../src\keystrokeEditor\constants.py:25 +msgid "Increase volume by 5%" +msgstr "Augmenter le volume de 5%" + +#: ../src\keystrokeEditor\constants.py:26 +msgid "Decrease volume by 5%" +msgstr "Diminuer le volume de 5%" + +#: ../src\keystrokeEditor\constants.py:27 +msgid "Go to the first element on the list" +msgstr "Aller au premier élément de la liste" + +#: ../src\keystrokeEditor\constants.py:28 +msgid "Go to the last element on the list" +msgstr "Aller au dernier élément de la liste" + +#: ../src\keystrokeEditor\constants.py:29 +msgid "Move 20 elements up on the current list" +msgstr "Sauter de 20 éléments vers le haut dans la liste actuelle" + +#: ../src\keystrokeEditor\constants.py:30 +msgid "Move 20 elements down on the current list" +msgstr "Sauter de 20 éléments vers le bas dans la liste actuelle" + +#: ../src\keystrokeEditor\constants.py:31 +msgid "Edit profile" +msgstr "Modifier le profil" + +#: ../src\keystrokeEditor\constants.py:32 +msgid "Remove a tweet or direct message" +msgstr "Supprimer un tweet ou un message direct" + +#: ../src\keystrokeEditor\constants.py:33 +msgid "Empty the buffer removing all the elements" +msgstr "Vider le tampon en retirant tous les éléments" + +#: ../src\keystrokeEditor\constants.py:34 +msgid "Listen the current message" +msgstr "Écouter le message actuel" + +#: ../src\keystrokeEditor\constants.py:35 +msgid "Copy to clipboard" +msgstr "Copier dans le Presse-papiers" + +#: ../src\keystrokeEditor\constants.py:38 +msgid "Mutes/unmutes the active buffer" +msgstr "Activer / désactiver les sons pour le tampon actuel" + +#: ../src\keystrokeEditor\constants.py:39 +msgid "Globally mute/unmute TW Blue" +msgstr "Activer/ désactiver tous les sons pour TW Blue" + +#: ../src\keystrokeEditor\constants.py:40 +msgid "toggles the automatic reading of incoming tweets in the active buffer" +msgstr "" +"Activer ou désactiver la lecture automatique pour les tweets entrants dans " +"le tampon actuel" + +#: ../src\keystrokeEditor\constants.py:41 +msgid "Search on twitter" +msgstr "Rechercher sur twitter" + +#: ../src\keystrokeEditor\constants.py:42 +msgid "Shows the keystroke editor" +msgstr "Afficher le modificateur de commandes" + +#: ../src\keystrokeEditor\constants.py:43 +msgid "Show lists for a specified user" +msgstr "Afficher les listes d'un utilisateur spécifié" + +#: ../src\keystrokeEditor\gui.py:10 +msgid "Keystroke editor" +msgstr "Modifier la commande" + +#: ../src\keystrokeEditor\gui.py:16 +msgid "Select a keystroke to edit" +msgstr "Sélectionnez une commande à modifier" + +#: ../src\keystrokeEditor\gui.py:17 +msgid "Keystroke" +msgstr "Commande" + +#: ../src\keystrokeEditor\gui.py:54 +msgid "Editing keystroke" +msgstr "Modification en cours d'une commande" + +#: ../src\keystrokeEditor\gui.py:61 +msgid "Control" +msgstr "Contrôle" + +#: ../src\keystrokeEditor\gui.py:62 +msgid "Alt" +msgstr "Alt" + +#: ../src\keystrokeEditor\gui.py:63 +msgid "Shift" +msgstr "Maj" + +#: ../src\keystrokeEditor\gui.py:64 +msgid "Windows" +msgstr "Windows" + +#: ../src\keystrokeEditor\gui.py:70 +msgid "Key" +msgstr "Touche" + +#: ../src\keystrokeEditor\gui.py:99 +msgid "You need to use the Windows key" +msgstr "Vous devez utiliser la touche Windows" + +#: ../src\keystrokeEditor\gui.py:99 ../src\keystrokeEditor\gui.py:112 +msgid "Invalid keystroke" +msgstr "Commande invalide" + +#: ../src\keystrokeEditor\gui.py:112 +msgid "You must provide a character for the keystroke" +msgstr "Vous devez fournir une lettre à la commande" + +#: ../src\languageHandler.py:95 +msgid "User default" +msgstr "Utilisateur par défaut" + +#: ../src\sessionmanager\gui.py:19 +msgid "Session manager" +msgstr "Gestionnaire de session" + +#: ../src\sessionmanager\gui.py:23 +msgid "Select a twitter account to start TW Blue" +msgstr "Sélectionnez un compte twitter pour démarrer TW Blue" + +#: ../src\sessionmanager\gui.py:25 +msgid "Account" +msgstr "Compte" + +#: ../src\sessionmanager\gui.py:30 +msgid "New account" +msgstr "Nouveau compte" + +#: ../src\sessionmanager\gui.py:67 +msgid "Account Error" +msgstr "Erreur dans le Compte" + +#: ../src\sessionmanager\gui.py:67 +msgid "You need to configure an account." +msgstr "Vous devez configurer un compte." + +#: ../src\sessionmanager\gui.py:83 +msgid "" +"The request for the required Twitter authorization to continue will be " +"opened on your browser. You only need to do it once. Would you like to " +"autorhise a new account now?" +msgstr "" +"La demande pour obtenir l'autorisation par Twitter s'ouvre dans votre " +"navigateur pour continuer. Cette demande apparaîtera seulement lors du " +"premier démarrage. Vous souhaitez autoriser un nouveau compte maintenant ?" + +#: ../src\sessionmanager\gui.py:94 +msgid "Invalid user token" +msgstr "Code d'accès invalide" + +#: ../src\sessionmanager\gui.py:94 +msgid "" +"Your access token is invalid or the authorisation has failed. Please try " +"again." +msgstr "" +"Votre code d'accès est invalide ou l'autorisation a échoué. S'il vous plaît " +"essayer de nouveau." + +#: ../src\sessionmanager\gui.py:97 +msgid "Authorised account %d" +msgstr "Compte autorisé %d" + +#: ../src\twitter\buffers\indibidual.py:26 +msgid "One tweet from %s" +msgstr "Un tweet de %s" + +#: ../src\twitter\buffers\indibidual.py:35 +msgid "One tweet from %s in the list %s" +msgstr "Un tweet de %s dans la liste %s" + +#: ../src\twitter\buffers\stream.py:57 +msgid "One mention from %s " +msgstr "Une mention de %s" + +#: ../src\twitter\buffers\stream.py:69 +msgid "One direct message" +msgstr "Un message direct" + +#: ../src\twitter\compose.py:22 +msgid "About a week ago" +msgstr "Il y a environ une semaine" + +#: ../src\twitter\compose.py:24 +msgid "About {} weeks ago" +msgstr "Il y a environ {} semaines" + +#: ../src\twitter\compose.py:26 +msgid "A month ago" +msgstr "Il ya un mois" + +#: ../src\twitter\compose.py:28 +msgid "About {} months ago" +msgstr "Il y a environ {} mois" + +#: ../src\twitter\compose.py:30 +msgid "About a year ago" +msgstr "Il y a environ un an" + +#: ../src\twitter\compose.py:32 +msgid "About {} years ago" +msgstr "Il y a environ {} ans" + +#: ../src\twitter\compose.py:34 +msgid "About 1 day ago" +msgstr "Il y a environ 1 jour" + +#: ../src\twitter\compose.py:36 +msgid "About {} days ago" +msgstr "Il y a environ {} jours" + +#: ../src\twitter\compose.py:38 +msgid "just now" +msgstr "juste maintenant" + +#: ../src\twitter\compose.py:40 +msgid "{} seconds ago" +msgstr "Il y a {} secondes" + +#: ../src\twitter\compose.py:42 +msgid "1 minute ago" +msgstr "Il y a environ une minute" + +#: ../src\twitter\compose.py:44 +msgid "{} minutes ago" +msgstr "Il y a environ {} minutes" + +#: ../src\twitter\compose.py:46 +msgid "About 1 hour ago" +msgstr "Il y a environ 1 heure" + +#: ../src\twitter\compose.py:48 +msgid "About {} hours ago" +msgstr "Il y a environ {} heures" + +#: ../src\twitter\compose.py:52 +msgid "January" +msgstr "Janvier" + +#: ../src\twitter\compose.py:53 +msgid "February" +msgstr "Février" + +#: ../src\twitter\compose.py:54 +msgid "March" +msgstr "Mars" + +#: ../src\twitter\compose.py:55 +msgid "April" +msgstr "Avril" + +#: ../src\twitter\compose.py:56 +msgid "May" +msgstr "Mai" + +#: ../src\twitter\compose.py:57 +msgid "June" +msgstr "Juin" + +#: ../src\twitter\compose.py:58 +msgid "July" +msgstr "Juillet" + +#: ../src\twitter\compose.py:59 +msgid "August" +msgstr "Août" + +#: ../src\twitter\compose.py:60 +msgid "September" +msgstr "Septembre" + +#: ../src\twitter\compose.py:61 +msgid "October" +msgstr "Octobre" + +#: ../src\twitter\compose.py:62 +msgid "November" +msgstr "Novembre" + +#: ../src\twitter\compose.py:63 +msgid "December" +msgstr "Décembre" + +#: ../src\twitter\compose.py:66 +msgid "Sunday" +msgstr "Dimanche" + +#: ../src\twitter\compose.py:67 +msgid "Monday" +msgstr "Lundi" + +#: ../src\twitter\compose.py:68 +msgid "Tuesday" +msgstr "Mardi" + +#: ../src\twitter\compose.py:69 +msgid "Wednesday" +msgstr "Mercredi" + +#: ../src\twitter\compose.py:70 +msgid "Thursday" +msgstr "Jeudi" + +#: ../src\twitter\compose.py:71 +msgid "Friday" +msgstr "Vendredi" + +#: ../src\twitter\compose.py:72 +msgid "Saturday" +msgstr "Samedi" + +#: ../src\twitter\compose.py:75 +msgid "sun" +msgstr "Dim" + +#: ../src\twitter\compose.py:76 +msgid "mon" +msgstr "Lun" + +#: ../src\twitter\compose.py:77 +msgid "tue" +msgstr "Mar" + +#: ../src\twitter\compose.py:78 +msgid "wed" +msgstr "Mer" + +#: ../src\twitter\compose.py:79 +msgid "thu" +msgstr "Jeu" + +#: ../src\twitter\compose.py:80 +msgid "fri" +msgstr "Ven" + +#: ../src\twitter\compose.py:81 +msgid "sat" +msgstr "Sam" + +#: ../src\twitter\compose.py:85 +msgid "jan" +msgstr "Jan" + +#: ../src\twitter\compose.py:86 +msgid "feb" +msgstr "Fév" + +#: ../src\twitter\compose.py:87 +msgid "mar" +msgstr "Mar" + +#: ../src\twitter\compose.py:88 +msgid "apr" +msgstr "Avr" + +#: ../src\twitter\compose.py:89 +msgid "may" +msgstr "Mai" + +#: ../src\twitter\compose.py:90 +msgid "jun" +msgstr "Jun" + +#: ../src\twitter\compose.py:91 +msgid "jul" +msgstr "Jul" + +#: ../src\twitter\compose.py:92 +msgid "aug" +msgstr "Aoû" + +#: ../src\twitter\compose.py:93 +msgid "sep" +msgstr "Sep" + +#: ../src\twitter\compose.py:94 +msgid "oct" +msgstr "Oct" + +#: ../src\twitter\compose.py:95 +msgid "nov" +msgstr "Nov" + +#: ../src\twitter\compose.py:96 +msgid "dec" +msgstr "Déc" + +#: ../src\twitter\compose.py:152 +msgid "Dm to %s " +msgstr "Dm à %s" + +#: ../src\twitter\compose.py:185 +msgid "Unavailable" +msgstr "Indisponible" + +#: ../src\twitter\compose.py:186 +msgid "" +"%s (@%s). %s followers, %s friends, %s tweets. Last tweet on %s. Joined " +"Twitter on %s" +msgstr "" +"%s (@%s). %s followers, %s amis, %s tweets. Dernier tweet le %s. A rejoint " +"Twitter le %s" + +#: ../src\twitter\compose.py:190 +msgid "You've blocked %s" +msgstr "Vous avez bloqué à %s" + +#: ../src\twitter\compose.py:192 +msgid "You've unblocked %s" +msgstr "Vous avez débloqué à %s" + +#: ../src\twitter\compose.py:195 +msgid "%s(@%s) has followed you" +msgstr "%s(@%s) vous suit" + +#: ../src\twitter\compose.py:197 +msgid "You've followed %s(@%s)" +msgstr "Vous suivez %s(@%s)" + +#: ../src\twitter\compose.py:199 +msgid "You've unfollowed %s (@%s)" +msgstr "Vous ne suivez plus %s(@%s)" + +#: ../src\twitter\compose.py:202 +msgid "You've added to favourites: %s, %s" +msgstr "Vous avez ajouté aux favoris: %s, %s" + +#: ../src\twitter\compose.py:204 +msgid "%s(@%s) has marked as favorite: %s" +msgstr "%s(@%s) a marqué comme favori: %s" + +#: ../src\twitter\compose.py:206 +msgid "You've removed from favourites: %s, %s" +msgstr "Vous avez supprimé des favoris: %s, %s" + +#: ../src\twitter\compose.py:207 +msgid "%s(@%s) has removed from favourites: %s" +msgstr "%s(@%s) a supprimé des favoris: %s" + +#: ../src\twitter\compose.py:209 +msgid "You've created the list %s" +msgstr "Vous avez créé la liste %s" + +#: ../src\twitter\compose.py:211 +msgid "You've deleted the list %s" +msgstr "Vous avez supprimé la liste %s" + +#: ../src\twitter\compose.py:213 +msgid "You've updated the list %s" +msgstr "Vous avez mis à jour la liste %s" + +#: ../src\twitter\compose.py:215 +msgid "You've added %s(@%s) to the list %s" +msgstr "Vous avez ajouté %s(@%s) à la liste %s" + +#: ../src\twitter\compose.py:216 +msgid "%s(@%s) has added you to the list %s" +msgstr "%s(@%s) vous a ajouté à la liste %s" + +#: ../src\twitter\compose.py:218 +msgid "You'be removed %s(@%s) from the list %s" +msgstr "Vous avez supprimé à %s(@%s) de la liste %s" + +#: ../src\twitter\compose.py:219 +msgid "%s(@%s) has removed you from the list %s" +msgstr "%s(@%s) vous a supprimé de la liste %s" + +#: ../src\twitter\compose.py:221 +msgid "You've subscribed to the list %s, which is owned by %s(@%s)" +msgstr "Vous êtes abonné à la liste %s, qui est la propriété de %s(@%s)" + +#: ../src\twitter\compose.py:222 +msgid "%s(@%s) has suscribed you to the list %s" +msgstr "%s(@%s) vous a abonné à la liste %s" + +#: ../src\twitter\compose.py:224 +msgid "You've unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "Vous êtes désabonné de la liste %s, qui est la propriété de %s(@%s)" + +#: ../src\twitter\compose.py:225 +msgid "You've been unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "" +"Vous avez été désabonné de la liste %s, qui est la propriété de %s(@%s)" + +#: ../src\twitter\compose.py:226 +msgid "Unknown" +msgstr "Inconnu" + +#: ../src\twitter\compose.py:232 +msgid "No description available" +msgstr "Aucune description disponible" + +#: ../src\twitter\compose.py:236 +msgid "private" +msgstr "privé" + +#: ../src\twitter\compose.py:237 +msgid "public" +msgstr "public" + +#: ../src\twitter\twitter.py:73 +msgid "%s failed. Reason: %s" +msgstr "%s erreur. Raison: %s" + +#: ../src\twitter\twitter.py:80 +msgid "%s succeeded." +msgstr "%s réussi." + +#: ../src\updater\update_manager.py:14 +msgid "Your TW Blue version is up to date" +msgstr "Votre version de TW Blue est à jour" + +#: ../src\updater\update_manager.py:14 ../src\updater\update_manager.py:27 +msgid "Update" +msgstr "Mise à jour" + +#: ../src\updater\update_manager.py:20 +msgid "New version for %s" +msgstr "Nouvelle version de %s" + +#: ../src\updater\update_manager.py:20 +msgid "" +"There's a new TW Blue version available. Would you like to download it now?" +msgstr "" +"Il existe une nouvelle version de TW Blue. Vous souhaitez télécharger la " +"mise à jour maintenant ?" + +#: ../src\updater\update_manager.py:22 +msgid "Download in Progress" +msgstr "Téléchargement en cours" + +#: ../src\updater\update_manager.py:22 +msgid "Downloading the new version..." +msgstr "Téléchargement en cours de la nouvelle version..." + +#: ../src\updater\update_manager.py:29 +msgid "Done!" +msgstr "Terminé !" + +#: ../src\updater\update_manager.py:29 +msgid "" +"The new TW Blue version has been downloaded and installed. Press OK to start " +"the application." +msgstr "" +"La nouvelle version de TW Blue a été téléchargée et installée. Appuyez sur " +"OK pour démarrer l'application." + +#~ msgid "Tweet - %i characters" +#~ msgstr "Tweet - %i caractères" + +#~ msgid "%A, %B %d, %Y at %I:%M:%S %p" +#~ msgstr "%A, %B %d, %Y %I:%M:%S %p" + +#~ msgid "View members" +#~ msgstr "¿¿¿Ver miembros" + +#~ msgid "View subscribers" +#~ msgstr "Ver suscriptores" + +#~ msgid "Mention to %s" +#~ msgstr "Mencionar a %s" + +#~ msgid "Ouner" +#~ msgstr "propietario" diff --git a/src/locales/gl/LC_MESSAGES/twblue.mo b/src/locales/gl/LC_MESSAGES/twblue.mo new file mode 100644 index 00000000..e26ecd58 Binary files /dev/null and b/src/locales/gl/LC_MESSAGES/twblue.mo differ diff --git a/src/locales/gl/LC_MESSAGES/twblue.po b/src/locales/gl/LC_MESSAGES/twblue.po new file mode 100644 index 00000000..ac400e19 --- /dev/null +++ b/src/locales/gl/LC_MESSAGES/twblue.po @@ -0,0 +1,2460 @@ +msgid "" +msgstr "" +"Project-Id-Version: TW Blue 0.46\n" +"POT-Creation-Date: 2014-09-07 07:44+Hora de verano central (México)\n" +"PO-Revision-Date: 2014-09-07 14:50+0100\n" +"Last-Translator: Jose Manuel Delicado Alcolea \n" +"Language-Team: Javier Curras, José Manuel Delicado, Alba Quinteiro " +"\n" +"Language: gl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.6.9\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" + +#: ../src\extra\AudioUploader\gui.py:31 ../src\gui\dialogs\message.py:169 +#: ../src\gui\dialogs\message.py:256 +msgid "Attach audio" +msgstr "Adxuntar audio" + +#: ../src\extra\AudioUploader\gui.py:38 ../src\extra\AudioUploader\gui.py:146 +#: ../src\extra\AudioUploader\gui.py:156 +msgid "Play" +msgstr "Reproducir" + +#: ../src\extra\AudioUploader\gui.py:41 ../src\extra\AudioUploader\gui.py:75 +#: ../src\extra\AudioUploader\gui.py:80 ../src\extra\AudioUploader\gui.py:107 +msgid "Pause" +msgstr "PAUSAR" + +#: ../src\extra\AudioUploader\gui.py:44 ../src\extra\AudioUploader\gui.py:103 +msgid "Record" +msgstr "Grabar" + +#: ../src\extra\AudioUploader\gui.py:47 +msgid "Add an existing file" +msgstr "Engadir un arquivo existente" + +#: ../src\extra\AudioUploader\gui.py:49 +msgid "Discard" +msgstr "Descartar" + +#: ../src\extra\AudioUploader\gui.py:52 +msgid "Upload to" +msgstr "Subir a" + +#: ../src\extra\AudioUploader\gui.py:57 +msgid "Attach" +msgstr "Adxuntar" + +#: ../src\extra\AudioUploader\gui.py:59 ../src\issueReporter\gui.py:88 +msgid "Cancel" +msgstr "Cancelar" + +#: ../src\extra\AudioUploader\gui.py:77 ../src\extra\AudioUploader\gui.py:78 +msgid "Resume" +msgstr "RETOMAR" + +#: ../src\extra\AudioUploader\gui.py:95 +msgid "Stop recording" +msgstr "Deter grabación" + +#: ../src\extra\AudioUploader\gui.py:96 +msgid "Recording" +msgstr "Grabando" + +#: ../src\extra\AudioUploader\gui.py:101 ../src\extra\AudioUploader\gui.py:153 +msgid "Stopped" +msgstr "Detido" + +#: ../src\extra\AudioUploader\gui.py:128 ../src\gui\dialogs\message.py:218 +#: ../src\gui\dialogs\update_profile.py:87 +msgid "Discarded" +msgstr "Descartado" + +#: ../src\extra\AudioUploader\gui.py:138 ../src\gui\buffers\base.py:303 +#: ../src\gui\buffers\base.py:315 +msgid "Playing..." +msgstr "Reproducindo..." + +#: ../src\extra\AudioUploader\gui.py:142 +msgid "Stop" +msgstr "Deter" + +#: ../src\extra\AudioUploader\gui.py:161 +msgid "Recoding audio..." +msgstr "Recodificando audio..." + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Audio Files (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" +msgstr "Arquivos de audio (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Select the audio file to be uploaded" +msgstr "Seleciona o arquivo de audio que desexas subir" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:15 +msgid "File" +msgstr "Arquivo" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:21 +msgid "Transferred" +msgstr "Transferido" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:26 +msgid "Total file size" +msgstr "Tamaño total do arquivo" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:31 +msgid "Transfer rate" +msgstr "Velocidade de transferencia" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:36 +msgid "Time left" +msgstr "Tempo restante" + +#: ../src\extra\AudioUploader\utils.py:27 +msgid "%d day, " +msgstr "%d día, " + +#: ../src\extra\AudioUploader\utils.py:29 +msgid "%d days, " +msgstr "%d días, " + +#: ../src\extra\AudioUploader\utils.py:31 +msgid "%d hour, " +msgstr "%d hora, " + +#: ../src\extra\AudioUploader\utils.py:33 +msgid "%d hours, " +msgstr "%d horas, " + +#: ../src\extra\AudioUploader\utils.py:35 +msgid "%d minute, " +msgstr "%d minuto, " + +#: ../src\extra\AudioUploader\utils.py:37 +msgid "%d minutes, " +msgstr "%d minutos, " + +#: ../src\extra\AudioUploader\utils.py:39 +msgid "%s second" +msgstr "%s segundo" + +#: ../src\extra\AudioUploader\utils.py:41 +msgid "%s seconds" +msgstr "%s segundos" + +#: ../src\extra\SoundsTutorial\gui.py:11 +msgid "The tweet may contain a playable audio" +msgstr "O chío TEN QUE CONTER UN AUDIO VÁLIDO" + +#: ../src\extra\SoundsTutorial\gui.py:12 +msgid "A timeline has been created" +msgstr "creouse unha liña temporal" + +#: ../src\extra\SoundsTutorial\gui.py:13 +msgid "A timeline has been deleted" +msgstr "borrouse unha liña temporal" + +#: ../src\extra\SoundsTutorial\gui.py:14 +msgid "You've received a direct message" +msgstr "Recibiches unha mensaxe directa" + +#: ../src\extra\SoundsTutorial\gui.py:15 +msgid "You've sent a direct message" +msgstr "Enviaches unha mensaxe directa" + +#: ../src\extra\SoundsTutorial\gui.py:16 +msgid "A bug has happened" +msgstr "ocorreu un erro" + +#: ../src\extra\SoundsTutorial\gui.py:17 +msgid "You've added a tweet to your favourites" +msgstr "Engadiches un chío aos teus favoritos" + +#: ../src\extra\SoundsTutorial\gui.py:18 +msgid "Someone's favourites have been updated" +msgstr "os favoritos de alguén actualizáronse" + +#: ../src\extra\SoundsTutorial\gui.py:19 +msgid "There are no more tweets to read" +msgstr "non hai máis chíos para ler" + +#: ../src\extra\SoundsTutorial\gui.py:20 +msgid "A list has a new tweet" +msgstr "unha listaxe ten un twit novo" + +#: ../src\extra\SoundsTutorial\gui.py:21 +msgid "You can't add any more characters on the tweet" +msgstr "non podes engadir máis caracteres ao chío" + +#: ../src\extra\SoundsTutorial\gui.py:22 +msgid "You've been mentioned " +msgstr "fuches mencionado" + +#: ../src\extra\SoundsTutorial\gui.py:23 +msgid "A new event has happened" +msgstr "ocorreu un novo evento" + +#: ../src\extra\SoundsTutorial\gui.py:24 +msgid "TW Blue is ready " +msgstr "tw blue está listo" + +#: ../src\extra\SoundsTutorial\gui.py:25 +msgid "You've replied" +msgstr "respondiches" + +#: ../src\extra\SoundsTutorial\gui.py:26 +msgid "You've retweeted" +msgstr "Rechouchiaches" + +#: ../src\extra\SoundsTutorial\gui.py:27 +msgid "A search has been updated" +msgstr "actualizouse unha procura" + +#: ../src\extra\SoundsTutorial\gui.py:28 +msgid "There's a new tweet in the main buffer" +msgstr "hai un novo chío no buffer principal" + +#: ../src\extra\SoundsTutorial\gui.py:29 +msgid "You've sent a tweet" +msgstr "enviaches un chío" + +#: ../src\extra\SoundsTutorial\gui.py:30 +msgid "There's a new tweet in a timeline" +msgstr "hai un novo chío nunha liña temporal" + +#: ../src\extra\SoundsTutorial\gui.py:31 +msgid "You have a new follower" +msgstr "tes un novo seguidor" + +#: ../src\extra\SoundsTutorial\gui.py:32 +msgid "You've turned the volume up or down" +msgstr "cambiaches o volume" + +#: ../src\extra\SoundsTutorial\gui.py:36 +msgid "" +"It seems as though the currently used sound pack needs an update. %i fails " +"are still be required to use this function. Make sure to obtain the needed " +"lacking sounds or to contact with the sound pack developer." +msgstr "" +"parece que o paquete de sons utilizado precisa de ser actualizado. Os " +"arquivos %i son necesarios para esta función. Asegúrate de ter os sons " +"necesarios ou contacta co creador do paquete" + +#: ../src\extra\SoundsTutorial\gui.py:36 ../src\extra\SpellChecker\gui.py:34 +#: ../src\gui\dialogs\show_user.py:63 ../src\gui\main.py:703 +#: ../src\gui\main.py:734 ../src\issueReporter\gui.py:98 +#: ../src\issueReporter\gui.py:101 +msgid "Error" +msgstr "Erro" + +#: ../src\extra\SoundsTutorial\gui.py:38 ../src\gui\main.py:68 +msgid "Sounds tutorial" +msgstr "tutorial de sons" + +#: ../src\extra\SoundsTutorial\gui.py:41 +msgid "Press enter to listen to the sound for the selected event" +msgstr "" +"preme enter para escoitar o sonido correspondente ao evento selecionado" + +#: ../src\extra\SpellChecker\gui.py:34 +msgid "" +"A bug has happened. There are no dictionaries available for the selected " +"language in TW Blue" +msgstr "" +"ocorreu un erro. Non hai diccionarios dispoñibles para o idioma selecionado " +"en tw blue" + +#: ../src\extra\SpellChecker\gui.py:38 +msgid "Mis-spelled word" +msgstr "palabra mal escrita" + +#: ../src\extra\SpellChecker\gui.py:43 +msgid "Context" +msgstr "contexto" + +#: ../src\extra\SpellChecker\gui.py:48 +msgid "Suggestions" +msgstr "suxerencias" + +#: ../src\extra\SpellChecker\gui.py:53 +msgid "Ignore" +msgstr "ignorar" + +#: ../src\extra\SpellChecker\gui.py:55 +msgid "Ignore all" +msgstr "ignorar todo" + +#: ../src\extra\SpellChecker\gui.py:57 +msgid "Replace" +msgstr "reemplazar" + +#: ../src\extra\SpellChecker\gui.py:59 +msgid "Replace all" +msgstr "reemplazar todo" + +#: ../src\extra\SpellChecker\gui.py:78 +msgid "Mis-spelled word: %s" +msgstr "palabra mal escrita: %s" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "Finished" +msgstr "Rematado" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "The spelling review has finished." +msgstr "a revisión ortográfica rematou" + +#: ../src\extra\translator\gui.py:24 ../src\gui\dialogs\message.py:177 +#: ../src\gui\dialogs\message.py:264 ../src\gui\dialogs\message.py:350 +msgid "Translate message" +msgstr "Traducir mensaxe" + +#: ../src\extra\translator\gui.py:27 +msgid "Source language" +msgstr "Idioma de orixe" + +#: ../src\extra\translator\gui.py:30 +msgid "Target language" +msgstr "Idioma de destino" + +#: ../src\extra\translator\translator.py:53 +msgid "Afrikaans" +msgstr "Africano" + +#: ../src\extra\translator\translator.py:54 +msgid "Albanian" +msgstr "albanés" + +#: ../src\extra\translator\translator.py:55 +msgid "Amharic" +msgstr "amárico" + +#: ../src\extra\translator\translator.py:56 +msgid "Arabic" +msgstr "árabe" + +#: ../src\extra\translator\translator.py:57 +msgid "Armenian" +msgstr "armenio" + +#: ../src\extra\translator\translator.py:58 +msgid "Azerbaijani" +msgstr "acerí" + +#: ../src\extra\translator\translator.py:59 +msgid "Basque" +msgstr "eusquera" + +#: ../src\extra\translator\translator.py:60 +msgid "Belarusian" +msgstr "bielorruso" + +#: ../src\extra\translator\translator.py:61 +msgid "Bengali" +msgstr "bengalí" + +#: ../src\extra\translator\translator.py:62 +msgid "Bihari" +msgstr "Bihari" + +#: ../src\extra\translator\translator.py:63 +msgid "Bulgarian" +msgstr "búlgaro" + +#: ../src\extra\translator\translator.py:64 +msgid "Burmese" +msgstr "virmano" + +#: ../src\extra\translator\translator.py:65 +msgid "Catalan" +msgstr "catalán" + +#: ../src\extra\translator\translator.py:66 +msgid "Cherokee" +msgstr "cheroqui" + +#: ../src\extra\translator\translator.py:67 +msgid "Chinese" +msgstr "chinés" + +#: ../src\extra\translator\translator.py:68 +msgid "Chinese_simplified" +msgstr "chinés simplificado" + +#: ../src\extra\translator\translator.py:69 +msgid "Chinese_traditional" +msgstr "chinés tradicional" + +#: ../src\extra\translator\translator.py:70 +msgid "Croatian" +msgstr "croata" + +#: ../src\extra\translator\translator.py:71 +msgid "Czech" +msgstr "checo" + +#: ../src\extra\translator\translator.py:72 +msgid "Danish" +msgstr "dinamarqués" + +#: ../src\extra\translator\translator.py:73 +msgid "Dhivehi" +msgstr "Dhivehi" + +#: ../src\extra\translator\translator.py:74 +msgid "Dutch" +msgstr "holandés" + +#: ../src\extra\translator\translator.py:75 +msgid "English" +msgstr "inglés" + +#: ../src\extra\translator\translator.py:76 +msgid "Esperanto" +msgstr "esperanto" + +#: ../src\extra\translator\translator.py:77 +msgid "Estonian" +msgstr "estonio" + +#: ../src\extra\translator\translator.py:78 +msgid "Filipino" +msgstr "filipino" + +#: ../src\extra\translator\translator.py:79 +msgid "Finnish" +msgstr "finés" + +#: ../src\extra\translator\translator.py:80 +msgid "French" +msgstr "francés" + +#: ../src\extra\translator\translator.py:81 +msgid "Galician" +msgstr "galego" + +#: ../src\extra\translator\translator.py:82 +msgid "Georgian" +msgstr "Xeorxiano" + +#: ../src\extra\translator\translator.py:83 +msgid "German" +msgstr "alemán" + +#: ../src\extra\translator\translator.py:84 +msgid "Greek" +msgstr "grego" + +#: ../src\extra\translator\translator.py:85 +msgid "Guarani" +msgstr "guaraní" + +#: ../src\extra\translator\translator.py:86 +msgid "Gujarati" +msgstr "Gujarati" + +#: ../src\extra\translator\translator.py:87 +msgid "Hebrew" +msgstr "hebreo" + +#: ../src\extra\translator\translator.py:88 +msgid "Hindi" +msgstr "indi" + +#: ../src\extra\translator\translator.py:89 +msgid "Hungarian" +msgstr "húngaro" + +#: ../src\extra\translator\translator.py:90 +msgid "Icelandic" +msgstr "islandés" + +#: ../src\extra\translator\translator.py:91 +msgid "Indonesian" +msgstr "indonesio" + +#: ../src\extra\translator\translator.py:92 +msgid "Inuktitut" +msgstr "Inuktitut" + +#: ../src\extra\translator\translator.py:93 +msgid "Irish" +msgstr "irlandés (gaélico)" + +#: ../src\extra\translator\translator.py:94 +msgid "Italian" +msgstr "italiano" + +#: ../src\extra\translator\translator.py:95 +msgid "Japanese" +msgstr "xaponés" + +#: ../src\extra\translator\translator.py:96 +msgid "Kannada" +msgstr "Canarés" + +#: ../src\extra\translator\translator.py:97 +msgid "Kazakh" +msgstr "cazaxo" + +#: ../src\extra\translator\translator.py:98 +msgid "Khmer" +msgstr "Cambodia" + +#: ../src\extra\translator\translator.py:99 +msgid "Korean" +msgstr "coreano" + +#: ../src\extra\translator\translator.py:100 +msgid "Kurdish" +msgstr "curdo" + +#: ../src\extra\translator\translator.py:101 +msgid "Kyrgyz" +msgstr "Quirguiz" + +#: ../src\extra\translator\translator.py:102 +msgid "Laothian" +msgstr "Lao" + +#: ../src\extra\translator\translator.py:103 +msgid "Latvian" +msgstr "letón" + +#: ../src\extra\translator\translator.py:104 +msgid "Lithuanian" +msgstr "lituano" + +#: ../src\extra\translator\translator.py:105 +msgid "Macedonian" +msgstr "macedonio" + +#: ../src\extra\translator\translator.py:106 +msgid "Malay" +msgstr "malaio" + +#: ../src\extra\translator\translator.py:107 +msgid "Malayalam" +msgstr "Malaialam" + +#: ../src\extra\translator\translator.py:108 +msgid "Maltese" +msgstr "maltés" + +#: ../src\extra\translator\translator.py:109 +msgid "Marathi" +msgstr "maratí" + +#: ../src\extra\translator\translator.py:110 +msgid "Mongolian" +msgstr "mongol" + +#: ../src\extra\translator\translator.py:111 +msgid "Nepali" +msgstr "nepalí" + +#: ../src\extra\translator\translator.py:112 +msgid "Norwegian" +msgstr "noruegués" + +#: ../src\extra\translator\translator.py:113 +msgid "Oriya" +msgstr "Oriya" + +#: ../src\extra\translator\translator.py:114 +msgid "Pashto" +msgstr "Pastú" + +#: ../src\extra\translator\translator.py:115 +msgid "Persian" +msgstr "persa" + +#: ../src\extra\translator\translator.py:116 +msgid "Polish" +msgstr "polaco" + +#: ../src\extra\translator\translator.py:117 +msgid "Portuguese" +msgstr "portugués" + +#: ../src\extra\translator\translator.py:118 +msgid "Punjabi" +msgstr "Punjabi" + +#: ../src\extra\translator\translator.py:119 +msgid "Romanian" +msgstr "rumano" + +#: ../src\extra\translator\translator.py:120 +msgid "Russian" +msgstr "ruso" + +#: ../src\extra\translator\translator.py:121 +msgid "Sanskrit" +msgstr "sánscrito" + +#: ../src\extra\translator\translator.py:122 +msgid "Serbian" +msgstr "serbio" + +#: ../src\extra\translator\translator.py:123 +msgid "Sindhi" +msgstr "Sindhi" + +#: ../src\extra\translator\translator.py:124 +msgid "Sinhalese" +msgstr "Cingalés" + +#: ../src\extra\translator\translator.py:125 +msgid "Slovak" +msgstr "eslovaco" + +#: ../src\extra\translator\translator.py:126 +msgid "Slovenian" +msgstr "esloveno" + +#: ../src\extra\translator\translator.py:127 +msgid "Spanish" +msgstr "castelán" + +#: ../src\extra\translator\translator.py:128 +msgid "Swahili" +msgstr "swahili" + +#: ../src\extra\translator\translator.py:129 +msgid "Swedish" +msgstr "sueco" + +#: ../src\extra\translator\translator.py:130 +msgid "Tajik" +msgstr "Tajik" + +#: ../src\extra\translator\translator.py:131 +msgid "Tamil" +msgstr "tamil" + +#: ../src\extra\translator\translator.py:132 +msgid "Tagalog" +msgstr "Tagalo" + +#: ../src\extra\translator\translator.py:133 +msgid "Telugu" +msgstr "Telugú" + +#: ../src\extra\translator\translator.py:134 +msgid "Thai" +msgstr "tailandés" + +#: ../src\extra\translator\translator.py:135 +msgid "Tibetan" +msgstr "tibetano" + +#: ../src\extra\translator\translator.py:136 +msgid "Turkish" +msgstr "Turco" + +#: ../src\extra\translator\translator.py:137 +msgid "Ukrainian" +msgstr "Ucraíno" + +#: ../src\extra\translator\translator.py:138 +msgid "Urdu" +msgstr "Urdu" + +#: ../src\extra\translator\translator.py:139 +msgid "Uzbek" +msgstr "uzbeco" + +#: ../src\extra\translator\translator.py:140 +msgid "Uighur" +msgstr "Uighur" + +#: ../src\extra\translator\translator.py:141 +msgid "Vietnamese" +msgstr "vietnamita" + +#: ../src\extra\translator\translator.py:142 +msgid "Welsh" +msgstr "galés" + +#: ../src\extra\translator\translator.py:143 +msgid "Yiddish" +msgstr "Yiddish" + +#: ../src\extra\translator\translator.py:150 +msgid "autodetect" +msgstr "Autodetectar" + +#: ../src\gui\buffers\base.py:54 +msgid "Client" +msgstr "Cliente" + +#: ../src\gui\buffers\base.py:54 +msgid "Text" +msgstr "Texto" + +#: ../src\gui\buffers\base.py:54 ../src\gui\buffers\events.py:57 +msgid "Date" +msgstr "Data" + +#: ../src\gui\buffers\base.py:54 ../src\gui\buffers\people.py:39 +#: ../src\gui\buffers\user_searches.py:31 ../src\gui\dialogs\utils.py:36 +#: ../src\gui\main.py:154 +msgid "User" +msgstr "Usuario" + +#: ../src\gui\buffers\base.py:73 ../src\gui\buffers\base.py:192 +#: ../src\gui\buffers\events.py:58 ../src\gui\buffers\events.py:74 +#: ../src\gui\dialogs\message.py:332 ../src\gui\main.py:79 +#: ../src\gui\main.py:153 ../src\gui\sysTrayIcon.py:34 +msgid "Tweet" +msgstr "Chío" + +#: ../src\gui\buffers\base.py:75 ../src\gui\buffers\base.py:204 +#: ../src\gui\main.py:83 ../src\keystrokeEditor\constants.py:13 +msgid "Retweet" +msgstr "Rechouchío" + +#: ../src\gui\buffers\base.py:77 ../src\gui\main.py:81 +msgid "Reply" +msgstr "Responder" + +#: ../src\gui\buffers\base.py:79 ../src\gui\main.py:110 +msgid "Direct message" +msgstr "Mensaxe directa" + +#: ../src\gui\buffers\base.py:92 +msgid "Do you really want to delete this timeline?" +msgstr "¿Realmente desexas eliminar esta liña temporal?" + +#: ../src\gui\buffers\base.py:92 ../src\gui\buffers\favourites.py:41 +#: ../src\gui\buffers\lists.py:46 ../src\gui\buffers\trends.py:41 +#: ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Attention" +msgstr "Atención" + +#: ../src\gui\buffers\base.py:104 +msgid "This buffer is not a timeline; it can't be deleted." +msgstr "Este buffer non é unha liña temporal. Non pode ser eliminado." + +#: ../src\gui\buffers\base.py:184 ../src\gui\buffers\dm.py:44 +#: ../src\gui\buffers\people.py:54 +msgid "Direct message to %s" +msgstr "Mensaxe directa a %s" + +#: ../src\gui\buffers\base.py:192 ../src\gui\buffers\events.py:74 +msgid "Write the tweet here" +msgstr "Escribe o chío aquí" + +#: ../src\gui\buffers\base.py:204 +msgid "Would you like to add a comment to this tweet?" +msgstr "¿gustaríache engadir un comentario a este chío?" + +#: ../src\gui\buffers\base.py:207 +msgid "Add your comment to the tweet" +msgstr "Engade o teu comentario ao chío" + +#: ../src\gui\buffers\base.py:223 ../src\gui\buffers\people.py:62 +msgid "Reply to %s" +msgstr "Responder a %s" + +#: ../src\gui\buffers\base.py:268 +msgid "Opening URL..." +msgstr "Abrindo URL..." + +#: ../src\gui\buffers\base.py:285 ../src\gui\buffers\events.py:118 +msgid "" +"Do you really want to empty this buffer? It's tweets will be removed from " +"the list but not from Twitter" +msgstr "" +"¿realmente queres borrar o contido deste buffer? Estes chíos borraranse da " +"listaxe, mais non de twitter" + +#: ../src\gui\buffers\base.py:285 ../src\gui\buffers\events.py:118 +msgid "Empty buffer" +msgstr "Vaciar buffer" + +#: ../src\gui\buffers\base.py:290 ../src\gui\buffers\events.py:122 +msgid "Do you really want to delete this message?" +msgstr "¿Realmente queres eliminar esta mensaxe?" + +#: ../src\gui\buffers\base.py:290 ../src\gui\buffers\events.py:122 +#: ../src\gui\dialogs\lists.py:107 ../src\gui\main.py:91 +#: ../src\gui\main.py:577 +msgid "Delete" +msgstr "Eliminar" + +#: ../src\gui\buffers\base.py:310 ../src\gui\buffers\base.py:321 +msgid "Unable to play audio." +msgstr "Imposible reproducir audio" + +#: ../src\gui\buffers\base.py:312 +msgid "Audio stopped." +msgstr "Audio detido" + +#: ../src\gui\buffers\events.py:40 +msgid "Empty" +msgstr "Valeiro" + +#: ../src\gui\buffers\events.py:57 +msgid "Event" +msgstr "Evento" + +#: ../src\gui\buffers\events.py:60 +msgid "Remove event" +msgstr "Eliminar evento" + +#: ../src\gui\buffers\favourites.py:41 +msgid "Do you really want to delete this favourites timeline?" +msgstr "Realmente desexas eliminar esta liña temporal de favoritos?" + +#: ../src\gui\buffers\lists.py:46 ../src\gui\dialogs\lists.py:107 +msgid "Do you really want to delete this list?" +msgstr "¿Realmente desexas eliminar esta listaxe?" + +#: ../src\gui\buffers\panels.py:27 +msgid "Announce" +msgstr "Anuncio" + +#: ../src\gui\buffers\people.py:44 +msgid "Mention" +msgstr "Mención" + +#: ../src\gui\buffers\trends.py:41 ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Do you really want to delete this search term?" +msgstr "Realmente queres borrar este termo de procura?" + +#: ../src\gui\dialogs\configuration.py:39 +msgid "Language" +msgstr "Idioma" + +#: ../src\gui\dialogs\configuration.py:53 +msgid "Relative times" +msgstr "Tempos relativos" + +#: ../src\gui\dialogs\configuration.py:57 +msgid "Activate Sapi5 when any other screen reader is not being run" +msgstr "activar sappy 5 cando ningún outro lector se estea a executar" + +#: ../src\gui\dialogs\configuration.py:60 +msgid "Activate the auto-start of the invisible interface" +msgstr "activar xanela invisible ao iniciar" + +#: ../src\gui\dialogs\configuration.py:64 +msgid "" +"API calls when the stream is started (One API call equals to 200 tweetts, " +"two API calls equals 400 tweets, etc):" +msgstr "" +"Chamadas á API cando o stream inicie, unha chamada é igual a 200 tuits, dúas " +"a 400 etc" + +#: ../src\gui\dialogs\configuration.py:72 +msgid "Items on each API call" +msgstr "Elementos por cada chamada á API" + +#: ../src\gui\dialogs\configuration.py:79 +msgid "" +"Inverted buffers: The newest tweets will be shown at the beginning of the " +"lists while the oldest at the end" +msgstr "" +"Buffers invertidos. Os novos chíos mostraranse ao comezo da listaxe e os " +"máis vellos ao final." + +#: ../src\gui\dialogs\configuration.py:94 +msgid "Show followers" +msgstr "Mostrar seguidores" + +#: ../src\gui\dialogs\configuration.py:97 +msgid "Show friends" +msgstr "Mostrar amigos" + +#: ../src\gui\dialogs\configuration.py:100 +msgid "Show favourites" +msgstr "Mostrar favoritos" + +#: ../src\gui\dialogs\configuration.py:103 +msgid "Show blocked users" +msgstr "Mostrar usuarios bloqueados" + +#: ../src\gui\dialogs\configuration.py:106 +msgid "Show muted users" +msgstr "Mostrar usuarios silenciados" + +#: ../src\gui\dialogs\configuration.py:109 +msgid "Show events" +msgstr "Mostrar eventos" + +#: ../src\gui\dialogs\configuration.py:119 +#: ../src\gui\dialogs\configuration.py:267 +msgid "Ignored clients" +msgstr "Clientes rexeitados" + +#: ../src\gui\dialogs\configuration.py:125 +msgid "Add client" +msgstr "Endadir cliente" + +#: ../src\gui\dialogs\configuration.py:126 +msgid "Remove client" +msgstr "Quitar cliente" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Add a new ignored client" +msgstr "Engadir un novo cliente rexeitado" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Enter the name of the client here" +msgstr "Introduce o nome do cliente" + +#: ../src\gui\dialogs\configuration.py:154 +msgid "Volume" +msgstr "volume" + +#: ../src\gui\dialogs\configuration.py:163 +msgid "Global mute" +msgstr "silencio xeral" + +#: ../src\gui\dialogs\configuration.py:167 +msgid "Output device" +msgstr "dispositivo de saída" + +#: ../src\gui\dialogs\configuration.py:176 +msgid "Input device" +msgstr "dispositivo de entrada" + +#: ../src\gui\dialogs\configuration.py:184 +msgid "" +"If you've got a SndUp account, enter your API Key here. Whether the API Key " +"is wrong, the App will fail to upload anything to the server. Whether " +"there's no API Key here, then the audio files will be uploaded anonimously" +msgstr "" +"Se tes unha conta en SndUp, introduce o teu API key neste campo. Se o API " +"key non é correcto, o programa non poderá subir nada. Se non pos ningún api " +"key, os audios subiranse de forma anónima" + +#: ../src\gui\dialogs\configuration.py:197 +msgid "Sound pack" +msgstr "Paquete de sons" + +#: ../src\gui\dialogs\configuration.py:213 +#: ../src\gui\dialogs\configuration.py:237 +msgid "Unlink your Dropbox account" +msgstr "desenlaza a túa conta de dropbox" + +#: ../src\gui\dialogs\configuration.py:215 +#: ../src\gui\dialogs\configuration.py:232 +#: ../src\gui\dialogs\configuration.py:240 +#: ../src\gui\dialogs\configuration.py:244 +#: ../src\gui\dialogs\configuration.py:251 +msgid "Link your Dropbox account" +msgstr "enlaza a túa conta de dropbox" + +#: ../src\gui\dialogs\configuration.py:225 +msgid "" +"The authorisation request will be shown on your browser. Copy the code tat " +"Dropbox will provide and, in the text box that will appear on TW Blue, paste " +"it. This code is necessary to continue. You only need to do it once." +msgstr "" +"Abrirase o teu navegador web coa solicitude que precisas a fin de iniciar " +"sesión. Copia e pega no cadro de edición o código que dropbox vaiche " +"proporcionar para poder iniciar sesión. Isto só terás que facelo unha vez" + +#: ../src\gui\dialogs\configuration.py:225 ../src\sessionmanager\gui.py:83 +msgid "Authorisation" +msgstr "Autorización" + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Enter the code here." +msgstr "Introduce o código aquí" + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Verification code" +msgstr "Código de verificación" + +#: ../src\gui\dialogs\configuration.py:239 +msgid "Error during authorisation. Try again later." +msgstr "Erro durante a autorización. Téntao de novo máis tarde" + +#: ../src\gui\dialogs\configuration.py:239 ../src\gui\main.py:718 +#: ../src\gui\main.py:749 +msgid "Error!" +msgstr "Erro!" + +#: ../src\gui\dialogs\configuration.py:258 +msgid "TW Blue preferences" +msgstr "Preferencias do TW Blue" + +#: ../src\gui\dialogs\configuration.py:262 ../src\issueReporter\gui.py:30 +msgid "General" +msgstr "Xeral" + +#: ../src\gui\dialogs\configuration.py:265 +msgid "Show other buffers" +msgstr "Mostrar outros buffers" + +#: ../src\gui\dialogs\configuration.py:269 +msgid "Sound" +msgstr "son" + +#: ../src\gui\dialogs\configuration.py:271 +msgid "Audio Services" +msgstr "servizos de audio" + +#: ../src\gui\dialogs\configuration.py:274 +msgid "Save" +msgstr "Gardar" + +#: ../src\gui\dialogs\configuration.py:277 ../src\gui\dialogs\follow.py:64 +#: ../src\gui\dialogs\message.py:182 ../src\gui\dialogs\message.py:269 +#: ../src\gui\dialogs\message.py:352 ../src\gui\dialogs\search.py:42 +#: ../src\gui\dialogs\show_user.py:42 ../src\gui\dialogs\update_profile.py:56 +#: ../src\gui\dialogs\utils.py:42 ../src\keystrokeEditor\gui.py:26 +msgid "Close" +msgstr "Pechar" + +#: ../src\gui\dialogs\configuration.py:290 ../src\gui\main.py:272 +msgid "Followers" +msgstr "Seguidores" + +#: ../src\gui\dialogs\configuration.py:304 +msgid "friends" +msgstr "Amigos" + +#: ../src\gui\dialogs\configuration.py:318 +msgid "Favorites" +msgstr "Favoritos" + +#: ../src\gui\dialogs\configuration.py:332 ../src\gui\main.py:290 +msgid "Events" +msgstr "Eventos" + +#: ../src\gui\dialogs\configuration.py:343 ../src\gui\main.py:282 +msgid "Blocked users" +msgstr "Usuarios bloqueados" + +#: ../src\gui\dialogs\configuration.py:357 ../src\gui\main.py:286 +msgid "Muted users" +msgstr "Usuarios silenciados" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "Restart TW Blue" +msgstr "Reiniciar TW Blue" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "" +"The application requires to be restarted to save these changes. Press OK to " +"do it now." +msgstr "" +"Para que estes cambios teñan efecto, a aplicación debe ser reiniciada. Preme " +"aceptar para facelo agora." + +#: ../src\gui\dialogs\follow.py:33 ../src\gui\dialogs\follow.py:43 +#: ../src\keystrokeEditor\gui.py:17 +msgid "Action" +msgstr "Acción" + +#: ../src\gui\dialogs\follow.py:44 ../src\gui\main.py:96 +msgid "Follow" +msgstr "Seguir" + +#: ../src\gui\dialogs\follow.py:45 ../src\gui\main.py:98 +msgid "Unfollow" +msgstr "Deixar de seguir" + +#: ../src\gui\dialogs\follow.py:46 ../src\gui\main.py:100 +#: ../src\gui\main.py:127 +msgid "Mute" +msgstr "silenciar" + +#: ../src\gui\dialogs\follow.py:47 ../src\gui\main.py:102 +msgid "Unmute" +msgstr "Desactivar silencio" + +#: ../src\gui\dialogs\follow.py:48 ../src\gui\main.py:106 +msgid "Block" +msgstr "Bloquear" + +#: ../src\gui\dialogs\follow.py:49 ../src\gui\main.py:108 +msgid "Unblock" +msgstr "Desbloquear" + +#: ../src\gui\dialogs\follow.py:50 ../src\gui\main.py:104 +msgid "Report as spam" +msgstr "Reportar coma spam" + +#: ../src\gui\dialogs\follow.py:61 ../src\gui\dialogs\search.py:40 +#: ../src\gui\dialogs\utils.py:39 ../src\keystrokeEditor\gui.py:76 +msgid "OK" +msgstr "Aceptar" + +#: ../src\gui\dialogs\follow.py:101 +msgid "You've muted to %s" +msgstr "Silenciaches a %s" + +#: ../src\gui\dialogs\follow.py:115 +msgid "You've unmuted to %s" +msgstr "Desactivaches o silencio a %s" + +#: ../src\gui\dialogs\lists.py:36 ../src\gui\main.py:66 +msgid "Lists manager" +msgstr "Xestor de listaxes" + +#: ../src\gui\dialogs\lists.py:38 ../src\gui\main.py:309 +msgid "Lists" +msgstr "Listaxes" + +#: ../src\gui\dialogs\lists.py:39 +msgid "List" +msgstr "Listaxe" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Members" +msgstr "Membros" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Owner" +msgstr "propietario" + +#: ../src\gui\dialogs\lists.py:39 +msgid "mode" +msgstr "Modo" + +#: ../src\gui\dialogs\lists.py:39 ../src\gui\dialogs\lists.py:181 +msgid "Description" +msgstr "Descrición" + +#: ../src\gui\dialogs\lists.py:44 ../src\gui\dialogs\lists.py:173 +msgid "Create a new list" +msgstr "Crear nova listaxe" + +#: ../src\gui\dialogs\lists.py:46 ../src\keystrokeEditor\gui.py:22 +msgid "Edit" +msgstr "Editar" + +#: ../src\gui\dialogs\lists.py:48 ../src\gui\dialogs\lists.py:235 +msgid "Remove" +msgstr "Borrar" + +#: ../src\gui\dialogs\lists.py:50 +msgid "Open in buffer" +msgstr "Abrir en buffer" + +#: ../src\gui\dialogs\lists.py:125 +msgid "List opened" +msgstr "Listaxe aberta" + +#: ../src\gui\dialogs\lists.py:127 +msgid "This list is arready opened." +msgstr "Esta listaxe xa está aberta." + +#: ../src\gui\dialogs\lists.py:130 ../src\gui\main.py:312 +msgid "List for %s" +msgstr "Listaxe %s" + +#: ../src\gui\dialogs\lists.py:148 +msgid "Viewing lists for %s" +msgstr "Vendo as listaxes de %s" + +#: ../src\gui\dialogs\lists.py:149 +msgid "Subscribe" +msgstr "Darse de alta" + +#: ../src\gui\dialogs\lists.py:150 +msgid "Unsubscribe" +msgstr "Darse de baixa" + +#: ../src\gui\dialogs\lists.py:176 +msgid "Name (20 characters maximun)" +msgstr "Nome (máximo 20 caracteres)" + +#: ../src\gui\dialogs\lists.py:186 +msgid "Mode" +msgstr "Modo" + +#: ../src\gui\dialogs\lists.py:187 +msgid "Public" +msgstr "Público" + +#: ../src\gui\dialogs\lists.py:188 +msgid "Private" +msgstr "Privado" + +#: ../src\gui\dialogs\lists.py:208 +msgid "Editing the list %s" +msgstr "Editando a listaxe %s" + +#: ../src\gui\dialogs\lists.py:219 +msgid "Select a list to add the user" +msgstr "Seleciona unha listaxe para engadir o usuario" + +#: ../src\gui\dialogs\lists.py:220 +msgid "Add" +msgstr "Engadir" + +#: ../src\gui\dialogs\lists.py:234 +msgid "Select a list to remove the user" +msgstr "Seleciona unha listaxe para quitar o usuario" + +#: ../src\gui\dialogs\message.py:42 ../src\keystrokeEditor\constants.py:11 +msgid "New tweet" +msgstr "Novo chío" + +#: ../src\gui\dialogs\message.py:76 +msgid "Attaching..." +msgstr "Adxuntando..." + +#: ../src\gui\dialogs\message.py:77 +msgid "Uploading..." +msgstr "Subindo..." + +#: ../src\gui\dialogs\message.py:96 +msgid "Unable to upload the audio" +msgstr "Imposible subir o audio" + +#: ../src\gui\dialogs\message.py:110 ../src\gui\dialogs\message.py:395 +msgid "Translated" +msgstr "Traducido" + +#: ../src\gui\dialogs\message.py:122 +msgid "There's no URL to be shortened" +msgstr "Non hai ningunha URL para acortar" + +#: ../src\gui\dialogs\message.py:125 +msgid "URL shortened" +msgstr "URL Acortada" + +#: ../src\gui\dialogs\message.py:133 ../src\gui\dialogs\message.py:407 +msgid "There's no URL to be expanded" +msgstr "Non hai ningunha URL para expandir" + +#: ../src\gui\dialogs\message.py:136 ../src\gui\dialogs\message.py:410 +msgid "URL expanded" +msgstr "URL expandida" + +#: ../src\gui\dialogs\message.py:164 ../src\gui\dialogs\message.py:219 +#: ../src\gui\dialogs\update_profile.py:51 +#: ../src\gui\dialogs\update_profile.py:88 +msgid "Upload a picture" +msgstr "Subir unha foto" + +#: ../src\gui\dialogs\message.py:167 ../src\gui\dialogs\message.py:254 +#: ../src\gui\dialogs\message.py:345 +msgid "Spelling correction" +msgstr "correción hortográfica" + +#: ../src\gui\dialogs\message.py:171 ../src\gui\dialogs\message.py:258 +msgid "Shorten URL" +msgstr "Acortar URL" + +#: ../src\gui\dialogs\message.py:173 ../src\gui\dialogs\message.py:260 +#: ../src\gui\dialogs\message.py:347 +msgid "Expand URL" +msgstr "Expandir URL" + +#: ../src\gui\dialogs\message.py:179 ../src\gui\dialogs\message.py:266 +msgid "Send" +msgstr "Enviar" + +#: ../src\gui\dialogs\message.py:215 ../src\gui\dialogs\message.py:226 +#: ../src\gui\dialogs\update_profile.py:84 +#: ../src\gui\dialogs\update_profile.py:95 +msgid "Discard image" +msgstr "Descartar foto" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" +msgstr "Arquivos de imaxe (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Select the picture to be uploaded" +msgstr "Seleciona unha foto para subir" + +#: ../src\gui\dialogs\message.py:248 +msgid "Recipient" +msgstr "Destinatario" + +#: ../src\gui\dialogs\message.py:303 +msgid "Mention to all" +msgstr "Mencionar a todos" + +#: ../src\gui\dialogs\message.py:330 +msgid "Tweet - %i characters " +msgstr "Chío - %i caracteres" + +#: ../src\gui\dialogs\search.py:26 +msgid "Search on Twitter" +msgstr "procurar en twitter" + +#: ../src\gui\dialogs\search.py:27 ../src\gui\main.py:64 +msgid "Search" +msgstr "procurar" + +#: ../src\gui\dialogs\search.py:34 +msgid "Tweets" +msgstr "Chíos" + +#: ../src\gui\dialogs\search.py:35 +msgid "Users" +msgstr "Usuarios" + +#: ../src\gui\dialogs\show_user.py:26 +msgid "Information for %s" +msgstr "Detalles para %s" + +#: ../src\gui\dialogs\show_user.py:30 +msgid "Details" +msgstr "Detalles" + +#: ../src\gui\dialogs\show_user.py:39 +msgid "Go to URL" +msgstr "Ir á URL" + +#: ../src\gui\dialogs\show_user.py:63 +msgid "This user does not exist on Twitter" +msgstr "Ese usuario non existe en Twitter" + +#: ../src\gui\dialogs\show_user.py:68 +msgid "Username: @%s\n" +msgstr "Nome de usuario: @%s\n" + +#: ../src\gui\dialogs\show_user.py:69 +msgid "Name: %s\n" +msgstr "Nome: %s\n" + +#: ../src\gui\dialogs\show_user.py:71 +msgid "Location: %s\n" +msgstr "Ubicación: %s\n" + +#: ../src\gui\dialogs\show_user.py:73 +msgid "URL: %s\n" +msgstr "URL: %s\n" + +#: ../src\gui\dialogs\show_user.py:76 +msgid "Bio: %s\n" +msgstr "Descrición: %s\n" + +#: ../src\gui\dialogs\show_user.py:77 +msgid "Yes" +msgstr "Sí" + +#: ../src\gui\dialogs\show_user.py:78 +msgid "No" +msgstr "Non" + +#: ../src\gui\dialogs\show_user.py:79 +msgid "Protected: %s\n" +msgstr "Protexido: %s\n" + +#: ../src\gui\dialogs\show_user.py:80 +msgid "" +"Followers: %s\n" +" Friends: %s\n" +msgstr "" +"Seguidores: %s\n" +" Amigos: %s\n" + +#: ../src\gui\dialogs\show_user.py:81 +msgid "Tweets: %s\n" +msgstr "Chíos: %s\n" + +#: ../src\gui\dialogs\show_user.py:82 +msgid "Favourites: %s" +msgstr "Favoritos: %s" + +#: ../src\gui\dialogs\update_profile.py:27 +msgid "Update your profile" +msgstr "Actualizar o teu perfil" + +#: ../src\gui\dialogs\update_profile.py:29 +msgid "Name (20 characters maximum)" +msgstr "Nome (máximo 20 caracteres)" + +#: ../src\gui\dialogs\update_profile.py:35 +msgid "Location" +msgstr "Ubicación" + +#: ../src\gui\dialogs\update_profile.py:40 +msgid "Website" +msgstr "Sitio web" + +#: ../src\gui\dialogs\update_profile.py:45 +msgid "Bio (160 characters maximum)" +msgstr "Descrición (máximo 160 caracteres)" + +#: ../src\gui\dialogs\update_profile.py:53 ../src\gui\main.py:60 +#: ../src\gui\sysTrayIcon.py:38 +msgid "Update profile" +msgstr "Actualizar perfil" + +#: ../src\gui\dialogs\urlList.py:26 +msgid "Select an URL" +msgstr "Seleciona unha URL" + +#: ../src\gui\main.py:62 +msgid "Hide window" +msgstr "Agochar xanela" + +#: ../src\gui\main.py:70 +msgid "Edit keystrokes" +msgstr "Editar combinacións de teclas" + +#: ../src\gui\main.py:72 ../src\gui\sysTrayIcon.py:36 +msgid "Preferences" +msgstr "Preferencias" + +#: ../src\gui\main.py:74 ../src\gui\main.py:597 ../src\gui\sysTrayIcon.py:46 +msgid "Exit" +msgstr "Saír" + +#: ../src\gui\main.py:85 +msgid "Add to favourites" +msgstr "Marcar coma favorito" + +#: ../src\gui\main.py:87 ../src\keystrokeEditor\constants.py:16 +msgid "Remove from favourites" +msgstr "Quitar de favoritos" + +#: ../src\gui\main.py:89 ../src\keystrokeEditor\constants.py:19 +msgid "Show tweet" +msgstr "Ver chío" + +#: ../src\gui\main.py:112 ../src\keystrokeEditor\constants.py:36 +msgid "Add to list" +msgstr "Engadir á listaxe" + +#: ../src\gui\main.py:114 ../src\keystrokeEditor\constants.py:37 +msgid "Remove from list" +msgstr "Quitar de listaxe" + +#: ../src\gui\main.py:116 +msgid "View lists" +msgstr "Ver listaxes" + +#: ../src\gui\main.py:118 +msgid "Show user profile" +msgstr "Ver perfil do usuario" + +#: ../src\gui\main.py:120 +msgid "Timeline" +msgstr "Liña temporal" + +#: ../src\gui\main.py:122 +msgid "View favourites" +msgstr "Mostrar favoritos" + +#: ../src\gui\main.py:129 +msgid "Autoread tweets for this buffer" +msgstr "Leer automáticamente chíos para este buffer" + +#: ../src\gui\main.py:131 +msgid "Clear buffer" +msgstr "limpar buffer" + +#: ../src\gui\main.py:133 ../src\keystrokeEditor\constants.py:22 +msgid "Remove buffer" +msgstr "Borrar buffer" + +#: ../src\gui\main.py:138 ../src\gui\sysTrayIcon.py:42 +msgid "Documentation" +msgstr "Documentación" + +#: ../src\gui\main.py:140 +msgid "What's new in this version?" +msgstr "Qué hai de novo nesta versión?" + +#: ../src\gui\main.py:142 ../src\gui\sysTrayIcon.py:44 +msgid "Check for updates" +msgstr "Comprobar actualizacións" + +#: ../src\gui\main.py:144 ../src\issueReporter\gui.py:34 +msgid "Report an error" +msgstr "Reportar un erro" + +#: ../src\gui\main.py:146 +msgid "TW Blue website" +msgstr "Sitio web de TW Blue" + +#: ../src\gui\main.py:148 +msgid "About TW Blue" +msgstr "Sobre TW Blue" + +#: ../src\gui\main.py:152 +msgid "Application" +msgstr "Aplicación" + +#: ../src\gui\main.py:155 +msgid "Buffer" +msgstr "buffer" + +#: ../src\gui\main.py:156 +msgid "Help" +msgstr "Axuda" + +#: ../src\gui\main.py:249 +msgid "Home" +msgstr "Principal" + +#: ../src\gui\main.py:254 +msgid "Mentions" +msgstr "Mencións" + +#: ../src\gui\main.py:257 +msgid "Direct messages" +msgstr "Mensaxes directas" + +#: ../src\gui\main.py:260 +msgid "Sent" +msgstr "Enviados" + +#: ../src\gui\main.py:266 +msgid "Favourites" +msgstr "Favoritos" + +#: ../src\gui\main.py:278 +msgid "Friends" +msgstr "Amigos" + +#: ../src\gui\main.py:293 +msgid "Searches" +msgstr "Procuras" + +#: ../src\gui\main.py:303 +msgid "Timelines" +msgstr "Liñas temporais" + +#: ../src\gui\main.py:306 ../src\gui\main.py:714 +msgid "Timeline for %s" +msgstr "Liña temporal de %s" + +#: ../src\gui\main.py:317 +msgid "Favourites timelines" +msgstr "Liñas temporais de favoritos" + +#: ../src\gui\main.py:320 ../src\gui\main.py:745 +msgid "Favourites for %s" +msgstr "Favoritos de %s" + +#: ../src\gui\main.py:361 +msgid "Ready" +msgstr "Listo" + +#: ../src\gui\main.py:388 +msgid "%s favourites from %s" +msgstr "%s favoritos de %s" + +#: ../src\gui\main.py:435 +msgid "Streams disconnected. TW Blue will try to reconnect in a minute." +msgstr "Streams desconectados. TW blue tentará conectarse nun minuto" + +#: ../src\gui\main.py:439 +msgid "Reconnecting streams..." +msgstr "Conectando os streams..." + +#: ../src\gui\main.py:463 +msgid "search for %s" +msgstr "Procurar %s" + +#: ../src\gui\main.py:468 +msgid "search users for %s" +msgstr "Procurar usuarios para %s" + +#: ../src\gui\main.py:479 ../src\gui\main.py:490 ../src\gui\main.py:509 +msgid "Select the user" +msgstr "Seleciona un usuario" + +#: ../src\gui\main.py:569 +msgid "User details" +msgstr "Detalles de usuario" + +#: ../src\gui\main.py:577 +msgid "" +"Do you really want to delete this message? It will be eliminated from " +"Twitter as well." +msgstr "Realmente queres eliminar esta mensaxe? Eliminarase tamén de twitter" + +#: ../src\gui\main.py:597 +msgid "Do you really want to close TW Blue?" +msgstr "¿Realmente desexas saír de TW Blue?" + +#: ../src\gui\main.py:687 +msgid "Error while adding to favourites." +msgstr "Erro ao marcar coma favorito" + +#: ../src\gui\main.py:695 +msgid "Error while removing from favourites." +msgstr "Erro ao quitar de favoritos" + +#: ../src\gui\main.py:699 +msgid "Individual timeline" +msgstr "Liña temporal individual" + +#: ../src\gui\main.py:703 ../src\gui\main.py:734 +msgid "The user does not exist" +msgstr "O usuario non existe" + +#: ../src\gui\main.py:709 +msgid "Existing timeline" +msgstr "Liña temporal existente" + +#: ../src\gui\main.py:709 +msgid "" +"There's currently a timeline for this user. You are not able to open another" +msgstr "Xa hai unha liña temporal deste usuario. Non se pode abrir outra" + +#: ../src\gui\main.py:718 +msgid "This user has no tweets. You can't open a timeline for this user" +msgstr "Este usuario non ten chíos. Non podes abrirlle unha liña temporal" + +#: ../src\gui\main.py:730 +msgid "List of favourites" +msgstr "Listaxe de favoritos" + +#: ../src\gui\main.py:740 +msgid "Existing list" +msgstr "Listaxe existente " + +#: ../src\gui\main.py:740 +msgid "" +"There's already a list of favourites for this user. You can't create another." +msgstr "" +"Xa hai unha listaxe de favoritos aberta de este usuario. Non se pode abrir " +"outra" + +#: ../src\gui\main.py:749 +msgid "" +"This user has no favourites. You can't create a list of favourites for this " +"user." +msgstr "" +"Este usuario non ten favoritos. Non é posible crear unha listaxe de " +"favoritos para el" + +#: ../src\gui\main.py:791 ../src\gui\main.py:804 +msgid "%s, %s of %s" +msgstr "%s, %s de %s" + +#: ../src\gui\main.py:793 ../src\gui\main.py:806 +msgid "%s. Empty" +msgstr "%s. Valeiro" + +#: ../src\gui\main.py:829 +msgid "Global mute on" +msgstr "silencio xeral activo" + +#: ../src\gui\main.py:832 +msgid "Global mute off" +msgstr "silencio xeral inactivo" + +#: ../src\gui\main.py:838 +msgid "Buffer mute on" +msgstr "silencio de buffer activo" + +#: ../src\gui\main.py:841 +msgid "Buffer mute off" +msgstr "silencio de buffer inactivo" + +#: ../src\gui\main.py:847 +msgid "The auto-reading of new tweets is enabled for this buffer" +msgstr "a autolectura de novos chíos está activada neste bufer" + +#: ../src\gui\main.py:850 +msgid "The auto-reading of new tweets is disabled for this buffer" +msgstr "a autolectura de novos chíos está desactivada neste buffer" + +#: ../src\gui\main.py:857 +msgid "Copied" +msgstr "Copiado" + +#: ../src\gui\main.py:868 ../src\gui\main.py:877 +msgid "%s" +msgstr "%s" + +#: ../src\gui\sysTrayIcon.py:40 +msgid "Show / hide" +msgstr "Mostrar / esconder" + +#: ../src\issueReporter\gui.py:31 +msgid "always" +msgstr "Sempre" + +#: ../src\issueReporter\gui.py:31 +msgid "have not tried" +msgstr "Non se intentou" + +#: ../src\issueReporter\gui.py:31 +msgid "random" +msgstr "Aleatoriamente" + +#: ../src\issueReporter\gui.py:31 +msgid "sometimes" +msgstr "As veces" + +#: ../src\issueReporter\gui.py:31 +msgid "unable to duplicate" +msgstr "Imposible reproducir" + +#: ../src\issueReporter\gui.py:32 +msgid "block" +msgstr "Bloqueo" + +#: ../src\issueReporter\gui.py:32 +msgid "crash" +msgstr "Fallo" + +#: ../src\issueReporter\gui.py:32 +msgid "feature" +msgstr "Característica" + +#: ../src\issueReporter\gui.py:32 +msgid "major" +msgstr "Maior" + +#: ../src\issueReporter\gui.py:32 +msgid "minor" +msgstr "Menor" + +#: ../src\issueReporter\gui.py:32 +msgid "text" +msgstr "Texto" + +#: ../src\issueReporter\gui.py:32 +msgid "trivial" +msgstr "trivial" + +#: ../src\issueReporter\gui.py:32 +msgid "tweak" +msgstr "Axuste" + +#: ../src\issueReporter\gui.py:37 +msgid "Select a category" +msgstr "Seleciona unha categoría" + +#: ../src\issueReporter\gui.py:46 +msgid "" +"Briefly describe what happened. You will be able to thoroughly explain it " +"later" +msgstr "Describe en poucas palabras o que ocorreu, logo poderás profundizar." + +#: ../src\issueReporter\gui.py:56 +msgid "Here, you can describe the bug in detail" +msgstr "Aquí podes describir o erro en detalle" + +#: ../src\issueReporter\gui.py:66 +msgid "how often does this bug happen?" +msgstr "Qué tan a miúdo ocorre este erro?" + +#: ../src\issueReporter\gui.py:74 +msgid "Select the importance that you think this bug has" +msgstr "Selecciona a importancia que consideras que ten este erro" + +#: ../src\issueReporter\gui.py:82 +msgid "" +"I know that the TW Blue bug system will get my Twitter username to contact " +"me and fix the bug quickly" +msgstr "" +"Sei que o sistema de erros de TW Blue obterá o meu nome de usuario de " +"Twitter para contactarme e resolver o erro rapidamente" + +#: ../src\issueReporter\gui.py:85 +msgid "Send report" +msgstr "Enviar reporte" + +#: ../src\issueReporter\gui.py:98 +msgid "You must fill out both fields" +msgstr "Debes encher ambos campos" + +#: ../src\issueReporter\gui.py:101 +msgid "" +"You need to mark the checkbox to provide us your twitter username to contact " +"to you if is necessary." +msgstr "" +"Precisas marcar a caixa para proporcionarnos o teu nome de usuario de " +"Twitter para poder contactarte se é preciso" + +#: ../src\issueReporter\gui.py:120 +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 "" +"Grazas por reportar o teu erro!. Quizais poderás velo en próximas versións " +"na listaxe de trocos. Reportaches o erro número %i." + +#: ../src\issueReporter\gui.py:120 +msgid "reported" +msgstr "Reportado" + +#: ../src\issueReporter\gui.py:123 +msgid "Error while reporting" +msgstr "Erro ao reportar" + +#: ../src\issueReporter\gui.py:123 +msgid "" +"Something unexpected occurred while trying to report the bug. Please, try " +"again later" +msgstr "" +"Algo inesperado aconteceu cando tentabamos reportar o teu erro. Por favor, " +"volve intentalo máis tarde" + +#: ../src\keystrokeEditor\constants.py:4 +msgid "Go up up on the current list" +msgstr "Vai arriba na listaxe actual" + +#: ../src\keystrokeEditor\constants.py:5 +msgid "Go down up on the current list" +msgstr "vai abaixo na listaxe actual" + +#: ../src\keystrokeEditor\constants.py:6 +msgid "Go to the previous tab" +msgstr "Vai á pestana anterior" + +#: ../src\keystrokeEditor\constants.py:7 +msgid "Go to the next tab" +msgstr "Vai á pestana seguinte" + +#: ../src\keystrokeEditor\constants.py:8 +msgid "Move up one tweet in the conversation" +msgstr "Ir un chío hacia arriba na conversa" + +#: ../src\keystrokeEditor\constants.py:9 +msgid "Move down one tweet in the conversation" +msgstr "ir un chío hacia abaixo na conversa" + +#: ../src\keystrokeEditor\constants.py:10 +msgid "Show the graphical interface" +msgstr "Mostrar a interfaz gráfica" + +#: ../src\keystrokeEditor\constants.py:12 +msgid "Reply to a tweet" +msgstr "Responder a un chío" + +#: ../src\keystrokeEditor\constants.py:14 +msgid "Send direct message" +msgstr "Enviar mensaxe directa" + +#: ../src\keystrokeEditor\constants.py:15 +msgid "Mark as favourite" +msgstr "Marcar coma favorito" + +#: ../src\keystrokeEditor\constants.py:17 +msgid "Open the actions dialogue" +msgstr "Abrir o diálogo de accións" + +#: ../src\keystrokeEditor\constants.py:18 +msgid "See user details" +msgstr "Ver detalles do usuario" + +#: ../src\keystrokeEditor\constants.py:20 +msgid "Quit" +msgstr "saír" + +#: ../src\keystrokeEditor\constants.py:21 +msgid "Open user timeline" +msgstr "Abrir líña temporal" + +#: ../src\keystrokeEditor\constants.py:23 +msgid "" +"Open URL on the current tweet, or further information for a friend or " +"follower" +msgstr "" +"Abrir URL no chío anterior ou solicitar máis información en buffers de " +"usuarios" + +#: ../src\keystrokeEditor\constants.py:24 +msgid "Attempt to play audio" +msgstr "Intentar reproducir audio" + +#: ../src\keystrokeEditor\constants.py:25 +msgid "Increase volume by 5%" +msgstr "Subir o volumen nun 5%" + +#: ../src\keystrokeEditor\constants.py:26 +msgid "Decrease volume by 5%" +msgstr "Baixar o volume nun 5%" + +#: ../src\keystrokeEditor\constants.py:27 +msgid "Go to the first element on the list" +msgstr "Ir ao primeiro elemento da listaxe" + +#: ../src\keystrokeEditor\constants.py:28 +msgid "Go to the last element on the list" +msgstr "Ir ao derradeiro elemento da listaxe" + +#: ../src\keystrokeEditor\constants.py:29 +msgid "Move 20 elements up on the current list" +msgstr "Moverse 20 elementos hacia arriba na listaxe actual" + +#: ../src\keystrokeEditor\constants.py:30 +msgid "Move 20 elements down on the current list" +msgstr "moverse 20 elementos hacia abaixo na listaxe actual" + +#: ../src\keystrokeEditor\constants.py:31 +msgid "Edit profile" +msgstr "Editar perfil" + +#: ../src\keystrokeEditor\constants.py:32 +msgid "Remove a tweet or direct message" +msgstr "Eliminar chío ou mensaxe directa" + +#: ../src\keystrokeEditor\constants.py:33 +msgid "Empty the buffer removing all the elements" +msgstr "Vaciar buffer quitando todos os elementos" + +#: ../src\keystrokeEditor\constants.py:34 +msgid "Listen the current message" +msgstr "Escoitar a mensaxe actual" + +#: ../src\keystrokeEditor\constants.py:35 +msgid "Copy to clipboard" +msgstr "Copiar ao portapapeis" + +#: ../src\keystrokeEditor\constants.py:38 +msgid "Mutes/unmutes the active buffer" +msgstr "Silenciar ou desilenciar o buffer activo" + +#: ../src\keystrokeEditor\constants.py:39 +msgid "Globally mute/unmute TW Blue" +msgstr "Activar ou desactivar o silencio global do tw blue" + +#: ../src\keystrokeEditor\constants.py:40 +msgid "toggles the automatic reading of incoming tweets in the active buffer" +msgstr "" +"Conmutar entre a lectura automática de novos chíos para o buffer actual" + +#: ../src\keystrokeEditor\constants.py:41 +msgid "Search on twitter" +msgstr "procurar en twitter" + +#: ../src\keystrokeEditor\constants.py:42 +msgid "Shows the keystroke editor" +msgstr "Mostrar o editor de combinacións de teclado" + +#: ../src\keystrokeEditor\constants.py:43 +msgid "Show lists for a specified user" +msgstr "Mostrar listaxes para un usuario específico" + +#: ../src\keystrokeEditor\gui.py:10 +msgid "Keystroke editor" +msgstr "Editor de combinacións de teclado" + +#: ../src\keystrokeEditor\gui.py:16 +msgid "Select a keystroke to edit" +msgstr "Seleciona unha combinación de teclado para editala" + +#: ../src\keystrokeEditor\gui.py:17 +msgid "Keystroke" +msgstr "Combinacións de teclado" + +#: ../src\keystrokeEditor\gui.py:54 +msgid "Editing keystroke" +msgstr "Editando combinación de teclas" + +#: ../src\keystrokeEditor\gui.py:61 +msgid "Control" +msgstr "Control" + +#: ../src\keystrokeEditor\gui.py:62 +msgid "Alt" +msgstr "Alt" + +#: ../src\keystrokeEditor\gui.py:63 +msgid "Shift" +msgstr "Shift" + +#: ../src\keystrokeEditor\gui.py:64 +msgid "Windows" +msgstr "Windows" + +#: ../src\keystrokeEditor\gui.py:70 +msgid "Key" +msgstr "Tecla" + +#: ../src\keystrokeEditor\gui.py:99 +msgid "You need to use the Windows key" +msgstr "Precisas empregar a tecla de Windows" + +#: ../src\keystrokeEditor\gui.py:99 ../src\keystrokeEditor\gui.py:112 +msgid "Invalid keystroke" +msgstr "Combinación de teclado inválida" + +#: ../src\keystrokeEditor\gui.py:112 +msgid "You must provide a character for the keystroke" +msgstr "Debes proporcionar unha tecla para o atallo do teclado" + +#: ../src\languageHandler.py:95 +msgid "User default" +msgstr "usuario por defecto" + +#: ../src\sessionmanager\gui.py:19 +msgid "Session manager" +msgstr "Administrador de sesións" + +#: ../src\sessionmanager\gui.py:23 +msgid "Select a twitter account to start TW Blue" +msgstr "Seleciona unha conta de twitter para iniciar o TW Blue" + +#: ../src\sessionmanager\gui.py:25 +msgid "Account" +msgstr "Conta" + +#: ../src\sessionmanager\gui.py:30 +msgid "New account" +msgstr "Nova conta" + +#: ../src\sessionmanager\gui.py:67 +msgid "Account Error" +msgstr "Erro na conta" + +#: ../src\sessionmanager\gui.py:67 +msgid "You need to configure an account." +msgstr "Precisas configurar unha conta" + +#: ../src\sessionmanager\gui.py:83 +msgid "" +"The request for the required Twitter authorization to continue will be " +"opened on your browser. You only need to do it once. Would you like to " +"autorhise a new account now?" +msgstr "" +"Abrirase o navegador web coa solicitude de autorización de twitter que " +"precisas para continuar. Só precisas facer isto unha vez. Queres actualizar " +"unha nova conta agora?" + +#: ../src\sessionmanager\gui.py:94 +msgid "Invalid user token" +msgstr "Código de acceso inválido" + +#: ../src\sessionmanager\gui.py:94 +msgid "" +"Your access token is invalid or the authorisation has failed. Please try " +"again." +msgstr "" +"O código de acceso é incorrecto ou a autorización fallou. Por favor, " +"inténtao de novo." + +#: ../src\sessionmanager\gui.py:97 +msgid "Authorised account %d" +msgstr "Conta autorizada %d" + +#: ../src\twitter\buffers\indibidual.py:26 +msgid "One tweet from %s" +msgstr "Un chío de %s" + +#: ../src\twitter\buffers\indibidual.py:35 +msgid "One tweet from %s in the list %s" +msgstr "Un chío de %s na listaxe %s" + +#: ../src\twitter\buffers\stream.py:57 +msgid "One mention from %s " +msgstr "Una mención de %s" + +#: ../src\twitter\buffers\stream.py:69 +msgid "One direct message" +msgstr "Unha mensaxe directa" + +#: ../src\twitter\compose.py:22 +msgid "About a week ago" +msgstr "Fai unha semana" + +#: ../src\twitter\compose.py:24 +msgid "About {} weeks ago" +msgstr "Fai {} semanas" + +#: ../src\twitter\compose.py:26 +msgid "A month ago" +msgstr "Fai un mes" + +#: ../src\twitter\compose.py:28 +msgid "About {} months ago" +msgstr "Fai {} meses" + +#: ../src\twitter\compose.py:30 +msgid "About a year ago" +msgstr "Fai un ano" + +#: ../src\twitter\compose.py:32 +msgid "About {} years ago" +msgstr "Fai {} anos" + +#: ../src\twitter\compose.py:34 +msgid "About 1 day ago" +msgstr "Fai un día" + +#: ../src\twitter\compose.py:36 +msgid "About {} days ago" +msgstr "Fai {} días" + +#: ../src\twitter\compose.py:38 +msgid "just now" +msgstr "Agora mesmo" + +#: ../src\twitter\compose.py:40 +msgid "{} seconds ago" +msgstr "Fai {} segundos" + +#: ../src\twitter\compose.py:42 +msgid "1 minute ago" +msgstr "Fai un minuto" + +#: ../src\twitter\compose.py:44 +msgid "{} minutes ago" +msgstr "fai {} minutos" + +#: ../src\twitter\compose.py:46 +msgid "About 1 hour ago" +msgstr "Fai unha hora" + +#: ../src\twitter\compose.py:48 +msgid "About {} hours ago" +msgstr "Fai {} horas" + +#: ../src\twitter\compose.py:52 +msgid "January" +msgstr "Xaneiro" + +#: ../src\twitter\compose.py:53 +msgid "February" +msgstr "Febreiro" + +#: ../src\twitter\compose.py:54 +msgid "March" +msgstr "Marzo" + +#: ../src\twitter\compose.py:55 +msgid "April" +msgstr "Abril" + +#: ../src\twitter\compose.py:56 +msgid "May" +msgstr "Maio" + +#: ../src\twitter\compose.py:57 +msgid "June" +msgstr "Xuño" + +#: ../src\twitter\compose.py:58 +msgid "July" +msgstr "Xullo" + +#: ../src\twitter\compose.py:59 +msgid "August" +msgstr "Agosto" + +#: ../src\twitter\compose.py:60 +msgid "September" +msgstr "Setembro" + +#: ../src\twitter\compose.py:61 +msgid "October" +msgstr "Outubro" + +#: ../src\twitter\compose.py:62 +msgid "November" +msgstr "Novembro" + +#: ../src\twitter\compose.py:63 +msgid "December" +msgstr "Decembro" + +#: ../src\twitter\compose.py:66 +msgid "Sunday" +msgstr "Domingo" + +#: ../src\twitter\compose.py:67 +msgid "Monday" +msgstr "Luns" + +#: ../src\twitter\compose.py:68 +msgid "Tuesday" +msgstr "Martes" + +#: ../src\twitter\compose.py:69 +msgid "Wednesday" +msgstr "Mércores" + +#: ../src\twitter\compose.py:70 +msgid "Thursday" +msgstr "Xoves" + +#: ../src\twitter\compose.py:71 +msgid "Friday" +msgstr "Venres" + +#: ../src\twitter\compose.py:72 +msgid "Saturday" +msgstr "Sábado" + +#: ../src\twitter\compose.py:75 +msgid "sun" +msgstr "Dom" + +#: ../src\twitter\compose.py:76 +msgid "mon" +msgstr "Lun" + +#: ../src\twitter\compose.py:77 +msgid "tue" +msgstr "Mar" + +#: ../src\twitter\compose.py:78 +msgid "wed" +msgstr "Mer" + +#: ../src\twitter\compose.py:79 +msgid "thu" +msgstr "Xov" + +#: ../src\twitter\compose.py:80 +msgid "fri" +msgstr "Ven" + +#: ../src\twitter\compose.py:81 +msgid "sat" +msgstr "Sab" + +#: ../src\twitter\compose.py:85 +msgid "jan" +msgstr "Xan" + +#: ../src\twitter\compose.py:86 +msgid "feb" +msgstr "Feb" + +#: ../src\twitter\compose.py:87 +msgid "mar" +msgstr "Mar" + +#: ../src\twitter\compose.py:88 +msgid "apr" +msgstr "Abr" + +#: ../src\twitter\compose.py:89 +msgid "may" +msgstr "Mai" + +#: ../src\twitter\compose.py:90 +msgid "jun" +msgstr "Xun" + +#: ../src\twitter\compose.py:91 +msgid "jul" +msgstr "Xul" + +#: ../src\twitter\compose.py:92 +msgid "aug" +msgstr "Ago" + +#: ../src\twitter\compose.py:93 +msgid "sep" +msgstr "Set" + +#: ../src\twitter\compose.py:94 +msgid "oct" +msgstr "Out" + +#: ../src\twitter\compose.py:95 +msgid "nov" +msgstr "Nov" + +#: ../src\twitter\compose.py:96 +msgid "dec" +msgstr "Dec" + +#: ../src\twitter\compose.py:152 +msgid "Dm to %s " +msgstr "dm a %s" + +#: ../src\twitter\compose.py:185 +msgid "Unavailable" +msgstr "Non dispoñible" + +#: ../src\twitter\compose.py:186 +msgid "" +"%s (@%s). %s followers, %s friends, %s tweets. Last tweet on %s. Joined " +"Twitter on %s" +msgstr "" +"%s (@%s). %s seguidores, %s amigos, %s chíos. Último chío o %s. Uniuse a " +"Twitter o %s" + +#: ../src\twitter\compose.py:190 +msgid "You've blocked %s" +msgstr "Bloqueaches a %s" + +#: ../src\twitter\compose.py:192 +msgid "You've unblocked %s" +msgstr "Desbloqueaches a %s" + +#: ../src\twitter\compose.py:195 +msgid "%s(@%s) has followed you" +msgstr "%s(@%s) comezou a seguirte" + +#: ../src\twitter\compose.py:197 +msgid "You've followed %s(@%s)" +msgstr "Agora segues a %s(@%s)" + +#: ../src\twitter\compose.py:199 +msgid "You've unfollowed %s (@%s)" +msgstr "deixaches de seguir a %s(@%s)" + +#: ../src\twitter\compose.py:202 +msgid "You've added to favourites: %s, %s" +msgstr "Marcaches coma favorito: %s, %s" + +#: ../src\twitter\compose.py:204 +msgid "%s(@%s) has marked as favorite: %s" +msgstr "%s(@%s) marcou coma favorito: %s" + +#: ../src\twitter\compose.py:206 +msgid "You've removed from favourites: %s, %s" +msgstr "Eliminaches dos teus favoritos: %s, %s" + +#: ../src\twitter\compose.py:207 +msgid "%s(@%s) has removed from favourites: %s" +msgstr "%s(@%s) quitou dos seus favoritos: %s" + +#: ../src\twitter\compose.py:209 +msgid "You've created the list %s" +msgstr "Creaches a listaxe %s" + +#: ../src\twitter\compose.py:211 +msgid "You've deleted the list %s" +msgstr "Eliminaches a listaxe %s" + +#: ../src\twitter\compose.py:213 +msgid "You've updated the list %s" +msgstr "actualizaches a listaxe %s" + +#: ../src\twitter\compose.py:215 +msgid "You've added %s(@%s) to the list %s" +msgstr "Engadiches a %s(@%s) á listaxe %s" + +#: ../src\twitter\compose.py:216 +msgid "%s(@%s) has added you to the list %s" +msgstr "%s(@%s) engadiute á listaxe %s" + +#: ../src\twitter\compose.py:218 +msgid "You'be removed %s(@%s) from the list %s" +msgstr "Quitaches a %s(@%s) da listaxe %s" + +#: ../src\twitter\compose.py:219 +msgid "%s(@%s) has removed you from the list %s" +msgstr "%s(@%s) quitouche da listaxe %s" + +#: ../src\twitter\compose.py:221 +msgid "You've subscribed to the list %s, which is owned by %s(@%s)" +msgstr "décheste de alta na listaxe %s, propiedade de %s(@%s)" + +#: ../src\twitter\compose.py:222 +msgid "%s(@%s) has suscribed you to the list %s" +msgstr "%s(@%s) suscribiute á listaxe %s" + +#: ../src\twitter\compose.py:224 +msgid "You've unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "décheste de baixa da listaxe %s, propiedade de %s(@%s)" + +#: ../src\twitter\compose.py:225 +msgid "You've been unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "Fuches dado de baixa da listaxe %s, propiedade de %s(@%s)" + +#: ../src\twitter\compose.py:226 +msgid "Unknown" +msgstr "Descoñecido" + +#: ../src\twitter\compose.py:232 +msgid "No description available" +msgstr "Non hai unha descrición dispoñible" + +#: ../src\twitter\compose.py:236 +msgid "private" +msgstr "Privado" + +#: ../src\twitter\compose.py:237 +msgid "public" +msgstr "público" + +#: ../src\twitter\twitter.py:73 +msgid "%s failed. Reason: %s" +msgstr "%s fallou. Razón: %s" + +#: ../src\twitter\twitter.py:80 +msgid "%s succeeded." +msgstr "%s con éxito" + +#: ../src\updater\update_manager.py:14 +msgid "Your TW Blue version is up to date" +msgstr "A túa versión de TW Blue está actualizada" + +#: ../src\updater\update_manager.py:14 ../src\updater\update_manager.py:27 +msgid "Update" +msgstr "Actualización" + +#: ../src\updater\update_manager.py:20 +msgid "New version for %s" +msgstr "Nova versión de %s" + +#: ../src\updater\update_manager.py:20 +msgid "" +"There's a new TW Blue version available. Would you like to download it now?" +msgstr "" +"Hai dispoñible unha nova versión de TW Blue. ¿Gustaríache descargala agora?" + +#: ../src\updater\update_manager.py:22 +msgid "Download in Progress" +msgstr "Descarga en progreso" + +#: ../src\updater\update_manager.py:22 +msgid "Downloading the new version..." +msgstr "Descargando a nova versión..." + +#: ../src\updater\update_manager.py:29 +msgid "Done!" +msgstr "¡Feito!" + +#: ../src\updater\update_manager.py:29 +msgid "" +"The new TW Blue version has been downloaded and installed. Press OK to start " +"the application." +msgstr "" +"A nova versión de TW blue foi descargada e instalada. Preme aceptar para " +"iniciar a aplicación" + +#~ msgid "Tweet - %i characters" +#~ msgstr "Chío - %i caracteres" + +#~ msgid "%A, %B %d, %Y at %I:%M:%S %p" +#~ msgstr "%A, %d de %B do %Y ás %I:%M:%S %p" + +#~ msgid "View members" +#~ msgstr "Ver membros" + +#~ msgid "View subscribers" +#~ msgstr "Ver suscritores" + +#~ msgid "Mention to %s" +#~ msgstr "Mencionar a %s" + +#~ msgid "Ouner" +#~ msgstr "propietario" + +#~ msgid "Successfully following %s" +#~ msgstr "Éxito seguindo a %s" + +#~ msgid "%s has been reported as spam" +#~ msgstr "%s foi reportado coma spam" + +#~ msgid "%s has been blocked" +#~ msgstr "%s foi bloqueado" + +#~ msgid "User's information" +#~ msgstr "Detalles do usuario" + +#~ msgid "You've unblock %s" +#~ msgstr "Desbloqueaches a %s" + +#~ msgid "Clear" +#~ msgstr "Limpiar" diff --git a/src/locales/hu/LC_MESSAGES/twblue.mo b/src/locales/hu/LC_MESSAGES/twblue.mo new file mode 100644 index 00000000..e5a0e9f7 Binary files /dev/null and b/src/locales/hu/LC_MESSAGES/twblue.mo differ diff --git a/src/locales/hu/LC_MESSAGES/twblue.po b/src/locales/hu/LC_MESSAGES/twblue.po new file mode 100644 index 00000000..6bcbb01d --- /dev/null +++ b/src/locales/hu/LC_MESSAGES/twblue.po @@ -0,0 +1,2445 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: TW Blue 0.46\n" +"POT-Creation-Date: 2014-09-07 07:44+Hora de verano central (México)\n" +"PO-Revision-Date: 2014-09-07 14:49+0100\n" +"Last-Translator: Sukil Echenique \n" +"Language-Team: Robert Osztolykan \n" +"Language: hu\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 1.6.8\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: ../src\extra\AudioUploader\gui.py:31 ../src\gui\dialogs\message.py:169 +#: ../src\gui\dialogs\message.py:256 +msgid "Attach audio" +msgstr "Hangfájl Csatolása" + +#: ../src\extra\AudioUploader\gui.py:38 ../src\extra\AudioUploader\gui.py:146 +#: ../src\extra\AudioUploader\gui.py:156 +msgid "Play" +msgstr "Lejátszás" + +#: ../src\extra\AudioUploader\gui.py:41 ../src\extra\AudioUploader\gui.py:75 +#: ../src\extra\AudioUploader\gui.py:80 ../src\extra\AudioUploader\gui.py:107 +msgid "Pause" +msgstr "Szünet" + +#: ../src\extra\AudioUploader\gui.py:44 ../src\extra\AudioUploader\gui.py:103 +msgid "Record" +msgstr "Felvétel" + +#: ../src\extra\AudioUploader\gui.py:47 +msgid "Add an existing file" +msgstr "Létező fájl hozzáadása" + +#: ../src\extra\AudioUploader\gui.py:49 +msgid "Discard" +msgstr "Törlés" + +#: ../src\extra\AudioUploader\gui.py:52 +msgid "Upload to" +msgstr "Feltöltés" + +#: ../src\extra\AudioUploader\gui.py:57 +msgid "Attach" +msgstr "Csatolás" + +#: ../src\extra\AudioUploader\gui.py:59 ../src\issueReporter\gui.py:88 +msgid "Cancel" +msgstr "Mégse" + +#: ../src\extra\AudioUploader\gui.py:77 ../src\extra\AudioUploader\gui.py:78 +msgid "Resume" +msgstr "Folytatás" + +#: ../src\extra\AudioUploader\gui.py:95 +msgid "Stop recording" +msgstr "Leállítás" + +#: ../src\extra\AudioUploader\gui.py:96 +msgid "Recording" +msgstr "Felvétel folyamatban" + +#: ../src\extra\AudioUploader\gui.py:101 ../src\extra\AudioUploader\gui.py:153 +msgid "Stopped" +msgstr "Leállítva" + +#: ../src\extra\AudioUploader\gui.py:128 ../src\gui\dialogs\message.py:218 +#: ../src\gui\dialogs\update_profile.py:87 +msgid "Discarded" +msgstr "Törölve" + +#: ../src\extra\AudioUploader\gui.py:138 ../src\gui\buffers\base.py:303 +#: ../src\gui\buffers\base.py:315 +msgid "Playing..." +msgstr "Lejátszás..." + +#: ../src\extra\AudioUploader\gui.py:142 +msgid "Stop" +msgstr "Leállítás" + +#: ../src\extra\AudioUploader\gui.py:161 +msgid "Recoding audio..." +msgstr "Audio újrakódolása..." + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Audio Files (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" +msgstr "Hangfájlok (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Select the audio file to be uploaded" +msgstr "Válassza ki a feltöltendő fájlt" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:15 +msgid "File" +msgstr "Fájl" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:21 +msgid "Transferred" +msgstr "Továbbítva" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:26 +msgid "Total file size" +msgstr "Teljes fájlméret" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:31 +msgid "Transfer rate" +msgstr "Átviteli sebesség" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:36 +msgid "Time left" +msgstr "Hátralévő idő" + +#: ../src\extra\AudioUploader\utils.py:27 +msgid "%d day, " +msgstr "%d nap, " + +#: ../src\extra\AudioUploader\utils.py:29 +msgid "%d days, " +msgstr "%d nap, " + +#: ../src\extra\AudioUploader\utils.py:31 +msgid "%d hour, " +msgstr "%d óra, " + +#: ../src\extra\AudioUploader\utils.py:33 +msgid "%d hours, " +msgstr "%d óra, " + +#: ../src\extra\AudioUploader\utils.py:35 +msgid "%d minute, " +msgstr "%d perc, " + +#: ../src\extra\AudioUploader\utils.py:37 +msgid "%d minutes, " +msgstr "%d perc, " + +#: ../src\extra\AudioUploader\utils.py:39 +msgid "%s second" +msgstr "%s másodperc" + +#: ../src\extra\AudioUploader\utils.py:41 +msgid "%s seconds" +msgstr "%s másodperc" + +#: ../src\extra\SoundsTutorial\gui.py:11 +msgid "The tweet may contain a playable audio" +msgstr "A tweet tartalmazhat lejátszható hangot" + +#: ../src\extra\SoundsTutorial\gui.py:12 +msgid "A timeline has been created" +msgstr "Idővonal létrehozva" + +#: ../src\extra\SoundsTutorial\gui.py:13 +msgid "A timeline has been deleted" +msgstr "Idővonal törölve" + +#: ../src\extra\SoundsTutorial\gui.py:14 +msgid "You've received a direct message" +msgstr "Közvetlen üzenete érkezett" + +#: ../src\extra\SoundsTutorial\gui.py:15 +msgid "You've sent a direct message" +msgstr "Közvetlen üzenet elküldve" + +#: ../src\extra\SoundsTutorial\gui.py:16 +msgid "A bug has happened" +msgstr "Hiba történt" + +#: ../src\extra\SoundsTutorial\gui.py:17 +msgid "You've added a tweet to your favourites" +msgstr "A tweet hozzáadva a kedvencekhez" + +#: ../src\extra\SoundsTutorial\gui.py:18 +msgid "Someone's favourites have been updated" +msgstr "Valaki kedvencei frissültek" + +#: ../src\extra\SoundsTutorial\gui.py:19 +msgid "There are no more tweets to read" +msgstr "Nincs több tweet" + +#: ../src\extra\SoundsTutorial\gui.py:20 +msgid "A list has a new tweet" +msgstr "Egy lista új tweetet tartalmaz" + +#: ../src\extra\SoundsTutorial\gui.py:21 +msgid "You can't add any more characters on the tweet" +msgstr "A tweet nem tartalmazhat több betűt" + +#: ../src\extra\SoundsTutorial\gui.py:22 +msgid "You've been mentioned " +msgstr "Meg lett említve " + +#: ../src\extra\SoundsTutorial\gui.py:23 +msgid "A new event has happened" +msgstr "Új esemény történt" + +#: ../src\extra\SoundsTutorial\gui.py:24 +msgid "TW Blue is ready " +msgstr "A TW Blue üzemkész " + +#: ../src\extra\SoundsTutorial\gui.py:25 +msgid "You've replied" +msgstr "Válaszolt" + +#: ../src\extra\SoundsTutorial\gui.py:26 +msgid "You've retweeted" +msgstr "Retweetelt" + +#: ../src\extra\SoundsTutorial\gui.py:27 +msgid "A search has been updated" +msgstr "Frissült egy keresőbuffer" + +#: ../src\extra\SoundsTutorial\gui.py:28 +msgid "There's a new tweet in the main buffer" +msgstr "Új tweet a főbufferben" + +#: ../src\extra\SoundsTutorial\gui.py:29 +msgid "You've sent a tweet" +msgstr "Tweet elküldve" + +#: ../src\extra\SoundsTutorial\gui.py:30 +msgid "There's a new tweet in a timeline" +msgstr "Egy idővonal új tweetet tartalmaz" + +#: ../src\extra\SoundsTutorial\gui.py:31 +msgid "You have a new follower" +msgstr "Új követője van" + +#: ../src\extra\SoundsTutorial\gui.py:32 +msgid "You've turned the volume up or down" +msgstr "Módosította a hangerőt" + +#: ../src\extra\SoundsTutorial\gui.py:36 +msgid "" +"It seems as though the currently used sound pack needs an update. %i fails " +"are still be required to use this function. Make sure to obtain the needed " +"lacking sounds or to contact with the sound pack developer." +msgstr "" +"Úgy tűnik, a használt hangcsomag frissítést igényel. %i hiba szükséges a " +"funkció használatához. Győződjön meg arról, hogy minden hanggal rendelkezik, " +"vagy lépjen kapcsolatba a hangcsomag készítőjével." + +#: ../src\extra\SoundsTutorial\gui.py:36 ../src\extra\SpellChecker\gui.py:34 +#: ../src\gui\dialogs\show_user.py:63 ../src\gui\main.py:703 +#: ../src\gui\main.py:734 ../src\issueReporter\gui.py:98 +#: ../src\issueReporter\gui.py:101 +msgid "Error" +msgstr "Hiba" + +#: ../src\extra\SoundsTutorial\gui.py:38 ../src\gui\main.py:68 +msgid "Sounds tutorial" +msgstr "Hangtanító" + +#: ../src\extra\SoundsTutorial\gui.py:41 +msgid "Press enter to listen to the sound for the selected event" +msgstr "" +"Nyomja meg az enter billentyűt a kijelölt esemény hangjának meghallgatásához" + +#: ../src\extra\SpellChecker\gui.py:34 +msgid "" +"A bug has happened. There are no dictionaries available for the selected " +"language in TW Blue" +msgstr "" +"Hiba történt. Nincs elérhető szótár a kiválasztott nyelvhez a TW Blue " +"programban" + +#: ../src\extra\SpellChecker\gui.py:38 +msgid "Mis-spelled word" +msgstr "Elírt szó" + +#: ../src\extra\SpellChecker\gui.py:43 +msgid "Context" +msgstr "Szövegkörnyezet" + +#: ../src\extra\SpellChecker\gui.py:48 +msgid "Suggestions" +msgstr "Javaslatok" + +#: ../src\extra\SpellChecker\gui.py:53 +msgid "Ignore" +msgstr "Mellőzés" + +#: ../src\extra\SpellChecker\gui.py:55 +msgid "Ignore all" +msgstr "Mind mellőzése" + +#: ../src\extra\SpellChecker\gui.py:57 +msgid "Replace" +msgstr "Csere" + +#: ../src\extra\SpellChecker\gui.py:59 +msgid "Replace all" +msgstr "Mind cseréje" + +#: ../src\extra\SpellChecker\gui.py:78 +msgid "Mis-spelled word: %s" +msgstr "Elírt szó: %s" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "Finished" +msgstr "Befejeződött" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "The spelling review has finished." +msgstr "A helyesírásellenőrzés befejeződött." + +#: ../src\extra\translator\gui.py:24 ../src\gui\dialogs\message.py:177 +#: ../src\gui\dialogs\message.py:264 ../src\gui\dialogs\message.py:350 +msgid "Translate message" +msgstr "Üzenet fordítása" + +#: ../src\extra\translator\gui.py:27 +msgid "Source language" +msgstr "Forrásnyelv" + +#: ../src\extra\translator\gui.py:30 +msgid "Target language" +msgstr "Célnyelv" + +#: ../src\extra\translator\translator.py:53 +msgid "Afrikaans" +msgstr "Afrikai" + +#: ../src\extra\translator\translator.py:54 +msgid "Albanian" +msgstr "Albán" + +#: ../src\extra\translator\translator.py:55 +msgid "Amharic" +msgstr "Amhara" + +#: ../src\extra\translator\translator.py:56 +msgid "Arabic" +msgstr "Arab" + +#: ../src\extra\translator\translator.py:57 +msgid "Armenian" +msgstr "Örmény" + +#: ../src\extra\translator\translator.py:58 +msgid "Azerbaijani" +msgstr "Azeri" + +#: ../src\extra\translator\translator.py:59 +msgid "Basque" +msgstr "Baszk" + +#: ../src\extra\translator\translator.py:60 +msgid "Belarusian" +msgstr "Belarusz" + +#: ../src\extra\translator\translator.py:61 +msgid "Bengali" +msgstr "Bengáli" + +#: ../src\extra\translator\translator.py:62 +msgid "Bihari" +msgstr "Bihári" + +#: ../src\extra\translator\translator.py:63 +msgid "Bulgarian" +msgstr "Bolgár" + +#: ../src\extra\translator\translator.py:64 +msgid "Burmese" +msgstr "Burmai" + +#: ../src\extra\translator\translator.py:65 +msgid "Catalan" +msgstr "Katalán" + +#: ../src\extra\translator\translator.py:66 +msgid "Cherokee" +msgstr "Csiroki" + +#: ../src\extra\translator\translator.py:67 +msgid "Chinese" +msgstr "Kínai" + +#: ../src\extra\translator\translator.py:68 +msgid "Chinese_simplified" +msgstr "Egyszerűsített_kínai" + +#: ../src\extra\translator\translator.py:69 +msgid "Chinese_traditional" +msgstr "Hagyományos_kínai" + +#: ../src\extra\translator\translator.py:70 +msgid "Croatian" +msgstr "Horvát" + +#: ../src\extra\translator\translator.py:71 +msgid "Czech" +msgstr "Cseh" + +#: ../src\extra\translator\translator.py:72 +msgid "Danish" +msgstr "DÁn" + +#: ../src\extra\translator\translator.py:73 +msgid "Dhivehi" +msgstr "Dhivehi" + +#: ../src\extra\translator\translator.py:74 +msgid "Dutch" +msgstr "Holland" + +#: ../src\extra\translator\translator.py:75 +msgid "English" +msgstr "Angol" + +#: ../src\extra\translator\translator.py:76 +msgid "Esperanto" +msgstr "Eszperantó" + +#: ../src\extra\translator\translator.py:77 +msgid "Estonian" +msgstr "Észt" + +#: ../src\extra\translator\translator.py:78 +msgid "Filipino" +msgstr "filippínó" + +#: ../src\extra\translator\translator.py:79 +msgid "Finnish" +msgstr "Finn" + +#: ../src\extra\translator\translator.py:80 +msgid "French" +msgstr "Francia" + +#: ../src\extra\translator\translator.py:81 +msgid "Galician" +msgstr "Galíciai" + +#: ../src\extra\translator\translator.py:82 +msgid "Georgian" +msgstr "Grúz" + +#: ../src\extra\translator\translator.py:83 +msgid "German" +msgstr "Német" + +#: ../src\extra\translator\translator.py:84 +msgid "Greek" +msgstr "Görög" + +#: ../src\extra\translator\translator.py:85 +msgid "Guarani" +msgstr "Guarán" + +#: ../src\extra\translator\translator.py:86 +msgid "Gujarati" +msgstr "gudzsaráti" + +#: ../src\extra\translator\translator.py:87 +msgid "Hebrew" +msgstr "Héber" + +#: ../src\extra\translator\translator.py:88 +msgid "Hindi" +msgstr "Hindi" + +#: ../src\extra\translator\translator.py:89 +msgid "Hungarian" +msgstr "Magyar" + +#: ../src\extra\translator\translator.py:90 +msgid "Icelandic" +msgstr "Izlandi" + +#: ../src\extra\translator\translator.py:91 +msgid "Indonesian" +msgstr "Indonéz" + +#: ../src\extra\translator\translator.py:92 +msgid "Inuktitut" +msgstr "Inuktitut" + +#: ../src\extra\translator\translator.py:93 +msgid "Irish" +msgstr "Ír" + +#: ../src\extra\translator\translator.py:94 +msgid "Italian" +msgstr "Olasz" + +#: ../src\extra\translator\translator.py:95 +msgid "Japanese" +msgstr "Japán" + +#: ../src\extra\translator\translator.py:96 +msgid "Kannada" +msgstr "Kannadai" + +#: ../src\extra\translator\translator.py:97 +msgid "Kazakh" +msgstr "Kazakh" + +#: ../src\extra\translator\translator.py:98 +msgid "Khmer" +msgstr "Khmer" + +#: ../src\extra\translator\translator.py:99 +msgid "Korean" +msgstr "Kóreai" + +#: ../src\extra\translator\translator.py:100 +msgid "Kurdish" +msgstr "Kurd" + +#: ../src\extra\translator\translator.py:101 +msgid "Kyrgyz" +msgstr "Kyrgyz" + +#: ../src\extra\translator\translator.py:102 +msgid "Laothian" +msgstr "Laoszi" + +#: ../src\extra\translator\translator.py:103 +msgid "Latvian" +msgstr "Lett" + +#: ../src\extra\translator\translator.py:104 +msgid "Lithuanian" +msgstr "Litván" + +#: ../src\extra\translator\translator.py:105 +msgid "Macedonian" +msgstr "Makedóniai" + +#: ../src\extra\translator\translator.py:106 +msgid "Malay" +msgstr "Maláj" + +#: ../src\extra\translator\translator.py:107 +msgid "Malayalam" +msgstr "Malayalam" + +#: ../src\extra\translator\translator.py:108 +msgid "Maltese" +msgstr "Máltai" + +#: ../src\extra\translator\translator.py:109 +msgid "Marathi" +msgstr "Marathi" + +#: ../src\extra\translator\translator.py:110 +msgid "Mongolian" +msgstr "Mongol" + +#: ../src\extra\translator\translator.py:111 +msgid "Nepali" +msgstr "Nepali" + +#: ../src\extra\translator\translator.py:112 +msgid "Norwegian" +msgstr "Norvég" + +#: ../src\extra\translator\translator.py:113 +msgid "Oriya" +msgstr "Oriya" + +#: ../src\extra\translator\translator.py:114 +msgid "Pashto" +msgstr "Pashto" + +#: ../src\extra\translator\translator.py:115 +msgid "Persian" +msgstr "Perzsa" + +#: ../src\extra\translator\translator.py:116 +msgid "Polish" +msgstr "Lengyel" + +#: ../src\extra\translator\translator.py:117 +msgid "Portuguese" +msgstr "Portugál" + +#: ../src\extra\translator\translator.py:118 +msgid "Punjabi" +msgstr "Punjabi" + +#: ../src\extra\translator\translator.py:119 +msgid "Romanian" +msgstr "Román" + +#: ../src\extra\translator\translator.py:120 +msgid "Russian" +msgstr "Orosz" + +#: ../src\extra\translator\translator.py:121 +msgid "Sanskrit" +msgstr "Szanszkrit" + +#: ../src\extra\translator\translator.py:122 +msgid "Serbian" +msgstr "Szerb" + +#: ../src\extra\translator\translator.py:123 +msgid "Sindhi" +msgstr "Sindhi" + +#: ../src\extra\translator\translator.py:124 +msgid "Sinhalese" +msgstr "Szinhaléz" + +#: ../src\extra\translator\translator.py:125 +msgid "Slovak" +msgstr "Szlovák" + +#: ../src\extra\translator\translator.py:126 +msgid "Slovenian" +msgstr "Szlovén" + +#: ../src\extra\translator\translator.py:127 +msgid "Spanish" +msgstr "Spanyol" + +#: ../src\extra\translator\translator.py:128 +msgid "Swahili" +msgstr "Swahili" + +#: ../src\extra\translator\translator.py:129 +msgid "Swedish" +msgstr "Svéd" + +#: ../src\extra\translator\translator.py:130 +msgid "Tajik" +msgstr "Tajik" + +#: ../src\extra\translator\translator.py:131 +msgid "Tamil" +msgstr "Tamil" + +#: ../src\extra\translator\translator.py:132 +msgid "Tagalog" +msgstr "Tagalog" + +#: ../src\extra\translator\translator.py:133 +msgid "Telugu" +msgstr "Telugu" + +#: ../src\extra\translator\translator.py:134 +msgid "Thai" +msgstr "Táj" + +#: ../src\extra\translator\translator.py:135 +msgid "Tibetan" +msgstr "Tibeti" + +#: ../src\extra\translator\translator.py:136 +msgid "Turkish" +msgstr "Török" + +#: ../src\extra\translator\translator.py:137 +msgid "Ukrainian" +msgstr "Ukrán" + +#: ../src\extra\translator\translator.py:138 +msgid "Urdu" +msgstr "Urdu" + +#: ../src\extra\translator\translator.py:139 +msgid "Uzbek" +msgstr "Üzbég" + +#: ../src\extra\translator\translator.py:140 +msgid "Uighur" +msgstr "Uighur" + +#: ../src\extra\translator\translator.py:141 +msgid "Vietnamese" +msgstr "Vietnám" + +#: ../src\extra\translator\translator.py:142 +msgid "Welsh" +msgstr "Welszi" + +#: ../src\extra\translator\translator.py:143 +msgid "Yiddish" +msgstr "Yiddi" + +#: ../src\extra\translator\translator.py:150 +msgid "autodetect" +msgstr "automatikus" + +#: ../src\gui\buffers\base.py:54 +msgid "Client" +msgstr "Kliens" + +#: ../src\gui\buffers\base.py:54 +msgid "Text" +msgstr "Szöveg" + +#: ../src\gui\buffers\base.py:54 ../src\gui\buffers\events.py:57 +msgid "Date" +msgstr "Dátum" + +#: ../src\gui\buffers\base.py:54 ../src\gui\buffers\people.py:39 +#: ../src\gui\buffers\user_searches.py:31 ../src\gui\dialogs\utils.py:36 +#: ../src\gui\main.py:154 +msgid "User" +msgstr "Felhasználó" + +#: ../src\gui\buffers\base.py:73 ../src\gui\buffers\base.py:192 +#: ../src\gui\buffers\events.py:58 ../src\gui\buffers\events.py:74 +#: ../src\gui\dialogs\message.py:332 ../src\gui\main.py:79 +#: ../src\gui\main.py:153 ../src\gui\sysTrayIcon.py:34 +msgid "Tweet" +msgstr "Tweet" + +#: ../src\gui\buffers\base.py:75 ../src\gui\buffers\base.py:204 +#: ../src\gui\main.py:83 ../src\keystrokeEditor\constants.py:13 +msgid "Retweet" +msgstr "Retweet" + +#: ../src\gui\buffers\base.py:77 ../src\gui\main.py:81 +msgid "Reply" +msgstr "Válasz" + +#: ../src\gui\buffers\base.py:79 ../src\gui\main.py:110 +msgid "Direct message" +msgstr "Közvetlen üzenet" + +#: ../src\gui\buffers\base.py:92 +msgid "Do you really want to delete this timeline?" +msgstr "Bisztosan szeretné törölni ezt az idővonalat?" + +#: ../src\gui\buffers\base.py:92 ../src\gui\buffers\favourites.py:41 +#: ../src\gui\buffers\lists.py:46 ../src\gui\buffers\trends.py:41 +#: ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Attention" +msgstr "Figyelem" + +#: ../src\gui\buffers\base.py:104 +msgid "This buffer is not a timeline; it can't be deleted." +msgstr "Ez a buffer nem egy idővonal, ezért nem törölhető." + +#: ../src\gui\buffers\base.py:184 ../src\gui\buffers\dm.py:44 +#: ../src\gui\buffers\people.py:54 +msgid "Direct message to %s" +msgstr "Közvetlen üzenet %s felhasználónak" + +#: ../src\gui\buffers\base.py:192 ../src\gui\buffers\events.py:74 +msgid "Write the tweet here" +msgstr "Írja ide a tweetet" + +#: ../src\gui\buffers\base.py:204 +msgid "Would you like to add a comment to this tweet?" +msgstr "Szeretne megjegyzést fűzni a tweethez?" + +#: ../src\gui\buffers\base.py:207 +msgid "Add your comment to the tweet" +msgstr "Adja hozzá megjegyzését a tweethez" + +#: ../src\gui\buffers\base.py:223 ../src\gui\buffers\people.py:62 +msgid "Reply to %s" +msgstr "Válasz %s felhasználónak" + +#: ../src\gui\buffers\base.py:268 +msgid "Opening URL..." +msgstr "URL megnyitása..." + +#: ../src\gui\buffers\base.py:285 ../src\gui\buffers\events.py:118 +msgid "" +"Do you really want to empty this buffer? It's tweets will be removed from " +"the list but not from Twitter" +msgstr "" +"Bisztosan szeretné kiüríteni a buffert? A tweetek törlődnek a bufferből, de " +"a Twitteren továbbra is megmaradnak" + +#: ../src\gui\buffers\base.py:285 ../src\gui\buffers\events.py:118 +msgid "Empty buffer" +msgstr "Buffer kiürítése" + +#: ../src\gui\buffers\base.py:290 ../src\gui\buffers\events.py:122 +msgid "Do you really want to delete this message?" +msgstr "Bisztosan szeretné törölni ezt az üzenetet?" + +#: ../src\gui\buffers\base.py:290 ../src\gui\buffers\events.py:122 +#: ../src\gui\dialogs\lists.py:107 ../src\gui\main.py:91 +#: ../src\gui\main.py:577 +msgid "Delete" +msgstr "Törlés" + +#: ../src\gui\buffers\base.py:310 ../src\gui\buffers\base.py:321 +msgid "Unable to play audio." +msgstr "A hang nem játszható le." + +#: ../src\gui\buffers\base.py:312 +msgid "Audio stopped." +msgstr "A hang leállítva." + +#: ../src\gui\buffers\events.py:40 +msgid "Empty" +msgstr "Üres" + +#: ../src\gui\buffers\events.py:57 +msgid "Event" +msgstr "Esemény" + +#: ../src\gui\buffers\events.py:60 +msgid "Remove event" +msgstr "Esemény törlése" + +#: ../src\gui\buffers\favourites.py:41 +msgid "Do you really want to delete this favourites timeline?" +msgstr "Bisztosan szeretné törölni ezt a kedvencek idővonalat?" + +#: ../src\gui\buffers\lists.py:46 ../src\gui\dialogs\lists.py:107 +msgid "Do you really want to delete this list?" +msgstr "Bisztosan szeretné törölni ezt a listát?" + +#: ../src\gui\buffers\panels.py:27 +msgid "Announce" +msgstr "" + +#: ../src\gui\buffers\people.py:44 +msgid "Mention" +msgstr "Említés" + +#: ../src\gui\buffers\trends.py:41 ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Do you really want to delete this search term?" +msgstr "Bisztosan szeretné törölni ezt a keresési kulcsszót?" + +#: ../src\gui\dialogs\configuration.py:39 +msgid "Language" +msgstr "Nyelv" + +#: ../src\gui\dialogs\configuration.py:53 +msgid "Relative times" +msgstr "Relatív idő" + +#: ../src\gui\dialogs\configuration.py:57 +msgid "Activate Sapi5 when any other screen reader is not being run" +msgstr "Aktiválja a Sapi5-öt ha nem fut más képernyőolvasó" + +#: ../src\gui\dialogs\configuration.py:60 +msgid "Activate the auto-start of the invisible interface" +msgstr "Aktiválja a láthatatlan felület automatikus elindítását" + +#: ../src\gui\dialogs\configuration.py:64 +msgid "" +"API calls when the stream is started (One API call equals to 200 tweetts, " +"two API calls equals 400 tweets, etc):" +msgstr "" +"API hívás száma ha a stream kapcsolódik (Egy API hívás 200, kettő API hívás " +"400, stb. tweettel egyenlő):" + +#: ../src\gui\dialogs\configuration.py:72 +msgid "Items on each API call" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:79 +msgid "" +"Inverted buffers: The newest tweets will be shown at the beginning of the " +"lists while the oldest at the end" +msgstr "" +"Fordított bufferek: a legutolsó tweet a lista tetején lesz, míg a legrégebbi " +"a lista allján" + +#: ../src\gui\dialogs\configuration.py:94 +msgid "Show followers" +msgstr "Követők megjelenítése" + +#: ../src\gui\dialogs\configuration.py:97 +msgid "Show friends" +msgstr "Barátok megjelenítése" + +#: ../src\gui\dialogs\configuration.py:100 +msgid "Show favourites" +msgstr "Kedvencek megjelenítése" + +#: ../src\gui\dialogs\configuration.py:103 +msgid "Show blocked users" +msgstr "Letiltott felhasználók megjelenítése" + +#: ../src\gui\dialogs\configuration.py:106 +msgid "Show muted users" +msgstr "Elnémított felhasználók megjelenítése" + +#: ../src\gui\dialogs\configuration.py:109 +msgid "Show events" +msgstr "Események megjelenítése" + +#: ../src\gui\dialogs\configuration.py:119 +#: ../src\gui\dialogs\configuration.py:267 +msgid "Ignored clients" +msgstr "Mellőzött kliensek" + +#: ../src\gui\dialogs\configuration.py:125 +msgid "Add client" +msgstr "Kliens hozzáadása" + +#: ../src\gui\dialogs\configuration.py:126 +msgid "Remove client" +msgstr "Kliens eltávolítása" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Add a new ignored client" +msgstr "Új mellőzött kliens hozzáadása" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Enter the name of the client here" +msgstr "Írja be a mellőzött kliens nevét" + +#: ../src\gui\dialogs\configuration.py:154 +msgid "Volume" +msgstr "Hangerő" + +#: ../src\gui\dialogs\configuration.py:163 +msgid "Global mute" +msgstr "Általános némítás" + +#: ../src\gui\dialogs\configuration.py:167 +msgid "Output device" +msgstr "Kimeneti hangeszköz" + +#: ../src\gui\dialogs\configuration.py:176 +msgid "Input device" +msgstr "Bemeneti hangeszköz" + +#: ../src\gui\dialogs\configuration.py:184 +msgid "" +"If you've got a SndUp account, enter your API Key here. Whether the API Key " +"is wrong, the App will fail to upload anything to the server. Whether " +"there's no API Key here, then the audio files will be uploaded anonimously" +msgstr "" +"Ha rendelkezik SndUp fiókkal, írja be API kulcsát. Ha az API kulcs " +"helytelen, a program nem fog tudni feltölteni. Ha nem ad meg API kulcsot, a " +"hangfájlok névtelenül lesznek feltöltve" + +#: ../src\gui\dialogs\configuration.py:197 +msgid "Sound pack" +msgstr "Hangcsomag" + +#: ../src\gui\dialogs\configuration.py:213 +#: ../src\gui\dialogs\configuration.py:237 +msgid "Unlink your Dropbox account" +msgstr "Dropbox fiók eltávolítása" + +#: ../src\gui\dialogs\configuration.py:215 +#: ../src\gui\dialogs\configuration.py:232 +#: ../src\gui\dialogs\configuration.py:240 +#: ../src\gui\dialogs\configuration.py:244 +#: ../src\gui\dialogs\configuration.py:251 +msgid "Link your Dropbox account" +msgstr "Dropbox fiók hozzáadása" + +#: ../src\gui\dialogs\configuration.py:225 +msgid "" +"The authorisation request will be shown on your browser. Copy the code tat " +"Dropbox will provide and, in the text box that will appear on TW Blue, paste " +"it. This code is necessary to continue. You only need to do it once." +msgstr "" +"A hitelesítési kérelem most megnyílik a böngészőjében. Másolja a Dropbox " +"hitelesítő kódot a TW Blue megjelenő szövegmezőjébe. Ez a kód szükséges a " +"folytatáshoz. A műveletet csak egyszer kell elvégeznie." + +#: ../src\gui\dialogs\configuration.py:225 ../src\sessionmanager\gui.py:83 +msgid "Authorisation" +msgstr "Hitelesítés" + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Enter the code here." +msgstr "Írja be a kódot." + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Verification code" +msgstr "Ellenőrző kód" + +#: ../src\gui\dialogs\configuration.py:239 +#, fuzzy +msgid "Error during authorisation. Try again later." +msgstr "Kapcsolódási hiba. Próbálja később." + +#: ../src\gui\dialogs\configuration.py:239 ../src\gui\main.py:718 +#: ../src\gui\main.py:749 +msgid "Error!" +msgstr "Hiba!" + +#: ../src\gui\dialogs\configuration.py:258 +msgid "TW Blue preferences" +msgstr "TW Blue beállítások" + +#: ../src\gui\dialogs\configuration.py:262 ../src\issueReporter\gui.py:30 +msgid "General" +msgstr "Általános" + +#: ../src\gui\dialogs\configuration.py:265 +msgid "Show other buffers" +msgstr "Egyéb bufferek megjelenítése" + +#: ../src\gui\dialogs\configuration.py:269 +msgid "Sound" +msgstr "Hang" + +#: ../src\gui\dialogs\configuration.py:271 +msgid "Audio Services" +msgstr "Audio Szolgáltatások" + +#: ../src\gui\dialogs\configuration.py:274 +msgid "Save" +msgstr "Mentés" + +#: ../src\gui\dialogs\configuration.py:277 ../src\gui\dialogs\follow.py:64 +#: ../src\gui\dialogs\message.py:182 ../src\gui\dialogs\message.py:269 +#: ../src\gui\dialogs\message.py:352 ../src\gui\dialogs\search.py:42 +#: ../src\gui\dialogs\show_user.py:42 ../src\gui\dialogs\update_profile.py:56 +#: ../src\gui\dialogs\utils.py:42 ../src\keystrokeEditor\gui.py:26 +msgid "Close" +msgstr "Bezárás" + +#: ../src\gui\dialogs\configuration.py:290 ../src\gui\main.py:272 +msgid "Followers" +msgstr "Követők" + +#: ../src\gui\dialogs\configuration.py:304 +msgid "friends" +msgstr "Barátok" + +#: ../src\gui\dialogs\configuration.py:318 +msgid "Favorites" +msgstr "Kedvencek" + +#: ../src\gui\dialogs\configuration.py:332 ../src\gui\main.py:290 +msgid "Events" +msgstr "Események" + +#: ../src\gui\dialogs\configuration.py:343 ../src\gui\main.py:282 +msgid "Blocked users" +msgstr "Letiltott felhasználók" + +#: ../src\gui\dialogs\configuration.py:357 ../src\gui\main.py:286 +msgid "Muted users" +msgstr "Elnémított felhasználók" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "Restart TW Blue" +msgstr "A TW Blue Újraindítása" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "" +"The application requires to be restarted to save these changes. Press OK to " +"do it now." +msgstr "" +"A változtatások elmentéséhez újra kell indítania az alkalmazást. Nyomja meg " +"az OK gombot az újraindításhoz." + +#: ../src\gui\dialogs\follow.py:33 ../src\gui\dialogs\follow.py:43 +#: ../src\keystrokeEditor\gui.py:17 +msgid "Action" +msgstr "Művelet" + +#: ../src\gui\dialogs\follow.py:44 ../src\gui\main.py:96 +msgid "Follow" +msgstr "Követés" + +#: ../src\gui\dialogs\follow.py:45 ../src\gui\main.py:98 +msgid "Unfollow" +msgstr "Elhagyás" + +#: ../src\gui\dialogs\follow.py:46 ../src\gui\main.py:100 +#: ../src\gui\main.py:127 +msgid "Mute" +msgstr "Némítás" + +#: ../src\gui\dialogs\follow.py:47 ../src\gui\main.py:102 +msgid "Unmute" +msgstr "Némítás visszavonása" + +#: ../src\gui\dialogs\follow.py:48 ../src\gui\main.py:106 +msgid "Block" +msgstr "Letiltás" + +#: ../src\gui\dialogs\follow.py:49 ../src\gui\main.py:108 +msgid "Unblock" +msgstr "Engedélyezés" + +#: ../src\gui\dialogs\follow.py:50 ../src\gui\main.py:104 +msgid "Report as spam" +msgstr "Spamként jelentés" + +#: ../src\gui\dialogs\follow.py:61 ../src\gui\dialogs\search.py:40 +#: ../src\gui\dialogs\utils.py:39 ../src\keystrokeEditor\gui.py:76 +msgid "OK" +msgstr "OK" + +#: ../src\gui\dialogs\follow.py:101 +msgid "You've muted to %s" +msgstr "%s elnémítva" + +#: ../src\gui\dialogs\follow.py:115 +msgid "You've unmuted to %s" +msgstr "%s némítása visszavonva" + +#: ../src\gui\dialogs\lists.py:36 ../src\gui\main.py:66 +msgid "Lists manager" +msgstr "Listakezelő" + +#: ../src\gui\dialogs\lists.py:38 ../src\gui\main.py:309 +msgid "Lists" +msgstr "Listák" + +#: ../src\gui\dialogs\lists.py:39 +msgid "List" +msgstr "Lista" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Members" +msgstr "Elemek" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Owner" +msgstr "Tulajdonos" + +#: ../src\gui\dialogs\lists.py:39 +msgid "mode" +msgstr "mód" + +#: ../src\gui\dialogs\lists.py:39 ../src\gui\dialogs\lists.py:181 +msgid "Description" +msgstr "Leírás" + +#: ../src\gui\dialogs\lists.py:44 ../src\gui\dialogs\lists.py:173 +msgid "Create a new list" +msgstr "Új lista létrehozása" + +#: ../src\gui\dialogs\lists.py:46 ../src\keystrokeEditor\gui.py:22 +msgid "Edit" +msgstr "Szerkesztés" + +#: ../src\gui\dialogs\lists.py:48 ../src\gui\dialogs\lists.py:235 +msgid "Remove" +msgstr "Törlés" + +#: ../src\gui\dialogs\lists.py:50 +msgid "Open in buffer" +msgstr "Megnyitás bufferben" + +#: ../src\gui\dialogs\lists.py:125 +msgid "List opened" +msgstr "A lista megnyitva" + +#: ../src\gui\dialogs\lists.py:127 +msgid "This list is arready opened." +msgstr "A lista már meg van nyitva." + +#: ../src\gui\dialogs\lists.py:130 ../src\gui\main.py:312 +msgid "List for %s" +msgstr "%s listája" + +#: ../src\gui\dialogs\lists.py:148 +msgid "Viewing lists for %s" +msgstr "%s listái" + +#: ../src\gui\dialogs\lists.py:149 +msgid "Subscribe" +msgstr "Feliratkozás" + +#: ../src\gui\dialogs\lists.py:150 +msgid "Unsubscribe" +msgstr "Leiratkozás" + +#: ../src\gui\dialogs\lists.py:176 +msgid "Name (20 characters maximun)" +msgstr "Név (maximum 20 betű)" + +#: ../src\gui\dialogs\lists.py:186 +msgid "Mode" +msgstr "Mód" + +#: ../src\gui\dialogs\lists.py:187 +msgid "Public" +msgstr "Nyilvános" + +#: ../src\gui\dialogs\lists.py:188 +msgid "Private" +msgstr "Magán" + +#: ../src\gui\dialogs\lists.py:208 +msgid "Editing the list %s" +msgstr "%s lista szerkesztése" + +#: ../src\gui\dialogs\lists.py:219 +msgid "Select a list to add the user" +msgstr "Válasszon egy listát, melyhez hozzá szeretné adni a felhasználót" + +#: ../src\gui\dialogs\lists.py:220 +msgid "Add" +msgstr "Hozzáadás" + +#: ../src\gui\dialogs\lists.py:234 +msgid "Select a list to remove the user" +msgstr "Válassza ki a listát, melyről felhasználót szeretne törölni" + +#: ../src\gui\dialogs\message.py:42 ../src\keystrokeEditor\constants.py:11 +msgid "New tweet" +msgstr "Új tweet" + +#: ../src\gui\dialogs\message.py:76 +msgid "Attaching..." +msgstr "Csatolás..." + +#: ../src\gui\dialogs\message.py:77 +msgid "Uploading..." +msgstr "Feltöltés..." + +#: ../src\gui\dialogs\message.py:96 +msgid "Unable to upload the audio" +msgstr "Nem lehet a hangfájlt feltölteni" + +#: ../src\gui\dialogs\message.py:110 ../src\gui\dialogs\message.py:395 +msgid "Translated" +msgstr "Lefordítva" + +#: ../src\gui\dialogs\message.py:122 +msgid "There's no URL to be shortened" +msgstr "Nincs rövidítendő URL" + +#: ../src\gui\dialogs\message.py:125 +msgid "URL shortened" +msgstr "URL rövidítve" + +#: ../src\gui\dialogs\message.py:133 ../src\gui\dialogs\message.py:407 +msgid "There's no URL to be expanded" +msgstr "Nincs hosszabbítandó URL" + +#: ../src\gui\dialogs\message.py:136 ../src\gui\dialogs\message.py:410 +msgid "URL expanded" +msgstr "URL meghosszabbítva" + +#: ../src\gui\dialogs\message.py:164 ../src\gui\dialogs\message.py:219 +#: ../src\gui\dialogs\update_profile.py:51 +#: ../src\gui\dialogs\update_profile.py:88 +msgid "Upload a picture" +msgstr "Kép feltöltése" + +#: ../src\gui\dialogs\message.py:167 ../src\gui\dialogs\message.py:254 +#: ../src\gui\dialogs\message.py:345 +msgid "Spelling correction" +msgstr "Helyesírás ellenőrzés" + +#: ../src\gui\dialogs\message.py:171 ../src\gui\dialogs\message.py:258 +msgid "Shorten URL" +msgstr "URL rövidítés" + +#: ../src\gui\dialogs\message.py:173 ../src\gui\dialogs\message.py:260 +#: ../src\gui\dialogs\message.py:347 +msgid "Expand URL" +msgstr "URL hosszabbítás" + +#: ../src\gui\dialogs\message.py:179 ../src\gui\dialogs\message.py:266 +msgid "Send" +msgstr "Küldés" + +#: ../src\gui\dialogs\message.py:215 ../src\gui\dialogs\message.py:226 +#: ../src\gui\dialogs\update_profile.py:84 +#: ../src\gui\dialogs\update_profile.py:95 +msgid "Discard image" +msgstr "Kép törlése" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" +msgstr "Képfájlok (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Select the picture to be uploaded" +msgstr "Válassza ki a feltöltendő képet" + +#: ../src\gui\dialogs\message.py:248 +msgid "Recipient" +msgstr "Címzett" + +#: ../src\gui\dialogs\message.py:303 +msgid "Mention to all" +msgstr "Mind megemlítése" + +#: ../src\gui\dialogs\message.py:330 +msgid "Tweet - %i characters " +msgstr "Tweet - %i betű " + +#: ../src\gui\dialogs\search.py:26 +msgid "Search on Twitter" +msgstr "Keresés a Twitteren" + +#: ../src\gui\dialogs\search.py:27 ../src\gui\main.py:64 +msgid "Search" +msgstr "Keresés" + +#: ../src\gui\dialogs\search.py:34 +msgid "Tweets" +msgstr "Tweetek" + +#: ../src\gui\dialogs\search.py:35 +msgid "Users" +msgstr "Felhasználók" + +#: ../src\gui\dialogs\show_user.py:26 +msgid "Information for %s" +msgstr "%s adatai" + +#: ../src\gui\dialogs\show_user.py:30 +msgid "Details" +msgstr "Részletek" + +#: ../src\gui\dialogs\show_user.py:39 +msgid "Go to URL" +msgstr "URL megnyitása" + +#: ../src\gui\dialogs\show_user.py:63 +msgid "This user does not exist on Twitter" +msgstr "A felhasználó nem létezik a Twitteren" + +#: ../src\gui\dialogs\show_user.py:68 +msgid "Username: @%s\n" +msgstr "Felhasználó: @%s\n" + +#: ../src\gui\dialogs\show_user.py:69 +msgid "Name: %s\n" +msgstr "Név: %s\n" + +#: ../src\gui\dialogs\show_user.py:71 +msgid "Location: %s\n" +msgstr "Tartózkodási hely: %s\n" + +#: ../src\gui\dialogs\show_user.py:73 +msgid "URL: %s\n" +msgstr "URL: %s\n" + +#: ../src\gui\dialogs\show_user.py:76 +msgid "Bio: %s\n" +msgstr "Bio: %s\n" + +#: ../src\gui\dialogs\show_user.py:77 +msgid "Yes" +msgstr "Igen" + +#: ../src\gui\dialogs\show_user.py:78 +msgid "No" +msgstr "Nem" + +#: ../src\gui\dialogs\show_user.py:79 +msgid "Protected: %s\n" +msgstr "Levédve: %s\n" + +#: ../src\gui\dialogs\show_user.py:80 +msgid "" +"Followers: %s\n" +" Friends: %s\n" +msgstr "" +"Követők: %s\n" +"Barátok: %s\n" + +#: ../src\gui\dialogs\show_user.py:81 +msgid "Tweets: %s\n" +msgstr "Tweetek: %s\n" + +#: ../src\gui\dialogs\show_user.py:82 +msgid "Favourites: %s" +msgstr "Kedvencek: %s" + +#: ../src\gui\dialogs\update_profile.py:27 +msgid "Update your profile" +msgstr "Profil frissítése" + +#: ../src\gui\dialogs\update_profile.py:29 +msgid "Name (20 characters maximum)" +msgstr "Név (maximum 20 betű)" + +#: ../src\gui\dialogs\update_profile.py:35 +msgid "Location" +msgstr "Tartózkodási hely" + +#: ../src\gui\dialogs\update_profile.py:40 +msgid "Website" +msgstr "Weboldal" + +#: ../src\gui\dialogs\update_profile.py:45 +msgid "Bio (160 characters maximum)" +msgstr "Bio (maximum 160 betű)" + +#: ../src\gui\dialogs\update_profile.py:53 ../src\gui\main.py:60 +#: ../src\gui\sysTrayIcon.py:38 +msgid "Update profile" +msgstr "Profil frissítése" + +#: ../src\gui\dialogs\urlList.py:26 +#, fuzzy +msgid "Select an URL" +msgstr "URL kiválasztása" + +#: ../src\gui\main.py:62 +msgid "Hide window" +msgstr "Ablak elrejtése" + +#: ../src\gui\main.py:70 +msgid "Edit keystrokes" +msgstr "Billentyűparancsok szerkesztése" + +#: ../src\gui\main.py:72 ../src\gui\sysTrayIcon.py:36 +msgid "Preferences" +msgstr "Beállítások" + +#: ../src\gui\main.py:74 ../src\gui\main.py:597 ../src\gui\sysTrayIcon.py:46 +msgid "Exit" +msgstr "Kilépés" + +#: ../src\gui\main.py:85 +msgid "Add to favourites" +msgstr "Hozzáadás a kedvencekhez" + +#: ../src\gui\main.py:87 ../src\keystrokeEditor\constants.py:16 +msgid "Remove from favourites" +msgstr "Törlés a kedvencek listájáról" + +#: ../src\gui\main.py:89 ../src\keystrokeEditor\constants.py:19 +msgid "Show tweet" +msgstr "Tweet megjelenítése" + +#: ../src\gui\main.py:112 ../src\keystrokeEditor\constants.py:36 +msgid "Add to list" +msgstr "Hozzáadás listához" + +#: ../src\gui\main.py:114 ../src\keystrokeEditor\constants.py:37 +msgid "Remove from list" +msgstr "Törlés listáról" + +#: ../src\gui\main.py:116 +msgid "View lists" +msgstr "Listák megtekintése" + +#: ../src\gui\main.py:118 +msgid "Show user profile" +msgstr "Felhasználó profiljának megjelenítése" + +#: ../src\gui\main.py:120 +msgid "Timeline" +msgstr "Idővonal" + +#: ../src\gui\main.py:122 +msgid "View favourites" +msgstr "Kedvencek megjelenítése" + +#: ../src\gui\main.py:129 +msgid "Autoread tweets for this buffer" +msgstr "A buffer tweetjeinek automatikus felolvasása" + +#: ../src\gui\main.py:131 +msgid "Clear buffer" +msgstr "Buffer törlése" + +#: ../src\gui\main.py:133 ../src\keystrokeEditor\constants.py:22 +msgid "Remove buffer" +msgstr "Buffer törlése" + +#: ../src\gui\main.py:138 ../src\gui\sysTrayIcon.py:42 +msgid "Documentation" +msgstr "Dokumentáció" + +#: ../src\gui\main.py:140 +msgid "What's new in this version?" +msgstr "Mi az új ebben a verzióban?" + +#: ../src\gui\main.py:142 ../src\gui\sysTrayIcon.py:44 +msgid "Check for updates" +msgstr "Frissítések keresése" + +#: ../src\gui\main.py:144 ../src\issueReporter\gui.py:34 +msgid "Report an error" +msgstr "Hibajelentés" + +#: ../src\gui\main.py:146 +msgid "TW Blue website" +msgstr "a TW Blue weboldala" + +#: ../src\gui\main.py:148 +msgid "About TW Blue" +msgstr "A TW Blue névjegye" + +#: ../src\gui\main.py:152 +msgid "Application" +msgstr "Alkalmazás" + +#: ../src\gui\main.py:155 +msgid "Buffer" +msgstr "Buffer" + +#: ../src\gui\main.py:156 +msgid "Help" +msgstr "Súgó" + +#: ../src\gui\main.py:249 +msgid "Home" +msgstr "Főbuffer" + +#: ../src\gui\main.py:254 +msgid "Mentions" +msgstr "Említések" + +#: ../src\gui\main.py:257 +msgid "Direct messages" +msgstr "Közvetlen üzenetek" + +#: ../src\gui\main.py:260 +msgid "Sent" +msgstr "Elküldött" + +#: ../src\gui\main.py:266 +msgid "Favourites" +msgstr "Kedvencek" + +#: ../src\gui\main.py:278 +msgid "Friends" +msgstr "Barátok" + +#: ../src\gui\main.py:293 +#, fuzzy +msgid "Searches" +msgstr "Keresés" + +#: ../src\gui\main.py:303 +#, fuzzy +msgid "Timelines" +msgstr "Idővonal" + +#: ../src\gui\main.py:306 ../src\gui\main.py:714 +msgid "Timeline for %s" +msgstr "%s idővonala" + +#: ../src\gui\main.py:317 +#, fuzzy +msgid "Favourites timelines" +msgstr "Kedvencek: %s" + +#: ../src\gui\main.py:320 ../src\gui\main.py:745 +msgid "Favourites for %s" +msgstr "%s kedvencei" + +#: ../src\gui\main.py:361 +msgid "Ready" +msgstr "Üzemkész" + +#: ../src\gui\main.py:388 +msgid "%s favourites from %s" +msgstr "%s felhasználó %s kedvencei" + +#: ../src\gui\main.py:435 +msgid "Streams disconnected. TW Blue will try to reconnect in a minute." +msgstr "" +"A kapcsolat megszakadt a streamekkel. A TW Blue megpróbál újra kapcsolódni " +"egy perc múlva." + +#: ../src\gui\main.py:439 +msgid "Reconnecting streams..." +msgstr "Kapcsolódás a streamekhez..." + +#: ../src\gui\main.py:463 +msgid "search for %s" +msgstr "%s keresése" + +#: ../src\gui\main.py:468 +msgid "search users for %s" +msgstr "%s keresése a felhasználók között" + +#: ../src\gui\main.py:479 ../src\gui\main.py:490 ../src\gui\main.py:509 +msgid "Select the user" +msgstr "Válasszon felhasználót" + +#: ../src\gui\main.py:569 +msgid "User details" +msgstr "Felhasználó információi" + +#: ../src\gui\main.py:577 +msgid "" +"Do you really want to delete this message? It will be eliminated from " +"Twitter as well." +msgstr "" +"Bisztosan szeretné törölni ezt az üzenetet? Az üzenet már a Twitteren sem " +"lesz elérhető." + +#: ../src\gui\main.py:597 +msgid "Do you really want to close TW Blue?" +msgstr "Bisztosan szeretné bezárni a TW Blue programot?" + +#: ../src\gui\main.py:687 +msgid "Error while adding to favourites." +msgstr "Hiba történt a kedvencekhez adáskor." + +#: ../src\gui\main.py:695 +msgid "Error while removing from favourites." +msgstr "Hiba történt a kedvenc törlésekor." + +#: ../src\gui\main.py:699 +msgid "Individual timeline" +msgstr "Egyéni idővonal" + +#: ../src\gui\main.py:703 ../src\gui\main.py:734 +msgid "The user does not exist" +msgstr "A felhasználó nem létezik" + +#: ../src\gui\main.py:709 +msgid "Existing timeline" +msgstr "Létező idővonal" + +#: ../src\gui\main.py:709 +msgid "" +"There's currently a timeline for this user. You are not able to open another" +msgstr "Már létezik idővonal ezzel a felhasználóval. Nem nyithat meg újabbat" + +#: ../src\gui\main.py:718 +msgid "This user has no tweets. You can't open a timeline for this user" +msgstr "A felhasználó nem rendelkezik tweettel. Nem lehet idővonalat megnyitni" + +#: ../src\gui\main.py:730 +msgid "List of favourites" +msgstr "Kedvenclista" + +#: ../src\gui\main.py:740 +msgid "Existing list" +msgstr "Létező lista" + +#: ../src\gui\main.py:740 +msgid "" +"There's already a list of favourites for this user. You can't create another." +msgstr "" +"Már létezik a megadott felhasználó kedvenclistája. Nem hozhat létre újabbat." + +#: ../src\gui\main.py:749 +msgid "" +"This user has no favourites. You can't create a list of favourites for this " +"user." +msgstr "" +"A felhasználó nem rendelkezik kedvenccel. Nem lehet kedvenclistát megnyitni" + +#: ../src\gui\main.py:791 ../src\gui\main.py:804 +msgid "%s, %s of %s" +msgstr "%s, %s per %s" + +#: ../src\gui\main.py:793 ../src\gui\main.py:806 +msgid "%s. Empty" +msgstr "%s. Üres" + +#: ../src\gui\main.py:829 +msgid "Global mute on" +msgstr "Általános némítás bekapcsolva" + +#: ../src\gui\main.py:832 +msgid "Global mute off" +msgstr "Általános némítás kikapcsolva" + +#: ../src\gui\main.py:838 +msgid "Buffer mute on" +msgstr "Buffer némítás bekapcsolva" + +#: ../src\gui\main.py:841 +msgid "Buffer mute off" +msgstr "Buffer némítás kikapcsolva" + +#: ../src\gui\main.py:847 +msgid "The auto-reading of new tweets is enabled for this buffer" +msgstr "" +"Az új tweetek automatikus felolvasása engedélyezve van ehhez a bufferhez" + +#: ../src\gui\main.py:850 +msgid "The auto-reading of new tweets is disabled for this buffer" +msgstr "Az új tweetek automatikus felolvasása le van tiltva ehhez a bufferhez" + +#: ../src\gui\main.py:857 +msgid "Copied" +msgstr "Másolva" + +#: ../src\gui\main.py:868 ../src\gui\main.py:877 +msgid "%s" +msgstr "%s" + +#: ../src\gui\sysTrayIcon.py:40 +msgid "Show / hide" +msgstr "Megjelenítés / elrejtés" + +#: ../src\issueReporter\gui.py:31 +msgid "always" +msgstr "" + +#: ../src\issueReporter\gui.py:31 +msgid "have not tried" +msgstr "" + +#: ../src\issueReporter\gui.py:31 +msgid "random" +msgstr "" + +#: ../src\issueReporter\gui.py:31 +msgid "sometimes" +msgstr "" + +#: ../src\issueReporter\gui.py:31 +#, fuzzy +msgid "unable to duplicate" +msgstr "Nem lehet a hangfájlt feltölteni" + +#: ../src\issueReporter\gui.py:32 +#, fuzzy +msgid "block" +msgstr "Engedélyezés" + +#: ../src\issueReporter\gui.py:32 +msgid "crash" +msgstr "" + +#: ../src\issueReporter\gui.py:32 +msgid "feature" +msgstr "" + +#: ../src\issueReporter\gui.py:32 +msgid "major" +msgstr "" + +#: ../src\issueReporter\gui.py:32 +msgid "minor" +msgstr "" + +#: ../src\issueReporter\gui.py:32 +#, fuzzy +msgid "text" +msgstr "Szövegkörnyezet" + +#: ../src\issueReporter\gui.py:32 +msgid "trivial" +msgstr "" + +#: ../src\issueReporter\gui.py:32 +msgid "tweak" +msgstr "" + +#: ../src\issueReporter\gui.py:37 +#, fuzzy +msgid "Select a category" +msgstr "Válasszon felhasználót" + +#: ../src\issueReporter\gui.py:46 +msgid "" +"Briefly describe what happened. You will be able to thoroughly explain it " +"later" +msgstr "" +"Írja le röviden, mi történt. A későbbiekben van lehetősége bővebben is " +"leírni." + +#: ../src\issueReporter\gui.py:56 +msgid "Here, you can describe the bug in detail" +msgstr "Itt bővebben kifejtheti a hibát" + +#: ../src\issueReporter\gui.py:66 +msgid "how often does this bug happen?" +msgstr "" + +#: ../src\issueReporter\gui.py:74 +msgid "Select the importance that you think this bug has" +msgstr "" + +#: ../src\issueReporter\gui.py:82 +msgid "" +"I know that the TW Blue bug system will get my Twitter username to contact " +"me and fix the bug quickly" +msgstr "" + +#: ../src\issueReporter\gui.py:85 +msgid "Send report" +msgstr "Jelentés elküldése" + +#: ../src\issueReporter\gui.py:98 +msgid "You must fill out both fields" +msgstr "Mindkét mező kitöltése kötelező" + +#: ../src\issueReporter\gui.py:101 +msgid "" +"You need to mark the checkbox to provide us your twitter username to contact " +"to you if is necessary." +msgstr "" + +#: ../src\issueReporter\gui.py:120 +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 "" +"Köszönjük a hibajelentést! A jövőben előfordulhat, hogy a változások " +"listájában megtalálja. JElentett hibák száma: %i" + +#: ../src\issueReporter\gui.py:120 +msgid "reported" +msgstr "jelentve" + +#: ../src\issueReporter\gui.py:123 +msgid "Error while reporting" +msgstr "Hiba a jelentés közben" + +#: ../src\issueReporter\gui.py:123 +msgid "" +"Something unexpected occurred while trying to report the bug. Please, try " +"again later" +msgstr "" +"Valamilyen nem várt hiba történt a jelentés közben. Kérjük próbálja meg " +"később." + +#: ../src\keystrokeEditor\constants.py:4 +msgid "Go up up on the current list" +msgstr "Felfelé mozgás a jelenlegi listán" + +#: ../src\keystrokeEditor\constants.py:5 +msgid "Go down up on the current list" +msgstr "Lefelé mozgás a jelenlegi listán" + +#: ../src\keystrokeEditor\constants.py:6 +msgid "Go to the previous tab" +msgstr "Váltás az előző fülre" + +#: ../src\keystrokeEditor\constants.py:7 +msgid "Go to the next tab" +msgstr "Váltás a következő fülre" + +#: ../src\keystrokeEditor\constants.py:8 +msgid "Move up one tweet in the conversation" +msgstr "Lépés a beszélgetés előző tweetjére" + +#: ../src\keystrokeEditor\constants.py:9 +msgid "Move down one tweet in the conversation" +msgstr "Lépés a beszélgetés következő tweetjére" + +#: ../src\keystrokeEditor\constants.py:10 +msgid "Show the graphical interface" +msgstr "A grafikus felület megjelenítése" + +#: ../src\keystrokeEditor\constants.py:12 +msgid "Reply to a tweet" +msgstr "Válasz tweetre" + +#: ../src\keystrokeEditor\constants.py:14 +msgid "Send direct message" +msgstr "Közvetlen üzenet küldése" + +#: ../src\keystrokeEditor\constants.py:15 +msgid "Mark as favourite" +msgstr "Jelölés kedvencként" + +#: ../src\keystrokeEditor\constants.py:17 +msgid "Open the actions dialogue" +msgstr "A műveletek párbeszédpanel megnyitása" + +#: ../src\keystrokeEditor\constants.py:18 +msgid "See user details" +msgstr "Felhasználó információi" + +#: ../src\keystrokeEditor\constants.py:20 +msgid "Quit" +msgstr "Kilépés" + +#: ../src\keystrokeEditor\constants.py:21 +msgid "Open user timeline" +msgstr "Felhasználó idővonalának megnyitása" + +#: ../src\keystrokeEditor\constants.py:23 +msgid "" +"Open URL on the current tweet, or further information for a friend or " +"follower" +msgstr "" +"URL megnyitása a kijelölt tweetben, vagy a követő/barát további információi" + +#: ../src\keystrokeEditor\constants.py:24 +msgid "Attempt to play audio" +msgstr "Hang lejátszásának megkísérlése" + +#: ../src\keystrokeEditor\constants.py:25 +msgid "Increase volume by 5%" +msgstr "Hangerő növelése 5 százalékkal" + +#: ../src\keystrokeEditor\constants.py:26 +msgid "Decrease volume by 5%" +msgstr "Hangerő csökkentése 5 százalékkal" + +#: ../src\keystrokeEditor\constants.py:27 +msgid "Go to the first element on the list" +msgstr "Ugrás a lista első elemére" + +#: ../src\keystrokeEditor\constants.py:28 +msgid "Go to the last element on the list" +msgstr "Ugrás a lista utolsó elemére" + +#: ../src\keystrokeEditor\constants.py:29 +msgid "Move 20 elements up on the current list" +msgstr "20 elemmel felfelé lépés a listán" + +#: ../src\keystrokeEditor\constants.py:30 +msgid "Move 20 elements down on the current list" +msgstr "20 elemmel lefelé lépés a listán" + +#: ../src\keystrokeEditor\constants.py:31 +msgid "Edit profile" +msgstr "Profil szerkesztése" + +#: ../src\keystrokeEditor\constants.py:32 +msgid "Remove a tweet or direct message" +msgstr "Tweet vagy közvetlen üzenet törlése" + +#: ../src\keystrokeEditor\constants.py:33 +msgid "Empty the buffer removing all the elements" +msgstr "A buffer kiürítése" + +#: ../src\keystrokeEditor\constants.py:34 +msgid "Listen the current message" +msgstr "A jelenlegi üzenet meghallgatása" + +#: ../src\keystrokeEditor\constants.py:35 +msgid "Copy to clipboard" +msgstr "Másolás vágólapra" + +#: ../src\keystrokeEditor\constants.py:38 +msgid "Mutes/unmutes the active buffer" +msgstr "Elnémítja és visszavonja a némítást a jelenlegi bufferen" + +#: ../src\keystrokeEditor\constants.py:39 +msgid "Globally mute/unmute TW Blue" +msgstr "Általánosan némítja a TW Blue programot" + +#: ../src\keystrokeEditor\constants.py:40 +msgid "toggles the automatic reading of incoming tweets in the active buffer" +msgstr "" +"A bejövő tweetek automatikus olvasásának be- és kikapcsolása a jelenlegi " +"bufferben" + +#: ../src\keystrokeEditor\constants.py:41 +msgid "Search on twitter" +msgstr "Keresés a Twitteren" + +#: ../src\keystrokeEditor\constants.py:42 +msgid "Shows the keystroke editor" +msgstr "Megjeleníti a billentyűparancs szerkesztőt" + +#: ../src\keystrokeEditor\constants.py:43 +msgid "Show lists for a specified user" +msgstr "A megadott felhasználó listáinak megjelenítése" + +#: ../src\keystrokeEditor\gui.py:10 +msgid "Keystroke editor" +msgstr "Billentyűparancs szerkesztő" + +#: ../src\keystrokeEditor\gui.py:16 +msgid "Select a keystroke to edit" +msgstr "Válasszon ki egy szerkesztendő billentyűparancsot" + +#: ../src\keystrokeEditor\gui.py:17 +msgid "Keystroke" +msgstr "Billentyűparancs" + +#: ../src\keystrokeEditor\gui.py:54 +msgid "Editing keystroke" +msgstr "Billentyűparancs szerkesztése" + +#: ../src\keystrokeEditor\gui.py:61 +msgid "Control" +msgstr "Control" + +#: ../src\keystrokeEditor\gui.py:62 +msgid "Alt" +msgstr "Alt" + +#: ../src\keystrokeEditor\gui.py:63 +msgid "Shift" +msgstr "Shift" + +#: ../src\keystrokeEditor\gui.py:64 +msgid "Windows" +msgstr "Windows" + +#: ../src\keystrokeEditor\gui.py:70 +msgid "Key" +msgstr "Billentyű" + +#: ../src\keystrokeEditor\gui.py:99 +msgid "You need to use the Windows key" +msgstr "Használnia kell a Windows billentyűt" + +#: ../src\keystrokeEditor\gui.py:99 ../src\keystrokeEditor\gui.py:112 +msgid "Invalid keystroke" +msgstr "Érvénytelen billentyűparancs" + +#: ../src\keystrokeEditor\gui.py:112 +msgid "You must provide a character for the keystroke" +msgstr "Meg kell adnia egy betűt a billentyűparancshoz" + +#: ../src\languageHandler.py:95 +msgid "User default" +msgstr "Alapértelmezett" + +#: ../src\sessionmanager\gui.py:19 +msgid "Session manager" +msgstr "Munkamenet kezelő" + +#: ../src\sessionmanager\gui.py:23 +msgid "Select a twitter account to start TW Blue" +msgstr "Válasszon ki egy fiókot a TW Blue elindításához" + +#: ../src\sessionmanager\gui.py:25 +msgid "Account" +msgstr "Fiók" + +#: ../src\sessionmanager\gui.py:30 +msgid "New account" +msgstr "Új fiók" + +#: ../src\sessionmanager\gui.py:67 +msgid "Account Error" +msgstr "Fiók hiba" + +#: ../src\sessionmanager\gui.py:67 +msgid "You need to configure an account." +msgstr "Be kell állítania egy fiókot." + +#: ../src\sessionmanager\gui.py:83 +#, fuzzy +msgid "" +"The request for the required Twitter authorization to continue will be " +"opened on your browser. You only need to do it once. Would you like to " +"autorhise a new account now?" +msgstr "" +"A Twitter hitelesítési kérelme most megnyílik a böngészőjében. Másolja a " +"számokból álló kódot a vágólapra, majd illessze be a megjelenő szövegmezőbe. " +"A művelet elvégzése csak egyszer szükséges." + +#: ../src\sessionmanager\gui.py:94 +#, fuzzy +msgid "Invalid user token" +msgstr "Érvénytelen billentyűparancs" + +#: ../src\sessionmanager\gui.py:94 +msgid "" +"Your access token is invalid or the authorisation has failed. Please try " +"again." +msgstr "" + +#: ../src\sessionmanager\gui.py:97 +msgid "Authorised account %d" +msgstr "Hitelesített fiók %d" + +#: ../src\twitter\buffers\indibidual.py:26 +msgid "One tweet from %s" +msgstr "Egy tweet %s felhasználótól" + +#: ../src\twitter\buffers\indibidual.py:35 +msgid "One tweet from %s in the list %s" +msgstr "Egy tweet %s felhasználótól a(z) %s listában" + +#: ../src\twitter\buffers\stream.py:57 +msgid "One mention from %s " +msgstr "Egy említés %s felhasználótól" + +#: ../src\twitter\buffers\stream.py:69 +msgid "One direct message" +msgstr "Egy közvetlen üzenet" + +#: ../src\twitter\compose.py:22 +msgid "About a week ago" +msgstr "Egy héttel ezelőtt" + +#: ../src\twitter\compose.py:24 +msgid "About {} weeks ago" +msgstr "{} héttel ezelőtt" + +#: ../src\twitter\compose.py:26 +msgid "A month ago" +msgstr "Egy hónappal ezelőtt" + +#: ../src\twitter\compose.py:28 +msgid "About {} months ago" +msgstr "{} hónappal ezelőtt" + +#: ../src\twitter\compose.py:30 +msgid "About a year ago" +msgstr "Egy évvel ezelőtt" + +#: ../src\twitter\compose.py:32 +msgid "About {} years ago" +msgstr "{} évvel ezelőtt" + +#: ../src\twitter\compose.py:34 +msgid "About 1 day ago" +msgstr "Egy nappal ezelőtt" + +#: ../src\twitter\compose.py:36 +msgid "About {} days ago" +msgstr "{} nappal ezelőtt" + +#: ../src\twitter\compose.py:38 +msgid "just now" +msgstr "most" + +#: ../src\twitter\compose.py:40 +msgid "{} seconds ago" +msgstr "{} másodperccel ezelőtt" + +#: ../src\twitter\compose.py:42 +msgid "1 minute ago" +msgstr "Egy perccel ezelőtt" + +#: ../src\twitter\compose.py:44 +msgid "{} minutes ago" +msgstr "{} perccel ezelőtt" + +#: ../src\twitter\compose.py:46 +msgid "About 1 hour ago" +msgstr "Egy órával ezelőtt" + +#: ../src\twitter\compose.py:48 +msgid "About {} hours ago" +msgstr "{} órával ezelőtt" + +#: ../src\twitter\compose.py:52 +msgid "January" +msgstr "Január" + +#: ../src\twitter\compose.py:53 +msgid "February" +msgstr "Február" + +#: ../src\twitter\compose.py:54 +msgid "March" +msgstr "Március" + +#: ../src\twitter\compose.py:55 +msgid "April" +msgstr "Április" + +#: ../src\twitter\compose.py:56 +msgid "May" +msgstr "Május" + +#: ../src\twitter\compose.py:57 +msgid "June" +msgstr "Június" + +#: ../src\twitter\compose.py:58 +msgid "July" +msgstr "Július" + +#: ../src\twitter\compose.py:59 +msgid "August" +msgstr "Augusztus" + +#: ../src\twitter\compose.py:60 +msgid "September" +msgstr "Szeptember" + +#: ../src\twitter\compose.py:61 +msgid "October" +msgstr "Október" + +#: ../src\twitter\compose.py:62 +msgid "November" +msgstr "November" + +#: ../src\twitter\compose.py:63 +msgid "December" +msgstr "December" + +#: ../src\twitter\compose.py:66 +msgid "Sunday" +msgstr "Vasárnap" + +#: ../src\twitter\compose.py:67 +msgid "Monday" +msgstr "Hétfő" + +#: ../src\twitter\compose.py:68 +msgid "Tuesday" +msgstr "Kedd" + +#: ../src\twitter\compose.py:69 +msgid "Wednesday" +msgstr "Szerda" + +#: ../src\twitter\compose.py:70 +msgid "Thursday" +msgstr "Csütörtök" + +#: ../src\twitter\compose.py:71 +msgid "Friday" +msgstr "Péntek" + +#: ../src\twitter\compose.py:72 +msgid "Saturday" +msgstr "Szombat" + +#: ../src\twitter\compose.py:75 +msgid "sun" +msgstr "v" + +#: ../src\twitter\compose.py:76 +msgid "mon" +msgstr "h" + +#: ../src\twitter\compose.py:77 +msgid "tue" +msgstr "k" + +#: ../src\twitter\compose.py:78 +msgid "wed" +msgstr "sze" + +#: ../src\twitter\compose.py:79 +msgid "thu" +msgstr "cs" + +#: ../src\twitter\compose.py:80 +msgid "fri" +msgstr "p" + +#: ../src\twitter\compose.py:81 +msgid "sat" +msgstr "szo" + +#: ../src\twitter\compose.py:85 +#, fuzzy +msgid "jan" +msgstr "Jan" + +#: ../src\twitter\compose.py:86 +msgid "feb" +msgstr "feb" + +#: ../src\twitter\compose.py:87 +msgid "mar" +msgstr "márc" + +#: ../src\twitter\compose.py:88 +msgid "apr" +msgstr "ápr" + +#: ../src\twitter\compose.py:89 +msgid "may" +msgstr "máj" + +#: ../src\twitter\compose.py:90 +msgid "jun" +msgstr "jún" + +#: ../src\twitter\compose.py:91 +msgid "jul" +msgstr "júl" + +#: ../src\twitter\compose.py:92 +msgid "aug" +msgstr "aug" + +#: ../src\twitter\compose.py:93 +msgid "sep" +msgstr "szep" + +#: ../src\twitter\compose.py:94 +msgid "oct" +msgstr "okt" + +#: ../src\twitter\compose.py:95 +msgid "nov" +msgstr "nov" + +#: ../src\twitter\compose.py:96 +msgid "dec" +msgstr "dec" + +#: ../src\twitter\compose.py:152 +msgid "Dm to %s " +msgstr "Dm %s felhasználónak" + +#: ../src\twitter\compose.py:185 +msgid "Unavailable" +msgstr "Nem érhető el" + +#: ../src\twitter\compose.py:186 +msgid "" +"%s (@%s). %s followers, %s friends, %s tweets. Last tweet on %s. Joined " +"Twitter on %s" +msgstr "" +"%s (@%s). %s követő, %s barát, %s tweet. Utoljára tweetelt %s. Twitterhez " +"csatlakozott %s" + +#: ../src\twitter\compose.py:190 +msgid "You've blocked %s" +msgstr "%s letiltva" + +#: ../src\twitter\compose.py:192 +msgid "You've unblocked %s" +msgstr "%s engedélyezve" + +#: ../src\twitter\compose.py:195 +msgid "%s(@%s) has followed you" +msgstr "%s(@%s) mostantól követi önt" + +#: ../src\twitter\compose.py:197 +msgid "You've followed %s(@%s)" +msgstr "Mostantól követi %s(@%s) felhasználót" + +#: ../src\twitter\compose.py:199 +msgid "You've unfollowed %s (@%s)" +msgstr "Elhagyta %s (@%s) felhasználót" + +#: ../src\twitter\compose.py:202 +msgid "You've added to favourites: %s, %s" +msgstr "Hozzáadva a kedvencekhez: %s, %s" + +#: ../src\twitter\compose.py:204 +msgid "%s(@%s) has marked as favorite: %s" +msgstr "%s(@%s) megjelölte kedvencként: %s" + +#: ../src\twitter\compose.py:206 +msgid "You've removed from favourites: %s, %s" +msgstr "Eltávolította a kedvencet: %s, %s" + +#: ../src\twitter\compose.py:207 +msgid "%s(@%s) has removed from favourites: %s" +msgstr "%s(@%s) eltávolította a kedvencet: %s" + +#: ../src\twitter\compose.py:209 +msgid "You've created the list %s" +msgstr "%s lista elkészült" + +#: ../src\twitter\compose.py:211 +msgid "You've deleted the list %s" +msgstr "%s lista törölve" + +#: ../src\twitter\compose.py:213 +msgid "You've updated the list %s" +msgstr "%s lista frissítve" + +#: ../src\twitter\compose.py:215 +msgid "You've added %s(@%s) to the list %s" +msgstr "%s(@%s) hozzáadva a(z) %s listához" + +#: ../src\twitter\compose.py:216 +msgid "%s(@%s) has added you to the list %s" +msgstr "%s(@%s) hozzáadta önt a(z) %s listához" + +#: ../src\twitter\compose.py:218 +msgid "You'be removed %s(@%s) from the list %s" +msgstr "%s(@%s) eltávolítva a(z) %s listáról" + +#: ../src\twitter\compose.py:219 +msgid "%s(@%s) has removed you from the list %s" +msgstr "%s(@%s) eltávolította önt a(z) %s listáról" + +#: ../src\twitter\compose.py:221 +msgid "You've subscribed to the list %s, which is owned by %s(@%s)" +msgstr "Feliratkozott a(z) %s listára, mely %s(@%s) tulajdona" + +#: ../src\twitter\compose.py:222 +msgid "%s(@%s) has suscribed you to the list %s" +msgstr "%s(@%s) felírta önt a(z) %s listára" + +#: ../src\twitter\compose.py:224 +msgid "You've unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "Leiratkozott a(z) %s listáról, mely %s(@%s) tulajdona" + +#: ../src\twitter\compose.py:225 +msgid "You've been unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "Leiratkozott a(z) %s listáról, mely %s(@%s) tulajdona" + +#: ../src\twitter\compose.py:226 +msgid "Unknown" +msgstr "Ismeretlen" + +#: ../src\twitter\compose.py:232 +msgid "No description available" +msgstr "Nem érhető el leírás" + +#: ../src\twitter\compose.py:236 +msgid "private" +msgstr "magán" + +#: ../src\twitter\compose.py:237 +msgid "public" +msgstr "nyilvános" + +#: ../src\twitter\twitter.py:73 +msgid "%s failed. Reason: %s" +msgstr "%s sikertelen. Ok: %s" + +#: ../src\twitter\twitter.py:80 +msgid "%s succeeded." +msgstr "%s sikeres." + +#: ../src\updater\update_manager.py:14 +msgid "Your TW Blue version is up to date" +msgstr "A TW Blue verzió a legfrissebb" + +#: ../src\updater\update_manager.py:14 ../src\updater\update_manager.py:27 +msgid "Update" +msgstr "Frissítés" + +#: ../src\updater\update_manager.py:20 +msgid "New version for %s" +msgstr "%s új verzió" + +#: ../src\updater\update_manager.py:20 +msgid "" +"There's a new TW Blue version available. Would you like to download it now?" +msgstr "Új TW Blue verzió érhető el. Szeretné letölteni?" + +#: ../src\updater\update_manager.py:22 +msgid "Download in Progress" +msgstr "A letöltés folyamatban" + +#: ../src\updater\update_manager.py:22 +msgid "Downloading the new version..." +msgstr "Az új verzió letöltése..." + +#: ../src\updater\update_manager.py:29 +msgid "Done!" +msgstr "Befejeződött!" + +#: ../src\updater\update_manager.py:29 +msgid "" +"The new TW Blue version has been downloaded and installed. Press OK to start " +"the application." +msgstr "" +"Az új TW Blue verzió letöltése és telepítése befejeződött. Nyomja meg az OK " +"gombot az alkalmazás elindításához." + +#~ msgid "Tweet - %i characters" +#~ msgstr "Tweet - %i betű" + +#~ msgid "%A, %B %d, %Y at %I:%M:%S %p" +#~ msgstr "%A, %B %d, %Y %I:%M:%S-kor %p" + +#~ msgid "View members" +#~ msgstr "Elemek megtekintése" diff --git a/src/locales/it/LC_MESSAGES/twblue.mo b/src/locales/it/LC_MESSAGES/twblue.mo new file mode 100644 index 00000000..f627c8bb Binary files /dev/null and b/src/locales/it/LC_MESSAGES/twblue.mo differ diff --git a/src/locales/it/LC_MESSAGES/twblue.po b/src/locales/it/LC_MESSAGES/twblue.po new file mode 100644 index 00000000..e4145a7d --- /dev/null +++ b/src/locales/it/LC_MESSAGES/twblue.po @@ -0,0 +1,2443 @@ +msgid "" +msgstr "" +"Project-Id-Version: TW Blue 0.44\n" +"POT-Creation-Date: 2014-09-07 07:44+Hora de verano central (México)\n" +"PO-Revision-Date: 2014-09-07 15:39+0100\n" +"Last-Translator: Chris \n" +"Language-Team: Manuel Cortez \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-KeywordsList: _;gettext;gettext_noop\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SourceCharset: UTF-8\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.6.3\n" + +#: ../src\extra\AudioUploader\gui.py:31 ../src\gui\dialogs\message.py:169 +#: ../src\gui\dialogs\message.py:256 +msgid "Attach audio" +msgstr "Allega audio" + +#: ../src\extra\AudioUploader\gui.py:38 ../src\extra\AudioUploader\gui.py:146 +#: ../src\extra\AudioUploader\gui.py:156 +msgid "Play" +msgstr "Riproduci" + +#: ../src\extra\AudioUploader\gui.py:41 ../src\extra\AudioUploader\gui.py:75 +#: ../src\extra\AudioUploader\gui.py:80 ../src\extra\AudioUploader\gui.py:107 +msgid "Pause" +msgstr "Pausa" + +#: ../src\extra\AudioUploader\gui.py:44 ../src\extra\AudioUploader\gui.py:103 +msgid "Record" +msgstr "Registra" + +#: ../src\extra\AudioUploader\gui.py:47 +msgid "Add an existing file" +msgstr "Allega un file esistente" + +#: ../src\extra\AudioUploader\gui.py:49 +msgid "Discard" +msgstr "Scarta" + +#: ../src\extra\AudioUploader\gui.py:52 +msgid "Upload to" +msgstr "Carica" + +#: ../src\extra\AudioUploader\gui.py:57 +msgid "Attach" +msgstr "Allega" + +#: ../src\extra\AudioUploader\gui.py:59 ../src\issueReporter\gui.py:88 +msgid "Cancel" +msgstr "annulla" + +#: ../src\extra\AudioUploader\gui.py:77 ../src\extra\AudioUploader\gui.py:78 +msgid "Resume" +msgstr "Riassumi" + +#: ../src\extra\AudioUploader\gui.py:95 +msgid "Stop recording" +msgstr "Ferma la registrazione" + +#: ../src\extra\AudioUploader\gui.py:96 +msgid "Recording" +msgstr "Registrazione" + +#: ../src\extra\AudioUploader\gui.py:101 ../src\extra\AudioUploader\gui.py:153 +msgid "Stopped" +msgstr "Stoppato" + +#: ../src\extra\AudioUploader\gui.py:128 ../src\gui\dialogs\message.py:218 +#: ../src\gui\dialogs\update_profile.py:87 +msgid "Discarded" +msgstr "Scartato" + +#: ../src\extra\AudioUploader\gui.py:138 ../src\gui\buffers\base.py:303 +#: ../src\gui\buffers\base.py:315 +msgid "Playing..." +msgstr "Riproduzione" + +#: ../src\extra\AudioUploader\gui.py:142 +msgid "Stop" +msgstr "Stop" + +#: ../src\extra\AudioUploader\gui.py:161 +msgid "Recoding audio..." +msgstr "Ricodifica audio ..." + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Audio Files (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" +msgstr "Audio Files (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Select the audio file to be uploaded" +msgstr "Selezionare il file audio da caricare" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:15 +msgid "File" +msgstr "File" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:21 +msgid "Transferred" +msgstr "Trasferito" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:26 +msgid "Total file size" +msgstr "Dimensioni totali del file" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:31 +msgid "Transfer rate" +msgstr "Velocità di trasferimento" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:36 +msgid "Time left" +msgstr "Tempo rimasto" + +#: ../src\extra\AudioUploader\utils.py:27 +msgid "%d day, " +msgstr "%d giorno, " + +#: ../src\extra\AudioUploader\utils.py:29 +msgid "%d days, " +msgstr "%d giorni, " + +#: ../src\extra\AudioUploader\utils.py:31 +msgid "%d hour, " +msgstr "%d ora, " + +#: ../src\extra\AudioUploader\utils.py:33 +msgid "%d hours, " +msgstr "%d ore, " + +#: ../src\extra\AudioUploader\utils.py:35 +msgid "%d minute, " +msgstr "%d minuto, " + +#: ../src\extra\AudioUploader\utils.py:37 +msgid "%d minutes, " +msgstr "%d minuti, " + +#: ../src\extra\AudioUploader\utils.py:39 +msgid "%s second" +msgstr "%s secondo" + +#: ../src\extra\AudioUploader\utils.py:41 +msgid "%s seconds" +msgstr "%s secondi" + +#: ../src\extra\SoundsTutorial\gui.py:11 +msgid "The tweet may contain a playable audio" +msgstr "Il tweet contiene un audio riproducibile" + +#: ../src\extra\SoundsTutorial\gui.py:12 +msgid "A timeline has been created" +msgstr "Creata nuova Linea temporale" + +#: ../src\extra\SoundsTutorial\gui.py:13 +msgid "A timeline has been deleted" +msgstr "Linea temporale cancellata" + +#: ../src\extra\SoundsTutorial\gui.py:14 +msgid "You've received a direct message" +msgstr "Hai ricevuto un messaggio diretto" + +#: ../src\extra\SoundsTutorial\gui.py:15 +msgid "You've sent a direct message" +msgstr "Hai inviato un messaggio diretto" + +#: ../src\extra\SoundsTutorial\gui.py:16 +msgid "A bug has happened" +msgstr "Segnalazione errore" + +#: ../src\extra\SoundsTutorial\gui.py:17 +msgid "You've added a tweet to your favourites" +msgstr "Hai aggiunto un tweet ai tuoi preferiti" + +#: ../src\extra\SoundsTutorial\gui.py:18 +msgid "Someone's favourites have been updated" +msgstr "Aggiornamento ai preferiti" + +#: ../src\extra\SoundsTutorial\gui.py:19 +msgid "There are no more tweets to read" +msgstr "Non ci sono altri tweet da leggere" + +#: ../src\extra\SoundsTutorial\gui.py:20 +msgid "A list has a new tweet" +msgstr "Una lista ha un nuovo tweet" + +#: ../src\extra\SoundsTutorial\gui.py:21 +msgid "You can't add any more characters on the tweet" +msgstr "Non è possibile aggiungere altri caratteri al tweet" + +#: ../src\extra\SoundsTutorial\gui.py:22 +msgid "You've been mentioned " +msgstr "Sei stato menzionato" + +#: ../src\extra\SoundsTutorial\gui.py:23 +msgid "A new event has happened" +msgstr "Nuovo evento " + +#: ../src\extra\SoundsTutorial\gui.py:24 +msgid "TW Blue is ready " +msgstr "TW Blue è pronto" + +#: ../src\extra\SoundsTutorial\gui.py:25 +msgid "You've replied" +msgstr "Hai risposto" + +#: ../src\extra\SoundsTutorial\gui.py:26 +msgid "You've retweeted" +msgstr "Hai retweetato" + +#: ../src\extra\SoundsTutorial\gui.py:27 +msgid "A search has been updated" +msgstr "Una ricerca è stata aggiornata" + +#: ../src\extra\SoundsTutorial\gui.py:28 +msgid "There's a new tweet in the main buffer" +msgstr "Nuovo tweet nella linea temporale principale" + +#: ../src\extra\SoundsTutorial\gui.py:29 +msgid "You've sent a tweet" +msgstr "Hai inviato un tweet" + +#: ../src\extra\SoundsTutorial\gui.py:30 +msgid "There's a new tweet in a timeline" +msgstr "Nuovo tweet nella linea temporale" + +#: ../src\extra\SoundsTutorial\gui.py:31 +msgid "You have a new follower" +msgstr "Hai un nuovo seguitore" + +#: ../src\extra\SoundsTutorial\gui.py:32 +msgid "You've turned the volume up or down" +msgstr "Volume regolato" + +#: ../src\extra\SoundsTutorial\gui.py:36 +msgid "" +"It seems as though the currently used sound pack needs an update. %i fails " +"are still be required to use this function. Make sure to obtain the needed " +"lacking sounds or to contact with the sound pack developer." +msgstr "" +"Sembra che attualmente il pacchetto dei suoni usato richiede un " +"aggiornamento. %i I fail sono ancora necessari per utilizzare questa " +"funzione. Assicurati di ottenere i suoni mancanti necessari o contatta lo " +"sviluppatore per il pacchetto." + +#: ../src\extra\SoundsTutorial\gui.py:36 ../src\extra\SpellChecker\gui.py:34 +#: ../src\gui\dialogs\show_user.py:63 ../src\gui\main.py:703 +#: ../src\gui\main.py:734 ../src\issueReporter\gui.py:98 +#: ../src\issueReporter\gui.py:101 +msgid "Error" +msgstr "Errore" + +#: ../src\extra\SoundsTutorial\gui.py:38 ../src\gui\main.py:68 +msgid "Sounds tutorial" +msgstr "Tutorial dei suoni" + +#: ../src\extra\SoundsTutorial\gui.py:41 +msgid "Press enter to listen to the sound for the selected event" +msgstr "Premi Invio per ascoltare il suono dell'evento selezionato" + +#: ../src\extra\SpellChecker\gui.py:34 +msgid "" +"A bug has happened. There are no dictionaries available for the selected " +"language in TW Blue" +msgstr "" +"Errore. Non ci sono i dizionari disponibili per la lingua selezionata in TW " +"Blu " + +#: ../src\extra\SpellChecker\gui.py:38 +msgid "Mis-spelled word" +msgstr "Mis-spelled word" + +#: ../src\extra\SpellChecker\gui.py:43 +msgid "Context" +msgstr "Contesto" + +#: ../src\extra\SpellChecker\gui.py:48 +msgid "Suggestions" +msgstr "Suggerimenti" + +#: ../src\extra\SpellChecker\gui.py:53 +msgid "Ignore" +msgstr "Ignora" + +#: ../src\extra\SpellChecker\gui.py:55 +msgid "Ignore all" +msgstr "Ignora tutto" + +#: ../src\extra\SpellChecker\gui.py:57 +msgid "Replace" +msgstr "Sostituisci" + +#: ../src\extra\SpellChecker\gui.py:59 +msgid "Replace all" +msgstr "Sostituisci tutto" + +#: ../src\extra\SpellChecker\gui.py:78 +msgid "Mis-spelled word: %s" +msgstr "Mis-spelled word: %s" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "Finished" +msgstr "Finito" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "The spelling review has finished." +msgstr "Correzione di ortografia terminata" + +#: ../src\extra\translator\gui.py:24 ../src\gui\dialogs\message.py:177 +#: ../src\gui\dialogs\message.py:264 ../src\gui\dialogs\message.py:350 +msgid "Translate message" +msgstr "Traduci messaggio" + +#: ../src\extra\translator\gui.py:27 +msgid "Source language" +msgstr "Lingua d'origine" + +#: ../src\extra\translator\gui.py:30 +msgid "Target language" +msgstr "Lingua di destinazione" + +#: ../src\extra\translator\translator.py:53 +msgid "Afrikaans" +msgstr "Africano" + +#: ../src\extra\translator\translator.py:54 +msgid "Albanian" +msgstr "Albanese" + +#: ../src\extra\translator\translator.py:55 +msgid "Amharic" +msgstr "Amarico" + +#: ../src\extra\translator\translator.py:56 +msgid "Arabic" +msgstr "Arabo" + +#: ../src\extra\translator\translator.py:57 +msgid "Armenian" +msgstr "Armeno\"" + +#: ../src\extra\translator\translator.py:58 +msgid "Azerbaijani" +msgstr "Azerbaijano" + +#: ../src\extra\translator\translator.py:59 +msgid "Basque" +msgstr "Basco" + +#: ../src\extra\translator\translator.py:60 +msgid "Belarusian" +msgstr "BieloRusso" + +#: ../src\extra\translator\translator.py:61 +msgid "Bengali" +msgstr "Bengalese" + +#: ../src\extra\translator\translator.py:62 +msgid "Bihari" +msgstr "Bihari" + +#: ../src\extra\translator\translator.py:63 +msgid "Bulgarian" +msgstr "Bulgaro" + +#: ../src\extra\translator\translator.py:64 +msgid "Burmese" +msgstr "Birmano" + +#: ../src\extra\translator\translator.py:65 +msgid "Catalan" +msgstr "Catalano" + +#: ../src\extra\translator\translator.py:66 +msgid "Cherokee" +msgstr "Cherokee" + +#: ../src\extra\translator\translator.py:67 +msgid "Chinese" +msgstr "Cinese" + +#: ../src\extra\translator\translator.py:68 +msgid "Chinese_simplified" +msgstr "Cinese semplificato" + +#: ../src\extra\translator\translator.py:69 +msgid "Chinese_traditional" +msgstr "Cinese tradizionale" + +#: ../src\extra\translator\translator.py:70 +msgid "Croatian" +msgstr "Croato" + +#: ../src\extra\translator\translator.py:71 +msgid "Czech" +msgstr "Ceco" + +#: ../src\extra\translator\translator.py:72 +msgid "Danish" +msgstr "Danese" + +#: ../src\extra\translator\translator.py:73 +msgid "Dhivehi" +msgstr "Dhivehi" + +#: ../src\extra\translator\translator.py:74 +msgid "Dutch" +msgstr "Olandese" + +#: ../src\extra\translator\translator.py:75 +msgid "English" +msgstr "Inglese" + +#: ../src\extra\translator\translator.py:76 +msgid "Esperanto" +msgstr "Esperanto" + +#: ../src\extra\translator\translator.py:77 +msgid "Estonian" +msgstr "Estonian" + +#: ../src\extra\translator\translator.py:78 +msgid "Filipino" +msgstr "Filippino" + +#: ../src\extra\translator\translator.py:79 +msgid "Finnish" +msgstr "Finlandese" + +#: ../src\extra\translator\translator.py:80 +msgid "French" +msgstr "Francese" + +#: ../src\extra\translator\translator.py:81 +msgid "Galician" +msgstr "Galiziano" + +#: ../src\extra\translator\translator.py:82 +msgid "Georgian" +msgstr "Georgiano" + +#: ../src\extra\translator\translator.py:83 +msgid "German" +msgstr "Tedesco" + +#: ../src\extra\translator\translator.py:84 +msgid "Greek" +msgstr "Greco" + +#: ../src\extra\translator\translator.py:85 +msgid "Guarani" +msgstr "Guarani" + +#: ../src\extra\translator\translator.py:86 +msgid "Gujarati" +msgstr "Gujarati" + +#: ../src\extra\translator\translator.py:87 +msgid "Hebrew" +msgstr "Ebraico" + +#: ../src\extra\translator\translator.py:88 +msgid "Hindi" +msgstr "Hindi" + +#: ../src\extra\translator\translator.py:89 +msgid "Hungarian" +msgstr "Ungherese" + +#: ../src\extra\translator\translator.py:90 +msgid "Icelandic" +msgstr "Islandese" + +#: ../src\extra\translator\translator.py:91 +msgid "Indonesian" +msgstr "Indonesiano" + +#: ../src\extra\translator\translator.py:92 +msgid "Inuktitut" +msgstr "Inuktitut" + +#: ../src\extra\translator\translator.py:93 +msgid "Irish" +msgstr "Irlandese" + +#: ../src\extra\translator\translator.py:94 +msgid "Italian" +msgstr "Italiano" + +#: ../src\extra\translator\translator.py:95 +msgid "Japanese" +msgstr "Giapponese" + +#: ../src\extra\translator\translator.py:96 +msgid "Kannada" +msgstr "Kannada" + +#: ../src\extra\translator\translator.py:97 +msgid "Kazakh" +msgstr "Kazako" + +#: ../src\extra\translator\translator.py:98 +msgid "Khmer" +msgstr "Khmer" + +#: ../src\extra\translator\translator.py:99 +msgid "Korean" +msgstr "Coreano" + +#: ../src\extra\translator\translator.py:100 +msgid "Kurdish" +msgstr "Curdo" + +#: ../src\extra\translator\translator.py:101 +msgid "Kyrgyz" +msgstr "Kirghizistan" + +#: ../src\extra\translator\translator.py:102 +msgid "Laothian" +msgstr "Laothian" + +#: ../src\extra\translator\translator.py:103 +msgid "Latvian" +msgstr "Léttone" + +#: ../src\extra\translator\translator.py:104 +msgid "Lithuanian" +msgstr "Lituano" + +#: ../src\extra\translator\translator.py:105 +msgid "Macedonian" +msgstr "Macedone" + +#: ../src\extra\translator\translator.py:106 +msgid "Malay" +msgstr "Malese" + +#: ../src\extra\translator\translator.py:107 +msgid "Malayalam" +msgstr "Malayalam" + +#: ../src\extra\translator\translator.py:108 +msgid "Maltese" +msgstr "Maltese" + +#: ../src\extra\translator\translator.py:109 +msgid "Marathi" +msgstr "Marathi" + +#: ../src\extra\translator\translator.py:110 +msgid "Mongolian" +msgstr "Mongolo" + +#: ../src\extra\translator\translator.py:111 +msgid "Nepali" +msgstr "Nepali" + +#: ../src\extra\translator\translator.py:112 +msgid "Norwegian" +msgstr "Norvegese" + +#: ../src\extra\translator\translator.py:113 +msgid "Oriya" +msgstr " Oriya" + +#: ../src\extra\translator\translator.py:114 +msgid "Pashto" +msgstr "Pashto" + +#: ../src\extra\translator\translator.py:115 +msgid "Persian" +msgstr "Persiano" + +#: ../src\extra\translator\translator.py:116 +msgid "Polish" +msgstr "Polacco" + +#: ../src\extra\translator\translator.py:117 +msgid "Portuguese" +msgstr "Portoghese" + +#: ../src\extra\translator\translator.py:118 +msgid "Punjabi" +msgstr "Punjabi" + +#: ../src\extra\translator\translator.py:119 +msgid "Romanian" +msgstr "Romeno" + +#: ../src\extra\translator\translator.py:120 +msgid "Russian" +msgstr "Russo" + +#: ../src\extra\translator\translator.py:121 +msgid "Sanskrit" +msgstr "Sanskrit" + +#: ../src\extra\translator\translator.py:122 +msgid "Serbian" +msgstr "Serbo" + +#: ../src\extra\translator\translator.py:123 +msgid "Sindhi" +msgstr "Sindhi" + +#: ../src\extra\translator\translator.py:124 +msgid "Sinhalese" +msgstr "Singalese" + +#: ../src\extra\translator\translator.py:125 +msgid "Slovak" +msgstr "Slovacco" + +#: ../src\extra\translator\translator.py:126 +msgid "Slovenian" +msgstr "Sloveno" + +#: ../src\extra\translator\translator.py:127 +msgid "Spanish" +msgstr "Spagnolo" + +#: ../src\extra\translator\translator.py:128 +msgid "Swahili" +msgstr "Swahili" + +#: ../src\extra\translator\translator.py:129 +msgid "Swedish" +msgstr "Svedese" + +#: ../src\extra\translator\translator.py:130 +msgid "Tajik" +msgstr "Tagiko" + +#: ../src\extra\translator\translator.py:131 +msgid "Tamil" +msgstr "Tamil" + +#: ../src\extra\translator\translator.py:132 +msgid "Tagalog" +msgstr "Tagalog" + +#: ../src\extra\translator\translator.py:133 +msgid "Telugu" +msgstr "Telugu" + +#: ../src\extra\translator\translator.py:134 +msgid "Thai" +msgstr "Thai" + +#: ../src\extra\translator\translator.py:135 +msgid "Tibetan" +msgstr "Tibetano" + +#: ../src\extra\translator\translator.py:136 +msgid "Turkish" +msgstr "Turco" + +#: ../src\extra\translator\translator.py:137 +msgid "Ukrainian" +msgstr "Ucraino" + +#: ../src\extra\translator\translator.py:138 +msgid "Urdu" +msgstr "Urdu" + +#: ../src\extra\translator\translator.py:139 +msgid "Uzbek" +msgstr "Uzbeko" + +#: ../src\extra\translator\translator.py:140 +msgid "Uighur" +msgstr "Uighur" + +#: ../src\extra\translator\translator.py:141 +msgid "Vietnamese" +msgstr "Vietnamese" + +#: ../src\extra\translator\translator.py:142 +msgid "Welsh" +msgstr "Gallese" + +#: ../src\extra\translator\translator.py:143 +msgid "Yiddish" +msgstr "Yiddish" + +#: ../src\extra\translator\translator.py:150 +msgid "autodetect" +msgstr "Rilevamento automatico" + +#: ../src\gui\buffers\base.py:54 +msgid "Client" +msgstr "Client" + +#: ../src\gui\buffers\base.py:54 +msgid "Text" +msgstr "Testo" + +#: ../src\gui\buffers\base.py:54 ../src\gui\buffers\events.py:57 +msgid "Date" +msgstr "Data" + +#: ../src\gui\buffers\base.py:54 ../src\gui\buffers\people.py:39 +#: ../src\gui\buffers\user_searches.py:31 ../src\gui\dialogs\utils.py:36 +#: ../src\gui\main.py:154 +msgid "User" +msgstr "Utente" + +#: ../src\gui\buffers\base.py:73 ../src\gui\buffers\base.py:192 +#: ../src\gui\buffers\events.py:58 ../src\gui\buffers\events.py:74 +#: ../src\gui\dialogs\message.py:332 ../src\gui\main.py:79 +#: ../src\gui\main.py:153 ../src\gui\sysTrayIcon.py:34 +msgid "Tweet" +msgstr "Tweet" + +#: ../src\gui\buffers\base.py:75 ../src\gui\buffers\base.py:204 +#: ../src\gui\main.py:83 ../src\keystrokeEditor\constants.py:13 +msgid "Retweet" +msgstr "Retweet" + +#: ../src\gui\buffers\base.py:77 ../src\gui\main.py:81 +msgid "Reply" +msgstr "Rispondi" + +#: ../src\gui\buffers\base.py:79 ../src\gui\main.py:110 +msgid "Direct message" +msgstr "Messaggio diretto" + +#: ../src\gui\buffers\base.py:92 +msgid "Do you really want to delete this timeline?" +msgstr "Eliminare questa linea temporale?" + +#: ../src\gui\buffers\base.py:92 ../src\gui\buffers\favourites.py:41 +#: ../src\gui\buffers\lists.py:46 ../src\gui\buffers\trends.py:41 +#: ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Attention" +msgstr "Attenzione" + +#: ../src\gui\buffers\base.py:104 +msgid "This buffer is not a timeline; it can't be deleted." +msgstr "Impossivile eliminare. Questo buffer non è una Linea temporale;" + +#: ../src\gui\buffers\base.py:184 ../src\gui\buffers\dm.py:44 +#: ../src\gui\buffers\people.py:54 +msgid "Direct message to %s" +msgstr "Messaggio diretto a %s" + +#: ../src\gui\buffers\base.py:192 ../src\gui\buffers\events.py:74 +msgid "Write the tweet here" +msgstr "Scrivi il tweet qui" + +#: ../src\gui\buffers\base.py:204 +msgid "Would you like to add a comment to this tweet?" +msgstr "Vuoi aggiungere un commento a questo tweet?" + +#: ../src\gui\buffers\base.py:207 +msgid "Add your comment to the tweet" +msgstr "Aggiungi il tuo commento al tweet" + +#: ../src\gui\buffers\base.py:223 ../src\gui\buffers\people.py:62 +msgid "Reply to %s" +msgstr "Rispondi a %s" + +#: ../src\gui\buffers\base.py:268 +msgid "Opening URL..." +msgstr "Collegamento alla pagina..." + +#: ../src\gui\buffers\base.py:285 ../src\gui\buffers\events.py:118 +msgid "" +"Do you really want to empty this buffer? It's tweets will be removed from " +"the list but not from Twitter" +msgstr "" +"Svuotare questo buffer? I tweet saranno rimossi dall'elenco, ma non da " +"Twitter" + +#: ../src\gui\buffers\base.py:285 ../src\gui\buffers\events.py:118 +msgid "Empty buffer" +msgstr "Svuota Elenco" + +#: ../src\gui\buffers\base.py:290 ../src\gui\buffers\events.py:122 +msgid "Do you really want to delete this message?" +msgstr "Sei sicuro di voler eliminare questo messaggio?" + +#: ../src\gui\buffers\base.py:290 ../src\gui\buffers\events.py:122 +#: ../src\gui\dialogs\lists.py:107 ../src\gui\main.py:91 +#: ../src\gui\main.py:577 +msgid "Delete" +msgstr "Elimina Tweet" + +#: ../src\gui\buffers\base.py:310 ../src\gui\buffers\base.py:321 +msgid "Unable to play audio." +msgstr "Impossibile riprodurre audio." + +#: ../src\gui\buffers\base.py:312 +msgid "Audio stopped." +msgstr "Stop." + +#: ../src\gui\buffers\events.py:40 +msgid "Empty" +msgstr "Vuoto" + +#: ../src\gui\buffers\events.py:57 +msgid "Event" +msgstr "Evento" + +#: ../src\gui\buffers\events.py:60 +msgid "Remove event" +msgstr "Rimuovere evento" + +#: ../src\gui\buffers\favourites.py:41 +msgid "Do you really want to delete this favourites timeline?" +msgstr "Sei sicuro di voler eliminare questa Linea temporale?" + +#: ../src\gui\buffers\lists.py:46 ../src\gui\dialogs\lists.py:107 +msgid "Do you really want to delete this list?" +msgstr "Sei sicuro di voler eliminare questa lista?" + +#: ../src\gui\buffers\panels.py:27 +msgid "Announce" +msgstr "Notifica" + +#: ../src\gui\buffers\people.py:44 +msgid "Mention" +msgstr "Menziona" + +#: ../src\gui\buffers\trends.py:41 ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Do you really want to delete this search term?" +msgstr "Eliminare la ricerca? " + +#: ../src\gui\dialogs\configuration.py:39 +msgid "Language" +msgstr "Lingua" + +#: ../src\gui\dialogs\configuration.py:53 +msgid "Relative times" +msgstr "Relative times" + +#: ../src\gui\dialogs\configuration.py:57 +msgid "Activate Sapi5 when any other screen reader is not being run" +msgstr "Attiva SAPI5 quando non viene eseguito un altro lettore di schermo" + +#: ../src\gui\dialogs\configuration.py:60 +msgid "Activate the auto-start of the invisible interface" +msgstr "Attiva automaticamente all'avvio l'interfaccia invisibile" + +#: ../src\gui\dialogs\configuration.py:64 +msgid "" +"API calls when the stream is started (One API call equals to 200 tweetts, " +"two API calls equals 400 tweets, etc):" +msgstr "" +"Chiamate API quando viene avviato il flusso (Una chiamata API equivale a 200 " +"tweetts, due chiamate API equivale a 400 tweets," + +#: ../src\gui\dialogs\configuration.py:72 +msgid "Items on each API call" +msgstr "Elementi per ogni chiamata API " + +#: ../src\gui\dialogs\configuration.py:79 +msgid "" +"Inverted buffers: The newest tweets will be shown at the beginning of the " +"lists while the oldest at the end" +msgstr "" +"Elenco invertito: I più nuovi tweets verranno mostrate all'inizio delle " +"liste, mentre il più antico alla fine" + +#: ../src\gui\dialogs\configuration.py:94 +msgid "Show followers" +msgstr "Visualizza followers" + +#: ../src\gui\dialogs\configuration.py:97 +msgid "Show friends" +msgstr "Visualizza following" + +#: ../src\gui\dialogs\configuration.py:100 +msgid "Show favourites" +msgstr "Visualizza preferiti" + +#: ../src\gui\dialogs\configuration.py:103 +msgid "Show blocked users" +msgstr "Mostra gli utenti bloccati" + +#: ../src\gui\dialogs\configuration.py:106 +msgid "Show muted users" +msgstr "Mostra utenti silenziati" + +#: ../src\gui\dialogs\configuration.py:109 +msgid "Show events" +msgstr "Visualizza notifiche" + +#: ../src\gui\dialogs\configuration.py:119 +#: ../src\gui\dialogs\configuration.py:267 +msgid "Ignored clients" +msgstr "Ignora clients" + +#: ../src\gui\dialogs\configuration.py:125 +msgid "Add client" +msgstr "Aggiungi client" + +#: ../src\gui\dialogs\configuration.py:126 +msgid "Remove client" +msgstr "Rimuovi client" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Add a new ignored client" +msgstr "Aggiunto un nuovo client ignorato" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Enter the name of the client here" +msgstr "Inserire il nome del cliente" + +#: ../src\gui\dialogs\configuration.py:154 +msgid "Volume" +msgstr "Volume" + +#: ../src\gui\dialogs\configuration.py:163 +msgid "Global mute" +msgstr "Silenzia tutto" + +#: ../src\gui\dialogs\configuration.py:167 +msgid "Output device" +msgstr "Dispositivo di uscita" + +#: ../src\gui\dialogs\configuration.py:176 +msgid "Input device" +msgstr "Dispositivo di input" + +#: ../src\gui\dialogs\configuration.py:184 +msgid "" +"If you've got a SndUp account, enter your API Key here. Whether the API Key " +"is wrong, the App will fail to upload anything to the server. Whether " +"there's no API Key here, then the audio files will be uploaded anonimously" +msgstr "" +"Se avete un account SndUp, inserisci la tua API Key quì. Se l'API Key è " +"sbagliata, non averrà nessun caricamento. Se non è presente una API key, i " +"file audio verranno caricati anonimamente" + +#: ../src\gui\dialogs\configuration.py:197 +msgid "Sound pack" +msgstr "Pacchetto audio" + +#: ../src\gui\dialogs\configuration.py:213 +#: ../src\gui\dialogs\configuration.py:237 +msgid "Unlink your Dropbox account" +msgstr "Scollega il tuo account Dropbox" + +#: ../src\gui\dialogs\configuration.py:215 +#: ../src\gui\dialogs\configuration.py:232 +#: ../src\gui\dialogs\configuration.py:240 +#: ../src\gui\dialogs\configuration.py:244 +#: ../src\gui\dialogs\configuration.py:251 +msgid "Link your Dropbox account" +msgstr "Collega il tuo account Dropbox" + +#: ../src\gui\dialogs\configuration.py:225 +msgid "" +"The authorisation request will be shown on your browser. Copy the code tat " +"Dropbox will provide and, in the text box that will appear on TW Blue, paste " +"it. This code is necessary to continue. You only need to do it once." +msgstr "" +"Una richiesta di autorizzazione verrà visualizzata nel tuo browser. Copiare " +"il codice fornito da Dropbox nella casella di testo che apparirà ed " +"incolla su TW Blue. Questo codice è necessario per continuare." + +#: ../src\gui\dialogs\configuration.py:225 ../src\sessionmanager\gui.py:83 +msgid "Authorisation" +msgstr "Autorizzazione" + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Enter the code here." +msgstr "Inserire il codice qui." + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Verification code" +msgstr "Codice di verifica" + +#: ../src\gui\dialogs\configuration.py:239 +msgid "Error during authorisation. Try again later." +msgstr "Errore durante l'autorizzazione. Riprovare più tardi." + +#: ../src\gui\dialogs\configuration.py:239 ../src\gui\main.py:718 +#: ../src\gui\main.py:749 +msgid "Error!" +msgstr "Errore" + +#: ../src\gui\dialogs\configuration.py:258 +msgid "TW Blue preferences" +msgstr "Preferenze" + +#: ../src\gui\dialogs\configuration.py:262 ../src\issueReporter\gui.py:30 +msgid "General" +msgstr "Generale" + +#: ../src\gui\dialogs\configuration.py:265 +msgid "Show other buffers" +msgstr "Visualizza" + +#: ../src\gui\dialogs\configuration.py:269 +msgid "Sound" +msgstr "Audio" + +#: ../src\gui\dialogs\configuration.py:271 +msgid "Audio Services" +msgstr "Audio Servizio" + +#: ../src\gui\dialogs\configuration.py:274 +msgid "Save" +msgstr "Salva" + +#: ../src\gui\dialogs\configuration.py:277 ../src\gui\dialogs\follow.py:64 +#: ../src\gui\dialogs\message.py:182 ../src\gui\dialogs\message.py:269 +#: ../src\gui\dialogs\message.py:352 ../src\gui\dialogs\search.py:42 +#: ../src\gui\dialogs\show_user.py:42 ../src\gui\dialogs\update_profile.py:56 +#: ../src\gui\dialogs\utils.py:42 ../src\keystrokeEditor\gui.py:26 +msgid "Close" +msgstr "Chiudi" + +#: ../src\gui\dialogs\configuration.py:290 ../src\gui\main.py:272 +msgid "Followers" +msgstr "Followers" + +#: ../src\gui\dialogs\configuration.py:304 +msgid "friends" +msgstr "Following" + +#: ../src\gui\dialogs\configuration.py:318 +msgid "Favorites" +msgstr "Favoriti" + +#: ../src\gui\dialogs\configuration.py:332 ../src\gui\main.py:290 +msgid "Events" +msgstr "Notifiche" + +#: ../src\gui\dialogs\configuration.py:343 ../src\gui\main.py:282 +msgid "Blocked users" +msgstr "Utenti bloccati" + +#: ../src\gui\dialogs\configuration.py:357 ../src\gui\main.py:286 +msgid "Muted users" +msgstr "Utenti silenziati" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "Restart TW Blue" +msgstr "Riavvia TW Blue" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "" +"The application requires to be restarted to save these changes. Press OK to " +"do it now." +msgstr "" +"L'applicazione richiede di essere riavviata per salvare le modifiche. Premi " +"OK per farlo ora." + +#: ../src\gui\dialogs\follow.py:33 ../src\gui\dialogs\follow.py:43 +#: ../src\keystrokeEditor\gui.py:17 +msgid "Action" +msgstr "Azione" + +#: ../src\gui\dialogs\follow.py:44 ../src\gui\main.py:96 +msgid "Follow" +msgstr "Segui" + +#: ../src\gui\dialogs\follow.py:45 ../src\gui\main.py:98 +msgid "Unfollow" +msgstr "Non seguire" + +#: ../src\gui\dialogs\follow.py:46 ../src\gui\main.py:100 +#: ../src\gui\main.py:127 +msgid "Mute" +msgstr "Mute" + +#: ../src\gui\dialogs\follow.py:47 ../src\gui\main.py:102 +msgid "Unmute" +msgstr "Unmute" + +#: ../src\gui\dialogs\follow.py:48 ../src\gui\main.py:106 +msgid "Block" +msgstr "Blocca" + +#: ../src\gui\dialogs\follow.py:49 ../src\gui\main.py:108 +msgid "Unblock" +msgstr "Sblocca" + +#: ../src\gui\dialogs\follow.py:50 ../src\gui\main.py:104 +msgid "Report as spam" +msgstr "Segnala come spam" + +#: ../src\gui\dialogs\follow.py:61 ../src\gui\dialogs\search.py:40 +#: ../src\gui\dialogs\utils.py:39 ../src\keystrokeEditor\gui.py:76 +msgid "OK" +msgstr "OK" + +#: ../src\gui\dialogs\follow.py:101 +msgid "You've muted to %s" +msgstr "Silenziato a %s" + +#: ../src\gui\dialogs\follow.py:115 +msgid "You've unmuted to %s" +msgstr "Hai de-silenziato %s" + +#: ../src\gui\dialogs\lists.py:36 ../src\gui\main.py:66 +msgid "Lists manager" +msgstr "Gestione liste" + +#: ../src\gui\dialogs\lists.py:38 ../src\gui\main.py:309 +msgid "Lists" +msgstr "Liste" + +#: ../src\gui\dialogs\lists.py:39 +msgid "List" +msgstr "Lista" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Members" +msgstr "Membri" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Owner" +msgstr "Proprietario" + +#: ../src\gui\dialogs\lists.py:39 +msgid "mode" +msgstr "Modalità" + +#: ../src\gui\dialogs\lists.py:39 ../src\gui\dialogs\lists.py:181 +msgid "Description" +msgstr "Descrizione" + +#: ../src\gui\dialogs\lists.py:44 ../src\gui\dialogs\lists.py:173 +msgid "Create a new list" +msgstr "Crea nuova lista" + +#: ../src\gui\dialogs\lists.py:46 ../src\keystrokeEditor\gui.py:22 +msgid "Edit" +msgstr "Modifica" + +#: ../src\gui\dialogs\lists.py:48 ../src\gui\dialogs\lists.py:235 +msgid "Remove" +msgstr "Elimina" + +#: ../src\gui\dialogs\lists.py:50 +msgid "Open in buffer" +msgstr "Apri nel buffer" + +#: ../src\gui\dialogs\lists.py:125 +msgid "List opened" +msgstr "Lista aperta" + +#: ../src\gui\dialogs\lists.py:127 +msgid "This list is arready opened." +msgstr "Questa lista è già aperta." + +#: ../src\gui\dialogs\lists.py:130 ../src\gui\main.py:312 +msgid "List for %s" +msgstr "Modifica elenco %s" + +#: ../src\gui\dialogs\lists.py:148 +msgid "Viewing lists for %s" +msgstr "Visualizzazione delle liste per %s" + +#: ../src\gui\dialogs\lists.py:149 +msgid "Subscribe" +msgstr "Iscriviti" + +#: ../src\gui\dialogs\lists.py:150 +msgid "Unsubscribe" +msgstr "Disiscriviti" + +#: ../src\gui\dialogs\lists.py:176 +msgid "Name (20 characters maximun)" +msgstr "Nome (massimo 20 caratteri)" + +#: ../src\gui\dialogs\lists.py:186 +msgid "Mode" +msgstr "Modalità" + +#: ../src\gui\dialogs\lists.py:187 +msgid "Public" +msgstr "Pubblico" + +#: ../src\gui\dialogs\lists.py:188 +msgid "Private" +msgstr "Privato" + +#: ../src\gui\dialogs\lists.py:208 +msgid "Editing the list %s" +msgstr "Modifica elenco %s" + +#: ../src\gui\dialogs\lists.py:219 +msgid "Select a list to add the user" +msgstr "Seleziona una lista per aggiungere l'utente" + +#: ../src\gui\dialogs\lists.py:220 +msgid "Add" +msgstr "Aggiungi" + +#: ../src\gui\dialogs\lists.py:234 +msgid "Select a list to remove the user" +msgstr "Seleziona una lista per rimuovere l'utente" + +#: ../src\gui\dialogs\message.py:42 ../src\keystrokeEditor\constants.py:11 +msgid "New tweet" +msgstr "Nuovo tweet" + +#: ../src\gui\dialogs\message.py:76 +msgid "Attaching..." +msgstr "Allegando..." + +#: ../src\gui\dialogs\message.py:77 +msgid "Uploading..." +msgstr "Caricando..." + +#: ../src\gui\dialogs\message.py:96 +msgid "Unable to upload the audio" +msgstr "Impossibile caricare l'audio" + +#: ../src\gui\dialogs\message.py:110 ../src\gui\dialogs\message.py:395 +msgid "Translated" +msgstr "Tradotto" + +#: ../src\gui\dialogs\message.py:122 +msgid "There's no URL to be shortened" +msgstr "Nessun URL da accorciare." + +#: ../src\gui\dialogs\message.py:125 +msgid "URL shortened" +msgstr "URL accorciato." + +#: ../src\gui\dialogs\message.py:133 ../src\gui\dialogs\message.py:407 +msgid "There's no URL to be expanded" +msgstr "Nessun URL da espandere" + +#: ../src\gui\dialogs\message.py:136 ../src\gui\dialogs\message.py:410 +msgid "URL expanded" +msgstr "URL espanso" + +#: ../src\gui\dialogs\message.py:164 ../src\gui\dialogs\message.py:219 +#: ../src\gui\dialogs\update_profile.py:51 +#: ../src\gui\dialogs\update_profile.py:88 +msgid "Upload a picture" +msgstr "Carica una foto" + +#: ../src\gui\dialogs\message.py:167 ../src\gui\dialogs\message.py:254 +#: ../src\gui\dialogs\message.py:345 +msgid "Spelling correction" +msgstr "Correzione ortografica" + +#: ../src\gui\dialogs\message.py:171 ../src\gui\dialogs\message.py:258 +msgid "Shorten URL" +msgstr "Accorcia URL" + +#: ../src\gui\dialogs\message.py:173 ../src\gui\dialogs\message.py:260 +#: ../src\gui\dialogs\message.py:347 +msgid "Expand URL" +msgstr "Espandi URL" + +#: ../src\gui\dialogs\message.py:179 ../src\gui\dialogs\message.py:266 +msgid "Send" +msgstr "Invia" + +#: ../src\gui\dialogs\message.py:215 ../src\gui\dialogs\message.py:226 +#: ../src\gui\dialogs\update_profile.py:84 +#: ../src\gui\dialogs\update_profile.py:95 +msgid "Discard image" +msgstr "Scartare immagine" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" +msgstr "File di immagine (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Select the picture to be uploaded" +msgstr "Seleziona l'immagine da caricare" + +#: ../src\gui\dialogs\message.py:248 +msgid "Recipient" +msgstr "Destinatario" + +#: ../src\gui\dialogs\message.py:303 +msgid "Mention to all" +msgstr "Menziona a tutti" + +#: ../src\gui\dialogs\message.py:330 +msgid "Tweet - %i characters " +msgstr "Tweet -% i caratteri " + +#: ../src\gui\dialogs\search.py:26 +msgid "Search on Twitter" +msgstr "Ricerca in Twitter" + +#: ../src\gui\dialogs\search.py:27 ../src\gui\main.py:64 +msgid "Search" +msgstr "Ricerca" + +#: ../src\gui\dialogs\search.py:34 +msgid "Tweets" +msgstr "Tweet" + +#: ../src\gui\dialogs\search.py:35 +msgid "Users" +msgstr "Utente" + +#: ../src\gui\dialogs\show_user.py:26 +msgid "Information for %s" +msgstr "Informazioni per %s" + +#: ../src\gui\dialogs\show_user.py:30 +msgid "Details" +msgstr "Dettagli" + +#: ../src\gui\dialogs\show_user.py:39 +msgid "Go to URL" +msgstr "Vai a URL" + +#: ../src\gui\dialogs\show_user.py:63 +msgid "This user does not exist on Twitter" +msgstr "Questo utente non esiste su Twitter" + +#: ../src\gui\dialogs\show_user.py:68 +msgid "Username: @%s\n" +msgstr "Nome utente: @%s\n" + +#: ../src\gui\dialogs\show_user.py:69 +msgid "Name: %s\n" +msgstr "Nome: %s\n" + +#: ../src\gui\dialogs\show_user.py:71 +msgid "Location: %s\n" +msgstr "Localizzazione: %s\n" + +#: ../src\gui\dialogs\show_user.py:73 +msgid "URL: %s\n" +msgstr "URL: %s\n" + +#: ../src\gui\dialogs\show_user.py:76 +msgid "Bio: %s\n" +msgstr "Descrizione: %s\n" + +#: ../src\gui\dialogs\show_user.py:77 +msgid "Yes" +msgstr "Sì" + +#: ../src\gui\dialogs\show_user.py:78 +msgid "No" +msgstr "No" + +#: ../src\gui\dialogs\show_user.py:79 +msgid "Protected: %s\n" +msgstr "Protetta: %s\n" + +#: ../src\gui\dialogs\show_user.py:80 +msgid "" +"Followers: %s\n" +" Friends: %s\n" +msgstr "" +"Followers: %s\n" +" Following: %s\n" + +#: ../src\gui\dialogs\show_user.py:81 +msgid "Tweets: %s\n" +msgstr "Tweets: %s\n" + +#: ../src\gui\dialogs\show_user.py:82 +msgid "Favourites: %s" +msgstr "Favoriti: %s" + +#: ../src\gui\dialogs\update_profile.py:27 +msgid "Update your profile" +msgstr "Aggiorna il tuo profilo" + +#: ../src\gui\dialogs\update_profile.py:29 +msgid "Name (20 characters maximum)" +msgstr "Nome (massimo 20 caratteri)" + +#: ../src\gui\dialogs\update_profile.py:35 +msgid "Location" +msgstr "Localizzazione, esterno" + +#: ../src\gui\dialogs\update_profile.py:40 +msgid "Website" +msgstr "Sito web" + +#: ../src\gui\dialogs\update_profile.py:45 +msgid "Bio (160 characters maximum)" +msgstr "Descrizione (massimo 160 caratteri)" + +#: ../src\gui\dialogs\update_profile.py:53 ../src\gui\main.py:60 +#: ../src\gui\sysTrayIcon.py:38 +msgid "Update profile" +msgstr "Aggiorna il profilo" + +#: ../src\gui\dialogs\urlList.py:26 +msgid "Select an URL" +msgstr "Seleziona un indirizzo" + +#: ../src\gui\main.py:62 +msgid "Hide window" +msgstr "Nascondi la finestra" + +#: ../src\gui\main.py:70 +msgid "Edit keystrokes" +msgstr "Modifica" + +#: ../src\gui\main.py:72 ../src\gui\sysTrayIcon.py:36 +msgid "Preferences" +msgstr "Preferenze" + +#: ../src\gui\main.py:74 ../src\gui\main.py:597 ../src\gui\sysTrayIcon.py:46 +msgid "Exit" +msgstr "Esci" + +#: ../src\gui\main.py:85 +msgid "Add to favourites" +msgstr "Aggiungi ai preferiti" + +#: ../src\gui\main.py:87 ../src\keystrokeEditor\constants.py:16 +msgid "Remove from favourites" +msgstr "Rimuovi dai favoriti" + +#: ../src\gui\main.py:89 ../src\keystrokeEditor\constants.py:19 +msgid "Show tweet" +msgstr "Visualizza Tweet" + +#: ../src\gui\main.py:112 ../src\keystrokeEditor\constants.py:36 +msgid "Add to list" +msgstr "Aggiungi alla lista" + +#: ../src\gui\main.py:114 ../src\keystrokeEditor\constants.py:37 +msgid "Remove from list" +msgstr "Rimuovi dalla lista" + +#: ../src\gui\main.py:116 +msgid "View lists" +msgstr "Visualizza liste" + +#: ../src\gui\main.py:118 +msgid "Show user profile" +msgstr "Visualizza il profilo utente" + +#: ../src\gui\main.py:120 +msgid "Timeline" +msgstr "Linea temporale" + +#: ../src\gui\main.py:122 +msgid "View favourites" +msgstr "Visualizza preferiti" + +#: ../src\gui\main.py:129 +msgid "Autoread tweets for this buffer" +msgstr "Leggi automaticamente tweets per questo buffer" + +#: ../src\gui\main.py:131 +msgid "Clear buffer" +msgstr "Ripulisci l'elenco" + +#: ../src\gui\main.py:133 ../src\keystrokeEditor\constants.py:22 +msgid "Remove buffer" +msgstr "Elimina Elenco" + +#: ../src\gui\main.py:138 ../src\gui\sysTrayIcon.py:42 +msgid "Documentation" +msgstr "Documentazione" + +#: ../src\gui\main.py:140 +msgid "What's new in this version?" +msgstr "Cosa c'è di nuovo in questa versione?" + +#: ../src\gui\main.py:142 ../src\gui\sysTrayIcon.py:44 +msgid "Check for updates" +msgstr "Controlla aggiornamenti" + +#: ../src\gui\main.py:144 ../src\issueReporter\gui.py:34 +msgid "Report an error" +msgstr "Riporta un errore" + +#: ../src\gui\main.py:146 +msgid "TW Blue website" +msgstr "Sito Web di TW Blue" + +#: ../src\gui\main.py:148 +msgid "About TW Blue" +msgstr "Informazioni su TW Blue" + +#: ../src\gui\main.py:152 +msgid "Application" +msgstr "Applicazione" + +#: ../src\gui\main.py:155 +msgid "Buffer" +msgstr "Buffer" + +#: ../src\gui\main.py:156 +msgid "Help" +msgstr "Aiuto" + +#: ../src\gui\main.py:249 +msgid "Home" +msgstr "Linea temporale" + +#: ../src\gui\main.py:254 +msgid "Mentions" +msgstr "Menzioni" + +#: ../src\gui\main.py:257 +msgid "Direct messages" +msgstr "Messaggi diretti" + +#: ../src\gui\main.py:260 +msgid "Sent" +msgstr "Inviati" + +#: ../src\gui\main.py:266 +msgid "Favourites" +msgstr "Favoriti" + +#: ../src\gui\main.py:278 +msgid "Friends" +msgstr "Following" + +#: ../src\gui\main.py:293 +msgid "Searches" +msgstr "Ricerca" + +#: ../src\gui\main.py:303 +msgid "Timelines" +msgstr "Linea temporale" + +#: ../src\gui\main.py:306 ../src\gui\main.py:714 +msgid "Timeline for %s" +msgstr "Linea temporale di %s" + +#: ../src\gui\main.py:317 +msgid "Favourites timelines" +msgstr "Favoriti" + +#: ../src\gui\main.py:320 ../src\gui\main.py:745 +msgid "Favourites for %s" +msgstr "Favoriti: %s" + +#: ../src\gui\main.py:361 +msgid "Ready" +msgstr "Pronto" + +#: ../src\gui\main.py:388 +msgid "%s favourites from %s" +msgstr "%s preferiti da %s" + +#: ../src\gui\main.py:435 +msgid "Streams disconnected. TW Blue will try to reconnect in a minute." +msgstr "Streams scollegati. TW Blu tenterà di riconnettersi immediatamente." + +#: ../src\gui\main.py:439 +msgid "Reconnecting streams..." +msgstr "Riconnessione streams..." + +#: ../src\gui\main.py:463 +msgid "search for %s" +msgstr "Cerca per %s" + +#: ../src\gui\main.py:468 +msgid "search users for %s" +msgstr "Cerca utente per %s" + +#: ../src\gui\main.py:479 ../src\gui\main.py:490 ../src\gui\main.py:509 +msgid "Select the user" +msgstr "Seleziona l'utente" + +#: ../src\gui\main.py:569 +msgid "User details" +msgstr "Dettagli utente" + +#: ../src\gui\main.py:577 +msgid "" +"Do you really want to delete this message? It will be eliminated from " +"Twitter as well." +msgstr "" +"Sei sicuro di voler eliminare questo messaggio? Verrà eliminato anche da " +"Twitter." + +#: ../src\gui\main.py:597 +msgid "Do you really want to close TW Blue?" +msgstr "Sei sicuro di voler uscire daTW Blue?" + +#: ../src\gui\main.py:687 +msgid "Error while adding to favourites." +msgstr "Errore durante l'aggiunta ai preferiti." + +#: ../src\gui\main.py:695 +msgid "Error while removing from favourites." +msgstr "Errore durante la rimozione dai preferiti." + +#: ../src\gui\main.py:699 +msgid "Individual timeline" +msgstr "Linea Temporale individuale" + +#: ../src\gui\main.py:703 ../src\gui\main.py:734 +msgid "The user does not exist" +msgstr "Questo utente non esiste su Twitter" + +#: ../src\gui\main.py:709 +msgid "Existing timeline" +msgstr "Linea temporale esistente" + +#: ../src\gui\main.py:709 +msgid "" +"There's currently a timeline for this user. You are not able to open another" +msgstr "una linea temporale per questo utente è già presente." + +#: ../src\gui\main.py:718 +msgid "This user has no tweets. You can't open a timeline for this user" +msgstr "" +"Questo utente non ha tweets. Non è possibile aprire una Linea Temporale per " +"questo utente" + +#: ../src\gui\main.py:730 +msgid "List of favourites" +msgstr "Lista dei favoriti" + +#: ../src\gui\main.py:740 +msgid "Existing list" +msgstr "Elenco esistente" + +#: ../src\gui\main.py:740 +msgid "" +"There's already a list of favourites for this user. You can't create another." +msgstr "C'è già una lista di preferiti per questo utente." + +#: ../src\gui\main.py:749 +msgid "" +"This user has no favourites. You can't create a list of favourites for this " +"user." +msgstr "" +"Questo utente non ha preferenze. Non è possibile creare una lista di " +"preferiti per questo utente." + +#: ../src\gui\main.py:791 ../src\gui\main.py:804 +msgid "%s, %s of %s" +msgstr "%s, %s di %s" + +#: ../src\gui\main.py:793 ../src\gui\main.py:806 +msgid "%s. Empty" +msgstr "%s. Vuoto" + +#: ../src\gui\main.py:829 +msgid "Global mute on" +msgstr "Silenzia tutto" + +#: ../src\gui\main.py:832 +msgid "Global mute off" +msgstr "Silenzia tutto off" + +#: ../src\gui\main.py:838 +msgid "Buffer mute on" +msgstr "Disattivato" + +#: ../src\gui\main.py:841 +msgid "Buffer mute off" +msgstr "Attivato" + +#: ../src\gui\main.py:847 +msgid "The auto-reading of new tweets is enabled for this buffer" +msgstr "Attivata la lettura automatica per i nuovi tweet in questo buffer;" + +#: ../src\gui\main.py:850 +msgid "The auto-reading of new tweets is disabled for this buffer" +msgstr "Disattivata la lettura automatica per questo buffer;" + +#: ../src\gui\main.py:857 +msgid "Copied" +msgstr "Copiato" + +#: ../src\gui\main.py:868 ../src\gui\main.py:877 +msgid "%s" +msgstr "%s" + +#: ../src\gui\sysTrayIcon.py:40 +msgid "Show / hide" +msgstr "Mostra / nascondi" + +#: ../src\issueReporter\gui.py:31 +msgid "always" +msgstr "Sempre" + +#: ../src\issueReporter\gui.py:31 +msgid "have not tried" +msgstr "Mai provato" + +#: ../src\issueReporter\gui.py:31 +msgid "random" +msgstr "Casualmente" + +#: ../src\issueReporter\gui.py:31 +msgid "sometimes" +msgstr "Qualche volta" + +#: ../src\issueReporter\gui.py:31 +msgid "unable to duplicate" +msgstr "Impossibile duplicare" + +#: ../src\issueReporter\gui.py:32 +msgid "block" +msgstr "Blocca" + +#: ../src\issueReporter\gui.py:32 +msgid "crash" +msgstr "Crash" + +#: ../src\issueReporter\gui.py:32 +msgid "feature" +msgstr "caratteristica" + +#: ../src\issueReporter\gui.py:32 +msgid "major" +msgstr "Maggiore" + +#: ../src\issueReporter\gui.py:32 +msgid "minor" +msgstr "Minore" + +#: ../src\issueReporter\gui.py:32 +msgid "text" +msgstr "Testo" + +#: ../src\issueReporter\gui.py:32 +msgid "trivial" +msgstr "Trivial" + +#: ../src\issueReporter\gui.py:32 +msgid "tweak" +msgstr "tweak" + +#: ../src\issueReporter\gui.py:37 +msgid "Select a category" +msgstr "Seleziona una categoria" + +#: ../src\issueReporter\gui.py:46 +msgid "" +"Briefly describe what happened. You will be able to thoroughly explain it " +"later" +msgstr "" +"Descrivi brevemente ciò che è accaduto. Sarete in grado di spiegare a fondo " +"in un secondo momento" + +#: ../src\issueReporter\gui.py:56 +msgid "Here, you can describe the bug in detail" +msgstr "È possibile descrivere il bug in dettaglio quì:" + +#: ../src\issueReporter\gui.py:66 +msgid "how often does this bug happen?" +msgstr "Quante volte si verifica questo bug?" + +#: ../src\issueReporter\gui.py:74 +msgid "Select the importance that you think this bug has" +msgstr "Selezionare il livello di importanza del bug" + +#: ../src\issueReporter\gui.py:82 +msgid "" +"I know that the TW Blue bug system will get my Twitter username to contact " +"me and fix the bug quickly" +msgstr "" +"Sono a conoscenza che il sistema di bug TW Blu otterrà il mio nome utente " +"Twitter per contattarmi e fissare il bug rapidamente" + +#: ../src\issueReporter\gui.py:85 +msgid "Send report" +msgstr "Invia rapporto" + +#: ../src\issueReporter\gui.py:98 +msgid "You must fill out both fields" +msgstr "È necessario compilare entrambi i campi" + +#: ../src\issueReporter\gui.py:101 +msgid "" +"You need to mark the checkbox to provide us your twitter username to contact " +"to you if is necessary." +msgstr "" +"Contrassegnare la casella di controllo per fornirci il tuo nome utente " +"Twitter per contattarvi se necessario." + +#: ../src\issueReporter\gui.py:120 +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 "" +"Grazie per aver segnalato il bug! ;Nelle future versioni, si può essere in " +"grado di trovare nella lista delle modifiche. ;Hai segnalato il numero bug%i" + +#: ../src\issueReporter\gui.py:120 +msgid "reported" +msgstr "segnalato" + +#: ../src\issueReporter\gui.py:123 +msgid "Error while reporting" +msgstr "Errore nel segnalare" + +#: ../src\issueReporter\gui.py:123 +msgid "" +"Something unexpected occurred while trying to report the bug. Please, try " +"again later" +msgstr "" +"Qualcosa di inaspettato si è verificato durante il tentativo di riportare il " +"bug. ;Per favore, riprova più tardi" + +#: ../src\keystrokeEditor\constants.py:4 +msgid "Go up up on the current list" +msgstr "Scorre l'elenco verso l'alto" + +#: ../src\keystrokeEditor\constants.py:5 +msgid "Go down up on the current list" +msgstr "Scorri la lista" + +#: ../src\keystrokeEditor\constants.py:6 +msgid "Go to the previous tab" +msgstr "Vai alla scheda precedente" + +#: ../src\keystrokeEditor\constants.py:7 +msgid "Go to the next tab" +msgstr "Vai alla scheda successiva" + +#: ../src\keystrokeEditor\constants.py:8 +msgid "Move up one tweet in the conversation" +msgstr "Vai al tweet precedente" + +#: ../src\keystrokeEditor\constants.py:9 +msgid "Move down one tweet in the conversation" +msgstr "Vai al tweet successivo" + +#: ../src\keystrokeEditor\constants.py:10 +msgid "Show the graphical interface" +msgstr "Mostra l'interfaccia grafica" + +#: ../src\keystrokeEditor\constants.py:12 +msgid "Reply to a tweet" +msgstr "Rispondi" + +#: ../src\keystrokeEditor\constants.py:14 +msgid "Send direct message" +msgstr "Invia un messaggio diretto" + +#: ../src\keystrokeEditor\constants.py:15 +msgid "Mark as favourite" +msgstr "Aggiungi ai preferiti" + +#: ../src\keystrokeEditor\constants.py:17 +msgid "Open the actions dialogue" +msgstr "Open the actions dialogue" + +#: ../src\keystrokeEditor\constants.py:18 +msgid "See user details" +msgstr "Dettagli utente" + +#: ../src\keystrokeEditor\constants.py:20 +msgid "Quit" +msgstr "Esci" + +#: ../src\keystrokeEditor\constants.py:21 +msgid "Open user timeline" +msgstr "Apri una linea temporale per l'utente" + +#: ../src\keystrokeEditor\constants.py:23 +msgid "" +"Open URL on the current tweet, or further information for a friend or " +"follower" +msgstr "Apri il link nel tweet corrente, o ulteriori informazioni" + +#: ../src\keystrokeEditor\constants.py:24 +msgid "Attempt to play audio" +msgstr "Avvio dell'audio." + +#: ../src\keystrokeEditor\constants.py:25 +msgid "Increase volume by 5%" +msgstr "Aumenta Volume 5%" + +#: ../src\keystrokeEditor\constants.py:26 +msgid "Decrease volume by 5%" +msgstr "Diminuisce Volume 5%" + +#: ../src\keystrokeEditor\constants.py:27 +msgid "Go to the first element on the list" +msgstr "Vai al primo elemento dell'elenco" + +#: ../src\keystrokeEditor\constants.py:28 +msgid "Go to the last element on the list" +msgstr "Vai all'ultimo elemento dell'elenco" + +#: ../src\keystrokeEditor\constants.py:29 +msgid "Move 20 elements up on the current list" +msgstr "Salta 20 elementi in alto nell'elenco corrente" + +#: ../src\keystrokeEditor\constants.py:30 +msgid "Move 20 elements down on the current list" +msgstr "Salta 20 elementi in basso nell'elenco corrente" + +#: ../src\keystrokeEditor\constants.py:31 +msgid "Edit profile" +msgstr "Modifica Profilo" + +#: ../src\keystrokeEditor\constants.py:32 +msgid "Remove a tweet or direct message" +msgstr "Rimuovi un tweet o un messaggio diretto" + +#: ../src\keystrokeEditor\constants.py:33 +msgid "Empty the buffer removing all the elements" +msgstr "Svuota il buffer rimuovendo tutti gli elementi" + +#: ../src\keystrokeEditor\constants.py:34 +msgid "Listen the current message" +msgstr "Ascolta il messaggio corrente" + +#: ../src\keystrokeEditor\constants.py:35 +msgid "Copy to clipboard" +msgstr "Copiato negli appunti" + +#: ../src\keystrokeEditor\constants.py:38 +msgid "Mutes/unmutes the active buffer" +msgstr "Mutes/unmutes the active buffer" + +#: ../src\keystrokeEditor\constants.py:39 +msgid "Globally mute/unmute TW Blue" +msgstr "mute/unmute TW Blue" + +#: ../src\keystrokeEditor\constants.py:40 +msgid "toggles the automatic reading of incoming tweets in the active buffer" +msgstr "" +"Attiva o disattiva la Lettura automatica per i nuovi tweet nel buffer " +"selezionato" + +#: ../src\keystrokeEditor\constants.py:41 +msgid "Search on twitter" +msgstr "Ricerca in Twitter" + +#: ../src\keystrokeEditor\constants.py:42 +msgid "Shows the keystroke editor" +msgstr "Visualizza il modificatore comandi" + +#: ../src\keystrokeEditor\constants.py:43 +msgid "Show lists for a specified user" +msgstr "Mostra le liste di un utente" + +#: ../src\keystrokeEditor\gui.py:10 +msgid "Keystroke editor" +msgstr "Modifica comando" + +#: ../src\keystrokeEditor\gui.py:16 +msgid "Select a keystroke to edit" +msgstr "Select a keystroke to edit" + +#: ../src\keystrokeEditor\gui.py:17 +msgid "Keystroke" +msgstr "Comando" + +#: ../src\keystrokeEditor\gui.py:54 +msgid "Editing keystroke" +msgstr "Editing keystroke" + +#: ../src\keystrokeEditor\gui.py:61 +msgid "Control" +msgstr "Comandi" + +#: ../src\keystrokeEditor\gui.py:62 +msgid "Alt" +msgstr "Alt" + +#: ../src\keystrokeEditor\gui.py:63 +msgid "Shift" +msgstr "Shift" + +#: ../src\keystrokeEditor\gui.py:64 +msgid "Windows" +msgstr "Windows" + +#: ../src\keystrokeEditor\gui.py:70 +msgid "Key" +msgstr "Key" + +#: ../src\keystrokeEditor\gui.py:99 +msgid "You need to use the Windows key" +msgstr "È necessario utilizzare il tasto Windows" + +#: ../src\keystrokeEditor\gui.py:99 ../src\keystrokeEditor\gui.py:112 +msgid "Invalid keystroke" +msgstr "Comando non valido" + +#: ../src\keystrokeEditor\gui.py:112 +msgid "You must provide a character for the keystroke" +msgstr "You must provide a character for the keystroke" + +#: ../src\languageHandler.py:95 +msgid "User default" +msgstr "Utente predefinito" + +#: ../src\sessionmanager\gui.py:19 +msgid "Session manager" +msgstr "Gestisci sessione" + +#: ../src\sessionmanager\gui.py:23 +msgid "Select a twitter account to start TW Blue" +msgstr "Selezionare un account twitter per avviare TW Blue" + +#: ../src\sessionmanager\gui.py:25 +msgid "Account" +msgstr "Account" + +#: ../src\sessionmanager\gui.py:30 +msgid "New account" +msgstr "Nuovo account" + +#: ../src\sessionmanager\gui.py:67 +msgid "Account Error" +msgstr "Errore!" + +#: ../src\sessionmanager\gui.py:67 +msgid "You need to configure an account." +msgstr "È necessario configurare un account." + +#: ../src\sessionmanager\gui.py:83 +msgid "" +"The request for the required Twitter authorization to continue will be " +"opened on your browser. You only need to do it once. Would you like to " +"autorhise a new account now?" +msgstr "" +"La richiesta per l'autorizzazione a Twitter necessaria per continuare sarà " +"aperto sul tuo browser. Desideri autorizzare un nuovo account?" + +#: ../src\sessionmanager\gui.py:94 +msgid "Invalid user token" +msgstr "Chiave di autorizzazione utente non valido" + +#: ../src\sessionmanager\gui.py:94 +msgid "" +"Your access token is invalid or the authorisation has failed. Please try " +"again." +msgstr "" +"La tua chiave di accesso non è valido o l'autorizzazione non è riuscita. " +"Riprova." + +#: ../src\sessionmanager\gui.py:97 +msgid "Authorised account %d" +msgstr "Autorizza l'Account %d" + +#: ../src\twitter\buffers\indibidual.py:26 +msgid "One tweet from %s" +msgstr "Un tweet da %s" + +#: ../src\twitter\buffers\indibidual.py:35 +msgid "One tweet from %s in the list %s" +msgstr " Un tweet da %s nella lista %s" + +#: ../src\twitter\buffers\stream.py:57 +msgid "One mention from %s " +msgstr "Una menzione da %s " + +#: ../src\twitter\buffers\stream.py:69 +msgid "One direct message" +msgstr "Un messaggio diretto" + +#: ../src\twitter\compose.py:22 +msgid "About a week ago" +msgstr "Circa una settimana fa" + +#: ../src\twitter\compose.py:24 +msgid "About {} weeks ago" +msgstr "Circa {} settimane fa" + +#: ../src\twitter\compose.py:26 +msgid "A month ago" +msgstr "Un mese fa" + +#: ../src\twitter\compose.py:28 +msgid "About {} months ago" +msgstr "Circa {} mesi fa" + +#: ../src\twitter\compose.py:30 +msgid "About a year ago" +msgstr "Circa un anno fa" + +#: ../src\twitter\compose.py:32 +msgid "About {} years ago" +msgstr "Circa {} anni fa" + +#: ../src\twitter\compose.py:34 +msgid "About 1 day ago" +msgstr "Un giorno fa" + +#: ../src\twitter\compose.py:36 +msgid "About {} days ago" +msgstr "Circa {} giorni fa" + +#: ../src\twitter\compose.py:38 +msgid "just now" +msgstr "Adesso" + +#: ../src\twitter\compose.py:40 +msgid "{} seconds ago" +msgstr "{} secondi fa" + +#: ../src\twitter\compose.py:42 +msgid "1 minute ago" +msgstr "Un minuto fa" + +#: ../src\twitter\compose.py:44 +msgid "{} minutes ago" +msgstr "{} minuti fa" + +#: ../src\twitter\compose.py:46 +msgid "About 1 hour ago" +msgstr "Un'ora fa" + +#: ../src\twitter\compose.py:48 +msgid "About {} hours ago" +msgstr "Circa {} ore fa" + +#: ../src\twitter\compose.py:52 +msgid "January" +msgstr "Gennaio" + +#: ../src\twitter\compose.py:53 +msgid "February" +msgstr "Febbraio" + +#: ../src\twitter\compose.py:54 +msgid "March" +msgstr "Marzo" + +#: ../src\twitter\compose.py:55 +msgid "April" +msgstr "Aprile" + +#: ../src\twitter\compose.py:56 +msgid "May" +msgstr "Maggio" + +#: ../src\twitter\compose.py:57 +msgid "June" +msgstr "Giugno" + +#: ../src\twitter\compose.py:58 +msgid "July" +msgstr "Luglio" + +#: ../src\twitter\compose.py:59 +msgid "August" +msgstr "Agosto" + +#: ../src\twitter\compose.py:60 +msgid "September" +msgstr "Settembre" + +#: ../src\twitter\compose.py:61 +msgid "October" +msgstr "Ottobre" + +#: ../src\twitter\compose.py:62 +msgid "November" +msgstr "Novembre" + +#: ../src\twitter\compose.py:63 +msgid "December" +msgstr "Dicembre" + +#: ../src\twitter\compose.py:66 +msgid "Sunday" +msgstr "Domenica" + +#: ../src\twitter\compose.py:67 +msgid "Monday" +msgstr "Lunedì" + +#: ../src\twitter\compose.py:68 +msgid "Tuesday" +msgstr "Martedì" + +#: ../src\twitter\compose.py:69 +msgid "Wednesday" +msgstr "Mercoledì" + +#: ../src\twitter\compose.py:70 +msgid "Thursday" +msgstr "Giovedì" + +#: ../src\twitter\compose.py:71 +msgid "Friday" +msgstr "Venerdì" + +#: ../src\twitter\compose.py:72 +msgid "Saturday" +msgstr "Sabato" + +#: ../src\twitter\compose.py:75 +msgid "sun" +msgstr "Dom" + +#: ../src\twitter\compose.py:76 +msgid "mon" +msgstr "Lu" + +#: ../src\twitter\compose.py:77 +msgid "tue" +msgstr "Ma" + +#: ../src\twitter\compose.py:78 +msgid "wed" +msgstr "Me" + +#: ../src\twitter\compose.py:79 +msgid "thu" +msgstr "Gio" + +#: ../src\twitter\compose.py:80 +msgid "fri" +msgstr "Ve" + +#: ../src\twitter\compose.py:81 +msgid "sat" +msgstr "Sab" + +#: ../src\twitter\compose.py:85 +msgid "jan" +msgstr "Gen" + +#: ../src\twitter\compose.py:86 +msgid "feb" +msgstr "feb" + +#: ../src\twitter\compose.py:87 +msgid "mar" +msgstr "Mar" + +#: ../src\twitter\compose.py:88 +msgid "apr" +msgstr "Apr" + +#: ../src\twitter\compose.py:89 +msgid "may" +msgstr "Mag" + +#: ../src\twitter\compose.py:90 +msgid "jun" +msgstr "Giu" + +#: ../src\twitter\compose.py:91 +msgid "jul" +msgstr "Lug" + +#: ../src\twitter\compose.py:92 +msgid "aug" +msgstr "Ago" + +#: ../src\twitter\compose.py:93 +msgid "sep" +msgstr "Set" + +#: ../src\twitter\compose.py:94 +msgid "oct" +msgstr "Ott" + +#: ../src\twitter\compose.py:95 +msgid "nov" +msgstr "Nov" + +#: ../src\twitter\compose.py:96 +msgid "dec" +msgstr "dic" + +#: ../src\twitter\compose.py:152 +msgid "Dm to %s " +msgstr "Dm a %s " + +#: ../src\twitter\compose.py:185 +msgid "Unavailable" +msgstr "Non disponibile" + +#: ../src\twitter\compose.py:186 +msgid "" +"%s (@%s). %s followers, %s friends, %s tweets. Last tweet on %s. Joined " +"Twitter on %s" +msgstr "" +"%s (@%s). %s followers, %s Amici, %s tweets. Ultimo tweet %s. Iscritto a " +"Twitter da %s" + +#: ../src\twitter\compose.py:190 +msgid "You've blocked %s" +msgstr "Hai bloccato %s" + +#: ../src\twitter\compose.py:192 +msgid "You've unblocked %s" +msgstr "Hai sbloccato %s" + +#: ../src\twitter\compose.py:195 +msgid "%s(@%s) has followed you" +msgstr "%s(@%s) ti sta seguendo" + +#: ../src\twitter\compose.py:197 +msgid "You've followed %s(@%s)" +msgstr "Stai seguendo %s(@%s)" + +#: ../src\twitter\compose.py:199 +msgid "You've unfollowed %s (@%s)" +msgstr "Non stai più seguendo %s (@%s)" + +#: ../src\twitter\compose.py:202 +msgid "You've added to favourites: %s, %s" +msgstr "Hai aggiunto ai preferiti: %s, %s" + +#: ../src\twitter\compose.py:204 +msgid "%s(@%s) has marked as favorite: %s" +msgstr "%s(@%s) ha segnato come preferito: %s" + +#: ../src\twitter\compose.py:206 +msgid "You've removed from favourites: %s, %s" +msgstr " Hai rimosso dai preferiti: %s, %s" + +#: ../src\twitter\compose.py:207 +msgid "%s(@%s) has removed from favourites: %s" +msgstr "%s(@%s) è stato rimosso dai preferiti: %s" + +#: ../src\twitter\compose.py:209 +msgid "You've created the list %s" +msgstr "Hai creato la lista %s" + +#: ../src\twitter\compose.py:211 +msgid "You've deleted the list %s" +msgstr "Hai eliminato la lista %s" + +#: ../src\twitter\compose.py:213 +msgid "You've updated the list %s" +msgstr "Hai aggiornato la lista %s" + +#: ../src\twitter\compose.py:215 +msgid "You've added %s(@%s) to the list %s" +msgstr "Hai aggiunto %s(@%s) alla lista %s" + +#: ../src\twitter\compose.py:216 +msgid "%s(@%s) has added you to the list %s" +msgstr "%s(@%s) ti ha aggiunto alla lista%s" + +#: ../src\twitter\compose.py:218 +msgid "You'be removed %s(@%s) from the list %s" +msgstr "Hai rimosso %s(@%s) dalla lista %s" + +#: ../src\twitter\compose.py:219 +msgid "%s(@%s) has removed you from the list %s" +msgstr "%s(@%s) ti ha rimosso dalla lista %s" + +#: ../src\twitter\compose.py:221 +msgid "You've subscribed to the list %s, which is owned by %s(@%s)" +msgstr "Ti sei iscritto alla lista %s, creata da %s(@%s)" + +#: ../src\twitter\compose.py:222 +msgid "%s(@%s) has suscribed you to the list %s" +msgstr "%s(@%s) ti ha aggiunto alla lista %s" + +#: ../src\twitter\compose.py:224 +msgid "You've unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "Hai annullato l'iscrizione dalla lista %s, creata da %s(@%s)" + +#: ../src\twitter\compose.py:225 +msgid "You've been unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "Sei stato cancellato dalla lista %s, creata da %s(@%s)" + +#: ../src\twitter\compose.py:226 +msgid "Unknown" +msgstr "Sconosciuto" + +#: ../src\twitter\compose.py:232 +msgid "No description available" +msgstr "Nessuna descrizione disponibile" + +#: ../src\twitter\compose.py:236 +msgid "private" +msgstr "Privato" + +#: ../src\twitter\compose.py:237 +msgid "public" +msgstr "Pubblico" + +#: ../src\twitter\twitter.py:73 +msgid "%s failed. Reason: %s" +msgstr "%s Errore. Motivo: %s" + +#: ../src\twitter\twitter.py:80 +msgid "%s succeeded." +msgstr "%s Operazione riuscita." + +#: ../src\updater\update_manager.py:14 +msgid "Your TW Blue version is up to date" +msgstr "La tua versione di TW Blue è aggiornata" + +#: ../src\updater\update_manager.py:14 ../src\updater\update_manager.py:27 +msgid "Update" +msgstr "Aggiorna" + +#: ../src\updater\update_manager.py:20 +msgid "New version for %s" +msgstr "Nuova versione di %s" + +#: ../src\updater\update_manager.py:20 +msgid "" +"There's a new TW Blue version available. Would you like to download it now?" +msgstr "" +"È disponibile una nuova versione di TW Blue. Vuoi scaricare l'aggiornamento?" + +#: ../src\updater\update_manager.py:22 +msgid "Download in Progress" +msgstr "Download in corso" + +#: ../src\updater\update_manager.py:22 +msgid "Downloading the new version..." +msgstr "Download della nuova versione..." + +#: ../src\updater\update_manager.py:29 +msgid "Done!" +msgstr "Fatto!" + +#: ../src\updater\update_manager.py:29 +msgid "" +"The new TW Blue version has been downloaded and installed. Press OK to start " +"the application." +msgstr "" +"La nuova versione TW blu è stata scaricata e installata. Premere OK per " +"avviare l'applicazione." + +#~ msgid "Tweet - %i characters" +#~ msgstr "Tweet -% i caratteri " + +#~ msgid "%A, %B %d, %Y at %I:%M:%S %p" +#~ msgstr "%A, %B %d, %Y at %I:%M:%S %p" + +#~ msgid "Mention to %s" +#~ msgstr "Menziona a %s" + +#~ msgid "Ouner" +#~ msgstr "Ouner" + +#~ msgid "View members" +#~ msgstr "Visualizza membri" + +#~ msgid "View subscribers" +#~ msgstr "Visualizza gli Iscritti" diff --git a/src/locales/pl/LC_MESSAGES/twblue.mo b/src/locales/pl/LC_MESSAGES/twblue.mo new file mode 100644 index 00000000..da63169a Binary files /dev/null and b/src/locales/pl/LC_MESSAGES/twblue.mo differ diff --git a/src/locales/pl/LC_MESSAGES/twblue.po b/src/locales/pl/LC_MESSAGES/twblue.po new file mode 100644 index 00000000..341c1ed0 --- /dev/null +++ b/src/locales/pl/LC_MESSAGES/twblue.po @@ -0,0 +1,2468 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: Tw Blue 0.46\n" +"POT-Creation-Date: 2014-09-07 07:44+Hora de verano central (México)\n" +"PO-Revision-Date: 2014-09-07 23:49+0100\n" +"Last-Translator: Paweł Masarczyk \n" +"Language-Team: Paweł Masarczyk \n" +"Language: pl\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" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Poedit 1.6.8\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: ../src\extra\AudioUploader\gui.py:31 +#: ../src\gui\dialogs\message.py:169 +#: ../src\gui\dialogs\message.py:256 +msgid "Attach audio" +msgstr "Dołącz audio" + +#: ../src\extra\AudioUploader\gui.py:38 +#: ../src\extra\AudioUploader\gui.py:146 +#: ../src\extra\AudioUploader\gui.py:156 +msgid "Play" +msgstr "Odtwórz" + +#: ../src\extra\AudioUploader\gui.py:41 +#: ../src\extra\AudioUploader\gui.py:75 +#: ../src\extra\AudioUploader\gui.py:80 +#: ../src\extra\AudioUploader\gui.py:107 +msgid "Pause" +msgstr "Pauza" + +#: ../src\extra\AudioUploader\gui.py:44 +#: ../src\extra\AudioUploader\gui.py:103 +msgid "Record" +msgstr "Nagraj" + +#: ../src\extra\AudioUploader\gui.py:47 +msgid "Add an existing file" +msgstr "Dodaj istniejący plik" + +#: ../src\extra\AudioUploader\gui.py:49 +msgid "Discard" +msgstr "Anuluj" + +#: ../src\extra\AudioUploader\gui.py:52 +msgid "Upload to" +msgstr "Wyślij do" + +#: ../src\extra\AudioUploader\gui.py:57 +msgid "Attach" +msgstr "Dołącz" + +#: ../src\extra\AudioUploader\gui.py:59 +#: ../src\issueReporter\gui.py:88 +msgid "Cancel" +msgstr "Anuluj" + +#: ../src\extra\AudioUploader\gui.py:77 +#: ../src\extra\AudioUploader\gui.py:78 +msgid "Resume" +msgstr "Wznów" + +#: ../src\extra\AudioUploader\gui.py:95 +msgid "Stop recording" +msgstr "Zatrzymaj" + +#: ../src\extra\AudioUploader\gui.py:96 +msgid "Recording" +msgstr "Nagrywanie" + +#: ../src\extra\AudioUploader\gui.py:101 +#: ../src\extra\AudioUploader\gui.py:153 +msgid "Stopped" +msgstr "Zatrzymane" + +#: ../src\extra\AudioUploader\gui.py:128 +#: ../src\gui\dialogs\message.py:218 +#: ../src\gui\dialogs\update_profile.py:87 +msgid "Discarded" +msgstr "Anulowane" + +#: ../src\extra\AudioUploader\gui.py:138 +#: ../src\gui\buffers\base.py:303 +#: ../src\gui\buffers\base.py:315 +msgid "Playing..." +msgstr "Odtwarzanie..." + +#: ../src\extra\AudioUploader\gui.py:142 +msgid "Stop" +msgstr "Zatrzymaj" + +#: ../src\extra\AudioUploader\gui.py:161 +msgid "Recoding audio..." +msgstr "Przekodowywanie audio" + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Audio Files (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" +msgstr "Pliki Audio (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Select the audio file to be uploaded" +msgstr "Wybierz plik audio, który chcesz wysłać" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:15 +msgid "File" +msgstr "Plik" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:21 +msgid "Transferred" +msgstr "Przesłano" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:26 +msgid "Total file size" +msgstr "Całkowity rozmiar pliku" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:31 +msgid "Transfer rate" +msgstr "Prędkość przesyłania" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:36 +msgid "Time left" +msgstr "Pozostało" + +#: ../src\extra\AudioUploader\utils.py:27 +msgid "%d day, " +msgstr "%d dzień, " + +#: ../src\extra\AudioUploader\utils.py:29 +msgid "%d days, " +msgstr "%d dni, " + +#: ../src\extra\AudioUploader\utils.py:31 +msgid "%d hour, " +msgstr "%d godzina, " + +#: ../src\extra\AudioUploader\utils.py:33 +msgid "%d hours, " +msgstr "%d godzin, " + +#: ../src\extra\AudioUploader\utils.py:35 +msgid "%d minute, " +msgstr "%d minuta, " + +#: ../src\extra\AudioUploader\utils.py:37 +msgid "%d minutes, " +msgstr "%d minut, " + +#: ../src\extra\AudioUploader\utils.py:39 +msgid "%s second" +msgstr "%s sekunda" + +#: ../src\extra\AudioUploader\utils.py:41 +msgid "%s seconds" +msgstr "%s sekund" + +#: ../src\extra\SoundsTutorial\gui.py:11 +msgid "The tweet may contain a playable audio" +msgstr "Tweet zawiera dźwięk" + +#: ../src\extra\SoundsTutorial\gui.py:12 +msgid "A timeline has been created" +msgstr "Oś czasu utworzona" + +#: ../src\extra\SoundsTutorial\gui.py:13 +msgid "A timeline has been deleted" +msgstr "Oś czasu usunięta" + +#: ../src\extra\SoundsTutorial\gui.py:14 +msgid "You've received a direct message" +msgstr "Otrzymałeś wiadomość prywatną" + +#: ../src\extra\SoundsTutorial\gui.py:15 +msgid "You've sent a direct message" +msgstr "Wysłałeś wiadomość prywatną" + +#: ../src\extra\SoundsTutorial\gui.py:16 +msgid "A bug has happened" +msgstr "Wystąpił błąd" + +#: ../src\extra\SoundsTutorial\gui.py:17 +msgid "You've added a tweet to your favourites" +msgstr "Dodałeś tweet do ulubionych" + +#: ../src\extra\SoundsTutorial\gui.py:18 +msgid "Someone's favourites have been updated" +msgstr "Uaktualniono ulubione" + +#: ../src\extra\SoundsTutorial\gui.py:19 +msgid "There are no more tweets to read" +msgstr "Nie ma więcej tweetów" + +#: ../src\extra\SoundsTutorial\gui.py:20 +msgid "A list has a new tweet" +msgstr "Nowy tweet w liście" + +#: ../src\extra\SoundsTutorial\gui.py:21 +msgid "You can't add any more characters on the tweet" +msgstr "Nie możesz wpisać więcej znaków w tweecie" + +#: ../src\extra\SoundsTutorial\gui.py:22 +msgid "You've been mentioned " +msgstr "Wspomniano Cię" + +#: ../src\extra\SoundsTutorial\gui.py:23 +msgid "A new event has happened" +msgstr "Nowe zdarzenie" + +#: ../src\extra\SoundsTutorial\gui.py:24 +msgid "TW Blue is ready " +msgstr "TW Blue gotowy" + +#: ../src\extra\SoundsTutorial\gui.py:25 +msgid "You've replied" +msgstr "Odpowiedziałeś" + +#: ../src\extra\SoundsTutorial\gui.py:26 +msgid "You've retweeted" +msgstr "Podałeś dalej" + +#: ../src\extra\SoundsTutorial\gui.py:27 +msgid "A search has been updated" +msgstr "Uaktualnione wyszukiwanie" + +#: ../src\extra\SoundsTutorial\gui.py:28 +msgid "There's a new tweet in the main buffer" +msgstr "nowy tweet w głównej osi" + +#: ../src\extra\SoundsTutorial\gui.py:29 +msgid "You've sent a tweet" +msgstr "Wysłałeś tweet" + +#: ../src\extra\SoundsTutorial\gui.py:30 +msgid "There's a new tweet in a timeline" +msgstr "Nowy tweet w osi czasu" + +#: ../src\extra\SoundsTutorial\gui.py:31 +msgid "You have a new follower" +msgstr "Nowy śledzący" + +#: ../src\extra\SoundsTutorial\gui.py:32 +msgid "You've turned the volume up or down" +msgstr "Zmieniłeś głośność" + +#: ../src\extra\SoundsTutorial\gui.py:36 +msgid "It seems as though the currently used sound pack needs an update. %i fails are still be required to use this function. Make sure to obtain the needed lacking sounds or to contact with the sound pack developer." +msgstr "Wygląda na to, że obecnie używany temat dźwiękowy wymaga aktualizacji. Wymaganych jest %i plików, aby użyć tej funkcji. Upewnij się, że posiadasz wszystkie wymagane dźwięki, bądź skontaktuj się z twórcą tematu." + +#: ../src\extra\SoundsTutorial\gui.py:36 +#: ../src\extra\SpellChecker\gui.py:34 +#: ../src\gui\dialogs\show_user.py:63 +#: ../src\gui\main.py:703 +#: ../src\gui\main.py:734 +#: ../src\issueReporter\gui.py:98 +#: ../src\issueReporter\gui.py:101 +msgid "Error" +msgstr "Błąd" + +#: ../src\extra\SoundsTutorial\gui.py:38 +#: ../src\gui\main.py:68 +msgid "Sounds tutorial" +msgstr "Przewodnik dźwiękowy" + +#: ../src\extra\SoundsTutorial\gui.py:41 +msgid "Press enter to listen to the sound for the selected event" +msgstr "Naciśnij enter, aby usłyszeć dźwięk dla wybranego wydarzenia" + +#: ../src\extra\SpellChecker\gui.py:34 +msgid "A bug has happened. There are no dictionaries available for the selected language in TW Blue" +msgstr "Wystąpił błąd. Brak zainstalowanych słowników dla wybranego języka." + +#: ../src\extra\SpellChecker\gui.py:38 +msgid "Mis-spelled word" +msgstr "Błędny wyraz" + +#: ../src\extra\SpellChecker\gui.py:43 +msgid "Context" +msgstr "Kontekst" + +#: ../src\extra\SpellChecker\gui.py:48 +msgid "Suggestions" +msgstr "Sugestie" + +#: ../src\extra\SpellChecker\gui.py:53 +msgid "Ignore" +msgstr "Ignoruj" + +#: ../src\extra\SpellChecker\gui.py:55 +msgid "Ignore all" +msgstr "Ignoruj wszystkie" + +#: ../src\extra\SpellChecker\gui.py:57 +msgid "Replace" +msgstr "Zamień" + +#: ../src\extra\SpellChecker\gui.py:59 +msgid "Replace all" +msgstr "Zamień wszystkie" + +#: ../src\extra\SpellChecker\gui.py:78 +msgid "Mis-spelled word: %s" +msgstr "Błędny wyraz: %s" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "Finished" +msgstr "Ukończono" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "The spelling review has finished." +msgstr "Wyszukiwanie błędów zakończone." + +#: ../src\extra\translator\gui.py:24 +#: ../src\gui\dialogs\message.py:177 +#: ../src\gui\dialogs\message.py:264 +#: ../src\gui\dialogs\message.py:350 +msgid "Translate message" +msgstr "Przetłumacz" + +#: ../src\extra\translator\gui.py:27 +msgid "Source language" +msgstr "Język źródłowy" + +#: ../src\extra\translator\gui.py:30 +msgid "Target language" +msgstr "Język docelowy" + +#: ../src\extra\translator\translator.py:53 +msgid "Afrikaans" +msgstr "afrykanerski" + +#: ../src\extra\translator\translator.py:54 +msgid "Albanian" +msgstr "albański" + +#: ../src\extra\translator\translator.py:55 +msgid "Amharic" +msgstr "amharski" + +#: ../src\extra\translator\translator.py:56 +msgid "Arabic" +msgstr "arabski" + +#: ../src\extra\translator\translator.py:57 +msgid "Armenian" +msgstr "armeński" + +#: ../src\extra\translator\translator.py:58 +msgid "Azerbaijani" +msgstr "azerski" + +#: ../src\extra\translator\translator.py:59 +msgid "Basque" +msgstr "baskijski" + +#: ../src\extra\translator\translator.py:60 +msgid "Belarusian" +msgstr "białoruski" + +#: ../src\extra\translator\translator.py:61 +msgid "Bengali" +msgstr "bengalski" + +#: ../src\extra\translator\translator.py:62 +msgid "Bihari" +msgstr "biharski" + +#: ../src\extra\translator\translator.py:63 +msgid "Bulgarian" +msgstr "bułgarski" + +#: ../src\extra\translator\translator.py:64 +msgid "Burmese" +msgstr "birmański" + +#: ../src\extra\translator\translator.py:65 +msgid "Catalan" +msgstr "kataloński" + +#: ../src\extra\translator\translator.py:66 +msgid "Cherokee" +msgstr "czirokeski" + +#: ../src\extra\translator\translator.py:67 +msgid "Chinese" +msgstr "chiński" + +#: ../src\extra\translator\translator.py:68 +msgid "Chinese_simplified" +msgstr "chiński uproszczony" + +#: ../src\extra\translator\translator.py:69 +msgid "Chinese_traditional" +msgstr "chiński tradycyjny" + +#: ../src\extra\translator\translator.py:70 +msgid "Croatian" +msgstr "chorwacki" + +#: ../src\extra\translator\translator.py:71 +msgid "Czech" +msgstr "czeski" + +#: ../src\extra\translator\translator.py:72 +msgid "Danish" +msgstr "duński" + +#: ../src\extra\translator\translator.py:73 +msgid "Dhivehi" +msgstr "divehi" + +#: ../src\extra\translator\translator.py:74 +msgid "Dutch" +msgstr "holenderski" + +#: ../src\extra\translator\translator.py:75 +msgid "English" +msgstr "angielski" + +#: ../src\extra\translator\translator.py:76 +msgid "Esperanto" +msgstr "esperancki" + +#: ../src\extra\translator\translator.py:77 +msgid "Estonian" +msgstr "estoński" + +#: ../src\extra\translator\translator.py:78 +msgid "Filipino" +msgstr "filipiński" + +#: ../src\extra\translator\translator.py:79 +msgid "Finnish" +msgstr "ffiński" + +#: ../src\extra\translator\translator.py:80 +msgid "French" +msgstr "francuski" + +#: ../src\extra\translator\translator.py:81 +msgid "Galician" +msgstr "galicyjski" + +#: ../src\extra\translator\translator.py:82 +msgid "Georgian" +msgstr "gruziński" + +#: ../src\extra\translator\translator.py:83 +msgid "German" +msgstr "niemiecki" + +#: ../src\extra\translator\translator.py:84 +msgid "Greek" +msgstr "grecki" + +#: ../src\extra\translator\translator.py:85 +msgid "Guarani" +msgstr "guarani" + +#: ../src\extra\translator\translator.py:86 +msgid "Gujarati" +msgstr "gudżarati" + +#: ../src\extra\translator\translator.py:87 +msgid "Hebrew" +msgstr "hebrajski" + +#: ../src\extra\translator\translator.py:88 +msgid "Hindi" +msgstr "hindi" + +#: ../src\extra\translator\translator.py:89 +msgid "Hungarian" +msgstr "węgierski" + +#: ../src\extra\translator\translator.py:90 +msgid "Icelandic" +msgstr "islancki" + +#: ../src\extra\translator\translator.py:91 +msgid "Indonesian" +msgstr "indonezyjski" + +#: ../src\extra\translator\translator.py:92 +msgid "Inuktitut" +msgstr "Inuktitut" + +#: ../src\extra\translator\translator.py:93 +msgid "Irish" +msgstr "irlancki" + +#: ../src\extra\translator\translator.py:94 +msgid "Italian" +msgstr "włoski" + +#: ../src\extra\translator\translator.py:95 +msgid "Japanese" +msgstr "japoński" + +#: ../src\extra\translator\translator.py:96 +msgid "Kannada" +msgstr "Kannada" + +#: ../src\extra\translator\translator.py:97 +msgid "Kazakh" +msgstr "kazachski" + +#: ../src\extra\translator\translator.py:98 +msgid "Khmer" +msgstr "khmerski" + +#: ../src\extra\translator\translator.py:99 +msgid "Korean" +msgstr "koreański" + +#: ../src\extra\translator\translator.py:100 +msgid "Kurdish" +msgstr "kurdyjski" + +#: ../src\extra\translator\translator.py:101 +msgid "Kyrgyz" +msgstr "kirgiski" + +#: ../src\extra\translator\translator.py:102 +msgid "Laothian" +msgstr "laotański" + +#: ../src\extra\translator\translator.py:103 +msgid "Latvian" +msgstr "łotewski" + +#: ../src\extra\translator\translator.py:104 +msgid "Lithuanian" +msgstr "litewski" + +#: ../src\extra\translator\translator.py:105 +msgid "Macedonian" +msgstr "macedoński" + +#: ../src\extra\translator\translator.py:106 +msgid "Malay" +msgstr "malajski" + +#: ../src\extra\translator\translator.py:107 +msgid "Malayalam" +msgstr "malajalam" + +#: ../src\extra\translator\translator.py:108 +msgid "Maltese" +msgstr "maltański" + +#: ../src\extra\translator\translator.py:109 +msgid "Marathi" +msgstr "marathi" + +#: ../src\extra\translator\translator.py:110 +msgid "Mongolian" +msgstr "mongolski" + +#: ../src\extra\translator\translator.py:111 +msgid "Nepali" +msgstr "nepalski" + +#: ../src\extra\translator\translator.py:112 +msgid "Norwegian" +msgstr "norweski" + +#: ../src\extra\translator\translator.py:113 +msgid "Oriya" +msgstr "Orija" + +#: ../src\extra\translator\translator.py:114 +msgid "Pashto" +msgstr "pasztoński" + +#: ../src\extra\translator\translator.py:115 +msgid "Persian" +msgstr "perski" + +#: ../src\extra\translator\translator.py:116 +msgid "Polish" +msgstr "polski" + +#: ../src\extra\translator\translator.py:117 +msgid "Portuguese" +msgstr "portugalski" + +#: ../src\extra\translator\translator.py:118 +msgid "Punjabi" +msgstr "pendżabski" + +#: ../src\extra\translator\translator.py:119 +msgid "Romanian" +msgstr "rumuński" + +#: ../src\extra\translator\translator.py:120 +msgid "Russian" +msgstr "rosyjski" + +#: ../src\extra\translator\translator.py:121 +msgid "Sanskrit" +msgstr "sanskryt" + +#: ../src\extra\translator\translator.py:122 +msgid "Serbian" +msgstr "serbski" + +#: ../src\extra\translator\translator.py:123 +msgid "Sindhi" +msgstr "Sindhi" + +#: ../src\extra\translator\translator.py:124 +msgid "Sinhalese" +msgstr "syngaleski" + +#: ../src\extra\translator\translator.py:125 +msgid "Slovak" +msgstr "słowacki" + +#: ../src\extra\translator\translator.py:126 +msgid "Slovenian" +msgstr "słoweński" + +#: ../src\extra\translator\translator.py:127 +msgid "Spanish" +msgstr "hiszpański" + +#: ../src\extra\translator\translator.py:128 +msgid "Swahili" +msgstr "suahili" + +#: ../src\extra\translator\translator.py:129 +msgid "Swedish" +msgstr "szwecki" + +#: ../src\extra\translator\translator.py:130 +msgid "Tajik" +msgstr "tadżycki" + +#: ../src\extra\translator\translator.py:131 +msgid "Tamil" +msgstr "tamilski" + +#: ../src\extra\translator\translator.py:132 +msgid "Tagalog" +msgstr "tagalski" + +#: ../src\extra\translator\translator.py:133 +msgid "Telugu" +msgstr "telugu" + +#: ../src\extra\translator\translator.py:134 +msgid "Thai" +msgstr "tajski" + +#: ../src\extra\translator\translator.py:135 +msgid "Tibetan" +msgstr "tybetański" + +#: ../src\extra\translator\translator.py:136 +msgid "Turkish" +msgstr "turecki" + +#: ../src\extra\translator\translator.py:137 +msgid "Ukrainian" +msgstr "ukraiński" + +#: ../src\extra\translator\translator.py:138 +msgid "Urdu" +msgstr "urdu" + +#: ../src\extra\translator\translator.py:139 +msgid "Uzbek" +msgstr "uzbecki" + +#: ../src\extra\translator\translator.py:140 +msgid "Uighur" +msgstr "uigur" + +#: ../src\extra\translator\translator.py:141 +msgid "Vietnamese" +msgstr "wietnamski" + +#: ../src\extra\translator\translator.py:142 +msgid "Welsh" +msgstr "walijski" + +#: ../src\extra\translator\translator.py:143 +msgid "Yiddish" +msgstr "jidysz" + +#: ../src\extra\translator\translator.py:150 +msgid "autodetect" +msgstr "Wykryj automatycznie" + +#: ../src\gui\buffers\base.py:54 +msgid "Client" +msgstr "Klient" + +#: ../src\gui\buffers\base.py:54 +msgid "Text" +msgstr "Tekst" + +#: ../src\gui\buffers\base.py:54 +#: ../src\gui\buffers\events.py:57 +msgid "Date" +msgstr "Data" + +#: ../src\gui\buffers\base.py:54 +#: ../src\gui\buffers\people.py:39 +#: ../src\gui\buffers\user_searches.py:31 +#: ../src\gui\dialogs\utils.py:36 +#: ../src\gui\main.py:154 +msgid "User" +msgstr "Użytkownik" + +#: ../src\gui\buffers\base.py:73 +#: ../src\gui\buffers\base.py:192 +#: ../src\gui\buffers\events.py:58 +#: ../src\gui\buffers\events.py:74 +#: ../src\gui\dialogs\message.py:332 +#: ../src\gui\main.py:79 +#: ../src\gui\main.py:153 +#: ../src\gui\sysTrayIcon.py:34 +msgid "Tweet" +msgstr "Tweet" + +#: ../src\gui\buffers\base.py:75 +#: ../src\gui\buffers\base.py:204 +#: ../src\gui\main.py:83 +#: ../src\keystrokeEditor\constants.py:13 +msgid "Retweet" +msgstr "Podaj dalej" + +#: ../src\gui\buffers\base.py:77 +#: ../src\gui\main.py:81 +msgid "Reply" +msgstr "Odpowiedz" + +#: ../src\gui\buffers\base.py:79 +#: ../src\gui\main.py:110 +msgid "Direct message" +msgstr "Wiadomość prywatna" + +#: ../src\gui\buffers\base.py:92 +msgid "Do you really want to delete this timeline?" +msgstr "Czy napewno chcesz usunąć tę oś czasu?" + +#: ../src\gui\buffers\base.py:92 +#: ../src\gui\buffers\favourites.py:41 +#: ../src\gui\buffers\lists.py:46 +#: ../src\gui\buffers\trends.py:41 +#: ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Attention" +msgstr "Uwaga" + +#: ../src\gui\buffers\base.py:104 +msgid "This buffer is not a timeline; it can't be deleted." +msgstr "Ta zakładka nie jest osią czasu; nie można jej usunąć." + +#: ../src\gui\buffers\base.py:184 +#: ../src\gui\buffers\dm.py:44 +#: ../src\gui\buffers\people.py:54 +msgid "Direct message to %s" +msgstr "Wiadomość prywatna do %s" + +#: ../src\gui\buffers\base.py:192 +#: ../src\gui\buffers\events.py:74 +msgid "Write the tweet here" +msgstr "Napisz tweeta tutaj" + +#: ../src\gui\buffers\base.py:204 +msgid "Would you like to add a comment to this tweet?" +msgstr "* Czy chciałbyś dodać komentarz do tego tweeta?" + +#: ../src\gui\buffers\base.py:207 +msgid "Add your comment to the tweet" +msgstr "Dodaj komentarz do tego tweeta" + +#: ../src\gui\buffers\base.py:223 +#: ../src\gui\buffers\people.py:62 +msgid "Reply to %s" +msgstr "Odpowiedz do %s" + +#: ../src\gui\buffers\base.py:268 +msgid "Opening URL..." +msgstr "Otwieranie adresu..." + +#: ../src\gui\buffers\base.py:285 +#: ../src\gui\buffers\events.py:118 +msgid "Do you really want to empty this buffer? It's tweets will be removed from the list but not from Twitter" +msgstr "Czy napewno chcesz opróżnić tę zakładkę? Wszystkie tweety zostaną usunięte z niej, ale nie z Twittera." + +#: ../src\gui\buffers\base.py:285 +#: ../src\gui\buffers\events.py:118 +msgid "Empty buffer" +msgstr "Pusta zakładka" + +#: ../src\gui\buffers\base.py:290 +#: ../src\gui\buffers\events.py:122 +msgid "Do you really want to delete this message?" +msgstr "Czy napewno chcesz usunąć tę wiadomość?" + +#: ../src\gui\buffers\base.py:290 +#: ../src\gui\buffers\events.py:122 +#: ../src\gui\dialogs\lists.py:107 +#: ../src\gui\main.py:91 +#: ../src\gui\main.py:577 +msgid "Delete" +msgstr "Usuń" + +#: ../src\gui\buffers\base.py:310 +#: ../src\gui\buffers\base.py:321 +msgid "Unable to play audio." +msgstr "Nie udało się odtworzyć audio." + +#: ../src\gui\buffers\base.py:312 +msgid "Audio stopped." +msgstr "Odtwarzanie zatrzymane." + +#: ../src\gui\buffers\events.py:40 +msgid "Empty" +msgstr "Pusto" + +#: ../src\gui\buffers\events.py:57 +msgid "Event" +msgstr "Zdarzenie" + +#: ../src\gui\buffers\events.py:60 +msgid "Remove event" +msgstr "Usuń zdarzenie" + +#: ../src\gui\buffers\favourites.py:41 +msgid "Do you really want to delete this favourites timeline?" +msgstr "Czy napewno chcesz usunąć tę oś ulubionych?" + +#: ../src\gui\buffers\lists.py:46 +#: ../src\gui\dialogs\lists.py:107 +msgid "Do you really want to delete this list?" +msgstr "Czy napewno chcesz usunąć tę listę?" + +#: ../src\gui\buffers\panels.py:27 +msgid "Announce" +msgstr "Oznajmiaj" + +#: ../src\gui\buffers\people.py:44 +msgid "Mention" +msgstr "Wzmianka" + +#: ../src\gui\buffers\trends.py:41 +#: ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Do you really want to delete this search term?" +msgstr "Czy napewno chcesz usunąć to wyszukiwanie?" + +#: ../src\gui\dialogs\configuration.py:39 +msgid "Language" +msgstr "Język" + +#: ../src\gui\dialogs\configuration.py:53 +msgid "Relative times" +msgstr "Czasy relatywne" + +#: ../src\gui\dialogs\configuration.py:57 +msgid "Activate Sapi5 when any other screen reader is not being run" +msgstr "Aktywuj SAPI5, gdy nie jest uruchomiony żaden program odczytu ekranu" + +#: ../src\gui\dialogs\configuration.py:60 +msgid "Activate the auto-start of the invisible interface" +msgstr "Aktywuj automatyczny start niewidzialnego interfejsu." + +#: ../src\gui\dialogs\configuration.py:64 +msgid "API calls when the stream is started (One API call equals to 200 tweetts, two API calls equals 400 tweets, etc):" +msgstr "Wywołania API po inicjacji strumienia (Jedno wywołanie to 200 tweetów, dwa to 400 itd.):" + +#: ../src\gui\dialogs\configuration.py:72 +msgid "Items on each API call" +msgstr "elementów przy każdym wywołaniu API" + +#: ../src\gui\dialogs\configuration.py:79 +msgid "Inverted buffers: The newest tweets will be shown at the beginning of the lists while the oldest at the end" +msgstr "Odwrócona kolejność: Najnowsze tweety będą umieszczane na początku listy, podczas gdy najstarsze na jej końcu." + +#: ../src\gui\dialogs\configuration.py:94 +msgid "Show followers" +msgstr "Pokaż śledzących" + +#: ../src\gui\dialogs\configuration.py:97 +msgid "Show friends" +msgstr "pokaż śledzonych" + +#: ../src\gui\dialogs\configuration.py:100 +msgid "Show favourites" +msgstr "Pokaż ulubione" + +#: ../src\gui\dialogs\configuration.py:103 +msgid "Show blocked users" +msgstr "Pokaż zablokowanych użytkowników" + +#: ../src\gui\dialogs\configuration.py:106 +msgid "Show muted users" +msgstr "Pokaż wyciszonych użytkowników" + +#: ../src\gui\dialogs\configuration.py:109 +msgid "Show events" +msgstr "Pokaż zdarzenia" + +#: ../src\gui\dialogs\configuration.py:119 +#: ../src\gui\dialogs\configuration.py:267 +msgid "Ignored clients" +msgstr "Klienty ignorowane" + +#: ../src\gui\dialogs\configuration.py:125 +msgid "Add client" +msgstr "Dodaj klienta" + +#: ../src\gui\dialogs\configuration.py:126 +msgid "Remove client" +msgstr "Usuń klienta" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Add a new ignored client" +msgstr "Dodaj nowego ignorowanego klienta" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Enter the name of the client here" +msgstr "Wprowadź nazwę klienta tutaj" + +#: ../src\gui\dialogs\configuration.py:154 +msgid "Volume" +msgstr "Głośność" + +#: ../src\gui\dialogs\configuration.py:163 +msgid "Global mute" +msgstr "Globalne wyciszenie" + +#: ../src\gui\dialogs\configuration.py:167 +msgid "Output device" +msgstr "Urządzenie wyjściowe" + +#: ../src\gui\dialogs\configuration.py:176 +msgid "Input device" +msgstr "Urządzenie wejściowe" + +#: ../src\gui\dialogs\configuration.py:184 +msgid "If you've got a SndUp account, enter your API Key here. Whether the API Key is wrong, the App will fail to upload anything to the server. Whether there's no API Key here, then the audio files will be uploaded anonimously" +msgstr "Jeżęli posiadasz konto w serwisie SndUp, wprowadź swój klucz API tutaj. Jeżeli klucz API będzie niewłaściwy, programowi nie uda się wysłać nic na serwer. Jeżeli żaden klucz nie zostanie wprowadzony, audio będzie wysyłane anonimowo" + +#: ../src\gui\dialogs\configuration.py:197 +msgid "Sound pack" +msgstr "Temat dźwiękowy" + +#: ../src\gui\dialogs\configuration.py:213 +#: ../src\gui\dialogs\configuration.py:237 +msgid "Unlink your Dropbox account" +msgstr "Rozłącz z kontem Dropbox" + +#: ../src\gui\dialogs\configuration.py:215 +#: ../src\gui\dialogs\configuration.py:232 +#: ../src\gui\dialogs\configuration.py:240 +#: ../src\gui\dialogs\configuration.py:244 +#: ../src\gui\dialogs\configuration.py:251 +msgid "Link your Dropbox account" +msgstr "Połącz z kontem Dropbox" + +#: ../src\gui\dialogs\configuration.py:225 +msgid "The authorisation request will be shown on your browser. Copy the code tat Dropbox will provide and, in the text box that will appear on TW Blue, paste it. This code is necessary to continue. You only need to do it once." +msgstr "Prośba o autoryzację zostanie pokazana w twojej przeglądarce. Skopiuj kod podany przez Dropbox i wklej go w oknie wyświetlonym przez TW Blue." + +#: ../src\gui\dialogs\configuration.py:225 +#: ../src\sessionmanager\gui.py:83 +msgid "Authorisation" +msgstr "Autoryzacja" + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Enter the code here." +msgstr "Wprowadź kod tutaj." + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Verification code" +msgstr "Kod weryfikacyjny" + +#: ../src\gui\dialogs\configuration.py:239 +msgid "Error during authorisation. Try again later." +msgstr "Błąd podczas autoryzacji. Spróbuj ponownie później." + +#: ../src\gui\dialogs\configuration.py:239 +#: ../src\gui\main.py:718 +#: ../src\gui\main.py:749 +msgid "Error!" +msgstr "Błąd!" + +#: ../src\gui\dialogs\configuration.py:258 +msgid "TW Blue preferences" +msgstr "Preferencje TW Blue" + +#: ../src\gui\dialogs\configuration.py:262 +#: ../src\issueReporter\gui.py:30 +msgid "General" +msgstr "Ogólne" + +#: ../src\gui\dialogs\configuration.py:265 +msgid "Show other buffers" +msgstr "Pokazuj inne zakładki" + +#: ../src\gui\dialogs\configuration.py:269 +msgid "Sound" +msgstr "Dźwięk" + +#: ../src\gui\dialogs\configuration.py:271 +msgid "Audio Services" +msgstr "Usługi audio" + +#: ../src\gui\dialogs\configuration.py:274 +msgid "Save" +msgstr "Zapisz" + +#: ../src\gui\dialogs\configuration.py:277 +#: ../src\gui\dialogs\follow.py:64 +#: ../src\gui\dialogs\message.py:182 +#: ../src\gui\dialogs\message.py:269 +#: ../src\gui\dialogs\message.py:352 +#: ../src\gui\dialogs\search.py:42 +#: ../src\gui\dialogs\show_user.py:42 +#: ../src\gui\dialogs\update_profile.py:56 +#: ../src\gui\dialogs\utils.py:42 +#: ../src\keystrokeEditor\gui.py:26 +msgid "Close" +msgstr "Zamknij" + +#: ../src\gui\dialogs\configuration.py:290 +#: ../src\gui\main.py:272 +msgid "Followers" +msgstr "Śledzący" + +#: ../src\gui\dialogs\configuration.py:304 +msgid "friends" +msgstr "Śledzeni" + +#: ../src\gui\dialogs\configuration.py:318 +msgid "Favorites" +msgstr "Ulubione" + +#: ../src\gui\dialogs\configuration.py:332 +#: ../src\gui\main.py:290 +msgid "Events" +msgstr "Zdarzenia" + +#: ../src\gui\dialogs\configuration.py:343 +#: ../src\gui\main.py:282 +msgid "Blocked users" +msgstr "Zablokowani użytkownicy" + +#: ../src\gui\dialogs\configuration.py:357 +#: ../src\gui\main.py:286 +msgid "Muted users" +msgstr "Wyciszeni użytkownicy" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "Restart TW Blue" +msgstr "Uruchom TW Blue ponownie" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "The application requires to be restarted to save these changes. Press OK to do it now." +msgstr "Program wymaga ponownego uruchomienia w celu zapisania zmian. Naciśnij OK, aby zrobić to teraz." + +#: ../src\gui\dialogs\follow.py:33 +#: ../src\gui\dialogs\follow.py:43 +#: ../src\keystrokeEditor\gui.py:17 +msgid "Action" +msgstr "Czynność" + +#: ../src\gui\dialogs\follow.py:44 +#: ../src\gui\main.py:96 +msgid "Follow" +msgstr "Śledź" + +#: ../src\gui\dialogs\follow.py:45 +#: ../src\gui\main.py:98 +msgid "Unfollow" +msgstr "Przestań śledzić" + +#: ../src\gui\dialogs\follow.py:46 +#: ../src\gui\main.py:100 +#: ../src\gui\main.py:127 +msgid "Mute" +msgstr "Wycisz" + +#: ../src\gui\dialogs\follow.py:47 +#: ../src\gui\main.py:102 +msgid "Unmute" +msgstr "Wyłącz wyciszenie" + +#: ../src\gui\dialogs\follow.py:48 +#: ../src\gui\main.py:106 +msgid "Block" +msgstr "Zablokuj" + +#: ../src\gui\dialogs\follow.py:49 +#: ../src\gui\main.py:108 +msgid "Unblock" +msgstr "Odblokuj" + +#: ../src\gui\dialogs\follow.py:50 +#: ../src\gui\main.py:104 +msgid "Report as spam" +msgstr "Zgłoś jako spam" + +#: ../src\gui\dialogs\follow.py:61 +#: ../src\gui\dialogs\search.py:40 +#: ../src\gui\dialogs\utils.py:39 +#: ../src\keystrokeEditor\gui.py:76 +msgid "OK" +msgstr "OK" + +#: ../src\gui\dialogs\follow.py:101 +msgid "You've muted to %s" +msgstr "Wyciszyłeś %s %s" + +#: ../src\gui\dialogs\follow.py:115 +msgid "You've unmuted to %s" +msgstr "Wyłączyłeś wyciszenie %s" + +#: ../src\gui\dialogs\lists.py:36 +#: ../src\gui\main.py:66 +msgid "Lists manager" +msgstr "Menedżer list" + +#: ../src\gui\dialogs\lists.py:38 +#: ../src\gui\main.py:309 +msgid "Lists" +msgstr "Listy" + +#: ../src\gui\dialogs\lists.py:39 +msgid "List" +msgstr "Lista" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Members" +msgstr "Człokowie" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Owner" +msgstr "Właściciel" + +#: ../src\gui\dialogs\lists.py:39 +msgid "mode" +msgstr "Tryb" + +#: ../src\gui\dialogs\lists.py:39 +#: ../src\gui\dialogs\lists.py:181 +msgid "Description" +msgstr "Opis" + +#: ../src\gui\dialogs\lists.py:44 +#: ../src\gui\dialogs\lists.py:173 +msgid "Create a new list" +msgstr "Stwórz nową listę" + +#: ../src\gui\dialogs\lists.py:46 +#: ../src\keystrokeEditor\gui.py:22 +msgid "Edit" +msgstr "Edytuj" + +#: ../src\gui\dialogs\lists.py:48 +#: ../src\gui\dialogs\lists.py:235 +msgid "Remove" +msgstr "Usuń" + +#: ../src\gui\dialogs\lists.py:50 +msgid "Open in buffer" +msgstr "Otwórz w zakładce" + +#: ../src\gui\dialogs\lists.py:125 +msgid "List opened" +msgstr "Otwarto listę" + +#: ../src\gui\dialogs\lists.py:127 +msgid "This list is arready opened." +msgstr "Ta lista jest już otwarta" + +#: ../src\gui\dialogs\lists.py:130 +#: ../src\gui\main.py:312 +msgid "List for %s" +msgstr "Lista dla %s" + +#: ../src\gui\dialogs\lists.py:148 +msgid "Viewing lists for %s" +msgstr "Przeglądanie list %s" + +#: ../src\gui\dialogs\lists.py:149 +msgid "Subscribe" +msgstr "Subskrybuj" + +#: ../src\gui\dialogs\lists.py:150 +msgid "Unsubscribe" +msgstr "Zaprzestań subskrypcji" + +#: ../src\gui\dialogs\lists.py:176 +msgid "Name (20 characters maximun)" +msgstr "Nazwa (maksymalnie 20 znaków)" + +#: ../src\gui\dialogs\lists.py:186 +msgid "Mode" +msgstr "Tryb" + +#: ../src\gui\dialogs\lists.py:187 +msgid "Public" +msgstr "Publiczna" + +#: ../src\gui\dialogs\lists.py:188 +msgid "Private" +msgstr "Prywatna" + +#: ../src\gui\dialogs\lists.py:208 +msgid "Editing the list %s" +msgstr "Edycja listy %s" + +#: ../src\gui\dialogs\lists.py:219 +msgid "Select a list to add the user" +msgstr "Wybierz listę, by dodać użytkownika" + +#: ../src\gui\dialogs\lists.py:220 +msgid "Add" +msgstr "Dodaj" + +#: ../src\gui\dialogs\lists.py:234 +msgid "Select a list to remove the user" +msgstr "Wybierz listę, by usunąć użytkownika" + +#: ../src\gui\dialogs\message.py:42 +#: ../src\keystrokeEditor\constants.py:11 +msgid "New tweet" +msgstr "Nowy tweet" + +#: ../src\gui\dialogs\message.py:76 +msgid "Attaching..." +msgstr "Dołączanie..." + +#: ../src\gui\dialogs\message.py:77 +msgid "Uploading..." +msgstr "Wysyłanie..." + +#: ../src\gui\dialogs\message.py:96 +msgid "Unable to upload the audio" +msgstr "Nie udało się wysłać audio" + +#: ../src\gui\dialogs\message.py:110 +#: ../src\gui\dialogs\message.py:395 +msgid "Translated" +msgstr "Przetłumaczone" + +#: ../src\gui\dialogs\message.py:122 +msgid "There's no URL to be shortened" +msgstr "Brak adresu do skrócenia" + +#: ../src\gui\dialogs\message.py:125 +msgid "URL shortened" +msgstr "Skrócono adres" + +#: ../src\gui\dialogs\message.py:133 +#: ../src\gui\dialogs\message.py:407 +msgid "There's no URL to be expanded" +msgstr "Brak adresu do rozwinięcia" + +#: ../src\gui\dialogs\message.py:136 +#: ../src\gui\dialogs\message.py:410 +msgid "URL expanded" +msgstr "Rozwinięto adres" + +#: ../src\gui\dialogs\message.py:164 +#: ../src\gui\dialogs\message.py:219 +#: ../src\gui\dialogs\update_profile.py:51 +#: ../src\gui\dialogs\update_profile.py:88 +msgid "Upload a picture" +msgstr "Wyślij obraz" + +#: ../src\gui\dialogs\message.py:167 +#: ../src\gui\dialogs\message.py:254 +#: ../src\gui\dialogs\message.py:345 +msgid "Spelling correction" +msgstr "Poprawa błędów" + +#: ../src\gui\dialogs\message.py:171 +#: ../src\gui\dialogs\message.py:258 +msgid "Shorten URL" +msgstr "Skróć adres" + +#: ../src\gui\dialogs\message.py:173 +#: ../src\gui\dialogs\message.py:260 +#: ../src\gui\dialogs\message.py:347 +msgid "Expand URL" +msgstr "Rozwiń adres" + +#: ../src\gui\dialogs\message.py:179 +#: ../src\gui\dialogs\message.py:266 +msgid "Send" +msgstr "Wyślij" + +#: ../src\gui\dialogs\message.py:215 +#: ../src\gui\dialogs\message.py:226 +#: ../src\gui\dialogs\update_profile.py:84 +#: ../src\gui\dialogs\update_profile.py:95 +msgid "Discard image" +msgstr "Anuluj obraz" + +#: ../src\gui\dialogs\message.py:221 +#: ../src\gui\dialogs\update_profile.py:90 +msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" +msgstr "Pliki obrazów (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" + +#: ../src\gui\dialogs\message.py:221 +#: ../src\gui\dialogs\update_profile.py:90 +msgid "Select the picture to be uploaded" +msgstr "Wybierz obraz, który chcesz wysłać" + +#: ../src\gui\dialogs\message.py:248 +msgid "Recipient" +msgstr "Odbiorca" + +#: ../src\gui\dialogs\message.py:303 +msgid "Mention to all" +msgstr "Wspomnij wszystkich" + +#: ../src\gui\dialogs\message.py:330 +msgid "Tweet - %i characters " +msgstr "Tweet - %i znaków" + +#: ../src\gui\dialogs\search.py:26 +msgid "Search on Twitter" +msgstr "Szukaj na Twitterze" + +#: ../src\gui\dialogs\search.py:27 +#: ../src\gui\main.py:64 +msgid "Search" +msgstr "Szukaj" + +#: ../src\gui\dialogs\search.py:34 +msgid "Tweets" +msgstr "Tweety" + +#: ../src\gui\dialogs\search.py:35 +msgid "Users" +msgstr "Użytkownicy" + +#: ../src\gui\dialogs\show_user.py:26 +msgid "Information for %s" +msgstr "Informacje o %s" + +#: ../src\gui\dialogs\show_user.py:30 +msgid "Details" +msgstr "Szczegóły" + +#: ../src\gui\dialogs\show_user.py:39 +msgid "Go to URL" +msgstr "Przejdźd do adresu" + +#: ../src\gui\dialogs\show_user.py:63 +msgid "This user does not exist on Twitter" +msgstr "Ten użytkownik nie istnieje na Twitterze" + +#: ../src\gui\dialogs\show_user.py:68 +msgid "Username: @%s\n" +msgstr "Nazwa użytkownika: @%s\n" + +#: ../src\gui\dialogs\show_user.py:69 +msgid "Name: %s\n" +msgstr "Nazwa wyświetlana: %s\n" + +#: ../src\gui\dialogs\show_user.py:71 +msgid "Location: %s\n" +msgstr "Skąd: %s\n" + +#: ../src\gui\dialogs\show_user.py:73 +msgid "URL: %s\n" +msgstr "Adres: %s\n" + +#: ../src\gui\dialogs\show_user.py:76 +msgid "Bio: %s\n" +msgstr "O mnie: %s\n" + +#: ../src\gui\dialogs\show_user.py:77 +msgid "Yes" +msgstr "Tak" + +#: ../src\gui\dialogs\show_user.py:78 +msgid "No" +msgstr "Nie" + +#: ../src\gui\dialogs\show_user.py:79 +msgid "Protected: %s\n" +msgstr "Chronione: %s\n" + +#: ../src\gui\dialogs\show_user.py:80 +msgid "" +"Followers: %s\n" +" Friends: %s\n" +msgstr "" +"Śledzących: %s\n" +" Śledzonych: %s\n" + +#: ../src\gui\dialogs\show_user.py:81 +msgid "Tweets: %s\n" +msgstr "Tweetów: %s\n" + +#: ../src\gui\dialogs\show_user.py:82 +msgid "Favourites: %s" +msgstr "Ulubionych: %s" + +#: ../src\gui\dialogs\update_profile.py:27 +msgid "Update your profile" +msgstr "Edytuj swój profil" + +#: ../src\gui\dialogs\update_profile.py:29 +msgid "Name (20 characters maximum)" +msgstr "Nazwa wyświetlana (maksymalnie 20 znaków)" + +#: ../src\gui\dialogs\update_profile.py:35 +msgid "Location" +msgstr "Skąd" + +#: ../src\gui\dialogs\update_profile.py:40 +msgid "Website" +msgstr "Strona internetowa" + +#: ../src\gui\dialogs\update_profile.py:45 +msgid "Bio (160 characters maximum)" +msgstr "O mnie" + +#: ../src\gui\dialogs\update_profile.py:53 +#: ../src\gui\main.py:60 +#: ../src\gui\sysTrayIcon.py:38 +msgid "Update profile" +msgstr "Edytuj profil" + +#: ../src\gui\dialogs\urlList.py:26 +msgid "Select an URL" +msgstr "Wybierz link" + +#: ../src\gui\main.py:62 +msgid "Hide window" +msgstr "Ukryj okno" + +#: ../src\gui\main.py:70 +msgid "Edit keystrokes" +msgstr "Edytuj skróty klawiszowe" + +#: ../src\gui\main.py:72 +#: ../src\gui\sysTrayIcon.py:36 +msgid "Preferences" +msgstr "Preferencje" + +#: ../src\gui\main.py:74 +#: ../src\gui\main.py:597 +#: ../src\gui\sysTrayIcon.py:46 +msgid "Exit" +msgstr "Wyjdź" + +#: ../src\gui\main.py:85 +msgid "Add to favourites" +msgstr "Dodaj do ulubionych" + +#: ../src\gui\main.py:87 +#: ../src\keystrokeEditor\constants.py:16 +msgid "Remove from favourites" +msgstr "Usuń z ulubionych" + +#: ../src\gui\main.py:89 +#: ../src\keystrokeEditor\constants.py:19 +msgid "Show tweet" +msgstr "Pokaż tweet" + +#: ../src\gui\main.py:112 +#: ../src\keystrokeEditor\constants.py:36 +msgid "Add to list" +msgstr "Dodaj do listy" + +#: ../src\gui\main.py:114 +#: ../src\keystrokeEditor\constants.py:37 +msgid "Remove from list" +msgstr "Usuń z listy" + +#: ../src\gui\main.py:116 +msgid "View lists" +msgstr "Zobacz listy" + +#: ../src\gui\main.py:118 +msgid "Show user profile" +msgstr "Pokaż profil użytkownika" + +#: ../src\gui\main.py:120 +msgid "Timeline" +msgstr "Oś czasu" + +#: ../src\gui\main.py:122 +msgid "View favourites" +msgstr "Zobacz ulubione" + +#: ../src\gui\main.py:129 +msgid "Autoread tweets for this buffer" +msgstr "Automatycznie czytaj tweety dla tego buforu" + +#: ../src\gui\main.py:131 +msgid "Clear buffer" +msgstr "Wyczyść zawartość zakładki" + +#: ../src\gui\main.py:133 +#: ../src\keystrokeEditor\constants.py:22 +msgid "Remove buffer" +msgstr "Usuń zakładkę" + +#: ../src\gui\main.py:138 +#: ../src\gui\sysTrayIcon.py:42 +msgid "Documentation" +msgstr "Dokumentacja" + +#: ../src\gui\main.py:140 +msgid "What's new in this version?" +msgstr "Co nowego w tej wersji?" + +#: ../src\gui\main.py:142 +#: ../src\gui\sysTrayIcon.py:44 +msgid "Check for updates" +msgstr "Sprawdź czy jest nowa wersja" + +#: ../src\gui\main.py:144 +#: ../src\issueReporter\gui.py:34 +msgid "Report an error" +msgstr "Zgłoś błąd" + +#: ../src\gui\main.py:146 +msgid "TW Blue website" +msgstr "Strona internetowa Tw Blue" + +#: ../src\gui\main.py:148 +msgid "About TW Blue" +msgstr "O Tw Blue" + +#: ../src\gui\main.py:152 +msgid "Application" +msgstr "Program" + +#: ../src\gui\main.py:155 +msgid "Buffer" +msgstr "Zakładka" + +#: ../src\gui\main.py:156 +msgid "Help" +msgstr "Pomoc" + +#: ../src\gui\main.py:249 +msgid "Home" +msgstr "Główna" + +#: ../src\gui\main.py:254 +msgid "Mentions" +msgstr "Wzmianki" + +#: ../src\gui\main.py:257 +msgid "Direct messages" +msgstr "Wiadomości prywatne" + +#: ../src\gui\main.py:260 +msgid "Sent" +msgstr "Wysłane" + +#: ../src\gui\main.py:266 +msgid "Favourites" +msgstr "Ulubione" + +#: ../src\gui\main.py:278 +msgid "Friends" +msgstr "Śledzeni" + +#: ../src\gui\main.py:293 +msgid "Searches" +msgstr "Wyszukiwania" + +#: ../src\gui\main.py:303 +msgid "Timelines" +msgstr "Osi czasu" + +#: ../src\gui\main.py:306 +#: ../src\gui\main.py:714 +msgid "Timeline for %s" +msgstr "Oś czasu %s" + +#: ../src\gui\main.py:317 +msgid "Favourites timelines" +msgstr "Osi czasu ulubionych" + +#: ../src\gui\main.py:320 +#: ../src\gui\main.py:745 +msgid "Favourites for %s" +msgstr "Ulubione %s" + +#: ../src\gui\main.py:361 +msgid "Ready" +msgstr "Gotowe" + +#: ../src\gui\main.py:388 +msgid "%s favourites from %s" +msgstr "%s ulubionych %s" + +#: ../src\gui\main.py:435 +msgid "Streams disconnected. TW Blue will try to reconnect in a minute." +msgstr "Rozłączono strumienie. Tw Blue spróbuje połączyć się ponownie za chwilę." + +#: ../src\gui\main.py:439 +msgid "Reconnecting streams..." +msgstr "Ponowne łączenie ze strumieniami..." + +#: ../src\gui\main.py:463 +msgid "search for %s" +msgstr "Wyszukiwanie %s" + +#: ../src\gui\main.py:468 +msgid "search users for %s" +msgstr "Wyszukiwanie użytkowników %s" + +#: ../src\gui\main.py:479 +#: ../src\gui\main.py:490 +#: ../src\gui\main.py:509 +msgid "Select the user" +msgstr "Wybierz użytkownika" + +#: ../src\gui\main.py:569 +msgid "User details" +msgstr "Dane użytkownika" + +#: ../src\gui\main.py:577 +msgid "Do you really want to delete this message? It will be eliminated from Twitter as well." +msgstr "Czy napewno chcesz usunąć tę wiadomość? Zostanie ona także usunięta z Twittera." + +#: ../src\gui\main.py:597 +msgid "Do you really want to close TW Blue?" +msgstr "Czy napewno chcesz zamknąć Tw Blue?" + +#: ../src\gui\main.py:687 +msgid "Error while adding to favourites." +msgstr "Błąd podczas dodawania do ulubionych." + +#: ../src\gui\main.py:695 +msgid "Error while removing from favourites." +msgstr "Błąd podczas usuwania z ulubionych." + +#: ../src\gui\main.py:699 +msgid "Individual timeline" +msgstr "Indywidualna oś czasu" + +#: ../src\gui\main.py:703 +#: ../src\gui\main.py:734 +msgid "The user does not exist" +msgstr "Użytkownik nie istnieje" + +#: ../src\gui\main.py:709 +msgid "Existing timeline" +msgstr "Istniejąca oś czasu" + +#: ../src\gui\main.py:709 +msgid "There's currently a timeline for this user. You are not able to open another" +msgstr "Oś czasu tego użytkownika jest już otwarta. Nie możesz otworzyć kolejnej." + +#: ../src\gui\main.py:718 +msgid "This user has no tweets. You can't open a timeline for this user" +msgstr "Ten użytkownik nie ma żadnych tweetów. Nie możesz otworzyć jego osi czasu" + +#: ../src\gui\main.py:730 +msgid "List of favourites" +msgstr "Ulubione" + +#: ../src\gui\main.py:740 +msgid "Existing list" +msgstr "Istniejąca lista" + +#: ../src\gui\main.py:740 +msgid "There's already a list of favourites for this user. You can't create another." +msgstr "Istnieją już ulubione tego użytkownika" + +#: ../src\gui\main.py:749 +msgid "This user has no favourites. You can't create a list of favourites for this user." +msgstr "Brak ulubionych u tego użytkownika. Nie można stworzyć listy." + +#: ../src\gui\main.py:791 +#: ../src\gui\main.py:804 +msgid "%s, %s of %s" +msgstr "%s, %s z %s" + +#: ../src\gui\main.py:793 +#: ../src\gui\main.py:806 +msgid "%s. Empty" +msgstr "%s. Pusta" + +#: ../src\gui\main.py:829 +msgid "Global mute on" +msgstr "Globalne wyciszenie włączone" + +#: ../src\gui\main.py:832 +msgid "Global mute off" +msgstr "Globalne wyciszenie wyłączone" + +#: ../src\gui\main.py:838 +msgid "Buffer mute on" +msgstr "Wyciszenie zakładki włączone" + +#: ../src\gui\main.py:841 +msgid "Buffer mute off" +msgstr "Wyciszenie zakładki wyłączone" + +#: ../src\gui\main.py:847 +msgid "The auto-reading of new tweets is enabled for this buffer" +msgstr "Automatyczne odczytywanie nowych tweetów zostało włączone dla tej zakładki" + +#: ../src\gui\main.py:850 +msgid "The auto-reading of new tweets is disabled for this buffer" +msgstr "Automatyczne odczytywanie nowych tweetów zostało wyłączone dla tej zakładki" + +#: ../src\gui\main.py:857 +msgid "Copied" +msgstr "Skopiowano" + +#: ../src\gui\main.py:868 +#: ../src\gui\main.py:877 +msgid "%s" +msgstr "%s" + +#: ../src\gui\sysTrayIcon.py:40 +msgid "Show / hide" +msgstr "Pokaż / ukryj" + +#: ../src\issueReporter\gui.py:31 +msgid "always" +msgstr "Zawsze" + +#: ../src\issueReporter\gui.py:31 +msgid "have not tried" +msgstr "Nie próbowałem" + +#: ../src\issueReporter\gui.py:31 +msgid "random" +msgstr "Losowo" + +#: ../src\issueReporter\gui.py:31 +msgid "sometimes" +msgstr "Czasem" + +#: ../src\issueReporter\gui.py:31 +msgid "unable to duplicate" +msgstr "Nie udało się zduplikować" + +#: ../src\issueReporter\gui.py:32 +msgid "block" +msgstr "Zablokuj" + +#: ../src\issueReporter\gui.py:32 +msgid "crash" +msgstr "Wysyp" + +#: ../src\issueReporter\gui.py:32 +msgid "feature" +msgstr "Funkcja" + +#: ../src\issueReporter\gui.py:32 +msgid "major" +msgstr "poważny" + +#: ../src\issueReporter\gui.py:32 +msgid "minor" +msgstr "drobny" + +#: ../src\issueReporter\gui.py:32 +msgid "text" +msgstr "Tekst" + +#: ../src\issueReporter\gui.py:32 +msgid "trivial" +msgstr "trywialny" + +#: ../src\issueReporter\gui.py:32 +msgid "tweak" +msgstr "usprawnienie" + +#: ../src\issueReporter\gui.py:37 +msgid "Select a category" +msgstr "Wybierz kategorię" + +#: ../src\issueReporter\gui.py:46 +msgid "Briefly describe what happened. You will be able to thoroughly explain it later" +msgstr "Opisz po krótce co się stało. później będziesz mógł opisać to ze szczegółami" + +#: ../src\issueReporter\gui.py:56 +msgid "Here, you can describe the bug in detail" +msgstr "Tutaj możesz opisać szczegóły błędu" + +#: ../src\issueReporter\gui.py:66 +msgid "how often does this bug happen?" +msgstr "Jak często zdarza się ten błąd?" + +#: ../src\issueReporter\gui.py:74 +msgid "Select the importance that you think this bug has" +msgstr "Wybierz wagę twoim zdaniem stosowną dla tego błędu" + +#: ../src\issueReporter\gui.py:82 +msgid "I know that the TW Blue bug system will get my Twitter username to contact me and fix the bug quickly" +msgstr "Wiem, że system zgłaszania błędów TW Blue pozyska moją nazwę użytkownika na Twitterze w celu skontaktowania się ze mną i naprawienia błędu" + +#: ../src\issueReporter\gui.py:85 +msgid "Send report" +msgstr "Wyślij zgłoszenie" + +#: ../src\issueReporter\gui.py:98 +msgid "You must fill out both fields" +msgstr "Musisz wypełnić oba pola" + +#: ../src\issueReporter\gui.py:101 +msgid "You need to mark the checkbox to provide us your twitter username to contact to you if is necessary." +msgstr "Musisz zaznaczyć to pole, aby podać nam swoją nazwę użytkownika na Twitterze, byśmy mogli skontaktować się z Tobą jeśli będzie to konieczne" + +#: ../src\issueReporter\gui.py:120 +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 "Dziękuję za zgłoszenie błędu. W przyszłości jego naprawa może znaleźć się na liście zmian. Zgłosiłeś błąd numer %i" + +#: ../src\issueReporter\gui.py:120 +msgid "reported" +msgstr "Zgłoszone" + +#: ../src\issueReporter\gui.py:123 +msgid "Error while reporting" +msgstr "Błąd podczas zgłaszania" + +#: ../src\issueReporter\gui.py:123 +msgid "Something unexpected occurred while trying to report the bug. Please, try again later" +msgstr "Coś nieoczekiwanego stało się podczas zgłaszania błędu. Proszę spróbować później" + +#: ../src\keystrokeEditor\constants.py:4 +msgid "Go up up on the current list" +msgstr "Przejdź w górę obecnej listy" + +#: ../src\keystrokeEditor\constants.py:5 +msgid "Go down up on the current list" +msgstr "Przejdź w dół obecnej listy" + +#: ../src\keystrokeEditor\constants.py:6 +msgid "Go to the previous tab" +msgstr "Przejdź do poprzedniej zakładki" + +#: ../src\keystrokeEditor\constants.py:7 +msgid "Go to the next tab" +msgstr "Przejdź do następnej zakładki" + +#: ../src\keystrokeEditor\constants.py:8 +msgid "Move up one tweet in the conversation" +msgstr "Przejdź o tweetaw górę w konwersacji" + +#: ../src\keystrokeEditor\constants.py:9 +msgid "Move down one tweet in the conversation" +msgstr "Przejdź o tweeta w dół w konwersacji" + +#: ../src\keystrokeEditor\constants.py:10 +msgid "Show the graphical interface" +msgstr "Pokaż interfejs graficzny" + +#: ../src\keystrokeEditor\constants.py:12 +msgid "Reply to a tweet" +msgstr "Odpowiedz na tweet" + +#: ../src\keystrokeEditor\constants.py:14 +msgid "Send direct message" +msgstr "Wyślij wiadomość prywatną" + +#: ../src\keystrokeEditor\constants.py:15 +msgid "Mark as favourite" +msgstr "Dodaj do ulubionych" + +#: ../src\keystrokeEditor\constants.py:17 +msgid "Open the actions dialogue" +msgstr "Otwórz menu akcji" + +#: ../src\keystrokeEditor\constants.py:18 +msgid "See user details" +msgstr "Zobacz dane użytkownika" + +#: ../src\keystrokeEditor\constants.py:20 +msgid "Quit" +msgstr "Wyjdź" + +#: ../src\keystrokeEditor\constants.py:21 +msgid "Open user timeline" +msgstr "Otwórz oś czasu użytkownika" + +#: ../src\keystrokeEditor\constants.py:23 +msgid "Open URL on the current tweet, or further information for a friend or follower" +msgstr "Otwórz link w obecnym tweecie lub więcej informacji o obserwowanym lub obserwującym" + +#: ../src\keystrokeEditor\constants.py:24 +msgid "Attempt to play audio" +msgstr "Spróbuj odtworzyć audio" + +#: ../src\keystrokeEditor\constants.py:25 +msgid "Increase volume by 5%" +msgstr "Zwiększ głośność o 5%" + +#: ../src\keystrokeEditor\constants.py:26 +msgid "Decrease volume by 5%" +msgstr "Zmniejsz głośność o 5%" + +#: ../src\keystrokeEditor\constants.py:27 +msgid "Go to the first element on the list" +msgstr "Przejdź do pierwszego elementu na liście" + +#: ../src\keystrokeEditor\constants.py:28 +msgid "Go to the last element on the list" +msgstr "Przejdź do ostatniego elementu na liście" + +#: ../src\keystrokeEditor\constants.py:29 +msgid "Move 20 elements up on the current list" +msgstr "Przejdź o 20 elementów w górę listy" + +#: ../src\keystrokeEditor\constants.py:30 +msgid "Move 20 elements down on the current list" +msgstr "Przejdź o 20 elementów w dół listy" + +#: ../src\keystrokeEditor\constants.py:31 +msgid "Edit profile" +msgstr "Edytuj profil" + +#: ../src\keystrokeEditor\constants.py:32 +msgid "Remove a tweet or direct message" +msgstr "Usuń tweet lub wiadomość prywatną" + +#: ../src\keystrokeEditor\constants.py:33 +msgid "Empty the buffer removing all the elements" +msgstr "Oczyść zakładkę usuwając wszystkie zawarte w nim elementy" + +#: ../src\keystrokeEditor\constants.py:34 +msgid "Listen the current message" +msgstr "Wysłuchaj aktualnej wiadomości" + +#: ../src\keystrokeEditor\constants.py:35 +msgid "Copy to clipboard" +msgstr "Skopiuj do schowka" + +#: ../src\keystrokeEditor\constants.py:38 +msgid "Mutes/unmutes the active buffer" +msgstr "Włącza i wyłącza wyciszenie dla obecnej zakładki" + +#: ../src\keystrokeEditor\constants.py:39 +msgid "Globally mute/unmute TW Blue" +msgstr "Globalnie włącza i wyłącza wyciszenie TW Blue" + +#: ../src\keystrokeEditor\constants.py:40 +msgid "toggles the automatic reading of incoming tweets in the active buffer" +msgstr "Przełącza automatyczny odczyt przychodzących tweetów w obecnej zakładce" + +#: ../src\keystrokeEditor\constants.py:41 +msgid "Search on twitter" +msgstr "Szukaj na Twitterze" + +#: ../src\keystrokeEditor\constants.py:42 +msgid "Shows the keystroke editor" +msgstr "Pokazuje edytor skrótów klawiszowych" + +#: ../src\keystrokeEditor\constants.py:43 +msgid "Show lists for a specified user" +msgstr "Pokaż listy wybranegj osoby" + +#: ../src\keystrokeEditor\gui.py:10 +msgid "Keystroke editor" +msgstr "Edytor skrótów klawiszowych" + +#: ../src\keystrokeEditor\gui.py:16 +msgid "Select a keystroke to edit" +msgstr "Wybierz skrót, który chcesz zmienić" + +#: ../src\keystrokeEditor\gui.py:17 +msgid "Keystroke" +msgstr "Skrót" + +#: ../src\keystrokeEditor\gui.py:54 +msgid "Editing keystroke" +msgstr "Edycja skrótu" + +#: ../src\keystrokeEditor\gui.py:61 +msgid "Control" +msgstr "ctrl" + +#: ../src\keystrokeEditor\gui.py:62 +msgid "Alt" +msgstr "Alt" + +#: ../src\keystrokeEditor\gui.py:63 +msgid "Shift" +msgstr "Shift" + +#: ../src\keystrokeEditor\gui.py:64 +msgid "Windows" +msgstr "Windows" + +#: ../src\keystrokeEditor\gui.py:70 +msgid "Key" +msgstr "klawisz" + +#: ../src\keystrokeEditor\gui.py:99 +msgid "You need to use the Windows key" +msgstr "Musisz użyć klawisza Windows" + +#: ../src\keystrokeEditor\gui.py:99 +#: ../src\keystrokeEditor\gui.py:112 +msgid "Invalid keystroke" +msgstr "Niepoprawny skrót klawiszowy" + +#: ../src\keystrokeEditor\gui.py:112 +msgid "You must provide a character for the keystroke" +msgstr "Musisz podać znak, aby utworzyć skrót" + +#: ../src\languageHandler.py:95 +msgid "User default" +msgstr "Domyślny" + +#: ../src\sessionmanager\gui.py:19 +msgid "Session manager" +msgstr "Menedżer sesji" + +#: ../src\sessionmanager\gui.py:23 +msgid "Select a twitter account to start TW Blue" +msgstr "Wybierz konto Twittera, na którym chcesz uruchomić TW Blue" + +#: ../src\sessionmanager\gui.py:25 +msgid "Account" +msgstr "Konto" + +#: ../src\sessionmanager\gui.py:30 +msgid "New account" +msgstr "Nowe konto" + +#: ../src\sessionmanager\gui.py:67 +msgid "Account Error" +msgstr "Błąd konta" + +#: ../src\sessionmanager\gui.py:67 +msgid "You need to configure an account." +msgstr "Musisz skonfigurować konto" + +#: ../src\sessionmanager\gui.py:83 +msgid "The request for the required Twitter authorization to continue will be opened on your browser. You only need to do it once. Would you like to autorhise a new account now?" +msgstr "Prośba o autoryzację Twittera wymaganą, by kontynuować zostanie otwarta w twojej przeglądarce" + +#: ../src\sessionmanager\gui.py:94 +msgid "Invalid user token" +msgstr "Nieprawidłowy token użytkownika" + +#: ../src\sessionmanager\gui.py:94 +msgid "Your access token is invalid or the authorisation has failed. Please try again." +msgstr "Twój token dostępu jest nieprawidłowy bądź autoryzacja nie powiodła się. Proszę spróbować ponownie." + +#: ../src\sessionmanager\gui.py:97 +msgid "Authorised account %d" +msgstr "Autoryzowane konto %d" + +#: ../src\twitter\buffers\indibidual.py:26 +msgid "One tweet from %s" +msgstr "Jeden tweet od %s" + +#: ../src\twitter\buffers\indibidual.py:35 +msgid "One tweet from %s in the list %s" +msgstr "Jeden tweet od %s na liście %s" + +#: ../src\twitter\buffers\stream.py:57 +msgid "One mention from %s " +msgstr "Jedna wzmianka od %s " + +#: ../src\twitter\buffers\stream.py:69 +msgid "One direct message" +msgstr "Jedna wiadomość prywatna" + +#: ../src\twitter\compose.py:22 +msgid "About a week ago" +msgstr "Około 1 tydzień temu" + +#: ../src\twitter\compose.py:24 +msgid "About {} weeks ago" +msgstr "Około {} tygodni temu" + +#: ../src\twitter\compose.py:26 +msgid "A month ago" +msgstr "Miesiąc temu" + +#: ../src\twitter\compose.py:28 +msgid "About {} months ago" +msgstr "Około {} miesięcy temu" + +#: ../src\twitter\compose.py:30 +msgid "About a year ago" +msgstr "Około rok temu" + +#: ../src\twitter\compose.py:32 +msgid "About {} years ago" +msgstr "Około {} lat temu" + +#: ../src\twitter\compose.py:34 +msgid "About 1 day ago" +msgstr "Około 1 dzień temu" + +#: ../src\twitter\compose.py:36 +msgid "About {} days ago" +msgstr "Około {} dni temu" + +#: ../src\twitter\compose.py:38 +msgid "just now" +msgstr "Przed chwilą" + +#: ../src\twitter\compose.py:40 +msgid "{} seconds ago" +msgstr "{} sekund temu" + +#: ../src\twitter\compose.py:42 +msgid "1 minute ago" +msgstr "1 minutę temu" + +#: ../src\twitter\compose.py:44 +msgid "{} minutes ago" +msgstr "{} minut temu" + +#: ../src\twitter\compose.py:46 +msgid "About 1 hour ago" +msgstr "Około 1 godzinę temu" + +#: ../src\twitter\compose.py:48 +msgid "About {} hours ago" +msgstr "Około {} godzin temu" + +#: ../src\twitter\compose.py:52 +msgid "January" +msgstr "Stycznia" + +#: ../src\twitter\compose.py:53 +msgid "February" +msgstr "Lutego" + +#: ../src\twitter\compose.py:54 +msgid "March" +msgstr "Marca" + +#: ../src\twitter\compose.py:55 +msgid "April" +msgstr "Kwietnia" + +#: ../src\twitter\compose.py:56 +msgid "May" +msgstr "Maja" + +#: ../src\twitter\compose.py:57 +msgid "June" +msgstr "Czerwca" + +#: ../src\twitter\compose.py:58 +msgid "July" +msgstr "Lipca" + +#: ../src\twitter\compose.py:59 +msgid "August" +msgstr "Sierpnia" + +#: ../src\twitter\compose.py:60 +msgid "September" +msgstr "Września" + +#: ../src\twitter\compose.py:61 +msgid "October" +msgstr "Października" + +#: ../src\twitter\compose.py:62 +msgid "November" +msgstr "Listopada" + +#: ../src\twitter\compose.py:63 +msgid "December" +msgstr "Grudnia" + +#: ../src\twitter\compose.py:66 +msgid "Sunday" +msgstr "Niedziela" + +#: ../src\twitter\compose.py:67 +msgid "Monday" +msgstr "Poniedziałek" + +#: ../src\twitter\compose.py:68 +msgid "Tuesday" +msgstr "Wtorek" + +#: ../src\twitter\compose.py:69 +msgid "Wednesday" +msgstr "Środa" + +#: ../src\twitter\compose.py:70 +msgid "Thursday" +msgstr "Czwartek" + +#: ../src\twitter\compose.py:71 +msgid "Friday" +msgstr "Piątek" + +#: ../src\twitter\compose.py:72 +msgid "Saturday" +msgstr "Sobota" + +#: ../src\twitter\compose.py:75 +msgid "sun" +msgstr "nie" + +#: ../src\twitter\compose.py:76 +msgid "mon" +msgstr "pon" + +#: ../src\twitter\compose.py:77 +msgid "tue" +msgstr "wt" + +#: ../src\twitter\compose.py:78 +msgid "wed" +msgstr "wt" + +#: ../src\twitter\compose.py:79 +msgid "thu" +msgstr "czw" + +#: ../src\twitter\compose.py:80 +msgid "fri" +msgstr "pt" + +#: ../src\twitter\compose.py:81 +msgid "sat" +msgstr "sob" + +#: ../src\twitter\compose.py:85 +msgid "jan" +msgstr "sty" + +#: ../src\twitter\compose.py:86 +msgid "feb" +msgstr "lut" + +#: ../src\twitter\compose.py:87 +msgid "mar" +msgstr "mar" + +#: ../src\twitter\compose.py:88 +msgid "apr" +msgstr "kwi" + +#: ../src\twitter\compose.py:89 +msgid "may" +msgstr "maj" + +#: ../src\twitter\compose.py:90 +msgid "jun" +msgstr "cze" + +#: ../src\twitter\compose.py:91 +msgid "jul" +msgstr "lip" + +#: ../src\twitter\compose.py:92 +msgid "aug" +msgstr "sier" + +#: ../src\twitter\compose.py:93 +msgid "sep" +msgstr "wrz" + +#: ../src\twitter\compose.py:94 +msgid "oct" +msgstr "paź" + +#: ../src\twitter\compose.py:95 +msgid "nov" +msgstr "lis" + +#: ../src\twitter\compose.py:96 +msgid "dec" +msgstr "gru" + +#: ../src\twitter\compose.py:152 +msgid "Dm to %s " +msgstr "Wiadomość prywatna do %s" + +#: ../src\twitter\compose.py:185 +msgid "Unavailable" +msgstr "Niedostępne" + +#: ../src\twitter\compose.py:186 +msgid "%s (@%s). %s followers, %s friends, %s tweets. Last tweet on %s. Joined Twitter on %s" +msgstr "%s (@%s). %s śledzących, %s śledzonych, %s tweetów. Ostatni tweet %s. Dołączył do Twittera %s" + +#: ../src\twitter\compose.py:190 +msgid "You've blocked %s" +msgstr "Zablokowałeś %s" + +#: ../src\twitter\compose.py:192 +msgid "You've unblocked %s" +msgstr "Odblokowałeś %s" + +#: ../src\twitter\compose.py:195 +msgid "%s(@%s) has followed you" +msgstr "%s(@%s) zaczął Cię śledzić" + +#: ../src\twitter\compose.py:197 +msgid "You've followed %s(@%s)" +msgstr "Zacząłeś śledzić %s(@%s)" + +#: ../src\twitter\compose.py:199 +msgid "You've unfollowed %s (@%s)" +msgstr "Przestałeś śledzić %s (@%s)" + +#: ../src\twitter\compose.py:202 +msgid "You've added to favourites: %s, %s" +msgstr "Dodałeś do ulubionych: %s, %s" + +#: ../src\twitter\compose.py:204 +msgid "%s(@%s) has marked as favorite: %s" +msgstr "%s(@%s) dodał do ulubionych: %s" + +#: ../src\twitter\compose.py:206 +msgid "You've removed from favourites: %s, %s" +msgstr "Usunąłeś z ulubionych: %s, %s" + +#: ../src\twitter\compose.py:207 +msgid "%s(@%s) has removed from favourites: %s" +msgstr "%s(@%s) usunął z ulubionych: %s" + +#: ../src\twitter\compose.py:209 +msgid "You've created the list %s" +msgstr "Stworzyłeś listę %s" + +#: ../src\twitter\compose.py:211 +msgid "You've deleted the list %s" +msgstr "Usunąłeś listę %s" + +#: ../src\twitter\compose.py:213 +msgid "You've updated the list %s" +msgstr "Uaktualniłeś listę %s" + +#: ../src\twitter\compose.py:215 +msgid "You've added %s(@%s) to the list %s" +msgstr "Dodałeś %s(@%s) do listy %s" + +#: ../src\twitter\compose.py:216 +msgid "%s(@%s) has added you to the list %s" +msgstr "%s(@%s) dodał Cię do listy %s" + +#: ../src\twitter\compose.py:218 +msgid "You'be removed %s(@%s) from the list %s" +msgstr "Usunąłeś %s(@%s) z listy %s" + +#: ../src\twitter\compose.py:219 +msgid "%s(@%s) has removed you from the list %s" +msgstr "%s(@%s) usunął Cię z listy %s" + +#: ../src\twitter\compose.py:221 +msgid "You've subscribed to the list %s, which is owned by %s(@%s)" +msgstr "Zasubskrybowałeś listę %s, której właścicielem jest %s(@%s)" + +#: ../src\twitter\compose.py:222 +msgid "%s(@%s) has suscribed you to the list %s" +msgstr "%s(@%s) zasubskrybował Cię na liście %s" + +#: ../src\twitter\compose.py:224 +msgid "You've unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "Przestałeś subskrybować listę %s, której właścicielem jest %s(@%s)" + +#: ../src\twitter\compose.py:225 +msgid "You've been unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "Zaprzestano subskrypcji Ciebie na liście %s, której właścicielem jest %s(@%s)" + +#: ../src\twitter\compose.py:226 +msgid "Unknown" +msgstr "Nieznane" + +#: ../src\twitter\compose.py:232 +msgid "No description available" +msgstr "Brak dostępnego opisu" + +#: ../src\twitter\compose.py:236 +msgid "private" +msgstr "Prywatna" + +#: ../src\twitter\compose.py:237 +msgid "public" +msgstr "Publiczna" + +#: ../src\twitter\twitter.py:73 +msgid "%s failed. Reason: %s" +msgstr "%s nie powiódł się. Powód: %s" + +#: ../src\twitter\twitter.py:80 +msgid "%s succeeded." +msgstr "%s powiódł się." + +#: ../src\updater\update_manager.py:14 +msgid "Your TW Blue version is up to date" +msgstr "Twoja wersja Tw Blue jest aktualna" + +#: ../src\updater\update_manager.py:14 +#: ../src\updater\update_manager.py:27 +msgid "Update" +msgstr "Aktualizacja" + +#: ../src\updater\update_manager.py:20 +msgid "New version for %s" +msgstr "Nowa wersja %s" + +#: ../src\updater\update_manager.py:20 +msgid "There's a new TW Blue version available. Would you like to download it now?" +msgstr "Dostępna jest nowa wersja Tw Blue. Czy chciałbyś ją pobrać teraz?" + +#: ../src\updater\update_manager.py:22 +msgid "Download in Progress" +msgstr "Pobieranie w toku" + +#: ../src\updater\update_manager.py:22 +msgid "Downloading the new version..." +msgstr "Pobieranie nowej wersji..." + +#: ../src\updater\update_manager.py:29 +msgid "Done!" +msgstr "Gotowe!" + +#: ../src\updater\update_manager.py:29 +msgid "The new TW Blue version has been downloaded and installed. Press OK to start the application." +msgstr "Nowa wersja Tw Blue została pobrana i zainstalowana. Naciśnij OK, aby uruchomić program." + +#~ msgid "Tweet - %i characters" +#~ msgstr "Tweet - %i znaków" + +#~ msgid "%A, %B %d, %Y at %I:%M:%S %p" +#~ msgstr "%A, %B %d, %Y o %I:%M:%S %p" + +#~ msgid "View members" +#~ msgstr "Zobacz członków" + +#~ msgid "View subscribers" +#~ msgstr "Zobacz subskrybentów" + +#~ msgid "Mention to %s" +#~ msgstr "Wzmianka o %s" + +#~ msgid "Successfully following %s" +#~ msgstr "Z powodzeniem śledzisz %s" + +#~ msgid "%s has been reported as spam" +#~ msgstr "%s został zgłoszony jako spam" + +#~ msgid "%s has been blocked" +#~ msgstr "%s został zablokowany" + +#~ msgid "User's information" +#~ msgstr "Informacje o użytkowniku" + +#~ msgid "You've unblock %s" +#~ msgstr "Odblokowałeś %s" diff --git a/src/locales/pt/LC_MESSAGES/twblue.mo b/src/locales/pt/LC_MESSAGES/twblue.mo new file mode 100644 index 00000000..80bc9528 Binary files /dev/null and b/src/locales/pt/LC_MESSAGES/twblue.mo differ diff --git a/src/locales/pt/LC_MESSAGES/twblue.po b/src/locales/pt/LC_MESSAGES/twblue.po new file mode 100644 index 00000000..115b58fe --- /dev/null +++ b/src/locales/pt/LC_MESSAGES/twblue.po @@ -0,0 +1,2488 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: TW Blue 0.44\n" +"POT-Creation-Date: 2014-09-07 07:44+Hora de verano central (México)\n" +"PO-Revision-Date: 2014-09-07 15:01+0100\n" +"Last-Translator: Sukil Echenique \n" +"Language-Team: Odenilton Júnior Santos \n" +"Language: pt_BR\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 1.6.8\n" + +#: ../src\extra\AudioUploader\gui.py:31 ../src\gui\dialogs\message.py:169 +#: ../src\gui\dialogs\message.py:256 +msgid "Attach audio" +msgstr "Anexar áudio" + +#: ../src\extra\AudioUploader\gui.py:38 ../src\extra\AudioUploader\gui.py:146 +#: ../src\extra\AudioUploader\gui.py:156 +msgid "Play" +msgstr "Reproduzir" + +#: ../src\extra\AudioUploader\gui.py:41 ../src\extra\AudioUploader\gui.py:75 +#: ../src\extra\AudioUploader\gui.py:80 ../src\extra\AudioUploader\gui.py:107 +msgid "Pause" +msgstr "Pausar" + +#: ../src\extra\AudioUploader\gui.py:44 ../src\extra\AudioUploader\gui.py:103 +msgid "Record" +msgstr "Gravar" + +#: ../src\extra\AudioUploader\gui.py:47 +msgid "Add an existing file" +msgstr "Adicionar um arquivo existente" + +#: ../src\extra\AudioUploader\gui.py:49 +msgid "Discard" +msgstr "Descartar" + +#: ../src\extra\AudioUploader\gui.py:52 +msgid "Upload to" +msgstr "Enviar para" + +#: ../src\extra\AudioUploader\gui.py:57 +msgid "Attach" +msgstr "Anexar" + +#: ../src\extra\AudioUploader\gui.py:59 ../src\issueReporter\gui.py:88 +msgid "Cancel" +msgstr "Cancelar" + +#: ../src\extra\AudioUploader\gui.py:77 ../src\extra\AudioUploader\gui.py:78 +msgid "Resume" +msgstr "Retomar" + +#: ../src\extra\AudioUploader\gui.py:95 +msgid "Stop recording" +msgstr "Parar gravação" + +#: ../src\extra\AudioUploader\gui.py:96 +msgid "Recording" +msgstr "Gravando" + +#: ../src\extra\AudioUploader\gui.py:101 ../src\extra\AudioUploader\gui.py:153 +msgid "Stopped" +msgstr "Parado" + +#: ../src\extra\AudioUploader\gui.py:128 ../src\gui\dialogs\message.py:218 +#: ../src\gui\dialogs\update_profile.py:87 +msgid "Discarded" +msgstr "Descartado" + +#: ../src\extra\AudioUploader\gui.py:138 ../src\gui\buffers\base.py:303 +#: ../src\gui\buffers\base.py:315 +msgid "Playing..." +msgstr "Reproduzindo..." + +#: ../src\extra\AudioUploader\gui.py:142 +msgid "Stop" +msgstr "Parar" + +#: ../src\extra\AudioUploader\gui.py:161 +msgid "Recoding audio..." +msgstr "Gravando áudio..." + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Audio Files (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" +msgstr "Arquivos de Áudio (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Select the audio file to be uploaded" +msgstr "Selecione o arquivo de áudio a ser anexado" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:15 +msgid "File" +msgstr "Arquivo" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:21 +msgid "Transferred" +msgstr "Transferido" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:26 +msgid "Total file size" +msgstr "Tamanho total do arquivo" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:31 +msgid "Transfer rate" +msgstr "Taxa de transferência" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:36 +msgid "Time left" +msgstr "Tempo restante" + +#: ../src\extra\AudioUploader\utils.py:27 +msgid "%d day, " +msgstr "%d dia, " + +#: ../src\extra\AudioUploader\utils.py:29 +msgid "%d days, " +msgstr "%d dias, " + +#: ../src\extra\AudioUploader\utils.py:31 +msgid "%d hour, " +msgstr "%d hora, " + +#: ../src\extra\AudioUploader\utils.py:33 +msgid "%d hours, " +msgstr "%d horas, " + +#: ../src\extra\AudioUploader\utils.py:35 +msgid "%d minute, " +msgstr "%d minuto, " + +#: ../src\extra\AudioUploader\utils.py:37 +msgid "%d minutes, " +msgstr "%d minutos, " + +#: ../src\extra\AudioUploader\utils.py:39 +msgid "%s second" +msgstr "%s segundo" + +#: ../src\extra\AudioUploader\utils.py:41 +msgid "%s seconds" +msgstr "%s segundos" + +#: ../src\extra\SoundsTutorial\gui.py:11 +msgid "The tweet may contain a playable audio" +msgstr "O tweet pode conter um áudio reproduzível" + +#: ../src\extra\SoundsTutorial\gui.py:12 +msgid "A timeline has been created" +msgstr "Uma linha do tempo foi criada" + +#: ../src\extra\SoundsTutorial\gui.py:13 +msgid "A timeline has been deleted" +msgstr "Uma linha do tempo foi excluída" + +#: ../src\extra\SoundsTutorial\gui.py:14 +msgid "You've received a direct message" +msgstr "Você recebeu uma mensagem direta" + +#: ../src\extra\SoundsTutorial\gui.py:15 +msgid "You've sent a direct message" +msgstr "Você enviou uma mensagem direta" + +#: ../src\extra\SoundsTutorial\gui.py:16 +msgid "A bug has happened" +msgstr "Ocorreu um erro" + +#: ../src\extra\SoundsTutorial\gui.py:17 +msgid "You've added a tweet to your favourites" +msgstr "Você adicionou um tweet aos seus favoritos" + +#: ../src\extra\SoundsTutorial\gui.py:18 +msgid "Someone's favourites have been updated" +msgstr "Alguém atualizou os favoritos" + +#: ../src\extra\SoundsTutorial\gui.py:19 +msgid "There are no more tweets to read" +msgstr "Não há mais tweets para ler" + +#: ../src\extra\SoundsTutorial\gui.py:20 +msgid "A list has a new tweet" +msgstr "A lista tem um novo tweet" + +#: ../src\extra\SoundsTutorial\gui.py:21 +msgid "You can't add any more characters on the tweet" +msgstr "Você não pode adicionar mais caracteres no tweet" + +#: ../src\extra\SoundsTutorial\gui.py:22 +msgid "You've been mentioned " +msgstr "Você foi mencionado" + +#: ../src\extra\SoundsTutorial\gui.py:23 +msgid "A new event has happened" +msgstr "Ocorreu um novo evento" + +#: ../src\extra\SoundsTutorial\gui.py:24 +msgid "TW Blue is ready " +msgstr "TW Blue está pronto" + +#: ../src\extra\SoundsTutorial\gui.py:25 +msgid "You've replied" +msgstr "Você respondeu" + +#: ../src\extra\SoundsTutorial\gui.py:26 +msgid "You've retweeted" +msgstr "Você retweetou" + +#: ../src\extra\SoundsTutorial\gui.py:27 +msgid "A search has been updated" +msgstr "A pesquisa foi atualizada" + +#: ../src\extra\SoundsTutorial\gui.py:28 +msgid "There's a new tweet in the main buffer" +msgstr "Há um novo tweet no exibidor principal" + +#: ../src\extra\SoundsTutorial\gui.py:29 +msgid "You've sent a tweet" +msgstr "Você enviou um tweet" + +#: ../src\extra\SoundsTutorial\gui.py:30 +msgid "There's a new tweet in a timeline" +msgstr "Há um novo tweet em uma linha do tempo" + +#: ../src\extra\SoundsTutorial\gui.py:31 +msgid "You have a new follower" +msgstr "Você tem um novo seguidor" + +#: ../src\extra\SoundsTutorial\gui.py:32 +msgid "You've turned the volume up or down" +msgstr "Você alterou o volume para cima ou para baixo" + +#: ../src\extra\SoundsTutorial\gui.py:36 +msgid "" +"It seems as though the currently used sound pack needs an update. %i fails " +"are still be required to use this function. Make sure to obtain the needed " +"lacking sounds or to contact with the sound pack developer." +msgstr "" +"Parece que o pacote de som usado atualmente precisa de uma atualização. %i " +"não são ainda obrigado a usar esta função. Certifique-se de obter os sons " +"necessários que faltam ou entre em contato com o desenvolvedor do pacote de " +"som." + +#: ../src\extra\SoundsTutorial\gui.py:36 ../src\extra\SpellChecker\gui.py:34 +#: ../src\gui\dialogs\show_user.py:63 ../src\gui\main.py:703 +#: ../src\gui\main.py:734 ../src\issueReporter\gui.py:98 +#: ../src\issueReporter\gui.py:101 +msgid "Error" +msgstr "Erro" + +#: ../src\extra\SoundsTutorial\gui.py:38 ../src\gui\main.py:68 +msgid "Sounds tutorial" +msgstr "Conhecer os sons" + +#: ../src\extra\SoundsTutorial\gui.py:41 +msgid "Press enter to listen to the sound for the selected event" +msgstr "Pressione Enter para ouvir o som para o evento selecionado" + +#: ../src\extra\SpellChecker\gui.py:34 +msgid "" +"A bug has happened. There are no dictionaries available for the selected " +"language in TW Blue" +msgstr "" +"Ocorreu um erro. Não há dicionários disponíveis para o idioma selecionado no " +"TW Blue" + +#: ../src\extra\SpellChecker\gui.py:38 +msgid "Mis-spelled word" +msgstr "Correção ortográfica" + +#: ../src\extra\SpellChecker\gui.py:43 +msgid "Context" +msgstr "Contexto" + +#: ../src\extra\SpellChecker\gui.py:48 +msgid "Suggestions" +msgstr "Sugestões" + +#: ../src\extra\SpellChecker\gui.py:53 +msgid "Ignore" +msgstr "Ignorar" + +#: ../src\extra\SpellChecker\gui.py:55 +msgid "Ignore all" +msgstr "Ignorar todas" + +#: ../src\extra\SpellChecker\gui.py:57 +msgid "Replace" +msgstr "Alterar" + +#: ../src\extra\SpellChecker\gui.py:59 +msgid "Replace all" +msgstr "Alterar todas" + +#: ../src\extra\SpellChecker\gui.py:78 +msgid "Mis-spelled word: %s" +msgstr "Palavra não encontrada: %s" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "Finished" +msgstr "Concluída" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "The spelling review has finished." +msgstr "A revisão ortográfica foi concluída." + +#: ../src\extra\translator\gui.py:24 ../src\gui\dialogs\message.py:177 +#: ../src\gui\dialogs\message.py:264 ../src\gui\dialogs\message.py:350 +msgid "Translate message" +msgstr "Traduzir mensagem" + +#: ../src\extra\translator\gui.py:27 +msgid "Source language" +msgstr "Idioma de origem" + +#: ../src\extra\translator\gui.py:30 +msgid "Target language" +msgstr "Idioma destino" + +#: ../src\extra\translator\translator.py:53 +msgid "Afrikaans" +msgstr "Africâner" + +#: ../src\extra\translator\translator.py:54 +msgid "Albanian" +msgstr "Albanês" + +#: ../src\extra\translator\translator.py:55 +msgid "Amharic" +msgstr "Dari" + +#: ../src\extra\translator\translator.py:56 +msgid "Arabic" +msgstr "Árabe" + +#: ../src\extra\translator\translator.py:57 +msgid "Armenian" +msgstr "Armênio" + +#: ../src\extra\translator\translator.py:58 +msgid "Azerbaijani" +msgstr "Azerbaijano" + +#: ../src\extra\translator\translator.py:59 +msgid "Basque" +msgstr "Basco" + +#: ../src\extra\translator\translator.py:60 +msgid "Belarusian" +msgstr "Bielorrusso" + +#: ../src\extra\translator\translator.py:61 +msgid "Bengali" +msgstr "Bengali" + +#: ../src\extra\translator\translator.py:62 +msgid "Bihari" +msgstr "Bihari" + +#: ../src\extra\translator\translator.py:63 +msgid "Bulgarian" +msgstr "Búlgaro" + +#: ../src\extra\translator\translator.py:64 +msgid "Burmese" +msgstr "Birmanês" + +#: ../src\extra\translator\translator.py:65 +msgid "Catalan" +msgstr "Catalão" + +#: ../src\extra\translator\translator.py:66 +msgid "Cherokee" +msgstr "Cherokee" + +#: ../src\extra\translator\translator.py:67 +msgid "Chinese" +msgstr "Chinês" + +#: ../src\extra\translator\translator.py:68 +msgid "Chinese_simplified" +msgstr "Chinês (Simplificado)" + +#: ../src\extra\translator\translator.py:69 +msgid "Chinese_traditional" +msgstr "Chinês (Tradicional)" + +#: ../src\extra\translator\translator.py:70 +msgid "Croatian" +msgstr "Croata" + +#: ../src\extra\translator\translator.py:71 +msgid "Czech" +msgstr "Tcheco" + +#: ../src\extra\translator\translator.py:72 +msgid "Danish" +msgstr "Dinamarquês" + +#: ../src\extra\translator\translator.py:73 +msgid "Dhivehi" +msgstr "Dhivehi" + +#: ../src\extra\translator\translator.py:74 +msgid "Dutch" +msgstr "Holandês" + +#: ../src\extra\translator\translator.py:75 +msgid "English" +msgstr "Inglês" + +#: ../src\extra\translator\translator.py:76 +msgid "Esperanto" +msgstr "Esperanto" + +#: ../src\extra\translator\translator.py:77 +msgid "Estonian" +msgstr "Estoniano" + +#: ../src\extra\translator\translator.py:78 +msgid "Filipino" +msgstr "Filipino" + +#: ../src\extra\translator\translator.py:79 +msgid "Finnish" +msgstr "Finlandês" + +#: ../src\extra\translator\translator.py:80 +msgid "French" +msgstr "Francês" + +#: ../src\extra\translator\translator.py:81 +msgid "Galician" +msgstr "Galego" + +#: ../src\extra\translator\translator.py:82 +msgid "Georgian" +msgstr "Georgiano" + +#: ../src\extra\translator\translator.py:83 +msgid "German" +msgstr "Alemão" + +#: ../src\extra\translator\translator.py:84 +msgid "Greek" +msgstr "Grego" + +#: ../src\extra\translator\translator.py:85 +msgid "Guarani" +msgstr "Guarani" + +#: ../src\extra\translator\translator.py:86 +msgid "Gujarati" +msgstr "Gujarati" + +#: ../src\extra\translator\translator.py:87 +msgid "Hebrew" +msgstr "Hebraico" + +#: ../src\extra\translator\translator.py:88 +msgid "Hindi" +msgstr "Hindi" + +#: ../src\extra\translator\translator.py:89 +msgid "Hungarian" +msgstr "Húngaro" + +#: ../src\extra\translator\translator.py:90 +msgid "Icelandic" +msgstr "Islandês" + +#: ../src\extra\translator\translator.py:91 +msgid "Indonesian" +msgstr "Indonésio" + +#: ../src\extra\translator\translator.py:92 +msgid "Inuktitut" +msgstr "Inuctitut" + +#: ../src\extra\translator\translator.py:93 +msgid "Irish" +msgstr "Irlandês" + +#: ../src\extra\translator\translator.py:94 +msgid "Italian" +msgstr "Italiano" + +#: ../src\extra\translator\translator.py:95 +msgid "Japanese" +msgstr "Japonês" + +#: ../src\extra\translator\translator.py:96 +msgid "Kannada" +msgstr "Kannada" + +#: ../src\extra\translator\translator.py:97 +msgid "Kazakh" +msgstr "Cazaque" + +#: ../src\extra\translator\translator.py:98 +msgid "Khmer" +msgstr "Khmer" + +#: ../src\extra\translator\translator.py:99 +msgid "Korean" +msgstr "Coreano" + +#: ../src\extra\translator\translator.py:100 +msgid "Kurdish" +msgstr "Curdo" + +#: ../src\extra\translator\translator.py:101 +msgid "Kyrgyz" +msgstr "Quirguistão" + +#: ../src\extra\translator\translator.py:102 +msgid "Laothian" +msgstr "Laotiano" + +#: ../src\extra\translator\translator.py:103 +msgid "Latvian" +msgstr "Letão" + +#: ../src\extra\translator\translator.py:104 +msgid "Lithuanian" +msgstr "Lituano" + +#: ../src\extra\translator\translator.py:105 +msgid "Macedonian" +msgstr "Macedónio" + +#: ../src\extra\translator\translator.py:106 +msgid "Malay" +msgstr "Malaio" + +#: ../src\extra\translator\translator.py:107 +msgid "Malayalam" +msgstr "Malayalam" + +#: ../src\extra\translator\translator.py:108 +msgid "Maltese" +msgstr "Maltês" + +#: ../src\extra\translator\translator.py:109 +msgid "Marathi" +msgstr "Marathi" + +#: ../src\extra\translator\translator.py:110 +msgid "Mongolian" +msgstr "Mongol" + +#: ../src\extra\translator\translator.py:111 +msgid "Nepali" +msgstr "Nepali" + +#: ../src\extra\translator\translator.py:112 +msgid "Norwegian" +msgstr "Norueguês" + +#: ../src\extra\translator\translator.py:113 +msgid "Oriya" +msgstr "Oriá" + +#: ../src\extra\translator\translator.py:114 +msgid "Pashto" +msgstr "Pashto" + +#: ../src\extra\translator\translator.py:115 +msgid "Persian" +msgstr "Persa" + +#: ../src\extra\translator\translator.py:116 +msgid "Polish" +msgstr "Polonês" + +#: ../src\extra\translator\translator.py:117 +msgid "Portuguese" +msgstr "Português" + +#: ../src\extra\translator\translator.py:118 +msgid "Punjabi" +msgstr "Punjabi" + +#: ../src\extra\translator\translator.py:119 +msgid "Romanian" +msgstr "Romeno" + +#: ../src\extra\translator\translator.py:120 +msgid "Russian" +msgstr "Russo" + +#: ../src\extra\translator\translator.py:121 +msgid "Sanskrit" +msgstr "Sânscrito" + +#: ../src\extra\translator\translator.py:122 +msgid "Serbian" +msgstr "Sérvio" + +#: ../src\extra\translator\translator.py:123 +msgid "Sindhi" +msgstr "Sindi" + +#: ../src\extra\translator\translator.py:124 +msgid "Sinhalese" +msgstr "Cingalês" + +#: ../src\extra\translator\translator.py:125 +msgid "Slovak" +msgstr "Eslovaco" + +#: ../src\extra\translator\translator.py:126 +msgid "Slovenian" +msgstr "Esloveno" + +#: ../src\extra\translator\translator.py:127 +msgid "Spanish" +msgstr "Espanhol" + +#: ../src\extra\translator\translator.py:128 +msgid "Swahili" +msgstr "Meio" + +#: ../src\extra\translator\translator.py:129 +msgid "Swedish" +msgstr "Sueco" + +#: ../src\extra\translator\translator.py:130 +msgid "Tajik" +msgstr "Tajik" + +#: ../src\extra\translator\translator.py:131 +msgid "Tamil" +msgstr "Tâmil" + +#: ../src\extra\translator\translator.py:132 +msgid "Tagalog" +msgstr "Tagalog" + +#: ../src\extra\translator\translator.py:133 +msgid "Telugu" +msgstr "Telugu" + +#: ../src\extra\translator\translator.py:134 +msgid "Thai" +msgstr "Thai" + +#: ../src\extra\translator\translator.py:135 +msgid "Tibetan" +msgstr "Tibetano" + +#: ../src\extra\translator\translator.py:136 +msgid "Turkish" +msgstr "Turco" + +#: ../src\extra\translator\translator.py:137 +msgid "Ukrainian" +msgstr "Ucraniano" + +#: ../src\extra\translator\translator.py:138 +msgid "Urdu" +msgstr "Urdu" + +#: ../src\extra\translator\translator.py:139 +msgid "Uzbek" +msgstr "Uzbeque" + +#: ../src\extra\translator\translator.py:140 +msgid "Uighur" +msgstr "Uigur" + +#: ../src\extra\translator\translator.py:141 +msgid "Vietnamese" +msgstr "Vietnamita" + +#: ../src\extra\translator\translator.py:142 +msgid "Welsh" +msgstr "Galês" + +#: ../src\extra\translator\translator.py:143 +msgid "Yiddish" +msgstr "Ídiche" + +#: ../src\extra\translator\translator.py:150 +msgid "autodetect" +msgstr "auto detectar" + +#: ../src\gui\buffers\base.py:54 +msgid "Client" +msgstr "Cliente" + +#: ../src\gui\buffers\base.py:54 +msgid "Text" +msgstr "Texto" + +#: ../src\gui\buffers\base.py:54 ../src\gui\buffers\events.py:57 +msgid "Date" +msgstr "Data" + +#: ../src\gui\buffers\base.py:54 ../src\gui\buffers\people.py:39 +#: ../src\gui\buffers\user_searches.py:31 ../src\gui\dialogs\utils.py:36 +#: ../src\gui\main.py:154 +msgid "User" +msgstr "Usuário" + +#: ../src\gui\buffers\base.py:73 ../src\gui\buffers\base.py:192 +#: ../src\gui\buffers\events.py:58 ../src\gui\buffers\events.py:74 +#: ../src\gui\dialogs\message.py:332 ../src\gui\main.py:79 +#: ../src\gui\main.py:153 ../src\gui\sysTrayIcon.py:34 +msgid "Tweet" +msgstr "Tweet" + +#: ../src\gui\buffers\base.py:75 ../src\gui\buffers\base.py:204 +#: ../src\gui\main.py:83 ../src\keystrokeEditor\constants.py:13 +msgid "Retweet" +msgstr "Retweetar" + +#: ../src\gui\buffers\base.py:77 ../src\gui\main.py:81 +msgid "Reply" +msgstr "Responder" + +#: ../src\gui\buffers\base.py:79 ../src\gui\main.py:110 +msgid "Direct message" +msgstr "Mensagem direta" + +#: ../src\gui\buffers\base.py:92 +msgid "Do you really want to delete this timeline?" +msgstr "Você tem certeza que deseja excluir esta linha do tempo?" + +#: ../src\gui\buffers\base.py:92 ../src\gui\buffers\favourites.py:41 +#: ../src\gui\buffers\lists.py:46 ../src\gui\buffers\trends.py:41 +#: ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Attention" +msgstr "Atenção" + +#: ../src\gui\buffers\base.py:104 +msgid "This buffer is not a timeline; it can't be deleted." +msgstr "Este exibidor não é uma linha do tempo que pode ser excluída." + +#: ../src\gui\buffers\base.py:184 ../src\gui\buffers\dm.py:44 +#: ../src\gui\buffers\people.py:54 +msgid "Direct message to %s" +msgstr "Mensagem Direta para %s" + +#: ../src\gui\buffers\base.py:192 ../src\gui\buffers\events.py:74 +msgid "Write the tweet here" +msgstr "Digite aqui o tweet" + +#: ../src\gui\buffers\base.py:204 +msgid "Would you like to add a comment to this tweet?" +msgstr "Você deseja adicionar um comentário a este tweet?" + +#: ../src\gui\buffers\base.py:207 +msgid "Add your comment to the tweet" +msgstr "Adicione seu comentário ao tweet" + +#: ../src\gui\buffers\base.py:223 ../src\gui\buffers\people.py:62 +msgid "Reply to %s" +msgstr "Resposta para %s" + +#: ../src\gui\buffers\base.py:268 +msgid "Opening URL..." +msgstr "Abrindo URL..." + +#: ../src\gui\buffers\base.py:285 ../src\gui\buffers\events.py:118 +msgid "" +"Do you really want to empty this buffer? It's tweets will be removed from " +"the list but not from Twitter" +msgstr "" +"Você tem certeza que deseja esvaziar este exibidor? Os tweets serão " +"excluídos da lista, mas não do Twitter" + +#: ../src\gui\buffers\base.py:285 ../src\gui\buffers\events.py:118 +msgid "Empty buffer" +msgstr "Exibidor vazio" + +#: ../src\gui\buffers\base.py:290 ../src\gui\buffers\events.py:122 +msgid "Do you really want to delete this message?" +msgstr "Você tem certeza que deseja excluir esta mensagem?" + +#: ../src\gui\buffers\base.py:290 ../src\gui\buffers\events.py:122 +#: ../src\gui\dialogs\lists.py:107 ../src\gui\main.py:91 +#: ../src\gui\main.py:577 +msgid "Delete" +msgstr "Excluir" + +#: ../src\gui\buffers\base.py:310 ../src\gui\buffers\base.py:321 +msgid "Unable to play audio." +msgstr "Não é possível reproduzir o áudio." + +#: ../src\gui\buffers\base.py:312 +msgid "Audio stopped." +msgstr "Áudio parado." + +#: ../src\gui\buffers\events.py:40 +msgid "Empty" +msgstr "Vazío" + +#: ../src\gui\buffers\events.py:57 +msgid "Event" +msgstr "Evento" + +#: ../src\gui\buffers\events.py:60 +msgid "Remove event" +msgstr "Excluir evento" + +#: ../src\gui\buffers\favourites.py:41 +msgid "Do you really want to delete this favourites timeline?" +msgstr "Você tem certeza que deseja excluir esta linha do tempo favoritos?" + +#: ../src\gui\buffers\lists.py:46 ../src\gui\dialogs\lists.py:107 +msgid "Do you really want to delete this list?" +msgstr "Você tem certeza que deseja excluir esta lista?" + +#: ../src\gui\buffers\panels.py:27 +msgid "Announce" +msgstr "" + +#: ../src\gui\buffers\people.py:44 +msgid "Mention" +msgstr "Menção" + +#: ../src\gui\buffers\trends.py:41 ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Do you really want to delete this search term?" +msgstr "Você tem certeza que deseja apagar este termo de busca?" + +#: ../src\gui\dialogs\configuration.py:39 +msgid "Language" +msgstr "Idioma" + +#: ../src\gui\dialogs\configuration.py:53 +msgid "Relative times" +msgstr "Tempos relativos" + +#: ../src\gui\dialogs\configuration.py:57 +msgid "Activate Sapi5 when any other screen reader is not being run" +msgstr "Ativar SAPI5 quando nenhum leitor de tela estiver sendo executado" + +#: ../src\gui\dialogs\configuration.py:60 +msgid "Activate the auto-start of the invisible interface" +msgstr "Ativar ocultar janela ao iniciar" + +#: ../src\gui\dialogs\configuration.py:64 +msgid "" +"API calls when the stream is started (One API call equals to 200 tweetts, " +"two API calls equals 400 tweets, etc):" +msgstr "" +"Número de chamada API quando a sincronização é iniciada (uma chamada API " +"equivale a 200 tweets, duas chamadas API equivale a 400 tweets, etc.):" + +#: ../src\gui\dialogs\configuration.py:72 +msgid "Items on each API call" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:79 +msgid "" +"Inverted buffers: The newest tweets will be shown at the beginning of the " +"lists while the oldest at the end" +msgstr "" +"Inverter exibidores: Os tweets mais novos serão mostrados no início das " +"listas, enquanto os mais velhos no final" + +#: ../src\gui\dialogs\configuration.py:94 +msgid "Show followers" +msgstr "Mostrar seguidores" + +#: ../src\gui\dialogs\configuration.py:97 +msgid "Show friends" +msgstr "Mostrar seguindo" + +#: ../src\gui\dialogs\configuration.py:100 +msgid "Show favourites" +msgstr "Mostrar favoritos" + +#: ../src\gui\dialogs\configuration.py:103 +msgid "Show blocked users" +msgstr "Mostrar usuários bloqueados" + +#: ../src\gui\dialogs\configuration.py:106 +msgid "Show muted users" +msgstr "Mostrar usuários silenciados" + +#: ../src\gui\dialogs\configuration.py:109 +msgid "Show events" +msgstr "Mostrar eventos" + +#: ../src\gui\dialogs\configuration.py:119 +#: ../src\gui\dialogs\configuration.py:267 +msgid "Ignored clients" +msgstr "Clientes ignorados" + +#: ../src\gui\dialogs\configuration.py:125 +msgid "Add client" +msgstr "Adicionar cliente" + +#: ../src\gui\dialogs\configuration.py:126 +msgid "Remove client" +msgstr "Excluir cliente" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Add a new ignored client" +msgstr "Adicionar um novo cliente ignorado" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Enter the name of the client here" +msgstr "Insira o nome do cliente aqui" + +#: ../src\gui\dialogs\configuration.py:154 +msgid "Volume" +msgstr "Volume" + +#: ../src\gui\dialogs\configuration.py:163 +msgid "Global mute" +msgstr "Mudo global" + +#: ../src\gui\dialogs\configuration.py:167 +msgid "Output device" +msgstr "Dispositivo de saída" + +#: ../src\gui\dialogs\configuration.py:176 +msgid "Input device" +msgstr "Dispositivo de entrada" + +#: ../src\gui\dialogs\configuration.py:184 +msgid "" +"If you've got a SndUp account, enter your API Key here. Whether the API Key " +"is wrong, the App will fail to upload anything to the server. Whether " +"there's no API Key here, then the audio files will be uploaded anonimously" +msgstr "" +"Se você tem uma conta SndUp, digite a sua chave API aqui. Se a chave API " +"estiver errada, o aplicativo vai deixar de enviar arquivo para o servidor. " +"Se não há nenhuma chave API aqui, então os arquivos de áudio são enviados " +"anonimamente" + +#: ../src\gui\dialogs\configuration.py:197 +msgid "Sound pack" +msgstr "Pacote de som" + +#: ../src\gui\dialogs\configuration.py:213 +#: ../src\gui\dialogs\configuration.py:237 +msgid "Unlink your Dropbox account" +msgstr "Desvincular sua conta Dropbox" + +#: ../src\gui\dialogs\configuration.py:215 +#: ../src\gui\dialogs\configuration.py:232 +#: ../src\gui\dialogs\configuration.py:240 +#: ../src\gui\dialogs\configuration.py:244 +#: ../src\gui\dialogs\configuration.py:251 +msgid "Link your Dropbox account" +msgstr "Vincular sua conta do Dropbox" + +#: ../src\gui\dialogs\configuration.py:225 +msgid "" +"The authorisation request will be shown on your browser. Copy the code tat " +"Dropbox will provide and, in the text box that will appear on TW Blue, paste " +"it. This code is necessary to continue. You only need to do it once." +msgstr "" +"O pedido de autorização será mostrado em seu navegador. Copie o código que o " +"Dropbox irá fornecer e cole na caixa de texto que aparecerá no TW Blue. Este " +"código é necessário para continuar. Você só precisa fazer isso uma vez." + +#: ../src\gui\dialogs\configuration.py:225 ../src\sessionmanager\gui.py:83 +msgid "Authorisation" +msgstr "Autorização" + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Enter the code here." +msgstr "Insira o código aqui." + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Verification code" +msgstr "Código de verificação" + +#: ../src\gui\dialogs\configuration.py:239 +#, fuzzy +msgid "Error during authorisation. Try again later." +msgstr "Erro de conexão. Tente novamente mais tarde." + +#: ../src\gui\dialogs\configuration.py:239 ../src\gui\main.py:718 +#: ../src\gui\main.py:749 +msgid "Error!" +msgstr "Erro!" + +#: ../src\gui\dialogs\configuration.py:258 +msgid "TW Blue preferences" +msgstr "Preferências do TW Blue" + +#: ../src\gui\dialogs\configuration.py:262 ../src\issueReporter\gui.py:30 +msgid "General" +msgstr "Geral" + +#: ../src\gui\dialogs\configuration.py:265 +msgid "Show other buffers" +msgstr "Outros exibidores" + +#: ../src\gui\dialogs\configuration.py:269 +msgid "Sound" +msgstr "Som" + +#: ../src\gui\dialogs\configuration.py:271 +msgid "Audio Services" +msgstr "Serviços de áudio" + +#: ../src\gui\dialogs\configuration.py:274 +msgid "Save" +msgstr "Salvar" + +#: ../src\gui\dialogs\configuration.py:277 ../src\gui\dialogs\follow.py:64 +#: ../src\gui\dialogs\message.py:182 ../src\gui\dialogs\message.py:269 +#: ../src\gui\dialogs\message.py:352 ../src\gui\dialogs\search.py:42 +#: ../src\gui\dialogs\show_user.py:42 ../src\gui\dialogs\update_profile.py:56 +#: ../src\gui\dialogs\utils.py:42 ../src\keystrokeEditor\gui.py:26 +msgid "Close" +msgstr "Fechar" + +#: ../src\gui\dialogs\configuration.py:290 ../src\gui\main.py:272 +msgid "Followers" +msgstr "Seguidores" + +#: ../src\gui\dialogs\configuration.py:304 +msgid "friends" +msgstr "Seguindo" + +#: ../src\gui\dialogs\configuration.py:318 +msgid "Favorites" +msgstr "Favoritos" + +#: ../src\gui\dialogs\configuration.py:332 ../src\gui\main.py:290 +msgid "Events" +msgstr "Eventos" + +#: ../src\gui\dialogs\configuration.py:343 ../src\gui\main.py:282 +msgid "Blocked users" +msgstr "Usuários bloqueados" + +#: ../src\gui\dialogs\configuration.py:357 ../src\gui\main.py:286 +msgid "Muted users" +msgstr "Usuários silenciados" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "Restart TW Blue" +msgstr "Reiniciar TW Blue" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "" +"The application requires to be restarted to save these changes. Press OK to " +"do it now." +msgstr "" +"O aplicativo precisa ser reiniciado para salvar essas alterações. Pressione " +"OK para fazer isso agora." + +#: ../src\gui\dialogs\follow.py:33 ../src\gui\dialogs\follow.py:43 +#: ../src\keystrokeEditor\gui.py:17 +msgid "Action" +msgstr "Ação" + +#: ../src\gui\dialogs\follow.py:44 ../src\gui\main.py:96 +msgid "Follow" +msgstr "Seguir" + +#: ../src\gui\dialogs\follow.py:45 ../src\gui\main.py:98 +msgid "Unfollow" +msgstr "Deixar de seguir" + +#: ../src\gui\dialogs\follow.py:46 ../src\gui\main.py:100 +#: ../src\gui\main.py:127 +msgid "Mute" +msgstr "Silenciar" + +#: ../src\gui\dialogs\follow.py:47 ../src\gui\main.py:102 +msgid "Unmute" +msgstr "Desativar silêncio" + +#: ../src\gui\dialogs\follow.py:48 ../src\gui\main.py:106 +msgid "Block" +msgstr "Bloquear" + +#: ../src\gui\dialogs\follow.py:49 ../src\gui\main.py:108 +msgid "Unblock" +msgstr "Desbloquear" + +#: ../src\gui\dialogs\follow.py:50 ../src\gui\main.py:104 +msgid "Report as spam" +msgstr "Reportar como spam" + +#: ../src\gui\dialogs\follow.py:61 ../src\gui\dialogs\search.py:40 +#: ../src\gui\dialogs\utils.py:39 ../src\keystrokeEditor\gui.py:76 +msgid "OK" +msgstr "OK" + +#: ../src\gui\dialogs\follow.py:101 +msgid "You've muted to %s" +msgstr "Você silenciou %s" + +#: ../src\gui\dialogs\follow.py:115 +msgid "You've unmuted to %s" +msgstr "Você desativou silêncio para %s" + +#: ../src\gui\dialogs\lists.py:36 ../src\gui\main.py:66 +msgid "Lists manager" +msgstr "Gerenciar listas" + +#: ../src\gui\dialogs\lists.py:38 ../src\gui\main.py:309 +msgid "Lists" +msgstr "Listas" + +#: ../src\gui\dialogs\lists.py:39 +msgid "List" +msgstr "Lista" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Members" +msgstr "Membros" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Owner" +msgstr "Proprietário" + +#: ../src\gui\dialogs\lists.py:39 +msgid "mode" +msgstr "Modo" + +#: ../src\gui\dialogs\lists.py:39 ../src\gui\dialogs\lists.py:181 +msgid "Description" +msgstr "Descrição" + +#: ../src\gui\dialogs\lists.py:44 ../src\gui\dialogs\lists.py:173 +msgid "Create a new list" +msgstr "Criar uma nova lista" + +#: ../src\gui\dialogs\lists.py:46 ../src\keystrokeEditor\gui.py:22 +msgid "Edit" +msgstr "Editar" + +#: ../src\gui\dialogs\lists.py:48 ../src\gui\dialogs\lists.py:235 +msgid "Remove" +msgstr "Excluir" + +#: ../src\gui\dialogs\lists.py:50 +msgid "Open in buffer" +msgstr "Abrir no exibidor" + +#: ../src\gui\dialogs\lists.py:125 +msgid "List opened" +msgstr "Lista aberta" + +#: ../src\gui\dialogs\lists.py:127 +msgid "This list is arready opened." +msgstr "Esta lista já está aberta." + +#: ../src\gui\dialogs\lists.py:130 ../src\gui\main.py:312 +msgid "List for %s" +msgstr "Lista de %s" + +#: ../src\gui\dialogs\lists.py:148 +msgid "Viewing lists for %s" +msgstr "Visualizando listas de %s" + +#: ../src\gui\dialogs\lists.py:149 +msgid "Subscribe" +msgstr "Inscrever-se" + +#: ../src\gui\dialogs\lists.py:150 +msgid "Unsubscribe" +msgstr "Desinscrever-se" + +#: ../src\gui\dialogs\lists.py:176 +msgid "Name (20 characters maximun)" +msgstr "Nome (20 caracteres no máximo)" + +#: ../src\gui\dialogs\lists.py:186 +msgid "Mode" +msgstr "Modo" + +#: ../src\gui\dialogs\lists.py:187 +msgid "Public" +msgstr "Público" + +#: ../src\gui\dialogs\lists.py:188 +msgid "Private" +msgstr "Privado" + +#: ../src\gui\dialogs\lists.py:208 +msgid "Editing the list %s" +msgstr "Editando a lista %s" + +#: ../src\gui\dialogs\lists.py:219 +msgid "Select a list to add the user" +msgstr "Selecione uma lista para adicionar o usuário" + +#: ../src\gui\dialogs\lists.py:220 +msgid "Add" +msgstr "Adicionar" + +#: ../src\gui\dialogs\lists.py:234 +msgid "Select a list to remove the user" +msgstr "Selecione uma lista para excluir o usuário" + +#: ../src\gui\dialogs\message.py:42 ../src\keystrokeEditor\constants.py:11 +msgid "New tweet" +msgstr "Novo Tweet" + +#: ../src\gui\dialogs\message.py:76 +msgid "Attaching..." +msgstr "Anexando..." + +#: ../src\gui\dialogs\message.py:77 +msgid "Uploading..." +msgstr "Enviando..." + +#: ../src\gui\dialogs\message.py:96 +msgid "Unable to upload the audio" +msgstr "Não é possível fazer upload do áudio" + +#: ../src\gui\dialogs\message.py:110 ../src\gui\dialogs\message.py:395 +msgid "Translated" +msgstr "Traduzido" + +#: ../src\gui\dialogs\message.py:122 +msgid "There's no URL to be shortened" +msgstr "Não há URL para ser encurtada" + +#: ../src\gui\dialogs\message.py:125 +msgid "URL shortened" +msgstr "URL encurtada" + +#: ../src\gui\dialogs\message.py:133 ../src\gui\dialogs\message.py:407 +msgid "There's no URL to be expanded" +msgstr "Não há URL para ser desencurtada" + +#: ../src\gui\dialogs\message.py:136 ../src\gui\dialogs\message.py:410 +msgid "URL expanded" +msgstr "URL desencurtada" + +#: ../src\gui\dialogs\message.py:164 ../src\gui\dialogs\message.py:219 +#: ../src\gui\dialogs\update_profile.py:51 +#: ../src\gui\dialogs\update_profile.py:88 +msgid "Upload a picture" +msgstr "Anexar imagem" + +#: ../src\gui\dialogs\message.py:167 ../src\gui\dialogs\message.py:254 +#: ../src\gui\dialogs\message.py:345 +msgid "Spelling correction" +msgstr "Correção ortográfica" + +#: ../src\gui\dialogs\message.py:171 ../src\gui\dialogs\message.py:258 +msgid "Shorten URL" +msgstr "Encurtar URL" + +#: ../src\gui\dialogs\message.py:173 ../src\gui\dialogs\message.py:260 +#: ../src\gui\dialogs\message.py:347 +msgid "Expand URL" +msgstr "Desencurtar URL" + +#: ../src\gui\dialogs\message.py:179 ../src\gui\dialogs\message.py:266 +msgid "Send" +msgstr "Enviar" + +#: ../src\gui\dialogs\message.py:215 ../src\gui\dialogs\message.py:226 +#: ../src\gui\dialogs\update_profile.py:84 +#: ../src\gui\dialogs\update_profile.py:95 +msgid "Discard image" +msgstr "Descartar imagem" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" +msgstr "Arquivos de imagem (*.png, *.jpg, *.gif)|*png; *.jpg; *.gif" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Select the picture to be uploaded" +msgstr "Selecione a imagem a ser anexada" + +#: ../src\gui\dialogs\message.py:248 +msgid "Recipient" +msgstr "Destinatário" + +#: ../src\gui\dialogs\message.py:303 +msgid "Mention to all" +msgstr "Mencionar todos" + +#: ../src\gui\dialogs\message.py:330 +msgid "Tweet - %i characters " +msgstr "Tweet - %i caracteres" + +#: ../src\gui\dialogs\search.py:26 +msgid "Search on Twitter" +msgstr "Pesquisa no Twitter" + +#: ../src\gui\dialogs\search.py:27 ../src\gui\main.py:64 +msgid "Search" +msgstr "Pesquisar" + +#: ../src\gui\dialogs\search.py:34 +msgid "Tweets" +msgstr "Tweets" + +#: ../src\gui\dialogs\search.py:35 +msgid "Users" +msgstr "Usuários" + +#: ../src\gui\dialogs\show_user.py:26 +msgid "Information for %s" +msgstr "Informações de %s" + +#: ../src\gui\dialogs\show_user.py:30 +msgid "Details" +msgstr "Detalhes" + +#: ../src\gui\dialogs\show_user.py:39 +msgid "Go to URL" +msgstr "Ir para URL" + +#: ../src\gui\dialogs\show_user.py:63 +msgid "This user does not exist on Twitter" +msgstr "Este usuário não existe no Twitter" + +#: ../src\gui\dialogs\show_user.py:68 +msgid "Username: @%s\n" +msgstr "Nome de usuário: @%s\n" + +#: ../src\gui\dialogs\show_user.py:69 +msgid "Name: %s\n" +msgstr "Nome: %s\n" + +#: ../src\gui\dialogs\show_user.py:71 +msgid "Location: %s\n" +msgstr "Localização: %s\n" + +#: ../src\gui\dialogs\show_user.py:73 +msgid "URL: %s\n" +msgstr "Website: %s\n" + +#: ../src\gui\dialogs\show_user.py:76 +msgid "Bio: %s\n" +msgstr "Descrição: %s\n" + +#: ../src\gui\dialogs\show_user.py:77 +msgid "Yes" +msgstr "Sim" + +#: ../src\gui\dialogs\show_user.py:78 +msgid "No" +msgstr "Não" + +#: ../src\gui\dialogs\show_user.py:79 +msgid "Protected: %s\n" +msgstr "Protegido: %s\n" + +#: ../src\gui\dialogs\show_user.py:80 +msgid "" +"Followers: %s\n" +" Friends: %s\n" +msgstr "" +"Seguidores: %s\n" +" Seguindo: %s\n" + +#: ../src\gui\dialogs\show_user.py:81 +msgid "Tweets: %s\n" +msgstr "Tweets: %s\n" + +#: ../src\gui\dialogs\show_user.py:82 +msgid "Favourites: %s" +msgstr "Favoritos: %s" + +#: ../src\gui\dialogs\update_profile.py:27 +msgid "Update your profile" +msgstr "Atualize seu perfil" + +#: ../src\gui\dialogs\update_profile.py:29 +msgid "Name (20 characters maximum)" +msgstr "Nome (20 caracteres no máximo)" + +#: ../src\gui\dialogs\update_profile.py:35 +msgid "Location" +msgstr "Localização" + +#: ../src\gui\dialogs\update_profile.py:40 +msgid "Website" +msgstr "Website" + +#: ../src\gui\dialogs\update_profile.py:45 +msgid "Bio (160 characters maximum)" +msgstr "Descrição (160 caracteres no máximo)" + +#: ../src\gui\dialogs\update_profile.py:53 ../src\gui\main.py:60 +#: ../src\gui\sysTrayIcon.py:38 +msgid "Update profile" +msgstr "Atualizar perfil" + +#: ../src\gui\dialogs\urlList.py:26 +#, fuzzy +msgid "Select an URL" +msgstr "Selecione uma URL" + +#: ../src\gui\main.py:62 +msgid "Hide window" +msgstr "Ocultar janela" + +#: ../src\gui\main.py:70 +msgid "Edit keystrokes" +msgstr "Editar teclas de atalho" + +#: ../src\gui\main.py:72 ../src\gui\sysTrayIcon.py:36 +msgid "Preferences" +msgstr "Preferências" + +#: ../src\gui\main.py:74 ../src\gui\main.py:597 ../src\gui\sysTrayIcon.py:46 +msgid "Exit" +msgstr "Sair" + +#: ../src\gui\main.py:85 +msgid "Add to favourites" +msgstr "Adicionar aos favoritos" + +#: ../src\gui\main.py:87 ../src\keystrokeEditor\constants.py:16 +msgid "Remove from favourites" +msgstr "Excluir dos favoritos" + +#: ../src\gui\main.py:89 ../src\keystrokeEditor\constants.py:19 +msgid "Show tweet" +msgstr "Revisar" + +#: ../src\gui\main.py:112 ../src\keystrokeEditor\constants.py:36 +msgid "Add to list" +msgstr "Adicionar à lista" + +#: ../src\gui\main.py:114 ../src\keystrokeEditor\constants.py:37 +msgid "Remove from list" +msgstr "Excluir da lista" + +#: ../src\gui\main.py:116 +msgid "View lists" +msgstr "Ver listas" + +#: ../src\gui\main.py:118 +msgid "Show user profile" +msgstr "Ver perfil" + +#: ../src\gui\main.py:120 +msgid "Timeline" +msgstr "Linha do tempo" + +#: ../src\gui\main.py:122 +msgid "View favourites" +msgstr "Ver favoritos" + +#: ../src\gui\main.py:129 +msgid "Autoread tweets for this buffer" +msgstr "Leitura automática para tweets deste exibidor" + +#: ../src\gui\main.py:131 +msgid "Clear buffer" +msgstr "Esvaziar" + +#: ../src\gui\main.py:133 ../src\keystrokeEditor\constants.py:22 +msgid "Remove buffer" +msgstr "Excluir" + +#: ../src\gui\main.py:138 ../src\gui\sysTrayIcon.py:42 +msgid "Documentation" +msgstr "Documentação" + +#: ../src\gui\main.py:140 +msgid "What's new in this version?" +msgstr "O que há de novo nesta versão?" + +#: ../src\gui\main.py:142 ../src\gui\sysTrayIcon.py:44 +msgid "Check for updates" +msgstr "Verificar atualizações" + +#: ../src\gui\main.py:144 ../src\issueReporter\gui.py:34 +msgid "Report an error" +msgstr "Relatar um erro" + +#: ../src\gui\main.py:146 +msgid "TW Blue website" +msgstr "Web Site do TW Blue" + +#: ../src\gui\main.py:148 +msgid "About TW Blue" +msgstr "Sobre TW Blue" + +#: ../src\gui\main.py:152 +msgid "Application" +msgstr "Aplicação" + +#: ../src\gui\main.py:155 +msgid "Buffer" +msgstr "Exibidor" + +#: ../src\gui\main.py:156 +msgid "Help" +msgstr "Ajuda" + +#: ../src\gui\main.py:249 +msgid "Home" +msgstr "Principal" + +#: ../src\gui\main.py:254 +msgid "Mentions" +msgstr "Menções" + +#: ../src\gui\main.py:257 +msgid "Direct messages" +msgstr "Mensagens Diretas" + +#: ../src\gui\main.py:260 +msgid "Sent" +msgstr "Enviados" + +#: ../src\gui\main.py:266 +msgid "Favourites" +msgstr "Favoritos" + +#: ../src\gui\main.py:278 +msgid "Friends" +msgstr "Seguindo" + +#: ../src\gui\main.py:293 +#, fuzzy +msgid "Searches" +msgstr "Pesquisar" + +#: ../src\gui\main.py:303 +#, fuzzy +msgid "Timelines" +msgstr "Linha do tempo" + +#: ../src\gui\main.py:306 ../src\gui\main.py:714 +msgid "Timeline for %s" +msgstr "Linha do tempo de %s" + +#: ../src\gui\main.py:317 +#, fuzzy +msgid "Favourites timelines" +msgstr "Favoritos: %s" + +#: ../src\gui\main.py:320 ../src\gui\main.py:745 +msgid "Favourites for %s" +msgstr "Favoritos de %s" + +#: ../src\gui\main.py:361 +msgid "Ready" +msgstr "Pronto" + +#: ../src\gui\main.py:388 +msgid "%s favourites from %s" +msgstr "%s favoritos de %s" + +#: ../src\gui\main.py:435 +msgid "Streams disconnected. TW Blue will try to reconnect in a minute." +msgstr "Sincronização parada. TW Blue tentará reiniciar em um minuto." + +#: ../src\gui\main.py:439 +msgid "Reconnecting streams..." +msgstr "Reiniciando sincronização..." + +#: ../src\gui\main.py:463 +msgid "search for %s" +msgstr "Pesquisar por %s" + +#: ../src\gui\main.py:468 +msgid "search users for %s" +msgstr "Pesquisa de usuários para %s" + +#: ../src\gui\main.py:479 ../src\gui\main.py:490 ../src\gui\main.py:509 +msgid "Select the user" +msgstr "Selecione o usuário" + +#: ../src\gui\main.py:569 +msgid "User details" +msgstr "Detalhes do usuário" + +#: ../src\gui\main.py:577 +msgid "" +"Do you really want to delete this message? It will be eliminated from " +"Twitter as well." +msgstr "" +"Você tem certeza que deseja excluir esta mensagem? Ela será excluída do " +"Twitter também." + +#: ../src\gui\main.py:597 +msgid "Do you really want to close TW Blue?" +msgstr "Você tem certeza que deseja fechar o TW Blue?" + +#: ../src\gui\main.py:687 +msgid "Error while adding to favourites." +msgstr "Erro ao adicionar a favoritos." + +#: ../src\gui\main.py:695 +msgid "Error while removing from favourites." +msgstr "Erro ao excluir dos favoritos." + +#: ../src\gui\main.py:699 +msgid "Individual timeline" +msgstr "Linha do tempo individual" + +#: ../src\gui\main.py:703 ../src\gui\main.py:734 +msgid "The user does not exist" +msgstr "O usuário não existe" + +#: ../src\gui\main.py:709 +msgid "Existing timeline" +msgstr "Linha do tempo existente" + +#: ../src\gui\main.py:709 +msgid "" +"There's currently a timeline for this user. You are not able to open another" +msgstr "" +"Há atualmente uma linha do tempo para este usuário. Não é possível abrir " +"outra" + +#: ../src\gui\main.py:718 +msgid "This user has no tweets. You can't open a timeline for this user" +msgstr "" +"Este usuário não tem tweets. Você não pode abrir uma linha do tempo para ele" + +#: ../src\gui\main.py:730 +msgid "List of favourites" +msgstr "Lista de favoritos" + +#: ../src\gui\main.py:740 +msgid "Existing list" +msgstr "Lista existente" + +#: ../src\gui\main.py:740 +msgid "" +"There's already a list of favourites for this user. You can't create another." +msgstr "" +"Já existe uma lista de favoritos para este usuário. Você não pode criar " +"outra." + +#: ../src\gui\main.py:749 +msgid "" +"This user has no favourites. You can't create a list of favourites for this " +"user." +msgstr "" +"Este usuário não tem favoritos. Você não pode criar uma lista de favoritos " +"para ele." + +#: ../src\gui\main.py:791 ../src\gui\main.py:804 +msgid "%s, %s of %s" +msgstr "%s, %s de %s" + +#: ../src\gui\main.py:793 ../src\gui\main.py:806 +msgid "%s. Empty" +msgstr "%s. Vazío" + +#: ../src\gui\main.py:829 +msgid "Global mute on" +msgstr "Mudo global ativado" + +#: ../src\gui\main.py:832 +msgid "Global mute off" +msgstr "Mudo global desativado" + +#: ../src\gui\main.py:838 +msgid "Buffer mute on" +msgstr "Mudo ativado no exibidor" + +#: ../src\gui\main.py:841 +msgid "Buffer mute off" +msgstr "Mudo desativado no exibidor" + +#: ../src\gui\main.py:847 +msgid "The auto-reading of new tweets is enabled for this buffer" +msgstr "A auto-leitura de novos tweets está ativada para este exibidor" + +#: ../src\gui\main.py:850 +msgid "The auto-reading of new tweets is disabled for this buffer" +msgstr "A auto-leitura de novos tweets está desativada para este exibidor" + +#: ../src\gui\main.py:857 +msgid "Copied" +msgstr "Copiado" + +#: ../src\gui\main.py:868 ../src\gui\main.py:877 +msgid "%s" +msgstr "%s" + +#: ../src\gui\sysTrayIcon.py:40 +msgid "Show / hide" +msgstr "Exibir / ocultar" + +#: ../src\issueReporter\gui.py:31 +msgid "always" +msgstr "" + +#: ../src\issueReporter\gui.py:31 +msgid "have not tried" +msgstr "" + +#: ../src\issueReporter\gui.py:31 +msgid "random" +msgstr "" + +#: ../src\issueReporter\gui.py:31 +msgid "sometimes" +msgstr "" + +#: ../src\issueReporter\gui.py:31 +#, fuzzy +msgid "unable to duplicate" +msgstr "Não é possível fazer upload do áudio" + +#: ../src\issueReporter\gui.py:32 +#, fuzzy +msgid "block" +msgstr "Desbloquear" + +#: ../src\issueReporter\gui.py:32 +msgid "crash" +msgstr "" + +#: ../src\issueReporter\gui.py:32 +msgid "feature" +msgstr "" + +#: ../src\issueReporter\gui.py:32 +msgid "major" +msgstr "" + +#: ../src\issueReporter\gui.py:32 +msgid "minor" +msgstr "" + +#: ../src\issueReporter\gui.py:32 +#, fuzzy +msgid "text" +msgstr "Contexto" + +#: ../src\issueReporter\gui.py:32 +msgid "trivial" +msgstr "" + +#: ../src\issueReporter\gui.py:32 +msgid "tweak" +msgstr "" + +#: ../src\issueReporter\gui.py:37 +#, fuzzy +msgid "Select a category" +msgstr "Selecione o usuário" + +#: ../src\issueReporter\gui.py:46 +msgid "" +"Briefly describe what happened. You will be able to thoroughly explain it " +"later" +msgstr "" +"Faça uma breve descrição do que aconteceu. Você poderá explicá-lo " +"completamente depois" + +#: ../src\issueReporter\gui.py:56 +msgid "Here, you can describe the bug in detail" +msgstr "Aqui, você pode descrever o erro em detalhes" + +#: ../src\issueReporter\gui.py:66 +msgid "how often does this bug happen?" +msgstr "" + +#: ../src\issueReporter\gui.py:74 +msgid "Select the importance that you think this bug has" +msgstr "" + +#: ../src\issueReporter\gui.py:82 +msgid "" +"I know that the TW Blue bug system will get my Twitter username to contact " +"me and fix the bug quickly" +msgstr "" + +#: ../src\issueReporter\gui.py:85 +msgid "Send report" +msgstr "Enviar relatório" + +#: ../src\issueReporter\gui.py:98 +msgid "You must fill out both fields" +msgstr "Você deve preencher os dois campos" + +#: ../src\issueReporter\gui.py:101 +msgid "" +"You need to mark the checkbox to provide us your twitter username to contact " +"to you if is necessary." +msgstr "" + +#: ../src\issueReporter\gui.py:120 +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 "" +"Obrigado por relatar este erro! Em futuras versões poderá encontrá-lo na " +"lista de mudanças. Você relatou o erro %i" + +#: ../src\issueReporter\gui.py:120 +msgid "reported" +msgstr "Relatado" + +#: ../src\issueReporter\gui.py:123 +msgid "Error while reporting" +msgstr "Erro ao enviar relatório" + +#: ../src\issueReporter\gui.py:123 +msgid "" +"Something unexpected occurred while trying to report the bug. Please, try " +"again later" +msgstr "" +"Algo inesperado ocorreu ao tentar relatar o erro. Por favor, tente novamente " +"mais tarde" + +#: ../src\keystrokeEditor\constants.py:4 +msgid "Go up up on the current list" +msgstr "Sobe-se na lista atual" + +#: ../src\keystrokeEditor\constants.py:5 +msgid "Go down up on the current list" +msgstr "Desce-se na lista atual" + +#: ../src\keystrokeEditor\constants.py:6 +msgid "Go to the previous tab" +msgstr "Vá para a guia anterior" + +#: ../src\keystrokeEditor\constants.py:7 +msgid "Go to the next tab" +msgstr "Vá para a próxima guia" + +#: ../src\keystrokeEditor\constants.py:8 +msgid "Move up one tweet in the conversation" +msgstr "Mover para cima um tweet na conversa" + +#: ../src\keystrokeEditor\constants.py:9 +msgid "Move down one tweet in the conversation" +msgstr "Mover para baixo um tweet na conversa" + +#: ../src\keystrokeEditor\constants.py:10 +msgid "Show the graphical interface" +msgstr "Mostrar a interface gráfica" + +#: ../src\keystrokeEditor\constants.py:12 +msgid "Reply to a tweet" +msgstr "Responder a um tweet" + +#: ../src\keystrokeEditor\constants.py:14 +msgid "Send direct message" +msgstr "Enviar mensagem direta" + +#: ../src\keystrokeEditor\constants.py:15 +msgid "Mark as favourite" +msgstr "Marcar como favorito" + +#: ../src\keystrokeEditor\constants.py:17 +msgid "Open the actions dialogue" +msgstr "Abrir o diálogo ações" + +#: ../src\keystrokeEditor\constants.py:18 +msgid "See user details" +msgstr "Ver detalhes do usuário" + +#: ../src\keystrokeEditor\constants.py:20 +msgid "Quit" +msgstr "Sair" + +#: ../src\keystrokeEditor\constants.py:21 +msgid "Open user timeline" +msgstr "Abrir linha do tempo do usuário" + +#: ../src\keystrokeEditor\constants.py:23 +msgid "" +"Open URL on the current tweet, or further information for a friend or " +"follower" +msgstr "" +"Abrir URL do tweet atual, ou mais informações para um seguido ou seguidor" + +#: ../src\keystrokeEditor\constants.py:24 +msgid "Attempt to play audio" +msgstr "Tentar reproduzir um áudio" + +#: ../src\keystrokeEditor\constants.py:25 +msgid "Increase volume by 5%" +msgstr "Aumentar o volume em 5%" + +#: ../src\keystrokeEditor\constants.py:26 +msgid "Decrease volume by 5%" +msgstr "Diminuir o volume em 5%" + +#: ../src\keystrokeEditor\constants.py:27 +msgid "Go to the first element on the list" +msgstr "Ir para o primeiro elemento da lista" + +#: ../src\keystrokeEditor\constants.py:28 +msgid "Go to the last element on the list" +msgstr "Ir para o último elemento da lista" + +#: ../src\keystrokeEditor\constants.py:29 +msgid "Move 20 elements up on the current list" +msgstr "Move 20 elementos para cima na lista atual" + +#: ../src\keystrokeEditor\constants.py:30 +msgid "Move 20 elements down on the current list" +msgstr "Move 20 elementos para baixo na lista atual" + +#: ../src\keystrokeEditor\constants.py:31 +msgid "Edit profile" +msgstr "Editar o perfil" + +#: ../src\keystrokeEditor\constants.py:32 +msgid "Remove a tweet or direct message" +msgstr "Remover um tweet ou mensagem direta" + +#: ../src\keystrokeEditor\constants.py:33 +msgid "Empty the buffer removing all the elements" +msgstr "Esvaziar o exibidor excluindo todos os elementos" + +#: ../src\keystrokeEditor\constants.py:34 +msgid "Listen the current message" +msgstr "Ouvir a mensagem atual" + +#: ../src\keystrokeEditor\constants.py:35 +msgid "Copy to clipboard" +msgstr "Copiar para a área de transferência" + +#: ../src\keystrokeEditor\constants.py:38 +msgid "Mutes/unmutes the active buffer" +msgstr "Silenciar / desativar silêncio no exibidor ativo" + +#: ../src\keystrokeEditor\constants.py:39 +msgid "Globally mute/unmute TW Blue" +msgstr "Silenciar tudo / desativar silêncio no TW Blue" + +#: ../src\keystrokeEditor\constants.py:40 +msgid "toggles the automatic reading of incoming tweets in the active buffer" +msgstr "Alternar a leitura automática de tweets recebidos no exibidor ativo" + +#: ../src\keystrokeEditor\constants.py:41 +msgid "Search on twitter" +msgstr "Pesquisar no Twitter" + +#: ../src\keystrokeEditor\constants.py:42 +msgid "Shows the keystroke editor" +msgstr "Abrir editor de teclas de atalho" + +#: ../src\keystrokeEditor\constants.py:43 +msgid "Show lists for a specified user" +msgstr "Mostrar listas de um usuário específico" + +#: ../src\keystrokeEditor\gui.py:10 +msgid "Keystroke editor" +msgstr "Editor de teclas de atalho" + +#: ../src\keystrokeEditor\gui.py:16 +msgid "Select a keystroke to edit" +msgstr "Selecione uma combinação de teclas para editar" + +#: ../src\keystrokeEditor\gui.py:17 +msgid "Keystroke" +msgstr "Teclas de atalho" + +#: ../src\keystrokeEditor\gui.py:54 +msgid "Editing keystroke" +msgstr "Editando teclas de atalho" + +#: ../src\keystrokeEditor\gui.py:61 +msgid "Control" +msgstr "Control" + +#: ../src\keystrokeEditor\gui.py:62 +msgid "Alt" +msgstr "Alt" + +#: ../src\keystrokeEditor\gui.py:63 +msgid "Shift" +msgstr "Shift" + +#: ../src\keystrokeEditor\gui.py:64 +msgid "Windows" +msgstr "Windows" + +#: ../src\keystrokeEditor\gui.py:70 +msgid "Key" +msgstr "Tecla" + +#: ../src\keystrokeEditor\gui.py:99 +msgid "You need to use the Windows key" +msgstr "Você precisa usar a tecla Windows" + +#: ../src\keystrokeEditor\gui.py:99 ../src\keystrokeEditor\gui.py:112 +msgid "Invalid keystroke" +msgstr "Tecla de atalho inválida" + +#: ../src\keystrokeEditor\gui.py:112 +msgid "You must provide a character for the keystroke" +msgstr "Você deve fornecer um caracter para o pressionamento de teclas" + +#: ../src\languageHandler.py:95 +msgid "User default" +msgstr "Usuário padrão" + +#: ../src\sessionmanager\gui.py:19 +msgid "Session manager" +msgstr "Gerenciar sessão" + +#: ../src\sessionmanager\gui.py:23 +msgid "Select a twitter account to start TW Blue" +msgstr "Selecione uma conta do Twitter para iniciar o TW Blue" + +#: ../src\sessionmanager\gui.py:25 +msgid "Account" +msgstr "Conta" + +#: ../src\sessionmanager\gui.py:30 +msgid "New account" +msgstr "Nova conta" + +#: ../src\sessionmanager\gui.py:67 +msgid "Account Error" +msgstr "Erro na Conta" + +#: ../src\sessionmanager\gui.py:67 +msgid "You need to configure an account." +msgstr "Você precisa configurar uma conta." + +#: ../src\sessionmanager\gui.py:83 +#, fuzzy +msgid "" +"The request for the required Twitter authorization to continue will be " +"opened on your browser. You only need to do it once. Would you like to " +"autorhise a new account now?" +msgstr "" +"Será aberto o navegador web com o pedido de autorização do Twitter que você " +"precisa para continuar. Copie e cole no campo de edição o código numérico " +"fornecido para fazer login. Só será necessário fazer isto uma vez." + +#: ../src\sessionmanager\gui.py:94 +#, fuzzy +msgid "Invalid user token" +msgstr "Tecla de atalho inválida" + +#: ../src\sessionmanager\gui.py:94 +msgid "" +"Your access token is invalid or the authorisation has failed. Please try " +"again." +msgstr "" + +#: ../src\sessionmanager\gui.py:97 +msgid "Authorised account %d" +msgstr "Conta %d autorizada" + +#: ../src\twitter\buffers\indibidual.py:26 +msgid "One tweet from %s" +msgstr "Um tweet de %s" + +#: ../src\twitter\buffers\indibidual.py:35 +msgid "One tweet from %s in the list %s" +msgstr "Um tweet de %s na lista %s" + +#: ../src\twitter\buffers\stream.py:57 +msgid "One mention from %s " +msgstr "Uma menção de %s" + +#: ../src\twitter\buffers\stream.py:69 +msgid "One direct message" +msgstr "Uma mensagem direta" + +#: ../src\twitter\compose.py:22 +msgid "About a week ago" +msgstr "Cerca de uma semana atrás" + +#: ../src\twitter\compose.py:24 +msgid "About {} weeks ago" +msgstr "Cerca de {} semanas atrás" + +#: ../src\twitter\compose.py:26 +msgid "A month ago" +msgstr "Há um mês" + +#: ../src\twitter\compose.py:28 +msgid "About {} months ago" +msgstr "Cerca de {} meses atrás" + +#: ../src\twitter\compose.py:30 +msgid "About a year ago" +msgstr "Cerca de um ano atrás" + +#: ../src\twitter\compose.py:32 +msgid "About {} years ago" +msgstr "Cerca de {} anos atrás" + +#: ../src\twitter\compose.py:34 +msgid "About 1 day ago" +msgstr "Cerca de 1 dia atrás" + +#: ../src\twitter\compose.py:36 +msgid "About {} days ago" +msgstr "Cerca de {} dias atrás" + +#: ../src\twitter\compose.py:38 +msgid "just now" +msgstr "agora mesmo" + +#: ../src\twitter\compose.py:40 +msgid "{} seconds ago" +msgstr "{} segundos atrás" + +#: ../src\twitter\compose.py:42 +msgid "1 minute ago" +msgstr "1 hora atrás" + +#: ../src\twitter\compose.py:44 +msgid "{} minutes ago" +msgstr "{} minutos atrás" + +#: ../src\twitter\compose.py:46 +msgid "About 1 hour ago" +msgstr "Cerca de 1 hora atrás" + +#: ../src\twitter\compose.py:48 +msgid "About {} hours ago" +msgstr "Cerca de {} horas atrás" + +#: ../src\twitter\compose.py:52 +msgid "January" +msgstr "Janeiro" + +#: ../src\twitter\compose.py:53 +msgid "February" +msgstr "Fevereiro" + +#: ../src\twitter\compose.py:54 +msgid "March" +msgstr "Março" + +#: ../src\twitter\compose.py:55 +msgid "April" +msgstr "Abril" + +#: ../src\twitter\compose.py:56 +msgid "May" +msgstr "Maio" + +#: ../src\twitter\compose.py:57 +msgid "June" +msgstr "Junho" + +#: ../src\twitter\compose.py:58 +msgid "July" +msgstr "Julho" + +#: ../src\twitter\compose.py:59 +msgid "August" +msgstr "Agosto" + +#: ../src\twitter\compose.py:60 +msgid "September" +msgstr "Setembro" + +#: ../src\twitter\compose.py:61 +msgid "October" +msgstr "Outubro" + +#: ../src\twitter\compose.py:62 +msgid "November" +msgstr "Novembro" + +#: ../src\twitter\compose.py:63 +msgid "December" +msgstr "Dezembro" + +#: ../src\twitter\compose.py:66 +msgid "Sunday" +msgstr "Domingo" + +#: ../src\twitter\compose.py:67 +msgid "Monday" +msgstr "Segunda-feira" + +#: ../src\twitter\compose.py:68 +msgid "Tuesday" +msgstr "Terça-feira" + +#: ../src\twitter\compose.py:69 +msgid "Wednesday" +msgstr "Quarta-feira" + +#: ../src\twitter\compose.py:70 +msgid "Thursday" +msgstr "Quinta-feira" + +#: ../src\twitter\compose.py:71 +msgid "Friday" +msgstr "Sexta-feira" + +#: ../src\twitter\compose.py:72 +msgid "Saturday" +msgstr "Sábado" + +#: ../src\twitter\compose.py:75 +msgid "sun" +msgstr "dom" + +#: ../src\twitter\compose.py:76 +msgid "mon" +msgstr "seg" + +#: ../src\twitter\compose.py:77 +msgid "tue" +msgstr "ter" + +#: ../src\twitter\compose.py:78 +msgid "wed" +msgstr "qua" + +#: ../src\twitter\compose.py:79 +msgid "thu" +msgstr "qui" + +#: ../src\twitter\compose.py:80 +msgid "fri" +msgstr "sex" + +#: ../src\twitter\compose.py:81 +msgid "sat" +msgstr "sab" + +#: ../src\twitter\compose.py:85 +#, fuzzy +msgid "jan" +msgstr "jan" + +#: ../src\twitter\compose.py:86 +msgid "feb" +msgstr "fev" + +#: ../src\twitter\compose.py:87 +msgid "mar" +msgstr "mar" + +#: ../src\twitter\compose.py:88 +msgid "apr" +msgstr "abr" + +#: ../src\twitter\compose.py:89 +msgid "may" +msgstr "mai" + +#: ../src\twitter\compose.py:90 +msgid "jun" +msgstr "jun" + +#: ../src\twitter\compose.py:91 +msgid "jul" +msgstr "jul" + +#: ../src\twitter\compose.py:92 +msgid "aug" +msgstr "ago" + +#: ../src\twitter\compose.py:93 +msgid "sep" +msgstr "set" + +#: ../src\twitter\compose.py:94 +msgid "oct" +msgstr "out" + +#: ../src\twitter\compose.py:95 +msgid "nov" +msgstr "nov" + +#: ../src\twitter\compose.py:96 +msgid "dec" +msgstr "dez" + +#: ../src\twitter\compose.py:152 +msgid "Dm to %s " +msgstr "DM para %s" + +#: ../src\twitter\compose.py:185 +msgid "Unavailable" +msgstr "Indisponível" + +#: ../src\twitter\compose.py:186 +msgid "" +"%s (@%s). %s followers, %s friends, %s tweets. Last tweet on %s. Joined " +"Twitter on %s" +msgstr "" +"%s (@%s). %s seguidores, seguindo %s, %s tweets. Último tweet em %s. " +"Cadastrou-se no Twitter em %s" + +#: ../src\twitter\compose.py:190 +msgid "You've blocked %s" +msgstr "Você bloqueou %s" + +#: ../src\twitter\compose.py:192 +msgid "You've unblocked %s" +msgstr "Você desbloqueou %s" + +#: ../src\twitter\compose.py:195 +msgid "%s(@%s) has followed you" +msgstr "%s(@%s) está seguindo você" + +#: ../src\twitter\compose.py:197 +msgid "You've followed %s(@%s)" +msgstr "Você está seguindo %s(@%s)" + +#: ../src\twitter\compose.py:199 +msgid "You've unfollowed %s (@%s)" +msgstr "Você deixou de seguir %s(@%s)" + +#: ../src\twitter\compose.py:202 +msgid "You've added to favourites: %s, %s" +msgstr "Você adicionou aos favoritos: %s, %s" + +#: ../src\twitter\compose.py:204 +msgid "%s(@%s) has marked as favorite: %s" +msgstr "%s(@%s) foi marcado como favorito: %s" + +#: ../src\twitter\compose.py:206 +msgid "You've removed from favourites: %s, %s" +msgstr "Você excluiu dos favoritos: %s, %s" + +#: ../src\twitter\compose.py:207 +msgid "%s(@%s) has removed from favourites: %s" +msgstr "%s(@%s) excluiu dos favoritos: %s" + +#: ../src\twitter\compose.py:209 +msgid "You've created the list %s" +msgstr "Você criou a lista %s" + +#: ../src\twitter\compose.py:211 +msgid "You've deleted the list %s" +msgstr "Você excluiu a lista %s" + +#: ../src\twitter\compose.py:213 +msgid "You've updated the list %s" +msgstr "Você atualizou a lista %s" + +#: ../src\twitter\compose.py:215 +msgid "You've added %s(@%s) to the list %s" +msgstr "Você adicionou %s(@%s) para a lista %s" + +#: ../src\twitter\compose.py:216 +msgid "%s(@%s) has added you to the list %s" +msgstr "%s(@%s) adicionou você à lista %s" + +#: ../src\twitter\compose.py:218 +msgid "You'be removed %s(@%s) from the list %s" +msgstr "Você excluíu %s(@%s) da lista %s" + +#: ../src\twitter\compose.py:219 +msgid "%s(@%s) has removed you from the list %s" +msgstr "%s(@%s) excluíu você da lista %s" + +#: ../src\twitter\compose.py:221 +msgid "You've subscribed to the list %s, which is owned by %s(@%s)" +msgstr "Você se inscreveu para a lista %s, que é de propriedade de %s(@%s)" + +#: ../src\twitter\compose.py:222 +msgid "%s(@%s) has suscribed you to the list %s" +msgstr "%s(@%s) te inscreveu na lista %s" + +#: ../src\twitter\compose.py:224 +msgid "You've unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "" +"Sua inscrição foi cancelada da lista %s, que é de propriedade de %s(@%s)" + +#: ../src\twitter\compose.py:225 +msgid "You've been unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "" +"Sua inscrição foi recusada na lista %s, que é de propriedade de %s(@%s)" + +#: ../src\twitter\compose.py:226 +msgid "Unknown" +msgstr "Desconhecido" + +#: ../src\twitter\compose.py:232 +msgid "No description available" +msgstr "Não há descrição disponível" + +#: ../src\twitter\compose.py:236 +msgid "private" +msgstr "Privado" + +#: ../src\twitter\compose.py:237 +msgid "public" +msgstr "Público" + +#: ../src\twitter\twitter.py:73 +msgid "%s failed. Reason: %s" +msgstr "%s falhou. Motivo: %s" + +#: ../src\twitter\twitter.py:80 +msgid "%s succeeded." +msgstr "%s sucedeu." + +#: ../src\updater\update_manager.py:14 +msgid "Your TW Blue version is up to date" +msgstr "A versão do seu TW Blue está atualizada" + +#: ../src\updater\update_manager.py:14 ../src\updater\update_manager.py:27 +msgid "Update" +msgstr "Atualização" + +#: ../src\updater\update_manager.py:20 +msgid "New version for %s" +msgstr "Nova versão do %s" + +#: ../src\updater\update_manager.py:20 +msgid "" +"There's a new TW Blue version available. Would you like to download it now?" +msgstr "" +"Há uma nova versão do TW Blue disponível. Gostaria de fazer download agora?" + +#: ../src\updater\update_manager.py:22 +msgid "Download in Progress" +msgstr "Transferência em andamento" + +#: ../src\updater\update_manager.py:22 +msgid "Downloading the new version..." +msgstr "Baixando a nova versão..." + +#: ../src\updater\update_manager.py:29 +msgid "Done!" +msgstr "Feito!" + +#: ../src\updater\update_manager.py:29 +msgid "" +"The new TW Blue version has been downloaded and installed. Press OK to start " +"the application." +msgstr "" +"A nova versão do TW Blue foi baixada e instalada. Pressione OK para iniciar " +"o aplicativo." + +#~ msgid "Tweet - %i characters" +#~ msgstr "Tweet - %i caracteres" + +#~ msgid "%A, %B %d, %Y at %I:%M:%S %p" +#~ msgstr "%A, %d de %B, %Y em %I:%M:%S %p" + +#~ msgid "View members" +#~ msgstr "Ver membros" + +#~ msgid "View subscribers" +#~ msgstr "Ver assinantes" + +#~ msgid "Mention to %s" +#~ msgstr "Menção para %s" + +#~ msgid "Ouner" +#~ msgstr "Proprietário" + +#~ msgid "Successfully following %s" +#~ msgstr "Seguindo %s" + +#~ msgid "%s has been reported as spam" +#~ msgstr "%s foi relatado como spam" + +#~ msgid "%s has been blocked" +#~ msgstr "%s foi bloqueado" + +#~ msgid "User's information" +#~ msgstr "Informações do usuário" + +#~ msgid "Unfavorite Tweet" +#~ msgstr "Desmarcar como favorito" + +#~ msgid "Tueet" +#~ msgstr "Tweet" + +#~ msgid "" +#~ "It will open the web browser with the request for authorization of " +#~ "Twitter that you need to continue. Copy and paste in the following edit " +#~ "box the numerical code will give the social network to login. You only " +#~ "need do it once." +#~ msgstr "" +#~ "Será aberto o navegador web com o pedido de autorização do Twitter que " +#~ "você precisa para continuar. Copie e cole no campo de edição o código " +#~ "numérico fornecido para fazer login. Só será necessário fazer isto uma " +#~ "vez." + +#~ msgid "Tuit" +#~ msgstr "Tuit" diff --git a/src/locales/ru/LC_MESSAGES/twblue.mo b/src/locales/ru/LC_MESSAGES/twblue.mo new file mode 100644 index 00000000..83197cfe Binary files /dev/null and b/src/locales/ru/LC_MESSAGES/twblue.mo differ diff --git a/src/locales/ru/LC_MESSAGES/twblue.po b/src/locales/ru/LC_MESSAGES/twblue.po new file mode 100644 index 00000000..46223c62 --- /dev/null +++ b/src/locales/ru/LC_MESSAGES/twblue.po @@ -0,0 +1,2449 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: TW Blue 0.46\n" +"POT-Creation-Date: 2014-09-07 06:26+Hora de verano central (México)\n" +"PO-Revision-Date: 2014-09-07 17:17+0400\n" +"Last-Translator: Sukil Echenique \n" +"Language-Team: Alexander Jaszyn \n" +"Language: ru\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 1.6.7\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: ../src\extra\AudioUploader\gui.py:31 ../src\gui\dialogs\message.py:169 +#: ../src\gui\dialogs\message.py:256 +msgid "Attach audio" +msgstr "Добавить аудио" + +#: ../src\extra\AudioUploader\gui.py:38 ../src\extra\AudioUploader\gui.py:146 +#: ../src\extra\AudioUploader\gui.py:156 +msgid "Play" +msgstr "Воспроизвести" + +#: ../src\extra\AudioUploader\gui.py:41 ../src\extra\AudioUploader\gui.py:75 +#: ../src\extra\AudioUploader\gui.py:80 ../src\extra\AudioUploader\gui.py:107 +msgid "Pause" +msgstr "Пауза" + +#: ../src\extra\AudioUploader\gui.py:44 ../src\extra\AudioUploader\gui.py:103 +msgid "Record" +msgstr "Записать" + +#: ../src\extra\AudioUploader\gui.py:47 +msgid "Add an existing file" +msgstr "Добавить существующий файл" + +#: ../src\extra\AudioUploader\gui.py:49 +msgid "Discard" +msgstr "Очистить" + +#: ../src\extra\AudioUploader\gui.py:52 +msgid "Upload to" +msgstr "Загрузить в" + +#: ../src\extra\AudioUploader\gui.py:57 +msgid "Attach" +msgstr "Загрузить" + +#: ../src\extra\AudioUploader\gui.py:59 ../src\issueReporter\gui.py:88 +msgid "Cancel" +msgstr "Отменить" + +#: ../src\extra\AudioUploader\gui.py:77 ../src\extra\AudioUploader\gui.py:78 +msgid "Resume" +msgstr "Воспроизвести" + +#: ../src\extra\AudioUploader\gui.py:95 +msgid "Stop recording" +msgstr "Остановить запись" + +#: ../src\extra\AudioUploader\gui.py:96 +msgid "Recording" +msgstr "Запись" + +#: ../src\extra\AudioUploader\gui.py:101 ../src\extra\AudioUploader\gui.py:153 +msgid "Stopped" +msgstr "Остановлено" + +#: ../src\extra\AudioUploader\gui.py:128 ../src\gui\dialogs\message.py:218 +#: ../src\gui\dialogs\update_profile.py:87 +msgid "Discarded" +msgstr "Отменено" + +#: ../src\extra\AudioUploader\gui.py:138 ../src\gui\buffers\base.py:303 +#: ../src\gui\buffers\base.py:315 +msgid "Playing..." +msgstr "Воспроизводится" + +#: ../src\extra\AudioUploader\gui.py:142 +msgid "Stop" +msgstr "Остановить" + +#: ../src\extra\AudioUploader\gui.py:161 +msgid "Recoding audio..." +msgstr "Перекодирование аудио ..." + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Audio Files (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" +msgstr "Файлы (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Select the audio file to be uploaded" +msgstr "Выберите аудио файл, который хотите загрузить" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:15 +msgid "File" +msgstr "Файл" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:21 +msgid "Transferred" +msgstr "Передано" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:26 +msgid "Total file size" +msgstr "Общий размер файла" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:31 +msgid "Transfer rate" +msgstr "Скорость передачи" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:36 +msgid "Time left" +msgstr "Осталось времени" + +#: ../src\extra\AudioUploader\utils.py:27 +msgid "%d day, " +msgstr "%d день" + +#: ../src\extra\AudioUploader\utils.py:29 +msgid "%d days, " +msgstr "%d дней" + +#: ../src\extra\AudioUploader\utils.py:31 +msgid "%d hour, " +msgstr "%d час" + +#: ../src\extra\AudioUploader\utils.py:33 +msgid "%d hours, " +msgstr "%d часов" + +#: ../src\extra\AudioUploader\utils.py:35 +msgid "%d minute, " +msgstr "%d минута" + +#: ../src\extra\AudioUploader\utils.py:37 +msgid "%d minutes, " +msgstr "%d минут" + +#: ../src\extra\AudioUploader\utils.py:39 +msgid "%s second" +msgstr "%s секунда" + +#: ../src\extra\AudioUploader\utils.py:41 +msgid "%s seconds" +msgstr "%s секунд" + +#: ../src\extra\SoundsTutorial\gui.py:11 +msgid "The tweet may contain a playable audio" +msgstr "Твит может содержать воспроизводимое аудио" + +#: ../src\extra\SoundsTutorial\gui.py:12 +msgid "A timeline has been created" +msgstr "Лента была создана" + +#: ../src\extra\SoundsTutorial\gui.py:13 +msgid "A timeline has been deleted" +msgstr "Лента была удалена" + +#: ../src\extra\SoundsTutorial\gui.py:14 +msgid "You've received a direct message" +msgstr "Вы получили личное сообщение" + +#: ../src\extra\SoundsTutorial\gui.py:15 +msgid "You've sent a direct message" +msgstr "Вы отправили личное сообщение" + +#: ../src\extra\SoundsTutorial\gui.py:16 +msgid "A bug has happened" +msgstr "Произошла ошибка" + +#: ../src\extra\SoundsTutorial\gui.py:17 +msgid "You've added a tweet to your favourites" +msgstr "Вы добавили твит в избранное" + +#: ../src\extra\SoundsTutorial\gui.py:18 +msgid "Someone's favourites have been updated" +msgstr "Чьё-то избранное было обновлено" + +#: ../src\extra\SoundsTutorial\gui.py:19 +msgid "There are no more tweets to read" +msgstr "Отсутствуют твиты для чтения" + +#: ../src\extra\SoundsTutorial\gui.py:20 +msgid "A list has a new tweet" +msgstr "Новый твит в листе" + +#: ../src\extra\SoundsTutorial\gui.py:21 +msgid "You can't add any more characters on the tweet" +msgstr "Вы не можете добавить больше символов к твиту" + +#: ../src\extra\SoundsTutorial\gui.py:22 +msgid "You've been mentioned " +msgstr "Вас упомянули" + +#: ../src\extra\SoundsTutorial\gui.py:23 +msgid "A new event has happened" +msgstr "Новое событие" + +#: ../src\extra\SoundsTutorial\gui.py:24 +msgid "TW Blue is ready " +msgstr "TW Blue готов " + +#: ../src\extra\SoundsTutorial\gui.py:25 +msgid "You've replied" +msgstr "Вы ответили" + +#: ../src\extra\SoundsTutorial\gui.py:26 +msgid "You've retweeted" +msgstr "Вы ретвитнули" + +#: ../src\extra\SoundsTutorial\gui.py:27 +msgid "A search has been updated" +msgstr "Поиск обновлён" + +#: ../src\extra\SoundsTutorial\gui.py:28 +msgid "There's a new tweet in the main buffer" +msgstr "Новый твит в главном буфере" + +#: ../src\extra\SoundsTutorial\gui.py:29 +msgid "You've sent a tweet" +msgstr "Вы отправили твит" + +#: ../src\extra\SoundsTutorial\gui.py:30 +msgid "There's a new tweet in a timeline" +msgstr "Новый твит в ленте" + +#: ../src\extra\SoundsTutorial\gui.py:31 +msgid "You have a new follower" +msgstr "У вас есть новый читатель" + +#: ../src\extra\SoundsTutorial\gui.py:32 +msgid "You've turned the volume up or down" +msgstr "Громкость изменена" + +#: ../src\extra\SoundsTutorial\gui.py:36 +msgid "" +"It seems as though the currently used sound pack needs an update. %i fails " +"are still be required to use this function. Make sure to obtain the needed " +"lacking sounds or to contact with the sound pack developer." +msgstr "" +"Похоже, требуется новый звуковой пакет. Нужно загрузи ть ещё %I файлов для " +"корректной работы. Произведите, пожалуйста, обновление пакета." + +#: ../src\extra\SoundsTutorial\gui.py:36 ../src\extra\SpellChecker\gui.py:34 +#: ../src\gui\dialogs\show_user.py:63 ../src\gui\main.py:703 +#: ../src\gui\main.py:734 ../src\issueReporter\gui.py:98 +#: ../src\issueReporter\gui.py:101 +msgid "Error" +msgstr "Ошибка" + +#: ../src\extra\SoundsTutorial\gui.py:38 ../src\gui\main.py:68 +msgid "Sounds tutorial" +msgstr "Гид по звукам" + +#: ../src\extra\SoundsTutorial\gui.py:41 +msgid "Press enter to listen to the sound for the selected event" +msgstr "Нажмите клавишу Enter, чтобы прослушать звук для выбранного события" + +#: ../src\extra\SpellChecker\gui.py:34 +msgid "" +"A bug has happened. There are no dictionaries available for the selected " +"language in TW Blue" +msgstr "Ошибка. В программе отсутствуют словари для выбранного языка." + +#: ../src\extra\SpellChecker\gui.py:38 +msgid "Mis-spelled word" +msgstr "Грамматическая ошибка" + +#: ../src\extra\SpellChecker\gui.py:43 +msgid "Context" +msgstr "Контекст" + +#: ../src\extra\SpellChecker\gui.py:48 +msgid "Suggestions" +msgstr "Предложения" + +#: ../src\extra\SpellChecker\gui.py:53 +msgid "Ignore" +msgstr "Игнорировать" + +#: ../src\extra\SpellChecker\gui.py:55 +msgid "Ignore all" +msgstr "Игнорировать всё" + +#: ../src\extra\SpellChecker\gui.py:57 +msgid "Replace" +msgstr "Заменить" + +#: ../src\extra\SpellChecker\gui.py:59 +msgid "Replace all" +msgstr "Заменить всё" + +#: ../src\extra\SpellChecker\gui.py:78 +msgid "Mis-spelled word: %s" +msgstr "Найдены ошибки в %s словах" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "Finished" +msgstr "Готово" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "The spelling review has finished." +msgstr "Орфография проверена." + +#: ../src\extra\translator\gui.py:24 ../src\gui\dialogs\message.py:177 +#: ../src\gui\dialogs\message.py:264 ../src\gui\dialogs\message.py:350 +msgid "Translate message" +msgstr "Перевести сообщение" + +#: ../src\extra\translator\gui.py:27 +msgid "Source language" +msgstr "Исходный язык" + +#: ../src\extra\translator\gui.py:30 +msgid "Target language" +msgstr "Язык перевода" + +#: ../src\extra\translator\translator.py:53 +msgid "Afrikaans" +msgstr "Африкаанс" + +#: ../src\extra\translator\translator.py:54 +msgid "Albanian" +msgstr "Албанский" + +#: ../src\extra\translator\translator.py:55 +msgid "Amharic" +msgstr "Дари" + +#: ../src\extra\translator\translator.py:56 +msgid "Arabic" +msgstr "Арабский" + +#: ../src\extra\translator\translator.py:57 +msgid "Armenian" +msgstr "Армянский" + +#: ../src\extra\translator\translator.py:58 +msgid "Azerbaijani" +msgstr "Азербайджанский" + +#: ../src\extra\translator\translator.py:59 +msgid "Basque" +msgstr "Баскский" + +#: ../src\extra\translator\translator.py:60 +msgid "Belarusian" +msgstr "Беларусский" + +#: ../src\extra\translator\translator.py:61 +msgid "Bengali" +msgstr "Бенгальский" + +#: ../src\extra\translator\translator.py:62 +msgid "Bihari" +msgstr "Бихари" + +#: ../src\extra\translator\translator.py:63 +msgid "Bulgarian" +msgstr "Болгарский" + +#: ../src\extra\translator\translator.py:64 +msgid "Burmese" +msgstr "Бирманский" + +#: ../src\extra\translator\translator.py:65 +msgid "Catalan" +msgstr "Каталонский" + +#: ../src\extra\translator\translator.py:66 +msgid "Cherokee" +msgstr "Чероки" + +#: ../src\extra\translator\translator.py:67 +msgid "Chinese" +msgstr "Китайский" + +#: ../src\extra\translator\translator.py:68 +msgid "Chinese_simplified" +msgstr "Китайский (Упрощённый)" + +#: ../src\extra\translator\translator.py:69 +msgid "Chinese_traditional" +msgstr "Китайский (традиционный)" + +#: ../src\extra\translator\translator.py:70 +msgid "Croatian" +msgstr "Хорватский" + +#: ../src\extra\translator\translator.py:71 +msgid "Czech" +msgstr "Чешский" + +#: ../src\extra\translator\translator.py:72 +msgid "Danish" +msgstr "Датский" + +#: ../src\extra\translator\translator.py:73 +msgid "Dhivehi" +msgstr "Дивехи" + +#: ../src\extra\translator\translator.py:74 +msgid "Dutch" +msgstr "Голландский" + +#: ../src\extra\translator\translator.py:75 +msgid "English" +msgstr "Английский" + +#: ../src\extra\translator\translator.py:76 +msgid "Esperanto" +msgstr "Эсперанто" + +#: ../src\extra\translator\translator.py:77 +msgid "Estonian" +msgstr "Эстонский" + +#: ../src\extra\translator\translator.py:78 +msgid "Filipino" +msgstr "Филиппинский" + +#: ../src\extra\translator\translator.py:79 +msgid "Finnish" +msgstr "Финский" + +#: ../src\extra\translator\translator.py:80 +msgid "French" +msgstr "Французский" + +#: ../src\extra\translator\translator.py:81 +msgid "Galician" +msgstr "Галисийский" + +#: ../src\extra\translator\translator.py:82 +msgid "Georgian" +msgstr "Грузинский" + +#: ../src\extra\translator\translator.py:83 +msgid "German" +msgstr "Немецкий" + +#: ../src\extra\translator\translator.py:84 +msgid "Greek" +msgstr "Греческий" + +#: ../src\extra\translator\translator.py:85 +msgid "Guarani" +msgstr "Гуарани" + +#: ../src\extra\translator\translator.py:86 +msgid "Gujarati" +msgstr "Гуджарати" + +#: ../src\extra\translator\translator.py:87 +msgid "Hebrew" +msgstr "Иврит" + +#: ../src\extra\translator\translator.py:88 +msgid "Hindi" +msgstr "Хинди" + +#: ../src\extra\translator\translator.py:89 +msgid "Hungarian" +msgstr "Венгерский" + +#: ../src\extra\translator\translator.py:90 +msgid "Icelandic" +msgstr "Исландский" + +#: ../src\extra\translator\translator.py:91 +msgid "Indonesian" +msgstr "Индонезийский" + +#: ../src\extra\translator\translator.py:92 +msgid "Inuktitut" +msgstr "Инуктитут" + +#: ../src\extra\translator\translator.py:93 +msgid "Irish" +msgstr "Ирландский" + +#: ../src\extra\translator\translator.py:94 +msgid "Italian" +msgstr "Итальянский" + +#: ../src\extra\translator\translator.py:95 +msgid "Japanese" +msgstr "Японский" + +#: ../src\extra\translator\translator.py:96 +msgid "Kannada" +msgstr "Каннада" + +#: ../src\extra\translator\translator.py:97 +msgid "Kazakh" +msgstr "Казахский" + +#: ../src\extra\translator\translator.py:98 +msgid "Khmer" +msgstr "Кхмерский" + +#: ../src\extra\translator\translator.py:99 +msgid "Korean" +msgstr "Корейский" + +#: ../src\extra\translator\translator.py:100 +msgid "Kurdish" +msgstr "Курдский" + +#: ../src\extra\translator\translator.py:101 +msgid "Kyrgyz" +msgstr "Киргизский" + +#: ../src\extra\translator\translator.py:102 +msgid "Laothian" +msgstr "Лаосский" + +#: ../src\extra\translator\translator.py:103 +msgid "Latvian" +msgstr "Латышский" + +#: ../src\extra\translator\translator.py:104 +msgid "Lithuanian" +msgstr "Литовский" + +#: ../src\extra\translator\translator.py:105 +msgid "Macedonian" +msgstr "Македонский" + +#: ../src\extra\translator\translator.py:106 +msgid "Malay" +msgstr "Малайский" + +#: ../src\extra\translator\translator.py:107 +msgid "Malayalam" +msgstr "Малаялам" + +#: ../src\extra\translator\translator.py:108 +msgid "Maltese" +msgstr "Мальтийский" + +#: ../src\extra\translator\translator.py:109 +msgid "Marathi" +msgstr "Маратхи" + +#: ../src\extra\translator\translator.py:110 +msgid "Mongolian" +msgstr "Монгольский" + +#: ../src\extra\translator\translator.py:111 +msgid "Nepali" +msgstr "Непальский" + +#: ../src\extra\translator\translator.py:112 +msgid "Norwegian" +msgstr "Норвежский" + +#: ../src\extra\translator\translator.py:113 +msgid "Oriya" +msgstr "Ория" + +#: ../src\extra\translator\translator.py:114 +msgid "Pashto" +msgstr "Пушту" + +#: ../src\extra\translator\translator.py:115 +msgid "Persian" +msgstr "Фарси" + +#: ../src\extra\translator\translator.py:116 +msgid "Polish" +msgstr "Польский" + +#: ../src\extra\translator\translator.py:117 +msgid "Portuguese" +msgstr "Португальский" + +#: ../src\extra\translator\translator.py:118 +msgid "Punjabi" +msgstr "Панджаби" + +#: ../src\extra\translator\translator.py:119 +msgid "Romanian" +msgstr "Румынский" + +#: ../src\extra\translator\translator.py:120 +msgid "Russian" +msgstr "Русский" + +#: ../src\extra\translator\translator.py:121 +msgid "Sanskrit" +msgstr "Санскрит" + +#: ../src\extra\translator\translator.py:122 +msgid "Serbian" +msgstr "Сербский" + +#: ../src\extra\translator\translator.py:123 +msgid "Sindhi" +msgstr "Синди" + +#: ../src\extra\translator\translator.py:124 +msgid "Sinhalese" +msgstr "Сингальский" + +#: ../src\extra\translator\translator.py:125 +msgid "Slovak" +msgstr "Словацкий" + +#: ../src\extra\translator\translator.py:126 +msgid "Slovenian" +msgstr "Словенский" + +#: ../src\extra\translator\translator.py:127 +msgid "Spanish" +msgstr "Испанский" + +#: ../src\extra\translator\translator.py:128 +msgid "Swahili" +msgstr "Суахили" + +#: ../src\extra\translator\translator.py:129 +msgid "Swedish" +msgstr "Шведский" + +#: ../src\extra\translator\translator.py:130 +msgid "Tajik" +msgstr "Таджикский" + +#: ../src\extra\translator\translator.py:131 +msgid "Tamil" +msgstr "Тамильский" + +#: ../src\extra\translator\translator.py:132 +msgid "Tagalog" +msgstr "Тагальский" + +#: ../src\extra\translator\translator.py:133 +msgid "Telugu" +msgstr "Телугу" + +#: ../src\extra\translator\translator.py:134 +msgid "Thai" +msgstr "Тайский" + +#: ../src\extra\translator\translator.py:135 +msgid "Tibetan" +msgstr "Тибетский" + +#: ../src\extra\translator\translator.py:136 +msgid "Turkish" +msgstr "Турецкий" + +#: ../src\extra\translator\translator.py:137 +msgid "Ukrainian" +msgstr "Украинский" + +#: ../src\extra\translator\translator.py:138 +msgid "Urdu" +msgstr "Урду" + +#: ../src\extra\translator\translator.py:139 +msgid "Uzbek" +msgstr "Узбекский" + +#: ../src\extra\translator\translator.py:140 +msgid "Uighur" +msgstr "Уйгурский" + +#: ../src\extra\translator\translator.py:141 +msgid "Vietnamese" +msgstr "Вьетнамский" + +#: ../src\extra\translator\translator.py:142 +msgid "Welsh" +msgstr "Валлийский" + +#: ../src\extra\translator\translator.py:143 +msgid "Yiddish" +msgstr "Идиш" + +#: ../src\extra\translator\translator.py:150 +msgid "autodetect" +msgstr "автоопределение" + +#: ../src\gui\buffers\base.py:54 +msgid "Client" +msgstr "Клиент" + +#: ../src\gui\buffers\base.py:54 +msgid "Text" +msgstr "Текст" + +#: ../src\gui\buffers\base.py:54 ../src\gui\buffers\events.py:57 +msgid "Date" +msgstr "Дата" + +#: ../src\gui\buffers\base.py:54 ../src\gui\buffers\people.py:39 +#: ../src\gui\buffers\user_searches.py:31 ../src\gui\dialogs\utils.py:36 +#: ../src\gui\main.py:154 +msgid "User" +msgstr "Пользователь" + +#: ../src\gui\buffers\base.py:73 ../src\gui\buffers\base.py:192 +#: ../src\gui\buffers\events.py:58 ../src\gui\buffers\events.py:74 +#: ../src\gui\dialogs\message.py:332 ../src\gui\main.py:79 +#: ../src\gui\main.py:153 ../src\gui\sysTrayIcon.py:34 +msgid "Tweet" +msgstr "Твит" + +#: ../src\gui\buffers\base.py:75 ../src\gui\buffers\base.py:204 +#: ../src\gui\main.py:83 ../src\keystrokeEditor\constants.py:13 +msgid "Retweet" +msgstr "Ретвит" + +#: ../src\gui\buffers\base.py:77 ../src\gui\main.py:81 +msgid "Reply" +msgstr "Ответ" + +#: ../src\gui\buffers\base.py:79 ../src\gui\main.py:110 +msgid "Direct message" +msgstr "Личное сообщение" + +#: ../src\gui\buffers\base.py:92 +msgid "Do you really want to delete this timeline?" +msgstr "Вы желаете удалить буфер или ленту?" + +#: ../src\gui\buffers\base.py:92 ../src\gui\buffers\favourites.py:41 +#: ../src\gui\buffers\lists.py:46 ../src\gui\buffers\trends.py:41 +#: ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Attention" +msgstr "Внимание!" + +#: ../src\gui\buffers\base.py:104 +msgid "This buffer is not a timeline; it can't be deleted." +msgstr "Этот буфер не является лентой и его невозможно удалить." + +#: ../src\gui\buffers\base.py:184 ../src\gui\buffers\dm.py:44 +#: ../src\gui\buffers\people.py:54 +msgid "Direct message to %s" +msgstr "Личное сообщение для %s" + +#: ../src\gui\buffers\base.py:192 ../src\gui\buffers\events.py:74 +msgid "Write the tweet here" +msgstr "Напишите текст твита здесь" + +#: ../src\gui\buffers\base.py:204 +msgid "Would you like to add a comment to this tweet?" +msgstr "Желаете ли вы добавить комментарий к этому твиту?" + +#: ../src\gui\buffers\base.py:207 +msgid "Add your comment to the tweet" +msgstr "Напишите ваш комментарий к этому твиту" + +#: ../src\gui\buffers\base.py:223 ../src\gui\buffers\people.py:62 +msgid "Reply to %s" +msgstr "Ответ %s" + +#: ../src\gui\buffers\base.py:268 +msgid "Opening URL..." +msgstr "Открытие ссылки" + +#: ../src\gui\buffers\base.py:285 ../src\gui\buffers\events.py:118 +msgid "" +"Do you really want to empty this buffer? It's tweets will be removed from " +"the list but not from Twitter" +msgstr "" +"Вы действительно хотите очистить этот буфер? Твиты останутся на сервере, но " +"будут удалены из списка." + +#: ../src\gui\buffers\base.py:285 ../src\gui\buffers\events.py:118 +msgid "Empty buffer" +msgstr "Пустой буфер" + +#: ../src\gui\buffers\base.py:290 ../src\gui\buffers\events.py:122 +msgid "Do you really want to delete this message?" +msgstr "Вы действительно хотите удалить это сообщение?" + +#: ../src\gui\buffers\base.py:290 ../src\gui\buffers\events.py:122 +#: ../src\gui\dialogs\lists.py:107 ../src\gui\main.py:91 +#: ../src\gui\main.py:577 +msgid "Delete" +msgstr "Удалить" + +#: ../src\gui\buffers\base.py:310 ../src\gui\buffers\base.py:321 +msgid "Unable to play audio." +msgstr "Воспроизведение невозможно." + +#: ../src\gui\buffers\base.py:312 +msgid "Audio stopped." +msgstr "Воспроизведение остановлено." + +#: ../src\gui\buffers\events.py:40 +msgid "Empty" +msgstr "Пусто" + +#: ../src\gui\buffers\events.py:57 +msgid "Event" +msgstr "Событие" + +#: ../src\gui\buffers\events.py:60 +msgid "Remove event" +msgstr "Удалить событие" + +#: ../src\gui\buffers\favourites.py:41 +msgid "Do you really want to delete this favourites timeline?" +msgstr "Вы желаете удалить эту ленту избранного?" + +#: ../src\gui\buffers\lists.py:46 ../src\gui\dialogs\lists.py:107 +msgid "Do you really want to delete this list?" +msgstr "Вы желаете удалить этот лист?" + +#: ../src\gui\buffers\panels.py:27 +msgid "Announce" +msgstr "Объявление" + +#: ../src\gui\buffers\people.py:44 +msgid "Mention" +msgstr "Упоминание" + +#: ../src\gui\buffers\trends.py:41 ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Do you really want to delete this search term?" +msgstr "Вы действительно хотите удалить этот результат поиска?" + +#: ../src\gui\dialogs\configuration.py:39 +msgid "Language" +msgstr "Язык" + +#: ../src\gui\dialogs\configuration.py:53 +msgid "Relative times" +msgstr "Относительное время" + +#: ../src\gui\dialogs\configuration.py:57 +msgid "Activate Sapi5 when any other screen reader is not being run" +msgstr "Активировать sapi5, когда не один скринридер не запущен" + +#: ../src\gui\dialogs\configuration.py:60 +msgid "Activate the auto-start of the invisible interface" +msgstr "Автозапуск невидимого интерфейса" + +#: ../src\gui\dialogs\configuration.py:64 +msgid "" +"API calls when the stream is started (One API call equals to 200 tweetts, " +"two API calls equals 400 tweets, etc):" +msgstr "Количество вызовов Api. 1 вызов равен 200 твитам." + +#: ../src\gui\dialogs\configuration.py:72 +msgid "Items on each API call" +msgstr "Элементов при каждом вызове API" + +#: ../src\gui\dialogs\configuration.py:79 +msgid "" +"Inverted buffers: The newest tweets will be shown at the beginning of the " +"lists while the oldest at the end" +msgstr "" +"Отображение твитов: Самые новые твиты будут показаны в начале списка, а " +"самые старые в конце" + +#: ../src\gui\dialogs\configuration.py:94 +msgid "Show followers" +msgstr "Показать читающих" + +#: ../src\gui\dialogs\configuration.py:97 +msgid "Show friends" +msgstr "Показать читаемых" + +#: ../src\gui\dialogs\configuration.py:100 +msgid "Show favourites" +msgstr "Показать избранное" + +#: ../src\gui\dialogs\configuration.py:103 +msgid "Show blocked users" +msgstr "Показать заблокированных пользователей" + +#: ../src\gui\dialogs\configuration.py:106 +msgid "Show muted users" +msgstr "Показать приглушённых пользователей" + +#: ../src\gui\dialogs\configuration.py:109 +msgid "Show events" +msgstr "Показать события" + +#: ../src\gui\dialogs\configuration.py:119 +#: ../src\gui\dialogs\configuration.py:267 +msgid "Ignored clients" +msgstr "Игнорируемые клиенты" + +#: ../src\gui\dialogs\configuration.py:125 +msgid "Add client" +msgstr "Добавить клиент" + +#: ../src\gui\dialogs\configuration.py:126 +msgid "Remove client" +msgstr "Удалить клиент" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Add a new ignored client" +msgstr "Добавить клиент для игнорирования" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Enter the name of the client here" +msgstr "Введите имя клиента здесь" + +#: ../src\gui\dialogs\configuration.py:154 +msgid "Volume" +msgstr "Громкость" + +#: ../src\gui\dialogs\configuration.py:163 +msgid "Global mute" +msgstr "Режим полной тишины" + +#: ../src\gui\dialogs\configuration.py:167 +msgid "Output device" +msgstr "Устройства воспроизведения" + +#: ../src\gui\dialogs\configuration.py:176 +msgid "Input device" +msgstr "Устройство записи" + +#: ../src\gui\dialogs\configuration.py:184 +msgid "" +"If you've got a SndUp account, enter your API Key here. Whether the API Key " +"is wrong, the App will fail to upload anything to the server. Whether " +"there's no API Key here, then the audio files will be uploaded anonimously" +msgstr "" +"Если у вас есть учётная запись SndUp, введите свой API Key здесь. При " +"неверно указанном API Key загрузка аудио будет невозможна." + +#: ../src\gui\dialogs\configuration.py:197 +msgid "Sound pack" +msgstr "Пакет звуков" + +#: ../src\gui\dialogs\configuration.py:213 +#: ../src\gui\dialogs\configuration.py:237 +msgid "Unlink your Dropbox account" +msgstr "Отключить от аккаунта dropbox" + +#: ../src\gui\dialogs\configuration.py:215 +#: ../src\gui\dialogs\configuration.py:232 +#: ../src\gui\dialogs\configuration.py:240 +#: ../src\gui\dialogs\configuration.py:244 +#: ../src\gui\dialogs\configuration.py:251 +msgid "Link your Dropbox account" +msgstr "Подключить к аккаунту dropbox" + +#: ../src\gui\dialogs\configuration.py:225 +msgid "" +"The authorisation request will be shown on your browser. Copy the code tat " +"Dropbox will provide and, in the text box that will appear on TW Blue, paste " +"it. This code is necessary to continue. You only need to do it once." +msgstr "" +"Сейчас откроется браузер и вы сможете авторизовать приложение. Вы должны " +"войти в свой dropbox, после чего скопировать цифровой код, который будет " +"отображен на странице. Вставьте этот код в окно клиента. Вы должны сделать " +"это только один раз." + +#: ../src\gui\dialogs\configuration.py:225 ../src\sessionmanager\gui.py:83 +msgid "Authorisation" +msgstr "Авторизация" + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Enter the code here." +msgstr "Введите код здесь." + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Verification code" +msgstr "Код" + +#: ../src\gui\dialogs\configuration.py:239 +msgid "Error during authorisation. Try again later." +msgstr "Ошибка при авторизации. Повторите попытку позже." + +#: ../src\gui\dialogs\configuration.py:239 ../src\gui\main.py:718 +#: ../src\gui\main.py:749 +msgid "Error!" +msgstr "Ошибка" + +#: ../src\gui\dialogs\configuration.py:258 +msgid "TW Blue preferences" +msgstr "Настройки TW Blue" + +#: ../src\gui\dialogs\configuration.py:262 ../src\issueReporter\gui.py:30 +msgid "General" +msgstr "Общие" + +#: ../src\gui\dialogs\configuration.py:265 +msgid "Show other buffers" +msgstr "Показать" + +#: ../src\gui\dialogs\configuration.py:269 +msgid "Sound" +msgstr "Звук" + +#: ../src\gui\dialogs\configuration.py:271 +msgid "Audio Services" +msgstr "Аудиосервисы" + +#: ../src\gui\dialogs\configuration.py:274 +msgid "Save" +msgstr "Сохранить" + +#: ../src\gui\dialogs\configuration.py:277 ../src\gui\dialogs\follow.py:64 +#: ../src\gui\dialogs\message.py:182 ../src\gui\dialogs\message.py:269 +#: ../src\gui\dialogs\message.py:352 ../src\gui\dialogs\search.py:42 +#: ../src\gui\dialogs\show_user.py:42 ../src\gui\dialogs\update_profile.py:56 +#: ../src\gui\dialogs\utils.py:42 ../src\keystrokeEditor\gui.py:26 +msgid "Close" +msgstr "Закрыть" + +#: ../src\gui\dialogs\configuration.py:290 ../src\gui\main.py:272 +msgid "Followers" +msgstr "Читающие" + +#: ../src\gui\dialogs\configuration.py:304 +msgid "friends" +msgstr "Читаемые" + +#: ../src\gui\dialogs\configuration.py:318 +msgid "Favorites" +msgstr "Избранное" + +#: ../src\gui\dialogs\configuration.py:332 ../src\gui\main.py:290 +msgid "Events" +msgstr "События" + +#: ../src\gui\dialogs\configuration.py:343 ../src\gui\main.py:282 +msgid "Blocked users" +msgstr "Заблокированные пользователи" + +#: ../src\gui\dialogs\configuration.py:357 ../src\gui\main.py:286 +msgid "Muted users" +msgstr "Приглушенные пользователи" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "Restart TW Blue" +msgstr "Перезагрузка TW Blue" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "" +"The application requires to be restarted to save these changes. Press OK to " +"do it now." +msgstr "" +"Программа должна быть перезагружена, чтобы изменения вступили в силу. " +"Нажмите OK, чтобы сделать это сейчас." + +#: ../src\gui\dialogs\follow.py:33 ../src\gui\dialogs\follow.py:43 +#: ../src\keystrokeEditor\gui.py:17 +msgid "Action" +msgstr "Действие" + +#: ../src\gui\dialogs\follow.py:44 ../src\gui\main.py:96 +msgid "Follow" +msgstr "Начать читать" + +#: ../src\gui\dialogs\follow.py:45 ../src\gui\main.py:98 +msgid "Unfollow" +msgstr "Удалить из читаемых" + +#: ../src\gui\dialogs\follow.py:46 ../src\gui\main.py:100 +#: ../src\gui\main.py:127 +msgid "Mute" +msgstr "Выключить звук" + +#: ../src\gui\dialogs\follow.py:47 ../src\gui\main.py:102 +msgid "Unmute" +msgstr "Включить звук" + +#: ../src\gui\dialogs\follow.py:48 ../src\gui\main.py:106 +msgid "Block" +msgstr "Заблокировать" + +#: ../src\gui\dialogs\follow.py:49 ../src\gui\main.py:108 +msgid "Unblock" +msgstr "Разблокировать" + +#: ../src\gui\dialogs\follow.py:50 ../src\gui\main.py:104 +msgid "Report as spam" +msgstr "Сообщить о спаме" + +#: ../src\gui\dialogs\follow.py:61 ../src\gui\dialogs\search.py:40 +#: ../src\gui\dialogs\utils.py:39 ../src\keystrokeEditor\gui.py:76 +msgid "OK" +msgstr "OK" + +#: ../src\gui\dialogs\follow.py:101 +msgid "You've muted to %s" +msgstr "%s был приглушён." + +#: ../src\gui\dialogs\follow.py:115 +msgid "You've unmuted to %s" +msgstr "Вы будете вновь слышать твиты от %s " + +#: ../src\gui\dialogs\lists.py:36 ../src\gui\main.py:66 +msgid "Lists manager" +msgstr "Менеджер Списков" + +#: ../src\gui\dialogs\lists.py:38 ../src\gui\main.py:309 +msgid "Lists" +msgstr "Списки" + +#: ../src\gui\dialogs\lists.py:39 +msgid "List" +msgstr "Список" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Members" +msgstr "Участников" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Owner" +msgstr "Создатель" + +#: ../src\gui\dialogs\lists.py:39 +msgid "mode" +msgstr "Режим" + +#: ../src\gui\dialogs\lists.py:39 ../src\gui\dialogs\lists.py:181 +msgid "Description" +msgstr "Описание" + +#: ../src\gui\dialogs\lists.py:44 ../src\gui\dialogs\lists.py:173 +msgid "Create a new list" +msgstr "Создать новый список" + +#: ../src\gui\dialogs\lists.py:46 ../src\keystrokeEditor\gui.py:22 +msgid "Edit" +msgstr "Редактировать" + +#: ../src\gui\dialogs\lists.py:48 ../src\gui\dialogs\lists.py:235 +msgid "Remove" +msgstr "Удалить" + +#: ../src\gui\dialogs\lists.py:50 +msgid "Open in buffer" +msgstr "Открыть в буфере" + +#: ../src\gui\dialogs\lists.py:125 +msgid "List opened" +msgstr "Список открыт" + +#: ../src\gui\dialogs\lists.py:127 +msgid "This list is arready opened." +msgstr "Этот список уже открыт" + +#: ../src\gui\dialogs\lists.py:130 ../src\gui\main.py:312 +msgid "List for %s" +msgstr "Список %s" + +#: ../src\gui\dialogs\lists.py:148 +msgid "Viewing lists for %s" +msgstr "Просмотр списков пользователя %s" + +#: ../src\gui\dialogs\lists.py:149 +msgid "Subscribe" +msgstr "Подписаться" + +#: ../src\gui\dialogs\lists.py:150 +msgid "Unsubscribe" +msgstr "Отписаться" + +#: ../src\gui\dialogs\lists.py:176 +msgid "Name (20 characters maximun)" +msgstr "Название (максимум 20 символов)" + +#: ../src\gui\dialogs\lists.py:186 +msgid "Mode" +msgstr "Режим" + +#: ../src\gui\dialogs\lists.py:187 +msgid "Public" +msgstr "Публичный" + +#: ../src\gui\dialogs\lists.py:188 +msgid "Private" +msgstr "Личный" + +#: ../src\gui\dialogs\lists.py:208 +msgid "Editing the list %s" +msgstr "Редактирование списка %s" + +#: ../src\gui\dialogs\lists.py:219 +msgid "Select a list to add the user" +msgstr "В какой список вы хотите добавить пользователя?" + +#: ../src\gui\dialogs\lists.py:220 +msgid "Add" +msgstr "Добавить" + +#: ../src\gui\dialogs\lists.py:234 +msgid "Select a list to remove the user" +msgstr "Из какого списка вы хотите удалить пользователя?" + +#: ../src\gui\dialogs\message.py:42 ../src\keystrokeEditor\constants.py:11 +msgid "New tweet" +msgstr "Новый твит" + +#: ../src\gui\dialogs\message.py:76 +msgid "Attaching..." +msgstr "Добавление" + +#: ../src\gui\dialogs\message.py:77 +msgid "Uploading..." +msgstr "Загрузка" + +#: ../src\gui\dialogs\message.py:96 +msgid "Unable to upload the audio" +msgstr "Невозможно загрузить аудио" + +#: ../src\gui\dialogs\message.py:110 ../src\gui\dialogs\message.py:395 +msgid "Translated" +msgstr "Переведено" + +#: ../src\gui\dialogs\message.py:122 +msgid "There's no URL to be shortened" +msgstr "В сообщении нет ссылки" + +#: ../src\gui\dialogs\message.py:125 +msgid "URL shortened" +msgstr "Ссылка сокращена" + +#: ../src\gui\dialogs\message.py:133 ../src\gui\dialogs\message.py:407 +msgid "There's no URL to be expanded" +msgstr "В сообщении нет ссылки" + +#: ../src\gui\dialogs\message.py:136 ../src\gui\dialogs\message.py:410 +msgid "URL expanded" +msgstr "Ссылка развёрнута" + +#: ../src\gui\dialogs\message.py:164 ../src\gui\dialogs\message.py:219 +#: ../src\gui\dialogs\update_profile.py:51 +#: ../src\gui\dialogs\update_profile.py:88 +msgid "Upload a picture" +msgstr "Загрузить фото" + +#: ../src\gui\dialogs\message.py:167 ../src\gui\dialogs\message.py:254 +#: ../src\gui\dialogs\message.py:345 +msgid "Spelling correction" +msgstr "Проверка орфографии" + +#: ../src\gui\dialogs\message.py:171 ../src\gui\dialogs\message.py:258 +msgid "Shorten URL" +msgstr "Сократить ссылку" + +#: ../src\gui\dialogs\message.py:173 ../src\gui\dialogs\message.py:260 +#: ../src\gui\dialogs\message.py:347 +msgid "Expand URL" +msgstr "Развернуть ссылку" + +#: ../src\gui\dialogs\message.py:179 ../src\gui\dialogs\message.py:266 +msgid "Send" +msgstr "Отправить" + +#: ../src\gui\dialogs\message.py:215 ../src\gui\dialogs\message.py:226 +#: ../src\gui\dialogs\update_profile.py:84 +#: ../src\gui\dialogs\update_profile.py:95 +msgid "Discard image" +msgstr "Очистить" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" +msgstr "Файлы изображений (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Select the picture to be uploaded" +msgstr "Выберите картинку, которую желаете загрузить" + +#: ../src\gui\dialogs\message.py:248 +msgid "Recipient" +msgstr "Получатель" + +#: ../src\gui\dialogs\message.py:303 +msgid "Mention to all" +msgstr "Упомянуть всех" + +#: ../src\gui\dialogs\message.py:330 +msgid "Tweet - %i characters " +msgstr "Твит - Написано %i символов" + +#: ../src\gui\dialogs\search.py:26 +msgid "Search on Twitter" +msgstr "Поиск в твиттере" + +#: ../src\gui\dialogs\search.py:27 ../src\gui\main.py:64 +msgid "Search" +msgstr "Поиск" + +#: ../src\gui\dialogs\search.py:34 +msgid "Tweets" +msgstr "Твиты" + +#: ../src\gui\dialogs\search.py:35 +msgid "Users" +msgstr "Пользователи" + +#: ../src\gui\dialogs\show_user.py:26 +msgid "Information for %s" +msgstr "Информация о %s" + +#: ../src\gui\dialogs\show_user.py:30 +msgid "Details" +msgstr "Детали" + +#: ../src\gui\dialogs\show_user.py:39 +msgid "Go to URL" +msgstr "Перейти по ссылке" + +#: ../src\gui\dialogs\show_user.py:63 +msgid "This user does not exist on Twitter" +msgstr "Пользователя не существует" + +#: ../src\gui\dialogs\show_user.py:68 +msgid "Username: @%s\n" +msgstr "Имя пользователя: @%s\n" + +#: ../src\gui\dialogs\show_user.py:69 +msgid "Name: %s\n" +msgstr "Имя: %s\n" + +#: ../src\gui\dialogs\show_user.py:71 +msgid "Location: %s\n" +msgstr "Откуда: %s\n" + +#: ../src\gui\dialogs\show_user.py:73 +msgid "URL: %s\n" +msgstr "Сайт: %s\n" + +#: ../src\gui\dialogs\show_user.py:76 +msgid "Bio: %s\n" +msgstr "Кратко о себе: %s\n" + +#: ../src\gui\dialogs\show_user.py:77 +msgid "Yes" +msgstr "Да" + +#: ../src\gui\dialogs\show_user.py:78 +msgid "No" +msgstr "Нет" + +#: ../src\gui\dialogs\show_user.py:79 +msgid "Protected: %s\n" +msgstr "Защищённый аккаунт: %s\n" + +#: ../src\gui\dialogs\show_user.py:80 +msgid "" +"Followers: %s\n" +" Friends: %s\n" +msgstr "" +"Читающих: %s\n" +" Читаемых: %s\n" + +#: ../src\gui\dialogs\show_user.py:81 +msgid "Tweets: %s\n" +msgstr "Твитов: %s\n" + +#: ../src\gui\dialogs\show_user.py:82 +msgid "Favourites: %s" +msgstr "Твитов в избранном: %s" + +#: ../src\gui\dialogs\update_profile.py:27 +msgid "Update your profile" +msgstr "Обновить свой профиль" + +#: ../src\gui\dialogs\update_profile.py:29 +msgid "Name (20 characters maximum)" +msgstr "Имя (максимум 20 символов)" + +#: ../src\gui\dialogs\update_profile.py:35 +msgid "Location" +msgstr "Местоположение" + +#: ../src\gui\dialogs\update_profile.py:40 +msgid "Website" +msgstr "Сайт" + +#: ../src\gui\dialogs\update_profile.py:45 +msgid "Bio (160 characters maximum)" +msgstr "Кратко о себе (максимум 160 символов)" + +#: ../src\gui\dialogs\update_profile.py:53 ../src\gui\main.py:60 +#: ../src\gui\sysTrayIcon.py:38 +msgid "Update profile" +msgstr "Обновить профиль" + +#: ../src\gui\dialogs\urlList.py:26 +msgid "Select an URL" +msgstr "Выберите ссылку " + +#: ../src\gui\main.py:62 +msgid "Hide window" +msgstr "Свернуть окно" + +#: ../src\gui\main.py:70 +msgid "Edit keystrokes" +msgstr "Редактировать горячие клавиши" + +#: ../src\gui\main.py:72 ../src\gui\sysTrayIcon.py:36 +msgid "Preferences" +msgstr "Настройки" + +#: ../src\gui\main.py:74 ../src\gui\main.py:597 ../src\gui\sysTrayIcon.py:46 +msgid "Exit" +msgstr "Выйти" + +#: ../src\gui\main.py:85 +msgid "Add to favourites" +msgstr "Добавить в избранное" + +#: ../src\gui\main.py:87 ../src\keystrokeEditor\constants.py:16 +msgid "Remove from favourites" +msgstr "Удалить из избранного" + +#: ../src\gui\main.py:89 ../src\keystrokeEditor\constants.py:19 +msgid "Show tweet" +msgstr "Показать твит" + +#: ../src\gui\main.py:112 ../src\keystrokeEditor\constants.py:36 +msgid "Add to list" +msgstr "Добавить в список" + +#: ../src\gui\main.py:114 ../src\keystrokeEditor\constants.py:37 +msgid "Remove from list" +msgstr "Удалить из списка" + +#: ../src\gui\main.py:116 +msgid "View lists" +msgstr "Просмотр списков" + +#: ../src\gui\main.py:118 +msgid "Show user profile" +msgstr "Показать профиль пользователя" + +#: ../src\gui\main.py:120 +msgid "Timeline" +msgstr "Лента" + +#: ../src\gui\main.py:122 +msgid "View favourites" +msgstr "Показать избранное" + +#: ../src\gui\main.py:129 +msgid "Autoread tweets for this buffer" +msgstr "Авточтение твитов этого буфера" + +#: ../src\gui\main.py:131 +msgid "Clear buffer" +msgstr "Очистить буфер" + +#: ../src\gui\main.py:133 ../src\keystrokeEditor\constants.py:22 +msgid "Remove buffer" +msgstr "Удалить буфер" + +#: ../src\gui\main.py:138 ../src\gui\sysTrayIcon.py:42 +msgid "Documentation" +msgstr "Документация" + +#: ../src\gui\main.py:140 +msgid "What's new in this version?" +msgstr "Что нового в этой версии?" + +#: ../src\gui\main.py:142 ../src\gui\sysTrayIcon.py:44 +msgid "Check for updates" +msgstr "Проверить обновления" + +#: ../src\gui\main.py:144 ../src\issueReporter\gui.py:34 +msgid "Report an error" +msgstr "Сообщить об ошибке" + +#: ../src\gui\main.py:146 +msgid "TW Blue website" +msgstr "Сайт TW Blue" + +#: ../src\gui\main.py:148 +msgid "About TW Blue" +msgstr "О программе" + +#: ../src\gui\main.py:152 +msgid "Application" +msgstr "Приложение" + +#: ../src\gui\main.py:155 +msgid "Buffer" +msgstr "Буфер" + +#: ../src\gui\main.py:156 +msgid "Help" +msgstr "Помощь" + +#: ../src\gui\main.py:249 +msgid "Home" +msgstr "Ваша лента" + +#: ../src\gui\main.py:254 +msgid "Mentions" +msgstr "Упоминания" + +#: ../src\gui\main.py:257 +msgid "Direct messages" +msgstr "Личные сообщения" + +#: ../src\gui\main.py:260 +msgid "Sent" +msgstr "Отправленные" + +#: ../src\gui\main.py:266 +msgid "Favourites" +msgstr "Избранное" + +#: ../src\gui\main.py:278 +msgid "Friends" +msgstr "Читаемые" + +#: ../src\gui\main.py:293 +msgid "Searches" +msgstr "Поиск" + +#: ../src\gui\main.py:303 +msgid "Timelines" +msgstr "Ленты" + +#: ../src\gui\main.py:306 ../src\gui\main.py:714 +msgid "Timeline for %s" +msgstr "Лента твитов %s" + +#: ../src\gui\main.py:317 +msgid "Favourites timelines" +msgstr "Ленты избранного" + +#: ../src\gui\main.py:320 ../src\gui\main.py:745 +msgid "Favourites for %s" +msgstr "Избранное пользователя %s" + +#: ../src\gui\main.py:361 +msgid "Ready" +msgstr "Готово" + +#: ../src\gui\main.py:388 +msgid "%s favourites from %s" +msgstr "%s избранных твитов пользователя %s" + +#: ../src\gui\main.py:435 +msgid "Streams disconnected. TW Blue will try to reconnect in a minute." +msgstr "Ошибка потока. TW Blue будет пытаться возобновить соединение." + +#: ../src\gui\main.py:439 +msgid "Reconnecting streams..." +msgstr "Повторное подключение к потоку" + +#: ../src\gui\main.py:463 +msgid "search for %s" +msgstr "Поиск %s" + +#: ../src\gui\main.py:468 +msgid "search users for %s" +msgstr "Поиск пользователей %s" + +#: ../src\gui\main.py:479 ../src\gui\main.py:490 ../src\gui\main.py:509 +msgid "Select the user" +msgstr "Выберите пользователя" + +#: ../src\gui\main.py:569 +msgid "User details" +msgstr "Профиль" + +#: ../src\gui\main.py:577 +msgid "" +"Do you really want to delete this message? It will be eliminated from " +"Twitter as well." +msgstr "" +"Вы желаете удалить это сообщение? Оно также будет удалено и из твиттера." + +#: ../src\gui\main.py:597 +msgid "Do you really want to close TW Blue?" +msgstr "Вы действительно хотите выйти из TW Blue?" + +#: ../src\gui\main.py:687 +msgid "Error while adding to favourites." +msgstr "Ошибка при добавлении в избранное." + +#: ../src\gui\main.py:695 +msgid "Error while removing from favourites." +msgstr "Ошибка при удалении из избранного." + +#: ../src\gui\main.py:699 +msgid "Individual timeline" +msgstr "Лента твитов" + +#: ../src\gui\main.py:703 ../src\gui\main.py:734 +msgid "The user does not exist" +msgstr "Пользователь не существует" + +#: ../src\gui\main.py:709 +msgid "Existing timeline" +msgstr "Существующая лента" + +#: ../src\gui\main.py:709 +msgid "" +"There's currently a timeline for this user. You are not able to open another" +msgstr "Сейчас открыта лента пользователя и вы не можете открыть другую ленту." + +#: ../src\gui\main.py:718 +msgid "This user has no tweets. You can't open a timeline for this user" +msgstr "Пользователь ещё ничего не твитнул. Невозможно открыть его ленту." + +#: ../src\gui\main.py:730 +msgid "List of favourites" +msgstr "Список избранного" + +#: ../src\gui\main.py:740 +msgid "Existing list" +msgstr "Существующий лист" + +#: ../src\gui\main.py:740 +msgid "" +"There's already a list of favourites for this user. You can't create another." +msgstr "Список избранного для данного пользователя уже открыт. " + +#: ../src\gui\main.py:749 +msgid "" +"This user has no favourites. You can't create a list of favourites for this " +"user." +msgstr "Пользователь ничего не добавил в избранное." + +#: ../src\gui\main.py:791 ../src\gui\main.py:804 +msgid "%s, %s of %s" +msgstr "%s, %s из %s" + +#: ../src\gui\main.py:793 ../src\gui\main.py:806 +msgid "%s. Empty" +msgstr "%s. Пусто" + +#: ../src\gui\main.py:829 +msgid "Global mute on" +msgstr "Режим тишины включён" + +#: ../src\gui\main.py:832 +msgid "Global mute off" +msgstr "Режим тишины выключен" + +#: ../src\gui\main.py:838 +msgid "Buffer mute on" +msgstr "Звуки в буфере отключены" + +#: ../src\gui\main.py:841 +msgid "Buffer mute off" +msgstr "Звуки в буфере включены" + +#: ../src\gui\main.py:847 +msgid "The auto-reading of new tweets is enabled for this buffer" +msgstr "Авточтение новых твитов в этом буфере включено" + +#: ../src\gui\main.py:850 +msgid "The auto-reading of new tweets is disabled for this buffer" +msgstr "Авточтение новых твитов в этом буфере выключено" + +#: ../src\gui\main.py:857 +msgid "Copied" +msgstr "Скопировано" + +#: ../src\gui\main.py:868 ../src\gui\main.py:877 +msgid "%s" +msgstr "%s" + +#: ../src\gui\sysTrayIcon.py:40 +msgid "Show / hide" +msgstr "Показать / скрыть" + +#: ../src\issueReporter\gui.py:31 +msgid "always" +msgstr "Ошибка возникает всегда" + +#: ../src\issueReporter\gui.py:31 +msgid "have not tried" +msgstr "Ошибка возникала только у моих знакомых" + +#: ../src\issueReporter\gui.py:31 +msgid "random" +msgstr "Ошибка возникает часто" + +#: ../src\issueReporter\gui.py:31 +msgid "sometimes" +msgstr "Ошибка возникает иногда" + +#: ../src\issueReporter\gui.py:31 +msgid "unable to duplicate" +msgstr "Ошибка возникла один раз" + +#: ../src\issueReporter\gui.py:32 +msgid "block" +msgstr "Программа отказывалась работать" + +#: ../src\issueReporter\gui.py:32 +msgid "crash" +msgstr "Программа падала" + +#: ../src\issueReporter\gui.py:32 +msgid "feature" +msgstr "Опция была недоступна" + +#: ../src\issueReporter\gui.py:32 +msgid "major" +msgstr "Важная" + +#: ../src\issueReporter\gui.py:32 +msgid "minor" +msgstr "Незначительная" + +#: ../src\issueReporter\gui.py:32 +msgid "text" +msgstr "Ошибка связана с переводом программы" + +#: ../src\issueReporter\gui.py:32 +msgid "trivial" +msgstr "Мелкая" + +#: ../src\issueReporter\gui.py:32 +msgid "tweak" +msgstr "Неудавалось настроить программу" + +#: ../src\issueReporter\gui.py:37 +msgid "Select a category" +msgstr "Выберите категорию" + +#: ../src\issueReporter\gui.py:46 +msgid "" +"Briefly describe what happened. You will be able to thoroughly explain it " +"later" +msgstr "Кратко опишите, что произошло. Вы сможете подробно объяснить это позже" + +#: ../src\issueReporter\gui.py:56 +msgid "Here, you can describe the bug in detail" +msgstr "Здесь вы можете описать ошибку подробней" + +#: ../src\issueReporter\gui.py:66 +msgid "how often this bug happens?" +msgstr "как часто возникает данная шибка?" + +#: ../src\issueReporter\gui.py:74 +msgid "Select the importance that you think this bug has" +msgstr "На сколько эта ошибка важна" + +#: ../src\issueReporter\gui.py:82 +msgid "" +"I know that the TW Blue bug system will get my Twitter username to contact " +"me and fix the bug quickly" +msgstr "" +"Я знаю, что разработчики получат информацию о моём имени пользователя в " +"твиттере и свяжутся со мной" + +#: ../src\issueReporter\gui.py:85 +msgid "Send report" +msgstr "Отправить отчет" + +#: ../src\issueReporter\gui.py:98 +msgid "You must fill out both fields" +msgstr "Вы должны заполнить оба поля" + +#: ../src\issueReporter\gui.py:101 +msgid "" +"You need mark the checkbox to provide us your twitter username to contact to " +"you if is necessary." +msgstr "" +"Отметьте, пожалуйста, флажок, позволяющий нам узнать ваше имя пользователя в " +"твиттере. Мы не будем рассылать спам или публиковать ваши данные. Имя " +"пользователя будет использовано для связи с вами, если это потребуется. " +"Благодарим за понимание." + +#: ../src\issueReporter\gui.py:120 +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 "" +"Большое спасибо за сообщение об этой ошибке! Мы исправим её в новых " +"версиях программы. Номер ошибки - %i" + +#: ../src\issueReporter\gui.py:120 +msgid "reported" +msgstr "Передано" + +#: ../src\issueReporter\gui.py:123 +msgid "Error while reporting" +msgstr "Ошибка при отправлении отчёта об ошибке" + +#: ../src\issueReporter\gui.py:123 +msgid "" +"Something unexpected occurred while trying to report the bug. Please, try " +"again later" +msgstr "" +"Что-то неожиданное произошло при попытке сообщить об ошибке. Пожалуйста, " +"повторите попытку позже" + +#: ../src\keystrokeEditor\constants.py:4 +msgid "Go up up on the current list" +msgstr "Наверх в текущем листе" + +#: ../src\keystrokeEditor\constants.py:5 +msgid "Go down up on the current list" +msgstr "Вниз в текущем листе" + +#: ../src\keystrokeEditor\constants.py:6 +msgid "Go to the previous tab" +msgstr "Перейти на предыдущую вкладку" + +#: ../src\keystrokeEditor\constants.py:7 +msgid "Go to the next tab" +msgstr "Перейти на следующую вкладку" + +#: ../src\keystrokeEditor\constants.py:8 +msgid "Move up one tweet in the conversation" +msgstr "Подняться на один твит в беседе" + +#: ../src\keystrokeEditor\constants.py:9 +msgid "Move down one tweet in the conversation" +msgstr "Переместится вниз на один твит в беседе" + +#: ../src\keystrokeEditor\constants.py:10 +msgid "Show the graphical interface" +msgstr "Показать графический интерфейс" + +#: ../src\keystrokeEditor\constants.py:12 +msgid "Reply to a tweet" +msgstr "Ответ на твит" + +#: ../src\keystrokeEditor\constants.py:14 +msgid "Send direct message" +msgstr "Отправить личное сообщение" + +#: ../src\keystrokeEditor\constants.py:15 +msgid "Mark as favourite" +msgstr "Добавить в избранное" + +#: ../src\keystrokeEditor\constants.py:17 +msgid "Open the actions dialogue" +msgstr "Открыть меню действий" + +#: ../src\keystrokeEditor\constants.py:18 +msgid "See user details" +msgstr "Просмотреть профиль" + +#: ../src\keystrokeEditor\constants.py:20 +msgid "Quit" +msgstr "Выход" + +#: ../src\keystrokeEditor\constants.py:21 +msgid "Open user timeline" +msgstr "Открыть ленту пользователя" + +#: ../src\keystrokeEditor\constants.py:23 +msgid "" +"Open URL on the current tweet, or further information for a friend or " +"follower" +msgstr "Открыть ссылку в текущем твите или информацию о пользователе" + +#: ../src\keystrokeEditor\constants.py:24 +msgid "Attempt to play audio" +msgstr "Попытка воспроизведения аудио" + +#: ../src\keystrokeEditor\constants.py:25 +msgid "Increase volume by 5%" +msgstr "Увеличить громкость на 5%" + +#: ../src\keystrokeEditor\constants.py:26 +msgid "Decrease volume by 5%" +msgstr "Уменьшить громкость на 5%" + +#: ../src\keystrokeEditor\constants.py:27 +msgid "Go to the first element on the list" +msgstr "Перейти к первому элементу в списке" + +#: ../src\keystrokeEditor\constants.py:28 +msgid "Go to the last element on the list" +msgstr "Перейти к последнему элементу в списке" + +#: ../src\keystrokeEditor\constants.py:29 +msgid "Move 20 elements up on the current list" +msgstr "Перейти на 20 элементов вверх" + +#: ../src\keystrokeEditor\constants.py:30 +msgid "Move 20 elements down on the current list" +msgstr "Перейти на 20 элементов вниз" + +#: ../src\keystrokeEditor\constants.py:31 +msgid "Edit profile" +msgstr "Редактировать профиль" + +#: ../src\keystrokeEditor\constants.py:32 +msgid "Remove a tweet or direct message" +msgstr "Удалить твит или личное сообщение" + +#: ../src\keystrokeEditor\constants.py:33 +msgid "Empty the buffer removing all the elements" +msgstr "Удалить все элементы из буфера" + +#: ../src\keystrokeEditor\constants.py:34 +msgid "Listen the current message" +msgstr "Прослушать текущее сообщение" + +#: ../src\keystrokeEditor\constants.py:35 +msgid "Copy to clipboard" +msgstr "Скопировать в буфер обмена" + +#: ../src\keystrokeEditor\constants.py:38 +msgid "Mutes/unmutes the active buffer" +msgstr "Отключение / включение звука в текущем буфере" + +#: ../src\keystrokeEditor\constants.py:39 +msgid "Globally mute/unmute TW Blue" +msgstr "" +"включить / выключить режим тишины; (глобальное отключение всех звуков TW " +"Blue)" + +#: ../src\keystrokeEditor\constants.py:40 +msgid "toggles the automatic reading of incoming tweets in the active buffer" +msgstr "Включить / выключить авточтение твитов в текущем буфере" + +#: ../src\keystrokeEditor\constants.py:41 +msgid "Search on twitter" +msgstr "Искать в твиттере" + +#: ../src\keystrokeEditor\constants.py:42 +msgid "Shows the keystroke editor" +msgstr "Показать редактор горячих клавиш" + +#: ../src\keystrokeEditor\constants.py:43 +msgid "Show lists for a specified user" +msgstr "Показать списки конкретного пользователя" + +#: ../src\keystrokeEditor\gui.py:10 +msgid "Keystroke editor" +msgstr "Редактор горячих клавиш" + +#: ../src\keystrokeEditor\gui.py:16 +msgid "Select a keystroke to edit" +msgstr "Выберите горячую клавишу для редактирования" + +#: ../src\keystrokeEditor\gui.py:17 +msgid "Keystroke" +msgstr "Горячая клавиша" + +#: ../src\keystrokeEditor\gui.py:54 +msgid "Editing keystroke" +msgstr "Редактирование" + +#: ../src\keystrokeEditor\gui.py:61 +msgid "Control" +msgstr "Контрол" + +#: ../src\keystrokeEditor\gui.py:62 +msgid "Alt" +msgstr "Альт" + +#: ../src\keystrokeEditor\gui.py:63 +msgid "Shift" +msgstr "Шифт" + +#: ../src\keystrokeEditor\gui.py:64 +msgid "Windows" +msgstr "Виндовс" + +#: ../src\keystrokeEditor\gui.py:70 +msgid "Key" +msgstr "Клавиша" + +#: ../src\keystrokeEditor\gui.py:99 +msgid "You need to use the Windows key" +msgstr "Вы должны использовать клавишу \"виндовс\"" + +#: ../src\keystrokeEditor\gui.py:99 ../src\keystrokeEditor\gui.py:112 +msgid "Invalid keystroke" +msgstr "Неправильная комбинация клавиш" + +#: ../src\keystrokeEditor\gui.py:112 +msgid "You must provide a character for the keystroke" +msgstr "Вы должны указать букву при создании горячей клавиши" + +#: ../src\languageHandler.py:95 +msgid "User default" +msgstr "По умолчанию" + +#: ../src\sessionmanager\gui.py:19 +msgid "Session manager" +msgstr "Менеджер сессий" + +#: ../src\sessionmanager\gui.py:23 +msgid "Select a twitter account to start TW Blue" +msgstr "Выберите аккаунт, который вы хотите использовать" + +#: ../src\sessionmanager\gui.py:25 +msgid "Account" +msgstr "Аккаунт" + +#: ../src\sessionmanager\gui.py:30 +msgid "New account" +msgstr "Добавить аккаунт" + +#: ../src\sessionmanager\gui.py:67 +msgid "Account Error" +msgstr "Ошибка при создании аккаунта" + +#: ../src\sessionmanager\gui.py:67 +msgid "You need to configure an account." +msgstr "Вам нужно настроить учетную запись." + +#: ../src\sessionmanager\gui.py:83 +msgid "" +"The request for the required Twitter authorization to continue will be " +"opened on your browser. You only need to do it once. Would you like to " +"autorhise a new account now?" +msgstr "" +"Внимание! Сейчас откроется браузер и вы сможете авторизовать приложение. Вы " +"должны войти в свой твиттер, а затем нажать кнопку \"авторизовать\". На " +"открывшейся странице вы увидите информацию о результате авторизации. Вам не " +"потребуется авторизовываться каждый раз. Новая авторизация будет нужна " +"только тогда, когда вы захотите добавить дополнительный аккаунт в клиент. " + +#: ../src\sessionmanager\gui.py:94 +msgid "Invalid user token" +msgstr "Неверный маркер" + +#: ../src\sessionmanager\gui.py:94 +msgid "" +"Your access token is invalid or the authorisation has failed. Please try " +"again." +msgstr "" +"Возникла ошибка при авторизации. Кроме того, ключ доступа приложения может " +"быть неправильным. Попробуйте, пожалуйста, ещё раз." + +#: ../src\sessionmanager\gui.py:97 +msgid "Authorised account %d" +msgstr "Авторизованный аккаунт %d" + +#: ../src\twitter\buffers\indibidual.py:26 +msgid "One tweet from %s" +msgstr "Один твит от %s" + +#: ../src\twitter\buffers\indibidual.py:35 +msgid "One tweet from %s in the list %s" +msgstr "Один твит от %s в списке %s" + +#: ../src\twitter\buffers\stream.py:57 +msgid "One mention from %s " +msgstr "Одно упоминание от %s " + +#: ../src\twitter\buffers\stream.py:69 +msgid "One direct message" +msgstr "Одно личное сообщение" + +#: ../src\twitter\compose.py:22 +msgid "About a week ago" +msgstr "Неделю назад" + +#: ../src\twitter\compose.py:24 +msgid "About {} weeks ago" +msgstr "{} Недель назад" + +#: ../src\twitter\compose.py:26 +msgid "A month ago" +msgstr "Месяц назад" + +#: ../src\twitter\compose.py:28 +msgid "About {} months ago" +msgstr "{} Месяцев назад" + +#: ../src\twitter\compose.py:30 +msgid "About a year ago" +msgstr "Год назад" + +#: ../src\twitter\compose.py:32 +msgid "About {} years ago" +msgstr "{} Лет назад" + +#: ../src\twitter\compose.py:34 +msgid "About 1 day ago" +msgstr "День назад" + +#: ../src\twitter\compose.py:36 +msgid "About {} days ago" +msgstr "{} Дней назад" + +#: ../src\twitter\compose.py:38 +msgid "just now" +msgstr "Сейчас" + +#: ../src\twitter\compose.py:40 +msgid "{} seconds ago" +msgstr "{} Секунд назад" + +#: ../src\twitter\compose.py:42 +msgid "1 minute ago" +msgstr "Минуту назад" + +#: ../src\twitter\compose.py:44 +msgid "{} minutes ago" +msgstr "{} Минут назад" + +#: ../src\twitter\compose.py:46 +msgid "About 1 hour ago" +msgstr "Около часа назад" + +#: ../src\twitter\compose.py:48 +msgid "About {} hours ago" +msgstr "{} Часов назад" + +#: ../src\twitter\compose.py:52 +msgid "January" +msgstr "Января" + +#: ../src\twitter\compose.py:53 +msgid "February" +msgstr "Февраля" + +#: ../src\twitter\compose.py:54 +msgid "March" +msgstr "Марта" + +#: ../src\twitter\compose.py:55 +msgid "April" +msgstr "Апреля" + +#: ../src\twitter\compose.py:56 +msgid "May" +msgstr "Мая" + +#: ../src\twitter\compose.py:57 +msgid "June" +msgstr "Июня" + +#: ../src\twitter\compose.py:58 +msgid "July" +msgstr "Июня" + +#: ../src\twitter\compose.py:59 +msgid "August" +msgstr "Августа" + +#: ../src\twitter\compose.py:60 +msgid "September" +msgstr "Сентября" + +#: ../src\twitter\compose.py:61 +msgid "October" +msgstr "Октября" + +#: ../src\twitter\compose.py:62 +msgid "November" +msgstr "Ноября" + +#: ../src\twitter\compose.py:63 +msgid "December" +msgstr "Декабря" + +#: ../src\twitter\compose.py:66 +msgid "Sunday" +msgstr "Воскресенье" + +#: ../src\twitter\compose.py:67 +msgid "Monday" +msgstr "Понедельник" + +#: ../src\twitter\compose.py:68 +msgid "Tuesday" +msgstr "Вторник" + +#: ../src\twitter\compose.py:69 +msgid "Wednesday" +msgstr "Среда" + +#: ../src\twitter\compose.py:70 +msgid "Thursday" +msgstr "Четверг" + +#: ../src\twitter\compose.py:71 +msgid "Friday" +msgstr "Пятница" + +#: ../src\twitter\compose.py:72 +msgid "Saturday" +msgstr "Суббота" + +#: ../src\twitter\compose.py:75 +msgid "sun" +msgstr "Воскресенье" + +#: ../src\twitter\compose.py:76 +msgid "mon" +msgstr "Понедельник" + +#: ../src\twitter\compose.py:77 +msgid "tue" +msgstr "Вторник" + +#: ../src\twitter\compose.py:78 +msgid "wed" +msgstr "Среда" + +#: ../src\twitter\compose.py:79 +msgid "thu" +msgstr "СР" + +#: ../src\twitter\compose.py:80 +msgid "fri" +msgstr "Пятница" + +#: ../src\twitter\compose.py:81 +msgid "sat" +msgstr "СБ" + +#: ../src\twitter\compose.py:85 +msgid "jan" +msgstr "Январь" + +#: ../src\twitter\compose.py:86 +msgid "feb" +msgstr "Февраль" + +#: ../src\twitter\compose.py:87 +msgid "mar" +msgstr "Март" + +#: ../src\twitter\compose.py:88 +msgid "apr" +msgstr "Апрель" + +#: ../src\twitter\compose.py:89 +msgid "may" +msgstr "Май" + +#: ../src\twitter\compose.py:90 +msgid "jun" +msgstr "Июнь" + +#: ../src\twitter\compose.py:91 +msgid "jul" +msgstr "Июль" + +#: ../src\twitter\compose.py:92 +msgid "aug" +msgstr "Август" + +#: ../src\twitter\compose.py:93 +msgid "sep" +msgstr "Сентябрь" + +#: ../src\twitter\compose.py:94 +msgid "oct" +msgstr "Октябрь" + +#: ../src\twitter\compose.py:95 +msgid "nov" +msgstr "Ноябрь" + +#: ../src\twitter\compose.py:96 +msgid "dec" +msgstr "Декабрь" + +#: ../src\twitter\compose.py:152 +msgid "Dm to %s " +msgstr "Личное сообщение для %s " + +#: ../src\twitter\compose.py:185 +msgid "Unavailable" +msgstr "Недоступно" + +#: ../src\twitter\compose.py:186 +msgid "" +"%s (@%s). %s followers, %s friends, %s tweets. Last tweet on %s. Joined " +"Twitter on %s" +msgstr "" +"%s (@%s). %s читающих, %s читаемых, %s твитов. Дата последнего твита %s. " +"Регистрация в твиттере %s" + +#: ../src\twitter\compose.py:190 +msgid "You've blocked %s" +msgstr "Вы заблокировали %s" + +#: ../src\twitter\compose.py:192 +msgid "You've unblocked %s" +msgstr "Вы разблокировали %s" + +#: ../src\twitter\compose.py:195 +msgid "%s(@%s) has followed you" +msgstr "%s(@%s) теперь читает вас" + +#: ../src\twitter\compose.py:197 +msgid "You've followed %s(@%s)" +msgstr "Вы начали читать %s(@%s)" + +#: ../src\twitter\compose.py:199 +msgid "You've unfollowed %s (@%s)" +msgstr "Вы перестали читать %s (@%s)" + +#: ../src\twitter\compose.py:202 +msgid "You've added to favourites: %s, %s" +msgstr "Вы добавили в избранное: %s, %s" + +#: ../src\twitter\compose.py:204 +msgid "%s(@%s) has marked as favorite: %s" +msgstr "%s(@%s) добавил в избранное: %s" + +#: ../src\twitter\compose.py:206 +msgid "You've removed from favourites: %s, %s" +msgstr "Выудалили из избранного: %s, %s" + +#: ../src\twitter\compose.py:207 +msgid "%s(@%s) has removed from favourites: %s" +msgstr "%s(@%s) удалил из избранного: %s" + +#: ../src\twitter\compose.py:209 +msgid "You've created the list %s" +msgstr "Вы создали список %s" + +#: ../src\twitter\compose.py:211 +msgid "You've deleted the list %s" +msgstr "Вы удалили список %s" + +#: ../src\twitter\compose.py:213 +msgid "You've updated the list %s" +msgstr "Вы обновили список %s" + +#: ../src\twitter\compose.py:215 +msgid "You've added %s(@%s) to the list %s" +msgstr "Вы добавили %s(@%s) в список %s" + +#: ../src\twitter\compose.py:216 +msgid "%s(@%s) has added you to the list %s" +msgstr "Пользователь %s(@%s) добавил вас в список %s" + +#: ../src\twitter\compose.py:218 +msgid "You'be removed %s(@%s) from the list %s" +msgstr "Пользователь %s(@%s) был удалён из списка %s" + +#: ../src\twitter\compose.py:219 +msgid "%s(@%s) has removed you from the list %s" +msgstr "Пользователь %s(@%s) удалил вас из списка %s" + +#: ../src\twitter\compose.py:221 +msgid "You've subscribed to the list %s, which is owned by %s(@%s)" +msgstr "Вы подписались на список %s, который создал пользователь %s(@%s)" + +#: ../src\twitter\compose.py:222 +msgid "%s(@%s) has suscribed you to the list %s" +msgstr "Пользователь %s(@%s) подписал вас на список %s" + +#: ../src\twitter\compose.py:224 +msgid "You've unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "Вы отписались от списка %s, который создал пользователь %s(@%s)" + +#: ../src\twitter\compose.py:225 +msgid "You've been unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "Вы будете отписаны от списка %s,который создал пользователь %s(@%s)" + +#: ../src\twitter\compose.py:226 +msgid "Unknown" +msgstr "Неизвестно" + +#: ../src\twitter\compose.py:232 +msgid "No description available" +msgstr "Описание отсутствует" + +#: ../src\twitter\compose.py:236 +msgid "private" +msgstr "Личный" + +#: ../src\twitter\compose.py:237 +msgid "public" +msgstr "Публичный" + +#: ../src\twitter\twitter.py:73 +msgid "%s failed. Reason: %s" +msgstr "%s неудалось. Причина: %s" + +#: ../src\twitter\twitter.py:80 +msgid "%s succeeded." +msgstr "%s успешно." + +#: ../src\updater\update_manager.py:14 +msgid "Your TW Blue version is up to date" +msgstr "Вы используете самую последнюю версию клиента" + +#: ../src\updater\update_manager.py:14 ../src\updater\update_manager.py:27 +msgid "Update" +msgstr "Обновление" + +#: ../src\updater\update_manager.py:20 +msgid "New version for %s" +msgstr "Новая версия %s" + +#: ../src\updater\update_manager.py:20 +msgid "" +"There's a new TW Blue version available. Would you like to download it now?" +msgstr "" +"Доступна новая версия TW Blue. Вы хотите загрузить и установить её сейчас? " + +#: ../src\updater\update_manager.py:22 +msgid "Download in Progress" +msgstr "Загрузка" + +#: ../src\updater\update_manager.py:22 +msgid "Downloading the new version..." +msgstr "Обновление загружается" + +#: ../src\updater\update_manager.py:29 +msgid "Done!" +msgstr "Готово" + +#: ../src\updater\update_manager.py:29 +msgid "" +"The new TW Blue version has been downloaded and installed. Press OK to start " +"the application." +msgstr "Программа была загружена и установлена. Нажмите OK для её запуска." + +#~ msgid "Tweet - %i characters" +#~ msgstr "Твит -Написано %i символов" + +#~ msgid "%A, %B %d, %Y at %I:%M:%S %p" +#~ msgstr "%A, %B %d, %Y %I:%M:%S %p" + +#~ msgid "View members" +#~ msgstr "Список участников" + +#~ msgid "View subscribers" +#~ msgstr "Просмотреть подписчиков" + +#~ msgid "Mention to %s" +#~ msgstr "Упоминание %s" + +#~ msgid "Successfully following %s" +#~ msgstr "Теперь вы читаете твиты от %s" + +#~ msgid "%s has been reported as spam" +#~ msgstr "%s был отмечен, как спамер." + +#~ msgid "%s has been blocked" +#~ msgstr "%s был заблокирован." + +#~ msgid "User's information" +#~ msgstr "Информация о пользователе" + +#~ msgid "You've unblock %s" +#~ msgstr "Вы разблокировали %s" diff --git a/src/locales/tr/LC_MESSAGES/twblue.mo b/src/locales/tr/LC_MESSAGES/twblue.mo new file mode 100644 index 00000000..2d522c0d Binary files /dev/null and b/src/locales/tr/LC_MESSAGES/twblue.mo differ diff --git a/src/locales/tr/LC_MESSAGES/twblue.po b/src/locales/tr/LC_MESSAGES/twblue.po new file mode 100644 index 00000000..cb87033e --- /dev/null +++ b/src/locales/tr/LC_MESSAGES/twblue.po @@ -0,0 +1,2447 @@ +msgid "" +msgstr "" +"Project-Id-Version: TW Blue 0.46\n" +"POT-Creation-Date: 2014-09-07 07:44+Hora de verano central (México)\n" +"PO-Revision-Date: 2014-09-07 18:49+0200\n" +"Last-Translator: Burak \n" +"Language-Team: Burak \n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.6.7\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" + +#: ../src\extra\AudioUploader\gui.py:31 ../src\gui\dialogs\message.py:169 +#: ../src\gui\dialogs\message.py:256 +msgid "Attach audio" +msgstr "Ses ekle" + +#: ../src\extra\AudioUploader\gui.py:38 ../src\extra\AudioUploader\gui.py:146 +#: ../src\extra\AudioUploader\gui.py:156 +msgid "Play" +msgstr "Çal" + +#: ../src\extra\AudioUploader\gui.py:41 ../src\extra\AudioUploader\gui.py:75 +#: ../src\extra\AudioUploader\gui.py:80 ../src\extra\AudioUploader\gui.py:107 +msgid "Pause" +msgstr "Duraklat" + +#: ../src\extra\AudioUploader\gui.py:44 ../src\extra\AudioUploader\gui.py:103 +msgid "Record" +msgstr "Kaydet" + +#: ../src\extra\AudioUploader\gui.py:47 +msgid "Add an existing file" +msgstr "Varolan bir dosya ekle" + +#: ../src\extra\AudioUploader\gui.py:49 +msgid "Discard" +msgstr "Sesi sil" + +#: ../src\extra\AudioUploader\gui.py:52 +msgid "Upload to" +msgstr "Yükle" + +#: ../src\extra\AudioUploader\gui.py:57 +msgid "Attach" +msgstr "Ekle" + +#: ../src\extra\AudioUploader\gui.py:59 ../src\issueReporter\gui.py:88 +msgid "Cancel" +msgstr "İptal" + +#: ../src\extra\AudioUploader\gui.py:77 ../src\extra\AudioUploader\gui.py:78 +msgid "Resume" +msgstr "Devam et" + +#: ../src\extra\AudioUploader\gui.py:95 +msgid "Stop recording" +msgstr "Kaydı durdur" + +#: ../src\extra\AudioUploader\gui.py:96 +msgid "Recording" +msgstr "Kaydediliyor..." + +#: ../src\extra\AudioUploader\gui.py:101 ../src\extra\AudioUploader\gui.py:153 +msgid "Stopped" +msgstr "Durduruldu" + +#: ../src\extra\AudioUploader\gui.py:128 ../src\gui\dialogs\message.py:218 +#: ../src\gui\dialogs\update_profile.py:87 +msgid "Discarded" +msgstr "Ses silindi" + +#: ../src\extra\AudioUploader\gui.py:138 ../src\gui\buffers\base.py:303 +#: ../src\gui\buffers\base.py:315 +msgid "Playing..." +msgstr "Çalınıyor..." + +#: ../src\extra\AudioUploader\gui.py:142 +msgid "Stop" +msgstr "Dur" + +#: ../src\extra\AudioUploader\gui.py:161 +msgid "Recoding audio..." +msgstr "Ses yeniden kodlanıyor..." + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Audio Files (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" +msgstr "Ses dosyaları (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Select the audio file to be uploaded" +msgstr "Yüklenecek ses seçin" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:15 +msgid "File" +msgstr "Dosya" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:21 +msgid "Transferred" +msgstr "Transfer edildi" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:26 +msgid "Total file size" +msgstr "Toplam dosya boyutu" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:31 +msgid "Transfer rate" +msgstr "Transfer hızı" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:36 +msgid "Time left" +msgstr "Kalan zaman" + +#: ../src\extra\AudioUploader\utils.py:27 +msgid "%d day, " +msgstr "%d gün, " + +#: ../src\extra\AudioUploader\utils.py:29 +msgid "%d days, " +msgstr "%d gün, " + +#: ../src\extra\AudioUploader\utils.py:31 +msgid "%d hour, " +msgstr "%d saat, " + +#: ../src\extra\AudioUploader\utils.py:33 +msgid "%d hours, " +msgstr "%d saat, " + +#: ../src\extra\AudioUploader\utils.py:35 +msgid "%d minute, " +msgstr "%d dakika, " + +#: ../src\extra\AudioUploader\utils.py:37 +msgid "%d minutes, " +msgstr "%d dakika, " + +#: ../src\extra\AudioUploader\utils.py:39 +msgid "%s second" +msgstr "%s saniye" + +#: ../src\extra\AudioUploader\utils.py:41 +msgid "%s seconds" +msgstr "%s saniye" + +#: ../src\extra\SoundsTutorial\gui.py:11 +msgid "The tweet may contain a playable audio" +msgstr "Tweet çalınabilir ses içerebilir" + +#: ../src\extra\SoundsTutorial\gui.py:12 +msgid "A timeline has been created" +msgstr "çizelge oluşturuldu" + +#: ../src\extra\SoundsTutorial\gui.py:13 +msgid "A timeline has been deleted" +msgstr "Çizelge silindi" + +#: ../src\extra\SoundsTutorial\gui.py:14 +msgid "You've received a direct message" +msgstr "1 dm aldınız" + +#: ../src\extra\SoundsTutorial\gui.py:15 +msgid "You've sent a direct message" +msgstr "1 dm gönderdiniz" + +#: ../src\extra\SoundsTutorial\gui.py:16 +msgid "A bug has happened" +msgstr "Hata oldu" + +#: ../src\extra\SoundsTutorial\gui.py:17 +msgid "You've added a tweet to your favourites" +msgstr "bir tweeti favorilerinize eklediniz" + +#: ../src\extra\SoundsTutorial\gui.py:18 +msgid "Someone's favourites have been updated" +msgstr "Bir kişinin favorileri güncellendi" + +#: ../src\extra\SoundsTutorial\gui.py:19 +msgid "There are no more tweets to read" +msgstr "Okuyaca tweet yok" + +#: ../src\extra\SoundsTutorial\gui.py:20 +msgid "A list has a new tweet" +msgstr "Bir listede yeni bir tweet var" + +#: ../src\extra\SoundsTutorial\gui.py:21 +msgid "You can't add any more characters on the tweet" +msgstr "Tweete daha fazla karakter ekleyemezsiniz" + +#: ../src\extra\SoundsTutorial\gui.py:22 +msgid "You've been mentioned " +msgstr "Mention alındı" + +#: ../src\extra\SoundsTutorial\gui.py:23 +msgid "A new event has happened" +msgstr "Yeni olay oldu" + +#: ../src\extra\SoundsTutorial\gui.py:24 +msgid "TW Blue is ready " +msgstr "TWBlue hazır" + +#: ../src\extra\SoundsTutorial\gui.py:25 +msgid "You've replied" +msgstr "Mention gönderildi" + +#: ../src\extra\SoundsTutorial\gui.py:26 +msgid "You've retweeted" +msgstr "Retweet yaptınız" + +#: ../src\extra\SoundsTutorial\gui.py:27 +msgid "A search has been updated" +msgstr "Arama güncellendi" + +#: ../src\extra\SoundsTutorial\gui.py:28 +msgid "There's a new tweet in the main buffer" +msgstr "Ana bufferda yeni tweet var" + +#: ../src\extra\SoundsTutorial\gui.py:29 +msgid "You've sent a tweet" +msgstr "Tweet gönderdiniz" + +#: ../src\extra\SoundsTutorial\gui.py:30 +msgid "There's a new tweet in a timeline" +msgstr "Yeni çizelgede yeni tweet var" + +#: ../src\extra\SoundsTutorial\gui.py:31 +msgid "You have a new follower" +msgstr "Yeni takipçiniz var" + +#: ../src\extra\SoundsTutorial\gui.py:32 +msgid "You've turned the volume up or down" +msgstr "Sesi kıstınız veya açtınız" + +#: ../src\extra\SoundsTutorial\gui.py:36 +msgid "" +"It seems as though the currently used sound pack needs an update. %i fails " +"are still be required to use this function. Make sure to obtain the needed " +"lacking sounds or to contact with the sound pack developer." +msgstr "" +"Şu an kullandığınız ses paketinin bir güncellemeye ihtiyacı var. Lütfen " +"paketin üreticisine ulaşıp eksik sesleri edindiğinizden emin olun." + +#: ../src\extra\SoundsTutorial\gui.py:36 ../src\extra\SpellChecker\gui.py:34 +#: ../src\gui\dialogs\show_user.py:63 ../src\gui\main.py:703 +#: ../src\gui\main.py:734 ../src\issueReporter\gui.py:98 +#: ../src\issueReporter\gui.py:101 +msgid "Error" +msgstr "Hata" + +#: ../src\extra\SoundsTutorial\gui.py:38 ../src\gui\main.py:68 +msgid "Sounds tutorial" +msgstr "Ses denemesi" + +#: ../src\extra\SoundsTutorial\gui.py:41 +msgid "Press enter to listen to the sound for the selected event" +msgstr "Seçilen olay için sesi dinlemek için enter tuşuna basınız." + +#: ../src\extra\SpellChecker\gui.py:34 +msgid "" +"A bug has happened. There are no dictionaries available for the selected " +"language in TW Blue" +msgstr "" +"Bir hata oluştu. Seçilen dil için TWBlue programında sözlük bulunmamaktadır." + +#: ../src\extra\SpellChecker\gui.py:38 +msgid "Mis-spelled word" +msgstr "Yanlış yazılan sözcük" + +#: ../src\extra\SpellChecker\gui.py:43 +msgid "Context" +msgstr "içerik" + +#: ../src\extra\SpellChecker\gui.py:48 +msgid "Suggestions" +msgstr "Öneriler" + +#: ../src\extra\SpellChecker\gui.py:53 +msgid "Ignore" +msgstr "yoksay" + +#: ../src\extra\SpellChecker\gui.py:55 +msgid "Ignore all" +msgstr "Tümünü yoksay" + +#: ../src\extra\SpellChecker\gui.py:57 +msgid "Replace" +msgstr "Yerleştir" + +#: ../src\extra\SpellChecker\gui.py:59 +msgid "Replace all" +msgstr "Tümünü değiştir<" + +#: ../src\extra\SpellChecker\gui.py:78 +msgid "Mis-spelled word: %s" +msgstr "Yanlış yazılan sözcük: %s" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "Finished" +msgstr "Bitti" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "The spelling review has finished." +msgstr "Yazım hatası denetimi tamamlandı." + +#: ../src\extra\translator\gui.py:24 ../src\gui\dialogs\message.py:177 +#: ../src\gui\dialogs\message.py:264 ../src\gui\dialogs\message.py:350 +msgid "Translate message" +msgstr "Mesajı çevir" + +#: ../src\extra\translator\gui.py:27 +msgid "Source language" +msgstr "Kaynak dil" + +#: ../src\extra\translator\gui.py:30 +msgid "Target language" +msgstr "Hedef dil" + +#: ../src\extra\translator\translator.py:53 +msgid "Afrikaans" +msgstr "Afrikanca" + +#: ../src\extra\translator\translator.py:54 +msgid "Albanian" +msgstr "Bulgarca" + +#: ../src\extra\translator\translator.py:55 +msgid "Amharic" +msgstr "Amharca" + +#: ../src\extra\translator\translator.py:56 +msgid "Arabic" +msgstr "Arapça" + +#: ../src\extra\translator\translator.py:57 +msgid "Armenian" +msgstr "Ermenice" + +#: ../src\extra\translator\translator.py:58 +msgid "Azerbaijani" +msgstr "Azerice" + +#: ../src\extra\translator\translator.py:59 +msgid "Basque" +msgstr "bask" + +#: ../src\extra\translator\translator.py:60 +msgid "Belarusian" +msgstr "Belarusian" + +#: ../src\extra\translator\translator.py:61 +msgid "Bengali" +msgstr "Bengal dili" + +#: ../src\extra\translator\translator.py:62 +msgid "Bihari" +msgstr "Bihari" + +#: ../src\extra\translator\translator.py:63 +msgid "Bulgarian" +msgstr "Bulgarca" + +#: ../src\extra\translator\translator.py:64 +msgid "Burmese" +msgstr "Birmanya dili" + +#: ../src\extra\translator\translator.py:65 +msgid "Catalan" +msgstr "Katalanya dili" + +#: ../src\extra\translator\translator.py:66 +msgid "Cherokee" +msgstr "cherok" + +#: ../src\extra\translator\translator.py:67 +msgid "Chinese" +msgstr "Çince" + +#: ../src\extra\translator\translator.py:68 +msgid "Chinese_simplified" +msgstr "Çince basitleştirilmiş" + +#: ../src\extra\translator\translator.py:69 +msgid "Chinese_traditional" +msgstr "Çince geleneksel" + +#: ../src\extra\translator\translator.py:70 +msgid "Croatian" +msgstr "Hırvatça" + +#: ../src\extra\translator\translator.py:71 +msgid "Czech" +msgstr "Çekçe" + +#: ../src\extra\translator\translator.py:72 +msgid "Danish" +msgstr "Danca" + +#: ../src\extra\translator\translator.py:73 +msgid "Dhivehi" +msgstr "dhivehi" + +#: ../src\extra\translator\translator.py:74 +msgid "Dutch" +msgstr "Hollandaca" + +#: ../src\extra\translator\translator.py:75 +msgid "English" +msgstr "İngilizce" + +#: ../src\extra\translator\translator.py:76 +msgid "Esperanto" +msgstr "Esperanto dili" + +#: ../src\extra\translator\translator.py:77 +msgid "Estonian" +msgstr "Estonya dili" + +#: ../src\extra\translator\translator.py:78 +msgid "Filipino" +msgstr "Filipin dili" + +#: ../src\extra\translator\translator.py:79 +msgid "Finnish" +msgstr "Fince" + +#: ../src\extra\translator\translator.py:80 +msgid "French" +msgstr "Fransızca" + +#: ../src\extra\translator\translator.py:81 +msgid "Galician" +msgstr "galicia dili" + +#: ../src\extra\translator\translator.py:82 +msgid "Georgian" +msgstr "Gürcüce" + +#: ../src\extra\translator\translator.py:83 +msgid "German" +msgstr "almanca" + +#: ../src\extra\translator\translator.py:84 +msgid "Greek" +msgstr "Yunanca" + +#: ../src\extra\translator\translator.py:85 +msgid "Guarani" +msgstr "Guarani" + +#: ../src\extra\translator\translator.py:86 +msgid "Gujarati" +msgstr "gücerat dili" + +#: ../src\extra\translator\translator.py:87 +msgid "Hebrew" +msgstr "İbranice" + +#: ../src\extra\translator\translator.py:88 +msgid "Hindi" +msgstr "Hintçe" + +#: ../src\extra\translator\translator.py:89 +msgid "Hungarian" +msgstr "Macarca" + +#: ../src\extra\translator\translator.py:90 +msgid "Icelandic" +msgstr "izlanda dili" + +#: ../src\extra\translator\translator.py:91 +msgid "Indonesian" +msgstr "Endonezya dili" + +#: ../src\extra\translator\translator.py:92 +msgid "Inuktitut" +msgstr "inuktitut" + +#: ../src\extra\translator\translator.py:93 +msgid "Irish" +msgstr "İrlanda dili" + +#: ../src\extra\translator\translator.py:94 +msgid "Italian" +msgstr "İtalyanca" + +#: ../src\extra\translator\translator.py:95 +msgid "Japanese" +msgstr "Japonca" + +#: ../src\extra\translator\translator.py:96 +msgid "Kannada" +msgstr "kannada" + +#: ../src\extra\translator\translator.py:97 +msgid "Kazakh" +msgstr "kazakça" + +#: ../src\extra\translator\translator.py:98 +msgid "Khmer" +msgstr "khmer" + +#: ../src\extra\translator\translator.py:99 +msgid "Korean" +msgstr "Korece" + +#: ../src\extra\translator\translator.py:100 +msgid "Kurdish" +msgstr "Kürtçe" + +#: ../src\extra\translator\translator.py:101 +msgid "Kyrgyz" +msgstr "Kırgızistan dili" + +#: ../src\extra\translator\translator.py:102 +msgid "Laothian" +msgstr "laosça" + +#: ../src\extra\translator\translator.py:103 +msgid "Latvian" +msgstr "Letonya dili" + +#: ../src\extra\translator\translator.py:104 +msgid "Lithuanian" +msgstr "Litvanya dili" + +#: ../src\extra\translator\translator.py:105 +msgid "Macedonian" +msgstr "Makedonca" + +#: ../src\extra\translator\translator.py:106 +msgid "Malay" +msgstr "Malaya dili" + +#: ../src\extra\translator\translator.py:107 +msgid "Malayalam" +msgstr "Malayalam" + +#: ../src\extra\translator\translator.py:108 +msgid "Maltese" +msgstr "malta dili" + +#: ../src\extra\translator\translator.py:109 +msgid "Marathi" +msgstr "marathi" + +#: ../src\extra\translator\translator.py:110 +msgid "Mongolian" +msgstr "Moğolca" + +#: ../src\extra\translator\translator.py:111 +msgid "Nepali" +msgstr "Nepal dili" + +#: ../src\extra\translator\translator.py:112 +msgid "Norwegian" +msgstr "Norveççe" + +#: ../src\extra\translator\translator.py:113 +msgid "Oriya" +msgstr "oriya" + +#: ../src\extra\translator\translator.py:114 +msgid "Pashto" +msgstr "peştuca" + +#: ../src\extra\translator\translator.py:115 +msgid "Persian" +msgstr "Farsça" + +#: ../src\extra\translator\translator.py:116 +msgid "Polish" +msgstr "Lehçe" + +#: ../src\extra\translator\translator.py:117 +msgid "Portuguese" +msgstr "Portekizce" + +#: ../src\extra\translator\translator.py:118 +msgid "Punjabi" +msgstr "Pencap dili" + +#: ../src\extra\translator\translator.py:119 +msgid "Romanian" +msgstr "Romanca" + +#: ../src\extra\translator\translator.py:120 +msgid "Russian" +msgstr "Rusça" + +#: ../src\extra\translator\translator.py:121 +msgid "Sanskrit" +msgstr "sanskritçe" + +#: ../src\extra\translator\translator.py:122 +msgid "Serbian" +msgstr "Sırpça" + +#: ../src\extra\translator\translator.py:123 +msgid "Sindhi" +msgstr "sindhi" + +#: ../src\extra\translator\translator.py:124 +msgid "Sinhalese" +msgstr "sinhalese" + +#: ../src\extra\translator\translator.py:125 +msgid "Slovak" +msgstr "Slovakça" + +#: ../src\extra\translator\translator.py:126 +msgid "Slovenian" +msgstr "Slovan" + +#: ../src\extra\translator\translator.py:127 +msgid "Spanish" +msgstr "İspanyolca" + +#: ../src\extra\translator\translator.py:128 +msgid "Swahili" +msgstr "swahili" + +#: ../src\extra\translator\translator.py:129 +msgid "Swedish" +msgstr "İsveççe" + +#: ../src\extra\translator\translator.py:130 +msgid "Tajik" +msgstr "tajekistan dili" + +#: ../src\extra\translator\translator.py:131 +msgid "Tamil" +msgstr "tamil" + +#: ../src\extra\translator\translator.py:132 +msgid "Tagalog" +msgstr "tagalog" + +#: ../src\extra\translator\translator.py:133 +msgid "Telugu" +msgstr "telugu" + +#: ../src\extra\translator\translator.py:134 +msgid "Thai" +msgstr "tayland dili" + +#: ../src\extra\translator\translator.py:135 +msgid "Tibetan" +msgstr "tibetçe" + +#: ../src\extra\translator\translator.py:136 +msgid "Turkish" +msgstr "Türkçe" + +#: ../src\extra\translator\translator.py:137 +msgid "Ukrainian" +msgstr "Ukraynaca" + +#: ../src\extra\translator\translator.py:138 +msgid "Urdu" +msgstr "Urdu dili" + +#: ../src\extra\translator\translator.py:139 +msgid "Uzbek" +msgstr "özbekçe" + +#: ../src\extra\translator\translator.py:140 +msgid "Uighur" +msgstr "uygur" + +#: ../src\extra\translator\translator.py:141 +msgid "Vietnamese" +msgstr "Viyetnamca" + +#: ../src\extra\translator\translator.py:142 +msgid "Welsh" +msgstr "galce" + +#: ../src\extra\translator\translator.py:143 +msgid "Yiddish" +msgstr "eskenazi dili" + +#: ../src\extra\translator\translator.py:150 +msgid "autodetect" +msgstr "Otomatik algılama" + +#: ../src\gui\buffers\base.py:54 +msgid "Client" +msgstr "İstemci" + +#: ../src\gui\buffers\base.py:54 +msgid "Text" +msgstr "Metin" + +#: ../src\gui\buffers\base.py:54 ../src\gui\buffers\events.py:57 +msgid "Date" +msgstr "Tarih" + +#: ../src\gui\buffers\base.py:54 ../src\gui\buffers\people.py:39 +#: ../src\gui\buffers\user_searches.py:31 ../src\gui\dialogs\utils.py:36 +#: ../src\gui\main.py:154 +msgid "User" +msgstr "Kullanıcı" + +#: ../src\gui\buffers\base.py:73 ../src\gui\buffers\base.py:192 +#: ../src\gui\buffers\events.py:58 ../src\gui\buffers\events.py:74 +#: ../src\gui\dialogs\message.py:332 ../src\gui\main.py:79 +#: ../src\gui\main.py:153 ../src\gui\sysTrayIcon.py:34 +msgid "Tweet" +msgstr "Tweet" + +#: ../src\gui\buffers\base.py:75 ../src\gui\buffers\base.py:204 +#: ../src\gui\main.py:83 ../src\keystrokeEditor\constants.py:13 +msgid "Retweet" +msgstr "Retweet" + +#: ../src\gui\buffers\base.py:77 ../src\gui\main.py:81 +msgid "Reply" +msgstr "Yanıt" + +#: ../src\gui\buffers\base.py:79 ../src\gui\main.py:110 +msgid "Direct message" +msgstr "Dm" + +#: ../src\gui\buffers\base.py:92 +msgid "Do you really want to delete this timeline?" +msgstr "Bu çizelgeyi silmek istediğinizdden emin misiniz?" + +#: ../src\gui\buffers\base.py:92 ../src\gui\buffers\favourites.py:41 +#: ../src\gui\buffers\lists.py:46 ../src\gui\buffers\trends.py:41 +#: ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Attention" +msgstr "Dikkat" + +#: ../src\gui\buffers\base.py:104 +msgid "This buffer is not a timeline; it can't be deleted." +msgstr "Bu bir çizelge değildir, silinemez." + +#: ../src\gui\buffers\base.py:184 ../src\gui\buffers\dm.py:44 +#: ../src\gui\buffers\people.py:54 +msgid "Direct message to %s" +msgstr "%s Kişisine dm" + +#: ../src\gui\buffers\base.py:192 ../src\gui\buffers\events.py:74 +msgid "Write the tweet here" +msgstr "Tweetinizi yazın" + +#: ../src\gui\buffers\base.py:204 +msgid "Would you like to add a comment to this tweet?" +msgstr "Bu tweete yorum eklemek ister misiniz?" + +#: ../src\gui\buffers\base.py:207 +msgid "Add your comment to the tweet" +msgstr "Tweete yorumunuzu ekleyin" + +#: ../src\gui\buffers\base.py:223 ../src\gui\buffers\people.py:62 +msgid "Reply to %s" +msgstr "%s Kişisine yanıt" + +#: ../src\gui\buffers\base.py:268 +msgid "Opening URL..." +msgstr "Adres açılıyor... " + +#: ../src\gui\buffers\base.py:285 ../src\gui\buffers\events.py:118 +msgid "" +"Do you really want to empty this buffer? It's tweets will be removed from " +"the list but not from Twitter" +msgstr "" +"Boşaltmak istiyor musunuz? Tweetler listeden kaldırılacaktır, twitter " +"etkilenmeyecektir." + +#: ../src\gui\buffers\base.py:285 ../src\gui\buffers\events.py:118 +msgid "Empty buffer" +msgstr "bufferi boşalt" + +#: ../src\gui\buffers\base.py:290 ../src\gui\buffers\events.py:122 +msgid "Do you really want to delete this message?" +msgstr "Bu mesajı gerçekten silmek istiyor musunuz?" + +#: ../src\gui\buffers\base.py:290 ../src\gui\buffers\events.py:122 +#: ../src\gui\dialogs\lists.py:107 ../src\gui\main.py:91 +#: ../src\gui\main.py:577 +msgid "Delete" +msgstr "sil" + +#: ../src\gui\buffers\base.py:310 ../src\gui\buffers\base.py:321 +msgid "Unable to play audio." +msgstr "Ses çalınamıyor" + +#: ../src\gui\buffers\base.py:312 +msgid "Audio stopped." +msgstr "Ses durduruldu." + +#: ../src\gui\buffers\events.py:40 +msgid "Empty" +msgstr "Boş" + +#: ../src\gui\buffers\events.py:57 +msgid "Event" +msgstr "Olay" + +#: ../src\gui\buffers\events.py:60 +msgid "Remove event" +msgstr "Olayı kaldır" + +#: ../src\gui\buffers\favourites.py:41 +msgid "Do you really want to delete this favourites timeline?" +msgstr "Bu favori çizelgesini gerçekten silmek istiyor musunuz?" + +#: ../src\gui\buffers\lists.py:46 ../src\gui\dialogs\lists.py:107 +msgid "Do you really want to delete this list?" +msgstr "Bu listeyi gerçekten silmek istediğinize emin misiniz?" + +#: ../src\gui\buffers\panels.py:27 +msgid "Announce" +msgstr "söyle" + +#: ../src\gui\buffers\people.py:44 +msgid "Mention" +msgstr "mention" + +#: ../src\gui\buffers\trends.py:41 ../src\gui\buffers\tweet_searches.py:41 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Do you really want to delete this search term?" +msgstr "Bu arama terimini gerçekten silmek istediğinize emin misiniz?" + +#: ../src\gui\dialogs\configuration.py:39 +msgid "Language" +msgstr "Dil" + +#: ../src\gui\dialogs\configuration.py:53 +msgid "Relative times" +msgstr "Relative times" + +#: ../src\gui\dialogs\configuration.py:57 +msgid "Activate Sapi5 when any other screen reader is not being run" +msgstr "Bir ekran okuyucu çalışmadığında sapi 5'i etkinleştir" + +#: ../src\gui\dialogs\configuration.py:60 +msgid "Activate the auto-start of the invisible interface" +msgstr "Görünmez arayüzü otomatik olarak başlat" + +#: ../src\gui\dialogs\configuration.py:64 +msgid "" +"API calls when the stream is started (One API call equals to 200 tweetts, " +"two API calls equals 400 tweets, etc):" +msgstr "" +"Bağlantı başladığında kullanılacak API çağrısı (1 API çağrısı=200 tweet, 2 " +"API çağrısı=400 tweet, vb.):" + +#: ../src\gui\dialogs\configuration.py:72 +msgid "Items on each API call" +msgstr "Her API çağrısındaki öğeler" + +#: ../src\gui\dialogs\configuration.py:79 +msgid "" +"Inverted buffers: The newest tweets will be shown at the beginning of the " +"lists while the oldest at the end" +msgstr "" +"Bufferleri ters çevir: Yeni tweetler başta, eski tweetler sonda gösterilir" + +#: ../src\gui\dialogs\configuration.py:94 +msgid "Show followers" +msgstr "Takipçileri göster" + +#: ../src\gui\dialogs\configuration.py:97 +msgid "Show friends" +msgstr "Arkadaşları göster" + +#: ../src\gui\dialogs\configuration.py:100 +msgid "Show favourites" +msgstr "Favorileri göster" + +#: ../src\gui\dialogs\configuration.py:103 +msgid "Show blocked users" +msgstr "Engellenmiş kullanıcıları görüntüle" + +#: ../src\gui\dialogs\configuration.py:106 +msgid "Show muted users" +msgstr "Susturulmuş kullanıcıları göster" + +#: ../src\gui\dialogs\configuration.py:109 +msgid "Show events" +msgstr "Olayları göster" + +#: ../src\gui\dialogs\configuration.py:119 +#: ../src\gui\dialogs\configuration.py:267 +msgid "Ignored clients" +msgstr "Yoksayılan istemciler" + +#: ../src\gui\dialogs\configuration.py:125 +msgid "Add client" +msgstr "İstemci ekle" + +#: ../src\gui\dialogs\configuration.py:126 +msgid "Remove client" +msgstr "İstemci kaldır" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Add a new ignored client" +msgstr "Yeni yoksayılmış istemci ekle" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Enter the name of the client here" +msgstr "İstemci adını yazın" + +#: ../src\gui\dialogs\configuration.py:154 +msgid "Volume" +msgstr "Ses yüksekliği" + +#: ../src\gui\dialogs\configuration.py:163 +msgid "Global mute" +msgstr "Tümünü sustur" + +#: ../src\gui\dialogs\configuration.py:167 +msgid "Output device" +msgstr "Çıkış cihazı" + +#: ../src\gui\dialogs\configuration.py:176 +msgid "Input device" +msgstr "Giriş cihazı" + +#: ../src\gui\dialogs\configuration.py:184 +msgid "" +"If you've got a SndUp account, enter your API Key here. Whether the API Key " +"is wrong, the App will fail to upload anything to the server. Whether " +"there's no API Key here, then the audio files will be uploaded anonimously" +msgstr "" +"SNDUp hesabınız varsa API anahtarınızı buraya yazın. API anahtarınız " +"yanlışsa, dosyanız sunucuya yüklenemeyecektir. Eğer API anahtarınız yoksa, " +"dosya isimsiz olarak yüklenecektir." + +#: ../src\gui\dialogs\configuration.py:197 +msgid "Sound pack" +msgstr "Ses paketi" + +#: ../src\gui\dialogs\configuration.py:213 +#: ../src\gui\dialogs\configuration.py:237 +msgid "Unlink your Dropbox account" +msgstr "Dropbox hesssabınızın bağlantısını kesin" + +#: ../src\gui\dialogs\configuration.py:215 +#: ../src\gui\dialogs\configuration.py:232 +#: ../src\gui\dialogs\configuration.py:240 +#: ../src\gui\dialogs\configuration.py:244 +#: ../src\gui\dialogs\configuration.py:251 +msgid "Link your Dropbox account" +msgstr "Dropbox hesabınızı bağlayın" + +#: ../src\gui\dialogs\configuration.py:225 +msgid "" +"The authorisation request will be shown on your browser. Copy the code tat " +"Dropbox will provide and, in the text box that will appear on TW Blue, paste " +"it. This code is necessary to continue. You only need to do it once." +msgstr "" +"Kod onaylama sayfası açılacaktır. Dropboxun sunduğu kodu alıp aşağıdaki " +"kutuya yapıştırın. Bunu bir kez yapmanız yeterli olacaktır." + +#: ../src\gui\dialogs\configuration.py:225 ../src\sessionmanager\gui.py:83 +msgid "Authorisation" +msgstr "İzin" + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Enter the code here." +msgstr "Kodu girin." + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Verification code" +msgstr "Doğrulama kodu" + +#: ../src\gui\dialogs\configuration.py:239 +msgid "Error during authorisation. Try again later." +msgstr "İzin hatası. Daha sonra yeniden deneyin" + +#: ../src\gui\dialogs\configuration.py:239 ../src\gui\main.py:718 +#: ../src\gui\main.py:749 +msgid "Error!" +msgstr "Hata!" + +#: ../src\gui\dialogs\configuration.py:258 +msgid "TW Blue preferences" +msgstr "TWBlue ayarları" + +#: ../src\gui\dialogs\configuration.py:262 ../src\issueReporter\gui.py:30 +msgid "General" +msgstr "Genel" + +#: ../src\gui\dialogs\configuration.py:265 +msgid "Show other buffers" +msgstr "Diğer bufferleri göster" + +#: ../src\gui\dialogs\configuration.py:269 +msgid "Sound" +msgstr "ses" + +#: ../src\gui\dialogs\configuration.py:271 +msgid "Audio Services" +msgstr "Ses hizmetleri" + +#: ../src\gui\dialogs\configuration.py:274 +msgid "Save" +msgstr "Kaydet" + +#: ../src\gui\dialogs\configuration.py:277 ../src\gui\dialogs\follow.py:64 +#: ../src\gui\dialogs\message.py:182 ../src\gui\dialogs\message.py:269 +#: ../src\gui\dialogs\message.py:352 ../src\gui\dialogs\search.py:42 +#: ../src\gui\dialogs\show_user.py:42 ../src\gui\dialogs\update_profile.py:56 +#: ../src\gui\dialogs\utils.py:42 ../src\keystrokeEditor\gui.py:26 +msgid "Close" +msgstr "Kapat" + +#: ../src\gui\dialogs\configuration.py:290 ../src\gui\main.py:272 +msgid "Followers" +msgstr "Takipçiler" + +#: ../src\gui\dialogs\configuration.py:304 +msgid "friends" +msgstr "Arkadaşlar" + +#: ../src\gui\dialogs\configuration.py:318 +msgid "Favorites" +msgstr "Favoriler" + +#: ../src\gui\dialogs\configuration.py:332 ../src\gui\main.py:290 +msgid "Events" +msgstr "Olaylar" + +#: ../src\gui\dialogs\configuration.py:343 ../src\gui\main.py:282 +msgid "Blocked users" +msgstr "Engellenmiş kullanıcılar" + +#: ../src\gui\dialogs\configuration.py:357 ../src\gui\main.py:286 +msgid "Muted users" +msgstr "susturulmuş kullanıcılar" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "Restart TW Blue" +msgstr "TWBlue programını yeniden başlat" + +#: ../src\gui\dialogs\configuration.py:415 +msgid "" +"The application requires to be restarted to save these changes. Press OK to " +"do it now." +msgstr "" +"Program ayarların etkili olabilmesi için yeniden başlatacaktır. Tamama " +"tıklayarak programı yeniden başlatabilirsiniz." + +#: ../src\gui\dialogs\follow.py:33 ../src\gui\dialogs\follow.py:43 +#: ../src\keystrokeEditor\gui.py:17 +msgid "Action" +msgstr "Eylem" + +#: ../src\gui\dialogs\follow.py:44 ../src\gui\main.py:96 +msgid "Follow" +msgstr "Takip et" + +#: ../src\gui\dialogs\follow.py:45 ../src\gui\main.py:98 +msgid "Unfollow" +msgstr "Takibi bırak" + +#: ../src\gui\dialogs\follow.py:46 ../src\gui\main.py:100 +#: ../src\gui\main.py:127 +msgid "Mute" +msgstr "Sustur" + +#: ../src\gui\dialogs\follow.py:47 ../src\gui\main.py:102 +msgid "Unmute" +msgstr "Susturmayı kaldır" + +#: ../src\gui\dialogs\follow.py:48 ../src\gui\main.py:106 +msgid "Block" +msgstr "Engelle" + +#: ../src\gui\dialogs\follow.py:49 ../src\gui\main.py:108 +msgid "Unblock" +msgstr "Engeli kaldır" + +#: ../src\gui\dialogs\follow.py:50 ../src\gui\main.py:104 +msgid "Report as spam" +msgstr "Spam olarak raporla" + +#: ../src\gui\dialogs\follow.py:61 ../src\gui\dialogs\search.py:40 +#: ../src\gui\dialogs\utils.py:39 ../src\keystrokeEditor\gui.py:76 +msgid "OK" +msgstr "Tamam" + +#: ../src\gui\dialogs\follow.py:101 +msgid "You've muted to %s" +msgstr "%s kişisini susturdunuz" + +#: ../src\gui\dialogs\follow.py:115 +msgid "You've unmuted to %s" +msgstr "%s kişisinin susturmasını kaldırdınız" + +#: ../src\gui\dialogs\lists.py:36 ../src\gui\main.py:66 +msgid "Lists manager" +msgstr "Liste yöneticisi" + +#: ../src\gui\dialogs\lists.py:38 ../src\gui\main.py:309 +msgid "Lists" +msgstr "Listeler" + +#: ../src\gui\dialogs\lists.py:39 +msgid "List" +msgstr "Liste" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Members" +msgstr "Üyeler" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Owner" +msgstr "sahip" + +#: ../src\gui\dialogs\lists.py:39 +msgid "mode" +msgstr "mod" + +#: ../src\gui\dialogs\lists.py:39 ../src\gui\dialogs\lists.py:181 +msgid "Description" +msgstr "Açıklama" + +#: ../src\gui\dialogs\lists.py:44 ../src\gui\dialogs\lists.py:173 +msgid "Create a new list" +msgstr "Yeni liste oluştur" + +#: ../src\gui\dialogs\lists.py:46 ../src\keystrokeEditor\gui.py:22 +msgid "Edit" +msgstr "Düzenle" + +#: ../src\gui\dialogs\lists.py:48 ../src\gui\dialogs\lists.py:235 +msgid "Remove" +msgstr "Kaldır" + +#: ../src\gui\dialogs\lists.py:50 +msgid "Open in buffer" +msgstr "Bufferda aç" + +#: ../src\gui\dialogs\lists.py:125 +msgid "List opened" +msgstr "Liste açıldı" + +#: ../src\gui\dialogs\lists.py:127 +msgid "This list is arready opened." +msgstr "Bu liste zaten açılmış." + +#: ../src\gui\dialogs\lists.py:130 ../src\gui\main.py:312 +msgid "List for %s" +msgstr "%s için liste" + +#: ../src\gui\dialogs\lists.py:148 +msgid "Viewing lists for %s" +msgstr "%s için listeler görüntüleniyor" + +#: ../src\gui\dialogs\lists.py:149 +msgid "Subscribe" +msgstr "Katıl" + +#: ../src\gui\dialogs\lists.py:150 +msgid "Unsubscribe" +msgstr "Katılmaktan vazgeç" + +#: ../src\gui\dialogs\lists.py:176 +msgid "Name (20 characters maximun)" +msgstr "ad (en fazla 20 harf)" + +#: ../src\gui\dialogs\lists.py:186 +msgid "Mode" +msgstr "Mod" + +#: ../src\gui\dialogs\lists.py:187 +msgid "Public" +msgstr "Herkese açık" + +#: ../src\gui\dialogs\lists.py:188 +msgid "Private" +msgstr "Özel" + +#: ../src\gui\dialogs\lists.py:208 +msgid "Editing the list %s" +msgstr "%s listesi düzenleniyor" + +#: ../src\gui\dialogs\lists.py:219 +msgid "Select a list to add the user" +msgstr "Kullanıcıyı eklemek için liste seçin" + +#: ../src\gui\dialogs\lists.py:220 +msgid "Add" +msgstr "Ekle" + +#: ../src\gui\dialogs\lists.py:234 +msgid "Select a list to remove the user" +msgstr "Kullanıcıyı kaldırmak için bir liste seçin" + +#: ../src\gui\dialogs\message.py:42 ../src\keystrokeEditor\constants.py:11 +msgid "New tweet" +msgstr "Yeni tweet" + +#: ../src\gui\dialogs\message.py:76 +msgid "Attaching..." +msgstr "Ekleniyor..." + +#: ../src\gui\dialogs\message.py:77 +msgid "Uploading..." +msgstr "Yükleniyor..." + +#: ../src\gui\dialogs\message.py:96 +msgid "Unable to upload the audio" +msgstr "Ses yüklenemiyor" + +#: ../src\gui\dialogs\message.py:110 ../src\gui\dialogs\message.py:395 +msgid "Translated" +msgstr "Mesaj çevirildi" + +#: ../src\gui\dialogs\message.py:122 +msgid "There's no URL to be shortened" +msgstr "Kısaltılacak adres yok" + +#: ../src\gui\dialogs\message.py:125 +msgid "URL shortened" +msgstr "Adres kısaltıldı" + +#: ../src\gui\dialogs\message.py:133 ../src\gui\dialogs\message.py:407 +msgid "There's no URL to be expanded" +msgstr "Genişletilecek adres yok" + +#: ../src\gui\dialogs\message.py:136 ../src\gui\dialogs\message.py:410 +msgid "URL expanded" +msgstr "Adres genişletildi" + +#: ../src\gui\dialogs\message.py:164 ../src\gui\dialogs\message.py:219 +#: ../src\gui\dialogs\update_profile.py:51 +#: ../src\gui\dialogs\update_profile.py:88 +msgid "Upload a picture" +msgstr "Resim yükle" + +#: ../src\gui\dialogs\message.py:167 ../src\gui\dialogs\message.py:254 +#: ../src\gui\dialogs\message.py:345 +msgid "Spelling correction" +msgstr "Yazım hatası denetimi" + +#: ../src\gui\dialogs\message.py:171 ../src\gui\dialogs\message.py:258 +msgid "Shorten URL" +msgstr "Adresi kısalt" + +#: ../src\gui\dialogs\message.py:173 ../src\gui\dialogs\message.py:260 +#: ../src\gui\dialogs\message.py:347 +msgid "Expand URL" +msgstr "Adresi genişlet" + +#: ../src\gui\dialogs\message.py:179 ../src\gui\dialogs\message.py:266 +msgid "Send" +msgstr "Gönder" + +#: ../src\gui\dialogs\message.py:215 ../src\gui\dialogs\message.py:226 +#: ../src\gui\dialogs\update_profile.py:84 +#: ../src\gui\dialogs\update_profile.py:95 +msgid "Discard image" +msgstr "Resmi sil" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" +msgstr "Resim dosyaları (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Select the picture to be uploaded" +msgstr "Yüklenecek resim seçin" + +#: ../src\gui\dialogs\message.py:248 +msgid "Recipient" +msgstr "Alıcı" + +#: ../src\gui\dialogs\message.py:303 +msgid "Mention to all" +msgstr "Konuşmadaki tüm kullanıcılara mention at" + +#: ../src\gui\dialogs\message.py:330 +msgid "Tweet - %i characters " +msgstr "Yeni tweet- %i karakter" + +#: ../src\gui\dialogs\search.py:26 +msgid "Search on Twitter" +msgstr "Twitter'da ara" + +#: ../src\gui\dialogs\search.py:27 ../src\gui\main.py:64 +msgid "Search" +msgstr "ara" + +#: ../src\gui\dialogs\search.py:34 +msgid "Tweets" +msgstr "Tweetler" + +#: ../src\gui\dialogs\search.py:35 +msgid "Users" +msgstr "Kullanıcılar" + +#: ../src\gui\dialogs\show_user.py:26 +msgid "Information for %s" +msgstr "%s için kullanıcı bilgisi" + +#: ../src\gui\dialogs\show_user.py:30 +msgid "Details" +msgstr "Ayrıntılar" + +#: ../src\gui\dialogs\show_user.py:39 +msgid "Go to URL" +msgstr "Adrese git" + +#: ../src\gui\dialogs\show_user.py:63 +msgid "This user does not exist on Twitter" +msgstr "Bu kullanıcı twitterda bulunmamaktadır" + +#: ../src\gui\dialogs\show_user.py:68 +msgid "Username: @%s\n" +msgstr "Kullanıcı adı: @%s\n" + +#: ../src\gui\dialogs\show_user.py:69 +msgid "Name: %s\n" +msgstr "Ad: %s\n" + +#: ../src\gui\dialogs\show_user.py:71 +msgid "Location: %s\n" +msgstr "Yer: %s\n" + +#: ../src\gui\dialogs\show_user.py:73 +msgid "URL: %s\n" +msgstr "Adres: %s\n" + +#: ../src\gui\dialogs\show_user.py:76 +msgid "Bio: %s\n" +msgstr "Bio: %s\n" + +#: ../src\gui\dialogs\show_user.py:77 +msgid "Yes" +msgstr "Evet" + +#: ../src\gui\dialogs\show_user.py:78 +msgid "No" +msgstr "Hayır" + +#: ../src\gui\dialogs\show_user.py:79 +msgid "Protected: %s\n" +msgstr "Korunmuş: %s\n" + +#: ../src\gui\dialogs\show_user.py:80 +msgid "" +"Followers: %s\n" +" Friends: %s\n" +msgstr "" +"Takipçiler: %s\n" +" Arkadaşlar: %s\n" + +#: ../src\gui\dialogs\show_user.py:81 +msgid "Tweets: %s\n" +msgstr "Tweetler: %s\n" + +#: ../src\gui\dialogs\show_user.py:82 +msgid "Favourites: %s" +msgstr "Favoriler: %s" + +#: ../src\gui\dialogs\update_profile.py:27 +msgid "Update your profile" +msgstr "Profilinizi güncelleyin" + +#: ../src\gui\dialogs\update_profile.py:29 +msgid "Name (20 characters maximum)" +msgstr "ad (20 harf)" + +#: ../src\gui\dialogs\update_profile.py:35 +msgid "Location" +msgstr "Yer" + +#: ../src\gui\dialogs\update_profile.py:40 +msgid "Website" +msgstr "Site adresi" + +#: ../src\gui\dialogs\update_profile.py:45 +msgid "Bio (160 characters maximum)" +msgstr "Bio (en fazla 160 karakter)" + +#: ../src\gui\dialogs\update_profile.py:53 ../src\gui\main.py:60 +#: ../src\gui\sysTrayIcon.py:38 +msgid "Update profile" +msgstr "Profili güncelle" + +#: ../src\gui\dialogs\urlList.py:26 +msgid "Select an URL" +msgstr "bir adres seçin" + +#: ../src\gui\main.py:62 +msgid "Hide window" +msgstr "Pencereyi gizle" + +#: ../src\gui\main.py:70 +msgid "Edit keystrokes" +msgstr "Kısayolları düzenle" + +#: ../src\gui\main.py:72 ../src\gui\sysTrayIcon.py:36 +msgid "Preferences" +msgstr "Ayarlar" + +#: ../src\gui\main.py:74 ../src\gui\main.py:597 ../src\gui\sysTrayIcon.py:46 +msgid "Exit" +msgstr "Çıkış" + +#: ../src\gui\main.py:85 +msgid "Add to favourites" +msgstr "Favorilere ekle" + +#: ../src\gui\main.py:87 ../src\keystrokeEditor\constants.py:16 +msgid "Remove from favourites" +msgstr "Favorilerden kaldır" + +#: ../src\gui\main.py:89 ../src\keystrokeEditor\constants.py:19 +msgid "Show tweet" +msgstr "Tweet göster" + +#: ../src\gui\main.py:112 ../src\keystrokeEditor\constants.py:36 +msgid "Add to list" +msgstr "Listeye ekle" + +#: ../src\gui\main.py:114 ../src\keystrokeEditor\constants.py:37 +msgid "Remove from list" +msgstr "Listeden kaldır" + +#: ../src\gui\main.py:116 +msgid "View lists" +msgstr "Listeleri görüntüle" + +#: ../src\gui\main.py:118 +msgid "Show user profile" +msgstr "Kullanıcı profilini göster" + +#: ../src\gui\main.py:120 +msgid "Timeline" +msgstr "Çizelge" + +#: ../src\gui\main.py:122 +msgid "View favourites" +msgstr "Favorileri göster" + +#: ../src\gui\main.py:129 +msgid "Autoread tweets for this buffer" +msgstr "Bu bufferin tweetlerini otomatik olarak oku" + +#: ../src\gui\main.py:131 +msgid "Clear buffer" +msgstr "Bufferi temizle" + +#: ../src\gui\main.py:133 ../src\keystrokeEditor\constants.py:22 +msgid "Remove buffer" +msgstr "Bufferi kaldır" + +#: ../src\gui\main.py:138 ../src\gui\sysTrayIcon.py:42 +msgid "Documentation" +msgstr "Dökümantasyon" + +#: ../src\gui\main.py:140 +msgid "What's new in this version?" +msgstr "Bu versiyondaki yenilikler" + +#: ../src\gui\main.py:142 ../src\gui\sysTrayIcon.py:44 +msgid "Check for updates" +msgstr "Güncellemeleri denetle" + +#: ../src\gui\main.py:144 ../src\issueReporter\gui.py:34 +msgid "Report an error" +msgstr "Hata raporla" + +#: ../src\gui\main.py:146 +msgid "TW Blue website" +msgstr "TWBlue web sitesi" + +#: ../src\gui\main.py:148 +msgid "About TW Blue" +msgstr "TWBlue hakkında" + +#: ../src\gui\main.py:152 +msgid "Application" +msgstr "Uygulama" + +#: ../src\gui\main.py:155 +msgid "Buffer" +msgstr "buffer" + +#: ../src\gui\main.py:156 +msgid "Help" +msgstr "Yardım" + +#: ../src\gui\main.py:249 +msgid "Home" +msgstr "Anasayfa" + +#: ../src\gui\main.py:254 +msgid "Mentions" +msgstr "Yanıtlar" + +#: ../src\gui\main.py:257 +msgid "Direct messages" +msgstr "DM'ler" + +#: ../src\gui\main.py:260 +msgid "Sent" +msgstr "Gönderilmiş tweetler" + +#: ../src\gui\main.py:266 +msgid "Favourites" +msgstr "Favoriler" + +#: ../src\gui\main.py:278 +msgid "Friends" +msgstr "Arkadaşlar" + +#: ../src\gui\main.py:293 +msgid "Searches" +msgstr "aramalar" + +#: ../src\gui\main.py:303 +msgid "Timelines" +msgstr "çizelgeler" + +#: ../src\gui\main.py:306 ../src\gui\main.py:714 +msgid "Timeline for %s" +msgstr "%s için çizelge" + +#: ../src\gui\main.py:317 +msgid "Favourites timelines" +msgstr "Favori çizelgeleri" + +#: ../src\gui\main.py:320 ../src\gui\main.py:745 +msgid "Favourites for %s" +msgstr "%s kişisi için favoriler" + +#: ../src\gui\main.py:361 +msgid "Ready" +msgstr "TWBlue Hazır" + +#: ../src\gui\main.py:388 +msgid "%s favourites from %s" +msgstr "%s favourites from %s" + +#: ../src\gui\main.py:435 +msgid "Streams disconnected. TW Blue will try to reconnect in a minute." +msgstr "" +"Bağlantı kesildi. TWBlue bir dakika içinde yeniden bağlanmayı deneyecek." + +#: ../src\gui\main.py:439 +msgid "Reconnecting streams..." +msgstr "Bağlanılıyor..." + +#: ../src\gui\main.py:463 +msgid "search for %s" +msgstr "%s kişisi için arama" + +#: ../src\gui\main.py:468 +msgid "search users for %s" +msgstr "%s için kullanıcı ara" + +#: ../src\gui\main.py:479 ../src\gui\main.py:490 ../src\gui\main.py:509 +msgid "Select the user" +msgstr "Kullanıcı seçin" + +#: ../src\gui\main.py:569 +msgid "User details" +msgstr "Kullanıcı Ayrıntıları" + +#: ../src\gui\main.py:577 +msgid "" +"Do you really want to delete this message? It will be eliminated from " +"Twitter as well." +msgstr "" +"Mesajı silmek istediğinizden emin misiniz? Mesaj twitterdan da silinecektir." + +#: ../src\gui\main.py:597 +msgid "Do you really want to close TW Blue?" +msgstr "TWBlue programını kapatmak istiyor musunuz?" + +#: ../src\gui\main.py:687 +msgid "Error while adding to favourites." +msgstr "Favorilere eklerken hata oluştu." + +#: ../src\gui\main.py:695 +msgid "Error while removing from favourites." +msgstr "Favorilerden kaldırırken hata oluştu." + +#: ../src\gui\main.py:699 +msgid "Individual timeline" +msgstr "Kullanıcının çizelgesi" + +#: ../src\gui\main.py:703 ../src\gui\main.py:734 +msgid "The user does not exist" +msgstr "Kullanıcı bulunamadı" + +#: ../src\gui\main.py:709 +msgid "Existing timeline" +msgstr "Varolan çizelge" + +#: ../src\gui\main.py:709 +msgid "" +"There's currently a timeline for this user. You are not able to open another" +msgstr "Bu kullanıcı için zaten bir çizelge var. Bir tane daha açamazsınız" + +#: ../src\gui\main.py:718 +msgid "This user has no tweets. You can't open a timeline for this user" +msgstr "Bu kullanıcının tweeti yok. Bu kullanıcı için çizelge açamazsınız." + +#: ../src\gui\main.py:730 +msgid "List of favourites" +msgstr "Favori listesi" + +#: ../src\gui\main.py:740 +msgid "Existing list" +msgstr "Varolan liste" + +#: ../src\gui\main.py:740 +msgid "" +"There's already a list of favourites for this user. You can't create another." +msgstr "" +"Bu kullanıcı için zaten bir favori listesi var. bir tane daha açamazsınız." + +#: ../src\gui\main.py:749 +msgid "" +"This user has no favourites. You can't create a list of favourites for this " +"user." +msgstr "" +"Bu kullanıcının hiçbir favorisi yok. Bu yüzden bu kullanıcı için favori " +"listesi yapamazsınız." + +#: ../src\gui\main.py:791 ../src\gui\main.py:804 +msgid "%s, %s of %s" +msgstr "%s, %s/%s" + +#: ../src\gui\main.py:793 ../src\gui\main.py:806 +msgid "%s. Empty" +msgstr "%s. boş" + +#: ../src\gui\main.py:829 +msgid "Global mute on" +msgstr "Tümünü susturma açık" + +#: ../src\gui\main.py:832 +msgid "Global mute off" +msgstr "Tümünü susturma kapalı" + +#: ../src\gui\main.py:838 +msgid "Buffer mute on" +msgstr "Buffer susturma açık" + +#: ../src\gui\main.py:841 +msgid "Buffer mute off" +msgstr "Buffer susturma kapalı" + +#: ../src\gui\main.py:847 +msgid "The auto-reading of new tweets is enabled for this buffer" +msgstr "Yeni tweetlerin okunması bu buffer için etkin" + +#: ../src\gui\main.py:850 +msgid "The auto-reading of new tweets is disabled for this buffer" +msgstr "Yeni tweetlerin okunması bu buffer için etkin değil" + +#: ../src\gui\main.py:857 +msgid "Copied" +msgstr "Kopyalandı" + +#: ../src\gui\main.py:868 ../src\gui\main.py:877 +msgid "%s" +msgstr "%s" + +#: ../src\gui\sysTrayIcon.py:40 +msgid "Show / hide" +msgstr "Göster / gizle" + +#: ../src\issueReporter\gui.py:31 +msgid "always" +msgstr "her zaman" + +#: ../src\issueReporter\gui.py:31 +msgid "have not tried" +msgstr "Denenmedi" + +#: ../src\issueReporter\gui.py:31 +msgid "random" +msgstr "rastgele" + +#: ../src\issueReporter\gui.py:31 +msgid "sometimes" +msgstr "bazen" + +#: ../src\issueReporter\gui.py:31 +msgid "unable to duplicate" +msgstr "Çoğaltılamıyor" + +#: ../src\issueReporter\gui.py:32 +msgid "block" +msgstr "Engel" + +#: ../src\issueReporter\gui.py:32 +msgid "crash" +msgstr "çökme" + +#: ../src\issueReporter\gui.py:32 +msgid "feature" +msgstr "özellik" + +#: ../src\issueReporter\gui.py:32 +msgid "major" +msgstr "büyük" + +#: ../src\issueReporter\gui.py:32 +msgid "minor" +msgstr "küçük" + +#: ../src\issueReporter\gui.py:32 +msgid "text" +msgstr "Metin" + +#: ../src\issueReporter\gui.py:32 +msgid "trivial" +msgstr "önemsiz" + +#: ../src\issueReporter\gui.py:32 +msgid "tweak" +msgstr "tweak" + +#: ../src\issueReporter\gui.py:37 +msgid "Select a category" +msgstr "Kategori seçin" + +#: ../src\issueReporter\gui.py:46 +msgid "" +"Briefly describe what happened. You will be able to thoroughly explain it " +"later" +msgstr "Ne olduğunu kısaca yazın. detayları sonraki kutuya yazın" + +#: ../src\issueReporter\gui.py:56 +msgid "Here, you can describe the bug in detail" +msgstr "Hatayı detaylarıyla açıklayın" + +#: ../src\issueReporter\gui.py:66 +msgid "how often does this bug happen?" +msgstr "Bu hata ne sıklıkta oluyor" + +#: ../src\issueReporter\gui.py:74 +msgid "Select the importance that you think this bug has" +msgstr "Bu hatanın önceliğini seçin" + +#: ../src\issueReporter\gui.py:82 +msgid "" +"I know that the TW Blue bug system will get my Twitter username to contact " +"me and fix the bug quickly" +msgstr "" +"TWBlue hata sisteminin bana twitter kullanıcı adımla ulaşacağını biliyorum" + +#: ../src\issueReporter\gui.py:85 +msgid "Send report" +msgstr "Raporu gönder" + +#: ../src\issueReporter\gui.py:98 +msgid "You must fill out both fields" +msgstr "İki kutuyu da doldurmalısınız" + +#: ../src\issueReporter\gui.py:101 +msgid "" +"You need to mark the checkbox to provide us your twitter username to contact " +"to you if is necessary." +msgstr "Size ulaşım sağlamanız için ulaşım onaykutusunu işaretlemelisiniz" + +#: ../src\issueReporter\gui.py:120 +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 "" +"Hata raporladığınız için teşekkür ederiz! Eğer hata düzeltilirse değişiklik " +"listesinde hatayı bulabilirsiniz. %i numaralı hatayı raporladınız." + +#: ../src\issueReporter\gui.py:120 +msgid "reported" +msgstr "Raporlandı" + +#: ../src\issueReporter\gui.py:123 +msgid "Error while reporting" +msgstr "Raporlanırken hatayla karşılaşıldı" + +#: ../src\issueReporter\gui.py:123 +msgid "" +"Something unexpected occurred while trying to report the bug. Please, try " +"again later" +msgstr "" +"Raporu gönderirken beklenmeyen bir hatayla karşılaşıldı. Daha sonra tekrar " +"deneyiniz." + +#: ../src\keystrokeEditor\constants.py:4 +msgid "Go up up on the current list" +msgstr "Geçerli listede yukarı çık" + +#: ../src\keystrokeEditor\constants.py:5 +msgid "Go down up on the current list" +msgstr "Geçerli listede aşağı in" + +#: ../src\keystrokeEditor\constants.py:6 +msgid "Go to the previous tab" +msgstr "Önceki sekmeye git" + +#: ../src\keystrokeEditor\constants.py:7 +msgid "Go to the next tab" +msgstr "Sonraki sekmeye git" + +#: ../src\keystrokeEditor\constants.py:8 +msgid "Move up one tweet in the conversation" +msgstr "Konferansta 1 tweet yukarı çık" + +#: ../src\keystrokeEditor\constants.py:9 +msgid "Move down one tweet in the conversation" +msgstr "Konferansta 1 tweet aşağı in" + +#: ../src\keystrokeEditor\constants.py:10 +msgid "Show the graphical interface" +msgstr "Görünen arayüzü göster" + +#: ../src\keystrokeEditor\constants.py:12 +msgid "Reply to a tweet" +msgstr "Tweeti yanıtla" + +#: ../src\keystrokeEditor\constants.py:14 +msgid "Send direct message" +msgstr "Direkt mesaj gönder" + +#: ../src\keystrokeEditor\constants.py:15 +msgid "Mark as favourite" +msgstr "Favorilere ekle" + +#: ../src\keystrokeEditor\constants.py:17 +msgid "Open the actions dialogue" +msgstr "Eylemler iletişim kutusunu aç" + +#: ../src\keystrokeEditor\constants.py:18 +msgid "See user details" +msgstr "Kullanıcı ayrıntılarını görüntüle" + +#: ../src\keystrokeEditor\constants.py:20 +msgid "Quit" +msgstr "Çık" + +#: ../src\keystrokeEditor\constants.py:21 +msgid "Open user timeline" +msgstr "Kullanıcı çizelgesini aç" + +#: ../src\keystrokeEditor\constants.py:23 +msgid "" +"Open URL on the current tweet, or further information for a friend or " +"follower" +msgstr "" +"Geçerli tweetteki adresi açın ya da bir kişi hakkında daha fazla bilgi edinin" + +#: ../src\keystrokeEditor\constants.py:24 +msgid "Attempt to play audio" +msgstr "Ses çal" + +#: ../src\keystrokeEditor\constants.py:25 +msgid "Increase volume by 5%" +msgstr "Sesi %5 oranında arttır" + +#: ../src\keystrokeEditor\constants.py:26 +msgid "Decrease volume by 5%" +msgstr "Sesi %5 oranında azalt" + +#: ../src\keystrokeEditor\constants.py:27 +msgid "Go to the first element on the list" +msgstr "Listedeki ilk öğeye git" + +#: ../src\keystrokeEditor\constants.py:28 +msgid "Go to the last element on the list" +msgstr "Listedeki son öğeye git" + +#: ../src\keystrokeEditor\constants.py:29 +msgid "Move 20 elements up on the current list" +msgstr "Listede 20 öğe ileri git" + +#: ../src\keystrokeEditor\constants.py:30 +msgid "Move 20 elements down on the current list" +msgstr "Listede 20 öğe aşağı git" + +#: ../src\keystrokeEditor\constants.py:31 +msgid "Edit profile" +msgstr "Profili düzenle" + +#: ../src\keystrokeEditor\constants.py:32 +msgid "Remove a tweet or direct message" +msgstr "Bir tweeti ya da dmyi kaldır" + +#: ../src\keystrokeEditor\constants.py:33 +msgid "Empty the buffer removing all the elements" +msgstr "Bufferi boşalt" + +#: ../src\keystrokeEditor\constants.py:34 +msgid "Listen the current message" +msgstr "Geçerli mesajı dinle" + +#: ../src\keystrokeEditor\constants.py:35 +msgid "Copy to clipboard" +msgstr "Panoya kopyala" + +#: ../src\keystrokeEditor\constants.py:38 +msgid "Mutes/unmutes the active buffer" +msgstr "Etkin bufferi susturur ya da susturmayı kaldırır" + +#: ../src\keystrokeEditor\constants.py:39 +msgid "Globally mute/unmute TW Blue" +msgstr "TWBlue programını susturur ya da susturmayı kaldırır" + +#: ../src\keystrokeEditor\constants.py:40 +msgid "toggles the automatic reading of incoming tweets in the active buffer" +msgstr "" +"Bu buffer için tweetlerin otomatik olarak okunup okunmayacağını ayarlar" + +#: ../src\keystrokeEditor\constants.py:41 +msgid "Search on twitter" +msgstr "Twitterda ara" + +#: ../src\keystrokeEditor\constants.py:42 +msgid "Shows the keystroke editor" +msgstr "Kısayol düzenlemeyi gösterir" + +#: ../src\keystrokeEditor\constants.py:43 +msgid "Show lists for a specified user" +msgstr "Bir kullanıcı için listeleri göster" + +#: ../src\keystrokeEditor\gui.py:10 +msgid "Keystroke editor" +msgstr "Kısayol düzenleyicisi" + +#: ../src\keystrokeEditor\gui.py:16 +msgid "Select a keystroke to edit" +msgstr "Düzenlemek için bir kısayol seçin" + +#: ../src\keystrokeEditor\gui.py:17 +msgid "Keystroke" +msgstr "Kısayol" + +#: ../src\keystrokeEditor\gui.py:54 +msgid "Editing keystroke" +msgstr "Kısayol düzenleniyor" + +#: ../src\keystrokeEditor\gui.py:61 +msgid "Control" +msgstr "Kontrol" + +#: ../src\keystrokeEditor\gui.py:62 +msgid "Alt" +msgstr "Alt" + +#: ../src\keystrokeEditor\gui.py:63 +msgid "Shift" +msgstr "Shift" + +#: ../src\keystrokeEditor\gui.py:64 +msgid "Windows" +msgstr "Windows" + +#: ../src\keystrokeEditor\gui.py:70 +msgid "Key" +msgstr "Tuş" + +#: ../src\keystrokeEditor\gui.py:99 +msgid "You need to use the Windows key" +msgstr "Windows tuşunu kullanmanız gerekir" + +#: ../src\keystrokeEditor\gui.py:99 ../src\keystrokeEditor\gui.py:112 +msgid "Invalid keystroke" +msgstr "Yanlış kısayol tuşu" + +#: ../src\keystrokeEditor\gui.py:112 +msgid "You must provide a character for the keystroke" +msgstr "Kısayol için bir harf girmeniz gerekir" + +#: ../src\languageHandler.py:95 +msgid "User default" +msgstr "Kullanıcı varsayılanı" + +#: ../src\sessionmanager\gui.py:19 +msgid "Session manager" +msgstr "Hesap yöneticisi" + +#: ../src\sessionmanager\gui.py:23 +msgid "Select a twitter account to start TW Blue" +msgstr "TwBlu programını başlatmak için bir twitter hesabı seçin" + +#: ../src\sessionmanager\gui.py:25 +msgid "Account" +msgstr "hesap" + +#: ../src\sessionmanager\gui.py:30 +msgid "New account" +msgstr "Yeni hesap" + +#: ../src\sessionmanager\gui.py:67 +msgid "Account Error" +msgstr "Hesap hatası" + +#: ../src\sessionmanager\gui.py:67 +msgid "You need to configure an account." +msgstr "Bir hesap ayarlamanız gerekir" + +#: ../src\sessionmanager\gui.py:83 +msgid "" +"The request for the required Twitter authorization to continue will be " +"opened on your browser. You only need to do it once. Would you like to " +"autorhise a new account now?" +msgstr "" +"Yeni hesabınız için Twitter kod onaylama sayfası açılacaktır. Bu işlemi bir " +"kez yapmanız yeterlidir. İzin vermek istiyor musunuz?" + +#: ../src\sessionmanager\gui.py:94 +msgid "Invalid user token" +msgstr "Yanlış kullanıcı kodu" + +#: ../src\sessionmanager\gui.py:94 +msgid "" +"Your access token is invalid or the authorisation has failed. Please try " +"again." +msgstr "Erişim kodunuz yanlış ya da erişim başarısız oldu" + +#: ../src\sessionmanager\gui.py:97 +msgid "Authorised account %d" +msgstr "İzin verilmiş hesap %d" + +#: ../src\twitter\buffers\indibidual.py:26 +msgid "One tweet from %s" +msgstr "%s kişisinden 1 tweet" + +#: ../src\twitter\buffers\indibidual.py:35 +msgid "One tweet from %s in the list %s" +msgstr "%s kişisinden %s listesinde 1 tweet" + +#: ../src\twitter\buffers\stream.py:57 +msgid "One mention from %s " +msgstr "%s kişisinden 1 yanıt" + +#: ../src\twitter\buffers\stream.py:69 +msgid "One direct message" +msgstr "1 dm" + +#: ../src\twitter\compose.py:22 +msgid "About a week ago" +msgstr "Bir hafta önce" + +#: ../src\twitter\compose.py:24 +msgid "About {} weeks ago" +msgstr "{} hafta önce" + +#: ../src\twitter\compose.py:26 +msgid "A month ago" +msgstr "Bir ay önce" + +#: ../src\twitter\compose.py:28 +msgid "About {} months ago" +msgstr "{} ay önce" + +#: ../src\twitter\compose.py:30 +msgid "About a year ago" +msgstr "Bir yıl önce" + +#: ../src\twitter\compose.py:32 +msgid "About {} years ago" +msgstr "{} yıl önce" + +#: ../src\twitter\compose.py:34 +msgid "About 1 day ago" +msgstr "Bir gün önce" + +#: ../src\twitter\compose.py:36 +msgid "About {} days ago" +msgstr "{} gün önce" + +#: ../src\twitter\compose.py:38 +msgid "just now" +msgstr "Şimdi" + +#: ../src\twitter\compose.py:40 +msgid "{} seconds ago" +msgstr "[} saniye önce" + +#: ../src\twitter\compose.py:42 +msgid "1 minute ago" +msgstr "bir dakika önce" + +#: ../src\twitter\compose.py:44 +msgid "{} minutes ago" +msgstr "{} dakika önce" + +#: ../src\twitter\compose.py:46 +msgid "About 1 hour ago" +msgstr "Bir saat önce" + +#: ../src\twitter\compose.py:48 +msgid "About {} hours ago" +msgstr "{} saat önce" + +#: ../src\twitter\compose.py:52 +msgid "January" +msgstr "Ocak" + +#: ../src\twitter\compose.py:53 +msgid "February" +msgstr "Şubat" + +#: ../src\twitter\compose.py:54 +msgid "March" +msgstr "Mart" + +#: ../src\twitter\compose.py:55 +msgid "April" +msgstr "Nisan" + +#: ../src\twitter\compose.py:56 +msgid "May" +msgstr "Mayıs" + +#: ../src\twitter\compose.py:57 +msgid "June" +msgstr "Haziran" + +#: ../src\twitter\compose.py:58 +msgid "July" +msgstr "Temmuz" + +#: ../src\twitter\compose.py:59 +msgid "August" +msgstr "Ağustos" + +#: ../src\twitter\compose.py:60 +msgid "September" +msgstr "Eylül" + +#: ../src\twitter\compose.py:61 +msgid "October" +msgstr "Ekim" + +#: ../src\twitter\compose.py:62 +msgid "November" +msgstr "Kasım" + +#: ../src\twitter\compose.py:63 +msgid "December" +msgstr "Aralık" + +#: ../src\twitter\compose.py:66 +msgid "Sunday" +msgstr "Pazar" + +#: ../src\twitter\compose.py:67 +msgid "Monday" +msgstr "Pazartesi" + +#: ../src\twitter\compose.py:68 +msgid "Tuesday" +msgstr "Salı" + +#: ../src\twitter\compose.py:69 +msgid "Wednesday" +msgstr "Çarşamba" + +#: ../src\twitter\compose.py:70 +msgid "Thursday" +msgstr "Perşembe" + +#: ../src\twitter\compose.py:71 +msgid "Friday" +msgstr "Cuma" + +#: ../src\twitter\compose.py:72 +msgid "Saturday" +msgstr "Cumartesi" + +#: ../src\twitter\compose.py:75 +msgid "sun" +msgstr "Pazar" + +#: ../src\twitter\compose.py:76 +msgid "mon" +msgstr "pazartesi" + +#: ../src\twitter\compose.py:77 +msgid "tue" +msgstr "salı" + +#: ../src\twitter\compose.py:78 +msgid "wed" +msgstr "çarşamba" + +#: ../src\twitter\compose.py:79 +msgid "thu" +msgstr "perşembe" + +#: ../src\twitter\compose.py:80 +msgid "fri" +msgstr "Cuma" + +#: ../src\twitter\compose.py:81 +msgid "sat" +msgstr "cumartesi" + +#: ../src\twitter\compose.py:85 +msgid "jan" +msgstr "ocak" + +#: ../src\twitter\compose.py:86 +msgid "feb" +msgstr "Şubat" + +#: ../src\twitter\compose.py:87 +msgid "mar" +msgstr "mart" + +#: ../src\twitter\compose.py:88 +msgid "apr" +msgstr "nisan" + +#: ../src\twitter\compose.py:89 +msgid "may" +msgstr "mayıs" + +#: ../src\twitter\compose.py:90 +msgid "jun" +msgstr "haziran" + +#: ../src\twitter\compose.py:91 +msgid "jul" +msgstr "temmuz" + +#: ../src\twitter\compose.py:92 +msgid "aug" +msgstr "Ağustos" + +#: ../src\twitter\compose.py:93 +msgid "sep" +msgstr "Eylül" + +#: ../src\twitter\compose.py:94 +msgid "oct" +msgstr "Ekim" + +#: ../src\twitter\compose.py:95 +msgid "nov" +msgstr "Kasım" + +#: ../src\twitter\compose.py:96 +msgid "dec" +msgstr "aralık" + +#: ../src\twitter\compose.py:152 +msgid "Dm to %s " +msgstr "%s kişisine dm" + +#: ../src\twitter\compose.py:185 +msgid "Unavailable" +msgstr "Geçersiz" + +#: ../src\twitter\compose.py:186 +msgid "" +"%s (@%s). %s followers, %s friends, %s tweets. Last tweet on %s. Joined " +"Twitter on %s" +msgstr "" +"%s (@%s). %s takipçi, %s arkadaş, %s tweett. Son tweet %s tarihinde yapıldı." +"Twittera %s tarihinde katıldı" + +#: ../src\twitter\compose.py:190 +msgid "You've blocked %s" +msgstr "%s kişisi engellendi" + +#: ../src\twitter\compose.py:192 +msgid "You've unblocked %s" +msgstr "%s kişisinin engeli kaldırıldı" + +#: ../src\twitter\compose.py:195 +msgid "%s(@%s) has followed you" +msgstr "%s(@%s) sizi takip ediyor" + +#: ../src\twitter\compose.py:197 +msgid "You've followed %s(@%s)" +msgstr "%s(@%s) takip ediliyor" + +#: ../src\twitter\compose.py:199 +msgid "You've unfollowed %s (@%s)" +msgstr "%s(@%s) takibi bırakıldı" + +#: ../src\twitter\compose.py:202 +msgid "You've added to favourites: %s, %s" +msgstr "%s, %s favorilere eklendi" + +#: ../src\twitter\compose.py:204 +msgid "%s(@%s) has marked as favorite: %s" +msgstr "%s(@%s) has marked as favorite: %s" + +#: ../src\twitter\compose.py:206 +msgid "You've removed from favourites: %s, %s" +msgstr "%s, %s favorilerden kaldırıldı" + +#: ../src\twitter\compose.py:207 +msgid "%s(@%s) has removed from favourites: %s" +msgstr "%s(@%s) has removed from favourites: %s" + +#: ../src\twitter\compose.py:209 +msgid "You've created the list %s" +msgstr "%s listesi oluşturuldu" + +#: ../src\twitter\compose.py:211 +msgid "You've deleted the list %s" +msgstr "%s listesi silindi" + +#: ../src\twitter\compose.py:213 +msgid "You've updated the list %s" +msgstr "%s listesi güncellendi" + +#: ../src\twitter\compose.py:215 +msgid "You've added %s(@%s) to the list %s" +msgstr "%s(@%s) kişisini %s listesine eklediniz" + +#: ../src\twitter\compose.py:216 +msgid "%s(@%s) has added you to the list %s" +msgstr "%s(@%s) sizi %s listesine ekledi" + +#: ../src\twitter\compose.py:218 +msgid "You'be removed %s(@%s) from the list %s" +msgstr "%s(@%s) kişisini %s listesinden kaldırdınız" + +#: ../src\twitter\compose.py:219 +msgid "%s(@%s) has removed you from the list %s" +msgstr "%s(@%s) sizi %s listesinden kaldırdı" + +#: ../src\twitter\compose.py:221 +msgid "You've subscribed to the list %s, which is owned by %s(@%s)" +msgstr "%s listesine katıldın, sahibi %s(@%s)" + +#: ../src\twitter\compose.py:222 +msgid "%s(@%s) has suscribed you to the list %s" +msgstr "%s(@%s) sizi %s listesine ekledi" + +#: ../src\twitter\compose.py:224 +msgid "You've unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "%s listesinden ayrıldınız, sahibi %s(@%s)" + +#: ../src\twitter\compose.py:225 +msgid "You've been unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "%s listesinden kaldırıldınız, sahibi %s(@%s)" + +#: ../src\twitter\compose.py:226 +msgid "Unknown" +msgstr "Bilinmeyen" + +#: ../src\twitter\compose.py:232 +msgid "No description available" +msgstr "Açıklama yok" + +#: ../src\twitter\compose.py:236 +msgid "private" +msgstr "Özel" + +#: ../src\twitter\compose.py:237 +msgid "public" +msgstr "Herkese açık" + +#: ../src\twitter\twitter.py:73 +msgid "%s failed. Reason: %s" +msgstr "%s başarısız oldu. Neden: %s" + +#: ../src\twitter\twitter.py:80 +msgid "%s succeeded." +msgstr "%s başarılı oldu" + +#: ../src\updater\update_manager.py:14 +msgid "Your TW Blue version is up to date" +msgstr "TWBlue programının en son versiyonunu kullanıyorsunuz" + +#: ../src\updater\update_manager.py:14 ../src\updater\update_manager.py:27 +msgid "Update" +msgstr "Güncelleme" + +#: ../src\updater\update_manager.py:20 +msgid "New version for %s" +msgstr "%s için yeni sürüm" + +#: ../src\updater\update_manager.py:20 +msgid "" +"There's a new TW Blue version available. Would you like to download it now?" +msgstr "Yeni TWBlue versiyonu mevcut. İndirmek ister misiniz?" + +#: ../src\updater\update_manager.py:22 +msgid "Download in Progress" +msgstr "İndirme sürüyor" + +#: ../src\updater\update_manager.py:22 +msgid "Downloading the new version..." +msgstr "Yeni sürüm indiriliyor<..." + +#: ../src\updater\update_manager.py:29 +msgid "Done!" +msgstr "Bitti!" + +#: ../src\updater\update_manager.py:29 +msgid "" +"The new TW Blue version has been downloaded and installed. Press OK to start " +"the application." +msgstr "" +"Yeni TWBlue versiyonu kuruldu. Tamama basarak programı yeniden " +"başlatabilirsiniz." + +#~ msgid "Tweet - %i characters" +#~ msgstr "Tweet- %i karakter" + +#~ msgid "%A, %B %d, %Y at %I:%M:%S %p" +#~ msgstr "%A, %B %d, %Y at %I:%M:%S %p" + +#~ msgid "View members" +#~ msgstr "Üyeleri görüntüle" + +#~ msgid "View subscribers" +#~ msgstr "Katılımcıları görüntüle" + +#~ msgid "Mention to %s" +#~ msgstr "mention:" + +#~ msgid "Ouner" +#~ msgstr "Sahhip" + +#~ msgid "Successfully following %s" +#~ msgstr "%s takip ediliyor" + +#~ msgid "%s has been reported as spam" +#~ msgstr "%s spam olarak raporlandı" + +#~ msgid "%s has been blocked" +#~ msgstr "%s engellendi" + +#~ msgid "User's information" +#~ msgstr "Kullanıcı bilgisi" + +#~ msgid "You've unblock %s" +#~ msgstr "%s kişisinin engeli kaldırıldı" + +#~ msgid "Clear" +#~ msgstr "Limpiar" diff --git a/src/logger.py b/src/logger.py new file mode 100644 index 00000000..9c4f21c2 --- /dev/null +++ b/src/logger.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +import logging +from logging.handlers import RotatingFileHandler +import paths +import sys + +APP_LOG_FILE = 'debug.log' +ERROR_LOG_FILE = "error.log" +MESSAGE_FORMAT = "%(asctime)s %(name)s %(levelname)s: %(message)s" +DATE_FORMAT = "%a %b %d, %Y %H:%M:%S" + +formatter = logging.Formatter(MESSAGE_FORMAT, datefmt=DATE_FORMAT) + +requests_log = logging.getLogger("requests") +requests_log.setLevel(logging.WARNING) +oauthlib_log = logging.getLogger("oauthlib") +oauthlib_log.setLevel(logging.WARNING) +suds_log = logging.getLogger("suds") +suds_log.setLevel(logging.WARNING) +server_log = logging.getLogger("BaseHTTPServer") +server_log.setLevel(logging.WARNING) + + +logger = logging.getLogger() +logger.setLevel(logging.DEBUG) + +#handlers + +app_handler = RotatingFileHandler(paths.logs_path(APP_LOG_FILE), maxBytes=1000000) +app_handler.setFormatter(formatter) +app_handler.setLevel(logging.DEBUG) +logger.addHandler(app_handler) + +error_handler = logging.FileHandler(paths.logs_path(ERROR_LOG_FILE)) +error_handler.setFormatter(formatter) +error_handler.setLevel(logging.ERROR) +logger.addHandler(error_handler) diff --git a/src/long_tweets/__init__.py b/src/long_tweets/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/long_tweets/twishort.py b/src/long_tweets/twishort.py new file mode 100644 index 00000000..2ac8a6a0 --- /dev/null +++ b/src/long_tweets/twishort.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import requests + diff --git a/src/main.py b/src/main.py new file mode 100644 index 00000000..d00f891f --- /dev/null +++ b/src/main.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +""" TW Blue + +A twitter accessible, easy of use and cross platform application.""" +############################################################ +# Copyright(C)2013-2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import wx + +ssmg = None +import gui +import paths +import config +import commandline +import platform +if platform.system() == "Windows": + from logger import logger as logging +if platform.system() == "Darwin": + import osx_prepare + osx_prepare.setup() +from sessionmanager import manager +from sessionmanager import gui as smGUI +manager.setup() +import sys + +if hasattr(sys, 'frozen'): + sys.stderr = open(paths.logs_path("stderr.log"), 'w') + sys.stdout = open(paths.logs_path("stdout.log"), 'w') + +class app(wx.App): + def __init__(self, *args, **kwargs): + super(app, self).__init__(*args, **kwargs) + if platform.system() != "Darwin": + self.start() + else: + self.mac() + + def mac(self): + self.hold_frame = wx.Frame(title="None", parent=None) + self.hold_frame.Show() + wx.CallLater(10, self.start) + + def start(self): + ssmg = smGUI.sessionManagerWindow() + if ssmg.ShowModal() == wx.ID_OK: + frame = gui.main.mainFrame() + frame.Show() + frame.showing = True + if config.main != None and config.main["general"]["hide_gui"] == True and platform.system() == "Windows": + frame.show_hide() + frame.Hide() + self.SetTopWindow(frame) + if hasattr(self, "frame"): self.hold_frame.Hide() + # If the user press on cancel. + else: + self.Exit() + +ap = app() + ### I should uncomment this +#if platform.system() != "Windows": +# local = wx.Locale(wx.LANGUAGE_DEFAULT) +# local.AddCatalogLookupPathPrefix(paths.locale_path()) +# local.AddCatalog("twblue") +#ap = app(redirect=True, useBestVisual=True, filename=paths.logs_path('tracebacks.log')) +#wx.CallLater(10, start) +ap.MainLoop() + diff --git a/src/multiplatform_widgets/__init__.py b/src/multiplatform_widgets/__init__.py new file mode 100644 index 00000000..126802d0 --- /dev/null +++ b/src/multiplatform_widgets/__init__.py @@ -0,0 +1 @@ +import widgets \ No newline at end of file diff --git a/src/multiplatform_widgets/widgets.py b/src/multiplatform_widgets/widgets.py new file mode 100644 index 00000000..0704051d --- /dev/null +++ b/src/multiplatform_widgets/widgets.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- +import wx +import platform + +class list(object): + def __init__(self, parent, *columns, **listArguments): + self.system = platform.system() + self.columns = columns + self.listArguments = listArguments + self.create_list(parent) +# self.set_size() + + def set_windows_size(self, column, characters_max): + it = wx.ListItem() + dc = wx.WindowDC(self.list) + dc.SetFont(it.GetFont()) + (x, y) = dc.GetTextExtent("r"*characters_max) + self.list.SetColumnWidth(column, x) + + def set_size(self): + self.list.SetSize(self.list.GetBestSize()) + + def create_list(self, parent): + if self.system == "Windows": + self.list = wx.ListCtrl(parent, -1, **self.listArguments) + for i in xrange(0, len(self.columns)): + self.list.InsertColumn(i, u"%s" % (self.columns[i])) + else: + self.list = wx.ListBox(parent, -1, choices=[]) + + def insert_item(self, reversed, *item): + """ Inserts an item on the list, depending on the OS.""" + if self.system == "Windows": + if reversed == False: items = self.list.GetItemCount() + else: items = 0 + self.list.InsertStringItem(items, item[0]) + for i in xrange(1, len(self.columns)): + self.list.SetStringItem(items, i, item[i]) + else: + self.list.Append(" ".join(item)) + + def remove_item(self, pos): + """ Deletes an item from the list.""" + if self.system == "Windows": + if pos > 0: self.list.Focus(pos-1) + self.list.DeleteItem(pos) + else: + if pos > 0: self.list.SetSelection(pos-1) + self.list.Delete(pos) + + def clear(self): + if self.system == "Windows": + self.list.DeleteAllItems() + else: + self.list.Clear() + + def get_selected(self): + if self.system == "Windows": + return self.list.GetFocusedItem() + else: + return self.list.GetSelection() + + def select_item(self, pos): + if self.system == "Windows": + self.list.Focus(pos) + else: + self.list.SetSelection(pos) + + def get_count(self): + if self.system == "Windows": + selected = self.list.GetItemCount() + else: + selected = self.list.GetCount() + if selected == -1: + return 0 + else: + return selected diff --git a/src/mysc/__init__.py b/src/mysc/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/mysc/event.py b/src/mysc/event.py new file mode 100644 index 00000000..acc67777 --- /dev/null +++ b/src/mysc/event.py @@ -0,0 +1,41 @@ +# -- coding: utf-8 -*- +from wx.lib.newevent import NewEvent +import wx +EVT_DELETED = wx.NewEventType() +MyEVT_DELETED = wx.PyEventBinder(EVT_DELETED, 1) +EVT_STARTED = wx.NewEventType() +MyEVT_STARTED = wx.PyEventBinder(EVT_STARTED, 1) +EVT_OBJECT = wx.NewEventType() +MyEVT_OBJECT = wx.PyEventBinder(EVT_OBJECT, 1) + +ResultEvent, EVT_RESULT = NewEvent() +#DeletedEvent, EVT_DELETED = NewEvent() + +class event(wx.PyCommandEvent): + def __init__(self, evtType, id): + self.text = "" + wx.PyCommandEvent.__init__(self, evtType, id) + + def SetItem(self, item): + self.item = item + + def GetItem(self): + return self.item + + def SetAnnounce(self, text ): + self.text = text + + def GetAnnounce(self): + try: return self.text + except: pass + +class infoEvent(event): + def __init__(self, evtType, id): + event.__init__(self, evtType, id) + + def SetItem(self, page, items): + self.page = page + self.items = items + + def GetItem(self): + return [self.page, self.items] \ No newline at end of file diff --git a/src/mysc/localization.py b/src/mysc/localization.py new file mode 100644 index 00000000..c308af24 --- /dev/null +++ b/src/mysc/localization.py @@ -0,0 +1,9 @@ +import gettext_windows, os + +def get(rootFolder): + defaultLocale = gettext_windows.get_language()[0][:2] + if os.path.exists(rootFolder+"/"+defaultLocale): + return defaultLocale + else: + return "en" + diff --git a/src/mysc/paths.py b/src/mysc/paths.py new file mode 100644 index 00000000..c48623cf --- /dev/null +++ b/src/mysc/paths.py @@ -0,0 +1,38 @@ +import platform +import os +import sys + +from functools import wraps + +def merge_paths(func): + @wraps(func) + def merge_paths_wrapper(*a): + return unicode(os.path.join(func(), *a)) + return merge_paths_wrapper + +@merge_paths +def app_path(): + if hasattr(sys, "frozen"): + from win32api import GetModuleFileName #We should only be here if using py2exe hence windows + app_path = os.path.dirname(GetModuleFileName(0)) + else: + app_path = os.path.normpath(os.path.dirname(__file__)) + return app_path + +@merge_paths +def config_path(): + path = app_path(u"config") + if not os.path.exists(path): + os.mkdir(path) + return path + +@merge_paths +def data_path(app_name='Blu JM'): +# if platform.system() == "Windows": +# import shlobj +# data_path = os.path.join(shlobj.SHGetFolderPath(0, shlobj.CSIDL_APPDATA), app_name) +# else: + data_path = os.path.join(os.environ['HOME'], ".%s" % app_name) + if not os.path.exists(data_path): + os.mkdir(data_path) + return data_path diff --git a/src/mysc/repeating_timer.py b/src/mysc/repeating_timer.py new file mode 100644 index 00000000..e634f344 --- /dev/null +++ b/src/mysc/repeating_timer.py @@ -0,0 +1,34 @@ +import threading + +class RepeatingTimer(threading.Thread): + """Call a function after a specified number of seconds, it will then repeat again after the specified number of seconds + Note: If the function provided takes time to execute, this time is NOT taken from the next wait period + + t = RepeatingTimer(30.0, f, args=[], kwargs={}) + t.start() + t.cancel() # stop the timer's actions + """ + + def __init__(self, interval, function, daemon=True, *args, **kwargs): + threading.Thread.__init__(self) + self.daemon = daemon + self.interval = float(interval) + self.function = function + self.args = args + self.kwargs = kwargs + self.finished = threading.Event() + + def cancel(self): + """Stop the timer if it hasn't finished yet""" + self.finished.set() + stop = cancel + + def run(self): + while not self.finished.is_set(): + self.finished.wait(self.interval) + if not self.finished.is_set(): #In case someone has canceled while waiting + try: + self.function(*self.args, **self.kwargs) + except: + pass +# logging.exception("Execution failed. Function: %r args: %r and kwargs: %r" % (self.function, self.args, self.kwargs)) diff --git a/src/mysc/restart.py b/src/mysc/restart.py new file mode 100644 index 00000000..2533b563 --- /dev/null +++ b/src/mysc/restart.py @@ -0,0 +1,12 @@ +# -*- coding: cp1252 +import sys, os, config + +def restart_program(): + """ Function that restarts the application if is executed.""" + config.main.write() + args = sys.argv[:] + if not hasattr(sys, "frozen"): + args.insert(0, sys.executable) + if sys.platform == 'win32': + args = ['"%s"' % arg for arg in args] + os.execv(sys.executable, args) \ No newline at end of file diff --git a/src/mysc/thread_utils.py b/src/mysc/thread_utils.py new file mode 100644 index 00000000..74af8092 --- /dev/null +++ b/src/mysc/thread_utils.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +import threading +import wx +from twython import TwythonRateLimitError +import time + +def call_threaded(func, *args, **kwargs): + #Call the given function in a daemonized thread and return the thread. + def new_func(*a, **k): + try: + func(*a, **k) + except TwythonRateLimitError: + wx.MessageDialog(None, u"Has superado el límite de llamadas a la API que Twitter permite. Eso puede deberse a muchas líneas temporales abiertas, a abrir y cerrar el programa en un periodo corto de tiempo, o a tener muchas llamadas a la API en tu configuración. TW Blue esperará 5 minutos y volverá a intentarlo.", u"Límite de llamadas a la API Superado", wx.ICON_ERROR|wx.OK).ShowModal() + time.sleep(300) + call_threaded(func, *args, **kwargs) +# except: +# pass + thread = threading.Thread(target=new_func, args=args, kwargs=kwargs) + thread.daemon = True + thread.start() + return thread diff --git a/src/notifier/__init__.py b/src/notifier/__init__.py new file mode 100644 index 00000000..3bd1ff6e --- /dev/null +++ b/src/notifier/__init__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +""" A cross platform notification system. +Under Linux, the wx.NotificationMessage does not show a notification on the taskbar, so we decided to use dbus for showing notifications for linux and wx for Windows.""" +import platform + +notify = None + +def setup(): + global notify + if platform.system() == "Windows": + import windows + notify = windows.notification() + elif platform.system() == "Linux": + import linux + notify = linux.notification() + +def send(title, text): + global notify + if not notify or notify is None: + setup() + notify.notify(title, text) \ No newline at end of file diff --git a/src/notifier/linux.py b/src/notifier/linux.py new file mode 100644 index 00000000..42da5f21 --- /dev/null +++ b/src/notifier/linux.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +import dbus +import application + +class notifications(object): + """Supports notifications on Linux. + """ + + def __init__(self): + super(notifications, self).__init__() + self.item = "org.freedesktop.Notifications" + self.path = "/org/freedesktop/Notifications" + self.interface = "org.freedesktop.Notifications" + self.app_name = application.name + self.id_num_to_replace = 0 + self.icon = "/usr/share/icons/Tango/32x32/status/sunny.png" + + def notify(self, title="", text=""): + actions_list = '' + hint = '' + time = 5000 # Use seconds x 1000 + bus = dbus.SessionBus() + notif = bus.get_object(self.item, self.path) + notify = dbus.Interface(notif, self.interface) + notify.Notify(self.app_name, self.id_num_to_replace, self.icon, title, text, actions_list, hint, time) \ No newline at end of file diff --git a/src/notifier/windows.py b/src/notifier/windows.py new file mode 100644 index 00000000..5e1dd320 --- /dev/null +++ b/src/notifier/windows.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +import wx + +class notification(object): + + def notify(self, title, text): + wx.NotificationMessage(title, text).Show() \ No newline at end of file diff --git a/src/output.py b/src/output.py new file mode 100644 index 00000000..3078a623 --- /dev/null +++ b/src/output.py @@ -0,0 +1,32 @@ +# *- coding: utf-8 -*- +import logging as original_logging +logging = original_logging.getLogger('core.output') + +from accessible_output2 import outputs +import sys + +speaker = None + +def speak(text, interrupt=0): + global speaker + if not speaker: + setup() + speaker.speak(text,interrupt) + +def setup (): + global speaker + logging.debug("Initializing output subsystem.") + try: +# speaker = speech.Speaker(speech.outputs.Sapi5()) +# else: + speaker = outputs.auto.Auto() + except: + return logging.exception("Output: Error during initialization.") + +def Copy(text): + import win32clipboard + #Copies text to the clipboard. + win32clipboard.OpenClipboard() + win32clipboard.EmptyClipboard() + win32clipboard.SetClipboardText(text) + win32clipboard.CloseClipboard() diff --git a/src/paths.py b/src/paths.py new file mode 100644 index 00000000..64732177 --- /dev/null +++ b/src/paths.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +import platform +import os +import sys +from platform_utils import paths as paths_ + +from functools import wraps + +mode = None +directory = None + +def merge_paths(func): + @wraps(func) + def merge_paths_wrapper(*a): + return unicode(os.path.join(func(), *a)) + return merge_paths_wrapper + +@merge_paths +def app_path(): + return paths_.app_path() + +@merge_paths +def config_path(): + global mode, directory + if mode == "portable": + if directory != None: path = os.path.join(directory, "config") + elif directory == None: path = app_path(u"config") + elif mode == "installed": + path = data_path("config") + if not os.path.exists(path): + os.mkdir(path) + return path + +@merge_paths +def logs_path(): + global mode, directory + if mode == "portable": + if directory != None: path = os.path.join(directory, "logs") + elif directory == None: path = app_path(u"logs") + elif mode == "installed": + path = data_path("logs") + if not os.path.exists(path): + os.mkdir(path) + return path + +@merge_paths +def data_path(app_name='TW blue'): +# if platform.system() == "Windows": +# import shlobj +# data_path = os.path.join(shlobj.SHGetFolderPath(0, shlobj.CSIDL_APPDATA), app_name) +# else: + if platform.system() == "Windows": + data_path = os.path.join(os.getenv("AppData"), app_name) + else: + data_path = os.path.join(os.environ['HOME'], ".%s" % app_name) + if not os.path.exists(data_path): + os.mkdir(data_path) + return data_path + +@merge_paths +def locale_path(): + return app_path(u"locales") + +@merge_paths +def sound_path(): + return app_path(u"sounds") \ No newline at end of file diff --git a/src/platform_utils/__init__.py b/src/platform_utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/platform_utils/autostart/__init__.py b/src/platform_utils/autostart/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/platform_utils/autostart/windows.py b/src/platform_utils/autostart/windows.py new file mode 100644 index 00000000..86fcbe0d --- /dev/null +++ b/src/platform_utils/autostart/windows.py @@ -0,0 +1,41 @@ +import _winreg +import os +import sys +from platform_utils import paths + +RUN_REGKEY = ur"SOFTWARE\Microsoft\Windows\CurrentVersion\Run" + +def is_installed(app_subkey): + """Checks if the currently running copy is installed or portable variant. Requires the name of the application subkey found under the uninstall section in Windows registry.""" + + try: + key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\%s" % app_subkey) + inst_dir = _winreg.QueryValueEx(key,"InstallLocation")[0] + except WindowsError: + return False + _winreg.CloseKey(key) + try: + return os.stat(inst_dir) == os.stat(paths.app_path()) + except WindowsError: + return False + +def getAutoStart(app_name): + """Queries if the automatic startup should be set for the application or not, depending on it's current state.""" + + try: + key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, RUN_REGKEY) + val = _winreg.QueryValueEx(key, unicode(app_name))[0] + return os.stat(val) == os.stat(sys.argv[0]) + except (WindowsError, OSError): + return False + +def setAutoStart(app_name, enable=True): + """Configures automatic startup for the application, if the enable argument is set to True. If set to False, deletes the application AutoStart value.""" + + if getAutoStart(app_name) == enable: + return + key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, RUN_REGKEY, 0, _winreg.KEY_WRITE) + if enable: + _winreg.SetValueEx(key, unicode(app_name), None, _winreg.REG_SZ, sys.argv[0]) + else: + _winreg.DeleteValue(key, unicode(app_name)) diff --git a/src/platform_utils/blackhole.py b/src/platform_utils/blackhole.py new file mode 100644 index 00000000..7a089b40 --- /dev/null +++ b/src/platform_utils/blackhole.py @@ -0,0 +1,16 @@ +# Replacement for py2exe distributed module +# Avoids the use of the standard py2exe console. +# Just import this file and it should go away + +import sys +if hasattr(sys,"frozen"): # true only if we are running as a py2exe app + class Blackhole(object): + def write(self,text): + pass + def flush(self): + pass + sys.stdout = Blackhole() + sys.stderr = Blackhole() + del Blackhole + del sys + diff --git a/src/platform_utils/libloader.py b/src/platform_utils/libloader.py new file mode 100644 index 00000000..548207d3 --- /dev/null +++ b/src/platform_utils/libloader.py @@ -0,0 +1,51 @@ +import ctypes +import collections +import platform +import os + +TYPES = { + 'Linux': { + 'loader': ctypes.CDLL, + 'functype': ctypes.CFUNCTYPE, + 'prefix': 'lib', + 'extension': '.so' + }, + 'Darwin': { + 'loader': ctypes.CDLL, + 'functype': ctypes.CFUNCTYPE, + 'prefix': 'lib', + 'extension': '.dylib' + }, +} +if platform.system() == 'Windows': + TYPES['Windows'] = { + 'loader': ctypes.WinDLL, + 'functype': ctypes.WINFUNCTYPE, + 'prefix': "", + 'extension': '.dll' + } + +class LibraryLoadError(Exception): pass + +def load_library(library, x86_path='.', x64_path='.', *args, **kwargs): + lib = find_library_path(library, x86_path=x86_path, x64_path=x64_path) + loaded = _do_load(lib, *args, **kwargs) + if loaded is not None: + return loaded + raise LibraryLoadError('unable to load %r. Provided library path: %r' % (library, path)) + +def _do_load(file, *args, **kwargs): + loader = TYPES[platform.system()]['loader'] + return loader(file, *args, **kwargs) + +def find_library_path(libname, x86_path='.', x64_path='.'): + libname = '%s%s' % (TYPES[platform.system()]['prefix'], libname) + if platform.machine() == 'x86_64': + path = os.path.join(x64_path, libname) + else: + path = os.path.join(x86_path, libname) + ext = TYPES[platform.system()]['extension'] + return '%s%s' % (path, ext) + +def get_functype(): + return TYPES[platform.system()]['functype'] diff --git a/src/platform_utils/paths.py b/src/platform_utils/paths.py new file mode 100644 index 00000000..912e28af --- /dev/null +++ b/src/platform_utils/paths.py @@ -0,0 +1,114 @@ +import inspect +import platform +import os +import subprocess +import sys +import string +import unicodedata + + +def app_data_path(app_name=None): + """Cross-platform method for determining where to put application data.""" + """Requires the name of the application""" + plat = platform.system() + if plat == 'Windows': + import winpaths + path = winpaths.get_appdata() + elif plat == 'Darwin': + path = os.path.join(os.path.expanduser('~'), 'Library', 'Application Support') + elif plat == 'Linux': + path = os.path.expanduser('~') + app_name = '.%s' % app_name.replace(' ', '_') + return os.path.join(path, app_name) + +def prepare_app_data_path(app_name): + """Creates the application's data directory, given its name.""" + dir = app_data_path(app_name) + return ensure_path(dir) + +def embedded_data_path(): + if platform.system() == 'Darwin' and is_frozen(): + return os.path.abspath(os.path.join(executable_directory(), '..', 'Resources')) + return app_path() + +def is_frozen(): + """Return a bool indicating if application is compressed""" + import imp + return hasattr(sys, 'frozen') or imp.is_frozen("__main__") + +def get_executable(): + """Returns the full executable path/name if frozen, or the full path/name of the main module if not.""" + if is_frozen(): + if platform.system() != 'Darwin': + return sys.executable +#On darwin, sys.executable points to python. We want the full path to the exe we ran. + exedir = os.path.abspath(os.path.dirname(sys.executable)) + items = os.listdir(exedir) + items.remove('python') + return os.path.join(exedir, items[0]) + #Not frozen + try: + import __main__ + return os.path.abspath(__main__.__file__) + except AttributeError: + return sys.argv[0] + +def get_module(level=2): + """Hacky method for deriving the caller of this function's module.""" + return inspect.getmodule(inspect.stack()[level][0]).__file__ + +def executable_directory(): + """Always determine the directory of the executable, even when run with py2exe or otherwise frozen""" + executable = get_executable() + path = os.path.abspath(os.path.dirname(executable)) + return path + +def app_path(): + """Return the root of the application's directory""" + path = executable_directory() + if is_frozen() and platform.system() == 'Darwin': + path = os.path.abspath(os.path.join(path, '..', '..')) + return path + +def module_path(level=2): + return os.path.abspath(os.path.dirname(get_module(level))) + +def documents_path(): + """On windows, returns the path to My Documents. On OSX, returns the user's Documents folder. For anything else, returns the user's home directory.""" + plat = platform.system() + if plat == 'Windows': + import winpaths + path = winpaths.get_my_documents() + elif plat == 'Darwin': + path = os.path.join(os.path.expanduser('~'), 'Documents') + else: + path = os.path.expanduser('~') + return path + +def safe_filename(filename): + """Given a filename, returns a safe version with no characters that would not work on different platforms.""" + SAFE_FILE_CHARS = "'-_.()[]{}!@#$%^&+=`~ " + filename = unicode(filename) + new_filename = ''.join(c for c in filename if c in SAFE_FILE_CHARS or c.isalnum()) + #Windows doesn't like directory names ending in space, macs consider filenames beginning with a dot as hidden, and windows removes dots at the ends of filenames. + return new_filename.strip(' .') + +def ensure_path(path): + if not os.path.exists(path): + os.makedirs(path) + return path + +def start_file(path): + if platform.system() == 'Windows': + os.startfile(path) + else: + subprocess.Popen(['open', path]) + +def get_applications_path(): + """Return the directory where applications are commonly installed on the system.""" + plat = platform.system() + if plat == 'Windows': + import winpaths + return winpaths.get_program_files() + elif plat == 'Darwin': + return '/Applications' diff --git a/src/platform_utils/process.py b/src/platform_utils/process.py new file mode 100644 index 00000000..78a625e8 --- /dev/null +++ b/src/platform_utils/process.py @@ -0,0 +1,27 @@ +import platform +import ctypes +import os +import signal + + +def kill_windows_process(pid): + PROCESS_TERMINATE = 1 + SYNCHRONIZE=1048576 + handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE | SYNCHRONIZE, False, pid) + ctypes.windll.kernel32.TerminateProcess(handle, -1) + ctypes.windll.kernel32.WaitForSingleObject(handle, 1000) + ctypes.windll.kernel32.CloseHandle(handle) + +def kill_unix_process(pid): + try: + os.kill(pid, signal.SIGKILL) + except OSError: + pass + +def kill_process(pid): + if pid < 0: + return + if platform.system() == 'Windows': + kill_windows_process(pid) + else: + kill_unix_process(pid) diff --git a/src/platform_utils/shell_integration/__init__.py b/src/platform_utils/shell_integration/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/platform_utils/shell_integration/windows.py b/src/platform_utils/shell_integration/windows.py new file mode 100644 index 00000000..b25a1250 --- /dev/null +++ b/src/platform_utils/shell_integration/windows.py @@ -0,0 +1,10 @@ +import _winreg + +SHELL_REGKEY = ur"Directory\shell" + +def context_menu_integrate(item_key_name, item_display_text, item_command): + app_menu_key = _winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, SHELL_REGKEY, 0, _winreg.KEY_WRITE) + menu_item_key = _winreg.CreateKey(app_menu_key, item_key_name) + _winreg.SetValueEx(menu_item_key, None, None, _winreg.REG_SZ, item_display_text) + item_command_key = _winreg.CreateKey(menu_item_key, 'command') + _winreg.SetValueEx(item_command_key, None, None, _winreg.REG_SZ, item_command) diff --git a/src/platform_utils/web_browser.py b/src/platform_utils/web_browser.py new file mode 100644 index 00000000..6be9233c --- /dev/null +++ b/src/platform_utils/web_browser.py @@ -0,0 +1,9 @@ +import platform +import webbrowser + +def open(url): + if platform.system() == 'Windows': + browser = webbrowser.get('windows-default') + else: + browser = webbrowser + browser.open_new_tab(url) diff --git a/src/sessionmanager/__init__.py b/src/sessionmanager/__init__.py new file mode 100644 index 00000000..01e76232 --- /dev/null +++ b/src/sessionmanager/__init__.py @@ -0,0 +1 @@ +# -*- coding: cp1252 -*- diff --git a/src/sessionmanager/gui.py b/src/sessionmanager/gui.py new file mode 100644 index 00000000..3407c5f7 --- /dev/null +++ b/src/sessionmanager/gui.py @@ -0,0 +1,101 @@ +# -*- coding: utf-8 -*- +import time +import wx +import manager +import session_exceptions +import paths +import config +import sound +import languageHandler +import output +import os +import twitter +import webbrowser +from multiplatform_widgets import widgets +from config_utils import Configuration + +class sessionManagerWindow(wx.Dialog): + def __init__(self): + super(sessionManagerWindow, self).__init__(parent=None, title=_(u"Session manager"), size=wx.DefaultSize) +# panelSizer = wx.BoxSizer(wx.VERTICAL) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + label = wx.StaticText(panel, -1, _(u"Select a twitter account to start TW Blue"), size=wx.DefaultSize) + listSizer = wx.BoxSizer(wx.HORIZONTAL) + self.list = widgets.list(panel, _(u"Account"), style=wx.LC_SINGLE_SEL|wx.LC_REPORT) + self.fill_list() + listSizer.Add(label, 0, wx.ALL, 5) + listSizer.Add(self.list.list, 0, wx.ALL, 5) + sizer.Add(listSizer, 0, wx.ALL, 5) + new = wx.Button(panel, -1, _(u"New account"), size=wx.DefaultSize) + new.Bind(wx.EVT_BUTTON, self.new_account) + ok = wx.Button(panel, wx.ID_OK, size=wx.DefaultSize) + ok.SetDefault() + ok.Bind(wx.EVT_BUTTON, self.ok) + cancel = wx.Button(panel, wx.ID_CANCEL, size=wx.DefaultSize) + buttons = wx.BoxSizer(wx.HORIZONTAL) + buttons.Add(new, 0, wx.ALL, 5) + buttons.Add(ok, 0, wx.ALL, 5) + buttons.Add(cancel, 0, wx.ALL, 5) + sizer.Add(buttons, 0, wx.ALL, 5) + panel.SetSizer(sizer) +# sizer.Layout() +# self.Fit() +# self.SetSize(panel.GetBestSize()) +# panelSizer.Add(panel) +# self.SetSizerAndFit(sizer) +# sizer.Layout() + min = sizer.CalcMin() + self.SetClientSize(min) + + def fill_list(self): + self.sessions = [] + for i in os.listdir(paths.config_path()): + if os.path.isdir(paths.config_path(i)): + strconfig = "%s/session.conf" % (paths.config_path(i)) + config_test = Configuration(strconfig) + name = config_test["twitter"]["user_name"] + if name != "" and config_test["twitter"]["user_key"] != "" and config_test["twitter"]["user_secret"] != "": + self.list.insert_item(False, name) + self.sessions.append(i) + if self.list.get_count() > 0: + self.list.select_item(0) + self.list.list.SetSize(self.list.list.GetBestSize()) + + def ok(self, ev): + if self.list.get_count() == 0: + wx.MessageDialog(None, _(u"You need to configure an account."), _(u"Account Error"), wx.ICON_ERROR).ShowModal() + return + current_session = self.sessions[self.list.get_selected()] + manager.manager.set_current_session(current_session) + config.MAINFILE = "%s/session.conf" % (manager.manager.get_current_session()) + config.setup() + lang=config.main['general']['language'] + languageHandler.setLanguage(lang) + sound.setup() + output.setup() +# else: +# self.name = current_session + self.EndModal(wx.ID_OK) + + def new_account(self, ev): + twitter_object = twitter.twitter.twitter() + dlg = wx.MessageDialog(self, _(u"The request for the required Twitter authorization to continue will be opened on your browser. You only need to do it once. Would you like to autorhise a new account now?"), _(u"Authorisation"), wx.YES_NO) + if dlg.ShowModal() == wx.ID_NO: + return + else: + location = (str(time.time())[:12]) + manager.manager.add_session(location) + config.MAINFILE = "%s/session.conf" % (location,) + config.setup() + try: + twitter_object.authorise() + except: + wx.MessageDialog(None, _(u"Your access token is invalid or the authorisation has failed. Please try again."), _(u"Invalid user token"), wx.ICON_ERROR).ShowModal() + return + total = self.list.get_count() + name = _(u"Authorised account %d") % (total+1) + self.list.insert_item(False, name) + if self.list.get_count() == 1: + self.list.select_item(0) + self.sessions.append(location) diff --git a/src/sessionmanager/manager.py b/src/sessionmanager/manager.py new file mode 100644 index 00000000..8259a58c --- /dev/null +++ b/src/sessionmanager/manager.py @@ -0,0 +1,43 @@ +# -*- coding: cp1252 -*- +from config_utils import Configuration, ConfigurationResetException +import paths +import os +import session_exceptions + +manager = None +def setup(): + global manager + manager = sessionManager() + +class sessionManager(object): + def __init__(self): + FILE = "sessions.conf" + SPEC = "sessions.defaults" + try: + self.main = Configuration(paths.config_path(FILE), paths.app_path(SPEC)) + except ConfigurationResetException: + pass + + def get_current_session(self): + if self.is_valid(self.main["sessions"]["current_session"]): + return self.main["sessions"]["current_session"] + else: + return False + + def add_session(self, id): + path = paths.config_path(id) + if not os.path.exists(path): + os.mkdir(path) + self.main["sessions"]["sessions"].append(id) + + def set_current_session(self, sessionID): + self.main["sessions"]["current_session"] = sessionID + self.main.write() + + def is_valid(self, id): + if not os.path.exists(paths.config_path(id)): + raise session_exceptions.NonExistentSessionError("That session does not exist.") + self.main["sessions"]["current_session"] = "" + return False + else: + return True \ No newline at end of file diff --git a/src/sessionmanager/session_exceptions.py b/src/sessionmanager/session_exceptions.py new file mode 100644 index 00000000..6a6502f1 --- /dev/null +++ b/src/sessionmanager/session_exceptions.py @@ -0,0 +1,5 @@ +# -*- coding: cp1252 -*- +import exceptions + +class InvalidSessionError(exceptions.Exception): pass +class NonExistentSessionError(exceptions.Exception): pass diff --git a/src/sessions.defaults b/src/sessions.defaults new file mode 100644 index 00000000..18e2f81c --- /dev/null +++ b/src/sessions.defaults @@ -0,0 +1,3 @@ +[sessions] +current_session = string(default="") +sessions = list(default=list()) \ No newline at end of file diff --git a/src/setup.py b/src/setup.py new file mode 100644 index 00000000..2b7eed40 --- /dev/null +++ b/src/setup.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- +""" Setup file to create executables and distribute the source code of this application. Don't forget this file! """ +############################################################ +# Copyright (c) 2014 José Manuel Delicado Alcolea +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +from setuptools import setup, find_packages +import py2exe +import os +import gettext, gettext_windows; gettext_windows.setup_env_windows() +import application +import platform +from glob import glob + +def get_architecture_files(): + if platform.architecture()[0][:2] == "32": + return [ + ("", ["../windows-dependencies/x86/oggenc2.exe", "../windows-dependencies/x86/bootstrap.exe"]), + ("Microsoft.VC90.CRT", glob("../windows-dependencies/x86/Microsoft.VC90.CRT/*")), + ("Microsoft.VC90.MFC", glob("../windows-dependencies/x86/Microsoft.VC90.MFC/*")),] + elif platform.architecture()[0][:2] == "64": + return [ + ("", ["../windows-dependencies/x64/oggenc2.exe", "../windows-dependencies/x86/bootstrap.exe"]), + ("Microsoft.VC90.CRT", glob("../windows-dependencies/x64/Microsoft.VC90.CRT/*")), + ("Microsoft.VC90.MFC", glob("../windows-dependencies/x64/Microsoft.VC90.MFC/*")),] + +def get_data(): + import accessible_output2 + import sound_lib + import enchant + return [ + ("", ["conf.defaults", "sessions.defaults", "icon.ico"]), + ("dropbox", ["trusted-certs.crt"]), + ("requests", ["cacert.pem"]), + ("accessible_output2/lib", glob("accessible_output2/lib/*.dll")), +]+get_sounds()+get_locales()+get_documentation()+sound_lib.find_datafiles()+accessible_output2.find_datafiles()+enchant.utils.win32_data_files()+get_architecture_files() + +def get_documentation (): + answer = [] + depth = 6 + for root, dirs, files in os.walk('documentation'): + if depth == 0: + break + new = (root, glob(os.path.join(root, "*.html"))) + answer.append(new) + depth -= 1 + return answer + +def get_sounds(): + answer = [] + depth = 6 + for root, dirs, files in os.walk('sounds'): + if depth == 0: + break + new = (root, glob(os.path.join(root, "*.ogg"))) + answer.append(new) + depth -= 1 + return answer + +def get_locales(): + answer = [] + for root, dirs, files in os.walk('locales'): + new = (root, glob(os.path.join(root, '*.mo'))) + answer.append(new) + return answer + +if __name__ == '__main__': + setup( + name = application.name, + author = application.author, + author_email = application.authorEmail, + version = application.version, + url = application.url, +packages=find_packages(), +data_files = get_data(), +options = { + 'py2exe': { + 'optimize':2, + 'dll_excludes': ["MPR.dll", "api-ms-win-core-apiquery-l1-1-0.dll", "api-ms-win-core-console-l1-1-0.dll", "api-ms-win-core-delayload-l1-1-1.dll", "api-ms-win-core-errorhandling-l1-1-1.dll", "api-ms-win-core-file-l1-2-0.dll", "api-ms-win-core-handle-l1-1-0.dll", "api-ms-win-core-heap-obsolete-l1-1-0.dll", "api-ms-win-core-libraryloader-l1-1-1.dll", "api-ms-win-core-localization-l1-2-0.dll", "api-ms-win-core-processenvironment-l1-2-0.dll", "api-ms-win-core-processthreads-l1-1-1.dll", "api-ms-win-core-profile-l1-1-0.dll", "api-ms-win-core-registry-l1-1-0.dll", "api-ms-win-core-synch-l1-2-0.dll", "api-ms-win-core-sysinfo-l1-2-0.dll", "api-ms-win-security-base-l1-2-0.dll", "api-ms-win-core-heap-l1-2-0.dll", "api-ms-win-core-interlocked-l1-2-0.dll", "api-ms-win-core-localization-obsolete-l1-1-0.dll", "api-ms-win-core-string-l1-1-0.dll", "api-ms-win-core-string-obsolete-l1-1-0.dll", "WLDAP32.dll", "MSVCP90.dll"], + 'skip_archive': True + }, + }, + windows = [ + { + 'script': 'main.py', + 'dest_base': 'TWBlue', +} + ], + install_requires = [ + ] + ) diff --git a/src/sound.py b/src/sound.py new file mode 100644 index 00000000..4fb0a7a1 --- /dev/null +++ b/src/sound.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- +""" Sound utilities.""" +############################################################ +# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +############################################################ +import sys +import url_shortener +import audio_services +import config +import os +import logging as original_logger +log = original_logger.getLogger("sound") +import paths +import sound_lib +import subprocess +import platform +system = platform.system() +from mysc.repeating_timer import RepeatingTimer + +player = None + +def setup(): + global player + if not player: + player = soundSystem() + +def recode_audio(filename, quality=4.5): + global system + if system == "Windows": subprocess.call(r'"%s" -q %r "%s"' % (paths.app_path('oggenc2.exe'), quality, filename)) + +def recording(filename): +# try: + val = sound_lib.recording.WaveRecording(filename=filename) +# except sound_lib.main.BassError: +# sound_lib.input.Input() +# val = sound_lib.recording.WaveRecording(filename=filename) + return val + +class soundSystem(object): + + def check_soundpack(self): + """ Checks if the folder where live the current soundpack exists.""" + self.soundpack_OK = False + if os.path.exists(paths.sound_path(config.main["sound"]["current_soundpack"])): + self.path = paths.sound_path(config.main["sound"]["current_soundpack"]) + self.soundpack_OK = True + elif os.path.exists(paths.sound_path("default")): + self.path = paths.sound_path("default") + self.soundpack_OK = True + else: + self.soundpack_OK = False + + def __init__(self): + """ Sound Player.""" + # Set the output and input default devices. + self.output = sound_lib.output.Output() + self.input = sound_lib.input.Input() + # Try to use the selected device from the configuration. It can fail if the machine does not has a mic. + try: + self.output.set_device(self.output.find_device_by_name(config.main["sound"]["output_device"])) + self.input.set_device(self.input.find_device_by_name(config.main["sound"]["input_device"])) + except: + config.main["sound"]["output_device"] = "Default" + config.main["sound"]["input_device"] = "Default" + + self.files = [] + self.cleaner = RepeatingTimer(60, self.clear_list) + self.cleaner.start() + self.check_soundpack() + + def clear_list(self): + log.debug("Cleaning sounds... Total sounds found: %i" % len(self.files)) + if self.files == []: return + for i in xrange(0, len(self.files)): + if self.files[i].is_playing == False: + self.files[i].free() + self.files.pop(i) + log.debug("Files used now: %i" % len(self.files)) + + def play(self, sound, argument=False): + if self.soundpack_OK == False: return + if config.main["sound"]["global_mute"] == True: return + sound_object = sound_lib.stream.FileStream(file="%s/%s" % (self.path, sound)) + sound_object.volume = float(config.main["sound"]["volume"]) + self.files.append(sound_object) + sound_object.play() + +class urlStream(object): + def __init__(self, url): + self.url = url + log.debug(u"URL: %s" % url) + self.prepared = False + + def prepare(self): + self.prepared = False + url = url_shortener.unshorten(self.url) + log.debug("url desacortada: "+str(url)) + if url != None: + self.url = url + transformer = audio_services.find_url_transformer(self.url) + self.url = transformer(self.url) + log.debug(u"Url transformada: %s" % self.url) + prepare = True + + def play(self): + self.stream = sound_lib.stream.URLStream(url=self.url) + self.stream.volume = float(config.main["sound"]["volume"]) + self.stream.play() + + @staticmethod + def delete_old_tempfiles(): + for f in glob(os.path.join(tempfile.gettempdir(), 'tmp*.wav')): + try: + os.remove(f) + except: + pass + diff --git a/src/sound_lib/__init__.py b/src/sound_lib/__init__.py new file mode 100644 index 00000000..6256b3bd --- /dev/null +++ b/src/sound_lib/__init__.py @@ -0,0 +1,25 @@ +import output, input, recording, stream + +__author__ = 'Christopher Toth' +__version__ = 0.73 + +def find_datafiles(): + from glob import glob + import os + import platform + import sound_lib + path = os.path.join(sound_lib.__path__[0], 'lib') + system = platform.system() + if system == 'Windows': + file_ext = '*.dll' + elif system == 'Darwin': + file_ext = '*.dylib' + else: + file_ext = '*.so' + if platform.architecture()[0] == '32bit' or platform.system() == 'Darwin': + arch = 'x86' + else: + arch = 'x64' + dest_dir = os.path.join('sound_lib', 'lib', arch) + source = glob(os.path.join(path, arch, file_ext)) + return [(dest_dir, source)] diff --git a/src/sound_lib/channel.py b/src/sound_lib/channel.py new file mode 100644 index 00000000..274104be --- /dev/null +++ b/src/sound_lib/channel.py @@ -0,0 +1,285 @@ +from __future__ import absolute_import +from .external.pybass import * +from .main import bass_call, bass_call_0, BassError, update_3d_system, FlagObject +from ctypes import pointer, c_float, c_long, c_ulong, c_buffer + +class Channel (FlagObject): + """A "channel" can be a sample playback channel (HCHANNEL), a sample stream (HSTREAM), a MOD music (HMUSIC), or a recording (HRECORD). Each "Channel" function can be used with one or more of these channel types.""" + + def __init__ (self, handle): + self.handle = handle + self.attribute_mapping = { + 'eaxmix': BASS_ATTRIB_EAXMIX, + 'frequency': BASS_ATTRIB_FREQ, + 'pan': BASS_ATTRIB_PAN, + 'volume': BASS_ATTRIB_VOL + } + + def add_attributes_to_mapping(self, **attrs): + self.attribute_mapping.update(**attrs) + + def play (self, restart=False): + """Starts (or resumes) playback of a sample, stream, MOD music, or recording.""" + return bass_call(BASS_ChannelPlay, self.handle, restart) + + def play_blocking(self, restart=False): + self.play(restart=restart) + while self.is_playing: + pass + + def pause (self): + return bass_call(BASS_ChannelPause, self.handle) + + def is_active (self): + "Checks if a sample, stream, or MOD music is active (playing) or stalled. Can also check if a recording is in progress.""" + return bass_call_0(BASS_ChannelIsActive, self.handle) + + @property + def is_playing(self): + return self.is_active() == BASS_ACTIVE_PLAYING + + @property + def is_paused(self): + return self.is_active() == BASS_ACTIVE_PAUSED + + @property + def is_stopped(self): + return self.is_active() == BASS_ACTIVE_STOPPED + + @property + def is_stalled(self): + return self.is_active() == BASS_ACTIVE_STALLED + + def get_position (self, mode=BASS_POS_BYTE): + """Retrieves the playback position of a sample, stream, or MOD music. Can also be used with a recording channel.""" + return bass_call_0(BASS_ChannelGetPosition, self.handle, mode) + + def set_position (self, pos, mode=BASS_POS_BYTE): + """Sets the playback position of a sample, MOD music, or stream.""" + return bass_call(BASS_ChannelSetPosition, self.handle, pos, mode) + + position = property(get_position, set_position) + + def stop (self): + """Stops a sample, stream, MOD music, or recording.""" + return bass_call(BASS_ChannelStop, self.handle) + + def update (self, length=0): + """Updates the playback buffer of a stream or MOD music.""" + return bass_call(BASS_ChannelUpdate, self.handle, length) + + def get_length (self, mode=BASS_POS_BYTE): + return bass_call_0(BASS_ChannelGetLength, self.handle, mode) + + __len__ = get_length + + def __bool__(self): + return True + + def get_device(self): + """Retrieves the device that a channel is using.""" + return bass_call_0( BASS_ChannelGetDevice, self.handle) + + def set_device (self, device): + """Changes the device that a stream, MOD music or sample is using.""" + bass_call(BASS_ChannelSetDevice, self.handle, device) + + device = property(get_device, set_device) + + def set_fx(self, type, priority=0): + """Sets an effect on a stream, MOD music, or recording channel.""" + return SoundEffect(bass_call(BASS_ChannelSetFX, type, priority)) + + def bytes_to_seconds(self, position=None): + """Translates a byte position into time (seconds), based on a channel's format.""" + position = position or self.position + return bass_call_0(BASS_ChannelBytes2Seconds, self.handle, position) + + def length_in_seconds(self): + return self.bytes_to_seconds(self.get_length()) + + + def seconds_to_bytes(self, position): + """Translates a time (seconds) position into bytes, based on a channel's format.""" + return bass_call_0(BASS_ChannelSeconds2Bytes, self.handle, position) + + def get_attribute(self, attribute): + """Retrieves the value of a channel's attribute.""" + value = pointer(c_float()) + if attribute in self.attribute_mapping: + attribute = self.attribute_mapping[attribute] + bass_call(BASS_ChannelGetAttribute, self.handle, attribute, value) + return value.contents.value + + def set_attribute(self, attribute, value): + """Sets the value of a channel's attribute.""" + if attribute in self.attribute_mapping: + attribute = self.attribute_mapping[attribute] + return bass_call(BASS_ChannelSetAttribute, self.handle, attribute, value) + + def slide_attribute(self, attribute, value, time): + """Slides a channel's attribute from its current value to a new value.""" + if attribute in self.attribute_mapping: + attribute = self.attribute_mapping[attribute] + return bass_call(BASS_ChannelSlideAttribute, self.handle, attribute, value, time*1000) + + def is_sliding (self, attribute=None): + """Checks if an attribute (or any attribute) of a sample, stream, or MOD music is sliding.""" + return bass_call_0(BASS_ChannelIsSliding, self.handle, attribute) + + def get_info(self): + """Retrieves information on a channel.""" + value = pointer(BASS_CHANNELINFO()) + bass_call(BASS_ChannelGetInfo, self.handle, value) + return value[0] + + def get_level(self): + """Retrieves the level (peak amplitude) of a stream, MOD music or recording channel.""" + return bass_call_0(BASS_ChannelGetLevel, self.handle) + + def lock(self): + """Locks a stream, MOD music or recording channel to the current thread.""" + return bass_call(BASS_ChannelLock, self.handle, True) + + def unlock(self): + """Unlocks a stream, MOD music or recording channel from the current thread.""" + return bass_call(BASS_ChannelLock, self.handle, False) + + def get_3d_attributes(self): + """Retrieves the 3D attributes of a sample, stream, or MOD music channel with 3D functionality.""" + answer = dict(mode=c_ulong(), min=c_float(), max=c_float(), iangle=c_ulong(), oangle=c_ulong(), outvol=c_float()) + bass_call(BASS_ChannelGet3DAttributes, self.handle, pointer(answer['mode']), pointer(answer['min']), pointer(answer['max']), pointer(answer['iangle']), pointer(answer['oangle']), pointer(answer['outvol'])) + for k in answer: + answer[k] = answer[k].value() + return answer + + @update_3d_system + def set_3d_attributes(self, mode=-1, min=0.0, max=0.0, iangle=-1, oangle=-1, outvol=-1): + """Sets the 3D attributes of a sample, stream, or MOD music channel with 3D functionality.""" + return bass_call(BASS_ChannelSet3DAttributes, self.handle, mode, min, max, iangle, oangle, outvol) + + def get_3d_position(self): + """Retrieves the 3D position of a sample, stream, or MOD music channel with 3D functionality.""" + answer = dict(position=BASS_3DVECTOR(), orientation=BASS_3DVECTOR(), velocity=BASS_3DVECTOR()) + bass_call(BASS_ChannelGet3DPosition, self.handle, pointer(answer['position']), pointer(answer['orientation']), pointer(answer['velocity'])) + return answer + + @update_3d_system + def set_3d_position(self, position=None, orientation=None, velocity=None): + """Sets the 3D position of a sample, stream, or MOD music channel with 3D functionality.""" + if position: + position = pointer(position) + if orientation: + orientation = pointer(orientation) + if velocity: + velocity = pointer(velocity) + return bass_call(BASS_ChannelSet3DPosition, self.handle, position, orientation, velocity) + + def set_link(self, handle): + """Links two MOD music or stream channels together.""" + bass_call(BASS_ChannelSetLink, self.handle, handle) + + def remove_link(self, handle): + """Removes a link between two MOD music or stream channels.""" + return bass_call(BASS_ChannelRemoveLink, self.handle, handle) + + def __iadd__(self, other): + """Convenience method to link this channel to another. Calls set_link on the passed in item's handle""" + self.set_link(other.handle) + return self + + def __isub__(self, other): + """Convenience method to unlink this channel from another. Calls remove_link on the passed in item's handle""" + self.remove_link(other.handle) + return self + + def get_frequency(self): + return self.get_attribute(BASS_ATTRIB_FREQ ) + + def set_frequency(self, frequency): + self.set_attribute(BASS_ATTRIB_FREQ, frequency) + + frequency = property(fget=get_frequency, fset=set_frequency) + + def get_pan(self): + return self.get_attribute(BASS_ATTRIB_PAN) + + def set_pan(self, pan): + return self.set_attribute(BASS_ATTRIB_PAN, pan) + + pan = property(fget=get_pan, fset=set_pan) + + def get_volume(self): + return self.get_attribute(BASS_ATTRIB_VOL) + + def set_volume(self, volume): + self.set_attribute(BASS_ATTRIB_VOL, volume) + + volume = property(fget=get_volume, fset=set_volume) + + def get_data(self, length=16384): + buf = c_buffer(length) + bass_call_0(BASS_ChannelGetData, self.handle, pointer(buf), length) + return buf + + +#This is less and less of a one-to-one mapping, +#But I feel that it's better to be consistent with ourselves +#Than with the library. We won't punish ourselves +#For their bad decisions + + def get_looping(self): + return bass_call_0(BASS_ChannelFlags, self.handle, BASS_SAMPLE_LOOP, 0) == 20 + + def set_looping(self, looping): + if looping: + return bass_call_0(BASS_ChannelFlags, self.handle, BASS_SAMPLE_LOOP, BASS_SAMPLE_LOOP) + return bass_call_0(BASS_ChannelFlags, self.handle, 0, BASS_SAMPLE_LOOP) + + looping = property(fget=get_looping, fset=set_looping) + + def __del__(self): + try: + self.free() + except: + pass + + def get_x(self): + return self.get_3d_position()['position'].x + + def set_x(self, val): + pos = self.get_3d_position() + pos['position'].x = val + self.set_3d_position(**pos) + + x = property(fget=get_x, fset=set_x) + + def get_y(self): + return self.get_3d_position()['position'].y + + def set_y(self, val): + pos = self.get_3d_position() + pos['position'].y = val + self.set_3d_position(**pos) + + y = property(fget=get_y, fset=set_y) + + def get_z(self): + return self.get_3d_position()['position'].z + + def set_z(self, val): + pos = self.get_3d_position() + pos['position'].z = val + self.set_3d_position(**pos) + + z = property(fget=get_z, fset=set_z) + + def get_attributes(self): + """Retrieves all values of all attributes from this object and displays them in a dictionary whose keys are determined by this object's attribute_mapping""" + res = {} + for k in self.attribute_mapping: + try: + res[k] = self.get_attribute(k) + except BassError: + pass + return res diff --git a/src/sound_lib/config.py b/src/sound_lib/config.py new file mode 100644 index 00000000..4c48bea2 --- /dev/null +++ b/src/sound_lib/config.py @@ -0,0 +1,57 @@ +import collections +import ctypes +from sound_lib.external import pybass +from sound_lib.main import bass_call, bass_call_0 + +class BassConfig(collections.Mapping): + config_map = { + '3d_algorithm': pybass.BASS_CONFIG_3DALGORITHM, + 'buffer': pybass.BASS_CONFIG_BUFFER , + 'curve_vol': pybass.BASS_CONFIG_CURVE_VOL, + 'curve_pan': pybass.BASS_CONFIG_CURVE_PAN, + 'dev_buffer': pybass.BASS_CONFIG_DEV_BUFFER, + 'dev_default': pybass.BASS_CONFIG_DEV_DEFAULT, + 'float_dsp': pybass.BASS_CONFIG_FLOATDSP, + 'gvol_music': pybass.BASS_CONFIG_GVOL_MUSIC, + 'gvol_sample': pybass.BASS_CONFIG_GVOL_SAMPLE, + 'gvol_stream': pybass.BASS_CONFIG_GVOL_STREAM, + 'music_virtual': pybass.BASS_CONFIG_MUSIC_VIRTUAL, + 'net_agent': pybass.BASS_CONFIG_NET_AGENT, + 'net_buffer': pybass.BASS_CONFIG_NET_BUFFER, + 'net_passive': pybass.BASS_CONFIG_NET_PASSIVE, + 'net_playlist': pybass.BASS_CONFIG_NET_PLAYLIST, + 'net_prebuf': pybass.BASS_CONFIG_NET_PREBUF, + 'net_proxy': pybass.BASS_CONFIG_NET_PROXY, + 'net_read_timeout': pybass.BASS_CONFIG_NET_READTIMEOUT, + 'net_timeout': pybass.BASS_CONFIG_NET_TIMEOUT, + 'pause_no_play': pybass.BASS_CONFIG_PAUSE_NOPLAY, + 'rec_buffer': pybass.BASS_CONFIG_REC_BUFFER, + 'src': pybass.BASS_CONFIG_SRC, + 'src_sample': pybass.BASS_CONFIG_SRC_SAMPLE, + 'unicode': pybass.BASS_CONFIG_UNICODE, + 'update_period': pybass.BASS_CONFIG_UPDATEPERIOD, + 'update_threads': pybass.BASS_CONFIG_UPDATETHREADS, + 'verify': pybass.BASS_CONFIG_VERIFY, + 'vista_speakers': pybass.BASS_CONFIG_VISTA_SPEAKERS, + } + + ptr_config = (pybass.BASS_CONFIG_NET_AGENT, pybass.BASS_CONFIG_NET_PROXY) + + def __getitem__(self, key): + key = self.config_map.get(key, key) + if key in self.ptr_config: + return ctypes.string_at(bass_call(pybass.BASS_GetConfigPtr, key)) + return bass_call_0(pybass.BASS_GetConfig, key) + + def __setitem__(self, key, val): + key = self.config_map.get(key, key) + if key in self.ptr_config: + return bass_call(pybass.BASS_SetConfigPtr, key, ctypes.create_string_buffer(val)) + return bass_call(pybass.BASS_SetConfig, key, val) + + def __iter__(self): + for key in self.config_map.keys(): + yield key + + def __len__(self): + return len(self.config_map) diff --git a/src/sound_lib/effects/__init__.py b/src/sound_lib/effects/__init__.py new file mode 100644 index 00000000..c0268b9d --- /dev/null +++ b/src/sound_lib/effects/__init__.py @@ -0,0 +1 @@ +from .tempo import Tempo diff --git a/src/sound_lib/effects/bass.py b/src/sound_lib/effects/bass.py new file mode 100644 index 00000000..940e9d3b --- /dev/null +++ b/src/sound_lib/effects/bass.py @@ -0,0 +1,39 @@ +from __future__ import absolute_import +from sound_lib.external import pybass +from .effect import SoundEffect + +class Chorus(SoundEffect): + effect_type = pybass.BASS_FX_DX8_CHORUS + struct = pybass.BASS_DX8_CHORUS + +class Echo(SoundEffect): + effect_type = pybass.BASS_FX_DX8_ECHO + struct = pybass.BASS_DX8_ECHO + +class Compressor(SoundEffect): + effect_type = pybass.BASS_FX_DX8_COMPRESSOR + struct = pybass.BASS_DX8_COMPRESSOR + +class Reverb(SoundEffect): + effect_type = pybass.BASS_FX_DX8_REVERB + struct = pybass.BASS_DX8_REVERB + +class Distortion(SoundEffect): + effect_type = pybass.BASS_FX_DX8_DISTORTION + struct = pybass.BASS_DX8_DISTORTION + +class Flanger(SoundEffect): + effect_type = pybass.BASS_FX_DX8_FLANGER + struct = pybass.BASS_DX8_FLANGER + +class Gargle(SoundEffect): + effect_type = pybass.BASS_FX_DX8_GARGLE + struct = pybass.BASS_DX8_GARGLE + +class I3DL2Reverb(SoundEffect): + effect_type = pybass.BASS_FX_DX8_I3DL2REVERB + struct = pybass.BASS_DX8_I3DL2REVERB + +class ParamEq(SoundEffect): + effect_type = pybass.BASS_FX_DX8_PARAMEQ + struct = pybass.BASS_DX8_PARAMEQ diff --git a/src/sound_lib/effects/bass_fx.py b/src/sound_lib/effects/bass_fx.py new file mode 100644 index 00000000..67df3f7a --- /dev/null +++ b/src/sound_lib/effects/bass_fx.py @@ -0,0 +1,14 @@ +from __future__ import absolute_import +from sound_lib.external import pybass_fx +from .effect import SoundEffect + +class Volume(SoundEffect): + effect_type = pybass_fx.BASS_FX_BFX_VOLUME + struct = pybass_fx.BASS_BFX_VOLUME + +class PeakEq(SoundEffect): + effect_type = pybass_fx.BASS_FX_BFX_PEAKEQ + struct = pybass_fx.BASS_BFX_PEAKEQ +class DAmp(SoundEffect): + effect_type = pybass_fx.BASS_FX_BFX_DAMP + struct = pybass_fx.BASS_BFX_DAMP diff --git a/src/sound_lib/effects/effect.py b/src/sound_lib/effects/effect.py new file mode 100644 index 00000000..b24c3a1b --- /dev/null +++ b/src/sound_lib/effects/effect.py @@ -0,0 +1,71 @@ +from future.builtins import object +from sound_lib.main import bass_call +import ctypes +from sound_lib.external import pybass +import string #for the alphabet! + +class SoundEffect(object): + + def __init__(self, channel, type=None, priority=0): + self.original_channel = channel + if hasattr(channel, 'handle'): + channel = channel.handle + if type is None: + type = self.effect_type + self.effect_type = type + self.priority = priority + self.handle = bass_call(pybass.BASS_ChannelSetFX, channel, type, priority) + + def get_parameters(self): + """Retrieves the parameters of an effect.""" + res = {} + params = self.struct() + bass_call(pybass.BASS_FXGetParameters, self.handle, ctypes.pointer(params)) + for f in params._fields_: + res[f[0]] = getattr(params, f[0]) + return res + + def set_parameters(self, parameters): + params = self.struct() + for p, v in parameters.items(): + setattr(params, p, v) + bass_call(pybass.BASS_FXSetParameters, self.handle, ctypes.pointer(params)) + + def __dir__(self): + res = dir(self.__class__) + return res + self._get_pythonic_effect_fields() + + def _get_effect_fields(self): + return [i[0] for i in self.struct._fields_] + + def _get_pythonic_effect_fields(self): + return [self._bass_to_python(i) for i in self._get_effect_fields() if not i.startswith('_') ] + + def _bass_to_python(self, func): + for c in string.ascii_lowercase: + func = func.replace(c.upper(), '_%s' % c) + if func.startswith('_'): + func = func[1:] + return func[2:] + + def _python_to_bass(self, func): + for c in string.ascii_lowercase: + func = func.replace('_%s' % c, c.upper()) + func = '%s%s' % (func[0].upper(), func[1:]) + for f in self._get_effect_fields(): + if f.endswith(func): + func = f + return func + + def __getattr__(self, attr): + return self.get_parameters()[self._python_to_bass(attr)] + + def __setattr__(self, attr, val): + if attr not in self._get_pythonic_effect_fields(): + return super(SoundEffect, self).__setattr__(attr, val) + params = self.get_parameters() + key = self._python_to_bass(attr) + if key not in params: + raise AttributeError('Unable to set attribute, suspect issue with base name-munging code') + params[key] = val + self.set_parameters(params) diff --git a/src/sound_lib/effects/tempo.py b/src/sound_lib/effects/tempo.py new file mode 100644 index 00000000..8fe2f2be --- /dev/null +++ b/src/sound_lib/effects/tempo.py @@ -0,0 +1,65 @@ +import ctypes +from sound_lib.external import pybass, pybass_fx +from sound_lib.stream import BaseStream +from sound_lib.channel import Channel +from sound_lib.main import bass_call, bass_call_0 + +class Tempo(BaseStream): + + def __init__(self, channel, flags=0, loop=False, software=False, three_d=False, sample_fx=False, autofree=False, decode=False, free_source=False): + flags = flags | self.flags_for(loop=False, software=False, three_d=False, sample_fx=False, autofree=False, decode=False, free_source=False) + self.channel = channel + if isinstance(channel, Channel): + channel = channel.handle + handle = bass_call(pybass_fx.BASS_FX_TempoCreate, channel, flags) + super(Tempo, self).__init__(handle) + self.add_attributes_to_mapping( + tempo=pybass_fx.BASS_ATTRIB_TEMPO, + tempo_pitch=pybass_fx.BASS_ATTRIB_TEMPO_PITCH, + tempo_freq=pybass_fx.BASS_ATTRIB_TEMPO_FREQ, + ) + + + @property + def tempo(self): + """The tempo of a channel.""" + return self.get_attribute(pybass_fx.BASS_ATTRIB_TEMPO) + + @tempo.setter + def tempo(self, val): + self.set_attribute('tempo', val) + + @property + def tempo_pitch(self): + return self.get_attribute('tempo_pitch') + + @tempo_pitch.setter + def tempo_pitch(self, val): + self.set_attribute('tempo_pitch', val) + + @property + def tempo_freq(self): + return self.get_attribute('tempo_freq') + + @tempo_freq.setter + def tempo_freq(self, val): + self.set_attribute('tempo_freq', val) + + def setup_flag_mapping(self): + super(Tempo, self).setup_flag_mapping() + self.flag_mapping.update({ + 'free_source': pybass_fx.BASS_FX_FREESOURCE, + }) + + def get_source(self): + source = pybass_fx.BASS_FX_TempoGetSource(self.handle) + if source == self.channel.handle: + source = self.channel + return source + + source = property(fget=get_source) + + def get_rate_ratio(self): + return bass_call(pybass_fx.BASS_FX_TempoGetRateRatio, self.handle) + + rate_ratio = property(fget=get_rate_ratio) diff --git a/src/sound_lib/encoder.py b/src/sound_lib/encoder.py new file mode 100644 index 00000000..dab90f03 --- /dev/null +++ b/src/sound_lib/encoder.py @@ -0,0 +1,81 @@ +from __future__ import absolute_import +from .external import pybass, pybassenc +from .main import bass_call, bass_call_0, FlagObject + +class Encoder(FlagObject): + + def setup_flag_mapping(self): + #super(Encoder, self).setup_flag_mapping() + self.flag_mapping = { + 'pcm': pybassenc.BASS_ENCODE_PCM, + 'no_header': pybassenc.BASS_ENCODE_NOHEAD, + 'rf64': pybassenc.BASS_ENCODE_RF64, + 'big_endian': pybassenc.BASS_ENCODE_BIGEND, + 'fp_8bit': pybassenc.BASS_ENCODE_FP_8BIT, + 'fp_16bit': pybassenc.BASS_ENCODE_FP_16BIT, + 'fp_24bit': pybassenc.BASS_ENCODE_FP_24BIT, + 'fp_32bit': pybassenc.BASS_ENCODE_FP_32BIT, + 'queue': pybassenc.BASS_ENCODE_QUEUE, + 'limit': pybassenc.BASS_ENCODE_LIMIT, + 'no_limit': pybassenc.BASS_ENCODE_CAST_NOLIMIT, + 'pause': pybassenc.BASS_ENCODE_PAUSE, + 'autofree': pybassenc.BASS_ENCODE_AUTOFREE, + 'unicode': pybass.BASS_UNICODE, + } + + def __init__(self, source, command_line, pcm=False, no_header=False, rf64=False, big_endian=False, fp_8bit=False, fp_16bit=False, fp_24bit=False, fp_32bit=False, queue=False, limit=False, no_limit=False, pause=True, autofree=False, callback=None, user=None): + self.setup_flag_mapping() + flags = self.flags_for(pcm=pcm, no_header=no_header, rf64=rf64, big_endian=big_endian, fp_8bit=fp_8bit, fp_16bit=fp_16bit, fp_24bit=fp_24bit, fp_32bit=fp_32bit, queue=queue, limit=limit, no_limit=no_limit, pause=pause, autofree=autofree) #fwiw! + self.source = source + source_handle = source.handle + if callback is None: + callback = lambda *a: None + callback = pybassenc.ENCODEPROC(callback) + self.callback = callback + self.handle = bass_call(pybassenc.BASS_Encode_Start, source_handle, command_line, flags, callback, user) + + @property + def paused(self): + return bass_call_0(pybassenc.BASS_Encode_IsActive, self.handle) == pybass.BASS_ACTIVE_PAUSED + + @paused.setter + def paused(self, paused): + return bass_call(pybassenc.BASS_Encode_SetPaused, self.handle, paused) + + def is_stopped(self): + return bass_call_0(pybassenc.BASS_Encode_IsActive, self.handle) == pybass.BASS_ACTIVE_STOPPED + + + def stop(self): + return bass_call(pybassenc.BASS_Encode_Stop, self.handle) + +class BroadcastEncoder(Encoder): + + def __init__(self, source_encoder, server, password, content, name=None, url=None, genre=None, description=None, headers=None, bitrate=0, public=False): + contents = { + 'mp3': pybassenc.BASS_ENCODE_TYPE_MP3, + 'ogg': pybassenc.BASS_ENCODE_TYPE_OGG, + 'aac': pybassenc.BASS_ENCODE_TYPE_AAC + } + if content in contents: + content = contents[content] + self.source_encoder = source_encoder + handle = source_encoder.handle + self.server = server + self.password = password + self.status = bass_call(pybassenc.BASS_Encode_CastInit, handle, server, password, content, name, url, genre, description, headers, bitrate, public) + + def set_title(self, title=None, url=None): + return bass_call(pybassenc.BASS_Encode_CastSetTitle, self.source_encoder.handle, title, url) + + def get_stats(self, type, password=None): + types = { + 'shoutcast': pybassenc.BASS_ENCODE_STATS_SHOUT, + 'icecast': pybassenc.BASS_ENCODE_STATS_ICE, + 'icecast_server': pybassenc.BASS_ENCODE_STATS_ICESERV, + } + if type in types: + type = types[type] + if password is None: + password = self.password + return bass_call(pybassenc.BASS_Encode_CastGetStats, self.handle, type, password) diff --git a/src/sound_lib/external/__init__.py b/src/sound_lib/external/__init__.py new file mode 100644 index 00000000..69f5de51 --- /dev/null +++ b/src/sound_lib/external/__init__.py @@ -0,0 +1,8 @@ +import platform +#if platform.system() == 'Windows': +# import sound_lib.external.pybasswma +if platform.system() != 'Darwin': + import sound_lib.external.pybass_aac + import sound_lib.external.pybass_alac + import sound_lib.external.pybassflac + import sound_lib.external.pybassmidi diff --git a/src/sound_lib/external/paths.py b/src/sound_lib/external/paths.py new file mode 100644 index 00000000..4642370c --- /dev/null +++ b/src/sound_lib/external/paths.py @@ -0,0 +1,9 @@ +import os +from platform_utils.paths import module_path, is_frozen, embedded_data_path + +if is_frozen(): + x86_path = os.path.join(embedded_data_path(), 'sound_lib', 'lib', 'x86') + x64_path = os.path.join(embedded_data_path(), 'sound_lib', 'lib', 'x64') +else: + x86_path = os.path.join(module_path(), '..', 'lib', 'x86') + x64_path = os.path.join(module_path(), '..', 'lib', 'x64') diff --git a/src/sound_lib/external/pybass.py b/src/sound_lib/external/pybass.py new file mode 100644 index 00000000..d4e284e2 --- /dev/null +++ b/src/sound_lib/external/pybass.py @@ -0,0 +1,1120 @@ +from __future__ import division +from __future__ import absolute_import +from future.builtins import str +from future.builtins import range +# copyright(c) Max Kolosov 2009 maxkolosov@inbox.ru +# http://vosolok2008.narod.ru +# BSD license + +__version__ = '0.5.1' +__versionTime__ = '2009-11-19' +__author__ = 'Max Kolosov ' +__doc__ = ''' +pybass.py - is ctypes python module for BASS (http://www.un4seen.com). + +BASS is an audio library for use in Windows, Linux and MacOSX software. Its +purpose is to provide the most powerful and efficient (yet easy to use), +sample, stream, MOD music, and recording functions. All in a tiny DLL, +under 100KB in size. + +Main Features +============= +* Samples + supports WAV/AIFF/MP3/MP2/MP1/OGG and custom generated samples +* Sample streams + stream any sample data in 8/16/32 bit, with both "push" and "pull" systems +* File streams + MP3/MP2/MP1/OGG/WAV/AIFF file streaming +* Internet file streaming + stream files from the internet, including Shout/Icecast +* User file streaming + stream files from anywhere using any delivery method +* Multi-channel streaming + support for more than plain stereo, including multi-channel OGG/WAV/AIFF files +* MOD music + uses the same engine as XMPlay = best accuracy, speed, and quality +* MO3 music + MP3/OGG compressed MOD music +* Add-on system + support for more formats is available via add-ons (aka plugins) +* Multiple outputs + simultaneously use multiple soundcards, and move channels between them +* Recording + flexible recording system, with support for multiple devices +* Decode without playback + streams and MOD musics can be outputted in any way you want +* speaker assignment + assign streams and MOD musics to specific speakers +* High precision synchronization + synchronize events in your software to the streams and MOD musics +* DirectX 8 effects + chorus/compressor/distortion/echo/flanger/gargle/parameq/reverb +* User defined DSP functions + custom effects may be applied to musics and streams +* 32 bit floating-point decoding and processing + floating-point stream/music decoding, DSP, FX, and recording +* 3D sound + play samples/streams/musics in any 3D position, with EAX support +''' + +import os, sys, ctypes, platform +from .paths import x86_path, x64_path +import libloader + +bass_module = libloader.load_library('bass', x86_path=x86_path, x64_path=x64_path, mode=ctypes.RTLD_GLOBAL) +func_type = libloader.get_functype() + + +QWORD = ctypes.c_int64 + +def LOBYTE(a): return (ctypes.c_byte)(a) +def HIBYTE(a): return (ctypes.c_byte)((a)>>8) +def LOWORD(a): return (ctypes.c_ushort)(a) +def HIWORD(a): return (ctypes.c_ushort)((a)>>16) +def MAKEWORD(a,b): return (ctypes.c_ushort)(((a)&0xff)|((b)<<8)) +def MAKELONG(a,b): return (ctypes.c_ulong)(((a)&0xffff)|((b)<<16)) + +BASSVERSION = 0x204 +BASSVERSIONTEXT = '2.4' + +HMUSIC = ctypes.c_ulong # MOD music handle +HSAMPLE = ctypes.c_ulong # sample handle +HCHANNEL = ctypes.c_ulong # playing sample's channel handle +HSTREAM = ctypes.c_ulong # sample stream handle +HRECORD = ctypes.c_ulong # recording handle +HSYNC = ctypes.c_ulong # synchronizer handle +HDSP = ctypes.c_ulong # DSP handle +HFX = ctypes.c_ulong # DX8 effect handle +HPLUGIN = ctypes.c_ulong # Plugin handle + +# Error codes returned by BASS_ErrorGetCode +error_descriptions = {} +BASS_OK = 0 +error_descriptions[BASS_OK] = 'all is OK' +BASS_ERROR_MEM = 1 +error_descriptions[BASS_ERROR_MEM] = 'memory error' +BASS_ERROR_FILEOPEN = 2 +error_descriptions[BASS_ERROR_FILEOPEN] = "can't open the file" +BASS_ERROR_DRIVER = 3 +error_descriptions[BASS_ERROR_DRIVER] = "can't find a free/valid driver" +BASS_ERROR_BUFLOST = 4 +error_descriptions[BASS_ERROR_BUFLOST] = 'the sample buffer was lost' +BASS_ERROR_HANDLE = 5 +error_descriptions[BASS_ERROR_HANDLE] = 'invalid handle' +BASS_ERROR_FORMAT = 6 +error_descriptions[BASS_ERROR_FORMAT] = 'unsupported sample format' +BASS_ERROR_POSITION = 7 +error_descriptions[BASS_ERROR_POSITION] = 'invalid position' +BASS_ERROR_INIT = 8 +error_descriptions[BASS_ERROR_INIT] = 'BASS_Init has not been successfully called' +BASS_ERROR_START = 9 +error_descriptions[BASS_ERROR_START] = 'BASS_Start has not been successfully called' +BASS_ERROR_ALREADY = 14 +error_descriptions[BASS_ERROR_ALREADY] = 'already initialized/paused/whatever' +BASS_ERROR_NOCHAN = 18 +error_descriptions[BASS_ERROR_NOCHAN] = "can't get a free channel" +BASS_ERROR_ILLTYPE = 19 +error_descriptions[BASS_ERROR_ILLTYPE] = 'an illegal type was specified' +BASS_ERROR_ILLPARAM = 20 +error_descriptions[BASS_ERROR_ILLPARAM] = 'an illegal parameter was specified' +BASS_ERROR_NO3D = 21 +error_descriptions[BASS_ERROR_NO3D] = 'no 3D support' +BASS_ERROR_NOEAX = 22 +error_descriptions[BASS_ERROR_NOEAX] = 'no EAX support' +BASS_ERROR_DEVICE = 23 +error_descriptions[BASS_ERROR_DEVICE] = 'illegal device number' +BASS_ERROR_NOPLAY = 24 +error_descriptions[BASS_ERROR_NOPLAY] = 'not playing' +BASS_ERROR_FREQ = 25 +error_descriptions[BASS_ERROR_FREQ] = 'illegal sample rate' +BASS_ERROR_NOTFILE = 27 +error_descriptions[BASS_ERROR_NOTFILE] = 'the stream is not a file stream' +BASS_ERROR_NOHW = 29 +error_descriptions[BASS_ERROR_NOHW] = 'no hardware voices available' +BASS_ERROR_EMPTY = 31 +error_descriptions[BASS_ERROR_EMPTY] = 'the MOD music has no sequence data' +BASS_ERROR_NONET = 32 +error_descriptions[BASS_ERROR_NONET] = 'no internet connection could be opened' +BASS_ERROR_CREATE = 33 +error_descriptions[BASS_ERROR_CREATE] = "couldn't create the file" +BASS_ERROR_NOFX = 34 +error_descriptions[BASS_ERROR_NOFX] = 'effects are not available' +BASS_ERROR_NOTAVAIL = 37 +error_descriptions[BASS_ERROR_NOTAVAIL] = 'requested data is not available' +BASS_ERROR_DECODE = 38 +error_descriptions[BASS_ERROR_DECODE] = 'the channel is a "decoding channel"' +BASS_ERROR_DX = 39 +error_descriptions[BASS_ERROR_DX] = 'a sufficient DirectX version is not installed' +BASS_ERROR_TIMEOUT = 40 +error_descriptions[BASS_ERROR_TIMEOUT] = 'connection timedout' +BASS_ERROR_FILEFORM = 41 +error_descriptions[BASS_ERROR_FILEFORM] = 'unsupported file format' +BASS_ERROR_SPEAKER = 42 +error_descriptions[BASS_ERROR_SPEAKER] = 'unavailable speaker' +BASS_ERROR_VERSION = 43 +error_descriptions[BASS_ERROR_VERSION] = 'invalid BASS version (used by add-ons)' +BASS_ERROR_CODEC = 44 +error_descriptions[BASS_ERROR_CODEC] = 'codec is not available/supported' +BASS_ERROR_ENDED = 45 +error_descriptions[BASS_ERROR_ENDED] = 'the channel/file has ended' +BASS_ERROR_UNKNOWN = -1 +error_descriptions[BASS_ERROR_UNKNOWN] = 'some other mystery problem' + +def get_error_description(error_code = -1): + return error_descriptions.get(error_code, 'unknown BASS error code ' + str(error_code)) + +# BASS_SetConfig options +BASS_CONFIG_BUFFER = 0 +BASS_CONFIG_UPDATEPERIOD = 1 +BASS_CONFIG_GVOL_SAMPLE = 4 +BASS_CONFIG_GVOL_STREAM = 5 +BASS_CONFIG_GVOL_MUSIC = 6 +BASS_CONFIG_CURVE_VOL = 7 +BASS_CONFIG_CURVE_PAN = 8 +BASS_CONFIG_FLOATDSP = 9 +BASS_CONFIG_3DALGORITHM = 10 +BASS_CONFIG_NET_TIMEOUT = 11 +BASS_CONFIG_NET_BUFFER = 12 +BASS_CONFIG_PAUSE_NOPLAY = 13 +BASS_CONFIG_NET_PREBUF = 15 +BASS_CONFIG_NET_PASSIVE = 18 +BASS_CONFIG_REC_BUFFER = 19 +BASS_CONFIG_NET_PLAYLIST = 21 +BASS_CONFIG_MUSIC_VIRTUAL = 22 +BASS_CONFIG_VERIFY = 23 +BASS_CONFIG_UPDATETHREADS = 24 +BASS_CONFIG_NET_READTIMEOUT = 37 +BASS_CONFIG_SRC = 43 +BASS_CONFIG_SRC_SAMPLE = 44 +BASS_CONFIG_HANDLES = 41 +BASS_CONFIG_UNICODE = 42 +BASS_CONFIG_VISTA_SPEAKERS = 38 +BASS_CONFIG_IOS_SPEAKER = 39 + +#if defined(__linux__) || defined (_WIN32_WCE) +BASS_CONFIG_DEV_BUFFER = 27 +#endif + +# BASS_SetConfigPtr options +BASS_CONFIG_NET_AGENT = 16 +BASS_CONFIG_NET_PROXY = 17 +BASS_CONFIG_DEV_DEFAULT = 36 + +# Initialization flags +BASS_DEVICE_8BITS = 1# use 8 bit resolution, else 16 bit +BASS_DEVICE_MONO = 2# use mono, else stereo +BASS_DEVICE_3D = 4# enable 3D functionality +BASS_DEVICE_LATENCY = 256# calculate device latency (BASS_INFO struct) +BASS_DEVICE_CPSPEAKERS = 1024# detect speakers via Windows control panel +BASS_DEVICE_SPEAKERS = 2048# force enabling of speaker assignment +BASS_DEVICE_NOSPEAKER = 4096# ignore speaker arrangement +#ifdef __linux__ +BASS_DEVICE_DMIX = 8192# use "dmix" (shared) output + +# DirectSound interfaces (for use with BASS_GetDSoundObject) +BASS_OBJECT_DS = 1# IDirectSound +BASS_OBJECT_DS3DL = 2# IDirectSound3DListener + +# Device info structure +class BASS_DEVICEINFO(ctypes.Structure): + _fields_ = [('name', ctypes.c_char_p),#description + ('driver', ctypes.c_char_p),#driver + ('flags', ctypes.c_ulong) + ] +if platform.system().lower() == 'windows': + if sys.getwindowsversion()[3] == 3:#VER_PLATFORM_WIN32_CE + BASS_DEVICEINFO._fields_ = [('name', ctypes.c_wchar_p),#description + ('driver', ctypes.c_wchar_p),#driver + ('flags', ctypes.c_ulong) + ] + +# BASS_DEVICEINFO flags +BASS_DEVICE_ENABLED = 1 +BASS_DEVICE_DEFAULT = 2 +BASS_DEVICE_INIT = 4 + +class BASS_INFO(ctypes.Structure): + _fields_ = [('flags', ctypes.c_ulong),#device capabilities (DSCAPS_xxx flags) + ('hwsize', ctypes.c_ulong),#size of total device hardware memory + ('hwfree', ctypes.c_ulong),#size of free device hardware memory + ('freesam', ctypes.c_ulong),#number of free sample slots in the hardware + ('free3d', ctypes.c_ulong),#number of free 3D sample slots in the hardware + ('minrate', ctypes.c_ulong),#min sample rate supported by the hardware + ('maxrate', ctypes.c_ulong),#max sample rate supported by the hardware + ('eax', ctypes.c_byte),#device supports EAX? (always FALSE if BASS_DEVICE_3D was not used) + ('minbuf', ctypes.c_ulong),#recommended minimum buffer length in ms (requires BASS_DEVICE_LATENCY) + ('dsver', ctypes.c_ulong),#DirectSound version + ('latency', ctypes.c_ulong),#delay (in ms) before start of playback (requires BASS_DEVICE_LATENCY) + ('initflags', ctypes.c_ulong),#BASS_Init "flags" parameter + ('speakers', ctypes.c_ulong),#number of speakers available + ('freq', ctypes.c_ulong)#current output rate (Vista/OSX only) + ] + +# BASS_INFO flags (from DSOUND.H) +DSCAPS_CONTINUOUSRATE = 0x00000010# supports all sample rates between min/maxrate +DSCAPS_EMULDRIVER = 0x00000020# device does NOT have hardware DirectSound support +DSCAPS_CERTIFIED = 0x00000040# device driver has been certified by Microsoft +DSCAPS_SECONDARYMONO = 0x00000100# mono +DSCAPS_SECONDARYSTEREO = 0x00000200# stereo +DSCAPS_SECONDARY8BIT = 0x00000400# 8 bit +DSCAPS_SECONDARY16BIT = 0x00000800# 16 bit + +# Recording device info structure +class BASS_RECORDINFO(ctypes.Structure): + _fields_ = [('flags', ctypes.c_ulong),#DWORD flags;// device capabilities (DSCCAPS_xxx flags) + ('formats', ctypes.c_ulong),#DWORD formats;// supported standard formats (WAVE_FORMAT_xxx flags) + ('inputs', ctypes.c_ulong),#DWORD inputs; // number of inputs + ('singlein', ctypes.c_ubyte),#BOOL singlein;// TRUE = only 1 input can be set at a time + ('freq', ctypes.c_ulong)#DWORD freq; // current input rate (Vista/OSX only) + ] + +# BASS_RECORDINFO flags (from DSOUND.H) +DSCCAPS_EMULDRIVER = DSCAPS_EMULDRIVER# device does NOT have hardware DirectSound recording support +DSCCAPS_CERTIFIED = DSCAPS_CERTIFIED# device driver has been certified by Microsoft + +# defines for formats field of BASS_RECORDINFO (from MMSYSTEM.H) +WAVE_FORMAT_1M08 = 0x00000001# 11.025 kHz, Mono, 8-bit +WAVE_FORMAT_1S08 = 0x00000002# 11.025 kHz, Stereo, 8-bit +WAVE_FORMAT_1M16 = 0x00000004# 11.025 kHz, Mono, 16-bit +WAVE_FORMAT_1S16 = 0x00000008# 11.025 kHz, Stereo, 16-bit +WAVE_FORMAT_2M08 = 0x00000010# 22.05 kHz, Mono, 8-bit +WAVE_FORMAT_2S08 = 0x00000020# 22.05 kHz, Stereo, 8-bit +WAVE_FORMAT_2M16 = 0x00000040# 22.05 kHz, Mono, 16-bit +WAVE_FORMAT_2S16 = 0x00000080# 22.05 kHz, Stereo, 16-bit +WAVE_FORMAT_4M08 = 0x00000100# 44.1 kHz, Mono, 8-bit +WAVE_FORMAT_4S08 = 0x00000200# 44.1 kHz, Stereo, 8-bit +WAVE_FORMAT_4M16 = 0x00000400# 44.1 kHz, Mono, 16-bit +WAVE_FORMAT_4S16 = 0x00000800# 44.1 kHz, Stereo, 16-bit + +# Sample info structure +class BASS_SAMPLE(ctypes.Structure): + _fields_ = [('freq', ctypes.c_ulong),#DWORD freq;// default playback rate + ('volume', ctypes.c_float),#float volume;// default volume (0-1) + ('pan', ctypes.c_float),#float pan;// default pan (-1=left, 0=middle, 1=right) + ('flags', ctypes.c_ulong),#DWORD flags;// BASS_SAMPLE_xxx flags + ('length', ctypes.c_ulong),#DWORD length;// length (in bytes) + ('max', ctypes.c_ulong),#DWORD max;// maximum simultaneous playbacks + ('origres', ctypes.c_ulong),#DWORD origres;// original resolution bits + ('chans', ctypes.c_ulong),#DWORD chans;// number of channels + ('mingap', ctypes.c_ulong),#DWORD mingap; // minimum gap (ms) between creating channels + ('mode3d', ctypes.c_ulong),#DWORD mode3d;// BASS_3DMODE_xxx mode + ('mindist', ctypes.c_float),#float mindist;// minimum distance + ('maxdist', ctypes.c_float),#float maxdist;// maximum distance + ('iangle', ctypes.c_ulong),#DWORD iangle;// angle of inside projection cone + ('oangle', ctypes.c_ulong),#DWORD oangle;// angle of outside projection cone + ('outvol', ctypes.c_float),#float outvol;// delta-volume outside the projection cone + ('vam', ctypes.c_ulong),#DWORD vam;// voice allocation/management flags (BASS_VAM_xxx) + ('priority', ctypes.c_ulong)#DWORD priority;// priority (0=lowest, 0xffffffff=highest) + ] + +BASS_SAMPLE_8BITS = 1# 8 bit +BASS_SAMPLE_FLOAT = 256# 32-bit floating-point +BASS_SAMPLE_MONO = 2# mono +BASS_SAMPLE_LOOP = 4# looped +BASS_SAMPLE_3D = 8# 3D functionality +BASS_SAMPLE_SOFTWARE = 16# not using hardware mixing +BASS_SAMPLE_MUTEMAX = 32# mute at max distance (3D only) +BASS_SAMPLE_VAM = 64# DX7 voice allocation & management +BASS_SAMPLE_FX = 128# old implementation of DX8 effects +BASS_SAMPLE_OVER_VOL = 0x10000# override lowest volume +BASS_SAMPLE_OVER_POS = 0x20000# override longest playing +BASS_SAMPLE_OVER_DIST = 0x30000# override furthest from listener (3D only) +BASS_STREAM_PRESCAN = 0x20000# enable pin-point seeking/length (MP3/MP2/MP1) +BASS_MP3_SETPOS = BASS_STREAM_PRESCAN +BASS_STREAM_AUTOFREE = 0x40000# automatically free the stream when it stop/ends +BASS_STREAM_RESTRATE = 0x80000# restrict the download rate of internet file streams +BASS_STREAM_BLOCK = 0x100000# download/play internet file stream in small blocks +BASS_STREAM_DECODE = 0x200000# don't play the stream, only decode (BASS_ChannelGetData) +BASS_STREAM_STATUS = 0x800000# give server status info (HTTP/ICY tags) in DOWNLOADPROC + +BASS_MUSIC_FLOAT = BASS_SAMPLE_FLOAT +BASS_MUSIC_MONO = BASS_SAMPLE_MONO +BASS_MUSIC_LOOP = BASS_SAMPLE_LOOP +BASS_MUSIC_3D = BASS_SAMPLE_3D +BASS_MUSIC_FX = BASS_SAMPLE_FX +BASS_MUSIC_AUTOFREE = BASS_STREAM_AUTOFREE +BASS_MUSIC_DECODE = BASS_STREAM_DECODE +BASS_MUSIC_PRESCAN = BASS_STREAM_PRESCAN# calculate playback length +BASS_MUSIC_CALCLEN = BASS_MUSIC_PRESCAN +BASS_MUSIC_RAMP = 0x200# normal ramping +BASS_MUSIC_RAMPS = 0x400# sensitive ramping +BASS_MUSIC_SURROUND = 0x800# surround sound +BASS_MUSIC_SURROUND2 = 0x1000# surround sound (mode 2) +BASS_MUSIC_FT2MOD = 0x2000# play .MOD as FastTracker 2 does +BASS_MUSIC_PT1MOD = 0x4000# play .MOD as ProTracker 1 does +BASS_MUSIC_NONINTER = 0x10000# non-interpolated sample mixing +BASS_MUSIC_SINCINTER = 0x800000# sinc interpolated sample mixing +BASS_MUSIC_POSRESET = 0x8000# stop all notes when moving position +BASS_MUSIC_POSRESETEX = 0x400000# stop all notes and reset bmp/etc when moving position +BASS_MUSIC_STOPBACK = 0x80000# stop the music on a backwards jump effect +BASS_MUSIC_NOSAMPLE = 0x100000# don't load the samples + +# speaker assignment flags +BASS_SPEAKER_FRONT = 0x1000000# front speakers +BASS_SPEAKER_REAR = 0x2000000# rear/side speakers +BASS_SPEAKER_CENLFE = 0x3000000# center & LFE speakers (5.1) +BASS_SPEAKER_REAR2 = 0x4000000# rear center speakers (7.1) +def BASS_SPEAKER_N(n): return ((n)<<24)# n'th pair of speakers (max 15) +BASS_SPEAKER_LEFT = 0x10000000# modifier: left +BASS_SPEAKER_RIGHT = 0x20000000# modifier: right +BASS_SPEAKER_FRONTLEFT = BASS_SPEAKER_FRONT|BASS_SPEAKER_LEFT +BASS_SPEAKER_FRONTRIGHT = BASS_SPEAKER_FRONT|BASS_SPEAKER_RIGHT +BASS_SPEAKER_REARLEFT = BASS_SPEAKER_REAR|BASS_SPEAKER_LEFT +BASS_SPEAKER_REARRIGHT = BASS_SPEAKER_REAR|BASS_SPEAKER_RIGHT +BASS_SPEAKER_CENTER = BASS_SPEAKER_CENLFE|BASS_SPEAKER_LEFT +BASS_SPEAKER_LFE = BASS_SPEAKER_CENLFE|BASS_SPEAKER_RIGHT +BASS_SPEAKER_REAR2LEFT = BASS_SPEAKER_REAR2|BASS_SPEAKER_LEFT +BASS_SPEAKER_REAR2RIGHT = BASS_SPEAKER_REAR2|BASS_SPEAKER_RIGHT +BASS_UNICODE = (-2147483648) +BASS_RECORD_PAUSE = 0x8000# start recording paused + +# DX7 voice allocation & management flags +BASS_VAM_HARDWARE = 1 +BASS_VAM_SOFTWARE = 2 +BASS_VAM_TERM_TIME = 4 +BASS_VAM_TERM_DIST = 8 +BASS_VAM_TERM_PRIO = 16 + +# Channel info structure +class BASS_CHANNELINFO(ctypes.Structure): + _fields_ = [('freq', ctypes.c_ulong),#DWORD freq;// default playback rate + ('chans', ctypes.c_ulong),#DWORD chans;// channels + ('flags', ctypes.c_ulong),#DWORD flags;// BASS_SAMPLE/STREAM/MUSIC/SPEAKER flags + ('ctype', ctypes.c_ulong),#DWORD ctype;// type of channel + ('origres', ctypes.c_ulong),#DWORD origres;// original resolution + ('plugin', HPLUGIN),#HPLUGIN plugin;// plugin + ('sample', HSAMPLE),#HSAMPLE sample;// sample + ('filename', ctypes.c_char_p)#const char *filename;// filename + ] + +BASS_CTYPE_SAMPLE = 1 +BASS_CTYPE_RECORD = 2 +BASS_CTYPE_STREAM = 0x10000 +BASS_CTYPE_STREAM_OGG = 0x10002 +BASS_CTYPE_STREAM_MP1 = 0x10003 +BASS_CTYPE_STREAM_MP2 = 0x10004 +BASS_CTYPE_STREAM_MP3 = 0x10005 +BASS_CTYPE_STREAM_AIFF = 0x10006 +BASS_CTYPE_STREAM_CA = 0x10007 +BASS_CTYPE_STREAM_WAV = 0x40000# WAVE flag, LOWORD=codec +BASS_CTYPE_STREAM_WAV_PCM = 0x50001 +BASS_CTYPE_STREAM_WAV_FLOAT = 0x50003 +BASS_CTYPE_MUSIC_MOD = 0x20000 +BASS_CTYPE_MUSIC_MTM = 0x20001 +BASS_CTYPE_MUSIC_S3M = 0x20002 +BASS_CTYPE_MUSIC_XM = 0x20003 +BASS_CTYPE_MUSIC_IT = 0x20004 +BASS_CTYPE_MUSIC_MO3 = 0x00100# MO3 flag + +class BASS_PLUGINFORM(ctypes.Structure): + _fields_ = [('ctype', ctypes.c_ulong),#DWORD ctype; // channel type + ('name', ctypes.c_char_p),#const char *name; // format description + ('exts', ctypes.c_char_p)#const char *exts; // file extension filter (*.ext1;*.ext2;etc...) + ] +if platform.system().lower() == 'windows': + if sys.getwindowsversion()[3] == 3:#VER_PLATFORM_WIN32_CE + BASS_PLUGINFORM._fields_ = [('ctype', ctypes.c_ulong),#DWORD ctype; // channel type + ('name', ctypes.c_wchar_p),#const wchar_t *name; // format description + ('exts', ctypes.c_wchar_p)#const wchar_t *exts; // file extension filter (*.ext1;*.ext2;etc...) + ] + +class BASS_PLUGININFO(ctypes.Structure): + _fields_ = [('version', ctypes.c_ulong),#DWORD version;// version (same form as BASS_GetVersion) + ('formatc', ctypes.c_ulong),#DWORD formatc;// number of formats + ('formats', ctypes.POINTER(BASS_PLUGINFORM))#const BASS_PLUGINFORM *formats;// the array of formats + ] + +# 3D vector (for 3D positions/velocities/orientations) +class BASS_3DVECTOR(ctypes.Structure): + _fields_ = [('x', ctypes.c_float),#float x;// +=right, -=left + ('y', ctypes.c_float),#float y;// +=up, -=down + ('z', ctypes.c_float)#float z;// +=front, -=behind + ] + +# 3D channel modes +BASS_3DMODE_NORMAL = 0 +BASS_3DMODE_RELATIVE = 1 +BASS_3DMODE_OFF = 2 + +# software 3D mixing algorithms (used with BASS_CONFIG_3DALGORITHM) +BASS_3DALG_DEFAULT = 0 +BASS_3DALG_OFF = 1 +BASS_3DALG_FULL = 2 +BASS_3DALG_LIGHT = 3 + +# EAX environments, use with BASS_SetEAXParameters +EAX_ENVIRONMENT_GENERIC = 0 +EAX_ENVIRONMENT_PADDEDCELL = 1 +EAX_ENVIRONMENT_ROOM = 2 +EAX_ENVIRONMENT_BATHROOM = 3 +EAX_ENVIRONMENT_LIVINGROOM = 4 +EAX_ENVIRONMENT_STONEROOM = 5 +EAX_ENVIRONMENT_AUDITORIUM = 6 +EAX_ENVIRONMENT_CONCERTHALL = 7 +EAX_ENVIRONMENT_CAVE = 8 +EAX_ENVIRONMENT_ARENA = 9 +EAX_ENVIRONMENT_HANGAR = 10 +EAX_ENVIRONMENT_CARPETEDHALLWAY = 11 +EAX_ENVIRONMENT_HALLWAY = 12 +EAX_ENVIRONMENT_STONECORRIDOR = 13 +EAX_ENVIRONMENT_ALLEY = 14 +EAX_ENVIRONMENT_FOREST = 15 +EAX_ENVIRONMENT_CITY = 16 +EAX_ENVIRONMENT_MOUNTAINS = 17 +EAX_ENVIRONMENT_QUARRY = 18 +EAX_ENVIRONMENT_PLAIN = 19 +EAX_ENVIRONMENT_PARKINGLOT = 20 +EAX_ENVIRONMENT_SEWERPIPE = 21 +EAX_ENVIRONMENT_UNDERWATER = 22 +EAX_ENVIRONMENT_DRUGGED = 23 +EAX_ENVIRONMENT_DIZZY = 24 +EAX_ENVIRONMENT_PSYCHOTIC = 25 +EAX_ENVIRONMENT_COUNT = 26# total number of environments + +# EAX presets, usage: BASS_SetEAXParameters(EAX_PRESET_xxx) +EAX_PRESET_GENERIC =(EAX_ENVIRONMENT_GENERIC,0.5,1.493,0.5) +EAX_PRESET_PADDEDCELL =(EAX_ENVIRONMENT_PADDEDCELL,0.25,0.1,0.0) +EAX_PRESET_ROOM =(EAX_ENVIRONMENT_ROOM,0.417,0.4,0.666) +EAX_PRESET_BATHROOM =(EAX_ENVIRONMENT_BATHROOM,0.653,1.499,0.166) +EAX_PRESET_LIVINGROOM =(EAX_ENVIRONMENT_LIVINGROOM,0.208,0.478,0.0) +EAX_PRESET_STONEROOM =(EAX_ENVIRONMENT_STONEROOM,0.5,2.309,0.888) +EAX_PRESET_AUDITORIUM =(EAX_ENVIRONMENT_AUDITORIUM,0.403,4.279,0.5) +EAX_PRESET_CONCERTHALL =(EAX_ENVIRONMENT_CONCERTHALL,0.5,3.961,0.5) +EAX_PRESET_CAVE =(EAX_ENVIRONMENT_CAVE,0.5,2.886,1.304) +EAX_PRESET_ARENA =(EAX_ENVIRONMENT_ARENA,0.361,7.284,0.332) +EAX_PRESET_HANGAR =(EAX_ENVIRONMENT_HANGAR,0.5,10.0,0.3) +EAX_PRESET_CARPETEDHALLWAY =(EAX_ENVIRONMENT_CARPETEDHALLWAY,0.153,0.259,2.0) +EAX_PRESET_HALLWAY =(EAX_ENVIRONMENT_HALLWAY,0.361,1.493,0.0) +EAX_PRESET_STONECORRIDOR =(EAX_ENVIRONMENT_STONECORRIDOR,0.444,2.697,0.638) +EAX_PRESET_ALLEY =(EAX_ENVIRONMENT_ALLEY,0.25,1.752,0.776) +EAX_PRESET_FOREST =(EAX_ENVIRONMENT_FOREST,0.111,3.145,0.472) +EAX_PRESET_CITY =(EAX_ENVIRONMENT_CITY,0.111,2.767,0.224) +EAX_PRESET_MOUNTAINS =(EAX_ENVIRONMENT_MOUNTAINS,0.194,7.841,0.472) +EAX_PRESET_QUARRY =(EAX_ENVIRONMENT_QUARRY,1.0,1.499,0.5) +EAX_PRESET_PLAIN =(EAX_ENVIRONMENT_PLAIN,0.097,2.767,0.224) +EAX_PRESET_PARKINGLOT =(EAX_ENVIRONMENT_PARKINGLOT,0.208,1.652,1.5) +EAX_PRESET_SEWERPIPE =(EAX_ENVIRONMENT_SEWERPIPE,0.652,2.886,0.25) +EAX_PRESET_UNDERWATER =(EAX_ENVIRONMENT_UNDERWATER,1.0,1.499,0.0) +EAX_PRESET_DRUGGED =(EAX_ENVIRONMENT_DRUGGED,0.875,8.392,1.388) +EAX_PRESET_DIZZY =(EAX_ENVIRONMENT_DIZZY,0.139,17.234,0.666) +EAX_PRESET_PSYCHOTIC =(EAX_ENVIRONMENT_PSYCHOTIC,0.486,7.563,0.806) + +#typedef DWORD (CALLBACK STREAMPROC)(HSTREAM handle, void *buffer, DWORD length, void *user); +STREAMPROC = func_type(ctypes.c_ulong, HSTREAM, ctypes.c_void_p, ctypes.c_ulong, ctypes.c_void_p) +# User stream callback function. NOTE: A stream function should obviously be as quick +#as possible, other streams (and MOD musics) can't be mixed until it's finished. +#handle : The stream that needs writing +#buffer : Buffer to write the samples in +#length : Number of bytes to write +#user : The 'user' parameter value given when calling BASS_StreamCreate +#RETURN : Number of bytes written. Set the BASS_STREAMPROC_END flag to end the stream. + +#~ def user_stream_callback_function(handle, buffer, length, user): + #~ b = ctypes.cast(buffer, ctypes.c_char_p) + #~ ctypes.memset(b, 0, length) + #~ data = ctypes.c_char_p(' ' * length) + #~ ctypes.memmove(b, data, length) + #~ if your_custom_function_is_eof() or your_custom_flag_is_eof: + #~ length |= BASS_STREAMPROC_END + #~ return length +#~ user_func = STREAMPROC(user_stream_callback_function) + +BASS_STREAMPROC_END = (-2147483648)# end of user stream flag + +# special STREAMPROCs +def streamproc_dummy(handle, buffer, length, user): return 0 +def streamproc_push(handle, buffer, length, user): return -1 +STREAMPROC_DUMMY = STREAMPROC(streamproc_dummy)# "dummy" stream +STREAMPROC_PUSH = STREAMPROC(streamproc_push)# push stream + +# BASS_StreamCreateFileUser file systems +STREAMFILE_NOBUFFER = 0 +STREAMFILE_BUFFER = 1 +STREAMFILE_BUFFERPUSH = 2 + +# User file stream callback functions +#typedef void (CALLBACK FILECLOSEPROC)(void *user); +FILECLOSEPROC = func_type(None, ctypes.c_void_p) +#typedef QWORD (CALLBACK FILELENPROC)(void *user); +FILELENPROC = func_type(QWORD, ctypes.c_void_p) +#typedef DWORD (CALLBACK FILEREADPROC)(void *buffer, DWORD length, void *user); +FILEREADPROC = func_type(ctypes.c_ulong, ctypes.c_void_p, ctypes.c_ulong, ctypes.c_void_p) +#typedef BOOL (CALLBACK FILESEEKPROC)(QWORD offset, void *user); +FILESEEKPROC = func_type(ctypes.c_byte, QWORD, ctypes.c_void_p) + +class BASS_FILEPROCS(ctypes.Structure): + _fields_ = [('close', FILECLOSEPROC),#FILECLOSEPROC *close; + ('length', FILELENPROC),#FILELENPROC *length; + ('read', FILEREADPROC),#FILEREADPROC *read; + ('seek', FILESEEKPROC)#FILESEEKPROC *seek; + ] + +# BASS_StreamPutFileData options +BASS_FILEDATA_END = 0 + +# BASS_StreamGetFilePosition modes +BASS_FILEPOS_CURRENT = 0 +BASS_FILEPOS_DECODE = BASS_FILEPOS_CURRENT +BASS_FILEPOS_DOWNLOAD = 1 +BASS_FILEPOS_END = 2 +BASS_FILEPOS_START = 3 +BASS_FILEPOS_CONNECTED = 4 +BASS_FILEPOS_BUFFER = 5 +BASS_FILEPOS_SOCKET = 6 + +#typedef void (CALLBACK DOWNLOADPROC)(const void *buffer, DWORD length, void *user); +DOWNLOADPROC = func_type(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_ulong, ctypes.c_void_p) +# Internet stream download callback function. +#buffer : Buffer containing the downloaded data... NULL=end of download +#length : Number of bytes in the buffer +#user : The 'user' parameter value given when calling BASS_StreamCreateURL + +# BASS_ChannelSetSync types +BASS_SYNC_POS = 0 +BASS_SYNC_END = 2 +BASS_SYNC_META = 4 +BASS_SYNC_SLIDE = 5 +BASS_SYNC_STALL = 6 +BASS_SYNC_DOWNLOAD = 7 +BASS_SYNC_FREE = 8 +BASS_SYNC_SETPOS = 11 +BASS_SYNC_MUSICPOS = 10 +BASS_SYNC_MUSICINST = 1 +BASS_SYNC_MUSICFX = 3 +BASS_SYNC_OGG_CHANGE = 12 +BASS_SYNC_MIXTIME = 0x40000000 +BASS_SYNC_ONETIME = (-2147483648) + +#typedef void (CALLBACK SYNCPROC)(HSYNC handle, DWORD channel, DWORD data, void *user); +SYNCPROC = func_type(ctypes.c_void_p, HSYNC, ctypes.c_ulong, ctypes.c_ulong, ctypes.c_void_p) +# Sync callback function. NOTE: a sync callback function should be very +#quick as other syncs can't be processed until it has finished. If the sync +#is a "mixtime" sync, then other streams and MOD musics can't be mixed until +#it's finished either. +#handle : The sync that has occured +#channel: Channel that the sync occured in +#data : Additional data associated with the sync's occurance +#user : The 'user' parameter given when calling BASS_ChannelSetSync + +#typedef void (CALLBACK DSPPROC)(HDSP handle, DWORD channel, void *buffer, DWORD length, void *user); +DSPPROC = func_type(ctypes.c_void_p, HDSP, ctypes.c_ulong, ctypes.c_void_p, ctypes.c_ulong, ctypes.c_void_p) +# DSP callback function. NOTE: A DSP function should obviously be as quick as +#possible... other DSP functions, streams and MOD musics can not be processed +#until it's finished. +#handle : The DSP handle +#channel: Channel that the DSP is being applied to +#buffer : Buffer to apply the DSP to +#length : Number of bytes in the buffer +#user : The 'user' parameter given when calling BASS_ChannelSetDSP + +#typedef BOOL (CALLBACK RECORDPROC)(HRECORD handle, const void *buffer, DWORD length, void *user); +RECORDPROC = func_type(ctypes.c_byte, HRECORD, ctypes.c_void_p, ctypes.c_ulong, ctypes.c_void_p) +# Recording callback function. +#handle : The recording handle +#buffer : Buffer containing the recorded sample data +#length : Number of bytes +#user : The 'user' parameter value given when calling BASS_RecordStart +#RETURN : TRUE = continue recording, FALSE = stop + +# BASS_ChannelIsActive return values +BASS_ACTIVE_STOPPED = 0 +BASS_ACTIVE_PLAYING = 1 +BASS_ACTIVE_STALLED = 2 +BASS_ACTIVE_PAUSED = 3 + +# Channel attributes +BASS_ATTRIB_FREQ = 1 +BASS_ATTRIB_VOL = 2 +BASS_ATTRIB_PAN = 3 +BASS_ATTRIB_EAXMIX = 4 +BASS_ATTRIB_MUSIC_AMPLIFY = 0x100 +BASS_ATTRIB_MUSIC_PANSEP = 0x101 +BASS_ATTRIB_MUSIC_PSCALER = 0x102 +BASS_ATTRIB_MUSIC_BPM = 0x103 +BASS_ATTRIB_MUSIC_SPEED = 0x104 +BASS_ATTRIB_MUSIC_VOL_GLOBAL = 0x105 +BASS_ATTRIB_MUSIC_VOL_CHAN = 0x200# + channel # +BASS_ATTRIB_MUSIC_VOL_INST = 0x300# + instrument # + +# BASS_ChannelGetData flags +BASS_DATA_AVAILABLE = 0# query how much data is buffered +BASS_DATA_FLOAT = 0x40000000# flag: return floating-point sample data +BASS_DATA_FFT256 = (-2147483648)# 256 sample FFT +BASS_DATA_FFT512 = (-2147483647)# 512 FFT +BASS_DATA_FFT1024 = (-2147483646)# 1024 FFT +BASS_DATA_FFT2048 = (-2147483645)# 2048 FFT +BASS_DATA_FFT4096 = (-2147483644)# 4096 FFT +BASS_DATA_FFT8192 = (-2147483643)# 8192 FFT +BASS_DATA_FFT_INDIVIDUAL = 0x10# FFT flag: FFT for each channel, else all combined +BASS_DATA_FFT_NOWINDOW = 0x20# FFT flag: no Hanning window + +# BASS_ChannelGetTags types : what's returned +BASS_TAG_ID3 = 0# ID3v1 tags : TAG_ID3 structure +BASS_TAG_ID3V2 = 1# ID3v2 tags : variable length block +BASS_TAG_OGG = 2# OGG comments : series of null-terminated UTF-8 strings +BASS_TAG_HTTP = 3# HTTP headers : series of null-terminated ANSI strings +BASS_TAG_ICY = 4# ICY headers : series of null-terminated ANSI strings +BASS_TAG_META = 5# ICY metadata : ANSI string +BASS_TAG_VENDOR = 9# OGG encoder : UTF-8 string +BASS_TAG_LYRICS3 = 10# Lyric3v2 tag : ASCII string +BASS_TAG_CA_CODEC = 11# CoreAudio codec info : TAG_CA_CODEC structure +BASS_TAG_RIFF_INFO = 0x100# RIFF "INFO" tags : series of null-terminated ANSI strings +BASS_TAG_RIFF_BEXT = 0x101# RIFF/BWF "bext" tags : TAG_BEXT structure +BASS_TAG_RIFF_CART = 0x102# RIFF/BWF "cart" tags : TAG_CART structure +BASS_TAG_MUSIC_NAME = 0x10000# MOD music name : ANSI string +BASS_TAG_MUSIC_MESSAGE = 0x10001# MOD message : ANSI string +BASS_TAG_MUSIC_ORDERS = 0x10002# MOD order list : BYTE array of pattern numbers +BASS_TAG_MUSIC_INST = 0x10100# + instrument #, MOD instrument name : ANSI string +BASS_TAG_MUSIC_SAMPLE = 0x10300# + sample #, MOD sample name : ANSI string + +# ID3v1 tag structure +class TAG_ID3(ctypes.Structure): + _fields_ = [('id', ctypes.c_char*3),#char id[3]; + ('title', ctypes.c_char*30),#char title[30]; + ('artist', ctypes.c_char*30),#char artist[30]; + ('album', ctypes.c_char*30),#char album[30]; + ('year', ctypes.c_char*4),#char year[4]; + ('comment', ctypes.c_char*30),#char comment[30]; + ('genre', ctypes.c_byte)#BYTE genre; + ] + +# BWF "bext" tag structure +class TAG_BEXT(ctypes.Structure): + _fields_ = [('Description', ctypes.c_char*256),#char Description[256];// description + ('Originator', ctypes.c_char*32),#char Originator[32];// name of the originator + ('OriginatorReference', ctypes.c_char*32),#char OriginatorReference[32];// reference of the originator + ('OriginationDate', ctypes.c_char*10),#char OriginationDate[10];// date of creation (yyyy-mm-dd) + ('OriginationTime', ctypes.c_char*8),#char OriginationTime[8];// time of creation (hh-mm-ss) + ('TimeReference', QWORD),#QWORD TimeReference;// first sample count since midnight (little-endian) + ('Version', ctypes.c_ushort),#WORD Version;// BWF version (little-endian) + ('UMID', ctypes.c_byte*64),#BYTE UMID[64];// SMPTE UMID + ('Reserved', ctypes.c_byte*190),#BYTE Reserved[190]; + ('CodingHistory', ctypes.c_char_p)#char CodingHistory[];// history + ] + +# BWF "cart" tag structures +class TAG_CART_TIMER(ctypes.Structure): + _fields_ = [('dwUsage', ctypes.c_ulong),#DWORD dwUsage;// FOURCC timer usage ID + ('dwValue', ctypes.c_ulong)#DWORD dwValue;// timer value in samples from head + ] + +class TAG_CART(ctypes.Structure): + _fields_ = [('Version', ctypes.c_char*4),#char Version[4];// version of the data structure + ('Title', ctypes.c_char*64),#char Title[64];// title of cart audio sequence + ('Artist', ctypes.c_char*64),#char Artist[64];// artist or creator name + ('CutID', ctypes.c_char*64),#char CutID[64];// cut number identification + ('ClientID', ctypes.c_char*64),#char ClientID[64];// client identification + ('Category', ctypes.c_char*64),#char Category[64];// category ID, PSA, NEWS, etc + ('Classification', ctypes.c_char*64),#char Classification[64];// classification or auxiliary key + ('OutCue', ctypes.c_char*64),#char OutCue[64];// out cue text + ('StartDate', ctypes.c_char*10),#char StartDate[10];// yyyy-mm-dd + ('StartTime', ctypes.c_char*8),#char StartTime[8];// hh:mm:ss + ('EndDate', ctypes.c_char*10),#char EndDate[10];// yyyy-mm-dd + ('EndTime', ctypes.c_char*8),#char EndTime[8];// hh:mm:ss + ('ProducerAppID', ctypes.c_char*64),#char ProducerAppID[64];// name of vendor or application + ('ProducerAppVersion', ctypes.c_char*64),#char ProducerAppVersion[64];// version of producer application + ('UserDef', ctypes.c_char*64),#char UserDef[64];// user defined text + ('dwLevelReference', ctypes.c_ulong),#DWORD dwLevelReference;// sample value for 0 dB reference + ('PostTimer', TAG_CART_TIMER*8),#TAG_CART_TIMER PostTimer[8];// 8 time markers after head + ('Reserved', ctypes.c_char*276),#char Reserved[276]; + ('URL', ctypes.c_char*1024),#char URL[1024];// uniform resource locator + ('TagText', ctypes.c_char_p)#char TagText[];// free form text for scripts or tags + ] + +# CoreAudio codec info structure +class TAG_CA_CODEC(ctypes.Structure): + _fields_ = [('ftype', ctypes.c_ulong),#DWORD ftype;// file format + ('atype', ctypes.c_ulong),#DWORD atype;// audio format + ('name', ctypes.c_char_p)#const char *name;// description + ] + +# BASS_ChannelGetLength/GetPosition/SetPosition modes +BASS_POS_BYTE = 0# byte position +BASS_POS_MUSIC_ORDER = 1# order.row position, MAKELONG(order,row) +BASS_POS_DECODE = 0x10000000# flag: get the decoding (not playing) position + +# BASS_RecordSetInput flags +BASS_INPUT_OFF = 0x10000 +BASS_INPUT_ON = 0x20000 +BASS_INPUT_TYPE_MASK = (-16777216) +BASS_INPUT_TYPE_UNDEF = 0x00000000 +BASS_INPUT_TYPE_DIGITAL = 0x01000000 +BASS_INPUT_TYPE_LINE = 0x02000000 +BASS_INPUT_TYPE_MIC = 0x03000000 +BASS_INPUT_TYPE_SYNTH = 0x04000000 +BASS_INPUT_TYPE_CD = 0x05000000 +BASS_INPUT_TYPE_PHONE = 0x06000000 +BASS_INPUT_TYPE_SPEAKER = 0x07000000 +BASS_INPUT_TYPE_WAVE = 0x08000000 +BASS_INPUT_TYPE_AUX = 0x09000000 +BASS_INPUT_TYPE_ANALOG = 0x0a000000 + +# DX8 effect types, use with BASS_ChannelSetFX +( + BASS_FX_DX8_CHORUS, + BASS_FX_DX8_COMPRESSOR, + BASS_FX_DX8_DISTORTION, + BASS_FX_DX8_ECHO, + BASS_FX_DX8_FLANGER, + BASS_FX_DX8_GARGLE, + BASS_FX_DX8_I3DL2REVERB, + BASS_FX_DX8_PARAMEQ, + BASS_FX_DX8_REVERB, + ) = range(9) + + +class BASS_DX8_CHORUS(ctypes.Structure): + _fields_ = [('fWetDryMix', ctypes.c_float),#float fWetDryMix; + ('fDepth', ctypes.c_float),#float fDepth; + ('fFeedback', ctypes.c_float),#float fFeedback; + ('fFrequency', ctypes.c_float),#float fFrequency; + ('lWaveform', ctypes.c_ulong),#DWORD lWaveform;// 0=triangle, 1=sine + ('fDelay', ctypes.c_float),#float fDelay; + ('lPhase', ctypes.c_ulong)#DWORD lPhase;// BASS_DX8_PHASE_xxx + ] + +class BASS_DX8_COMPRESSOR(ctypes.Structure): + _fields_ = [('fGain', ctypes.c_float),#float fGain; + ('fAttack', ctypes.c_float),#float fAttack; + ('fRelease', ctypes.c_float),#float fRelease; + ('fThreshold', ctypes.c_float),#float fThreshold; + ('fRatio', ctypes.c_float),#float fRatio; + ('fPredelay', ctypes.c_float)#float fPredelay; + ] + +class BASS_DX8_DISTORTION(ctypes.Structure): + _fields_ = [('fGain', ctypes.c_float),#float fGain; + ('fEdge', ctypes.c_float),#float fEdge; + ('fPostEQCenterFrequency', ctypes.c_float),#float fPostEQCenterFrequency; + ('fPostEQBandwidth', ctypes.c_float),#float fPostEQBandwidth; + ('fPreLowpassCutoff', ctypes.c_float)#float fPreLowpassCutoff; + ] + +class BASS_DX8_ECHO(ctypes.Structure): + _fields_ = [('fWetDryMix', ctypes.c_float),#float fWetDryMix; + ('fFeedback', ctypes.c_float),#float fFeedback; + ('fLeftDelay', ctypes.c_float),#float fLeftDelay; + ('fRightDelay', ctypes.c_float),#float fRightDelay; + ('lPanDelay', ctypes.c_byte)#BOOL lPanDelay; + ] + +class BASS_DX8_FLANGER(ctypes.Structure): + _fields_ = [('fWetDryMix', ctypes.c_float),#float fWetDryMix; + ('fDepth', ctypes.c_float),#float fDepth; + ('fFeedback', ctypes.c_float),#float fFeedback; + ('fFrequency', ctypes.c_float),#float fFrequency; + ('lWaveform', ctypes.c_ulong),#DWORD lWaveform;// 0=triangle, 1=sine + ('fDelay', ctypes.c_float),#float fDelay; + ('lPhase', ctypes.c_ulong)#DWORD lPhase;// BASS_DX8_PHASE_xxx + ] + +class BASS_DX8_GARGLE(ctypes.Structure): + _fields_ = [('dwRateHz', ctypes.c_ulong),#DWORD dwRateHz;// Rate of modulation in hz + ('dwWaveShape', ctypes.c_ulong)#DWORD dwWaveShape;// 0=triangle, 1=square + ] + +class BASS_DX8_I3DL2REVERB(ctypes.Structure): + _fields_ = [('lRoom', ctypes.c_int),#int lRoom;// [-10000, 0] default: -1000 mB + ('lRoomHF', ctypes.c_int),#int lRoomHF;// [-10000, 0] default: 0 mB + ('flRoomRolloffFactor', ctypes.c_float),#float flRoomRolloffFactor;// [0.0, 10.0] default: 0.0 + ('flDecayTime', ctypes.c_float),#float flDecayTime;// [0.1, 20.0] default: 1.49s + ('flDecayHFRatio', ctypes.c_float),#float flDecayHFRatio;// [0.1, 2.0] default: 0.83 + ('lReflections', ctypes.c_int),#int lReflections;// [-10000, 1000] default: -2602 mB + ('flReflectionsDelay', ctypes.c_float),#float flReflectionsDelay;// [0.0, 0.3] default: 0.007 s + ('lReverb', ctypes.c_int),#int lReverb;// [-10000, 2000] default: 200 mB + ('flReverbDelay', ctypes.c_float),#float flReverbDelay;// [0.0, 0.1] default: 0.011 s + ('flDiffusion', ctypes.c_float),#float flDiffusion;// [0.0, 100.0] default: 100.0 % + ('flDensity', ctypes.c_float),#float flDensity;// [0.0, 100.0] default: 100.0 % + ('flHFReference', ctypes.c_float)#float flHFReference;// [20.0, 20000.0] default: 5000.0 Hz + ] + +class BASS_DX8_PARAMEQ(ctypes.Structure): + _fields_ = [('fCenter', ctypes.c_float),#float fCenter; + ('fBandwidth', ctypes.c_float),#float fBandwidth; + ('fGain', ctypes.c_float)#float fGain; + ] + +class BASS_DX8_REVERB(ctypes.Structure): + _fields_ = [('fInGain', ctypes.c_float),#float fInGain;// [-96.0,0.0] default: 0.0 dB + ('fReverbMix', ctypes.c_float),#float fReverbMix;// [-96.0,0.0] default: 0.0 db + ('fReverbTime', ctypes.c_float),#float fReverbTime;// [0.001,3000.0] default: 1000.0 ms + ('fHighFreqRTRatio', ctypes.c_float)#float fHighFreqRTRatio;// [0.001,0.999] default: 0.001 + ] + +BASS_DX8_PHASE_NEG_180 = 0 +BASS_DX8_PHASE_NEG_90 = 1 +BASS_DX8_PHASE_ZERO = 2 +BASS_DX8_PHASE_90 = 3 +BASS_DX8_PHASE_180 = 4 + +#BOOL BASSDEF(BASS_SetConfig)(DWORD option, DWORD value); +BASS_SetConfig = func_type(ctypes.c_byte, ctypes.c_ulong, ctypes.c_ulong)(('BASS_SetConfig', bass_module)) +#DWORD BASSDEF(BASS_GetConfig)(DWORD option); +BASS_GetConfig = func_type(ctypes.c_ulong, ctypes.c_ulong)(('BASS_GetConfig', bass_module)) +#BOOL BASSDEF(BASS_SetConfigPtr)(DWORD option, void *value); +BASS_SetConfigPtr = func_type(ctypes.c_byte, ctypes.c_ulong, ctypes.c_void_p)(('BASS_SetConfigPtr', bass_module)) +#void *BASSDEF(BASS_GetConfigPtr)(DWORD option); +BASS_GetConfigPtr = func_type(ctypes.c_void_p, ctypes.c_ulong)(('BASS_GetConfigPtr', bass_module)) +#DWORD BASSDEF(BASS_GetVersion)(); +BASS_GetVersion = func_type(ctypes.c_ulong)(('BASS_GetVersion', bass_module)) +#int BASSDEF(BASS_ErrorGetCode)(); +BASS_ErrorGetCode = func_type(ctypes.c_int)(('BASS_ErrorGetCode', bass_module)) +#BOOL BASSDEF(BASS_GetDeviceInfo)(DWORD device, BASS_DEVICEINFO *info); +BASS_GetDeviceInfo = func_type(ctypes.c_byte, ctypes.c_ulong, ctypes.POINTER(BASS_DEVICEINFO))(('BASS_GetDeviceInfo', bass_module)) +#BOOL BASSDEF(BASS_Init)(int device, DWORD freq, DWORD flags, void *win, void *dsguid); +BASS_Init = func_type(ctypes.c_byte, ctypes.c_int, ctypes.c_ulong, ctypes.c_ulong, ctypes.c_void_p, ctypes.c_void_p)(('BASS_Init', bass_module)) +#BOOL BASSDEF(BASS_SetDevice)(DWORD device); +BASS_SetDevice = func_type(ctypes.c_byte, ctypes.c_ulong)(('BASS_SetDevice', bass_module)) +#DWORD BASSDEF(BASS_GetDevice)(); +BASS_GetDevice = func_type(ctypes.c_ulong)(('BASS_GetDevice', bass_module)) +#BOOL BASSDEF(BASS_Free)(); +BASS_Free = func_type(ctypes.c_byte)(('BASS_Free', bass_module)) +#BOOL BASSDEF(BASS_GetInfo)(BASS_INFO *info); +BASS_GetInfo = func_type(ctypes.c_byte, ctypes.POINTER(BASS_INFO))(('BASS_GetInfo', bass_module)) +#BOOL BASSDEF(BASS_Update)(DWORD length); +BASS_Update = func_type(ctypes.c_byte, ctypes.c_ulong)(('BASS_Update', bass_module)) +#float BASSDEF(BASS_GetCPU)(); +BASS_GetCPU = func_type(ctypes.c_float)(('BASS_GetCPU', bass_module)) +#BOOL BASSDEF(BASS_Start)(); +BASS_Start = func_type(ctypes.c_byte)(('BASS_Start', bass_module)) +#BOOL BASSDEF(BASS_Stop)(); +BASS_Stop = func_type(ctypes.c_byte)(('BASS_Stop', bass_module)) +#BOOL BASSDEF(BASS_Pause)(); +BASS_Pause = func_type(ctypes.c_byte)(('BASS_Pause', bass_module)) +#BOOL BASSDEF(BASS_SetVolume)(float volume); +BASS_SetVolume = func_type(ctypes.c_byte, ctypes.c_float)(('BASS_SetVolume', bass_module)) +#float BASSDEF(BASS_GetVolume)(); +BASS_GetVolume = func_type(ctypes.c_float)(('BASS_GetVolume', bass_module)) + +#HPLUGIN BASSDEF(BASS_PluginLoad)(const char *file, DWORD flags); +BASS_PluginLoad_ = func_type(HPLUGIN, ctypes.c_char_p, ctypes.c_ulong)(('BASS_PluginLoad', bass_module)) +def BASS_PluginLoad(path, flags): + return BASS_PluginLoad_(path.encode(sys.getfilesystemencoding()), flags) +#BOOL BASSDEF(BASS_PluginFree)(HPLUGIN handle); +BASS_PluginFree = func_type(ctypes.c_byte, HPLUGIN)(('BASS_PluginFree', bass_module)) +#const BASS_PLUGININFO *BASSDEF(BASS_PluginGetInfo)(HPLUGIN handle); +BASS_PluginGetInfo = func_type(ctypes.POINTER(BASS_PLUGININFO), HPLUGIN)(('BASS_PluginGetInfo', bass_module)) + +#BOOL BASSDEF(BASS_Set3DFactors)(float distf, float rollf, float doppf); +BASS_Set3DFactors = func_type(ctypes.c_byte, ctypes.c_float, ctypes.c_float, ctypes.c_float)(('BASS_Set3DFactors', bass_module)) +#BOOL BASSDEF(BASS_Get3DFactors)(float *distf, float *rollf, float *doppf); +BASS_Get3DFactors = func_type(ctypes.c_byte, ctypes.POINTER(ctypes.c_float), ctypes.POINTER(ctypes.c_float), ctypes.POINTER(ctypes.c_float))(('BASS_Get3DFactors', bass_module)) +#BOOL BASSDEF(BASS_Set3DPosition)(const BASS_3DVECTOR *pos, const BASS_3DVECTOR *vel, const BASS_3DVECTOR *front, const BASS_3DVECTOR *top); +BASS_Set3DPosition = func_type(ctypes.c_byte, ctypes.POINTER(BASS_3DVECTOR), ctypes.POINTER(BASS_3DVECTOR), ctypes.POINTER(BASS_3DVECTOR), ctypes.POINTER(BASS_3DVECTOR))(('BASS_Set3DPosition', bass_module)) +#BOOL BASSDEF(BASS_Get3DPosition)(BASS_3DVECTOR *pos, BASS_3DVECTOR *vel, BASS_3DVECTOR *front, BASS_3DVECTOR *top); +BASS_Get3DPosition = func_type(ctypes.c_byte, ctypes.POINTER(BASS_3DVECTOR), ctypes.POINTER(BASS_3DVECTOR), ctypes.POINTER(BASS_3DVECTOR), ctypes.POINTER(BASS_3DVECTOR))(('BASS_Get3DPosition', bass_module)) +#void BASSDEF(BASS_Apply3D)(); +BASS_Apply3D = func_type(None)(('BASS_Apply3D', bass_module)) + +#HMUSIC BASSDEF(BASS_MusicLoad)(BOOL mem, const void *file, QWORD offset, DWORD length, DWORD flags, DWORD freq); +BASS_MusicLoad = func_type(HMUSIC, ctypes.c_byte, ctypes.c_void_p, QWORD, ctypes.c_ulong, ctypes.c_ulong, ctypes.c_ulong)(('BASS_MusicLoad', bass_module)) +#BOOL BASSDEF(BASS_MusicFree)(HMUSIC handle); +BASS_MusicFree = func_type(ctypes.c_byte, HMUSIC)(('BASS_MusicFree', bass_module)) + +#HSAMPLE BASSDEF(BASS_SampleLoad)(BOOL mem, const void *file, QWORD offset, DWORD length, DWORD max, DWORD flags); +BASS_SampleLoad = func_type(HSAMPLE, ctypes.c_byte, ctypes.c_void_p, QWORD, ctypes.c_ulong, ctypes.c_ulong, ctypes.c_ulong)(('BASS_SampleLoad', bass_module)) +#HSAMPLE BASSDEF(BASS_SampleCreate)(DWORD length, DWORD freq, DWORD chans, DWORD max, DWORD flags); +BASS_SampleCreate = func_type(HSAMPLE, ctypes.c_ulong, ctypes.c_ulong, ctypes.c_ulong, ctypes.c_ulong, ctypes.c_ulong)(('BASS_SampleCreate', bass_module)) +#BOOL BASSDEF(BASS_SampleFree)(HSAMPLE handle); +BASS_SampleFree = func_type(ctypes.c_byte, HSAMPLE)(('BASS_SampleFree', bass_module)) +#BOOL BASSDEF(BASS_SampleSetData)(HSAMPLE handle, const void *buffer); +BASS_SampleSetData = func_type(ctypes.c_byte, HSAMPLE, ctypes.c_void_p)(('BASS_SampleSetData', bass_module)) +#BOOL BASSDEF(BASS_SampleGetData)(HSAMPLE handle, void *buffer); +BASS_SampleGetData = func_type(ctypes.c_byte, HSAMPLE, ctypes.c_void_p)(('BASS_SampleGetData', bass_module)) +#BOOL BASSDEF(BASS_SampleGetInfo)(HSAMPLE handle, BASS_SAMPLE *info); +BASS_SampleGetInfo = func_type(ctypes.c_byte, HSAMPLE, ctypes.POINTER(BASS_SAMPLE))(('BASS_SampleGetInfo', bass_module)) +#BOOL BASSDEF(BASS_SampleSetInfo)(HSAMPLE handle, const BASS_SAMPLE *info); +BASS_SampleSetInfo = func_type(ctypes.c_byte, HSAMPLE, ctypes.POINTER(BASS_SAMPLE))(('BASS_SampleSetInfo', bass_module)) +#HCHANNEL BASSDEF(BASS_SampleGetChannel)(HSAMPLE handle, BOOL onlynew); +BASS_SampleGetChannel = func_type(HCHANNEL, HSAMPLE, ctypes.c_byte)(('BASS_SampleGetChannel', bass_module)) +#DWORD BASSDEF(BASS_SampleGetChannels)(HSAMPLE handle, HCHANNEL *channels); +BASS_SampleGetChannels = func_type(ctypes.c_ulong, HSAMPLE, ctypes.POINTER(HCHANNEL))(('BASS_SampleGetChannels', bass_module)) +#BOOL BASSDEF(BASS_SampleStop)(HSAMPLE handle); +BASS_SampleStop = func_type(ctypes.c_byte, HSAMPLE)(('BASS_SampleStop', bass_module)) + +#HSTREAM BASSDEF(BASS_StreamCreate)(DWORD freq, DWORD chans, DWORD flags, STREAMPROC *proc, void *user); +BASS_StreamCreate = func_type(HSTREAM, ctypes.c_ulong, ctypes.c_ulong, ctypes.c_ulong, STREAMPROC, ctypes.c_void_p)(('BASS_StreamCreate', bass_module)) +#HSTREAM BASSDEF(BASS_StreamCreateFile)(BOOL mem, const void *file, QWORD offset, QWORD length, DWORD flags); +BASS_StreamCreateFile = func_type(HSTREAM, ctypes.c_byte, ctypes.c_void_p, QWORD, QWORD, ctypes.c_ulong)(('BASS_StreamCreateFile', bass_module)) +#HSTREAM BASSDEF(BASS_StreamCreateURL)(const char *url, DWORD offset, DWORD flags, DOWNLOADPROC *proc, void *user); +BASS_StreamCreateURL = func_type(HSTREAM, ctypes.c_char_p, ctypes.c_ulong, ctypes.c_ulong, DOWNLOADPROC, ctypes.c_void_p)(('BASS_StreamCreateURL', bass_module)) +#HSTREAM BASSDEF(BASS_StreamCreateFileUser)(DWORD system, DWORD flags, const BASS_FILEPROCS *proc, void *user); +BASS_StreamCreateFileUser = func_type(HSTREAM, ctypes.c_ulong, ctypes.c_ulong, ctypes.POINTER(BASS_FILEPROCS), ctypes.c_void_p)(('BASS_StreamCreateFileUser', bass_module)) +#BOOL BASSDEF(BASS_StreamFree)(HSTREAM handle); +BASS_StreamFree = func_type(ctypes.c_byte, HSTREAM)(('BASS_StreamFree', bass_module)) +#QWORD BASSDEF(BASS_StreamGetFilePosition)(HSTREAM handle, DWORD mode); +BASS_StreamGetFilePosition = func_type(QWORD, HSTREAM, ctypes.c_ulong)(('BASS_StreamGetFilePosition', bass_module)) +#DWORD BASSDEF(BASS_StreamPutData)(HSTREAM handle, const void *buffer, DWORD length); +BASS_StreamPutData = func_type(ctypes.c_ulong, HSTREAM, ctypes.c_void_p, ctypes.c_ulong)(('BASS_StreamPutData', bass_module)) +#DWORD BASSDEF(BASS_StreamPutFileData)(HSTREAM handle, const void *buffer, DWORD length); +BASS_StreamPutFileData = func_type(ctypes.c_ulong, HSTREAM, ctypes.c_void_p, ctypes.c_ulong)(('BASS_StreamPutFileData', bass_module)) + +#BOOL BASSDEF(BASS_RecordGetDeviceInfo)(DWORD device, BASS_DEVICEINFO *info); +BASS_RecordGetDeviceInfo = func_type(ctypes.c_byte, ctypes.c_ulong, ctypes.POINTER(BASS_DEVICEINFO))(('BASS_RecordGetDeviceInfo', bass_module)) +#BOOL BASSDEF(BASS_RecordInit)(int device); +BASS_RecordInit = func_type(ctypes.c_byte, ctypes.c_int)(('BASS_RecordInit', bass_module)) +#BOOL BASSDEF(BASS_RecordSetDevice)(DWORD device); +BASS_RecordSetDevice = func_type(ctypes.c_byte, ctypes.c_ulong)(('BASS_RecordSetDevice', bass_module)) +#DWORD BASSDEF(BASS_RecordGetDevice)(); +BASS_RecordGetDevice = func_type(ctypes.c_ulong)(('BASS_RecordGetDevice', bass_module)) +#BOOL BASSDEF(BASS_RecordFree)(); +BASS_RecordFree = func_type(ctypes.c_byte)(('BASS_RecordFree', bass_module)) +#BOOL BASSDEF(BASS_RecordGetInfo)(BASS_RECORDINFO *info); +BASS_RecordGetInfo = func_type(ctypes.c_byte, ctypes.POINTER(BASS_RECORDINFO))(('BASS_RecordGetInfo', bass_module)) +#const char *BASSDEF(BASS_RecordGetInputName)(int input); +BASS_RecordGetInputName = func_type(ctypes.c_char_p, ctypes.c_int)(('BASS_RecordGetInputName', bass_module)) +#BOOL BASSDEF(BASS_RecordSetInput)(int input, DWORD flags, float volume); +BASS_RecordSetInput = func_type(ctypes.c_byte, ctypes.c_int, ctypes.c_ulong, ctypes.c_float)(('BASS_RecordSetInput', bass_module)) +#DWORD BASSDEF(BASS_RecordGetInput)(int input, float *volume); +BASS_RecordGetInput = func_type(ctypes.c_ulong, ctypes.c_int, ctypes.c_float)(('BASS_RecordGetInput', bass_module)) +#HRECORD BASSDEF(BASS_RecordStart)(DWORD freq, DWORD chans, DWORD flags, RECORDPROC *proc, void *user); +BASS_RecordStart = func_type(HRECORD, ctypes.c_ulong, ctypes.c_ulong, ctypes.c_ulong, RECORDPROC, ctypes.c_void_p)(('BASS_RecordStart', bass_module)) + +#double BASSDEF(BASS_ChannelBytes2Seconds)(DWORD handle, QWORD pos); +BASS_ChannelBytes2Seconds = func_type(ctypes.c_double, ctypes.c_ulong, QWORD)(('BASS_ChannelBytes2Seconds', bass_module)) +#QWORD BASSDEF(BASS_ChannelSeconds2Bytes)(DWORD handle, double pos); +BASS_ChannelSeconds2Bytes = func_type(QWORD, ctypes.c_ulong, ctypes.c_double)(('BASS_ChannelSeconds2Bytes', bass_module)) +#DWORD BASSDEF(BASS_ChannelGetDevice)(DWORD handle); +BASS_ChannelGetDevice = func_type(ctypes.c_ulong, ctypes.c_ulong)(('BASS_ChannelGetDevice', bass_module)) +#BOOL BASSDEF(BASS_ChannelSetDevice)(DWORD handle, DWORD device); +BASS_ChannelSetDevice = func_type(ctypes.c_byte, ctypes.c_ulong, ctypes.c_ulong)(('BASS_ChannelSetDevice', bass_module)) +#DWORD BASSDEF(BASS_ChannelIsActive)(DWORD handle); +BASS_ChannelIsActive = func_type(ctypes.c_ulong, ctypes.c_ulong)(('BASS_ChannelIsActive', bass_module)) +#BOOL BASSDEF(BASS_ChannelGetInfo)(DWORD handle, BASS_CHANNELINFO *info); +BASS_ChannelGetInfo = func_type(ctypes.c_byte, ctypes.c_ulong, ctypes.POINTER(BASS_CHANNELINFO))(('BASS_ChannelGetInfo', bass_module)) +#const char *BASSDEF(BASS_ChannelGetTags)(DWORD handle, DWORD tags); +#~ BASS_ChannelGetTags = func_type(ctypes.c_char_p, ctypes.c_ulong, ctypes.c_ulong)(('BASS_ChannelGetTags', bass_module)) +BASS_ChannelGetTags = func_type(ctypes.c_void_p, ctypes.c_ulong, ctypes.c_ulong)(('BASS_ChannelGetTags', bass_module)) +#DWORD BASSDEF(BASS_ChannelFlags)(DWORD handle, DWORD flags, DWORD mask); +BASS_ChannelFlags = func_type(ctypes.c_ulong, ctypes.c_ulong, ctypes.c_ulong, ctypes.c_ulong)(('BASS_ChannelFlags', bass_module)) +#BOOL BASSDEF(BASS_ChannelUpdate)(DWORD handle, DWORD length); +BASS_ChannelUpdate = func_type(ctypes.c_byte, ctypes.c_ulong, ctypes.c_ulong)(('BASS_ChannelUpdate', bass_module)) +#BOOL BASSDEF(BASS_ChannelLock)(DWORD handle, BOOL lock); +BASS_ChannelLock = func_type(ctypes.c_byte, ctypes.c_ulong, ctypes.c_byte)(('BASS_ChannelLock', bass_module)) +#BOOL BASSDEF(BASS_ChannelPlay)(DWORD handle, BOOL restart); +BASS_ChannelPlay = func_type(ctypes.c_byte, ctypes.c_ulong, ctypes.c_byte)(('BASS_ChannelPlay', bass_module)) +#BOOL BASSDEF(BASS_ChannelStop)(DWORD handle); +BASS_ChannelStop = func_type(ctypes.c_byte, ctypes.c_ulong)(('BASS_ChannelStop', bass_module)) +#BOOL BASSDEF(BASS_ChannelPause)(DWORD handle); +BASS_ChannelPause = func_type(ctypes.c_byte, ctypes.c_ulong)(('BASS_ChannelPause', bass_module)) +#BOOL BASSDEF(BASS_ChannelSetAttribute)(DWORD handle, DWORD attrib, float value); +BASS_ChannelSetAttribute = func_type(ctypes.c_byte, ctypes.c_ulong, ctypes.c_ulong, ctypes.c_float)(('BASS_ChannelSetAttribute', bass_module)) +#BOOL BASSDEF(BASS_ChannelGetAttribute)(DWORD handle, DWORD attrib, float *value); +BASS_ChannelGetAttribute = func_type(ctypes.c_byte, ctypes.c_ulong, ctypes.c_ulong, ctypes.POINTER(ctypes.c_float))(('BASS_ChannelGetAttribute', bass_module)) +#BOOL BASSDEF(BASS_ChannelSlideAttribute)(DWORD handle, DWORD attrib, float value, DWORD time); +BASS_ChannelSlideAttribute = func_type(ctypes.c_byte, ctypes.c_ulong, ctypes.c_ulong, ctypes.c_float, ctypes.c_ulong)(('BASS_ChannelSlideAttribute', bass_module)) +#BOOL BASSDEF(BASS_ChannelIsSliding)(DWORD handle, DWORD attrib); +BASS_ChannelIsSliding = func_type(ctypes.c_byte, ctypes.c_ulong, ctypes.c_ulong)(('BASS_ChannelIsSliding', bass_module)) +#BOOL BASSDEF(BASS_ChannelSet3DAttributes)(DWORD handle, int mode, float min, float max, int iangle, int oangle, float outvol); +BASS_ChannelSet3DAttributes = func_type(ctypes.c_byte, ctypes.c_ulong, ctypes.c_int, ctypes.c_float, ctypes.c_float, ctypes.c_int, ctypes.c_int, ctypes.c_float)(('BASS_ChannelSet3DAttributes', bass_module)) +#BOOL BASSDEF(BASS_ChannelGet3DAttributes)(DWORD handle, DWORD *mode, float *min, float *max, DWORD *iangle, DWORD *oangle, float *outvol); +BASS_ChannelGet3DAttributes = func_type(ctypes.c_byte, ctypes.c_ulong, ctypes.POINTER(ctypes.c_ulong), ctypes.POINTER(ctypes.c_float), ctypes.POINTER(ctypes.c_float), ctypes.POINTER(ctypes.c_ulong), ctypes.POINTER(ctypes.c_ulong), ctypes.POINTER(ctypes.c_float))(('BASS_ChannelGet3DAttributes', bass_module)) +#BOOL BASSDEF(BASS_ChannelSet3DPosition)(DWORD handle, const BASS_3DVECTOR *pos, const BASS_3DVECTOR *orient, const BASS_3DVECTOR *vel); +BASS_ChannelSet3DPosition = func_type(ctypes.c_byte, ctypes.c_ulong, ctypes.POINTER(BASS_3DVECTOR), ctypes.POINTER(BASS_3DVECTOR), ctypes.POINTER(BASS_3DVECTOR))(('BASS_ChannelSet3DPosition', bass_module)) +#BOOL BASSDEF(BASS_ChannelGet3DPosition)(DWORD handle, BASS_3DVECTOR *pos, BASS_3DVECTOR *orient, BASS_3DVECTOR *vel); +BASS_ChannelGet3DPosition = func_type(ctypes.c_byte, ctypes.c_ulong, ctypes.POINTER(BASS_3DVECTOR), ctypes.POINTER(BASS_3DVECTOR), ctypes.POINTER(BASS_3DVECTOR))(('BASS_ChannelGet3DPosition', bass_module)) +#QWORD BASSDEF(BASS_ChannelGetLength)(DWORD handle, DWORD mode); +BASS_ChannelGetLength = func_type(QWORD, ctypes.c_ulong, ctypes.c_ulong)(('BASS_ChannelGetLength', bass_module)) +#BOOL BASSDEF(BASS_ChannelSetPosition)(DWORD handle, QWORD pos, DWORD mode); +BASS_ChannelSetPosition = func_type(ctypes.c_byte, ctypes.c_ulong, QWORD, ctypes.c_ulong)(('BASS_ChannelSetPosition', bass_module)) +#QWORD BASSDEF(BASS_ChannelGetPosition)(DWORD handle, DWORD mode); +BASS_ChannelGetPosition = func_type(QWORD, ctypes.c_ulong, ctypes.c_ulong)(('BASS_ChannelGetPosition', bass_module)) +#DWORD BASSDEF(BASS_ChannelGetLevel)(DWORD handle); +BASS_ChannelGetLevel = func_type(ctypes.c_ulong, ctypes.c_ulong)(('BASS_ChannelGetLevel', bass_module)) +#DWORD BASSDEF(BASS_ChannelGetData)(DWORD handle, void *buffer, DWORD length); +BASS_ChannelGetData = func_type(ctypes.c_ulong, ctypes.c_ulong, ctypes.c_void_p, ctypes.c_ulong)(('BASS_ChannelGetData', bass_module)) +#HSYNC BASSDEF(BASS_ChannelSetSync)(DWORD handle, DWORD type, QWORD param, SYNCPROC *proc, void *user); +BASS_ChannelSetSync = func_type(HSYNC, ctypes.c_ulong, ctypes.c_ulong, QWORD, SYNCPROC, ctypes.c_void_p)(('BASS_ChannelSetSync', bass_module)) +#BOOL BASSDEF(BASS_ChannelRemoveSync)(DWORD handle, HSYNC sync); +BASS_ChannelRemoveSync = func_type(ctypes.c_byte, ctypes.c_ulong, HSYNC)(('BASS_ChannelRemoveSync', bass_module)) +#HDSP BASSDEF(BASS_ChannelSetDSP)(DWORD handle, DSPPROC *proc, void *user, int priority); +BASS_ChannelSetDSP = func_type(HDSP, ctypes.c_ulong, DSPPROC, ctypes.c_void_p, ctypes.c_int)(('BASS_ChannelSetDSP', bass_module)) +#BOOL BASSDEF(BASS_ChannelRemoveDSP)(DWORD handle, HDSP dsp); +BASS_ChannelRemoveDSP = func_type(ctypes.c_byte, ctypes.c_ulong, HDSP)(('BASS_ChannelRemoveDSP', bass_module)) +#BOOL BASSDEF(BASS_ChannelSetLink)(DWORD handle, DWORD chan); +BASS_ChannelSetLink = func_type(ctypes.c_byte, ctypes.c_ulong, ctypes.c_ulong)(('BASS_ChannelSetLink', bass_module)) +#BOOL BASSDEF(BASS_ChannelRemoveLink)(DWORD handle, DWORD chan); +BASS_ChannelRemoveLink = func_type(ctypes.c_byte, ctypes.c_ulong, ctypes.c_ulong)(('BASS_ChannelRemoveLink', bass_module)) +#HFX BASSDEF(BASS_ChannelSetFX)(DWORD handle, DWORD type, int priority); +BASS_ChannelSetFX = func_type(HFX, ctypes.c_ulong, ctypes.c_ulong, ctypes.c_int)(('BASS_ChannelSetFX', bass_module)) +#BOOL BASSDEF(BASS_ChannelRemoveFX)(DWORD handle, HFX fx); +BASS_ChannelRemoveFX = func_type(ctypes.c_byte, ctypes.c_ulong, HFX)(('BASS_ChannelRemoveFX', bass_module)) + +#BOOL BASSDEF(BASS_FXSetParameters)(HFX handle, const void *params); +BASS_FXSetParameters = func_type(ctypes.c_byte, HFX, ctypes.c_void_p)(('BASS_FXSetParameters', bass_module)) +#BOOL BASSDEF(BASS_FXGetParameters)(HFX handle, void *params); +BASS_FXGetParameters = func_type(ctypes.c_byte, HFX, ctypes.c_void_p)(('BASS_FXGetParameters', bass_module)) +#BOOL BASSDEF(BASS_FXReset)(HFX handle); +BASS_FXReset = func_type(ctypes.c_byte, HFX)(('BASS_FXReset', bass_module)) + + +if platform.system().lower() == 'windows': + #BOOL BASSDEF(BASS_Init)(int device, DWORD freq, DWORD flags, HWND win, const GUID *dsguid); = func_type()(('', bass_module)) + BASS_Init = func_type(ctypes.c_byte, ctypes.c_int, ctypes.c_ulong, ctypes.c_ulong, ctypes.c_ulong, ctypes.c_void_p)(('BASS_Init', bass_module)) + #void *BASSDEF(BASS_GetDSoundObject)(DWORD object); + BASS_GetDSoundObject = func_type(ctypes.c_void_p, ctypes.c_ulong)(('BASS_GetDSoundObject', bass_module)) + #BOOL BASSDEF(BASS_SetEAXParameters)(int env, float vol, float decay, float damp); + BASS_SetEAXParameters = func_type(ctypes.c_byte, ctypes.c_int, ctypes.c_float, ctypes.c_float, ctypes.c_float)(('BASS_SetEAXParameters', bass_module)) + #BOOL BASSDEF(BASS_GetEAXParameters)(DWORD *env, float *vol, float *decay, float *damp); + BASS_GetEAXParameters = func_type(ctypes.c_byte, ctypes.POINTER(ctypes.c_ulong), ctypes.POINTER(ctypes.c_float), ctypes.POINTER(ctypes.c_float), ctypes.POINTER(ctypes.c_float))(('BASS_GetEAXParameters', bass_module)) + +def seconds_to_string(value): + str_seconds = '00' + str_minutes = '00' + str_hours = '00' + seconds = int(value) + if seconds > 0: + if seconds < 10: + str_seconds = '0' + str(seconds) + elif seconds > 60: + str_seconds = str(seconds%60) + else: + str_seconds = str(seconds) + minutes = int(value/60) + if minutes > 0: + if minutes < 10: + str_minutes = '0' + str(minutes) + elif minutes > 60: + str_minutes = str(minutes%60) + else: + str_minutes = str(minutes) + hours = int(minutes/60) + if hours > 0: + if hours < 10: + str_hours = '0' + str(hours) + elif hours < 60: + str_hours = str(hours) + return str_hours + ':' + str_minutes + ':' + str_seconds + +def stream_length_as_hms(handle, mode = BASS_POS_BYTE): + return seconds_to_string(BASS_ChannelBytes2Seconds(handle, BASS_ChannelGetLength(handle, mode))) + +def get_tags(handle, tags = BASS_TAG_OGG): + result = [] + addr = BASS_ChannelGetTags(handle, tags) + res = '' + while isinstance(res, str): + res = ctypes.string_at(addr) + #~ res = ctypes.wstring_at(addr) + addr += len(res) + 1 + if res: + if 32 < ord(res[0]) < 256: + result.append(res) + else: + res = None + return result + +def get_tags_as_dict(handle, tags = BASS_TAG_OGG): + result_as_dict = {} + addr = BASS_ChannelGetTags(handle, tags) + str_tag = '' + while isinstance(str_tag, str): + str_tag = ctypes.string_at(addr) + addr += len(str_tag) + 1 + if str_tag: + if 32 < ord(str_tag[0]) < 256: + key, value = str_tag.split('=') + result_as_dict[key] = value + else: + str_tag = None + return result_as_dict diff --git a/src/sound_lib/external/pybass_aac.py b/src/sound_lib/external/pybass_aac.py new file mode 100644 index 00000000..e60f71b7 --- /dev/null +++ b/src/sound_lib/external/pybass_aac.py @@ -0,0 +1,54 @@ +from __future__ import absolute_import +# Copyright(c) Max Kolosov 2009 maxkolosov@inbox.ru +# http://vosolok2008.narod.ru +# BSD license + +__version__ = '0.1' +__versionTime__ = '2009-11-15' +__author__ = 'Max Kolosov ' +__doc__ = ''' +pybass_aac.py - is ctypes python module for +BASS_AAC - extension to the BASS audio library that enables the playback +of Advanced Audio Coding and MPEG-4 streams (http://www.maresweb.de). +''' + +import os, sys, ctypes +from . import pybass +from .paths import x86_path, x64_path +import libloader + +bass_aac_module = libloader.load_library('bass_aac', x86_path=x86_path, x64_path=x64_path) +func_type = libloader.get_functype() +#Register the plugin with the Bass plugin system. +pybass.BASS_PluginLoad(libloader.find_library_path('bass_aac', x86_path=x86_path, x64_path=x64_path), 0) + +QWORD = pybass.QWORD +HSTREAM = pybass.HSTREAM +DOWNLOADPROC = pybass.DOWNLOADPROC +BASS_FILEPROCS = pybass.BASS_FILEPROCS + + +# Additional BASS_SetConfig options +BASS_CONFIG_MP4_VIDEO = 0x10700 # play the audio from MP4 videos + +# Additional tags available from BASS_StreamGetTags (for MP4 files) +BASS_TAG_MP4 = 7 # MP4/iTunes metadata + +BASS_AAC_STEREO = 0x400000 # downmatrix to stereo + +# BASS_CHANNELINFO type +BASS_CTYPE_STREAM_AAC = 0x10b00 # AAC +BASS_CTYPE_STREAM_MP4 = 0x10b01 # MP4 + + +#HSTREAM BASSAACDEF(BASS_AAC_StreamCreateFile)(BOOL mem, const void *file, QWORD offset, QWORD length, DWORD flags); +BASS_AAC_StreamCreateFile = func_type(HSTREAM, ctypes.c_byte, ctypes.c_void_p, QWORD, QWORD, ctypes.c_ulong)(('BASS_AAC_StreamCreateFile', bass_aac_module)) +#HSTREAM BASSAACDEF(BASS_AAC_StreamCreateURL)(const char *url, DWORD offset, DWORD flags, DOWNLOADPROC *proc, void *user); +BASS_AAC_StreamCreateURL = func_type(HSTREAM, ctypes.c_char_p, ctypes.c_ulong, ctypes.c_ulong, DOWNLOADPROC, ctypes.c_void_p)(('BASS_AAC_StreamCreateURL', bass_aac_module)) +#HSTREAM BASSAACDEF(BASS_AAC_StreamCreateFileUser)(DWORD system, DWORD flags, const BASS_FILEPROCS *procs, void *user); +BASS_AAC_StreamCreateFileUser = func_type(HSTREAM, ctypes.c_ulong, ctypes.c_ulong, ctypes.POINTER(BASS_FILEPROCS), ctypes.c_void_p)(('BASS_AAC_StreamCreateFileUser', bass_aac_module)) +#HSTREAM BASSAACDEF(BASS_MP4_StreamCreateFile)(BOOL mem, const void *file, QWORD offset, QWORD length, DWORD flags); +BASS_MP4_StreamCreateFile = func_type(HSTREAM, ctypes.c_byte, ctypes.c_void_p, QWORD, QWORD, ctypes.c_ulong)(('BASS_MP4_StreamCreateFile', bass_aac_module)) +#HSTREAM BASSAACDEF(BASS_MP4_StreamCreateFileUser)(DWORD system, DWORD flags, const BASS_FILEPROCS *procs, void *user); +BASS_MP4_StreamCreateFileUser = func_type(HSTREAM, ctypes.c_ulong, ctypes.c_ulong, ctypes.POINTER(BASS_FILEPROCS), ctypes.c_void_p)(('BASS_MP4_StreamCreateFileUser', bass_aac_module)) + diff --git a/src/sound_lib/external/pybass_alac.py b/src/sound_lib/external/pybass_alac.py new file mode 100644 index 00000000..0052ba14 --- /dev/null +++ b/src/sound_lib/external/pybass_alac.py @@ -0,0 +1,24 @@ +from __future__ import absolute_import +"BASS_ALAC wrapper by Christopher Toth""" + +import ctypes +import os +from . import pybass +from .paths import x86_path, x64_path +import libloader + +bass_fx_module = libloader.load_library('bass_alac', x86_path=x86_path, x64_path=x64_path) +func_type = libloader.get_functype() + +pybass.BASS_PluginLoad(libloader.find_library_path('bass_alac', x86_path=x86_path, x64_path=x64_path), 0) + +BASS_TAG_MP4 = 7 +BASS_CTYPE_STREAM_ALAC = 0x10e00 + + +#HSTREAM BASSALACDEF(BASS_ALAC_StreamCreateFile)(BOOL mem, const void *file, QWORD offset, QWORD length, DWORD flags); +BASS_ALAC_StreamCreateFile = func_type(pybass.HSTREAM, ctypes.c_byte, ctypes.c_void_p, pybass.QWORD, pybass.QWORD, ctypes.c_ulong) + +#HSTREAM BASSALACDEF(BASS_ALAC_StreamCreateFileUser)(DWORD system, DWORD flags, const BASS_FILEPROCS *procs, void *user); +BASS_ALAC_StreamCreateFileUser = func_type(pybass.HSTREAM, ctypes.c_ulong, ctypes.c_ulong, ctypes.c_void_p, ctypes.c_void_p) + diff --git a/src/sound_lib/external/pybass_fx.py b/src/sound_lib/external/pybass_fx.py new file mode 100644 index 00000000..95d38263 --- /dev/null +++ b/src/sound_lib/external/pybass_fx.py @@ -0,0 +1,384 @@ +from __future__ import absolute_import +from future.builtins import range +"BASS_FX wrapper by Christopher Toth""" + +import ctypes +import os +from . import pybass +from .paths import x86_path, x64_path +import libloader + +bass_fx_module = libloader.load_library('bass_fx', x86_path=x86_path, x64_path=x64_path) +func_type = libloader.get_functype() + + +#Error codes returned by BASS_ErrorGetCode +BASS_ERROR_FX_NODECODE = 4000 +BASS_ERROR_FX_BPMINUSE = 4001 + +#Tempo / Reverse / BPM / Beat flag +BASS_FX_FREESOURCE = 0x10000 + +#BASS_FX Version +BASS_FX_GetVersion = func_type(ctypes.c_ulong)(('BASS_FX_GetVersion', bass_fx_module)) + + +"""D S P (Digital Signal Processing)""" + +""" +Multi-channel order of each channel is as follows: + 3 channels left-front, right-front, center. + 4 channels left-front, right-front, left-rear/side, right-rear/side. + 6 channels (5.1) left-front, right-front, center, LFE, left-rear/side, right-rear/side. + 8 channels (7.1) left-front, right-front, center, LFE, left-rear/side, right-rear/side, left-rear center, right-rear center. +""" + +#DSP channels flags +BASS_BFX_CHANALL = -1 #all channels at once (as by default) +BASS_BFX_CHANNONE = 0 #disable an effect for all channels +BASS_BFX_CHAN1 = 1 #left-front channel +BASS_BFX_CHAN2 = 2 #right-front channel +BASS_BFX_CHAN3 = 4 #see above info +BASS_BFX_CHAN4 = 8 #see above info +BASS_BFX_CHAN5 = 16 +BASS_BFX_CHAN6 = 32 +BASS_BFX_CHAN7 = 64 +BASS_BFX_CHAN8 = 128 + +#DSP effects +( + BASS_FX_BFX_ROTATE, + BASS_FX_BFX_ECHO, + BASS_FX_BFX_FLANGER, + BASS_FX_BFX_VOLUME, + BASS_FX_BFX_PEAKEQ, + BASS_FX_BFX_REVERB, + BASS_FX_BFX_LPF, + BASS_FX_BFX_MIX, + BASS_FX_BFX_DAMP, + BASS_FX_BFX_AUTOWAH, + BASS_FX_BFX_ECHO2, + BASS_FX_BFX_PHASER, + BASS_FX_BFX_ECHO3, + BASS_FX_BFX_CHORUS, + BASS_FX_BFX_APF, + BASS_FX_BFX_COMPRESSOR, + BASS_FX_BFX_DISTORTION, + BASS_FX_BFX_COMPRESSOR2, + BASS_FX_BFX_VOLUME_ENV, + BASS_FX_BFX_BQF, +) = range(0x10000, 0x10000+20) + +#BiQuad filters +( + BASS_BFX_BQF_LOWPASS, + BASS_BFX_BQF_HIGHPASS, + BASS_BFX_BQF_BANDPASS, #constant 0 dB peak gain + BASS_BFX_BQF_BANDPASS_Q, #constant skirt gain, peak gain = Q + BASS_BFX_BQF_NOTCH, + BASS_BFX_BQF_ALLPASS, + BASS_BFX_BQF_PEAKINGEQ, + BASS_BFX_BQF_LOWSHELF, + BASS_BFX_BQF_HIGHSHELF, +) = range(9) + +#Echo +class BASS_BFX_ECHO(ctypes.Structure): + _fields_ = [ + ('fLevel', ctypes.c_float), #[0....1....n] linear + ('lDelay', ctypes.c_int), #[1200..30000] + ] + +#Flanger +class BASS_BFX_FLANGER(ctypes.Structure): + _fields_ = [ + ('fWetDry', ctypes.c_float), #[0....1....n] linear + ('fSpeed', ctypes.c_float), #[0......0.09] + ('lChannel', ctypes.c_int), #BASS_BFX_CHANxxx flag/s + ] + +#volume +class BASS_BFX_VOLUME(ctypes.Structure): + _fields_ = [ + ('lChannel', ctypes.c_int), #BASS_BFX_CHANxxx flag/s or 0 for global volume control + ('fVolume', ctypes.c_float), #[0....1....n] linear + ] + +#Peaking Equalizer +class BASS_BFX_PEAKEQ(ctypes.Structure): + _fields_ = [ + ('lBand', ctypes.c_int), #[0...............n] more bands means more memory & cpu usage + ('fBandwidth', ctypes.c_float), #[0.1...........<10] in octaves - fQ is not in use (Bandwidth has a priority over fQ) + ('fQ', ctypes.c_float), #[0...............1] the EE kinda definition (linear) (if Bandwidth is not in use) + ('fCenter', ctypes.c_float), #[1Hz.. 0: + deleted_event = event.event(event.EVT_DELETED, 1) + deleted_event.SetItem(item) + self.friends.pop(item) + self.db.settings["friends"].pop(item) + wx.PostEvent(self.parent.nb.GetPage(self.db.settings["buffers"].index("friends")), deleted_event) + + def on_success(self, data): + try: + if "direct_message" in data: + self.process_dm(data) + elif "friends" in data: + self.friends = data["friends"] + elif "text" in data and utils.is_allowed(data) == True: + if data["user"]["id"] in self.muted_users: return + self.check_mentions(data) + self.check_send(data) + if data["user"]["id"] in self.friends or data["user"]["screen_name"] == self.db.settings["user_name"]: + tweet_event = event.event(event.EVT_OBJECT, 1) + tweet_event.SetItem(data) + wx.PostEvent(self.parent.nb.GetPage(self.db.settings["buffers"].index("home_timeline")), tweet_event) + elif data.has_key("event"): + if "favorite" == data["event"] and config.main["other_buffers"]["show_favourites"] == True: + self.check_favs(data) + elif "unfavorite" == data["event"] and config.main["other_buffers"]["show_favourites"] == True: + self.remove_fav(data) + elif "follow" == data["event"] and config.main["other_buffers"]["show_followers"] == True: + self.check_follower(data) + elif "unfollow" == data["event"] and config.main["other_buffers"]["show_followers"] == True: + self.remove_friend(data) + elif "block" == data["event"]: + self.block_user(data) + elif "unblock" in data["event"]: + self.unblock(data) + elif "list_created" == data["event"]: + item = utils.find_item(data["target_object"]["id"], self.db.settings["lists"]) + if item != None: self.db.settings["lists"].append(data["target_object"]) + elif "list_destroyed" == data["event"]: + item = utils.find_item(data["target_object"]["id"], self.db.settings["lists"]) + if item != None: self.db.settings["lists"].pop(item) + self.parent.remove_list(data["target_object"]["id"]) + elif "list_member_added" == data["event"] and data["source"]["screen_name"] == self.db.settings["user_name"]: + if len(config.main["other_buffers"]["lists"]) > 0: + for i in range(0, self.parent.nb.GetPageCount()): + if self.parent.nb.GetPage(i).type == "list": + if str(data["target_object"]["id"]) == str(self.parent.nb.GetPage(i).argumento): + self.parent.nb.GetPage(i).users.append(data["target"]["id"]) + wx.PostEvent(self.parent, event.ResultEvent()) + elif "list_member_added" == data["event"] and data["target"]["screen_name"] == self.db.settings["user_name"]: + self.db.settings["lists"].append(data["target_object"]) + elif "list_member_removed" == data["event"] and data["source"]["screen_name"] == self.db.settings["user_name"]: + if len(config.main["other_buffers"]["lists"]) > 0: + for i in range(0, self.parent.nb.GetPageCount()): + if self.parent.nb.GetPage(i).type == "list": + if str(data["target_object"]["id"]) == str(self.parent.nb.GetPage(i).argumento): + self.parent.nb.GetPage(i).users.remove(data["target"]["id"]) + wx.PostEvent(self.parent, event.ResultEvent()) + elif "list_member_removed" == data["event"] and data["target"] == self.db.settings["user_name"]: + id = data["target_object"]["id"] + list = utils.find_item(id, self.db.settings["lists"]) + if list != None: self.db.settings["lists"].pop(list) + self.parent.remove_list(data["target_object"]["id"]) + if config.main["other_buffers"]["show_events"] == True: + evento = compose.compose_event(data, self.db.settings["user_name"]) + tweet_event = event.event(event.EVT_OBJECT, 1) + tweet_event.SetItem(evento) + text = evento[1] + tweet_event.SetAnnounce(text) +# deleted_event = event.event(event.EVT_DELETED, 1) +# deleted_event.SetItem(evento) + wx.PostEvent(self.parent.nb.GetPage(self.db.settings["buffers"].index("events")), tweet_event) +# self.sound.play("new_event.ogg") + except: + pass diff --git a/src/twitter/compose.py b/src/twitter/compose.py new file mode 100644 index 00000000..cf80437b --- /dev/null +++ b/src/twitter/compose.py @@ -0,0 +1,239 @@ +# -*- coding: utf-8 -*- +import utils +import re +import htmlentitydefs +import datetime +import time +import output +import gettext, paths, locale, gettext_windows +import config, languageHandler +if config.main != None: + languageHandler.setLanguage(config.main["general"]["language"]) +else: + languageHandler.setLanguage("system") +import platform +system = platform.system() + +def prettydate(d): + """ Converts a string to the relative time.""" + diff = datetime.datetime.utcnow() - d + s = diff.seconds + if diff.days > 7 and diff.days < 14: + return _(u"About a week ago") + elif diff.days > 14 and diff.days < 31: + return _(u"About {} weeks ago").format(diff.days/7) + elif diff.days > 31 and diff.days <= 62: + return _(u"A month ago") + elif diff.days >62 and diff.days <= 365: + return _(u"About {} months ago").format(diff.days/30) + elif diff.days > 365 and diff.days <= 730: + return _(u"About a year ago") + elif diff.days > 730: + return _(u"About {} years ago").format(diff.days/365) + elif diff.days == 1: + return _(u"About 1 day ago") + elif diff.days > 1: + return _(u"About {} days ago").format(diff.days) + elif s <= 1: + return _(u"just now") + elif s < 60: + return _(u"{} seconds ago").format(s) + elif s < 120: + return _(u"1 minute ago") + elif s < 3600: + return _(u"{} minutes ago").format(s/60) + elif s < 7200: + return _(u"About 1 hour ago") + else: + return _(u"About {} hours ago").format(s/3600) + +# Months, days, short_months and short_days are used to translate the string that Twitter gives to us with the date and time. +months = { +"January": _(u"January"), +"February": _(u"February"), +"March": _(u"March"), +"April": _(u"April"), +"May": _(u"May"), +"June": _(u"June"), +"July": _(u"July"), +"August": _(u"August"), +"September": _(u"September"), +"October": _(u"October"), +"November": _(u"November"), +"December": _(u"December"), +} + +days = {"Sunday": _(u"Sunday"), +"Monday": _(u"Monday"), +"Tuesday": _(u"Tuesday"), +"Wednesday": _(u"Wednesday"), +"Thursday": _(u"Thursday"), +"Friday": _(u"Friday"), +"Saturday": _(u"Saturday")} + +short_days = { + "Sun": _(u"sun"), + "Mon": _(u"mon"), + "Tue": _(u"tue"), + "Wed": _(u"wed"), + "Thu": _(u"thu"), + "Fri": _(u"fri"), + "Sat": _(u"sat") + } + +short_months = { + "Jan": _(u"jan"), + "Feb": _(u"feb"), + "Mar": _(u"mar"), + "Apr": _(u"apr"), + "May": _(u"may"), + "Jun": _(u"jun"), + "Jul": _(u"jul"), + "Aug": _(u"aug"), + "Sep": _(u"sep"), + "Oct": _(u"oct"), + "Nov": _(u"nov"), + "Dec": _(u"dec")} + +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 unichr(int(match.group(1)[1:])) + replacement = htmlentitydefs.entitydefs.get(match.group(1), "&%s;" % match.group(1)) + return replacement.decode('iso-8859-1') + return unicode(entity_re.sub(matchFunc, s)) + +def translate(string): + """ Changes the days in English for the current language. Needed for Windows.""" + if system != "Windows": return string + else: + global months, days + for d in months: + string = string.replace(d, months[d]) + for d in days: + string = string.replace(d, days[d]) + return string + +def translate_short(string): + """ Changes the English date from Twitter to a local date and time. Needed for datetime on Linux.""" + if system != "Linux": return string + else: +# if 1 == 1: + global short_months, short_days + for d in short_months: + string = string.replace(d, short_months[d]) + for d in short_days: + string = string.replace(d, short_days[d]) + return string + +chars = "abcdefghijklmnopqrstuvwxyz" + +def compose_tweet(tweet, db): + """ It receives a tweet and returns a list with the user, text for the tweet or message, date and the client where user is.""" +# original_date = datetime.datetime.strptime(translate_short(tweet["created_at"]).encode("utf-8"), "%a %b %d %H:%M:%S +0000 %Y") + original_date = datetime.datetime.strptime(tweet["created_at"], "%a %b %d %H:%M:%S +0000 %Y") +# else: +# original_date = datetime.datetime.strptime(tweet["created_at"], '%a %b %d %H:%M:%S +0000 %Y') + date = original_date-datetime.timedelta(seconds=-db.settings["utc_offset"]) + if config.main["general"]["relative_times"] == True: + ts = prettydate(original_date) + else: +# ts = translate(datetime.datetime.strftime(date, _("%A, %B %d, %Y at %I:%M:%S %p".encode("utf-8"))).decode("utf-8")) + ts = translate(datetime.datetime.strftime(date, _("%A, %B %d, %Y at %I:%M:%S %p"))) +# ts = tweet["created_at"] + text = StripChars(tweet["text"]) + if tweet.has_key("sender"): + source = "DM" + if db.settings["user_name"] == tweet["sender"]["screen_name"]: user = _(u"Dm to %s ") % (tweet["recipient"]["name"],) + else: user = tweet["sender"]["name"] + elif tweet.has_key("user"): + user = tweet["user"]["name"] + source = re.sub(r"(?s)<.*?>", " ", tweet["source"]) + try: text = "rt @%s: %s" % (tweet["retweeted_status"]["user"]["screen_name"], StripChars(tweet["retweeted_status"]["text"])) + except KeyError: text = "%s" % (StripChars(tweet["text"])) + if text[-1] in chars: text=text+"." + urls = utils.find_urls_in_text(text) + for url in range(0, len(urls)): + try: text = text.replace(urls[url], tweet["entities"]["urls"][url]["expanded_url"]) + except IndexError: pass + tweet["text"] = text + return [user+", ", tweet["text"], ts+", ", source] + +def compose_followers_list(tweet, db): +# original_date = datetime.datetime.strptime(translate_short(tweet["created_at"]).encode("utf-8"), '%a %b %d %H:%M:%S +0000 %Y') + original_date = datetime.datetime.strptime(tweet["created_at"], '%a %b %d %H:%M:%S +0000 %Y') + date = original_date-datetime.timedelta(seconds=-db.settings["utc_offset"]) + if config.main["general"]["relative_times"] == True: + ts = prettydate(original_date) + else: + ts = translate(datetime.datetime.strftime(date, _(u"%A, %B %d, %Y at %I:%M:%S %p"))) +# ts = tweet["created_at"] + if tweet.has_key("status"): + if len(tweet["status"]) > 4: +# original_date2 = datetime.datetime.strptime(translate_short(tweet["status"]["created_at"]).encode("utf-8"), '%a %b %d %H:%M:%S +0000 %Y') + original_date2 = datetime.datetime.strptime(tweet["status"]["created_at"], '%a %b %d %H:%M:%S +0000 %Y') + date2 = original_date2-datetime.timedelta(seconds=-db.settings["utc_offset"]) + if config.main["general"]["relative_times"]: + ts2 = prettydate(original_date2) + else: + ts2 = translate(datetime.datetime.strftime(date2, _(u"%A, %B %d, %Y at %I:%M:%S %p"))) + else: + ts2 = _("Unavailable") + return [_(u"%s (@%s). %s followers, %s friends, %s tweets. Last tweet on %s. Joined Twitter on %s") % (tweet["name"], tweet["screen_name"], tweet["followers_count"], tweet["friends_count"], tweet["statuses_count"], ts2, ts)] + +def compose_event(data, username): + if data["event"] == "block": + event = _("You've blocked %s") % (data["target"]["name"]) + elif data["event"] == "unblock": + event = _(u"You've unblocked %s") % (data["target"]["name"]) + elif data["event"] == "follow": + if data["target"]["screen_name"] == username: + event = _(u"%s(@%s) has followed you") % (data["source"]["name"], data["source"]["screen_name"]) + elif data["source"]["screen_name"] == username: + event = _(u"You've followed %s(@%s)") % (data["target"]["name"], data["target"]["screen_name"]) + elif data["event"] == "unfollow": + event = _(u"You've unfollowed %s (@%s)") % (data["target"]["name"], data["target"]["screen_name"]) + elif data["event"] == "favorite": + if data["source"]["screen_name"] == username: + event = _(u"You've added to favourites: %s, %s") % (data["target"]["name"], data["target_object"]["text"]) + else: + event = _(u"%s(@%s) has marked as favorite: %s") % (data["source"]["name"], data["source"]["screen_name"], data["target_object"]["text"]) + elif data["event"] == "unfavorite": + if data["source"]["screen_name"] == username: event = _(u"You've removed from favourites: %s, %s") % (data["target"]["name"], data["target_object"]["text"]) + else: event = _(u"%s(@%s) has removed from favourites: %s") % (data["source"]["name"], data["source"]["screen_name"], data["target_object"]["text"]) + elif data["event"] == "list_created": + event = _(u"You've created the list %s") % (data["target_object"]["name"]) + elif data["event"] == "list_destroyed": + event = _("You've deleted the list %s") % (data["target_object"]["name"]) + elif data["event"] == "list_updated": + event = _("You've updated the list %s") % (data["target_object"]["name"]) + elif data["event"] == "list_member_added": + if data["source"]["screen_name"] == username: event = _(u"You've added %s(@%s) to the list %s") % (data["target"]["name"], data["target"]["screen_name"], data["target_object"]["name"]) + else: event = _(u"%s(@%s) has added you to the list %s") % (data["source"]["name"], data["source"]["screen_name"], data["target_object"]["name"]) + elif data["event"] == "list_member_removed": + if data["source"]["screen_name"] == username: event = _(u"You'be removed %s(@%s) from the list %s") % (data["target"]["name"], data["target"]["screen_name"], data["target_object"]["name"]) + else: event = _(u"%s(@%s) has removed you from the list %s") % (data["source"]["name"], data["source"]["screen_name"], data["target_object"]["name"]) + elif data["event"] == "list_user_subscribed": + if data["source"]["screen_name"] == username: event = _(u"You've subscribed to the list %s, which is owned by %s(@%s)") % (data["target_object"]["name"], data["target"]["name"], data["target"]["screen_name"]) + else: event = _(u"%s(@%s) has suscribed you to the list %s") % (data["source"]["name"], data["source"]["screen_name"], data["target_object"]["name"]) + elif data["event"] == "list_user_unsubscribed": + if data["source"]["screen_name"] == username: event = _(u"You've unsubscribed from the list %s, which is owned by %s(@%s)") % (data["target_object"]["name"], data["target"]["name"], data["target"]["screen_name"]) + else: event = _("You've been unsubscribed from the list %s, which is owned by %s(@%s)") % (data["target_object"]["name"], data["source"]["name"], data["source"]["screen_name"]) + else: event = _("Unknown") +# output.speak(event) + return [time.strftime("%I:%M %p"), event] + +def compose_list(list): + name = list["name"] + if list["description"] == None: description = _(u"No description available") + else: description = list["description"] + user = list["user"]["name"] + members = str(list["member_count"]) + if list["mode"] == "private": status = _(u"private") + else: status = _(u"public") + return [name, description, user, members, status] diff --git a/src/twitter/starting.py b/src/twitter/starting.py new file mode 100644 index 00000000..ab220534 --- /dev/null +++ b/src/twitter/starting.py @@ -0,0 +1,260 @@ +# -*- config: utf-8 -*- +from twython import Twython, TwythonError +import config +#import sound +import time +import utils + +friends_cursor = followers_cursor = None + +def get_more_items(update_function, twitter_object, users=False, name=None, *args, **kwargs): + results = [] + data = update_function(*args, **kwargs) + if users == True: + global friends_cursor, followers_cursor + if name == "friends": + friends_cursor = data["next_cursor"] + elif name == "followers": + followers_cursor = data["next_cursor"] + for i in data["users"]: results.append(i) + else: + results.extend(data[1:]) + if config.main["general"]["reverse_timelines"] == True: results.reverse() + return results + +def call_paged(update_function, twitter_object, *args, **kwargs): + max = int(config.main["general"]["max_api_calls"])-1 + results = [] + data = update_function(*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 = update_function(max_id=max_id, *args, **kwargs) + results.extend(data) + results.reverse() + return results + +def start_user_info(config, twitter): + f = twitter.twitter.get_account_settings() + sn = f["screen_name"] + config.settings["user_name"] = sn + config.settings["user_id"] = twitter.twitter.show_user(screen_name=sn)["id_str"] + try: + config.settings["utc_offset"] = f["time_zone"]["utc_offset"] + except KeyError: + config.settings["utc_offset"] = -time.timezone + get_lists(config, twitter) + get_muted_users(config, twitter) + +def get_lists(config, twitter): + config.settings["lists"] = twitter.twitter.show_lists(reverse=True) + +def get_muted_users(config, twitter): + config.settings["muted_users"] = twitter.twitter.get_muted_users_ids()["ids"] + +def start_stream(db, twitter, name, function, param=None): + num = 0 + if db.settings.has_key(name): + try: + if db.settings[name][0]["id"] > db.settings[name][-1]["id"]: + last_id = db.settings[name][0]["id"] + else: + last_id = db.settings[name][-1]["id"] + except IndexError: + pass + if param != None: + tl = call_paged(function, twitter, sinze_id=last_id, screen_name=param, count=config.main["general"]["max_tweets_per_call"]) + else: + tl = call_paged(function, twitter, sinze_id=last_id, count=config.main["general"]["max_tweets_per_call"]) + else: + if param != None: + tl = call_paged(function, twitter, screen_name=param, count=config.main["general"]["max_tweets_per_call"]) + else: + tl = call_paged(function, twitter, count=config.main["general"]["max_tweets_per_call"]) + db.settings[name] = [] + last_id = 0 + if len(db.settings[name]) > 0: + for i in tl: + if int(i["id"]) > int(last_id): + if config.main["general"]["reverse_timelines"] == False: db.settings[name].append(i) + else: db.settings[name].insert(0, i) + num = num+1 + elif len(db.settings[name]) == 0: + for i in tl: + if config.main["general"]["reverse_timelines"] == False: db.settings[name].append(i) + else: db.settings[name].insert(0, i) + num = num+1 +# db.settings.update() + return num + +def start_followers(db, twitter, name, function, param=None): + global friends_cursor, followers_cursor + num = 0 + db.settings[name] = [] +# next_cursor = -1 +# while(next_cursor): + tl = function(screen_name=param, count=config.main["general"]["max_tweets_per_call"]) + for i in tl['users']: + if config.main["general"]["reverse_timelines"] == False: db.settings[name].append(i) + else: db.settings[name].insert(0, i) + num = num+1 +# next_cursor = tl["next_cursor"] + db.settings[name].reverse() +# if config.main["streams"]["reverse_timelines"] == True: db.settings[name].reverse() + if name == "followers": followers_cursor = tl["next_cursor"] + elif name == "friends": friends_cursor = tl["next_cursor"] + return num + +def get_users_list(twitter, list_id): + answers = [] + next_cursor = -1 + while(next_cursor): + users = twitter.twitter.get_list_members(list_id=list_id, cursor=next_cursor, include_entities=False, skip_status=True) + for i in users['users']: + answers.append(i["id"]) + next_cursor = users["next_cursor"] + return answers + +def update_stream(config, twitter, name, function, param=None, sndFile=""): + num = 0 + sounded = False + tl = function(sinze_id=config.settings[name][-1]["id"], screen_name=param, count=config.main["general"]["max_tweets_per_call"]) + tl.reverse() + for i in tl: + if i["id"] > config.settings[name][-1]["id"]: + config.settings[name].append(i) + sounded = True + num = num+1 + if sounded == True: + sound.play(sndFile) + return num + +def start_sent(db, twitter, name, function, param=None): + num = 0 + if db.settings.has_key(name): + try: + if db.settings[name][0]["id"] > db.settings[name][-1]["id"]: + last_id = db.settings[name][0]["id"] + else: + last_id = db.settings[name][-1]["id"] + except IndexError: + return 0 + if param != None: + tl = function(sinze_id=last_id, screen_name=param, count=config.main["general"]["max_tweets_per_call"]) + tl2 = twitter.twitter.get_sent_messages(sinze_id=last_id, count=config.main["general"]["max_tweets_per_call"]) + else: + tl = function(sinze_id=last_id, count=config.main["general"]["max_tweets_per_call"]) + tl2 = twitter.twitter.get_sent_messages(sinze_id=last_id, count=config.main["general"]["max_tweets_per_call"]) + else: + if param != None: + tl = function(screen_name=param, count=config.main["general"]["max_tweets_per_call"]) + tl2 = twitter.twitter.get_sent_messages(count=config.main["general"]["max_tweets_per_call"]) + else: + tl = function(count=config.main["general"]["max_tweets_per_call"]) + tl2 = twitter.twitter.get_sent_messages(sinze_id=last_id, count=config.main["general"]["max_tweets_per_call"]) + db.settings[name] = [] + last_id = 0 + tl.extend(tl2) +# tl.reverse() + tl.sort(key=lambda tup: tup["id"]) + if len(db.settings[name]) > 0: + for i in tl: +# print last_id, i["id"] + if int(i["id"]) > int(last_id): + if config.main["general"]["reverse_timelines"] == False: db.settings[name].append(i) + else: db.settings[name].insert(0, i) + num = num+1 + elif len(db.settings[name]) == 0: + for i in tl: + if config.main["general"]["reverse_timelines"] == False: db.settings[name].append(i) + else: db.settings[name].insert(0, i) + num = num+1 + return num + +def start_list(db, twitter, name, list_id): + num = 0 + if db.settings.has_key(name): + try: + if db.settings[name][0]["id"] > db.settings[name][-1]["id"]: + last_id = db.settings[name][0]["id"] + else: + last_id = db.settings[name][-1]["id"] + except IndexError: + pass + tl = twitter.twitter.get_list_statuses(list_id=list_id, count=200) + else: + tl = twitter.twitter.get_list_statuses(list_id=list_id, count=200) + tl.reverse() + db.settings[name] = [] + last_id = 0 + if len(db.settings[name]) > 0: + for i in tl: + if int(i["id"]) > int(last_id): + if config.main["general"]["reverse_timelines"] == False: db.settings[name].append(i) + else: db.settings[name].insert(0, i) + num = num+1 + elif len(db.settings[name]) == 0: + for i in tl: + if config.main["general"]["reverse_timelines"] == False: db.settings[name].append(i) + else: db.settings[name].insert(0, i) + num = num+1 + db.settings.update() + return num + +def search(db, twitter, name, *args, **kwargs): + num = 0 + if db.settings.has_key(name) == False: + db.settings[name] = [] + tl = twitter.twitter.search(*args, **kwargs) + tl["statuses"].reverse() + if len(db.settings[name]) > 0: + for i in tl["statuses"]: + if utils.find_item(i["id"], db.settings[name]) == None: + if config.main["general"]["reverse_timelines"] == False: db.settings[name].append(i) + else: db.settings[name].insert(0, i) + num = num+1 + elif len(db.settings[name]) == 0: + for i in tl["statuses"]: + if config.main["general"]["reverse_timelines"] == False: db.settings[name].append(i) + else: db.settings[name].insert(0, i) + num = num+1 + return num + +def search_users(db, twitter, name, *args, **kwargs): + num = 0 + if db.settings.has_key(name) == False: + db.settings[name] = [] + tl = twitter.twitter.search_users(*args, **kwargs) + tl.reverse() + if len(db.settings[name]) > 0: + for i in tl: + if utils.find_item(i["id"], db.settings[name]) == None: + if config.main["general"]["reverse_timelines"] == False: db.settings[name].append(i) + else: db.settings[name].insert(0, i) + num = num+1 + elif len(db.settings[name]) == 0: + for i in tl: + if config.main["general"]["reverse_timelines"] == False: db.settings[name].append(i) + else: db.settings[name].insert(0, i) + num = num+1 + return num + +def get_favourites_timeline(db, twitter, name, param, *args, **kwargs): + num = 0 + if db.settings.has_key(name) == False: + db.settings[name] = [] + tl = twitter.twitter.get_favorites(screen_name=param, *args, **kwargs) + tl.reverse() + if len(db.settings[name]) > 0: + for i in tl: + if utils.find_item(i["id"], db.settings[name]) == None: + if config.main["general"]["reverse_timelines"] == False: db.settings[name].append(i) + else: db.settings[name].insert(0, i) + num = num+1 + elif len(db.settings[name]) == 0: + for i in tl: + if config.main["general"]["reverse_timelines"] == False: db.settings[name].append(i) + else: db.settings[name].insert(0, i) + num = num+1 + return num \ No newline at end of file diff --git a/src/twitter/twitter.py b/src/twitter/twitter.py new file mode 100644 index 00000000..ef24d093 --- /dev/null +++ b/src/twitter/twitter.py @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- +import BaseHTTPServer +import webbrowser +from urlparse import urlparse, parse_qs +from twython import Twython, TwythonError +import config +import application +import output +import sound +import time + +logged = False +verifier = None + +class handler(BaseHTTPServer.BaseHTTPRequestHandler): + + def do_GET(self): + global logged + self.send_response(200) + self.send_header("Content-type", "text/html") + self.end_headers() + logged = True + params = parse_qs(urlparse(self.path).query) + global verifier + verifier = params.get('oauth_verifier', [None])[0] + self.wfile.write("You have successfully logged in to Twitter with TW Blue. " + "You can close this window now.") + +class twitter(object): + + def login(self, user_key=None, user_secret=None): + if user_key != None and user_secret != None: + self.twitter = Twython(application.app_key, application.app_secret, user_key, user_secret) + elif config.main != None: + self.twitter = Twython(application.app_key, application.app_secret, config.main["twitter"]["user_key"], config.main["twitter"]["user_secret"]) + else: + self.twitter = Twython(application.app_key, application.app_secret, self.final_step['oauth_token'], self.final_step['oauth_token_secret']) + self.credentials = self.twitter.verify_credentials() + + def authorise(self): + httpd = BaseHTTPServer.HTTPServer(('127.0.0.1', 8080), handler) + twitter = Twython(application.app_key, application.app_secret) + auth = twitter.get_authentication_tokens("http://127.0.0.1:8080") + webbrowser.open_new_tab(auth['auth_url']) + global logged, verifier + while logged == False: + httpd.handle_request() + self.twitter = Twython(application.app_key, application.app_secret, auth['oauth_token'], auth['oauth_token_secret']) + final = self.twitter.get_authorized_tokens(verifier) + self.save_configuration(final["oauth_token"], final["oauth_token_secret"]) + + def save_configuration(self, user_key=None, user_secret=None): + if user_key != None and user_secret != None: + config.main["twitter"]["user_key"] = user_key + config.main["twitter"]["user_secret"] = user_secret + else: + config.main['twitter']['user_key'] = self.final_step['oauth_token'] + config.main['twitter']['user_secret'] = self.final_step['oauth_token_secret'] + config.main.write() + + def api_call(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, call_name)(*args, **kwargs) + finished = True + except TwythonError as e: +# if hasattr(e, 'reason') and e.reason.startswith("Failed to send request"): + output.speak(e.message) + if report_failure and hasattr(e, 'message'): + output.speak(_("%s failed. Reason: %s") % (action, e.message)) + finished = True + except: + tries = tries + 1 + time.sleep(5) + # raise e + if report_success: + output.speak(_("%s succeeded.") % action) + if _sound != None: sound.player.play(_sound) +# return val \ No newline at end of file diff --git a/src/twitter/utils.py b/src/twitter/utils.py new file mode 100644 index 00000000..c28d9333 --- /dev/null +++ b/src/twitter/utils.py @@ -0,0 +1,114 @@ +# -*- coding: utf-8 -*- +import url_shortener, re +""" Some utilities for the twitter interface.""" +import output +from twython import TwythonError +import config + +__version__ = 0.1 +__doc__ = "Find urls in tweets and #audio hashtag." + +url_re = re.compile(r"(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))") +#"(?:\w+://|www\.)[^ ,.?!#%=+][^ ]*") +#bad_chars = '\'\\.,[](){}:;"' + +url_re2 = re.compile("(?:\w+://|www\.)[^ ,.?!#%=+][^ ]*") +bad_chars = '\'\\.,[](){}:;"' + +def find_urls_in_text(text): + return [s.strip(bad_chars) for s in url_re2.findall(text)] + +def find_urls (tweet): + urls = [] +# for i in tweet["entities"]["urls"]: +# unshortened = url_shortener.unshorten(i["expanded_url"]) +# if unshortened == None: +# urls.append(i["expanded_url"]) +# else: +# urls.append(unshortened) +# return urls + return [s[0] for s in url_re.findall(tweet["text"])] + +def find_item(id, listItem): + for i in range(0, len(listItem)): + if listItem[i]["id"] == id: return i + return None + +def find_list(name, lists): + for i in range(0, len(lists)): + if lists[i]["slug"] == name: return lists[i]["id"] + +def find_previous_reply(id, listItem): + for i in range(0, len(listItem)): + if listItem[i]["id_str"] == str(id): return i + return None + +def find_next_reply(id, listItem): +# r = range(0, len(listItem)) +# r.reverse() +# for i in r: + for i in range(0, len(listItem)): + if listItem[i]["in_reply_to_status_id_str"] == str(id): return i + return None + +def is_audio(tweet): + if len(tweet["entities"]["hashtags"]) > 0: + for i in tweet["entities"]["hashtags"]: + if i["text"] == "audio": + return True + return False + +def get_all_mentioned(tweet, config): + """ Gets all users that has been mentioned.""" + if tweet.has_key("retweeted_status"): tweet = tweet["retweeted_status"] + string = [] + for i in tweet["entities"]["user_mentions"]: + if i["screen_name"] != config.settings["user_name"] and i["screen_name"] != tweet["user"]["screen_name"]: + if "@"+i["screen_name"] not in string: + string.append("@"+i["screen_name"]) + return " ".join(string)+" " + +def get_all_users(tweet, config): + string = [] + if tweet.has_key("retweeted_status"): + string.append(tweet["user"]["screen_name"]) + tweet = tweet["retweeted_status"] + if tweet.has_key("sender"): + string.append(tweet["sender"]["screen_name"]) + else: + if tweet["user"]["screen_name"] != config.settings["user_name"]: + string.append(tweet["user"]["screen_name"]) + for i in tweet["entities"]["user_mentions"]: + if i["screen_name"] != config.settings["user_name"] and i["screen_name"] != tweet["user"]["screen_name"]: + if i["screen_name"] not in string: + string.append(i["screen_name"]) + if len(string) == 0: + string.append(tweet["user"]["screen_name"]) + return string + +def if_user_exists(twitter, user): + try: + data = twitter.show_user(screen_name=user) + return data["screen_name"] + except: + return None + +def api_call(parent=None, call_name=None, preexec_message="", success="", success_snd="", *args, **kwargs): + if preexec_message: + output.speak(preexec_message, True) + try: + val = getattr(parent.twitter.twitter, call_name)(*args, **kwargs) + output.speak(success) + parent.parent.sound.play(success_snd) + except TwythonError as e: + output.speak("Error %s: %s" % (e.error_code, e.msg), True) + parent.parent.sound.play("error.wav") + return val + +def is_allowed(tweet): + allowed = True + if tweet.has_key("retweeted_status"): tweet = tweet["retweeted_status"] + source = re.sub(r"(?s)<.*?>", "", tweet["source"]) + for i in config.main["twitter"]["ignored_clients"]: + if i.lower() == source.lower(): allowed = False + return allowed \ No newline at end of file diff --git a/src/twython/__init__.py b/src/twython/__init__.py new file mode 100644 index 00000000..e0920a65 --- /dev/null +++ b/src/twython/__init__.py @@ -0,0 +1,29 @@ +# ______ __ __ +# /_ __/_ __ __ __ / /_ / /_ ____ ____ +# / / | | /| / // / / // __// __ \ / __ \ / __ \ +# / / | |/ |/ // /_/ // /_ / / / // /_/ // / / / +# /_/ |__/|__/ \__, / \__//_/ /_/ \____//_/ /_/ +# /____/ + +""" +Twython +------- + +Twython is a library for Python that wraps the Twitter API. + +It aims to abstract away all the API endpoints, so that +additions to the library and/or the Twitter API won't +cause any overall problems. + +Questions, comments? ryan@venodesigns.net +""" + +__author__ = 'Ryan McGrath ' +__version__ = '3.1.2' + +from .api import Twython +from .streaming import TwythonStreamer +from .exceptions import ( + TwythonError, TwythonRateLimitError, TwythonAuthError, + TwythonStreamError +) diff --git a/src/twython/advisory.py b/src/twython/advisory.py new file mode 100644 index 00000000..31657ee6 --- /dev/null +++ b/src/twython/advisory.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- + +""" +twython.advisory +~~~~~~~~~~~~~~~~ + +This module contains Warning classes for Twython to specifically +alert the user about. + +This mainly is because Python 2.7 > mutes DeprecationWarning and when +we deprecate a method or variable in Twython, we want to use to see +the Warning but don't want ALL DeprecationWarnings to appear, +only TwythonDeprecationWarnings. +""" + + +class TwythonDeprecationWarning(DeprecationWarning): + """Custom DeprecationWarning to be raised when methods/variables + are being deprecated in Twython. Python 2.7 > ignores DeprecationWarning + so we want to specifcally bubble up ONLY Twython Deprecation Warnings + """ + pass diff --git a/src/twython/api.py b/src/twython/api.py new file mode 100644 index 00000000..d129d4d4 --- /dev/null +++ b/src/twython/api.py @@ -0,0 +1,579 @@ +# -*- coding: utf-8 -*- + +""" +twython.api +~~~~~~~~~~~ + +This module contains functionality for access to core Twitter API calls, +Twitter Authentication, and miscellaneous methods that are useful when +dealing with the Twitter API +""" + +import requests +from requests.auth import HTTPBasicAuth +from requests_oauthlib import OAuth1, OAuth2 + +from . import __version__ +from .advisory import TwythonDeprecationWarning +from .compat import json, urlencode, parse_qsl, quote_plus, str, is_py2 +from .endpoints import EndpointsMixin +from .exceptions import TwythonError, TwythonAuthError, TwythonRateLimitError +from .helpers import _transparent_params + +import warnings + +warnings.simplefilter('always', TwythonDeprecationWarning) # For Python 2.7 > + + +class Twython(EndpointsMixin, object): + def __init__(self, app_key=None, app_secret=None, oauth_token=None, + oauth_token_secret=None, access_token=None, + token_type='bearer', oauth_version=1, api_version='1.1', + client_args=None, auth_endpoint='authenticate'): + """Instantiates an instance of Twython. Takes optional parameters for + authentication and such (see below). + + :param app_key: (optional) Your applications key + :param app_secret: (optional) Your applications secret key + :param oauth_token: (optional) When using **OAuth 1**, combined with + oauth_token_secret to make authenticated calls + :param oauth_token_secret: (optional) When using **OAuth 1** combined + with oauth_token to make authenticated calls + :param access_token: (optional) When using **OAuth 2**, provide a + valid access token if you have one + :param token_type: (optional) When using **OAuth 2**, provide your + token type. Default: bearer + :param oauth_version: (optional) Choose which OAuth version to use. + Default: 1 + :param api_version: (optional) Choose which Twitter API version to + use. Default: 1.1 + + :param client_args: (optional) Accepts some requests Session parameters + and some requests Request parameters. + See http://docs.python-requests.org/en/latest/api/#sessionapi + and requests section below it for details. + [ex. headers, proxies, verify(SSL verification)] + :param auth_endpoint: (optional) Lets you select which authentication + endpoint will use your application. + This will allow the application to have DM access + if the endpoint is 'authorize'. + Default: authenticate. + """ + + # API urls, OAuth urls and API version; needed for hitting that there + # API. + self.api_version = api_version + self.api_url = 'https://api.twitter.com/%s' + + self.app_key = app_key + self.app_secret = app_secret + self.oauth_token = oauth_token + self.oauth_token_secret = oauth_token_secret + self.access_token = access_token + + # OAuth 1 + self.request_token_url = self.api_url % 'oauth/request_token' + self.access_token_url = self.api_url % 'oauth/access_token' + self.authenticate_url = self.api_url % ('oauth/%s' % auth_endpoint) + + if self.access_token: # If they pass an access token, force OAuth 2 + oauth_version = 2 + + self.oauth_version = oauth_version + + # OAuth 2 + if oauth_version == 2: + self.request_token_url = self.api_url % 'oauth2/token' + + self.client_args = client_args or {} + default_headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0'} + # 'Twython v' + __version__} + if 'headers' not in self.client_args: + # If they didn't set any headers, set our defaults for them + self.client_args['headers'] = default_headers + elif 'User-Agent' not in self.client_args['headers']: + # If they set headers, but didn't include User-Agent.. set + # it for them + self.client_args['headers'].update(default_headers) + + # Generate OAuth authentication object for the request + # If no keys/tokens are passed to __init__, auth=None allows for + # unauthenticated requests, although I think all v1.1 requests + # need auth + auth = None + if oauth_version == 1: + # User Authentication is through OAuth 1 + if self.app_key is not None and self.app_secret is not None and \ + self.oauth_token is None and self.oauth_token_secret is None: + auth = OAuth1(self.app_key, self.app_secret) + + if self.app_key is not None and self.app_secret is not None and \ + self.oauth_token is not None and self.oauth_token_secret is \ + not None: + auth = OAuth1(self.app_key, self.app_secret, + self.oauth_token, self.oauth_token_secret) + elif oauth_version == 2 and self.access_token: + # Application Authentication is through OAuth 2 + token = {'token_type': token_type, + 'access_token': self.access_token} + auth = OAuth2(self.app_key, token=token) + + self.client = requests.Session() + self.client.auth = auth + + # Make a copy of the client args and iterate over them + # Pop out all the acceptable args at this point because they will + # Never be used again. + client_args_copy = self.client_args.copy() + for k, v in client_args_copy.items(): + if k in ('cert', 'hooks', 'max_redirects', 'proxies'): + setattr(self.client, k, v) + self.client_args.pop(k) # Pop, pop! + + # Headers are always present, so we unconditionally pop them and merge + # them into the session headers. + self.client.headers.update(self.client_args.pop('headers')) + + self._last_call = None + + def __repr__(self): + return '' % (self.app_key) + + def _request(self, url, method='GET', params=None, api_call=None): + """Internal request method""" + method = method.lower() + params = params or {} + + func = getattr(self.client, method) + params, files = _transparent_params(params) + + requests_args = {} + for k, v in self.client_args.items(): + # Maybe this should be set as a class variable and only done once? + if k in ('timeout', 'allow_redirects', 'stream', 'verify'): + requests_args[k] = v + + if method == 'get': + requests_args['params'] = params + else: + requests_args.update({ + 'data': params, + 'files': files, + }) + try: + response = func(url, **requests_args) + except requests.RequestException as e: + raise TwythonError(str(e)) + + # create stash for last function intel + self._last_call = { + 'api_call': api_call, + 'api_error': None, + 'cookies': response.cookies, + 'headers': response.headers, + 'status_code': response.status_code, + 'url': response.url, + 'content': response.text, + } + + # greater than 304 (not modified) is an error + if response.status_code > 304: + error_message = self._get_error_message(response) + self._last_call['api_error'] = error_message + + ExceptionType = TwythonError + if response.status_code == 429: + # Twitter API 1.1, always return 429 when + # rate limit is exceeded + ExceptionType = TwythonRateLimitError + elif response.status_code == 401 or 'Bad Authentication data' \ + in error_message: + # Twitter API 1.1, returns a 401 Unauthorized or + # a 400 "Bad Authentication data" for invalid/expired + # app keys/user tokens + ExceptionType = TwythonAuthError + + raise ExceptionType(error_message, + error_code=response.status_code, + retry_after=response.headers.get('retry-\ + after')) + + try: + content = response.json() + except ValueError: + raise TwythonError('Response was not valid JSON. \ + Unable to decode.') + + return content + + def _get_error_message(self, response): + """Parse and return the first error message""" + + error_message = 'An error occurred processing your request.' + try: + content = response.json() + # {"errors":[{"code":34,"message":"Sorry, + # that page does not exist"}]} + error_message = content['errors'][0]['message'] + except ValueError: + # bad json data from Twitter for an error + pass + except (KeyError, IndexError): + # missing data so fallback to default message + pass + + return error_message + + def request(self, endpoint, method='GET', params=None, version='1.1'): + """Return dict of response received from Twitter's API + + :param endpoint: (required) Full url or Twitter API endpoint + (e.g. search/tweets) + :type endpoint: string + :param method: (optional) Method of accessing data, either + GET or POST. (default GET) + :type method: string + :param params: (optional) Dict of parameters (if any) accepted + the by Twitter API endpoint you are trying to + access (default None) + :type params: dict or None + :param version: (optional) Twitter API version to access + (default 1.1) + :type version: string + + :rtype: dict + """ + + # In case they want to pass a full Twitter URL + # i.e. https://api.twitter.com/1.1/search/tweets.json + if endpoint.startswith('http://') or endpoint.startswith('https://'): + url = endpoint + else: + url = '%s/%s.json' % (self.api_url % version, endpoint) + + content = self._request(url, method=method, params=params, + api_call=url) + + return content + + def get(self, endpoint, params=None, version='1.1'): + """Shortcut for GET requests via :class:`request`""" + return self.request(endpoint, params=params, version=version) + + def post(self, endpoint, params=None, version='1.1'): + """Shortcut for POST requests via :class:`request`""" + return self.request(endpoint, 'POST', params=params, version=version) + + def get_lastfunction_header(self, header, default_return_value=None): + """Returns a specific header from the last API call + This will return None if the header is not present + + :param header: (required) The name of the header you want to get + the value of + + Most useful for the following header information: + x-rate-limit-limit, + x-rate-limit-remaining, + x-rate-limit-class, + x-rate-limit-reset + + """ + if self._last_call is None: + raise TwythonError('This function must be called after an API call. \ + It delivers header information.') + + return self._last_call['headers'].get(header, default_return_value) + + def get_authentication_tokens(self, callback_url=None, force_login=False, + screen_name=''): + """Returns a dict including an authorization URL, ``auth_url``, to + direct a user to + + :param callback_url: (optional) Url the user is returned to after + they authorize your app (web clients only) + :param force_login: (optional) Forces the user to enter their + credentials to ensure the correct users + account is authorized. + :param screen_name: (optional) If forced_login is set OR user is + not currently logged in, Prefills the username + input box of the OAuth login screen with the + given value + + :rtype: dict + """ + if self.oauth_version != 1: + raise TwythonError('This method can only be called when your \ + OAuth version is 1.0.') + + request_args = {} + if callback_url: + request_args['oauth_callback'] = callback_url + response = self.client.get(self.request_token_url, params=request_args) + + if response.status_code == 401: + raise TwythonAuthError(response.content, + error_code=response.status_code) + elif response.status_code != 200: + raise TwythonError(response.content, + error_code=response.status_code) + + request_tokens = dict(parse_qsl(response.content.decode('utf-8'))) + if not request_tokens: + raise TwythonError('Unable to decode request tokens.') + + oauth_callback_confirmed = request_tokens.get('oauth_callback_confirmed') \ + == 'true' + + auth_url_params = { + 'oauth_token': request_tokens['oauth_token'], + } + + if force_login: + auth_url_params.update({ + 'force_login': force_login, + 'screen_name': screen_name + }) + + # Use old-style callback argument if server didn't accept new-style + if callback_url and not oauth_callback_confirmed: + auth_url_params['oauth_callback'] = self.callback_url + + request_tokens['auth_url'] = self.authenticate_url + \ + '?' + urlencode(auth_url_params) + + return request_tokens + + def get_authorized_tokens(self, oauth_verifier): + """Returns a dict of authorized tokens after they go through the + :class:`get_authentication_tokens` phase. + + :param oauth_verifier: (required) The oauth_verifier (or a.k.a PIN + for non web apps) retrieved from the callback url querystring + :rtype: dict + + """ + if self.oauth_version != 1: + raise TwythonError('This method can only be called when your \ + OAuth version is 1.0.') + + response = self.client.get(self.access_token_url, + params={'oauth_verifier': oauth_verifier}, + headers={'Content-Type': 'application/\ + json'}) + + if response.status_code == 401: + try: + try: + # try to get json + content = response.json() + except AttributeError: # pragma: no cover + # if unicode detected + content = json.loads(response.content) + except ValueError: + content = {} + + raise TwythonError(content.get('error', 'Invalid / expired To \ + ken'), error_code=response.status_code) + + authorized_tokens = dict(parse_qsl(response.content.decode('utf-8'))) + if not authorized_tokens: + raise TwythonError('Unable to decode authorized tokens.') + + return authorized_tokens # pragma: no cover + + def obtain_access_token(self): + """Returns an OAuth 2 access token to make OAuth 2 authenticated + read-only calls. + + :rtype: string + """ + if self.oauth_version != 2: + raise TwythonError('This method can only be called when your \ + OAuth version is 2.0.') + + data = {'grant_type': 'client_credentials'} + basic_auth = HTTPBasicAuth(self.app_key, self.app_secret) + try: + response = self.client.post(self.request_token_url, + data=data, auth=basic_auth) + content = response.content.decode('utf-8') + try: + content = content.json() + except AttributeError: + content = json.loads(content) + access_token = content['access_token'] + except (KeyError, ValueError, requests.exceptions.RequestException): + raise TwythonAuthError('Unable to obtain OAuth 2 access token.') + else: + return access_token + + @staticmethod + def construct_api_url(api_url, **params): + """Construct a Twitter API url, encoded, with parameters + + :param api_url: URL of the Twitter API endpoint you are attempting + to construct + :param \*\*params: Parameters that are accepted by Twitter for the + endpoint you're requesting + :rtype: string + + Usage:: + + >>> from twython import Twython + >>> twitter = Twython() + + >>> api_url = 'https://api.twitter.com/1.1/search/tweets.json' + >>> constructed_url = twitter.construct_api_url(api_url, q='python', + result_type='popular') + >>> print constructed_url + https://api.twitter.com/1.1/search/tweets.json?q=python&result_type=popular + + """ + querystring = [] + params, _ = _transparent_params(params or {}) + params = requests.utils.to_key_val_list(params) + for (k, v) in params: + querystring.append( + '%s=%s' % (Twython.encode(k), quote_plus(Twython.encode(v))) + ) + return '%s?%s' % (api_url, '&'.join(querystring)) + + def search_gen(self, search_query, **params): # pragma: no cover + warnings.warn( + 'This method is deprecated. You should use Twython.cursor instead. \ + [eg. Twython.cursor(Twython.search, q=\'your_query\')]', + TwythonDeprecationWarning, + stacklevel=2 + ) + return self.cursor(self.search, q=search_query, **params) + + def cursor(self, function, return_pages=False, **params): + """Returns a generator for results that match a specified query. + + :param function: Instance of a Twython function + (Twython.get_home_timeline, Twython.search) + :param \*\*params: Extra parameters to send with your request + (usually parameters accepted by the Twitter API endpoint) + :rtype: generator + + Usage:: + + >>> from twython import Twython + >>> twitter = Twython(APP_KEY, APP_SECRET, OAUTH_TOKEN, + OAUTH_TOKEN_SECRET) + + >>> results = twitter.cursor(twitter.search, q='python') + >>> for result in results: + >>> print result + + """ + if not hasattr(function, 'iter_mode'): + raise TwythonError('Unable to create generator for Twython \ + method "%s"' % function.__name__) + + while True: + content = function(**params) + + if not content: + raise StopIteration + + if hasattr(function, 'iter_key'): + results = content.get(function.iter_key) + else: + results = content + + if return_pages: + yield results + else: + for result in results: + yield result + + if function.iter_mode == 'cursor' and \ + content['next_cursor_str'] == '0': + raise StopIteration + + try: + if function.iter_mode == 'id': + if 'max_id' not in params: + # Add 1 to the id because since_id and + # max_id are inclusive + if hasattr(function, 'iter_metadata'): + since_id = content[function.iter_metadata]\ + .get('since_id_str') + else: + since_id = content[0]['id_str'] + params['since_id'] = (int(since_id) - 1) + elif function.iter_mode == 'cursor': + params['cursor'] = content['next_cursor_str'] + except (TypeError, ValueError): # pragma: no cover + raise TwythonError('Unable to generate next page of search \ + results, `page` is not a number.') + + @staticmethod + def unicode2utf8(text): + try: + if is_py2 and isinstance(text, str): + text = text.encode('utf-8') + except: + pass + return text + + @staticmethod + def encode(text): + if is_py2 and isinstance(text, (str)): + return Twython.unicode2utf8(text) + return str(text) + + @staticmethod + def html_for_tweet(tweet, use_display_url=True, use_expanded_url=False): + """Return HTML for a tweet (urls, mentions, hashtags replaced with links) + + :param tweet: Tweet object from received from Twitter API + :param use_display_url: Use display URL to represent link + (ex. google.com, github.com). Default: True + :param use_expanded_url: Use expanded URL to represent link + (e.g. http://google.com). Default False + + If use_expanded_url is True, it overrides use_display_url. + If use_display_url and use_expanded_url is False, short url will + be used (t.co/xxxxx) + + """ + if 'retweeted_status' in tweet: + tweet = tweet['retweeted_status'] + + if 'entities' in tweet: + text = tweet['text'] + entities = tweet['entities'] + + # Mentions + for entity in entities['user_mentions']: + start, end = entity['indices'][0], entity['indices'][1] + + mention_html = '@%(screen_name)s' + text = text.replace(tweet['text'][start:end], + mention_html % {'screen_name': entity['screen_name']}) + + # Hashtags + for entity in entities['hashtags']: + start, end = entity['indices'][0], entity['indices'][1] + + hashtag_html = '#%(hashtag)s' + text = text.replace(tweet['text'][start:end], hashtag_html % {'hashtag': entity['text']}) + + # Urls + for entity in entities['urls']: + start, end = entity['indices'][0], entity['indices'][1] + if use_display_url and entity.get('display_url') \ + and not use_expanded_url: + shown_url = entity['display_url'] + elif use_expanded_url and entity.get('expanded_url'): + shown_url = entity['expanded_url'] + else: + shown_url = entity['url'] + + url_html = '%s' + text = text.replace(tweet['text'][start:end], + url_html % (entity['url'], shown_url)) + + return text diff --git a/src/twython/compat.py b/src/twython/compat.py new file mode 100644 index 00000000..c36b3269 --- /dev/null +++ b/src/twython/compat.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- + +""" +twython.compat +~~~~~~~~~~~~~~ + +This module contains imports and declarations for seamless Python 2 and +Python 3 compatibility. +""" + +import sys + +_ver = sys.version_info + +#: Python 2.x? +is_py2 = (_ver[0] == 2) + +#: Python 3.x? +is_py3 = (_ver[0] == 3) + +try: + import simplejson as json +except ImportError: + import json + +if is_py2: + from urllib import urlencode, quote_plus + from urlparse import parse_qsl + + str = unicode + basestring = basestring + numeric_types = (int, long, float) + + +elif is_py3: + from urllib.parse import urlencode, quote_plus, parse_qsl + + str = str + basestring = (str, bytes) + numeric_types = (int, float) diff --git a/src/twython/endpoints.py b/src/twython/endpoints.py new file mode 100644 index 00000000..39c884bd --- /dev/null +++ b/src/twython/endpoints.py @@ -0,0 +1,893 @@ +# -*- coding: utf-8 -*- + +""" +twython.endpoints +~~~~~~~~~~~~~~~~~ + +This module provides a mixin for a :class:`Twython ` instance. +Parameters that need to be embedded in the API url just need to be passed as a keyword argument. + +e.g. Twython.retweet(id=12345) + +This map is organized the order functions are documented at: +https://dev.twitter.com/docs/api/1.1 +""" + + +class EndpointsMixin(object): + # Timelines + def get_mentions_timeline(self, **params): + """Returns the 20 most recent mentions (tweets containing a users's + @screen_name) for the authenticating user. + + Docs: https://dev.twitter.com/docs/api/1.1/get/statuses/mentions_timeline + + """ + return self.get('statuses/mentions_timeline', params=params) + get_mentions_timeline.iter_mode = 'id' + + def get_user_timeline(self, **params): + """Returns a collection of the most recent Tweets posted by the user + indicated by the screen_name or user_id parameters. + + Docs: https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline + + """ + return self.get('statuses/user_timeline', params=params) + get_user_timeline.iter_mode = 'id' + + def get_home_timeline(self, **params): + """Returns a collection of the most recent Tweets and retweets + posted by the authenticating user and the users they follow. + + Docs: https://dev.twitter.com/docs/api/1.1/get/statuses/home_timeline + + """ + return self.get('statuses/home_timeline', params=params) + get_home_timeline.iter_mode = 'id' + + def retweeted_of_me(self, **params): + """Returns the most recent tweets authored by the authenticating user + that have been retweeted by others. + + Docs: https://dev.twitter.com/docs/api/1.1/get/statuses/retweets_of_me + + """ + return self.get('statuses/retweets_of_me', params=params) + retweeted_of_me.iter_mode = 'id' + + # Tweets + def get_retweets(self, **params): + """Returns up to 100 of the first retweets of a given tweet. + + Docs: https://dev.twitter.com/docs/api/1.1/get/statuses/retweets/%3Aid + + """ + return self.get('statuses/retweets/%s' % params.get('id'), params=params) + + def show_status(self, **params): + """Returns a single Tweet, specified by the id parameter + + Docs: https://dev.twitter.com/docs/api/1.1/get/statuses/show/%3Aid + + """ + return self.get('statuses/show/%s' % params.get('id'), params=params) + + def destroy_status(self, **params): + """Destroys the status specified by the required ID parameter + + Docs: https://dev.twitter.com/docs/api/1.1/post/statuses/destroy/%3Aid + + """ + return self.post('statuses/destroy/%s' % params.get('id')) + + def update_status(self, **params): + """Updates the authenticating user's current status, also known as tweeting + + Docs: https://dev.twitter.com/docs/api/1.1/post/statuses/update + + """ + return self.post('statuses/update', params=params) + + def retweet(self, **params): + """Retweets a tweet specified by the id parameter + + Docs: https://dev.twitter.com/docs/api/1.1/post/statuses/retweet/%3Aid + + """ + return self.post('statuses/retweet/%s' % params.get('id')) + + def update_status_with_media(self, **params): # pragma: no cover + """Updates the authenticating user's current status and attaches media + for upload. In other words, it creates a Tweet with a picture attached. + + Docs: https://dev.twitter.com/docs/api/1.1/post/statuses/update_with_media + + """ + return self.post('statuses/update_with_media', params=params) + + def get_oembed_tweet(self, **params): + """Returns information allowing the creation of an embedded + representation of a Tweet on third party sites. + + Docs: https://dev.twitter.com/docs/api/1.1/get/statuses/oembed + + """ + return self.get('statuses/oembed', params=params) + + def get_retweeters_ids(self, **params): + """Returns a collection of up to 100 user IDs belonging to users who + have retweeted the tweet specified by the id parameter. + + Docs: https://dev.twitter.com/docs/api/1.1/get/statuses/retweeters/ids + + """ + return self.get('statuses/retweeters/ids', params=params) + get_retweeters_ids.iter_mode = 'cursor' + get_retweeters_ids.iter_key = 'ids' + + # Search + def search(self, **params): + """Returns a collection of relevant Tweets matching a specified query. + + Docs: https://dev.twitter.com/docs/api/1.1/get/search/tweets + + """ + return self.get('search/tweets', params=params) + search.iter_mode = 'id' + search.iter_key = 'statuses' + search.iter_metadata = 'search_metadata' + + # Direct Messages + def get_direct_messages(self, **params): + """Returns the 20 most recent direct messages sent to the authenticating user. + + Docs: https://dev.twitter.com/docs/api/1.1/get/direct_messages + + """ + return self.get('direct_messages', params=params) + get_direct_messages.iter_mode = 'id' + + def get_sent_messages(self, **params): + """Returns the 20 most recent direct messages sent by the authenticating user. + + Docs: https://dev.twitter.com/docs/api/1.1/get/direct_messages/sent + + """ + return self.get('direct_messages/sent', params=params) + get_sent_messages.iter_mode = 'id' + + def get_direct_message(self, **params): + """Returns a single direct message, specified by an id parameter. + + Docs: https://dev.twitter.com/docs/api/1.1/get/direct_messages/show + + """ + return self.get('direct_messages/show', params=params) + + def destroy_direct_message(self, **params): + """Destroys the direct message specified in the required id parameter + + Docs: https://dev.twitter.com/docs/api/1.1/post/direct_messages/destroy + + """ + return self.post('direct_messages/destroy', params=params) + + def send_direct_message(self, **params): + """Sends a new direct message to the specified user from the authenticating user. + + Docs: https://dev.twitter.com/docs/api/1.1/post/direct_messages/new + + """ + return self.post('direct_messages/new', params=params) + + # Friends & Followers + def get_user_ids_of_blocked_retweets(self, **params): + """Returns a collection of user_ids that the currently authenticated + user does not want to receive retweets from. + + Docs: https://dev.twitter.com/docs/api/1.1/get/friendships/no_retweets/ids + + """ + return self.get('friendships/no_retweets/ids', params=params) + + def get_friends_ids(self, **params): + """Returns a cursored collection of user IDs for every user the + specified user is following (otherwise known as their "friends"). + + Docs: https://dev.twitter.com/docs/api/1.1/get/friends/ids + + """ + return self.get('friends/ids', params=params) + get_friends_ids.iter_mode = 'cursor' + get_friends_ids.iter_key = 'ids' + + def get_followers_ids(self, **params): + """Returns a cursored collection of user IDs for every user + following the specified user. + + Docs: https://dev.twitter.com/docs/api/1.1/get/followers/ids + + """ + return self.get('followers/ids', params=params) + get_followers_ids.iter_mode = 'cursor' + get_followers_ids.iter_key = 'ids' + + def lookup_friendships(self, **params): + """Returns the relationships of the authenticating user to the + comma-separated list of up to 100 screen_names or user_ids provided. + + Docs: https://dev.twitter.com/docs/api/1.1/get/friendships/lookup + + """ + return self.get('friendships/lookup', params=params) + + def get_incoming_friendship_ids(self, **params): + """Returns a collection of numeric IDs for every user who has a + pending request to follow the authenticating user. + + Docs: https://dev.twitter.com/docs/api/1.1/get/friendships/incoming + + """ + return self.get('friendships/incoming', params=params) + get_incoming_friendship_ids.iter_mode = 'cursor' + get_incoming_friendship_ids.iter_key = 'ids' + + def get_outgoing_friendship_ids(self, **params): + """Returns a collection of numeric IDs for every protected user for + whom the authenticating user has a pending follow request. + + Docs: https://dev.twitter.com/docs/api/1.1/get/friendships/outgoing + + """ + return self.get('friendships/outgoing', params=params) + get_outgoing_friendship_ids.iter_mode = 'cursor' + get_outgoing_friendship_ids.iter_key = 'ids' + + def create_friendship(self, **params): + """Allows the authenticating users to follow the user specified + in the ID parameter. + + Docs: https://dev.twitter.com/docs/api/1.1/post/friendships/create + + """ + return self.post('friendships/create', params=params) + + def destroy_friendship(self, **params): + """Allows the authenticating user to unfollow the user specified + in the ID parameter. + + Docs: https://dev.twitter.com/docs/api/1.1/post/friendships/destroy + + """ + return self.post('friendships/destroy', params=params) + + def update_friendship(self, **params): + """Allows one to enable or disable retweets and device notifications + from the specified user. + + Docs: https://dev.twitter.com/docs/api/1.1/post/friendships/update + + """ + return self.post('friendships/update', params=params) + + def show_friendship(self, **params): + """Returns detailed information about the relationship between two + arbitrary users. + + Docs: https://dev.twitter.com/docs/api/1.1/get/friendships/show + + """ + return self.get('friendships/show', params=params) + + def get_friends_list(self, **params): + """Returns a cursored collection of user objects for every user the + specified user is following (otherwise known as their "friends"). + + Docs: https://dev.twitter.com/docs/api/1.1/get/friends/list + + """ + return self.get('friends/list', params=params) + get_friends_list.iter_mode = 'cursor' + get_friends_list.iter_key = 'users' + + def get_followers_list(self, **params): + """Returns a cursored collection of user objects for users + following the specified user. + + Docs: https://dev.twitter.com/docs/api/1.1/get/followers/list + + """ + return self.get('followers/list', params=params) + get_followers_list.iter_mode = 'cursor' + get_followers_list.iter_key = 'users' + + # Users + def get_account_settings(self, **params): + """Returns settings (including current trend, geo and sleep time + information) for the authenticating user. + + Docs: https://dev.twitter.com/docs/api/1.1/get/account/settings + + """ + return self.get('account/settings', params=params) + + def verify_credentials(self, **params): + """Returns an HTTP 200 OK response code and a representation of the + requesting user if authentication was successful; returns a 401 status + code and an error message if not. + + Docs: https://dev.twitter.com/docs/api/1.1/get/account/verify_credentials + + """ + return self.get('account/verify_credentials', params=params) + + def update_account_settings(self, **params): + """Updates the authenticating user's settings. + + Docs: https://dev.twitter.com/docs/api/1.1/post/account/settings + + """ + return self.post('account/settings', params=params) + + def update_delivery_service(self, **params): + """Sets which device Twitter delivers updates to for the authenticating user. + + Docs: https://dev.twitter.com/docs/api/1.1/post/account/update_delivery_device + + """ + return self.post('account/update_delivery_device', params=params) + + def update_profile(self, **params): + """Sets values that users are able to set under the "Account" tab of their settings page. + + Docs: https://dev.twitter.com/docs/api/1.1/post/account/update_profile + + """ + return self.post('account/update_profile', params=params) + + def update_profile_banner_image(self, **params): # pragma: no cover + """Updates the authenticating user's profile background image. + + Docs: https://dev.twitter.com/docs/api/1.1/post/account/update_profile_background_image + + """ + return self.post('account/update_profile_banner', params=params) + + def update_profile_colors(self, **params): + """Sets one or more hex values that control the color scheme of the + authenticating user's profile page on twitter.com. + + Docs: https://dev.twitter.com/docs/api/1.1/post/account/update_profile_colors + + """ + return self.post('account/update_profile_colors', params=params) + + def update_profile_image(self, **params): # pragma: no cover + """Updates the authenticating user's profile image. + + Docs: https://dev.twitter.com/docs/api/1.1/post/account/update_profile_image + + """ + return self.post('account/update_profile_image', params=params) + + def list_blocks(self, **params): + """Returns a collection of user objects that the authenticating user is blocking. + + Docs: https://dev.twitter.com/docs/api/1.1/get/blocks/list + + """ + return self.get('blocks/list', params=params) + list_blocks.iter_mode = 'cursor' + list_blocks.iter_key = 'users' + + def list_block_ids(self, **params): + """Returns an array of numeric user ids the authenticating user is blocking. + + Docs: https://dev.twitter.com/docs/api/1.1/get/blocks/ids + + """ + return self.get('blocks/ids', params=params) + list_block_ids.iter_mode = 'cursor' + list_block_ids.iter_key = 'ids' + + def create_block(self, **params): + """Blocks the specified user from following the authenticating user. + + Docs: https://dev.twitter.com/docs/api/1.1/post/blocks/create + + """ + return self.post('blocks/create', params=params) + + def destroy_block(self, **params): + """Un-blocks the user specified in the ID parameter for the authenticating user. + + Docs: https://dev.twitter.com/docs/api/1.1/post/blocks/destroy + + """ + return self.post('blocks/destroy', params=params) + + def lookup_user(self, **params): + """Returns fully-hydrated user objects for up to 100 users per request, + as specified by comma-separated values passed to the user_id and/or screen_name parameters. + + Docs: https://dev.twitter.com/docs/api/1.1/get/users/lookup + + """ + return self.post('users/lookup', params=params) + + def show_user(self, **params): + """Returns a variety of information about the user specified by the + required user_id or screen_name parameter. + + Docs: https://dev.twitter.com/docs/api/1.1/get/users/show + + """ + return self.get('users/show', params=params) + + def search_users(self, **params): + """Provides a simple, relevance-based search interface to public user accounts on Twitter. + + Docs: https://dev.twitter.com/docs/api/1.1/get/users/search + + """ + return self.get('users/search', params=params) + + def get_contributees(self, **params): + """Returns a collection of users that the specified user can "contribute" to. + + Docs: https://dev.twitter.com/docs/api/1.1/get/users/contributees + + """ + return self.get('users/contributees', params=params) + + def get_contributors(self, **params): + """Returns a collection of users who can contribute to the specified account. + + Docs: https://dev.twitter.com/docs/api/1.1/get/users/contributors + + """ + return self.get('users/contributors', params=params) + + def remove_profile_banner(self, **params): + """Removes the uploaded profile banner for the authenticating user. + Returns HTTP 200 upon success. + + Docs: https://dev.twitter.com/docs/api/1.1/post/account/remove_profile_banner + + """ + return self.post('account/remove_profile_banner', params=params) + + def update_profile_background_image(self, **params): + """Uploads a profile banner on behalf of the authenticating user. + + Docs: https://dev.twitter.com/docs/api/1.1/post/account/update_profile_banner + + """ + return self.post('account/update_profile_background_image', params=params) + + def get_profile_banner_sizes(self, **params): + """Returns a map of the available size variations of the specified user's profile banner. + + Docs: https://dev.twitter.com/docs/api/1.1/get/users/profile_banner + + """ + return self.get('users/profile_banner', params=params) + + # Suggested Users + def get_user_suggestions_by_slug(self, **params): + """Access the users in a given category of the Twitter suggested user list. + + Docs: https://dev.twitter.com/docs/api/1.1/get/users/suggestions/%3Aslug + + """ + return self.get('users/suggestions/%s' % params.get('slug'), params=params) + + def get_user_suggestions(self, **params): + """Access to Twitter's suggested user list. + + Docs: https://dev.twitter.com/docs/api/1.1/get/users/suggestions + + """ + return self.get('users/suggestions', params=params) + + def get_user_suggestions_statuses_by_slug(self, **params): + """Access the users in a given category of the Twitter suggested user + list and return their most recent status if they are not a protected user. + + Docs: https://dev.twitter.com/docs/api/1.1/get/users/suggestions/%3Aslug/members + + """ + return self.get('users/suggestions/%s/members' % params.get('slug'), params=params) + + # Favorites + def get_favorites(self, **params): + """Returns the 20 most recent Tweets favorited by the authenticating or specified user. + + Docs: https://dev.twitter.com/docs/api/1.1/get/favorites/list + + """ + return self.get('favorites/list', params=params) + get_favorites.iter_mode = 'id' + + def destroy_favorite(self, **params): + """Un-favorites the status specified in the ID parameter as the authenticating user. + + Docs: https://dev.twitter.com/docs/api/1.1/post/favorites/destroy + + """ + return self.post('favorites/destroy', params=params) + + def create_favorite(self, **params): + """Favorites the status specified in the ID parameter as the authenticating user. + + Docs: https://dev.twitter.com/docs/api/1.1/post/favorites/create + + """ + return self.post('favorites/create', params=params) + + # Mute + def create_mute(self, **params): + return self.post('mutes/users/create', params=params) + + def destroy_mute(self, **params): + return self.post('mutes/users/destroy', params=params) + + def get_muted_users_ids(self, **params): + return self.get('mutes/users/ids', params=params) + get_muted_users_ids.iter_mode = 'cursor' + get_muted_users_ids.iter_key = 'ids' + + def get_muted_users_list(self, **params): + return self.get('mutes/users/list', params=params) + get_muted_users_list.iter_mode = 'cursor' + get_muted_users_list.iter_key = 'users' + + # Lists + def show_lists(self, **params): + """Returns all lists the authenticating or specified user subscribes to, including their own. + + Docs: https://dev.twitter.com/docs/api/1.1/get/lists/list + + """ + return self.get('lists/list', params=params) + + def get_list_statuses(self, **params): + """Returns a timeline of tweets authored by members of the specified list. + + Docs: https://dev.twitter.com/docs/api/1.1/get/lists/statuses + + """ + return self.get('lists/statuses', params=params) + get_list_statuses.iter_mode = 'id' + + def delete_list_member(self, **params): + """Removes the specified member from the list. + + Docs: https://dev.twitter.com/docs/api/1.1/post/lists/members/destroy + + """ + return self.post('lists/members/destroy', params=params) + + def get_list_memberships(self, **params): + """Returns the lists the specified user has been added to. + + Docs: https://dev.twitter.com/docs/api/1.1/get/lists/memberships + + """ + return self.get('lists/memberships', params=params) + get_list_memberships.iter_mode = 'cursor' + get_list_memberships.iter_key = 'lists' + + def get_list_subscribers(self, **params): + """Returns the subscribers of the specified list. + + Docs: https://dev.twitter.com/docs/api/1.1/get/lists/subscribers + + """ + return self.get('lists/subscribers', params=params) + get_list_subscribers.iter_mode = 'cursor' + get_list_subscribers.iter_key = 'users' + + def subscribe_to_list(self, **params): + """Subscribes the authenticated user to the specified list. + + Docs: https://dev.twitter.com/docs/api/1.1/post/lists/subscribers/create + + """ + return self.post('lists/subscribers/create', params=params) + + def is_list_subscriber(self, **params): + """Check if the specified user is a subscriber of the specified list. + + Docs: https://dev.twitter.com/docs/api/1.1/get/lists/subscribers/show + + """ + return self.get('lists/subscribers/show', params=params) + + def unsubscribe_from_list(self, **params): + """Unsubscribes the authenticated user from the specified list. + + Docs: https://dev.twitter.com/docs/api/1.1/post/lists/subscribers/destroy + + """ + return self.post('lists/subscribers/destroy', params=params) + + def create_list_members(self, **params): + """Adds multiple members to a list, by specifying a comma-separated + list of member ids or screen names. + + Docs: https://dev.twitter.com/docs/api/1.1/post/lists/members/create_all + + """ + return self.post('lists/members/create_all', params=params) + + def is_list_member(self, **params): + """Check if the specified user is a member of the specified list. + + Docs: https://dev.twitter.com/docs/api/1.1/get/lists/members/show + + """ + return self.get('lists/members/show', params=params) + + def get_list_members(self, **params): + """Returns the members of the specified list. + + Docs: https://dev.twitter.com/docs/api/1.1/get/lists/members + + """ + return self.get('lists/members', params=params) + get_list_members.iter_mode = 'cursor' + get_list_members.iter_key = 'users' + + def add_list_member(self, **params): + """Add a member to a list. + + Docs: https://dev.twitter.com/docs/api/1.1/post/lists/members/create + + """ + return self.post('lists/members/create', params=params) + + def delete_list(self, **params): + """Deletes the specified list. + + Docs: https://dev.twitter.com/docs/api/1.1/post/lists/destroy + + """ + return self.post('lists/destroy', params=params) + + def update_list(self, **params): + """Updates the specified list. + + Docs: https://dev.twitter.com/docs/api/1.1/post/lists/update + + """ + return self.post('lists/update', params=params) + + def create_list(self, **params): + """Creates a new list for the authenticated user. + + Docs: https://dev.twitter.com/docs/api/1.1/post/lists/create + + """ + return self.post('lists/create', params=params) + + def get_specific_list(self, **params): + """Returns the specified list. + + Docs: https://dev.twitter.com/docs/api/1.1/get/lists/show + + """ + return self.get('lists/show', params=params) + + def get_list_subscriptions(self, **params): + """Obtain a collection of the lists the specified user is subscribed to. + + Docs: https://dev.twitter.com/docs/api/1.1/get/lists/subscriptions + + """ + return self.get('lists/subscriptions', params=params) + get_list_subscriptions.iter_mode = 'cursor' + get_list_subscriptions.iter_key = 'lists' + + def delete_list_members(self, **params): + """Removes multiple members from a list, by specifying a + comma-separated list of member ids or screen names. + + Docs: https://dev.twitter.com/docs/api/1.1/post/lists/members/destroy_all + + """ + return self.post('lists/members/destroy_all', params=params) + + def show_owned_lists(self, **params): + """Returns the lists owned by the specified Twitter user. + + Docs: https://dev.twitter.com/docs/api/1.1/get/lists/ownerships + + """ + return self.get('lists/ownerships', params=params) + show_owned_lists.iter_mode = 'cursor' + show_owned_lists.iter_key = 'lists' + + # Saved Searches + def get_saved_searches(self, **params): + """Returns the authenticated user's saved search queries. + + Docs: https://dev.twitter.com/docs/api/1.1/get/saved_searches/list + + """ + return self.get('saved_searches/list', params=params) + + def show_saved_search(self, **params): + """Retrieve the information for the saved search represented by the given id. + + Docs: https://dev.twitter.com/docs/api/1.1/get/saved_searches/show/%3Aid + + """ + return self.get('saved_searches/show/%s' % params.get('id'), params=params) + + def create_saved_search(self, **params): + """Create a new saved search for the authenticated user. + + Docs: https://dev.twitter.com/docs/api/1.1/post/saved_searches/create + + """ + return self.post('saved_searches/create', params=params) + + def destroy_saved_search(self, **params): + """Destroys a saved search for the authenticating user. + + Docs: https://dev.twitter.com/docs/api/1.1/post/saved_searches/destroy/%3Aid + + """ + return self.post('saved_searches/destroy/%s' % params.get('id'), params=params) + + # Places & Geo + def get_geo_info(self, **params): + """Returns all the information about a known place. + + Docs: https://dev.twitter.com/docs/api/1.1/get/geo/id/%3Aplace_id + + """ + return self.get('geo/id/%s' % params.get('place_id'), params=params) + + def reverse_geocode(self, **params): + """Given a latitude and a longitude, searches for up to 20 places + that can be used as a place_id when updating a status. + + Docs: https://dev.twitter.com/docs/api/1.1/get/geo/reverse_geocode + + """ + return self.get('geo/reverse_geocode', params=params) + + def search_geo(self, **params): + """Search for places that can be attached to a statuses/update. + + Docs: https://dev.twitter.com/docs/api/1.1/get/geo/search + + """ + return self.get('geo/search', params=params) + + def get_similar_places(self, **params): + """Locates places near the given coordinates which are similar in name. + + Docs: https://dev.twitter.com/docs/api/1.1/get/geo/similar_places + + """ + return self.get('geo/similar_places', params=params) + + def create_place(self, **params): # pragma: no cover + """Creates a new place object at the given latitude and longitude. + + Docs: https://dev.twitter.com/docs/api/1.1/post/geo/place + + """ + return self.post('geo/place', params=params) + + # Trends + def get_place_trends(self, **params): + """Returns the top 10 trending topics for a specific WOEID, if + trending information is available for it. + + Docs: https://dev.twitter.com/docs/api/1.1/get/trends/place + + """ + return self.get('trends/place', params=params) + + def get_available_trends(self, **params): + """Returns the locations that Twitter has trending topic information for. + + Docs: https://dev.twitter.com/docs/api/1.1/get/trends/available + + """ + return self.get('trends/available', params=params) + + def get_closest_trends(self, **params): + """Returns the locations that Twitter has trending topic information + for, closest to a specified location. + + Docs: https://dev.twitter.com/docs/api/1.1/get/trends/closest + + """ + return self.get('trends/closest', params=params) + + # Spam Reporting + def report_spam(self, **params): # pragma: no cover + """Report the specified user as a spam account to Twitter. + + Docs: https://dev.twitter.com/docs/api/1.1/post/users/report_spam + + """ + return self.post('users/report_spam', params=params) + + # OAuth + def invalidate_token(self, **params): # pragma: no cover + """Allows a registered application to revoke an issued OAuth 2 Bearer + Token by presenting its client credentials. + + Docs: https://dev.twitter.com/docs/api/1.1/post/oauth2/invalidate_token + + """ + return self.post('oauth2/invalidate_token', params=params) + + # Help + def get_twitter_configuration(self, **params): + """Returns the current configuration used by Twitter + + Docs: https://dev.twitter.com/docs/api/1.1/get/help/configuration + + """ + return self.get('help/configuration', params=params) + + def get_supported_languages(self, **params): + """Returns the list of languages supported by Twitter along with + their ISO 639-1 code. + + Docs: https://dev.twitter.com/docs/api/1.1/get/help/languages + + """ + return self.get('help/languages', params=params) + + def get_privacy_policy(self, **params): + """Returns Twitter's Privacy Policy + + Docs: https://dev.twitter.com/docs/api/1.1/get/help/privacy + + """ + return self.get('help/privacy', params=params) + + def get_tos(self, **params): + """Return the Twitter Terms of Service + + Docs: https://dev.twitter.com/docs/api/1.1/get/help/tos + + """ + return self.get('help/tos', params=params) + + def get_application_rate_limit_status(self, **params): + """Returns the current rate limits for methods belonging to the + specified resource families. + + Docs: https://dev.twitter.com/docs/api/1.1/get/application/rate_limit_status + + """ + return self.get('application/rate_limit_status', params=params) + + +# from https://dev.twitter.com/docs/error-codes-responses +TWITTER_HTTP_STATUS_CODE = { + 200: ('OK', 'Success!'), + 304: ('Not Modified', 'There was no new data to return.'), + 400: ('Bad Request', 'The request was invalid. An accompanying error message will explain why. This is the status code will be returned during rate limiting.'), + 401: ('Unauthorized', 'Authentication credentials were missing or incorrect.'), + 403: ('Forbidden', 'The request is understood, but it has been refused. An accompanying error message will explain why. This code is used when requests are being denied due to update limits.'), + 404: ('Not Found', 'The URI requested is invalid or the resource requested, such as a user, does not exists.'), + 406: ('Not Acceptable', 'Returned by the Search API when an invalid format is specified in the request.'), + 410: ('Gone', 'This resource is gone. Used to indicate that an API endpoint has been turned off.'), + 422: ('Unprocessable Entity', 'Returned when an image uploaded to POST account/update_profile_banner is unable to be processed.'), + 429: ('Too Many Requests', 'Returned in API v1.1 when a request cannot be served due to the application\'s rate limit having been exhausted for the resource.'), + 500: ('Internal Server Error', 'Something is broken. Please post to the group so the Twitter team can investigate.'), + 502: ('Bad Gateway', 'Twitter is down or being upgraded.'), + 503: ('Service Unavailable', 'The Twitter servers are up, but overloaded with requests. Try again later.'), + 504: ('Gateway Timeout', 'The Twitter servers are up, but the request couldn\'t be serviced due to some failure within our stack. Try again later.'), +} diff --git a/src/twython/exceptions.py b/src/twython/exceptions.py new file mode 100644 index 00000000..4aa7dbab --- /dev/null +++ b/src/twython/exceptions.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- + +""" +twython.exceptions +~~~~~~~~~~~~~~~~~~ + +This module contains Twython specific Exception classes. +""" + +from .endpoints import TWITTER_HTTP_STATUS_CODE + + +class TwythonError(Exception): + """Generic error class, catch-all for most Twython issues. + Special cases are handled by TwythonAuthError & TwythonRateLimitError. + + from twython import TwythonError, TwythonRateLimitError, TwythonAuthError + + """ + def __init__(self, msg, error_code=None, retry_after=None): + self.error_code = error_code + + if error_code is not None and error_code in TWITTER_HTTP_STATUS_CODE: + msg = 'Twitter API returned a %s (%s), %s' % \ + (error_code, + TWITTER_HTTP_STATUS_CODE[error_code][0], + msg) + + super(TwythonError, self).__init__(msg) + + @property + def msg(self): # pragma: no cover + return self.args[0] + + +class TwythonAuthError(TwythonError): + """Raised when you try to access a protected resource and it fails due to + some issue with your authentication. + + """ + pass + + +class TwythonRateLimitError(TwythonError): # pragma: no cover + """Raised when you've hit a rate limit. + + The amount of seconds to retry your request in will be appended + to the message. + + """ + def __init__(self, msg, error_code, retry_after=None): + if isinstance(retry_after, int): + msg = '%s (Retry after %d seconds)' % (msg, retry_after) + TwythonError.__init__(self, msg, error_code=error_code) + + self.retry_after = retry_after + + +class TwythonStreamError(TwythonError): + """Raised when an invalid response from the Stream API is received""" + pass diff --git a/src/twython/helpers.py b/src/twython/helpers.py new file mode 100644 index 00000000..f44d0ce7 --- /dev/null +++ b/src/twython/helpers.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +""" +twython.helpers +~~~~~~~~~~~~~~~ + +This module contains functions that are repeatedly used throughout +the Twython library. +""" + +from .compat import basestring, numeric_types + + +def _transparent_params(_params): + params = {} + files = {} + for k, v in _params.items(): + if hasattr(v, 'read') and callable(v.read): + files[k] = v # pragma: no cover + elif isinstance(v, bool): + if v: + params[k] = 'true' + else: + params[k] = 'false' + elif isinstance(v, basestring) or isinstance(v, numeric_types): + params[k] = v + elif isinstance(v, list): + try: + params[k] = ','.join(v) + except TypeError: + params[k] = ','.join(map(str, v)) + else: + continue # pragma: no cover + return params, files diff --git a/src/twython/streaming/__init__.py b/src/twython/streaming/__init__.py new file mode 100644 index 00000000..b12e8d16 --- /dev/null +++ b/src/twython/streaming/__init__.py @@ -0,0 +1 @@ +from .api import TwythonStreamer diff --git a/src/twython/streaming/api.py b/src/twython/streaming/api.py new file mode 100644 index 00000000..47678e47 --- /dev/null +++ b/src/twython/streaming/api.py @@ -0,0 +1,201 @@ +# -*- coding: utf-8 -*- + +""" +twython.streaming.api +~~~~~~~~~~~~~~~~~~~~~ + +This module contains functionality for interfacing with streaming +Twitter API calls. +""" + +from .. import __version__ +from ..compat import json, is_py3 +from ..helpers import _transparent_params +from .types import TwythonStreamerTypes + +import requests +from requests_oauthlib import OAuth1 + +import time + + +class TwythonStreamer(object): + def __init__(self, app_key, app_secret, oauth_token, oauth_token_secret, + timeout=300, retry_count=None, retry_in=10, client_args=None, + handlers=None, chunk_size=1): + """Streaming class for a friendly streaming user experience + Authentication IS required to use the Twitter Streaming API + + :param app_key: (required) Your applications key + :param app_secret: (required) Your applications secret key + :param oauth_token: (required) Used with oauth_token_secret to make + authenticated calls + :param oauth_token_secret: (required) Used with oauth_token to make + authenticated calls + :param timeout: (optional) How long (in secs) the streamer should wait + for a response from Twitter Streaming API + :param retry_count: (optional) Number of times the API call should be + retired + :param retry_in: (optional) Amount of time (in secs) the previous + API call should be tried again + :param client_args: (optional) Accepts some requests Session + parameters and some requests Request parameters. + See + http://docs.python-requests.org/en/latest/api/#sessionapi + and requests section below it for details. + [ex. headers, proxies, verify(SSL verification)] + :param handlers: (optional) Array of message types for which + corresponding handlers will be called + + :param chunk_size: (optional) Define the buffer size before data is + actually returned from the Streaming API. Default: 1 + """ + + self.auth = OAuth1(app_key, app_secret, + oauth_token, oauth_token_secret) + + self.client_args = client_args or {} + default_headers = {'User-Agent': 'Twython Streaming v' + __version__} + if 'headers' not in self.client_args: + # If they didn't set any headers, set our defaults for them + self.client_args['headers'] = default_headers + elif 'User-Agent' not in self.client_args['headers']: + # If they set headers, but didn't include User-Agent.. + # set it for them + self.client_args['headers'].update(default_headers) + self.client_args['timeout'] = timeout + + self.client = requests.Session() + self.client.auth = self.auth + self.client.stream = True + + # Make a copy of the client args and iterate over them + # Pop out all the acceptable args at this point because they will + # Never be used again. + client_args_copy = self.client_args.copy() + for k, v in client_args_copy.items(): + if k in ('cert', 'headers', 'hooks', 'max_redirects', 'proxies'): + setattr(self.client, k, v) + self.client_args.pop(k) # Pop, pop! + + self.api_version = '1.1' + + self.retry_in = retry_in + self.retry_count = retry_count + + # Set up type methods + StreamTypes = TwythonStreamerTypes(self) + self.statuses = StreamTypes.statuses + self.user = StreamTypes.user + self.site = StreamTypes.site + + self.connected = False + + self.handlers = handlers if handlers else \ + ['delete', 'limit', 'disconnect'] + + self.chunk_size = chunk_size + + def _request(self, url, method='GET', params=None): + """Internal stream request handling""" + self.connected = True + retry_counter = 0 + + method = method.lower() + func = getattr(self.client, method) + params, _ = _transparent_params(params) + + def _send(retry_counter): + requests_args = {} + for k, v in self.client_args.items(): + # Maybe this should be set as a class + # variable and only done once? + if k in ('timeout', 'allow_redirects', 'verify'): + requests_args[k] = v + + while self.connected: + try: + if method == 'get': + requests_args['params'] = params + else: + requests_args['data'] = params + + response = func(url, **requests_args) + except requests.exceptions.Timeout: + self.on_timeout() + else: + if response.status_code != 200: + self.on_error(response.status_code, response.content) + + if self.retry_count and \ + (self.retry_count - retry_counter) > 0: + time.sleep(self.retry_in) + retry_counter += 1 + _send(retry_counter) + + return response + + while self.connected: + response = _send(retry_counter) + + for line in response.iter_lines(self.chunk_size): + if not self.connected: + break + if line: + try: + if is_py3: + line = line.decode('utf-8') + data = json.loads(line) + except ValueError: # pragma: no cover + self.on_error(response.status_code, + 'Unable to decode response, \ + not valid JSON.') + else: + if self.on_success(data): # pragma: no cover + for message_type in self.handlers: + if message_type in data: + handler = getattr(self, + 'on_' + message_type, + None) + if handler \ + and callable(handler) \ + and not handler(data.get(message_type)): + break + + response.close() + + def on_success(self, data): # pragma: no cover + """Called when data has been successfully received from the stream. + Returns True if other handlers for this message should be invoked. + + Feel free to override this to handle your streaming data how you + want it handled. + See https://dev.twitter.com/docs/streaming-apis/messages for messages + sent along in stream responses. + + :param data: data recieved from the stream + :type data: dict + """ + return True + + def on_error(self, status_code, data): # pragma: no cover + """Called when stream returns non-200 status code + + Feel free to override this to handle your streaming data how you + want it handled. + + :param status_code: Non-200 status code sent from stream + :type status_code: int + + :param data: Error message sent from stream + :type data: dict + """ + return + + def on_timeout(self): # pragma: no cover + """ Called when the request has timed out """ + return + + def disconnect(self): + """Used to disconnect the streaming client manually""" + self.connected = False diff --git a/src/twython/streaming/types.py b/src/twython/streaming/types.py new file mode 100644 index 00000000..39a9ccbf --- /dev/null +++ b/src/twython/streaming/types.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- + +""" +twython.streaming.types +~~~~~~~~~~~~~~~~~~~~~~~ + +This module contains classes and methods for :class:`TwythonStreamer` to use. +""" + + +class TwythonStreamerTypes(object): + """Class for different stream endpoints + + Not all streaming endpoints have nested endpoints. + User Streams and Site Streams are single streams with no nested endpoints + Status Streams include filter, sample and firehose endpoints + + """ + def __init__(self, streamer): + self.streamer = streamer + self.statuses = TwythonStreamerTypesStatuses(streamer) + + def user(self, **params): + """Stream user + + Accepted params found at: + https://dev.twitter.com/docs/api/1.1/get/user + """ + url = 'https://userstream.twitter.com/%s/user.json' \ + % self.streamer.api_version + self.streamer._request(url, params=params) + + def site(self, **params): + """Stream site + + Accepted params found at: + https://dev.twitter.com/docs/api/1.1/get/site + """ + url = 'https://sitestream.twitter.com/%s/site.json' \ + % self.streamer.api_version + self.streamer._request(url, params=params) + + +class TwythonStreamerTypesStatuses(object): + """Class for different statuses endpoints + + Available so TwythonStreamer.statuses.filter() is available. + Just a bit cleaner than TwythonStreamer.statuses_filter(), + statuses_sample(), etc. all being single methods in TwythonStreamer + + """ + def __init__(self, streamer): + self.streamer = streamer + + def filter(self, **params): + """Stream statuses/filter + + :param \*\*params: Parameters to send with your stream request + + Accepted params found at: + https://dev.twitter.com/docs/api/1.1/post/statuses/filter + """ + url = 'https://stream.twitter.com/%s/statuses/filter.json' \ + % self.streamer.api_version + self.streamer._request(url, 'POST', params=params) + + def sample(self, **params): + """Stream statuses/sample + + :param \*\*params: Parameters to send with your stream request + + Accepted params found at: + https://dev.twitter.com/docs/api/1.1/get/statuses/sample + """ + url = 'https://stream.twitter.com/%s/statuses/sample.json' \ + % self.streamer.api_version + self.streamer._request(url, params=params) + + def firehose(self, **params): + """Stream statuses/firehose + + :param \*\*params: Parameters to send with your stream request + + Accepted params found at: + https://dev.twitter.com/docs/api/1.1/get/statuses/firehose + """ + url = 'https://stream.twitter.com/%s/statuses/firehose.json' \ + % self.streamer.api_version + self.streamer._request(url, params=params) diff --git a/src/updater/__init__.py b/src/updater/__init__.py new file mode 100644 index 00000000..49b1cd04 --- /dev/null +++ b/src/updater/__init__.py @@ -0,0 +1,2 @@ +import updater +import update_manager \ No newline at end of file diff --git a/src/updater/update_manager.py b/src/updater/update_manager.py new file mode 100644 index 00000000..5a99e63b --- /dev/null +++ b/src/updater/update_manager.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +import os, sys, wx +from mysc import paths +import application, updater +from mysc.thread_utils import call_threaded +import logging as original_logger +log = original_logger.getLogger("update_manager") + +def check_for_update(msg=False): + log.debug(u"Checking for updates...") + url = updater.find_update_url(application.update_url, application.version) + if url is None: + if msg == True: + wx.MessageDialog(None, _(u"Your TW Blue version is up to date"), _(u"Update"), style=wx.OK).ShowModal() + return + else: + log.debug(u"New version from %s " % url) + new_path = os.path.join(paths.app_path("delete-me"), 'updates', 'update.zip') + log.debug(u"Descargando actualización en %s" % new_path) + d = wx.MessageDialog(None, _(u"There's a new TW Blue version available. Would you like to download it now?"), _(u"New version for %s") % application.name, style=wx.YES|wx.NO|wx.ICON_WARNING) + if d.ShowModal() == wx.ID_YES: + progress = wx.ProgressDialog(_(u"Download in Progress"), _(u"Downloading the new version..."), parent=None, maximum=100, style = wx.PD_APP_MODAL) + def update(percent): + if percent == 100: + progress.Destroy() + else: + progress.Update(percent, _(u"Update")) + def update_complete(): + wx.MessageDialog(None, _(u"The new TW Blue version has been downloaded and installed. Press OK to start the application."), _(u"Done!")).ShowModal() + sys.exit() + app_updater = updater.AutoUpdater(url, new_path, 'bootstrap.exe', app_path=paths.app_path(), postexecute=paths.app_path("TWBlue.exe"), finish_callback=update_complete, percentage_callback=update) + app_updater.start_update() + progress.ShowModal() + else: + return + diff --git a/src/updater/updater.py b/src/updater/updater.py new file mode 100644 index 00000000..f52b70da --- /dev/null +++ b/src/updater/updater.py @@ -0,0 +1,220 @@ +#AutoUpdater +#Released under an MIT license + +import logging +logger = logging.getLogger('updater') + +import application +from urllib import FancyURLopener, URLopener +import urllib2 +from functools import total_ordering +import hashlib +import os +try: + from czipfile import ZipFile +except ImportError: + from zipfile import ZipFile +import subprocess +import stat +import platform +import shutil +import json +if platform.system() == 'Windows': + import win32api + + +class AutoUpdater(object): + + def __init__(self, URL, save_location, bootstrapper, app_path, postexecute=None, password=None, MD5=None, percentage_callback=None, finish_callback=None): + """Supply a URL/location/bootstrapper filename to download a zip file from + The finish_callback argument should be a Python function it'll call when done""" + #Let's download the file using urllib + self.complete = 0 + self.finish_callback = finish_callback #What to do on exit + self.percentage_callback = percentage_callback or self.print_percentage_callback + self.URL = URL + self.bootstrapper = bootstrapper + #The application path on the Mac should be 1 directory up from where the .app file is. + tempstr = "" + if (platform.system() == "Darwin"): + for x in (app_path.split("/")): + if (".app" in x): + break + else: + tempstr = os.path.join(tempstr, x) + app_path = "/" + tempstr + "/" + #The post-execution path should include the .app file + tempstr = "" + for x in (postexecute.split("/")): + if (".app" in x): + tempstr = os.path.join(tempstr, x) + break + else: + tempstr = os.path.join(tempstr, x) + postexecute = "/" + tempstr + self.app_path = app_path + self.postexecute = postexecute + logging.info("apppath: " + str(app_path)) + logging.info("postexecute: " + str(postexecute)) + self.password = password + self.MD5 = MD5 + self.save_location = save_location + #self.save_location contains the full path, including the blabla.zip + self.save_directory = os.path.join(*os.path.split(save_location)[:-1]) + #self.save_directory doesn't contain the blabla.zip + + def prepare_staging_directory(self): + if not os.path.exists(self.save_directory): + #We need to make all folders but the last one + os.makedirs(self.save_directory) + logger.info("Created staging directory %s" % self.save_directory) + + def transfer_callback(self, count, bSize, tSize): + """Callback to update percentage of download""" + percent = int(count*bSize*100/tSize) + self.percentage_callback(percent) + + @staticmethod + def print_percentage_callback(percent): + print percent + + def start_update(self): + """Called to start the whole process""" + logger.debug("URL: %s SL: %s" % (self.URL, self.save_location)) + self.prepare_staging_directory() + Listy = CustomURLOpener().retrieve(self.URL, self.save_location, reporthook=self.transfer_callback) + if self.MD5: + #Check the MD5 + if self.MD5File(location) != self.MD5: + #ReDownload + self.start_update() + self.download_complete(Listy[0]) + + def MD5File(self, fileName): + "Custom function that will get the Md5 sum of our file" + file_reference=open(fileName, 'rb').read() + return hashlib.md5(file_reference).hexdigest() + + def download_complete(self, location): + """Called when the file is done downloading, and MD5 has been successfull""" + logger.debug("Download complete.") + zippy = ZipFile(location, mode='r') + extracted_path = os.path.join(self.save_directory, os.path.basename(location).strip(".zip")) + zippy.extractall(extracted_path, pwd=self.password) + bootstrapper_path = os.path.join(self.save_directory, self.bootstrapper) #where we will find our bootstrapper + old_bootstrapper_path = os.path.join(extracted_path, self.bootstrapper) + if os.path.exists(bootstrapper_path): + os.chmod(bootstrapper_path, 666) + os.remove(bootstrapper_path) + shutil.move(old_bootstrapper_path, self.save_directory) #move bootstrapper + os.chmod(bootstrapper_path, stat.S_IRUSR|stat.S_IXUSR) + if platform.system() == "Windows": + bootstrapper_command = r'%s' % bootstrapper_path + bootstrapper_args = r'"%s" "%s" "%s" "%s"' % (os.getpid(), extracted_path, self.app_path, self.postexecute) + win32api.ShellExecute(0, 'open', bootstrapper_command, bootstrapper_args, "", 5) + else: + #bootstrapper_command = [r'sh "%s" -l "%s" -d "%s" "%s"' % (bootstrapper_path, self.app_path, extracted_path, str(os.getpid()))] + bootstrapper_command = r'"%s" "%s" "%s" "%s" "%s"' % (bootstrapper_path, os.getpid(), extracted_path, self.app_path, self.postexecute) + shell = True + #logging.debug("Final bootstrapper command: %r" % bootstrapper_command) + subprocess.Popen([bootstrapper_command], shell=shell) + self.complete = 1 + if callable(self.finish_callback): + self.finish_callback() + + def cleanup(self): + """Delete stuff""" + try: + shutil.rmtree(self.save_directory) + except any: + return + +def find_update_url(URL, version): + """Return a URL to an update of the application for the current platform at the given URL if one exists, or None"" + Assumes Windows, Linux, or Mac""" + response = urllib2.urlopen(URL) + json_str = response.read().strip("\n") + json_p = json.loads(json_str) + if is_newer(version, json_p['current_version']): + if application.snapshot == False: return json_p['downloads'][platform.system()+platform.architecture()[0][:2]] + else: return json_p['downloads'][platform.system()] + + +def is_newer(local_version, remote_version): + """Returns True if the remote version is newer than the local version.""" + return Version(remote_version) > local_version + + + +@total_ordering +class Version(object): + VERSION_QUALIFIERS = { + 'alpha': 1, + 'beta': 2, + 'rc': 3 + } + + def __init__(self, version): + self.version = version + self.version_qualifier = None + self.version_qualifier_num = None + self.sub_version = None + if isinstance(version, basestring): + version = version.lower() + if '-' not in version: + for q in self.VERSION_QUALIFIERS: + if q in version: + self.version_qualifier = q + self.version_qualifier_num = self.VERSION_QUALIFIERS[q] + split_version = version.split(q) + self.version_number = float(split_version[0]) + if len(split_version) > 1: + self.sub_version = split_version[1] + return + self.version_number= float(version) + return + split_version = version.split('-') + self.version_number= float(split_version[0]) + self.version_qualifier = split_version [1] + self.version_qualifier_num = self.VERSION_QUALIFIERS[self.version_qualifier] + if len(split_version) == 3: + self.sub_version = int(split_version[2]) + else: + self.version_number= float(version) + + def __lt__(self, other): + if not isinstance(other, self.__class__): + other = Version(other) + if other.version_qualifier == self.version_qualifier == None: + return self.version_number< other.version_number + if self.version_number < other.version_number: + return True + elif self.version_number > other.version_number: + return False + if other.version_number == self.version_number and not other.version_qualifier_num and self.version_qualifier_num: + return True + if other.version_number == self.version_number and self.version_qualifier_num == self.version_qualifier_num and self.sub_version < other.sub_version: + return True + return self.version_qualifier_num < other.version_qualifier_num + + def __gt__(self, other): + if not isinstance(other, self.__class__): + other = Version(other) + if other.version_qualifier == self.version_qualifier == None: + return self.version_number > other.version_number + if self.version_number < other.version_number: + return False + elif self.version_number > other.version_number: + return True + if other.version_number == self.version_number and not other.version_qualifier_num and self.version_qualifier_num: + return False + if other.version_number == self.version_number and self.version_qualifier_num == self.version_qualifier_num and self.sub_version > other.sub_version: + return True + return self.version_qualifier_num > other.version_qualifier_num + + + + +class CustomURLOpener(FancyURLopener): + def http_error_default(*a, **k): + return URLopener.http_error_default(*a, **k) diff --git a/src/url_shortener/__init__.py b/src/url_shortener/__init__.py new file mode 100644 index 00000000..d1819cbc --- /dev/null +++ b/src/url_shortener/__init__.py @@ -0,0 +1,2 @@ +import shorteners +from __main__ import * diff --git a/src/url_shortener/__main__.py b/src/url_shortener/__main__.py new file mode 100644 index 00000000..56080ce7 --- /dev/null +++ b/src/url_shortener/__main__.py @@ -0,0 +1,45 @@ +from functools import wraps +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.TinyurlShortener + +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 new file mode 100644 index 00000000..53dce662 --- /dev/null +++ b/src/url_shortener/shorteners/__init__.py @@ -0,0 +1,9 @@ +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 +__all__ = ["HKCShortener", "IsgdShortener", "OnjmeShortener", "TinyArrowsShortener", "TinyurlShortener", "XedccShortener", "ClckruShortener"] diff --git a/src/url_shortener/shorteners/clckru.py b/src/url_shortener/shorteners/clckru.py new file mode 100644 index 00000000..f72f9281 --- /dev/null +++ b/src/url_shortener/shorteners/clckru.py @@ -0,0 +1,20 @@ +import urllib + +from url_shortener import URLShortener + + +class ClckruShortener (URLShortener): + def __init__ (self, *args, **kwargs): + self.name = "clck.ru" + return super(ClckruShortener, self).__init__(*args, **kwargs) + + def _shorten (self, url): + answer = url + api = urllib.urlopen ("http://clck.ru/--?url=" + urllib.quote(url)) + if api.getcode() == 200: + answer = api.read() + api.close() + 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 new file mode 100644 index 00000000..3a47e16f --- /dev/null +++ b/src/url_shortener/shorteners/hkcim.py @@ -0,0 +1,19 @@ +import urllib + +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 = urllib.urlopen ("http://hkc.im/yourls-api.php?action=shorturl&format=simple&url=" + urllib.quote(url)) + if api.getcode() == 200: + answer = api.read() + api.close() + 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 new file mode 100644 index 00000000..d2d25b33 --- /dev/null +++ b/src/url_shortener/shorteners/isgd.py @@ -0,0 +1,20 @@ +import urllib + +from url_shortener import URLShortener + + +class IsgdShortener (URLShortener): + def __init__ (self, *args, **kwargs): + self.name = "Is.gd" + return super(IsgdShortener, self).__init__(*args, **kwargs) + + def _shorten (self, url): + answer = url + api = urllib.urlopen ("http://is.gd/api.php?longurl=" + urllib.quote(url)) + if api.getcode() == 200: + answer = api.read() + api.close() + 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 new file mode 100644 index 00000000..0b0fd5a2 --- /dev/null +++ b/src/url_shortener/shorteners/onjme.py @@ -0,0 +1,19 @@ +import urllib + +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 = urllib.urlopen ("http://onj.me/yourls-api.php?action=shorturl&format=simple&url=" + urllib.quote(url)) + if api.getcode() == 200: + answer = api.read() + api.close() + 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 new file mode 100644 index 00000000..d9392fb7 --- /dev/null +++ b/src/url_shortener/shorteners/tinyarrows.py @@ -0,0 +1,16 @@ +import urllib + +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 + answer = urllib.urlopen("http://tinyarro.ws/api-create.php?utfpure=1&url=%s" % urllib.quote(url)).read() + return answer.decode('UTF-8') + + def created_url(self, url): + return False diff --git a/src/url_shortener/shorteners/tinyurl.py b/src/url_shortener/shorteners/tinyurl.py new file mode 100644 index 00000000..6f1b316e --- /dev/null +++ b/src/url_shortener/shorteners/tinyurl.py @@ -0,0 +1,18 @@ +from url_shortener import URLShortener +import urllib +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 = urllib.urlopen ("http://tinyurl.com/api-create.php?url=" + urllib.quote(url)) + if api.getcode() == 200: + answer = api.read() + api.close() + 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 new file mode 100644 index 00000000..e0b25561 --- /dev/null +++ b/src/url_shortener/shorteners/url_shortener.py @@ -0,0 +1,33 @@ +from httplib import HTTPConnection +from urlparse import urlparse + + +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): + working = urlparse(url) + if not working.netloc: + raise TypeError, "Unable to parse URL." + con = HTTPConnection(working.netloc) + con.connect() + con.request('GET', working.path) + resp = con.getresponse() + con.close() + return resp.getheader('location') diff --git a/src/url_shortener/shorteners/xedcc.py b/src/url_shortener/shorteners/xedcc.py new file mode 100644 index 00000000..8d466306 --- /dev/null +++ b/src/url_shortener/shorteners/xedcc.py @@ -0,0 +1,19 @@ +import urllib + +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 = urllib.urlopen ("http://xed.cc/yourls-api.php?action=shorturl&format=simple&url=" + urllib.quote(url)) + if api.getcode() == 200: + answer = api.read() + api.close() + return answer + + def created_url (self, url): + return 'xed.cc' in url.lower() diff --git a/tools/clean.py b/tools/clean.py new file mode 100644 index 00000000..2f04b8c9 --- /dev/null +++ b/tools/clean.py @@ -0,0 +1,41 @@ +import sys, os, os.path, glob, argparse + +parser = argparse.ArgumentParser(add_help=False) +parser.add_argument('-v', '--verbose', action='store_true', default=False, dest='verbose') +verbose = parser.parse_args().verbose + +srcpath = os.path.normpath(os.path.join(sys.path[0], "../src")) +file_count = 0 +dir_count = 0 +filenames = [] +for (path, subdirs, files) in os.walk(srcpath): + filenames.extend(glob.glob(os.path.join(path, "*.pyc"))) +# filenames.extend(glob.glob(os.path.join(path, "*.py"))) +for filename in filenames: + try: + os.remove(filename) + if verbose: print "Removed " + filename + file_count += 1 + except: + if verbose: print "Can't remove " + filename + +#Remove empty directories. +if verbose: print "Removing empty directories..." +run_again = True +while run_again: + run_again = False + removals = [] + for (path, subdirs, files) in os.walk(srcpath, topdown=False): + if len(subdirs) == 0 and len(files) == 0: + removals.append(path) + for path in removals: + try: + os.rmdir(path) + run_again = True + if verbose: print "Removed directory " + path + dir_count += 1 + except: + if verbose: print "Can't remove directory " + path + +print +print "{0} file(s), {1} dir(s) removed.".format(file_count, dir_count) diff --git a/tools/gen_doc.sh b/tools/gen_doc.sh new file mode 100644 index 00000000..ff4d3c64 --- /dev/null +++ b/tools/gen_doc.sh @@ -0,0 +1,13 @@ +#!/bin/bash +mkdir ../src/documentation +for i in `ls ../documentation` +do + if test -d ../documentation/$i +then + mkdir ../src/documentation/$i + pandoc -s ../documentation/$i/changes.md -o ../src/documentation/$i/changes.html + pandoc -s ../documentation/$i/manual.md -o ../src/documentation/$i/manual.html + cp ../documentation/license.txt ../src/documentation/license.txt + fi +done +exit diff --git a/tools/genpot.bat b/tools/genpot.bat new file mode 100644 index 00000000..ff443367 --- /dev/null +++ b/tools/genpot.bat @@ -0,0 +1,4 @@ +@echo off +echo Generating application translation strings... +C:\python27\python.exe pygettext.py -v -d twblue ../src/*.pyw ../src/*.py ../src/*/*.py ../src/*/*.pyw ../src/*/*/*.py ../src/*/*/*.pyw ../src/*/*/*/*.py ../src/*/*/*/*.pyw ../src/*/*/*/*/*.py ../src/*/*/*/*/*.pyw +C:\python27\python.exe pygettext.py -v -d twblue-documentation ../src/*.pyw ../src/*.py ../gendoc/*/*.py ../src/*/*.pyw ../src/*/*/*.py ../src/*/*/*.pyw ../src/*/*/*/*.py ../src/*/*/*/*.pyw ../src/*/*/*/*/*.py ../src/*/*/*/*/*.pyw diff --git a/tools/pygettext.py b/tools/pygettext.py new file mode 100644 index 00000000..bb0dd35d --- /dev/null +++ b/tools/pygettext.py @@ -0,0 +1,669 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# Originally written by Barry Warsaw +# +# Minimally patched to make it even more xgettext compatible +# by Peter Funk +# +# 2002-11-22 Jrgen Hermann +# Added checks that _() only contains string literals, and +# command line args are resolved to module lists, i.e. you +# can now pass a filename, a module or package name, or a +# directory (including globbing chars, important for Win32). +# Made docstring fit in 80 chars wide displays using pydoc. +# + +# for selftesting +try: + import fintl + _ = fintl.gettext +except ImportError: + _ = lambda s: s + +__doc__ = _("""pygettext -- Python equivalent of xgettext(1) + +Many systems (Solaris, Linux, Gnu) provide extensive tools that ease the +internationalization of C programs. Most of these tools are independent of +the programming language and can be used from within Python programs. +Martin von Loewis' work[1] helps considerably in this regard. + +There's one problem though; xgettext is the program that scans source code +looking for message strings, but it groks only C (or C++). Python +introduces a few wrinkles, such as dual quoting characters, triple quoted +strings, and raw strings. xgettext understands none of this. + +Enter pygettext, which uses Python's standard tokenize module to scan +Python source code, generating .pot files identical to what GNU xgettext[2] +generates for C and C++ code. From there, the standard GNU tools can be +used. + +A word about marking Python strings as candidates for translation. GNU +xgettext recognizes the following keywords: gettext, dgettext, dcgettext, +and gettext_noop. But those can be a lot of text to include all over your +code. C and C++ have a trick: they use the C preprocessor. Most +internationalized C source includes a #define for gettext() to _() so that +what has to be written in the source is much less. Thus these are both +translatable strings: + + gettext("Translatable String") + _("Translatable String") + +Python of course has no preprocessor so this doesn't work so well. Thus, +pygettext searches only for _() by default, but see the -k/--keyword flag +below for how to augment this. + + [1] http://www.python.org/workshops/1997-10/proceedings/loewis.html + [2] http://www.gnu.org/software/gettext/gettext.html + +NOTE: pygettext attempts to be option and feature compatible with GNU +xgettext where ever possible. However some options are still missing or are +not fully implemented. Also, xgettext's use of command line switches with +option arguments is broken, and in these cases, pygettext just defines +additional switches. + +Usage: pygettext [options] inputfile ... + +Options: + + -a + --extract-all + Extract all strings. + + -d name + --default-domain=name + Rename the default output file from messages.pot to name.pot. + + -E + --escape + Replace non-ASCII characters with octal escape sequences. + + -D + --docstrings + Extract module, class, method, and function docstrings. These do + not need to be wrapped in _() markers, and in fact cannot be for + Python to consider them docstrings. (See also the -X option). + + -h + --help + Print this help message and exit. + + -k word + --keyword=word + Keywords to look for in addition to the default set, which are: + %(DEFAULTKEYWORDS)s + + You can have multiple -k flags on the command line. + + -K + --no-default-keywords + Disable the default set of keywords (see above). Any keywords + explicitly added with the -k/--keyword option are still recognized. + + --no-location + Do not write filename/lineno location comments. + + -n + --add-location + Write filename/lineno location comments indicating where each + extracted string is found in the source. These lines appear before + each msgid. The style of comments is controlled by the -S/--style + option. This is the default. + + -o filename + --output=filename + Rename the default output file from messages.pot to filename. If + filename is `-' then the output is sent to standard out. + + -p dir + --output-dir=dir + Output files will be placed in directory dir. + + -S stylename + --style stylename + Specify which style to use for location comments. Two styles are + supported: + + Solaris # File: filename, line: line-number + GNU #: filename:line + + The style name is case insensitive. GNU style is the default. + + -v + --verbose + Print the names of the files being processed. + + -V + --version + Print the version of pygettext and exit. + + -w columns + --width=columns + Set width of output to columns. + + -x filename + --exclude-file=filename + Specify a file that contains a list of strings that are not be + extracted from the input files. Each string to be excluded must + appear on a line by itself in the file. + + -X filename + --no-docstrings=filename + Specify a file that contains a list of files (one per line) that + should not have their docstrings extracted. This is only useful in + conjunction with the -D option above. + +If `inputfile' is -, standard input is read. +""") + +import os +import imp +import sys +import glob +import time +import getopt +import token +import tokenize +import operator + +__version__ = '1.5' + +default_keywords = ['_'] +DEFAULTKEYWORDS = ', '.join(default_keywords) + +EMPTYSTRING = '' + + + +# The normal pot-file header. msgmerge and Emacs's po-mode work better if it's +# there. +pot_header = _('''\ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\\n" +"POT-Creation-Date: %(time)s\\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n" +"Last-Translator: FULL NAME \\n" +"Language-Team: LANGUAGE \\n" +"MIME-Version: 1.0\\n" +"Content-Type: text/plain; charset=CHARSET\\n" +"Content-Transfer-Encoding: ENCODING\\n" +"Generated-By: pygettext.py %(version)s\\n" + +''') + + +def usage(code, msg=''): + print >> sys.stderr, __doc__ % globals() + if msg: + print >> sys.stderr, msg + sys.exit(code) + + + +escapes = [] + +def make_escapes(pass_iso8859): + global escapes + if pass_iso8859: + # Allow iso-8859 characters to pass through so that e.g. 'msgid + # "Hhe"' would result not result in 'msgid "H\366he"'. Otherwise we + # escape any character outside the 32..126 range. + mod = 128 + else: + mod = 256 + for i in range(256): + if 32 <= (i % mod) <= 126: + escapes.append(chr(i)) + else: + escapes.append("\\%03o" % i) + escapes[ord('\\')] = '\\\\' + escapes[ord('\t')] = '\\t' + escapes[ord('\r')] = '\\r' + escapes[ord('\n')] = '\\n' + escapes[ord('\"')] = '\\"' + + +def escape(s): + global escapes + s = list(s) + for i in range(len(s)): + s[i] = escapes[ord(s[i])] + return EMPTYSTRING.join(s) + + +def safe_eval(s): + # unwrap quotes, safely + return eval(s, {'__builtins__':{}}, {}) + + +def normalize(s): + # This converts the various Python string types into a format that is + # appropriate for .po files, namely much closer to C style. + lines = s.split('\n') + if len(lines) == 1: + s = '"' + escape(s) + '"' + else: + if not lines[-1]: + del lines[-1] + lines[-1] = lines[-1] + '\n' + for i in range(len(lines)): + lines[i] = escape(lines[i]) + lineterm = '\\n"\n"' + s = '""\n"' + lineterm.join(lines) + '"' + return s + + +def containsAny(str, set): + """Check whether 'str' contains ANY of the chars in 'set'""" + return 1 in [c in str for c in set] + + +def _visit_pyfiles(list, dirname, names): + """Helper for getFilesForName().""" + # get extension for python source files + if not globals().has_key('_py_ext'): + global _py_ext + _py_ext = [triple[0] for triple in imp.get_suffixes() + if triple[2] == imp.PY_SOURCE][0] + + # don't recurse into CVS directories + if 'CVS' in names: + names.remove('CVS') + + # add all *.py files to list + list.extend( + [os.path.join(dirname, file) for file in names + if os.path.splitext(file)[1] == _py_ext] + ) + + +def _get_modpkg_path(dotted_name, pathlist=None): + """Get the filesystem path for a module or a package. + + Return the file system path to a file for a module, and to a directory for + a package. Return None if the name is not found, or is a builtin or + extension module. + """ + # split off top-most name + parts = dotted_name.split('.', 1) + + if len(parts) > 1: + # we have a dotted path, import top-level package + try: + file, pathname, description = imp.find_module(parts[0], pathlist) + if file: file.close() + except ImportError: + return None + + # check if it's indeed a package + if description[2] == imp.PKG_DIRECTORY: + # recursively handle the remaining name parts + pathname = _get_modpkg_path(parts[1], [pathname]) + else: + pathname = None + else: + # plain name + try: + file, pathname, description = imp.find_module( + dotted_name, pathlist) + if file: + file.close() + if description[2] not in [imp.PY_SOURCE, imp.PKG_DIRECTORY]: + pathname = None + except ImportError: + pathname = None + + return pathname + + +def getFilesForName(name): + """Get a list of module files for a filename, a module or package name, + or a directory. + """ + if not os.path.exists(name): + # check for glob chars + if containsAny(name, "*?[]"): + files = glob.glob(name) + list = [] + for file in files: + list.extend(getFilesForName(file)) + return list + + # try to find module or package + name = _get_modpkg_path(name) + if not name: + return [] + + if os.path.isdir(name): + # find all python files in directory + list = [] + os.path.walk(name, _visit_pyfiles, list) + return list + elif os.path.exists(name): + # a single file + return [name] + + return [] + + +class TokenEater: + def __init__(self, options): + self.__options = options + self.__messages = {} + self.__state = self.__waiting + self.__data = [] + self.__lineno = -1 + self.__freshmodule = 1 + self.__curfile = None + + def __call__(self, ttype, tstring, stup, etup, line): + # dispatch +## import token +## print >> sys.stderr, 'ttype:', token.tok_name[ttype], \ +## 'tstring:', tstring + self.__state(ttype, tstring, stup[0]) + + def __waiting(self, ttype, tstring, lineno): + opts = self.__options + # Do docstring extractions, if enabled + if opts.docstrings and not opts.nodocstrings.get(self.__curfile): + # module docstring? + if self.__freshmodule: + if ttype == tokenize.STRING: + self.__addentry(safe_eval(tstring), lineno, isdocstring=1) + self.__freshmodule = 0 + elif ttype not in (tokenize.COMMENT, tokenize.NL): + self.__freshmodule = 0 + return + # class docstring? + if ttype == tokenize.NAME and tstring in ('class', 'def'): + self.__state = self.__suiteseen + return + if ttype == tokenize.NAME and tstring in opts.keywords: + self.__state = self.__keywordseen + + def __suiteseen(self, ttype, tstring, lineno): + # ignore anything until we see the colon + if ttype == tokenize.OP and tstring == ':': + self.__state = self.__suitedocstring + + def __suitedocstring(self, ttype, tstring, lineno): + # ignore any intervening noise + if ttype == tokenize.STRING: + self.__addentry(safe_eval(tstring), lineno, isdocstring=1) + self.__state = self.__waiting + elif ttype not in (tokenize.NEWLINE, tokenize.INDENT, + tokenize.COMMENT): + # there was no class docstring + self.__state = self.__waiting + + def __keywordseen(self, ttype, tstring, lineno): + if ttype == tokenize.OP and tstring == '(': + self.__data = [] + self.__lineno = lineno + self.__state = self.__openseen + else: + self.__state = self.__waiting + + def __openseen(self, ttype, tstring, lineno): + if ttype == tokenize.OP and tstring == ')': + # We've seen the last of the translatable strings. Record the + # line number of the first line of the strings and update the list + # of messages seen. Reset state for the next batch. If there + # were no strings inside _(), then just ignore this entry. + if self.__data: + self.__addentry(EMPTYSTRING.join(self.__data)) + self.__state = self.__waiting + elif ttype == tokenize.STRING: + self.__data.append(safe_eval(tstring)) + elif ttype not in [tokenize.COMMENT, token.INDENT, token.DEDENT, + token.NEWLINE, tokenize.NL]: + # warn if we see anything else than STRING or whitespace + print >> sys.stderr, _( + '*** %(file)s:%(lineno)s: Seen unexpected token "%(token)s"' + ) % { + 'token': tstring, + 'file': self.__curfile, + 'lineno': self.__lineno + } + self.__state = self.__waiting + + def __addentry(self, msg, lineno=None, isdocstring=0): + if lineno is None: + lineno = self.__lineno + if not msg in self.__options.toexclude: + entry = (self.__curfile, lineno) + self.__messages.setdefault(msg, {})[entry] = isdocstring + + def set_filename(self, filename): + self.__curfile = filename + self.__freshmodule = 1 + + def write(self, fp): + options = self.__options + timestamp = time.strftime('%Y-%m-%d %H:%M+%Z') + # The time stamp in the header doesn't have the same format as that + # generated by xgettext... + print >> fp, pot_header % {'time': timestamp, 'version': __version__} + # Sort the entries. First sort each particular entry's keys, then + # sort all the entries by their first item. + reverse = {} + for k, v in self.__messages.items(): + keys = v.keys() + keys.sort() + reverse.setdefault(tuple(keys), []).append((k, v)) + rkeys = reverse.keys() + rkeys.sort() + for rkey in rkeys: + rentries = reverse[rkey] + rentries.sort() + for k, v in rentries: + isdocstring = 0 + # If the entry was gleaned out of a docstring, then add a + # comment stating so. This is to aid translators who may wish + # to skip translating some unimportant docstrings. + if reduce(operator.__add__, v.values()): + isdocstring = 1 + # k is the message string, v is a dictionary-set of (filename, + # lineno) tuples. We want to sort the entries in v first by + # file name and then by line number. + v = v.keys() + v.sort() + if not options.writelocations: + pass + # location comments are different b/w Solaris and GNU: + elif options.locationstyle == options.SOLARIS: + for filename, lineno in v: + d = {'filename': filename, 'lineno': lineno} + print >>fp, _( + '# File: %(filename)s, line: %(lineno)d') % d + elif options.locationstyle == options.GNU: + # fit as many locations on one line, as long as the + # resulting line length doesn't exceeds 'options.width' + locline = '#:' + for filename, lineno in v: + d = {'filename': filename, 'lineno': lineno} + s = _(' %(filename)s:%(lineno)d') % d + if len(locline) + len(s) <= options.width: + locline = locline + s + else: + print >> fp, locline + locline = "#:" + s + if len(locline) > 2: + print >> fp, locline + if isdocstring: + print >> fp, '#, docstring' + print >> fp, 'msgid', normalize(k) + print >> fp, 'msgstr ""\n' + + + +def main(): + global default_keywords + try: + opts, args = getopt.getopt( + sys.argv[1:], + 'ad:DEhk:Kno:p:S:Vvw:x:X:', + ['extract-all', 'default-domain=', 'escape', 'help', + 'keyword=', 'no-default-keywords', + 'add-location', 'no-location', 'output=', 'output-dir=', + 'style=', 'verbose', 'version', 'width=', 'exclude-file=', + 'docstrings', 'no-docstrings', + ]) + except getopt.error, msg: + usage(1, msg) + + # for holding option values + class Options: + # constants + GNU = 1 + SOLARIS = 2 + # defaults + extractall = 0 # FIXME: currently this option has no effect at all. + escape = 0 + keywords = [] + outpath = '' + outfile = 'messages.pot' + writelocations = 1 + locationstyle = GNU + verbose = 0 + width = 78 + excludefilename = '' + docstrings = 0 + nodocstrings = {} + + options = Options() + locations = {'gnu' : options.GNU, + 'solaris' : options.SOLARIS, + } + + # parse options + for opt, arg in opts: + if opt in ('-h', '--help'): + usage(0) + elif opt in ('-a', '--extract-all'): + options.extractall = 1 + elif opt in ('-d', '--default-domain'): + options.outfile = arg + '.pot' + elif opt in ('-E', '--escape'): + options.escape = 1 + elif opt in ('-D', '--docstrings'): + options.docstrings = 1 + elif opt in ('-k', '--keyword'): + options.keywords.append(arg) + elif opt in ('-K', '--no-default-keywords'): + default_keywords = [] + elif opt in ('-n', '--add-location'): + options.writelocations = 1 + elif opt in ('--no-location',): + options.writelocations = 0 + elif opt in ('-S', '--style'): + options.locationstyle = locations.get(arg.lower()) + if options.locationstyle is None: + usage(1, _('Invalid value for --style: %s') % arg) + elif opt in ('-o', '--output'): + options.outfile = arg + elif opt in ('-p', '--output-dir'): + options.outpath = arg + elif opt in ('-v', '--verbose'): + options.verbose = 1 + elif opt in ('-V', '--version'): + print _('pygettext.py (xgettext for Python) %s') % __version__ + sys.exit(0) + elif opt in ('-w', '--width'): + try: + options.width = int(arg) + except ValueError: + usage(1, _('--width argument must be an integer: %s') % arg) + elif opt in ('-x', '--exclude-file'): + options.excludefilename = arg + elif opt in ('-X', '--no-docstrings'): + fp = open(arg) + try: + while 1: + line = fp.readline() + if not line: + break + options.nodocstrings[line[:-1]] = 1 + finally: + fp.close() + + # calculate escapes + make_escapes(options.escape) + + # calculate all keywords + options.keywords.extend(default_keywords) + + # initialize list of strings to exclude + if options.excludefilename: + try: + fp = open(options.excludefilename) + options.toexclude = fp.readlines() + fp.close() + except IOError: + print >> sys.stderr, _( + "Can't read --exclude-file: %s") % options.excludefilename + sys.exit(1) + else: + options.toexclude = [] + + # resolve args to module lists + expanded = [] + for arg in args: + if arg == '-': + expanded.append(arg) + else: + expanded.extend(getFilesForName(arg)) + args = expanded + + # slurp through all the files + eater = TokenEater(options) + for filename in args: + if filename == '-': + if options.verbose: + print _('Reading standard input') + fp = sys.stdin + closep = 0 + else: + if options.verbose: + print _('Working on %s') % filename + fp = open(filename) + closep = 1 + try: + eater.set_filename(filename) + try: + tokenize.tokenize(fp.readline, eater) + except tokenize.TokenError, e: + print >> sys.stderr, '%s: %s, line %d, column %d' % ( + e[0], filename, e[1][0], e[1][1]) + finally: + if closep: + fp.close() + + # write the output + if options.outfile == '-': + fp = sys.stdout + closep = 0 + else: + if options.outpath: + options.outfile = os.path.join(options.outpath, options.outfile) + fp = open(options.outfile, 'w') + closep = 1 + try: + eater.write(fp) + finally: + if closep: + fp.close() + + +if __name__ == '__main__': + main() + # some more test strings + _(u'a unicode string') + # this one creates a warning + _('*** Seen unexpected token "%(token)s"') % {'token': 'test'} + _('more' 'than' 'one' 'string') diff --git a/tools/twblue-documentation.pot b/tools/twblue-documentation.pot new file mode 100644 index 00000000..44dd2b9f --- /dev/null +++ b/tools/twblue-documentation.pot @@ -0,0 +1,1384 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2014-10-13 09:41+Hora de verano central (Mxico)\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: ../src\extra\AudioUploader\gui.py:31 ../src\gui\dialogs\message.py:169 +#: ../src\gui\dialogs\message.py:257 +msgid "Attach audio" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:38 ../src\extra\AudioUploader\gui.py:146 +#: ../src\extra\AudioUploader\gui.py:156 +msgid "Play" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:41 ../src\extra\AudioUploader\gui.py:75 +#: ../src\extra\AudioUploader\gui.py:80 ../src\extra\AudioUploader\gui.py:107 +msgid "Pause" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:44 ../src\extra\AudioUploader\gui.py:103 +msgid "Record" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:47 +msgid "Add an existing file" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:49 +msgid "Discard" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:52 +msgid "Upload to" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:57 +msgid "Attach" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:59 +msgid "Cancel" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:77 ../src\extra\AudioUploader\gui.py:78 +msgid "Resume" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:95 +msgid "Stop recording" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:96 +msgid "Recording" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:101 ../src\extra\AudioUploader\gui.py:153 +msgid "Stopped" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:128 ../src\gui\dialogs\message.py:218 +#: ../src\gui\dialogs\update_profile.py:87 +msgid "Discarded" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:138 ../src\gui\buffers\base.py:339 +#: ../src\gui\buffers\base.py:351 +msgid "Playing..." +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:142 +msgid "Stop" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:161 +msgid "Recoding audio..." +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Audio Files (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Select the audio file to be uploaded" +msgstr "" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:15 +msgid "File" +msgstr "" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:21 +msgid "Transferred" +msgstr "" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:26 +msgid "Total file size" +msgstr "" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:31 +msgid "Transfer rate" +msgstr "" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:36 +msgid "Time left" +msgstr "" + +#: ../src\extra\AudioUploader\utils.py:27 +msgid "%d day, " +msgstr "" + +#: ../src\extra\AudioUploader\utils.py:29 +msgid "%d days, " +msgstr "" + +#: ../src\extra\AudioUploader\utils.py:31 +msgid "%d hour, " +msgstr "" + +#: ../src\extra\AudioUploader\utils.py:33 +msgid "%d hours, " +msgstr "" + +#: ../src\extra\AudioUploader\utils.py:35 +msgid "%d minute, " +msgstr "" + +#: ../src\extra\AudioUploader\utils.py:37 +msgid "%d minutes, " +msgstr "" + +#: ../src\extra\AudioUploader\utils.py:39 +msgid "%s second" +msgstr "" + +#: ../src\extra\AudioUploader\utils.py:41 +msgid "%s seconds" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:11 +msgid "The tweet may contain a playable audio" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:12 +msgid "A timeline has been created" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:13 +msgid "A timeline has been deleted" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:14 +msgid "You've received a direct message" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:15 +msgid "You've sent a direct message" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:16 +msgid "A bug has happened" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:17 +msgid "You've added a tweet to your favourites" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:18 +msgid "Someone's favourites have been updated" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:19 +msgid "There are no more tweets to read" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:20 +msgid "A list has a new tweet" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:21 +msgid "You can't add any more characters on the tweet" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:22 +msgid "You've been mentioned " +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:23 +msgid "A new event has happened" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:24 +msgid "TW Blue is ready " +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:25 +msgid "You've replied" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:26 +msgid "You've retweeted" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:27 +msgid "A search has been updated" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:28 +msgid "There's a new tweet in the main buffer" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:29 +msgid "You've sent a tweet" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:30 +msgid "There's a new tweet in a timeline" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:31 +msgid "You have a new follower" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:32 +msgid "You've turned the volume up or down" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:36 +msgid "It seems as though the currently used sound pack needs an update. %i fails are still be required to use this function. Make sure to obtain the needed lacking sounds or to contact with the sound pack developer." +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:36 ../src\extra\SpellChecker\gui.py:34 +#: ../src\gui\dialogs\show_user.py:63 +msgid "Error" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:38 +msgid "Sounds tutorial" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:41 +msgid "Press enter to listen to the sound for the selected event" +msgstr "" + +#: ../src\extra\SpellChecker\gui.py:34 +msgid "A bug has happened. There are no dictionaries available for the selected language in TW Blue" +msgstr "" + +#: ../src\extra\SpellChecker\gui.py:38 +msgid "Mis-spelled word" +msgstr "" + +#: ../src\extra\SpellChecker\gui.py:43 +msgid "Context" +msgstr "" + +#: ../src\extra\SpellChecker\gui.py:48 +msgid "Suggestions" +msgstr "" + +#: ../src\extra\SpellChecker\gui.py:53 +msgid "Ignore" +msgstr "" + +#: ../src\extra\SpellChecker\gui.py:55 +msgid "Ignore all" +msgstr "" + +#: ../src\extra\SpellChecker\gui.py:57 +msgid "Replace" +msgstr "" + +#: ../src\extra\SpellChecker\gui.py:59 +msgid "Replace all" +msgstr "" + +#: ../src\extra\SpellChecker\gui.py:78 +msgid "Mis-spelled word: %s" +msgstr "" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "Finished" +msgstr "" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "The spelling review has finished." +msgstr "" + +#: ../src\extra\translator\gui.py:24 ../src\gui\dialogs\message.py:177 +#: ../src\gui\dialogs\message.py:265 ../src\gui\dialogs\message.py:351 +msgid "Translate message" +msgstr "" + +#: ../src\extra\translator\gui.py:27 +msgid "Source language" +msgstr "" + +#: ../src\extra\translator\gui.py:30 +msgid "Target language" +msgstr "" + +#: ../src\extra\translator\translator.py:53 +msgid "Afrikaans" +msgstr "" + +#: ../src\extra\translator\translator.py:54 +msgid "Albanian" +msgstr "" + +#: ../src\extra\translator\translator.py:55 +msgid "Amharic" +msgstr "" + +#: ../src\extra\translator\translator.py:56 +msgid "Arabic" +msgstr "" + +#: ../src\extra\translator\translator.py:57 +msgid "Armenian" +msgstr "" + +#: ../src\extra\translator\translator.py:58 +msgid "Azerbaijani" +msgstr "" + +#: ../src\extra\translator\translator.py:59 +msgid "Basque" +msgstr "" + +#: ../src\extra\translator\translator.py:60 +msgid "Belarusian" +msgstr "" + +#: ../src\extra\translator\translator.py:61 +msgid "Bengali" +msgstr "" + +#: ../src\extra\translator\translator.py:62 +msgid "Bihari" +msgstr "" + +#: ../src\extra\translator\translator.py:63 +msgid "Bulgarian" +msgstr "" + +#: ../src\extra\translator\translator.py:64 +msgid "Burmese" +msgstr "" + +#: ../src\extra\translator\translator.py:65 +msgid "Catalan" +msgstr "" + +#: ../src\extra\translator\translator.py:66 +msgid "Cherokee" +msgstr "" + +#: ../src\extra\translator\translator.py:67 +msgid "Chinese" +msgstr "" + +#: ../src\extra\translator\translator.py:68 +msgid "Chinese_simplified" +msgstr "" + +#: ../src\extra\translator\translator.py:69 +msgid "Chinese_traditional" +msgstr "" + +#: ../src\extra\translator\translator.py:70 +msgid "Croatian" +msgstr "" + +#: ../src\extra\translator\translator.py:71 +msgid "Czech" +msgstr "" + +#: ../src\extra\translator\translator.py:72 +msgid "Danish" +msgstr "" + +#: ../src\extra\translator\translator.py:73 +msgid "Dhivehi" +msgstr "" + +#: ../src\extra\translator\translator.py:74 +msgid "Dutch" +msgstr "" + +#: ../src\extra\translator\translator.py:75 +msgid "English" +msgstr "" + +#: ../src\extra\translator\translator.py:76 +msgid "Esperanto" +msgstr "" + +#: ../src\extra\translator\translator.py:77 +msgid "Estonian" +msgstr "" + +#: ../src\extra\translator\translator.py:78 +msgid "Filipino" +msgstr "" + +#: ../src\extra\translator\translator.py:79 +msgid "Finnish" +msgstr "" + +#: ../src\extra\translator\translator.py:80 +msgid "French" +msgstr "" + +#: ../src\extra\translator\translator.py:81 +msgid "Galician" +msgstr "" + +#: ../src\extra\translator\translator.py:82 +msgid "Georgian" +msgstr "" + +#: ../src\extra\translator\translator.py:83 +msgid "German" +msgstr "" + +#: ../src\extra\translator\translator.py:84 +msgid "Greek" +msgstr "" + +#: ../src\extra\translator\translator.py:85 +msgid "Guarani" +msgstr "" + +#: ../src\extra\translator\translator.py:86 +msgid "Gujarati" +msgstr "" + +#: ../src\extra\translator\translator.py:87 +msgid "Hebrew" +msgstr "" + +#: ../src\extra\translator\translator.py:88 +msgid "Hindi" +msgstr "" + +#: ../src\extra\translator\translator.py:89 +msgid "Hungarian" +msgstr "" + +#: ../src\extra\translator\translator.py:90 +msgid "Icelandic" +msgstr "" + +#: ../src\extra\translator\translator.py:91 +msgid "Indonesian" +msgstr "" + +#: ../src\extra\translator\translator.py:92 +msgid "Inuktitut" +msgstr "" + +#: ../src\extra\translator\translator.py:93 +msgid "Irish" +msgstr "" + +#: ../src\extra\translator\translator.py:94 +msgid "Italian" +msgstr "" + +#: ../src\extra\translator\translator.py:95 +msgid "Japanese" +msgstr "" + +#: ../src\extra\translator\translator.py:96 +msgid "Kannada" +msgstr "" + +#: ../src\extra\translator\translator.py:97 +msgid "Kazakh" +msgstr "" + +#: ../src\extra\translator\translator.py:98 +msgid "Khmer" +msgstr "" + +#: ../src\extra\translator\translator.py:99 +msgid "Korean" +msgstr "" + +#: ../src\extra\translator\translator.py:100 +msgid "Kurdish" +msgstr "" + +#: ../src\extra\translator\translator.py:101 +msgid "Kyrgyz" +msgstr "" + +#: ../src\extra\translator\translator.py:102 +msgid "Laothian" +msgstr "" + +#: ../src\extra\translator\translator.py:103 +msgid "Latvian" +msgstr "" + +#: ../src\extra\translator\translator.py:104 +msgid "Lithuanian" +msgstr "" + +#: ../src\extra\translator\translator.py:105 +msgid "Macedonian" +msgstr "" + +#: ../src\extra\translator\translator.py:106 +msgid "Malay" +msgstr "" + +#: ../src\extra\translator\translator.py:107 +msgid "Malayalam" +msgstr "" + +#: ../src\extra\translator\translator.py:108 +msgid "Maltese" +msgstr "" + +#: ../src\extra\translator\translator.py:109 +msgid "Marathi" +msgstr "" + +#: ../src\extra\translator\translator.py:110 +msgid "Mongolian" +msgstr "" + +#: ../src\extra\translator\translator.py:111 +msgid "Nepali" +msgstr "" + +#: ../src\extra\translator\translator.py:112 +msgid "Norwegian" +msgstr "" + +#: ../src\extra\translator\translator.py:113 +msgid "Oriya" +msgstr "" + +#: ../src\extra\translator\translator.py:114 +msgid "Pashto" +msgstr "" + +#: ../src\extra\translator\translator.py:115 +msgid "Persian" +msgstr "" + +#: ../src\extra\translator\translator.py:116 +msgid "Polish" +msgstr "" + +#: ../src\extra\translator\translator.py:117 +msgid "Portuguese" +msgstr "" + +#: ../src\extra\translator\translator.py:118 +msgid "Punjabi" +msgstr "" + +#: ../src\extra\translator\translator.py:119 +msgid "Romanian" +msgstr "" + +#: ../src\extra\translator\translator.py:120 +msgid "Russian" +msgstr "" + +#: ../src\extra\translator\translator.py:121 +msgid "Sanskrit" +msgstr "" + +#: ../src\extra\translator\translator.py:122 +msgid "Serbian" +msgstr "" + +#: ../src\extra\translator\translator.py:123 +msgid "Sindhi" +msgstr "" + +#: ../src\extra\translator\translator.py:124 +msgid "Sinhalese" +msgstr "" + +#: ../src\extra\translator\translator.py:125 +msgid "Slovak" +msgstr "" + +#: ../src\extra\translator\translator.py:126 +msgid "Slovenian" +msgstr "" + +#: ../src\extra\translator\translator.py:127 +msgid "Spanish" +msgstr "" + +#: ../src\extra\translator\translator.py:128 +msgid "Swahili" +msgstr "" + +#: ../src\extra\translator\translator.py:129 +msgid "Swedish" +msgstr "" + +#: ../src\extra\translator\translator.py:130 +msgid "Tajik" +msgstr "" + +#: ../src\extra\translator\translator.py:131 +msgid "Tamil" +msgstr "" + +#: ../src\extra\translator\translator.py:132 +msgid "Tagalog" +msgstr "" + +#: ../src\extra\translator\translator.py:133 +msgid "Telugu" +msgstr "" + +#: ../src\extra\translator\translator.py:134 +msgid "Thai" +msgstr "" + +#: ../src\extra\translator\translator.py:135 +msgid "Tibetan" +msgstr "" + +#: ../src\extra\translator\translator.py:136 +msgid "Turkish" +msgstr "" + +#: ../src\extra\translator\translator.py:137 +msgid "Ukrainian" +msgstr "" + +#: ../src\extra\translator\translator.py:138 +msgid "Urdu" +msgstr "" + +#: ../src\extra\translator\translator.py:139 +msgid "Uzbek" +msgstr "" + +#: ../src\extra\translator\translator.py:140 +msgid "Uighur" +msgstr "" + +#: ../src\extra\translator\translator.py:141 +msgid "Vietnamese" +msgstr "" + +#: ../src\extra\translator\translator.py:142 +msgid "Welsh" +msgstr "" + +#: ../src\extra\translator\translator.py:143 +msgid "Yiddish" +msgstr "" + +#: ../src\extra\translator\translator.py:150 +msgid "autodetect" +msgstr "" + +#: ../src\gui\buffers\base.py:55 +msgid "Client" +msgstr "" + +#: ../src\gui\buffers\base.py:55 +msgid "Text" +msgstr "" + +#: ../src\gui\buffers\base.py:55 ../src\gui\buffers\events.py:61 +msgid "Date" +msgstr "" + +#: ../src\gui\buffers\base.py:55 ../src\gui\buffers\people.py:41 +#: ../src\gui\buffers\user_searches.py:31 ../src\gui\dialogs\utils.py:36 +msgid "User" +msgstr "" + +#: ../src\gui\buffers\base.py:80 ../src\gui\buffers\base.py:228 +#: ../src\gui\buffers\events.py:62 ../src\gui\buffers\events.py:78 +#: ../src\gui\dialogs\message.py:333 +msgid "Tweet" +msgstr "" + +#: ../src\gui\buffers\base.py:82 ../src\gui\buffers\base.py:240 +msgid "Retweet" +msgstr "" + +#: ../src\gui\buffers\base.py:84 +msgid "Reply" +msgstr "" + +#: ../src\gui\buffers\base.py:86 +msgid "Direct message" +msgstr "" + +#: ../src\gui\buffers\base.py:100 +msgid "Do you really want to delete this timeline?" +msgstr "" + +#: ../src\gui\buffers\base.py:100 ../src\gui\buffers\favourites.py:41 +#: ../src\gui\buffers\lists.py:46 ../src\gui\buffers\trends.py:41 +#: ../src\gui\buffers\tweet_searches.py:45 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Attention" +msgstr "" + +#: ../src\gui\buffers\base.py:112 +msgid "This buffer is not a timeline; it can't be deleted." +msgstr "" + +#: ../src\gui\buffers\base.py:196 ../src\gui\buffers\people.py:114 +msgid "%s items retrieved" +msgstr "" + +#: ../src\gui\buffers\base.py:220 ../src\gui\buffers\dm.py:44 +#: ../src\gui\buffers\people.py:56 +msgid "Direct message to %s" +msgstr "" + +#: ../src\gui\buffers\base.py:228 ../src\gui\buffers\events.py:78 +msgid "Write the tweet here" +msgstr "" + +#: ../src\gui\buffers\base.py:240 +msgid "Would you like to add a comment to this tweet?" +msgstr "" + +#: ../src\gui\buffers\base.py:243 +msgid "Add your comment to the tweet" +msgstr "" + +#: ../src\gui\buffers\base.py:259 ../src\gui\buffers\people.py:64 +msgid "Reply to %s" +msgstr "" + +#: ../src\gui\buffers\base.py:304 +msgid "Opening URL..." +msgstr "" + +#: ../src\gui\buffers\base.py:321 ../src\gui\buffers\events.py:122 +msgid "Do you really want to empty this buffer? It's tweets will be removed from the list but not from Twitter" +msgstr "" + +#: ../src\gui\buffers\base.py:321 ../src\gui\buffers\events.py:122 +msgid "Empty buffer" +msgstr "" + +#: ../src\gui\buffers\base.py:326 ../src\gui\buffers\events.py:126 +msgid "Do you really want to delete this message?" +msgstr "" + +#: ../src\gui\buffers\base.py:326 ../src\gui\buffers\events.py:126 +#: ../src\gui\dialogs\lists.py:107 +msgid "Delete" +msgstr "" + +#: ../src\gui\buffers\base.py:346 ../src\gui\buffers\base.py:357 +msgid "Unable to play audio." +msgstr "" + +#: ../src\gui\buffers\base.py:348 +msgid "Audio stopped." +msgstr "" + +#: ../src\gui\buffers\events.py:35 ../src\gui\buffers\panels.py:37 +#: ../src\gui\buffers\tweet_searches.py:58 +msgid "This action is not supported for this buffer" +msgstr "" + +#: ../src\gui\buffers\events.py:44 +msgid "Empty" +msgstr "" + +#: ../src\gui\buffers\events.py:61 +msgid "Event" +msgstr "" + +#: ../src\gui\buffers\events.py:64 +msgid "Remove event" +msgstr "" + +#: ../src\gui\buffers\favourites.py:41 +msgid "Do you really want to delete this favourites timeline?" +msgstr "" + +#: ../src\gui\buffers\lists.py:46 ../src\gui\dialogs\lists.py:107 +msgid "Do you really want to delete this list?" +msgstr "" + +#: ../src\gui\buffers\panels.py:27 +msgid "Announce" +msgstr "" + +#: ../src\gui\buffers\people.py:46 +msgid "Mention" +msgstr "" + +#: ../src\gui\buffers\trends.py:41 ../src\gui\buffers\tweet_searches.py:45 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Do you really want to delete this search term?" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:39 +msgid "Language" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:53 +msgid "Relative times" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:57 +msgid "Activate Sapi5 when any other screen reader is not being run" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:60 +msgid "Activate the auto-start of the invisible interface" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:64 +msgid "API calls when the stream is started (One API call equals to 200 tweetts, two API calls equals 400 tweets, etc):" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:72 +msgid "Items on each API call" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:79 +msgid "Inverted buffers: The newest tweets will be shown at the beginning of the lists while the oldest at the end" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:94 +msgid "Show followers" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:97 +msgid "Show friends" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:100 +msgid "Show favourites" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:103 +msgid "Show blocked users" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:106 +msgid "Show muted users" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:109 +msgid "Show events" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:119 +#: ../src\gui\dialogs\configuration.py:267 +msgid "Ignored clients" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:125 +msgid "Add client" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:126 +msgid "Remove client" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Add a new ignored client" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Enter the name of the client here" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:154 +msgid "Volume" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:163 +msgid "Global mute" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:167 +msgid "Output device" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:176 +msgid "Input device" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:187 +msgid "Sound pack" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:200 +msgid "If you've got a SndUp account, enter your API Key here. Whether the API Key is wrong, the App will fail to upload anything to the server. Whether there's no API Key here, then the audio files will be uploaded anonimously" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:213 +#: ../src\gui\dialogs\configuration.py:237 +msgid "Unlink your Dropbox account" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:215 +#: ../src\gui\dialogs\configuration.py:232 +#: ../src\gui\dialogs\configuration.py:240 +#: ../src\gui\dialogs\configuration.py:244 +#: ../src\gui\dialogs\configuration.py:251 +msgid "Link your Dropbox account" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:225 +msgid "Authorisation" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:225 +msgid "The authorisation request will be shown on your browser. Copy the code tat Dropbox will provide and, in the text box that will appear on TW Blue, paste it. This code is necessary to continue. You only need to do it once." +msgstr "" + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Enter the code here." +msgstr "" + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Verification code" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:239 +msgid "Error during authorisation. Try again later." +msgstr "" + +#: ../src\gui\dialogs\configuration.py:239 +msgid "Error!" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:258 +msgid "TW Blue preferences" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:262 +msgid "General" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:265 +msgid "Show other buffers" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:269 +msgid "Sound" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:271 +msgid "Audio Services" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:274 +msgid "Save" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:277 ../src\gui\dialogs\follow.py:64 +#: ../src\gui\dialogs\message.py:182 ../src\gui\dialogs\message.py:270 +#: ../src\gui\dialogs\message.py:353 ../src\gui\dialogs\search.py:42 +#: ../src\gui\dialogs\show_user.py:42 ../src\gui\dialogs\update_profile.py:56 +#: ../src\gui\dialogs\utils.py:42 +msgid "Close" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:290 +msgid "Followers" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:304 +msgid "friends" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:318 +msgid "Favorites" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:332 +msgid "Events" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:343 +msgid "Blocked users" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:357 +msgid "Muted users" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:416 +msgid "Restart TW Blue" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:416 +msgid "The application requires to be restarted to save these changes. Press OK to do it now." +msgstr "" + +#: ../src\gui\dialogs\follow.py:33 ../src\gui\dialogs\follow.py:43 +msgid "Action" +msgstr "" + +#: ../src\gui\dialogs\follow.py:44 +msgid "Follow" +msgstr "" + +#: ../src\gui\dialogs\follow.py:45 +msgid "Unfollow" +msgstr "" + +#: ../src\gui\dialogs\follow.py:46 +msgid "Mute" +msgstr "" + +#: ../src\gui\dialogs\follow.py:47 +msgid "Unmute" +msgstr "" + +#: ../src\gui\dialogs\follow.py:48 +msgid "Block" +msgstr "" + +#: ../src\gui\dialogs\follow.py:49 +msgid "Unblock" +msgstr "" + +#: ../src\gui\dialogs\follow.py:50 +msgid "Report as spam" +msgstr "" + +#: ../src\gui\dialogs\follow.py:61 ../src\gui\dialogs\search.py:40 +#: ../src\gui\dialogs\utils.py:39 +msgid "OK" +msgstr "" + +#: ../src\gui\dialogs\follow.py:101 +msgid "You've muted to %s" +msgstr "" + +#: ../src\gui\dialogs\follow.py:115 +msgid "You've unmuted to %s" +msgstr "" + +#: ../src\gui\dialogs\lists.py:36 +msgid "Lists manager" +msgstr "" + +#: ../src\gui\dialogs\lists.py:38 +msgid "Lists" +msgstr "" + +#: ../src\gui\dialogs\lists.py:39 +msgid "List" +msgstr "" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Members" +msgstr "" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Owner" +msgstr "" + +#: ../src\gui\dialogs\lists.py:39 +msgid "mode" +msgstr "" + +#: ../src\gui\dialogs\lists.py:39 ../src\gui\dialogs\lists.py:181 +msgid "Description" +msgstr "" + +#: ../src\gui\dialogs\lists.py:44 ../src\gui\dialogs\lists.py:173 +msgid "Create a new list" +msgstr "" + +#: ../src\gui\dialogs\lists.py:46 +msgid "Edit" +msgstr "" + +#: ../src\gui\dialogs\lists.py:48 ../src\gui\dialogs\lists.py:235 +msgid "Remove" +msgstr "" + +#: ../src\gui\dialogs\lists.py:50 +msgid "Open in buffer" +msgstr "" + +#: ../src\gui\dialogs\lists.py:125 +msgid "List opened" +msgstr "" + +#: ../src\gui\dialogs\lists.py:127 +msgid "This list is arready opened." +msgstr "" + +#: ../src\gui\dialogs\lists.py:130 +msgid "List for %s" +msgstr "" + +#: ../src\gui\dialogs\lists.py:148 +msgid "Viewing lists for %s" +msgstr "" + +#: ../src\gui\dialogs\lists.py:149 +msgid "Subscribe" +msgstr "" + +#: ../src\gui\dialogs\lists.py:150 +msgid "Unsubscribe" +msgstr "" + +#: ../src\gui\dialogs\lists.py:176 +msgid "Name (20 characters maximun)" +msgstr "" + +#: ../src\gui\dialogs\lists.py:186 +msgid "Mode" +msgstr "" + +#: ../src\gui\dialogs\lists.py:187 +msgid "Public" +msgstr "" + +#: ../src\gui\dialogs\lists.py:188 +msgid "Private" +msgstr "" + +#: ../src\gui\dialogs\lists.py:208 +msgid "Editing the list %s" +msgstr "" + +#: ../src\gui\dialogs\lists.py:219 +msgid "Select a list to add the user" +msgstr "" + +#: ../src\gui\dialogs\lists.py:220 +msgid "Add" +msgstr "" + +#: ../src\gui\dialogs\lists.py:234 +msgid "Select a list to remove the user" +msgstr "" + +#: ../src\gui\dialogs\message.py:42 +msgid "New tweet" +msgstr "" + +#: ../src\gui\dialogs\message.py:76 +msgid "Attaching..." +msgstr "" + +#: ../src\gui\dialogs\message.py:77 +msgid "Uploading..." +msgstr "" + +#: ../src\gui\dialogs\message.py:96 +msgid "Unable to upload the audio" +msgstr "" + +#: ../src\gui\dialogs\message.py:110 ../src\gui\dialogs\message.py:396 +msgid "Translated" +msgstr "" + +#: ../src\gui\dialogs\message.py:122 +msgid "There's no URL to be shortened" +msgstr "" + +#: ../src\gui\dialogs\message.py:125 +msgid "URL shortened" +msgstr "" + +#: ../src\gui\dialogs\message.py:133 ../src\gui\dialogs\message.py:408 +msgid "There's no URL to be expanded" +msgstr "" + +#: ../src\gui\dialogs\message.py:136 ../src\gui\dialogs\message.py:411 +msgid "URL expanded" +msgstr "" + +#: ../src\gui\dialogs\message.py:164 ../src\gui\dialogs\message.py:219 +#: ../src\gui\dialogs\update_profile.py:51 +#: ../src\gui\dialogs\update_profile.py:88 +msgid "Upload a picture" +msgstr "" + +#: ../src\gui\dialogs\message.py:167 ../src\gui\dialogs\message.py:255 +#: ../src\gui\dialogs\message.py:346 +msgid "Spelling correction" +msgstr "" + +#: ../src\gui\dialogs\message.py:171 ../src\gui\dialogs\message.py:259 +msgid "Shorten URL" +msgstr "" + +#: ../src\gui\dialogs\message.py:173 ../src\gui\dialogs\message.py:261 +#: ../src\gui\dialogs\message.py:348 +msgid "Expand URL" +msgstr "" + +#: ../src\gui\dialogs\message.py:179 ../src\gui\dialogs\message.py:267 +msgid "Send" +msgstr "" + +#: ../src\gui\dialogs\message.py:215 ../src\gui\dialogs\message.py:226 +#: ../src\gui\dialogs\update_profile.py:84 +#: ../src\gui\dialogs\update_profile.py:95 +msgid "Discard image" +msgstr "" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" +msgstr "" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Select the picture to be uploaded" +msgstr "" + +#: ../src\gui\dialogs\message.py:249 +msgid "Recipient" +msgstr "" + +#: ../src\gui\dialogs\message.py:304 +msgid "Mention to all" +msgstr "" + +#: ../src\gui\dialogs\message.py:331 +msgid "Tweet - %i characters " +msgstr "" + +#: ../src\gui\dialogs\search.py:26 +msgid "Search on Twitter" +msgstr "" + +#: ../src\gui\dialogs\search.py:27 +msgid "Search" +msgstr "" + +#: ../src\gui\dialogs\search.py:34 +msgid "Tweets" +msgstr "" + +#: ../src\gui\dialogs\search.py:35 +msgid "Users" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:26 +msgid "Information for %s" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:30 +msgid "Details" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:39 +msgid "Go to URL" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:63 +msgid "This user does not exist on Twitter" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:68 +msgid "" +"Username: @%s\n" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:69 +msgid "" +"Name: %s\n" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:71 +msgid "" +"Location: %s\n" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:73 +msgid "" +"URL: %s\n" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:76 +msgid "" +"Bio: %s\n" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:77 +msgid "Yes" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:78 +msgid "No" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:79 +msgid "" +"Protected: %s\n" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:80 +msgid "" +"Followers: %s\n" +" Friends: %s\n" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:81 +msgid "" +"Tweets: %s\n" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:82 +msgid "Favourites: %s" +msgstr "" + +#: ../src\gui\dialogs\update_profile.py:27 +msgid "Update your profile" +msgstr "" + +#: ../src\gui\dialogs\update_profile.py:29 +msgid "Name (20 characters maximum)" +msgstr "" + +#: ../src\gui\dialogs\update_profile.py:35 +msgid "Location" +msgstr "" + +#: ../src\gui\dialogs\update_profile.py:40 +msgid "Website" +msgstr "" + +#: ../src\gui\dialogs\update_profile.py:45 +msgid "Bio (160 characters maximum)" +msgstr "" + +#: ../src\gui\dialogs\update_profile.py:53 +msgid "Update profile" +msgstr "" + +#: ../src\gui\dialogs\urlList.py:26 +msgid "Select an URL" +msgstr "" + +#: ../src\languageHandler.py:95 +msgid "User default" +msgstr "" + +#: ../src\twitter\buffers\indibidual.py:26 +msgid "One tweet from %s" +msgstr "" + +#: ../src\twitter\buffers\indibidual.py:35 +msgid "One tweet from %s in the list %s" +msgstr "" + +#: ../src\twitter\buffers\stream.py:57 +msgid "One mention from %s " +msgstr "" + +#: ../src\twitter\buffers\stream.py:69 +msgid "One direct message" +msgstr "" + diff --git a/tools/twblue.pot b/tools/twblue.pot new file mode 100644 index 00000000..476e3c3a --- /dev/null +++ b/tools/twblue.pot @@ -0,0 +1,2454 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2014-10-13 09:41+Hora de verano central (Mxico)\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" +"Generated-By: pygettext.py 1.5\n" + + +#: ../src\extra\AudioUploader\gui.py:31 ../src\gui\dialogs\message.py:169 +#: ../src\gui\dialogs\message.py:257 +msgid "Attach audio" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:38 ../src\extra\AudioUploader\gui.py:146 +#: ../src\extra\AudioUploader\gui.py:156 +msgid "Play" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:41 ../src\extra\AudioUploader\gui.py:75 +#: ../src\extra\AudioUploader\gui.py:80 ../src\extra\AudioUploader\gui.py:107 +msgid "Pause" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:44 ../src\extra\AudioUploader\gui.py:103 +msgid "Record" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:47 +msgid "Add an existing file" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:49 +msgid "Discard" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:52 +msgid "Upload to" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:57 +msgid "Attach" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:59 ../src\issueReporter\gui.py:88 +msgid "Cancel" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:77 ../src\extra\AudioUploader\gui.py:78 +msgid "Resume" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:95 +msgid "Stop recording" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:96 +msgid "Recording" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:101 ../src\extra\AudioUploader\gui.py:153 +msgid "Stopped" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:128 ../src\gui\dialogs\message.py:218 +#: ../src\gui\dialogs\update_profile.py:87 +msgid "Discarded" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:138 ../src\gui\buffers\base.py:339 +#: ../src\gui\buffers\base.py:351 +msgid "Playing..." +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:142 +msgid "Stop" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:161 +msgid "Recoding audio..." +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Audio Files (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav" +msgstr "" + +#: ../src\extra\AudioUploader\gui.py:185 +msgid "Select the audio file to be uploaded" +msgstr "" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:15 +msgid "File" +msgstr "" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:21 +msgid "Transferred" +msgstr "" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:26 +msgid "Total file size" +msgstr "" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:31 +msgid "Transfer rate" +msgstr "" + +#: ../src\extra\AudioUploader\transfer_dialogs.py:36 +msgid "Time left" +msgstr "" + +#: ../src\extra\AudioUploader\utils.py:27 +msgid "%d day, " +msgstr "" + +#: ../src\extra\AudioUploader\utils.py:29 +msgid "%d days, " +msgstr "" + +#: ../src\extra\AudioUploader\utils.py:31 +msgid "%d hour, " +msgstr "" + +#: ../src\extra\AudioUploader\utils.py:33 +msgid "%d hours, " +msgstr "" + +#: ../src\extra\AudioUploader\utils.py:35 +msgid "%d minute, " +msgstr "" + +#: ../src\extra\AudioUploader\utils.py:37 +msgid "%d minutes, " +msgstr "" + +#: ../src\extra\AudioUploader\utils.py:39 +msgid "%s second" +msgstr "" + +#: ../src\extra\AudioUploader\utils.py:41 +msgid "%s seconds" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:11 +msgid "The tweet may contain a playable audio" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:12 +msgid "A timeline has been created" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:13 +msgid "A timeline has been deleted" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:14 +msgid "You've received a direct message" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:15 +msgid "You've sent a direct message" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:16 +msgid "A bug has happened" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:17 +msgid "You've added a tweet to your favourites" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:18 +msgid "Someone's favourites have been updated" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:19 +msgid "There are no more tweets to read" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:20 +msgid "A list has a new tweet" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:21 +msgid "You can't add any more characters on the tweet" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:22 +msgid "You've been mentioned " +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:23 +msgid "A new event has happened" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:24 +msgid "TW Blue is ready " +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:25 +msgid "You've replied" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:26 +msgid "You've retweeted" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:27 +msgid "A search has been updated" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:28 +msgid "There's a new tweet in the main buffer" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:29 +msgid "You've sent a tweet" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:30 +msgid "There's a new tweet in a timeline" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:31 +msgid "You have a new follower" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:32 +msgid "You've turned the volume up or down" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:36 +msgid "It seems as though the currently used sound pack needs an update. %i fails are still be required to use this function. Make sure to obtain the needed lacking sounds or to contact with the sound pack developer." +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:36 ../src\extra\SpellChecker\gui.py:34 +#: ../src\gui\dialogs\show_user.py:63 ../src\gui\main.py:680 +#: ../src\gui\main.py:712 ../src\issueReporter\gui.py:98 +#: ../src\issueReporter\gui.py:101 +msgid "Error" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:38 +msgid "Sounds tutorial" +msgstr "" + +#: ../src\extra\SoundsTutorial\gui.py:41 +msgid "Press enter to listen to the sound for the selected event" +msgstr "" + +#: ../src\extra\SpellChecker\gui.py:34 +msgid "A bug has happened. There are no dictionaries available for the selected language in TW Blue" +msgstr "" + +#: ../src\extra\SpellChecker\gui.py:38 +msgid "Mis-spelled word" +msgstr "" + +#: ../src\extra\SpellChecker\gui.py:43 +msgid "Context" +msgstr "" + +#: ../src\extra\SpellChecker\gui.py:48 +msgid "Suggestions" +msgstr "" + +#: ../src\extra\SpellChecker\gui.py:53 +msgid "Ignore" +msgstr "" + +#: ../src\extra\SpellChecker\gui.py:55 +msgid "Ignore all" +msgstr "" + +#: ../src\extra\SpellChecker\gui.py:57 +msgid "Replace" +msgstr "" + +#: ../src\extra\SpellChecker\gui.py:59 +msgid "Replace all" +msgstr "" + +#: ../src\extra\SpellChecker\gui.py:78 +msgid "Mis-spelled word: %s" +msgstr "" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "Finished" +msgstr "" + +#: ../src\extra\SpellChecker\gui.py:87 +msgid "The spelling review has finished." +msgstr "" + +#: ../src\extra\translator\gui.py:24 ../src\gui\dialogs\message.py:177 +#: ../src\gui\dialogs\message.py:265 ../src\gui\dialogs\message.py:351 +msgid "Translate message" +msgstr "" + +#: ../src\extra\translator\gui.py:27 +msgid "Source language" +msgstr "" + +#: ../src\extra\translator\gui.py:30 +msgid "Target language" +msgstr "" + +#: ../src\extra\translator\translator.py:53 +msgid "Afrikaans" +msgstr "" + +#: ../src\extra\translator\translator.py:54 +msgid "Albanian" +msgstr "" + +#: ../src\extra\translator\translator.py:55 +msgid "Amharic" +msgstr "" + +#: ../src\extra\translator\translator.py:56 +msgid "Arabic" +msgstr "" + +#: ../src\extra\translator\translator.py:57 +msgid "Armenian" +msgstr "" + +#: ../src\extra\translator\translator.py:58 +msgid "Azerbaijani" +msgstr "" + +#: ../src\extra\translator\translator.py:59 +msgid "Basque" +msgstr "" + +#: ../src\extra\translator\translator.py:60 +msgid "Belarusian" +msgstr "" + +#: ../src\extra\translator\translator.py:61 +msgid "Bengali" +msgstr "" + +#: ../src\extra\translator\translator.py:62 +msgid "Bihari" +msgstr "" + +#: ../src\extra\translator\translator.py:63 +msgid "Bulgarian" +msgstr "" + +#: ../src\extra\translator\translator.py:64 +msgid "Burmese" +msgstr "" + +#: ../src\extra\translator\translator.py:65 +msgid "Catalan" +msgstr "" + +#: ../src\extra\translator\translator.py:66 +msgid "Cherokee" +msgstr "" + +#: ../src\extra\translator\translator.py:67 +msgid "Chinese" +msgstr "" + +#: ../src\extra\translator\translator.py:68 +msgid "Chinese_simplified" +msgstr "" + +#: ../src\extra\translator\translator.py:69 +msgid "Chinese_traditional" +msgstr "" + +#: ../src\extra\translator\translator.py:70 +msgid "Croatian" +msgstr "" + +#: ../src\extra\translator\translator.py:71 +msgid "Czech" +msgstr "" + +#: ../src\extra\translator\translator.py:72 +msgid "Danish" +msgstr "" + +#: ../src\extra\translator\translator.py:73 +msgid "Dhivehi" +msgstr "" + +#: ../src\extra\translator\translator.py:74 +msgid "Dutch" +msgstr "" + +#: ../src\extra\translator\translator.py:75 +msgid "English" +msgstr "" + +#: ../src\extra\translator\translator.py:76 +msgid "Esperanto" +msgstr "" + +#: ../src\extra\translator\translator.py:77 +msgid "Estonian" +msgstr "" + +#: ../src\extra\translator\translator.py:78 +msgid "Filipino" +msgstr "" + +#: ../src\extra\translator\translator.py:79 +msgid "Finnish" +msgstr "" + +#: ../src\extra\translator\translator.py:80 +msgid "French" +msgstr "" + +#: ../src\extra\translator\translator.py:81 +msgid "Galician" +msgstr "" + +#: ../src\extra\translator\translator.py:82 +msgid "Georgian" +msgstr "" + +#: ../src\extra\translator\translator.py:83 +msgid "German" +msgstr "" + +#: ../src\extra\translator\translator.py:84 +msgid "Greek" +msgstr "" + +#: ../src\extra\translator\translator.py:85 +msgid "Guarani" +msgstr "" + +#: ../src\extra\translator\translator.py:86 +msgid "Gujarati" +msgstr "" + +#: ../src\extra\translator\translator.py:87 +msgid "Hebrew" +msgstr "" + +#: ../src\extra\translator\translator.py:88 +msgid "Hindi" +msgstr "" + +#: ../src\extra\translator\translator.py:89 +msgid "Hungarian" +msgstr "" + +#: ../src\extra\translator\translator.py:90 +msgid "Icelandic" +msgstr "" + +#: ../src\extra\translator\translator.py:91 +msgid "Indonesian" +msgstr "" + +#: ../src\extra\translator\translator.py:92 +msgid "Inuktitut" +msgstr "" + +#: ../src\extra\translator\translator.py:93 +msgid "Irish" +msgstr "" + +#: ../src\extra\translator\translator.py:94 +msgid "Italian" +msgstr "" + +#: ../src\extra\translator\translator.py:95 +msgid "Japanese" +msgstr "" + +#: ../src\extra\translator\translator.py:96 +msgid "Kannada" +msgstr "" + +#: ../src\extra\translator\translator.py:97 +msgid "Kazakh" +msgstr "" + +#: ../src\extra\translator\translator.py:98 +msgid "Khmer" +msgstr "" + +#: ../src\extra\translator\translator.py:99 +msgid "Korean" +msgstr "" + +#: ../src\extra\translator\translator.py:100 +msgid "Kurdish" +msgstr "" + +#: ../src\extra\translator\translator.py:101 +msgid "Kyrgyz" +msgstr "" + +#: ../src\extra\translator\translator.py:102 +msgid "Laothian" +msgstr "" + +#: ../src\extra\translator\translator.py:103 +msgid "Latvian" +msgstr "" + +#: ../src\extra\translator\translator.py:104 +msgid "Lithuanian" +msgstr "" + +#: ../src\extra\translator\translator.py:105 +msgid "Macedonian" +msgstr "" + +#: ../src\extra\translator\translator.py:106 +msgid "Malay" +msgstr "" + +#: ../src\extra\translator\translator.py:107 +msgid "Malayalam" +msgstr "" + +#: ../src\extra\translator\translator.py:108 +msgid "Maltese" +msgstr "" + +#: ../src\extra\translator\translator.py:109 +msgid "Marathi" +msgstr "" + +#: ../src\extra\translator\translator.py:110 +msgid "Mongolian" +msgstr "" + +#: ../src\extra\translator\translator.py:111 +msgid "Nepali" +msgstr "" + +#: ../src\extra\translator\translator.py:112 +msgid "Norwegian" +msgstr "" + +#: ../src\extra\translator\translator.py:113 +msgid "Oriya" +msgstr "" + +#: ../src\extra\translator\translator.py:114 +msgid "Pashto" +msgstr "" + +#: ../src\extra\translator\translator.py:115 +msgid "Persian" +msgstr "" + +#: ../src\extra\translator\translator.py:116 +msgid "Polish" +msgstr "" + +#: ../src\extra\translator\translator.py:117 +msgid "Portuguese" +msgstr "" + +#: ../src\extra\translator\translator.py:118 +msgid "Punjabi" +msgstr "" + +#: ../src\extra\translator\translator.py:119 +msgid "Romanian" +msgstr "" + +#: ../src\extra\translator\translator.py:120 +msgid "Russian" +msgstr "" + +#: ../src\extra\translator\translator.py:121 +msgid "Sanskrit" +msgstr "" + +#: ../src\extra\translator\translator.py:122 +msgid "Serbian" +msgstr "" + +#: ../src\extra\translator\translator.py:123 +msgid "Sindhi" +msgstr "" + +#: ../src\extra\translator\translator.py:124 +msgid "Sinhalese" +msgstr "" + +#: ../src\extra\translator\translator.py:125 +msgid "Slovak" +msgstr "" + +#: ../src\extra\translator\translator.py:126 +msgid "Slovenian" +msgstr "" + +#: ../src\extra\translator\translator.py:127 +msgid "Spanish" +msgstr "" + +#: ../src\extra\translator\translator.py:128 +msgid "Swahili" +msgstr "" + +#: ../src\extra\translator\translator.py:129 +msgid "Swedish" +msgstr "" + +#: ../src\extra\translator\translator.py:130 +msgid "Tajik" +msgstr "" + +#: ../src\extra\translator\translator.py:131 +msgid "Tamil" +msgstr "" + +#: ../src\extra\translator\translator.py:132 +msgid "Tagalog" +msgstr "" + +#: ../src\extra\translator\translator.py:133 +msgid "Telugu" +msgstr "" + +#: ../src\extra\translator\translator.py:134 +msgid "Thai" +msgstr "" + +#: ../src\extra\translator\translator.py:135 +msgid "Tibetan" +msgstr "" + +#: ../src\extra\translator\translator.py:136 +msgid "Turkish" +msgstr "" + +#: ../src\extra\translator\translator.py:137 +msgid "Ukrainian" +msgstr "" + +#: ../src\extra\translator\translator.py:138 +msgid "Urdu" +msgstr "" + +#: ../src\extra\translator\translator.py:139 +msgid "Uzbek" +msgstr "" + +#: ../src\extra\translator\translator.py:140 +msgid "Uighur" +msgstr "" + +#: ../src\extra\translator\translator.py:141 +msgid "Vietnamese" +msgstr "" + +#: ../src\extra\translator\translator.py:142 +msgid "Welsh" +msgstr "" + +#: ../src\extra\translator\translator.py:143 +msgid "Yiddish" +msgstr "" + +#: ../src\extra\translator\translator.py:150 +msgid "autodetect" +msgstr "" + +#: ../src\gui\buffers\base.py:55 +msgid "Client" +msgstr "" + +#: ../src\gui\buffers\base.py:55 +msgid "Text" +msgstr "" + +#: ../src\gui\buffers\base.py:55 ../src\gui\buffers\events.py:61 +msgid "Date" +msgstr "" + +#: ../src\gui\buffers\base.py:55 ../src\gui\buffers\people.py:41 +#: ../src\gui\buffers\user_searches.py:31 ../src\gui\dialogs\utils.py:36 +msgid "User" +msgstr "" + +#: ../src\gui\buffers\base.py:80 ../src\gui\buffers\base.py:228 +#: ../src\gui\buffers\events.py:62 ../src\gui\buffers\events.py:78 +#: ../src\gui\dialogs\message.py:333 ../src\gui\sysTrayIcon.py:34 +msgid "Tweet" +msgstr "" + +#: ../src\gui\buffers\base.py:82 ../src\gui\buffers\base.py:240 +#: ../src\keystrokeEditor\constants.py:13 +msgid "Retweet" +msgstr "" + +#: ../src\gui\buffers\base.py:84 +msgid "Reply" +msgstr "" + +#: ../src\gui\buffers\base.py:86 +msgid "Direct message" +msgstr "" + +#: ../src\gui\buffers\base.py:100 +msgid "Do you really want to delete this timeline?" +msgstr "" + +#: ../src\gui\buffers\base.py:100 ../src\gui\buffers\favourites.py:41 +#: ../src\gui\buffers\lists.py:46 ../src\gui\buffers\trends.py:41 +#: ../src\gui\buffers\tweet_searches.py:45 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Attention" +msgstr "" + +#: ../src\gui\buffers\base.py:112 +msgid "This buffer is not a timeline; it can't be deleted." +msgstr "" + +#: ../src\gui\buffers\base.py:196 ../src\gui\buffers\people.py:114 +msgid "%s items retrieved" +msgstr "" + +#: ../src\gui\buffers\base.py:220 ../src\gui\buffers\dm.py:44 +#: ../src\gui\buffers\people.py:56 +msgid "Direct message to %s" +msgstr "" + +#: ../src\gui\buffers\base.py:228 ../src\gui\buffers\events.py:78 +msgid "Write the tweet here" +msgstr "" + +#: ../src\gui\buffers\base.py:240 +msgid "Would you like to add a comment to this tweet?" +msgstr "" + +#: ../src\gui\buffers\base.py:243 +msgid "Add your comment to the tweet" +msgstr "" + +#: ../src\gui\buffers\base.py:259 ../src\gui\buffers\people.py:64 +msgid "Reply to %s" +msgstr "" + +#: ../src\gui\buffers\base.py:304 +msgid "Opening URL..." +msgstr "" + +#: ../src\gui\buffers\base.py:321 ../src\gui\buffers\events.py:122 +msgid "Do you really want to empty this buffer? It's tweets will be removed from the list but not from Twitter" +msgstr "" + +#: ../src\gui\buffers\base.py:321 ../src\gui\buffers\events.py:122 +msgid "Empty buffer" +msgstr "" + +#: ../src\gui\buffers\base.py:326 ../src\gui\buffers\events.py:126 +msgid "Do you really want to delete this message?" +msgstr "" + +#: ../src\gui\buffers\base.py:326 ../src\gui\buffers\events.py:126 +#: ../src\gui\dialogs\lists.py:107 ../src\gui\main.py:557 +msgid "Delete" +msgstr "" + +#: ../src\gui\buffers\base.py:346 ../src\gui\buffers\base.py:357 +msgid "Unable to play audio." +msgstr "" + +#: ../src\gui\buffers\base.py:348 +msgid "Audio stopped." +msgstr "" + +#: ../src\gui\buffers\events.py:35 ../src\gui\buffers\panels.py:37 +#: ../src\gui\buffers\tweet_searches.py:58 +msgid "This action is not supported for this buffer" +msgstr "" + +#: ../src\gui\buffers\events.py:44 +msgid "Empty" +msgstr "" + +#: ../src\gui\buffers\events.py:61 +msgid "Event" +msgstr "" + +#: ../src\gui\buffers\events.py:64 +msgid "Remove event" +msgstr "" + +#: ../src\gui\buffers\favourites.py:41 +msgid "Do you really want to delete this favourites timeline?" +msgstr "" + +#: ../src\gui\buffers\lists.py:46 ../src\gui\dialogs\lists.py:107 +msgid "Do you really want to delete this list?" +msgstr "" + +#: ../src\gui\buffers\panels.py:27 +msgid "Announce" +msgstr "" + +#: ../src\gui\buffers\people.py:46 +msgid "Mention" +msgstr "" + +#: ../src\gui\buffers\trends.py:41 ../src\gui\buffers\tweet_searches.py:45 +#: ../src\gui\buffers\user_searches.py:49 +msgid "Do you really want to delete this search term?" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:39 +msgid "Language" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:53 +msgid "Relative times" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:57 +msgid "Activate Sapi5 when any other screen reader is not being run" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:60 +msgid "Activate the auto-start of the invisible interface" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:64 +msgid "API calls when the stream is started (One API call equals to 200 tweetts, two API calls equals 400 tweets, etc):" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:72 +msgid "Items on each API call" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:79 +msgid "Inverted buffers: The newest tweets will be shown at the beginning of the lists while the oldest at the end" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:94 +msgid "Show followers" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:97 +msgid "Show friends" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:100 +msgid "Show favourites" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:103 +msgid "Show blocked users" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:106 +msgid "Show muted users" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:109 +msgid "Show events" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:119 +#: ../src\gui\dialogs\configuration.py:267 +msgid "Ignored clients" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:125 +msgid "Add client" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:126 +msgid "Remove client" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Add a new ignored client" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:137 +msgid "Enter the name of the client here" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:154 +msgid "Volume" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:163 +msgid "Global mute" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:167 +msgid "Output device" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:176 +msgid "Input device" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:187 +msgid "Sound pack" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:200 +msgid "If you've got a SndUp account, enter your API Key here. Whether the API Key is wrong, the App will fail to upload anything to the server. Whether there's no API Key here, then the audio files will be uploaded anonimously" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:213 +#: ../src\gui\dialogs\configuration.py:237 +msgid "Unlink your Dropbox account" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:215 +#: ../src\gui\dialogs\configuration.py:232 +#: ../src\gui\dialogs\configuration.py:240 +#: ../src\gui\dialogs\configuration.py:244 +#: ../src\gui\dialogs\configuration.py:251 +msgid "Link your Dropbox account" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:225 +msgid "The authorisation request will be shown on your browser. Copy the code tat Dropbox will provide and, in the text box that will appear on TW Blue, paste it. This code is necessary to continue. You only need to do it once." +msgstr "" + +#: ../src\gui\dialogs\configuration.py:225 ../src\sessionmanager\gui.py:83 +msgid "Authorisation" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Enter the code here." +msgstr "" + +#: ../src\gui\dialogs\configuration.py:227 +msgid "Verification code" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:239 +msgid "Error during authorisation. Try again later." +msgstr "" + +#: ../src\gui\dialogs\configuration.py:239 ../src\gui\main.py:694 +#: ../src\gui\main.py:727 +msgid "Error!" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:258 +msgid "TW Blue preferences" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:262 ../src\issueReporter\gui.py:30 +msgid "General" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:265 +msgid "Show other buffers" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:269 +msgid "Sound" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:271 +msgid "Audio Services" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:274 +msgid "Save" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:277 ../src\gui\dialogs\follow.py:64 +#: ../src\gui\dialogs\message.py:182 ../src\gui\dialogs\message.py:270 +#: ../src\gui\dialogs\message.py:353 ../src\gui\dialogs\search.py:42 +#: ../src\gui\dialogs\show_user.py:42 ../src\gui\dialogs\update_profile.py:56 +#: ../src\gui\dialogs\utils.py:42 ../src\keystrokeEditor\gui.py:26 +msgid "Close" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:290 ../src\gui\main.py:263 +msgid "Followers" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:304 +msgid "friends" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:318 +msgid "Favorites" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:332 ../src\gui\main.py:281 +msgid "Events" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:343 ../src\gui\main.py:273 +msgid "Blocked users" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:357 ../src\gui\main.py:277 +msgid "Muted users" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:416 +msgid "Restart TW Blue" +msgstr "" + +#: ../src\gui\dialogs\configuration.py:416 +msgid "The application requires to be restarted to save these changes. Press OK to do it now." +msgstr "" + +#: ../src\gui\dialogs\follow.py:33 ../src\gui\dialogs\follow.py:43 +#: ../src\keystrokeEditor\gui.py:17 +msgid "Action" +msgstr "" + +#: ../src\gui\dialogs\follow.py:44 +msgid "Follow" +msgstr "" + +#: ../src\gui\dialogs\follow.py:45 +msgid "Unfollow" +msgstr "" + +#: ../src\gui\dialogs\follow.py:46 +msgid "Mute" +msgstr "" + +#: ../src\gui\dialogs\follow.py:47 +msgid "Unmute" +msgstr "" + +#: ../src\gui\dialogs\follow.py:48 +msgid "Block" +msgstr "" + +#: ../src\gui\dialogs\follow.py:49 +msgid "Unblock" +msgstr "" + +#: ../src\gui\dialogs\follow.py:50 +msgid "Report as spam" +msgstr "" + +#: ../src\gui\dialogs\follow.py:61 ../src\gui\dialogs\search.py:40 +#: ../src\gui\dialogs\utils.py:39 ../src\keystrokeEditor\gui.py:76 +msgid "OK" +msgstr "" + +#: ../src\gui\dialogs\follow.py:101 +msgid "You've muted to %s" +msgstr "" + +#: ../src\gui\dialogs\follow.py:115 +msgid "You've unmuted to %s" +msgstr "" + +#: ../src\gui\dialogs\lists.py:36 +msgid "Lists manager" +msgstr "" + +#: ../src\gui\dialogs\lists.py:38 ../src\gui\main.py:297 +msgid "Lists" +msgstr "" + +#: ../src\gui\dialogs\lists.py:39 +msgid "List" +msgstr "" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Members" +msgstr "" + +#: ../src\gui\dialogs\lists.py:39 +msgid "Owner" +msgstr "" + +#: ../src\gui\dialogs\lists.py:39 +msgid "mode" +msgstr "" + +#: ../src\gui\dialogs\lists.py:39 ../src\gui\dialogs\lists.py:181 +msgid "Description" +msgstr "" + +#: ../src\gui\dialogs\lists.py:44 ../src\gui\dialogs\lists.py:173 +msgid "Create a new list" +msgstr "" + +#: ../src\gui\dialogs\lists.py:46 ../src\keystrokeEditor\gui.py:22 +msgid "Edit" +msgstr "" + +#: ../src\gui\dialogs\lists.py:48 ../src\gui\dialogs\lists.py:235 +msgid "Remove" +msgstr "" + +#: ../src\gui\dialogs\lists.py:50 +msgid "Open in buffer" +msgstr "" + +#: ../src\gui\dialogs\lists.py:125 +msgid "List opened" +msgstr "" + +#: ../src\gui\dialogs\lists.py:127 +msgid "This list is arready opened." +msgstr "" + +#: ../src\gui\dialogs\lists.py:130 ../src\gui\main.py:300 +msgid "List for %s" +msgstr "" + +#: ../src\gui\dialogs\lists.py:148 +msgid "Viewing lists for %s" +msgstr "" + +#: ../src\gui\dialogs\lists.py:149 +msgid "Subscribe" +msgstr "" + +#: ../src\gui\dialogs\lists.py:150 +msgid "Unsubscribe" +msgstr "" + +#: ../src\gui\dialogs\lists.py:176 +msgid "Name (20 characters maximun)" +msgstr "" + +#: ../src\gui\dialogs\lists.py:186 +msgid "Mode" +msgstr "" + +#: ../src\gui\dialogs\lists.py:187 +msgid "Public" +msgstr "" + +#: ../src\gui\dialogs\lists.py:188 +msgid "Private" +msgstr "" + +#: ../src\gui\dialogs\lists.py:208 +msgid "Editing the list %s" +msgstr "" + +#: ../src\gui\dialogs\lists.py:219 +msgid "Select a list to add the user" +msgstr "" + +#: ../src\gui\dialogs\lists.py:220 +msgid "Add" +msgstr "" + +#: ../src\gui\dialogs\lists.py:234 +msgid "Select a list to remove the user" +msgstr "" + +#: ../src\gui\dialogs\message.py:42 ../src\keystrokeEditor\constants.py:11 +msgid "New tweet" +msgstr "" + +#: ../src\gui\dialogs\message.py:76 +msgid "Attaching..." +msgstr "" + +#: ../src\gui\dialogs\message.py:77 +msgid "Uploading..." +msgstr "" + +#: ../src\gui\dialogs\message.py:96 +msgid "Unable to upload the audio" +msgstr "" + +#: ../src\gui\dialogs\message.py:110 ../src\gui\dialogs\message.py:396 +msgid "Translated" +msgstr "" + +#: ../src\gui\dialogs\message.py:122 +msgid "There's no URL to be shortened" +msgstr "" + +#: ../src\gui\dialogs\message.py:125 +msgid "URL shortened" +msgstr "" + +#: ../src\gui\dialogs\message.py:133 ../src\gui\dialogs\message.py:408 +msgid "There's no URL to be expanded" +msgstr "" + +#: ../src\gui\dialogs\message.py:136 ../src\gui\dialogs\message.py:411 +msgid "URL expanded" +msgstr "" + +#: ../src\gui\dialogs\message.py:164 ../src\gui\dialogs\message.py:219 +#: ../src\gui\dialogs\update_profile.py:51 +#: ../src\gui\dialogs\update_profile.py:88 +msgid "Upload a picture" +msgstr "" + +#: ../src\gui\dialogs\message.py:167 ../src\gui\dialogs\message.py:255 +#: ../src\gui\dialogs\message.py:346 +msgid "Spelling correction" +msgstr "" + +#: ../src\gui\dialogs\message.py:171 ../src\gui\dialogs\message.py:259 +msgid "Shorten URL" +msgstr "" + +#: ../src\gui\dialogs\message.py:173 ../src\gui\dialogs\message.py:261 +#: ../src\gui\dialogs\message.py:348 +msgid "Expand URL" +msgstr "" + +#: ../src\gui\dialogs\message.py:179 ../src\gui\dialogs\message.py:267 +msgid "Send" +msgstr "" + +#: ../src\gui\dialogs\message.py:215 ../src\gui\dialogs\message.py:226 +#: ../src\gui\dialogs\update_profile.py:84 +#: ../src\gui\dialogs\update_profile.py:95 +msgid "Discard image" +msgstr "" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif" +msgstr "" + +#: ../src\gui\dialogs\message.py:221 ../src\gui\dialogs\update_profile.py:90 +msgid "Select the picture to be uploaded" +msgstr "" + +#: ../src\gui\dialogs\message.py:249 +msgid "Recipient" +msgstr "" + +#: ../src\gui\dialogs\message.py:304 +msgid "Mention to all" +msgstr "" + +#: ../src\gui\dialogs\message.py:331 +msgid "Tweet - %i characters " +msgstr "" + +#: ../src\gui\dialogs\search.py:26 +msgid "Search on Twitter" +msgstr "" + +#: ../src\gui\dialogs\search.py:27 +msgid "Search" +msgstr "" + +#: ../src\gui\dialogs\search.py:34 +msgid "Tweets" +msgstr "" + +#: ../src\gui\dialogs\search.py:35 +msgid "Users" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:26 +msgid "Information for %s" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:30 +msgid "Details" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:39 +msgid "Go to URL" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:63 +msgid "This user does not exist on Twitter" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:68 +msgid "" +"Username: @%s\n" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:69 +msgid "" +"Name: %s\n" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:71 +msgid "" +"Location: %s\n" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:73 +msgid "" +"URL: %s\n" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:76 +msgid "" +"Bio: %s\n" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:77 +msgid "Yes" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:78 +msgid "No" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:79 +msgid "" +"Protected: %s\n" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:80 +msgid "" +"Followers: %s\n" +" Friends: %s\n" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:81 +msgid "" +"Tweets: %s\n" +msgstr "" + +#: ../src\gui\dialogs\show_user.py:82 +msgid "Favourites: %s" +msgstr "" + +#: ../src\gui\dialogs\update_profile.py:27 +msgid "Update your profile" +msgstr "" + +#: ../src\gui\dialogs\update_profile.py:29 +msgid "Name (20 characters maximum)" +msgstr "" + +#: ../src\gui\dialogs\update_profile.py:35 +msgid "Location" +msgstr "" + +#: ../src\gui\dialogs\update_profile.py:40 +msgid "Website" +msgstr "" + +#: ../src\gui\dialogs\update_profile.py:45 +msgid "Bio (160 characters maximum)" +msgstr "" + +#: ../src\gui\dialogs\update_profile.py:53 ../src\gui\sysTrayIcon.py:38 +msgid "Update profile" +msgstr "" + +#: ../src\gui\dialogs\urlList.py:26 +msgid "Select an URL" +msgstr "" + +#: ../src\gui\main.py:60 +msgid "&Update profile" +msgstr "" + +#: ../src\gui\main.py:62 +msgid "&Hide window" +msgstr "" + +#: ../src\gui\main.py:64 +msgid "&Search" +msgstr "" + +#: ../src\gui\main.py:66 +msgid "&Lists manager" +msgstr "" + +#: ../src\gui\main.py:68 +msgid "Sounds &tutorial" +msgstr "" + +#: ../src\gui\main.py:70 +msgid "&Edit keystrokes" +msgstr "" + +#: ../src\gui\main.py:72 +msgid "&Preferences" +msgstr "" + +#: ../src\gui\main.py:74 +msgid "E&xit" +msgstr "" + +#: ../src\gui\main.py:79 ../src\gui\main.py:153 +msgid "&Tweet" +msgstr "" + +#: ../src\gui\main.py:81 +msgid "Re&ply" +msgstr "" + +#: ../src\gui\main.py:83 +msgid "&Retweet" +msgstr "" + +#: ../src\gui\main.py:85 +msgid "Add to &favourites" +msgstr "" + +#: ../src\gui\main.py:87 +msgid "Remove from favo&urites" +msgstr "" + +#: ../src\gui\main.py:89 +msgid "&Show tweet" +msgstr "" + +#: ../src\gui\main.py:91 +msgid "&Delete" +msgstr "" + +#: ../src\gui\main.py:96 +msgid "&Follow" +msgstr "" + +#: ../src\gui\main.py:98 +msgid "&Unfollow" +msgstr "" + +#: ../src\gui\main.py:100 ../src\gui\main.py:127 +msgid "&Mute" +msgstr "" + +#: ../src\gui\main.py:102 +msgid "U&nmute" +msgstr "" + +#: ../src\gui\main.py:104 +msgid "&Report as spam" +msgstr "" + +#: ../src\gui\main.py:106 +msgid "&Block" +msgstr "" + +#: ../src\gui\main.py:108 +msgid "Unb&lock" +msgstr "" + +#: ../src\gui\main.py:110 +msgid "Direct me&ssage" +msgstr "" + +#: ../src\gui\main.py:112 +msgid "&Add to list" +msgstr "" + +#: ../src\gui\main.py:114 +msgid "R&emove from list" +msgstr "" + +#: ../src\gui\main.py:116 +msgid "&View lists" +msgstr "" + +#: ../src\gui\main.py:118 +msgid "Show user &profile" +msgstr "" + +#: ../src\gui\main.py:120 +msgid "&Timeline" +msgstr "" + +#: ../src\gui\main.py:122 +msgid "V&iew favourites" +msgstr "" + +#: ../src\gui\main.py:129 +msgid "&Autoread tweets for this buffer" +msgstr "" + +#: ../src\gui\main.py:131 +msgid "&Clear buffer" +msgstr "" + +#: ../src\gui\main.py:133 +msgid "&Remove buffer" +msgstr "" + +#: ../src\gui\main.py:138 +msgid "&Documentation" +msgstr "" + +#: ../src\gui\main.py:140 +msgid "&What's new in this version?" +msgstr "" + +#: ../src\gui\main.py:142 +msgid "&Check for updates" +msgstr "" + +#: ../src\gui\main.py:144 +msgid "&Report an error" +msgstr "" + +#: ../src\gui\main.py:146 +msgid "TW Blue &website" +msgstr "" + +#: ../src\gui\main.py:148 +msgid "About &TW Blue" +msgstr "" + +#: ../src\gui\main.py:152 +msgid "&Application" +msgstr "" + +#: ../src\gui\main.py:154 +msgid "&User" +msgstr "" + +#: ../src\gui\main.py:155 +msgid "&Buffer" +msgstr "" + +#: ../src\gui\main.py:156 +msgid "&Help" +msgstr "" + +#: ../src\gui\main.py:240 +msgid "Home" +msgstr "" + +#: ../src\gui\main.py:245 +msgid "Mentions" +msgstr "" + +#: ../src\gui\main.py:248 +msgid "Direct messages" +msgstr "" + +#: ../src\gui\main.py:251 +msgid "Sent" +msgstr "" + +#: ../src\gui\main.py:257 +msgid "Favourites" +msgstr "" + +#: ../src\gui\main.py:269 +msgid "Friends" +msgstr "" + +#: ../src\gui\main.py:284 +msgid "Searches" +msgstr "" + +#: ../src\gui\main.py:291 +msgid "Timelines" +msgstr "" + +#: ../src\gui\main.py:294 ../src\gui\main.py:699 +msgid "Timeline for %s" +msgstr "" + +#: ../src\gui\main.py:305 +msgid "Favourites timelines" +msgstr "" + +#: ../src\gui\main.py:308 ../src\gui\main.py:723 +msgid "Favourites for %s" +msgstr "" + +#: ../src\gui\main.py:340 +msgid "Ready" +msgstr "" + +#: ../src\gui\main.py:367 +msgid "%s favourites from %s" +msgstr "" + +#: ../src\gui\main.py:414 +msgid "Streams disconnected. TW Blue will try to reconnect in a minute." +msgstr "" + +#: ../src\gui\main.py:418 +msgid "Reconnecting streams..." +msgstr "" + +#: ../src\gui\main.py:442 +msgid "search for %s" +msgstr "" + +#: ../src\gui\main.py:447 +msgid "search users for %s" +msgstr "" + +#: ../src\gui\main.py:459 ../src\gui\main.py:470 ../src\gui\main.py:489 +msgid "Select the user" +msgstr "" + +#: ../src\gui\main.py:549 +msgid "User details" +msgstr "" + +#: ../src\gui\main.py:557 +msgid "Do you really want to delete this message? It will be eliminated from Twitter as well." +msgstr "" + +#: ../src\gui\main.py:574 +msgid "Do you really want to close TW Blue?" +msgstr "" + +#: ../src\gui\main.py:574 ../src\gui\sysTrayIcon.py:46 +msgid "Exit" +msgstr "" + +#: ../src\gui\main.py:664 +msgid "Error while adding to favourites." +msgstr "" + +#: ../src\gui\main.py:672 +msgid "Error while removing from favourites." +msgstr "" + +#: ../src\gui\main.py:676 +msgid "Individual timeline" +msgstr "" + +#: ../src\gui\main.py:680 ../src\gui\main.py:712 +msgid "The user does not exist" +msgstr "" + +#: ../src\gui\main.py:686 +msgid "Existing timeline" +msgstr "" + +#: ../src\gui\main.py:686 +msgid "There's currently a timeline for this user. You are not able to open another" +msgstr "" + +#: ../src\gui\main.py:694 +msgid "This user has no tweets. You can't open a timeline for this user" +msgstr "" + +#: ../src\gui\main.py:708 +msgid "List of favourites" +msgstr "" + +#: ../src\gui\main.py:718 +msgid "Existing list" +msgstr "" + +#: ../src\gui\main.py:718 +msgid "There's already a list of favourites for this user. You can't create another." +msgstr "" + +#: ../src\gui\main.py:727 +msgid "This user has no favourites. You can't create a list of favourites for this user." +msgstr "" + +#: ../src\gui\main.py:768 ../src\gui\main.py:781 +msgid "%s, %s of %s" +msgstr "" + +#: ../src\gui\main.py:770 ../src\gui\main.py:783 +msgid "%s. Empty" +msgstr "" + +#: ../src\gui\main.py:806 +msgid "Global mute on" +msgstr "" + +#: ../src\gui\main.py:809 +msgid "Global mute off" +msgstr "" + +#: ../src\gui\main.py:815 +msgid "Buffer mute on" +msgstr "" + +#: ../src\gui\main.py:818 +msgid "Buffer mute off" +msgstr "" + +#: ../src\gui\main.py:824 +msgid "The auto-reading of new tweets is enabled for this buffer" +msgstr "" + +#: ../src\gui\main.py:827 +msgid "The auto-reading of new tweets is disabled for this buffer" +msgstr "" + +#: ../src\gui\main.py:834 +msgid "Copied" +msgstr "" + +#: ../src\gui\main.py:845 ../src\gui\main.py:854 +msgid "%s" +msgstr "" + +#: ../src\gui\sysTrayIcon.py:36 +msgid "Preferences" +msgstr "" + +#: ../src\gui\sysTrayIcon.py:40 +msgid "Show / hide" +msgstr "" + +#: ../src\gui\sysTrayIcon.py:42 +msgid "Documentation" +msgstr "" + +#: ../src\gui\sysTrayIcon.py:44 +msgid "Check for updates" +msgstr "" + +#: ../src\issueReporter\gui.py:31 +msgid "always" +msgstr "" + +#: ../src\issueReporter\gui.py:31 +msgid "have not tried" +msgstr "" + +#: ../src\issueReporter\gui.py:31 +msgid "random" +msgstr "" + +#: ../src\issueReporter\gui.py:31 +msgid "sometimes" +msgstr "" + +#: ../src\issueReporter\gui.py:31 +msgid "unable to duplicate" +msgstr "" + +#: ../src\issueReporter\gui.py:32 +msgid "block" +msgstr "" + +#: ../src\issueReporter\gui.py:32 +msgid "crash" +msgstr "" + +#: ../src\issueReporter\gui.py:32 +msgid "feature" +msgstr "" + +#: ../src\issueReporter\gui.py:32 +msgid "major" +msgstr "" + +#: ../src\issueReporter\gui.py:32 +msgid "minor" +msgstr "" + +#: ../src\issueReporter\gui.py:32 +msgid "text" +msgstr "" + +#: ../src\issueReporter\gui.py:32 +msgid "trivial" +msgstr "" + +#: ../src\issueReporter\gui.py:32 +msgid "tweak" +msgstr "" + +#: ../src\issueReporter\gui.py:34 +msgid "Report an error" +msgstr "" + +#: ../src\issueReporter\gui.py:37 +msgid "Select a category" +msgstr "" + +#: ../src\issueReporter\gui.py:46 +msgid "Briefly describe what happened. You will be able to thoroughly explain it later" +msgstr "" + +#: ../src\issueReporter\gui.py:56 +msgid "Here, you can describe the bug in detail" +msgstr "" + +#: ../src\issueReporter\gui.py:66 +msgid "how often does this bug happen?" +msgstr "" + +#: ../src\issueReporter\gui.py:74 +msgid "Select the importance that you think this bug has" +msgstr "" + +#: ../src\issueReporter\gui.py:82 +msgid "I know that the TW Blue bug system will get my Twitter username to contact me and fix the bug quickly" +msgstr "" + +#: ../src\issueReporter\gui.py:85 +msgid "Send report" +msgstr "" + +#: ../src\issueReporter\gui.py:98 +msgid "You must fill out both fields" +msgstr "" + +#: ../src\issueReporter\gui.py:101 +msgid "You need to mark the checkbox to provide us your twitter username to contact to you if is necessary." +msgstr "" + +#: ../src\issueReporter\gui.py:120 +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 "" + +#: ../src\issueReporter\gui.py:120 +msgid "reported" +msgstr "" + +#: ../src\issueReporter\gui.py:123 +msgid "Error while reporting" +msgstr "" + +#: ../src\issueReporter\gui.py:123 +msgid "Something unexpected occurred while trying to report the bug. Please, try again later" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:4 +msgid "Go up up on the current list" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:5 +msgid "Go down up on the current list" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:6 +msgid "Go to the previous tab" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:7 +msgid "Go to the next tab" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:8 +msgid "Move up one tweet in the conversation" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:9 +msgid "Move down one tweet in the conversation" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:10 +msgid "Show the graphical interface" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:12 +msgid "Reply to a tweet" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:14 +msgid "Send direct message" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:15 +msgid "Mark as favourite" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:16 +msgid "Remove from favourites" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:17 +msgid "Open the actions dialogue" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:18 +msgid "See user details" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:19 +msgid "Show tweet" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:20 +msgid "Quit" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:21 +msgid "Open user timeline" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:22 +msgid "Remove buffer" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:23 +msgid "Open URL on the current tweet, or further information for a friend or follower" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:24 +msgid "Attempt to play audio" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:25 +msgid "Increase volume by 5%" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:26 +msgid "Decrease volume by 5%" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:27 +msgid "Go to the first element on the list" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:28 +msgid "Go to the last element on the list" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:29 +msgid "Move 20 elements up on the current list" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:30 +msgid "Move 20 elements down on the current list" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:31 +msgid "Edit profile" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:32 +msgid "Remove a tweet or direct message" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:33 +msgid "Empty the buffer removing all the elements" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:34 +msgid "Listen the current message" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:35 +msgid "Copy to clipboard" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:36 +msgid "Add to list" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:37 +msgid "Remove from list" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:38 +msgid "Mutes/unmutes the active buffer" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:39 +msgid "Globally mute/unmute TW Blue" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:40 +msgid "toggles the automatic reading of incoming tweets in the active buffer" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:41 +msgid "Search on twitter" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:42 +msgid "Shows the keystroke editor" +msgstr "" + +#: ../src\keystrokeEditor\constants.py:43 +msgid "Show lists for a specified user" +msgstr "" + +#: ../src\keystrokeEditor\gui.py:10 +msgid "Keystroke editor" +msgstr "" + +#: ../src\keystrokeEditor\gui.py:16 +msgid "Select a keystroke to edit" +msgstr "" + +#: ../src\keystrokeEditor\gui.py:17 +msgid "Keystroke" +msgstr "" + +#: ../src\keystrokeEditor\gui.py:54 +msgid "Editing keystroke" +msgstr "" + +#: ../src\keystrokeEditor\gui.py:61 +msgid "Control" +msgstr "" + +#: ../src\keystrokeEditor\gui.py:62 +msgid "Alt" +msgstr "" + +#: ../src\keystrokeEditor\gui.py:63 +msgid "Shift" +msgstr "" + +#: ../src\keystrokeEditor\gui.py:64 +msgid "Windows" +msgstr "" + +#: ../src\keystrokeEditor\gui.py:70 +msgid "Key" +msgstr "" + +#: ../src\keystrokeEditor\gui.py:99 +msgid "You need to use the Windows key" +msgstr "" + +#: ../src\keystrokeEditor\gui.py:99 ../src\keystrokeEditor\gui.py:112 +msgid "Invalid keystroke" +msgstr "" + +#: ../src\keystrokeEditor\gui.py:112 +msgid "You must provide a character for the keystroke" +msgstr "" + +#: ../src\languageHandler.py:95 +msgid "User default" +msgstr "" + +#: ../src\sessionmanager\gui.py:19 +msgid "Session manager" +msgstr "" + +#: ../src\sessionmanager\gui.py:23 +msgid "Select a twitter account to start TW Blue" +msgstr "" + +#: ../src\sessionmanager\gui.py:25 +msgid "Account" +msgstr "" + +#: ../src\sessionmanager\gui.py:30 +msgid "New account" +msgstr "" + +#: ../src\sessionmanager\gui.py:67 +msgid "Account Error" +msgstr "" + +#: ../src\sessionmanager\gui.py:67 +msgid "You need to configure an account." +msgstr "" + +#: ../src\sessionmanager\gui.py:83 +msgid "The request for the required Twitter authorization to continue will be opened on your browser. You only need to do it once. Would you like to autorhise a new account now?" +msgstr "" + +#: ../src\sessionmanager\gui.py:94 +msgid "Invalid user token" +msgstr "" + +#: ../src\sessionmanager\gui.py:94 +msgid "Your access token is invalid or the authorisation has failed. Please try again." +msgstr "" + +#: ../src\sessionmanager\gui.py:97 +msgid "Authorised account %d" +msgstr "" + +#: ../src\twitter\buffers\indibidual.py:26 +msgid "One tweet from %s" +msgstr "" + +#: ../src\twitter\buffers\indibidual.py:35 +msgid "One tweet from %s in the list %s" +msgstr "" + +#: ../src\twitter\buffers\stream.py:57 +msgid "One mention from %s " +msgstr "" + +#: ../src\twitter\buffers\stream.py:69 +msgid "One direct message" +msgstr "" + +#: ../src\twitter\compose.py:22 +msgid "About a week ago" +msgstr "" + +#: ../src\twitter\compose.py:24 +msgid "About {} weeks ago" +msgstr "" + +#: ../src\twitter\compose.py:26 +msgid "A month ago" +msgstr "" + +#: ../src\twitter\compose.py:28 +msgid "About {} months ago" +msgstr "" + +#: ../src\twitter\compose.py:30 +msgid "About a year ago" +msgstr "" + +#: ../src\twitter\compose.py:32 +msgid "About {} years ago" +msgstr "" + +#: ../src\twitter\compose.py:34 +msgid "About 1 day ago" +msgstr "" + +#: ../src\twitter\compose.py:36 +msgid "About {} days ago" +msgstr "" + +#: ../src\twitter\compose.py:38 +msgid "just now" +msgstr "" + +#: ../src\twitter\compose.py:40 +msgid "{} seconds ago" +msgstr "" + +#: ../src\twitter\compose.py:42 +msgid "1 minute ago" +msgstr "" + +#: ../src\twitter\compose.py:44 +msgid "{} minutes ago" +msgstr "" + +#: ../src\twitter\compose.py:46 +msgid "About 1 hour ago" +msgstr "" + +#: ../src\twitter\compose.py:48 +msgid "About {} hours ago" +msgstr "" + +#: ../src\twitter\compose.py:52 +msgid "January" +msgstr "" + +#: ../src\twitter\compose.py:53 +msgid "February" +msgstr "" + +#: ../src\twitter\compose.py:54 +msgid "March" +msgstr "" + +#: ../src\twitter\compose.py:55 +msgid "April" +msgstr "" + +#: ../src\twitter\compose.py:56 +msgid "May" +msgstr "" + +#: ../src\twitter\compose.py:57 +msgid "June" +msgstr "" + +#: ../src\twitter\compose.py:58 +msgid "July" +msgstr "" + +#: ../src\twitter\compose.py:59 +msgid "August" +msgstr "" + +#: ../src\twitter\compose.py:60 +msgid "September" +msgstr "" + +#: ../src\twitter\compose.py:61 +msgid "October" +msgstr "" + +#: ../src\twitter\compose.py:62 +msgid "November" +msgstr "" + +#: ../src\twitter\compose.py:63 +msgid "December" +msgstr "" + +#: ../src\twitter\compose.py:66 +msgid "Sunday" +msgstr "" + +#: ../src\twitter\compose.py:67 +msgid "Monday" +msgstr "" + +#: ../src\twitter\compose.py:68 +msgid "Tuesday" +msgstr "" + +#: ../src\twitter\compose.py:69 +msgid "Wednesday" +msgstr "" + +#: ../src\twitter\compose.py:70 +msgid "Thursday" +msgstr "" + +#: ../src\twitter\compose.py:71 +msgid "Friday" +msgstr "" + +#: ../src\twitter\compose.py:72 +msgid "Saturday" +msgstr "" + +#: ../src\twitter\compose.py:75 +msgid "sun" +msgstr "" + +#: ../src\twitter\compose.py:76 +msgid "mon" +msgstr "" + +#: ../src\twitter\compose.py:77 +msgid "tue" +msgstr "" + +#: ../src\twitter\compose.py:78 +msgid "wed" +msgstr "" + +#: ../src\twitter\compose.py:79 +msgid "thu" +msgstr "" + +#: ../src\twitter\compose.py:80 +msgid "fri" +msgstr "" + +#: ../src\twitter\compose.py:81 +msgid "sat" +msgstr "" + +#: ../src\twitter\compose.py:85 +msgid "jan" +msgstr "" + +#: ../src\twitter\compose.py:86 +msgid "feb" +msgstr "" + +#: ../src\twitter\compose.py:87 +msgid "mar" +msgstr "" + +#: ../src\twitter\compose.py:88 +msgid "apr" +msgstr "" + +#: ../src\twitter\compose.py:89 +msgid "may" +msgstr "" + +#: ../src\twitter\compose.py:90 +msgid "jun" +msgstr "" + +#: ../src\twitter\compose.py:91 +msgid "jul" +msgstr "" + +#: ../src\twitter\compose.py:92 +msgid "aug" +msgstr "" + +#: ../src\twitter\compose.py:93 +msgid "sep" +msgstr "" + +#: ../src\twitter\compose.py:94 +msgid "oct" +msgstr "" + +#: ../src\twitter\compose.py:95 +msgid "nov" +msgstr "" + +#: ../src\twitter\compose.py:96 +msgid "dec" +msgstr "" + +#: ../src\twitter\compose.py:147 ../src\twitter\compose.py:173 +#: ../src\twitter\compose.py:183 +msgid "%A, %B %d, %Y at %I:%M:%S %p" +msgstr "" + +#: ../src\twitter\compose.py:152 +msgid "Dm to %s " +msgstr "" + +#: ../src\twitter\compose.py:185 +msgid "Unavailable" +msgstr "" + +#: ../src\twitter\compose.py:186 +msgid "%s (@%s). %s followers, %s friends, %s tweets. Last tweet on %s. Joined Twitter on %s" +msgstr "" + +#: ../src\twitter\compose.py:190 +msgid "You've blocked %s" +msgstr "" + +#: ../src\twitter\compose.py:192 +msgid "You've unblocked %s" +msgstr "" + +#: ../src\twitter\compose.py:195 +msgid "%s(@%s) has followed you" +msgstr "" + +#: ../src\twitter\compose.py:197 +msgid "You've followed %s(@%s)" +msgstr "" + +#: ../src\twitter\compose.py:199 +msgid "You've unfollowed %s (@%s)" +msgstr "" + +#: ../src\twitter\compose.py:202 +msgid "You've added to favourites: %s, %s" +msgstr "" + +#: ../src\twitter\compose.py:204 +msgid "%s(@%s) has marked as favorite: %s" +msgstr "" + +#: ../src\twitter\compose.py:206 +msgid "You've removed from favourites: %s, %s" +msgstr "" + +#: ../src\twitter\compose.py:207 +msgid "%s(@%s) has removed from favourites: %s" +msgstr "" + +#: ../src\twitter\compose.py:209 +msgid "You've created the list %s" +msgstr "" + +#: ../src\twitter\compose.py:211 +msgid "You've deleted the list %s" +msgstr "" + +#: ../src\twitter\compose.py:213 +msgid "You've updated the list %s" +msgstr "" + +#: ../src\twitter\compose.py:215 +msgid "You've added %s(@%s) to the list %s" +msgstr "" + +#: ../src\twitter\compose.py:216 +msgid "%s(@%s) has added you to the list %s" +msgstr "" + +#: ../src\twitter\compose.py:218 +msgid "You'be removed %s(@%s) from the list %s" +msgstr "" + +#: ../src\twitter\compose.py:219 +msgid "%s(@%s) has removed you from the list %s" +msgstr "" + +#: ../src\twitter\compose.py:221 +msgid "You've subscribed to the list %s, which is owned by %s(@%s)" +msgstr "" + +#: ../src\twitter\compose.py:222 +msgid "%s(@%s) has suscribed you to the list %s" +msgstr "" + +#: ../src\twitter\compose.py:224 +msgid "You've unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "" + +#: ../src\twitter\compose.py:225 +msgid "You've been unsubscribed from the list %s, which is owned by %s(@%s)" +msgstr "" + +#: ../src\twitter\compose.py:226 +msgid "Unknown" +msgstr "" + +#: ../src\twitter\compose.py:232 +msgid "No description available" +msgstr "" + +#: ../src\twitter\compose.py:236 +msgid "private" +msgstr "" + +#: ../src\twitter\compose.py:237 +msgid "public" +msgstr "" + +#: ../src\twitter\twitter.py:74 +msgid "%s failed. Reason: %s" +msgstr "" + +#: ../src\twitter\twitter.py:81 +msgid "%s succeeded." +msgstr "" + +#: ../src\updater\update_manager.py:14 +msgid "Your TW Blue version is up to date" +msgstr "" + +#: ../src\updater\update_manager.py:14 ../src\updater\update_manager.py:27 +msgid "Update" +msgstr "" + +#: ../src\updater\update_manager.py:20 +msgid "New version for %s" +msgstr "" + +#: ../src\updater\update_manager.py:20 +msgid "There's a new TW Blue version available. Would you like to download it now?" +msgstr "" + +#: ../src\updater\update_manager.py:22 +msgid "Download in Progress" +msgstr "" + +#: ../src\updater\update_manager.py:22 +msgid "Downloading the new version..." +msgstr "" + +#: ../src\updater\update_manager.py:29 +msgid "Done!" +msgstr "" + +#: ../src\updater\update_manager.py:29 +msgid "The new TW Blue version has been downloaded and installed. Press OK to start the application." +msgstr "" +