From 9992882366a0422c321006a612593c3e35399c63 Mon Sep 17 00:00:00 2001 From: Kiv Date: Tue, 15 Feb 2011 19:20:46 -0400 Subject: [PATCH 001/190] Add GUI as standalone script. --- guiminer.py | 236 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 236 insertions(+) create mode 100644 guiminer.py diff --git a/guiminer.py b/guiminer.py new file mode 100644 index 0000000..556a2c9 --- /dev/null +++ b/guiminer.py @@ -0,0 +1,236 @@ +import sys, os, subprocess, errno +import wx +import json + + +def get_opencl_devices(): + # TODO: get the real devices from opencl + return [_("[0] Juniper"), _("[1] Intel")] + +def _mkdir_p(path): + try: + os.makedirs(path) + except OSError as exc: # Python >2.5 + if exc.errno == errno.EEXIST: + pass + else: raise + +class ProfilePanel(wx.Panel): + def __init__(self, parent, id, name, devices): + wx.Panel.__init__(self, parent, id) + self.name = name + self.is_mining = False + self.miner = None + self.server_lbl = wx.StaticText(self, -1, _("Server:")) + self.txt_server = wx.TextCtrl(self, -1, _("mining.bitcoin.cz")) + self.port_lbl = wx.StaticText(self, -1, _("Port:")) + self.txt_port = wx.TextCtrl(self, -1, _("8332")) + self.user_lbl = wx.StaticText(self, -1, _("Username:")) + self.txt_username = wx.TextCtrl(self, -1, _("Kiv.GPU")) + self.pass_lbl = wx.StaticText(self, -1, _("Password:")) + self.txt_pass = wx.TextCtrl(self, -1, _("gpumine6794"), style=wx.TE_PASSWORD) + self.device_lbl = wx.StaticText(self, -1, _("Device:")) + self.combo_device = wx.ComboBox(self, -1, choices=devices, style=wx.CB_DROPDOWN) + self.flags_lbl = wx.StaticText(self, -1, _("Extra flags:")) + self.txt_flags = wx.TextCtrl(self, -1, _("-v -w128 -r5")) + self.start = wx.Button(self, -1, _("Start mining!")) + + self.__set_properties() + self.__do_layout() + + self.start.Bind(wx.EVT_BUTTON, self.toggle_mining) + + def __set_properties(self): + self.combo_device.SetSelection(0) + + def __do_layout(self): + sizer_2 = wx.BoxSizer(wx.VERTICAL) + grid_sizer_1 = wx.FlexGridSizer(3, 4, 5, 5) + sizer_2.Add((20, 10), 0, wx.EXPAND, 0) + grid_sizer_1.Add(self.server_lbl, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) + grid_sizer_1.Add(self.txt_server, 0, wx.EXPAND, 0) + grid_sizer_1.Add(self.port_lbl, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) + grid_sizer_1.Add(self.txt_port, 0, wx.EXPAND, 0) + grid_sizer_1.Add(self.user_lbl, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) + grid_sizer_1.Add(self.txt_username, 0, wx.EXPAND, 0) + grid_sizer_1.Add(self.pass_lbl, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) + grid_sizer_1.Add(self.txt_pass, 0, wx.EXPAND, 0) + grid_sizer_1.Add(self.device_lbl, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) + grid_sizer_1.Add(self.combo_device, 0, wx.EXPAND, 0) + grid_sizer_1.Add(self.flags_lbl, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) + grid_sizer_1.Add(self.txt_flags, 0, wx.EXPAND, 0) + grid_sizer_1.AddGrowableCol(0) + grid_sizer_1.AddGrowableCol(1) + grid_sizer_1.AddGrowableCol(2) + grid_sizer_1.AddGrowableCol(3) + sizer_2.Add(grid_sizer_1, 1, wx.EXPAND, 0) + sizer_2.Add(self.start, 0, wx.ALIGN_BOTTOM|wx.ALIGN_CENTER_HORIZONTAL, 0) + self.SetSizer(sizer_2) + + def toggle_mining(self, event): + if self.is_mining: + self.stop_mining() + self.start.SetLabel("Start mining!") + else: + self.start_mining() + self.start.SetLabel("Stop mining") + + def get_data(self): + return dict(name=self.name, + server=self.txt_server.GetValue(), + port=self.txt_port.GetValue(), + username=self.txt_username.GetValue(), + password=self.txt_pass.GetValue(), + device=self.combo_device.GetSelection(), # TODO this is probably not adequate + flags=self.txt_flags.GetValue()) + + def set_data(self, data): + self.name = data['name'] + self.txt_server.SetValue(data['server']) + self.txt_port.SetValue(data['port']) + self.txt_pass.SetValue(data['password']) + self.combo_device.SetSelection(data['device']) + self.txt_flags.SetValue(data['flags']) + + def start_mining(self): + # TODO handle no devices found + folder = "c:/program files (x86)/Bitcoin/" # TODO + executable = os.path.join(folder, "poclbm.exe") + cmd = "%s --user=%s --pass=%s -o %s -p %s -d%d %s" % ( + executable, + self.txt_username.GetValue(), + self.txt_pass.GetValue(), + self.txt_server.GetValue(), + self.txt_port.GetValue(), + self.combo_device.GetSelection(), + self.txt_flags.GetValue() + ) + try: + self.miner = subprocess.Popen(cmd, cwd=folder) + except OSError: + raise #TODO + self.is_mining = True + + def stop_mining(self): + if self.miner is not None: + self.miner.terminate() + self.is_mining = False + # TODO: stop all miners on program shutdown + +class MyFrame(wx.Frame): + def __init__(self, *args, **kwds): + kwds["style"] = wx.DEFAULT_FRAME_STYLE + wx.Frame.__init__(self, *args, **kwds) + self.profiles = wx.Notebook(self, -1, style=0) + self.profile_objects = [] + + # Menu Bar + self.menubar = wx.MenuBar() + wxglade_tmp_menu = wx.Menu() + wxglade_tmp_menu.Append(wx.ID_NEW, _("&New profile"), "", wx.ITEM_NORMAL) + wxglade_tmp_menu.Append(wx.ID_SAVE, _("&Save profile"), "", wx.ITEM_NORMAL) + wxglade_tmp_menu.Append(wx.ID_OPEN, _("&Load profile"), "", wx.ITEM_NORMAL) + self.menubar.Append(wxglade_tmp_menu, _("&File")) + wxglade_tmp_menu = wx.Menu() + self.ID_PATHS = wx.NewId() + wxglade_tmp_menu.Append(self.ID_PATHS, _("&Paths..."), "", wx.ITEM_NORMAL) + self.menubar.Append(wxglade_tmp_menu, _("&Settings")) + wxglade_tmp_menu = wx.Menu() + wxglade_tmp_menu.Append(wx.ID_ABOUT, _("&About..."), "", wx.ITEM_NORMAL) + self.menubar.Append(wxglade_tmp_menu, _("&Help")) + self.SetMenuBar(self.menubar) + self.statusbar = self.CreateStatusBar(2, 0) + + self.__set_properties() + self.__do_layout() + + self.Bind(wx.EVT_MENU, self.new_profile, id=wx.ID_NEW) + self.Bind(wx.EVT_MENU, self.save_profile, id=wx.ID_SAVE) + self.Bind(wx.EVT_MENU, self.load_profile, id=wx.ID_OPEN) + self.Bind(wx.EVT_MENU, self.set_paths, id=self.ID_PATHS) + self.Bind(wx.EVT_MENU, self.help_about, id=wx.ID_ABOUT) + # TODO timer to check input from workers? self.Bind(wx.EVT_TIMER, callback) + self._add_profile(dict(name="slush's pool")) + self._add_profile(dict(name="Bitpenny's pool")) + self.load_profile() + + + def __set_properties(self): + self.SetTitle(_("poclbm")) + self.statusbar.SetStatusWidths([-1, 125]) + statusbar_fields = [_("Shares accepted:172 (last at 13:29)"), _("161200 khash/s")] + for i in range(len(statusbar_fields)): + self.statusbar.SetStatusText(statusbar_fields[i], i) + + def __do_layout(self): + self.vertical_sizer = wx.BoxSizer(wx.VERTICAL) + self.vertical_sizer.Add(self.profiles, 1, wx.EXPAND, 0) + self.SetSizer(self.vertical_sizer) + self.vertical_sizer.Fit(self) + self.Layout() + # end wxGlade + + def _add_profile(self, data={}): + name = data.get('name', "Untitled") + panel = ProfilePanel(self.profiles, -1, name, get_opencl_devices()) + self.profile_objects.append(panel) + self.profiles.AddPage(panel, panel.name) + self.Layout() + + def new_profile(self, event): + print "Event handler `new_profile' not implemented!" + event.Skip() + + def _get_storage_location(self): + if sys.platform == 'win32': + folder = os.path.join(os.environ['AppData'], 'poclbm') + config_filename = os.path.join(folder, 'poclbm.ini') + else: # Assume linux? TODO test + folder = os.environ['HOME'] + config_filename = os.path.join(folder, '.poclbm') + return folder, config_filename + + def save_profile(self, event): + folder, config_filename = self._get_storage_location() + _mkdir_p(folder) + data = [p.get_data() for p in self.profile_objects] + print 'Saving:', data + with open(config_filename, 'w') as f: + json.dump(data, f) + print 'Saved ok' + + def load_profile(self, event=None): + folder, config_filename = self._get_storage_location() + if not os.path.exists(config_filename): + return # Nothing to load yet + with open(config_filename) as f: + data = json.load(f) + print 'Loaded:', data + # Stop all miners before we clobber them + for p in self.profile_objects: + p.stop_mining() + self.vertical_sizer.Detach(p) + p = [] # TODO: see if this garbage collects the old profiles + # Create new miners + for d in data: + self._add_profile(d) + + def set_paths(self, event): + print "Event handler `set_paths' not implemented!" + event.Skip() + + + def help_about(self, event): + print "Event handler `help_about' not implemented" + event.Skip() + +if __name__ == "__main__": + import gettext + gettext.install("app") # replace with the appropriate catalog name + + app = wx.PySimpleApp(0) + wx.InitAllImageHandlers() + frame_1 = MyFrame(None, -1, "") + app.SetTopWindow(frame_1) + frame_1.Show() + app.MainLoop() From b44800f77bd00357e03413a2ce915773041ecbc7 Mon Sep 17 00:00:00 2001 From: Kiv Date: Thu, 17 Feb 2011 07:59:51 -0400 Subject: [PATCH 002/190] Add mock miner for testing. GUI attaches to mock miner's stdout and reads khash updates. --- mockBitcoinMiner.py | 74 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 mockBitcoinMiner.py diff --git a/mockBitcoinMiner.py b/mockBitcoinMiner.py new file mode 100644 index 0000000..fd2c90c --- /dev/null +++ b/mockBitcoinMiner.py @@ -0,0 +1,74 @@ +import threading +import time +import random +import socket +import sys +import Queue +import datetime +import struct + +OUTPUT_SIZE = 0x100 +TIME_FORMAT = '%d/%m/%Y %H:%M:%S' + +def if_else(condition, trueVal, falseVal): + if condition: + return trueVal + else: + return falseVal + +class MockBitcoinMiner(threading.Thread): + """Mock version of class BitcoinMiner. + + Can be used to test the GUI without actually consuming any resources + or requiring PyOpenCL to be installed. + """ + def __init__(self, *args, **kwargs): + threading.Thread.__init__(self) + self.workQueue = Queue.Queue() + self.verbose = True + + def say(self, format, args=()): + print '%s,' % datetime.datetime.now().strftime(TIME_FORMAT), format % args + sys.stdout.flush() + + def sayLine(self, format, args=()): + format = '%s, %s\n' % (datetime.datetime.now().strftime(TIME_FORMAT), format) + self.say(format, args) + + def hashrate(self, rate): + self.say('%s khash/s', rate) + + def blockFound(self, hash, accepted): + self.sayLine('%s, %s', (hash, if_else(accepted, 'accepted', 'invalid or stale'))) + + def mine(self): + self.start() + try: + while True: + time.sleep(random.randint(3, 10)) + hash = random.randint(0, 0xffffffff) + accepted = (random.random() < 0.9) + self.blockFound(struct.pack('I', long(hash)).encode('hex'), accepted) + except KeyboardInterrupt: + self.workQueue.put('stop') + time.sleep(1.1) + + def run(self): + """Report the hashrate every second with a plausible value.""" + while True: + if not self.workQueue.empty(): + try: + work = self.workQueue.get(True, 1) + except Queue.Empty: + continue + else: + if work == 'stop': + return + time.sleep(1) + self.hashrate(random.randint(150000, 170000)) + +if __name__ == "__main__": + miner = MockBitcoinMiner() + miner.mine() + + From 3b4428ad6dee3b0eeb1262a20a6484212e61b6ca Mon Sep 17 00:00:00 2001 From: Kiv Date: Thu, 17 Feb 2011 22:55:26 -0400 Subject: [PATCH 003/190] Parse accepted & error messsages. Use verbose flag with real miner. --- BitcoinMiner.py | 4 +- guiminer.py | 165 +++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 138 insertions(+), 31 deletions(-) diff --git a/BitcoinMiner.py b/BitcoinMiner.py index 9215ea7..ef33883 100644 --- a/BitcoinMiner.py +++ b/BitcoinMiner.py @@ -157,7 +157,7 @@ def say(self, format, args=()): print '%s,' % datetime.now().strftime(TIME_FORMAT), format % args else: sys.stdout.write('\r \r' + format % args) - sys.stdout.flush() + sys.stdout.flush() def sayLine(self, format, args=()): if not self.verbose: @@ -325,4 +325,4 @@ def run(self): if (kernelTime < lower): globalThreads += unit elif (kernelTime > upper and globalThreads > unit): - globalThreads -= unit \ No newline at end of file + globalThreads -= unit diff --git a/guiminer.py b/guiminer.py index 556a2c9..a31785d 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1,11 +1,21 @@ -import sys, os, subprocess, errno +import sys, os, subprocess, errno, re, threading import wx import json +USE_MOCK = False + +def strip_whitespace(s): + s = re.sub(r"( +)|\t+", " ", s) + return s.strip() def get_opencl_devices(): - # TODO: get the real devices from opencl - return [_("[0] Juniper"), _("[1] Intel")] + import pyopencl + platform = pyopencl.get_platforms()[0] + devices = platform.get_devices() + if len(devices) == 0: + raise IOError + return ['[%d] %s' % (i, strip_whitespace(device.name)) + for (i, device) in enumerate(devices)] def _mkdir_p(path): try: @@ -14,31 +24,67 @@ def _mkdir_p(path): if exc.errno == errno.EEXIST: pass else: raise + +class MinerListenerThread(threading.Thread): + def __init__(self, parent, miner): + threading.Thread.__init__(self) + self.parent = parent + self.miner = miner + + def run(self): + print 'Listener started' + while True: + line = self.miner.stdout.readline().strip() + if not line: continue + match = re.search(r"accepted", line, flags=re.I) + if match is not None: + wx.CallAfter(self.parent.update_shares, True) + continue + match = re.search(r"invalid|stale", line, flags=re.I) + if match is not None: + wx.CallAfter(self.parent.update_shares, False) + continue + match = re.search(r"(\d+) khash/s", line, flags=re.I) + if match is not None: + wx.CallAfter(self.parent.update_khash, int(match.group(1))) + continue + # Possible error or new message, just pipe it through + wx.CallAfter(self.parent.update_status, line) + class ProfilePanel(wx.Panel): - def __init__(self, parent, id, name, devices): + SHARES_INDEX = 0 # Indexes into the status bar + KHASH_INDEX = 1 + def __init__(self, parent, id, name, devices, statusbar): wx.Panel.__init__(self, parent, id) + self.parent = parent self.name = name + self.statusbar = statusbar self.is_mining = False + self.is_possible_error = False self.miner = None + self.miner_listener = None + self.accepted_shares = 0 + self.invalid_shares = 0 self.server_lbl = wx.StaticText(self, -1, _("Server:")) self.txt_server = wx.TextCtrl(self, -1, _("mining.bitcoin.cz")) self.port_lbl = wx.StaticText(self, -1, _("Port:")) self.txt_port = wx.TextCtrl(self, -1, _("8332")) self.user_lbl = wx.StaticText(self, -1, _("Username:")) - self.txt_username = wx.TextCtrl(self, -1, _("Kiv.GPU")) + self.txt_username = wx.TextCtrl(self, -1, _("")) self.pass_lbl = wx.StaticText(self, -1, _("Password:")) - self.txt_pass = wx.TextCtrl(self, -1, _("gpumine6794"), style=wx.TE_PASSWORD) + self.txt_pass = wx.TextCtrl(self, -1, _(""), style=wx.TE_PASSWORD) self.device_lbl = wx.StaticText(self, -1, _("Device:")) self.combo_device = wx.ComboBox(self, -1, choices=devices, style=wx.CB_DROPDOWN) self.flags_lbl = wx.StaticText(self, -1, _("Extra flags:")) - self.txt_flags = wx.TextCtrl(self, -1, _("-v -w128 -r5")) + self.txt_flags = wx.TextCtrl(self, -1, _("")) self.start = wx.Button(self, -1, _("Start mining!")) self.__set_properties() self.__do_layout() self.start.Bind(wx.EVT_BUTTON, self.toggle_mining) + self.set_shares_statusbar_text() def __set_properties(self): self.combo_device.SetSelection(0) @@ -85,18 +131,22 @@ def get_data(self): flags=self.txt_flags.GetValue()) def set_data(self, data): - self.name = data['name'] - self.txt_server.SetValue(data['server']) - self.txt_port.SetValue(data['port']) - self.txt_pass.SetValue(data['password']) - self.combo_device.SetSelection(data['device']) - self.txt_flags.SetValue(data['flags']) + if 'name' in data: self.name = data['name'] + if 'username' in data: self.txt_username.SetValue(data['username']) + if 'server' in data: self.txt_server.SetValue(data['server']) + if 'port' in data: self.txt_port.SetValue(data['port']) + if 'password' in data: self.txt_pass.SetValue(data['password']) + if 'device' in data: self.combo_device.SetSelection(data['device']) + if 'flags' in data: self.txt_flags.SetValue(data['flags']) def start_mining(self): - # TODO handle no devices found - folder = "c:/program files (x86)/Bitcoin/" # TODO - executable = os.path.join(folder, "poclbm.exe") - cmd = "%s --user=%s --pass=%s -o %s -p %s -d%d %s" % ( + folder = os.path.dirname(__file__) + if USE_MOCK: + + executable = "python mockBitcoinMiner.py" + else: + executable = "python poclbm.py" + cmd = "%s --user=%s --pass=%s -o %s -p %s -d%d --verbose %s" % ( executable, self.txt_username.GetValue(), self.txt_pass.GetValue(), @@ -106,16 +156,55 @@ def start_mining(self): self.txt_flags.GetValue() ) try: - self.miner = subprocess.Popen(cmd, cwd=folder) + print 'Running command: ', cmd + self.miner = subprocess.Popen(cmd, cwd=folder, stdout=subprocess.PIPE) except OSError: raise #TODO + self.miner_listener = MinerListenerThread(self, self.miner) + self.miner_listener.daemon = True + self.miner_listener.start() self.is_mining = True + self.statusbar.SetStatusText("Starting...", 1) + def stop_mining(self): if self.miner is not None: self.miner.terminate() + self.miner = None + if self.miner_listener is not None: + self.miner_listener = None + # TODO: kill the listener thread self.is_mining = False # TODO: stop all miners on program shutdown + self.statusbar.SetStatusText("Stopped", 1) + + def update_khash(self, rate): + if rate > 1000: + text = "%.1f Mhash/s" % (rate/1000.) + else: + text = "%d khash/s" % rate + self.statusbar.SetStatusText(text, ProfilePanel.KHASH_INDEX) + if self.is_possible_error: + set_shares_statusbar_text() + self.is_possible_error = False + + def set_shares_statusbar_text(self): + text = "Shares: %d accepted, %d stale/invalid" % \ + (self.accepted_shares, self.invalid_shares) + self.statusbar.SetStatusText(text, ProfilePanel.SHARES_INDEX) + + def update_shares(self, accepted): + if accepted: + self.accepted_shares += 1 + else: + self.invalid_shares += 1 + self.set_shares_statusbar_text() + + def update_status(self, msg): + self.statusbar.SetStatusText(msg, 0) + self.is_possible_error = True + + class MyFrame(wx.Frame): def __init__(self, *args, **kwds): @@ -127,7 +216,7 @@ def __init__(self, *args, **kwds): # Menu Bar self.menubar = wx.MenuBar() wxglade_tmp_menu = wx.Menu() - wxglade_tmp_menu.Append(wx.ID_NEW, _("&New profile"), "", wx.ITEM_NORMAL) + #wxglade_tmp_menu.Append(wx.ID_NEW, _("&New profile"), "", wx.ITEM_NORMAL) # TODO wxglade_tmp_menu.Append(wx.ID_SAVE, _("&Save profile"), "", wx.ITEM_NORMAL) wxglade_tmp_menu.Append(wx.ID_OPEN, _("&Load profile"), "", wx.ITEM_NORMAL) self.menubar.Append(wxglade_tmp_menu, _("&File")) @@ -144,22 +233,37 @@ def __init__(self, *args, **kwds): self.__set_properties() self.__do_layout() + try: + self.devices = get_opencl_devices() + except: + dialog = wx.MessageDialog(self, +"""Couldn't find any OpenCL devices. +Check that your video card supports OpenCL and that you have a working version of OpenCL installed. +If you have an AMD/ATI card you may need to install the ATI Stream SDK.""", + "No OpenCL devices found.", + wx.OK | wx.ICON_ERROR) + dialog.ShowModal() + dialog.Destroy() + sys.exit(1) + self.Bind(wx.EVT_MENU, self.new_profile, id=wx.ID_NEW) self.Bind(wx.EVT_MENU, self.save_profile, id=wx.ID_SAVE) self.Bind(wx.EVT_MENU, self.load_profile, id=wx.ID_OPEN) self.Bind(wx.EVT_MENU, self.set_paths, id=self.ID_PATHS) self.Bind(wx.EVT_MENU, self.help_about, id=wx.ID_ABOUT) # TODO timer to check input from workers? self.Bind(wx.EVT_TIMER, callback) - self._add_profile(dict(name="slush's pool")) - self._add_profile(dict(name="Bitpenny's pool")) - self.load_profile() - + any_loaded = self.load_profile() + if not any_loaded: # Create a default one for them to use + p = self._add_profile() + p.set_data(dict(name="slush's pool")) + + def __set_properties(self): self.SetTitle(_("poclbm")) self.statusbar.SetStatusWidths([-1, 125]) - statusbar_fields = [_("Shares accepted:172 (last at 13:29)"), _("161200 khash/s")] - for i in range(len(statusbar_fields)): + statusbar_fields = [_(""), _("Not started")] + for i in range(len(statusbar_fields)): self.statusbar.SetStatusText(statusbar_fields[i], i) def __do_layout(self): @@ -170,12 +274,13 @@ def __do_layout(self): self.Layout() # end wxGlade - def _add_profile(self, data={}): - name = data.get('name', "Untitled") - panel = ProfilePanel(self.profiles, -1, name, get_opencl_devices()) + def _add_profile(self): + panel = ProfilePanel(self.profiles, -1, "Untitled", self.devices, self.statusbar) self.profile_objects.append(panel) self.profiles.AddPage(panel, panel.name) + self.vertical_sizer.Fit(self) self.Layout() + return panel def new_profile(self, event): print "Event handler `new_profile' not implemented!" @@ -213,7 +318,9 @@ def load_profile(self, event=None): p = [] # TODO: see if this garbage collects the old profiles # Create new miners for d in data: - self._add_profile(d) + panel = self._add_profile() + panel.set_data(d) + return any(data) def set_paths(self, event): print "Event handler `set_paths' not implemented!" From 577c4fbb16660946d71f870983777eadb1f53273 Mon Sep 17 00:00:00 2001 From: Kiv Date: Mon, 21 Feb 2011 21:31:57 -0400 Subject: [PATCH 004/190] Use FlatNotebook widget so we can close tabs. Support multiple tabs. Shutdown miner thread on exit. Add about dialog. --- guiminer.py | 151 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 106 insertions(+), 45 deletions(-) diff --git a/guiminer.py b/guiminer.py index a31785d..e2c3b19 100644 --- a/guiminer.py +++ b/guiminer.py @@ -2,7 +2,9 @@ import wx import json -USE_MOCK = False +from wx.lib.agw import flatnotebook as fnb + +USE_MOCK = True def strip_whitespace(s): s = re.sub(r"( +)|\t+", " ", s) @@ -14,7 +16,7 @@ def get_opencl_devices(): devices = platform.get_devices() if len(devices) == 0: raise IOError - return ['[%d] %s' % (i, strip_whitespace(device.name)) + return ['[%d] %s' % (i, strip_whitespace(device.name)[:25]) for (i, device) in enumerate(devices)] def _mkdir_p(path): @@ -28,12 +30,13 @@ def _mkdir_p(path): class MinerListenerThread(threading.Thread): def __init__(self, parent, miner): threading.Thread.__init__(self) + self.shutdown_event = threading.Event() self.parent = parent self.miner = miner def run(self): print 'Listener started' - while True: + while not self.shutdown_event.is_set(): line = self.miner.stdout.readline().strip() if not line: continue match = re.search(r"accepted", line, flags=re.I) @@ -49,7 +52,8 @@ def run(self): wx.CallAfter(self.parent.update_khash, int(match.group(1))) continue # Possible error or new message, just pipe it through - wx.CallAfter(self.parent.update_status, line) + wx.CallAfter(self.parent.update_status, line) + print 'Listener shutting down' class ProfilePanel(wx.Panel): @@ -65,7 +69,8 @@ def __init__(self, parent, id, name, devices, statusbar): self.miner = None self.miner_listener = None self.accepted_shares = 0 - self.invalid_shares = 0 + self.invalid_shares = 0 + self.last_rate = 0 self.server_lbl = wx.StaticText(self, -1, _("Server:")) self.txt_server = wx.TextCtrl(self, -1, _("mining.bitcoin.cz")) self.port_lbl = wx.StaticText(self, -1, _("Port:")) @@ -83,7 +88,7 @@ def __init__(self, parent, id, name, devices, statusbar): self.__set_properties() self.__do_layout() - self.start.Bind(wx.EVT_BUTTON, self.toggle_mining) + self.start.Bind(wx.EVT_BUTTON, self.toggle_mining) self.set_shares_statusbar_text() def __set_properties(self): @@ -105,13 +110,11 @@ def __do_layout(self): grid_sizer_1.Add(self.combo_device, 0, wx.EXPAND, 0) grid_sizer_1.Add(self.flags_lbl, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_1.Add(self.txt_flags, 0, wx.EXPAND, 0) - grid_sizer_1.AddGrowableCol(0) grid_sizer_1.AddGrowableCol(1) - grid_sizer_1.AddGrowableCol(2) grid_sizer_1.AddGrowableCol(3) sizer_2.Add(grid_sizer_1, 1, wx.EXPAND, 0) sizer_2.Add(self.start, 0, wx.ALIGN_BOTTOM|wx.ALIGN_CENTER_HORIZONTAL, 0) - self.SetSizer(sizer_2) + self.SetSizerAndFit(sizer_2) def toggle_mining(self, event): if self.is_mining: @@ -164,7 +167,7 @@ def start_mining(self): self.miner_listener.daemon = True self.miner_listener.start() self.is_mining = True - self.statusbar.SetStatusText("Starting...", 1) + self.set_status("Starting...", 1) def stop_mining(self): @@ -172,26 +175,27 @@ def stop_mining(self): self.miner.terminate() self.miner = None if self.miner_listener is not None: - self.miner_listener = None - # TODO: kill the listener thread + self.miner_listener.shutdown_event.set() + self.miner_listener = None self.is_mining = False # TODO: stop all miners on program shutdown - self.statusbar.SetStatusText("Stopped", 1) + self.set_status("Stopped", 1) def update_khash(self, rate): + self.last_rate = rate if rate > 1000: text = "%.1f Mhash/s" % (rate/1000.) else: text = "%d khash/s" % rate - self.statusbar.SetStatusText(text, ProfilePanel.KHASH_INDEX) + self.set_status(text, ProfilePanel.KHASH_INDEX) if self.is_possible_error: - set_shares_statusbar_text() + self.set_shares_statusbar_text() self.is_possible_error = False def set_shares_statusbar_text(self): text = "Shares: %d accepted, %d stale/invalid" % \ (self.accepted_shares, self.invalid_shares) - self.statusbar.SetStatusText(text, ProfilePanel.SHARES_INDEX) + self.set_status(text, ProfilePanel.SHARES_INDEX) def update_shares(self, accepted): if accepted: @@ -201,29 +205,37 @@ def update_shares(self, accepted): self.set_shares_statusbar_text() def update_status(self, msg): - self.statusbar.SetStatusText(msg, 0) + self.set_status(msg) self.is_possible_error = True + def set_status(self, msg, index=0): + """Set the current statusbar text, but only if we have focus.""" + if self.parent.GetSelection() == self.parent.GetPageIndex(self): + self.statusbar.SetStatusText(msg, index) + def on_focus(self): + """When we receive focus, update our status.""" + self.set_shares_statusbar_text() + self.update_khash(self.last_rate) class MyFrame(wx.Frame): def __init__(self, *args, **kwds): - kwds["style"] = wx.DEFAULT_FRAME_STYLE wx.Frame.__init__(self, *args, **kwds) - self.profiles = wx.Notebook(self, -1, style=0) + style = fnb.FNB_X_ON_TAB | fnb.FNB_FF2 | fnb.FNB_NO_NAV_BUTTONS + self.profiles = fnb.FlatNotebook(self, -1, style=style) self.profile_objects = [] # Menu Bar self.menubar = wx.MenuBar() wxglade_tmp_menu = wx.Menu() - #wxglade_tmp_menu.Append(wx.ID_NEW, _("&New profile"), "", wx.ITEM_NORMAL) # TODO - wxglade_tmp_menu.Append(wx.ID_SAVE, _("&Save profile"), "", wx.ITEM_NORMAL) - wxglade_tmp_menu.Append(wx.ID_OPEN, _("&Load profile"), "", wx.ITEM_NORMAL) + wxglade_tmp_menu.Append(wx.ID_NEW, _("&New profiles..."), "", wx.ITEM_NORMAL) # TODO + wxglade_tmp_menu.Append(wx.ID_SAVE, _("&Save profiles"), "", wx.ITEM_NORMAL) + wxglade_tmp_menu.Append(wx.ID_OPEN, _("&Load profiles"), "", wx.ITEM_NORMAL) self.menubar.Append(wxglade_tmp_menu, _("&File")) - wxglade_tmp_menu = wx.Menu() + #wxglade_tmp_menu = wx.Menu() self.ID_PATHS = wx.NewId() - wxglade_tmp_menu.Append(self.ID_PATHS, _("&Paths..."), "", wx.ITEM_NORMAL) - self.menubar.Append(wxglade_tmp_menu, _("&Settings")) + #wxglade_tmp_menu.Append(self.ID_PATHS, _("&Paths..."), "", wx.ITEM_NORMAL) + #self.menubar.Append(wxglade_tmp_menu, _("&Settings")) wxglade_tmp_menu = wx.Menu() wxglade_tmp_menu.Append(wx.ID_ABOUT, _("&About..."), "", wx.ITEM_NORMAL) self.menubar.Append(wxglade_tmp_menu, _("&Help")) @@ -231,7 +243,6 @@ def __init__(self, *args, **kwds): self.statusbar = self.CreateStatusBar(2, 0) self.__set_properties() - self.__do_layout() try: self.devices = get_opencl_devices() @@ -251,13 +262,17 @@ def __init__(self, *args, **kwds): self.Bind(wx.EVT_MENU, self.load_profile, id=wx.ID_OPEN) self.Bind(wx.EVT_MENU, self.set_paths, id=self.ID_PATHS) self.Bind(wx.EVT_MENU, self.help_about, id=wx.ID_ABOUT) - # TODO timer to check input from workers? self.Bind(wx.EVT_TIMER, callback) + self.Bind(wx.EVT_CLOSE, self.on_close) + + self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CLOSING, self.on_page_closing) + self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CHANGED, self.on_page_changed) - any_loaded = self.load_profile() + any_loaded = self.load_profile() if not any_loaded: # Create a default one for them to use p = self._add_profile() p.set_data(dict(name="slush's pool")) + self.__do_layout() def __set_properties(self): self.SetTitle(_("poclbm")) @@ -270,21 +285,22 @@ def __do_layout(self): self.vertical_sizer = wx.BoxSizer(wx.VERTICAL) self.vertical_sizer.Add(self.profiles, 1, wx.EXPAND, 0) self.SetSizer(self.vertical_sizer) - self.vertical_sizer.Fit(self) - self.Layout() - # end wxGlade + self.vertical_sizer.SetSizeHints(self) + self.SetSizerAndFit(self.vertical_sizer) - def _add_profile(self): - panel = ProfilePanel(self.profiles, -1, "Untitled", self.devices, self.statusbar) + def _add_profile(self, name="Default miner"): + panel = ProfilePanel(self.profiles, -1, name, self.devices, self.statusbar) self.profile_objects.append(panel) self.profiles.AddPage(panel, panel.name) - self.vertical_sizer.Fit(self) - self.Layout() + # Select new profile which is the last one. + self.profiles.EnsureVisible(self.profiles.GetPageCount()-1) + self.__do_layout() return panel def new_profile(self, event): - print "Event handler `new_profile' not implemented!" - event.Skip() + dialog = wx.TextEntryDialog(self, "Name this miner:", "New miner") + if dialog.ShowModal() == wx.ID_OK: + self._add_profile(dialog.GetValue()) def _get_storage_location(self): if sys.platform == 'win32': @@ -302,20 +318,38 @@ def save_profile(self, event): print 'Saving:', data with open(config_filename, 'w') as f: json.dump(data, f) - print 'Saved ok' + dlg = wx.MessageDialog(self, "Profiles saved successfully!", + "Save successful", wx.OK|wx.ICON_INFORMATION) + dlg.ShowModal() + dlg.Destroy() + + def on_close(self, event): + """On closing, stop any miners that are currently working.""" + for p in self.profile_objects: + p.stop_mining() + event.Skip() def load_profile(self, event=None): + """Load JSON profile info from the poclbm config file.""" folder, config_filename = self._get_storage_location() if not os.path.exists(config_filename): return # Nothing to load yet with open(config_filename) as f: data = json.load(f) print 'Loaded:', data - # Stop all miners before we clobber them - for p in self.profile_objects: + if(any(p.is_mining for p in self.profile_objects)): + dlg = wx.MessageDialog(self, + "Loading profiles will stop any currently running miners. Continue?", + "Load profile", wx.YES_NO | wx.NO_DEFAULT | wx.ICON_INFORMATION) + do_stop = dlg.ShowModal() == wx.ID_NO + dlg.Destroy() + if do_stop: + return + while self.profile_objects: + p = self.profile_objects.pop() p.stop_mining() - self.vertical_sizer.Detach(p) - p = [] # TODO: see if this garbage collects the old profiles + for i in reversed(range(self.profiles.GetPageCount())): + self.profiles.DeletePage(i) # Create new miners for d in data: panel = self._add_profile() @@ -326,10 +360,37 @@ def set_paths(self, event): print "Event handler `set_paths' not implemented!" event.Skip() - def help_about(self, event): - print "Event handler `help_about' not implemented" - event.Skip() + info = wx.AboutDialogInfo() + info.Name = "Python OpenCL Bitcoin Miner GUI" + info.Website = ("https://github.com/Kiv/poclbm", "poclbm at Github") + info.Developers = ['Chris "Kiv" MacLeod', 'm0mchil'] + wx.AboutBox(info) + + def on_page_closing(self, event): + try: + p = self.profile_objects[event.GetSelection()] + except IndexError: + return # TODO + if p.is_mining: + dlg = wx.MessageDialog(self, + "Closing this miner will stop it. Continue?", "Close miner", + wx.YES_NO | wx.NO_DEFAULT | wx.ICON_INFORMATION) + do_stop = dlg.ShowModal() == wx.ID_NO + dlg.Destroy() + if do_stop: + event.Veto() + else: + p = self.profile_objects.pop(event.GetSelection()) + p.stop_mining() + event.Skip() + + def on_page_changed(self, event): + try: + p = self.profile_objects[event.GetSelection()] + except IndexError: + return # TODO + p.on_focus() if __name__ == "__main__": import gettext From b82ee8e3973b09953c01553f5c66a4d2c921adf7 Mon Sep 17 00:00:00 2001 From: Kiv Date: Mon, 21 Feb 2011 22:04:23 -0400 Subject: [PATCH 005/190] Add setup.py for py2exe. Fix paths for py2exe. --- guiminer.py | 18 +++++++++++++----- setup.py | 8 ++++++++ 2 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 setup.py diff --git a/guiminer.py b/guiminer.py index e2c3b19..919071b 100644 --- a/guiminer.py +++ b/guiminer.py @@ -4,7 +4,7 @@ from wx.lib.agw import flatnotebook as fnb -USE_MOCK = True +USE_MOCK = False def strip_whitespace(s): s = re.sub(r"( +)|\t+", " ", s) @@ -18,6 +18,12 @@ def get_opencl_devices(): raise IOError return ['[%d] %s' % (i, strip_whitespace(device.name)[:25]) for (i, device) in enumerate(devices)] + +def get_module_path(): + if hasattr(sys, 'frozen'): + return os.path.dirname(sys.executable) + else: + return os.path.dirname(__file__) def _mkdir_p(path): try: @@ -143,12 +149,14 @@ def set_data(self, data): if 'flags' in data: self.txt_flags.SetValue(data['flags']) def start_mining(self): - folder = os.path.dirname(__file__) - if USE_MOCK: - + folder = get_module_path() + if USE_MOCK: executable = "python mockBitcoinMiner.py" else: - executable = "python poclbm.py" + if hasattr(sys, 'frozen'): + executable = "poclbm.exe" + else: + executable = "python poclbm.py" cmd = "%s --user=%s --pass=%s -o %s -p %s -d%d --verbose %s" % ( executable, self.txt_username.GetValue(), diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..8990583 --- /dev/null +++ b/setup.py @@ -0,0 +1,8 @@ +from distutils.core import setup +import py2exe + +setup(#windows=['guiminer.py'], + console=['guiminer.py', 'poclbm.py'], + # OpenCL.dll is vendor specific + options=dict(py2exe=dict(dll_excludes=['OpenCL.dll'])), + data_files = ['BitcoinMiner.cl']) From b8f31bfac084cd945994c248cbd901c1498d335f Mon Sep 17 00:00:00 2001 From: Kiv Date: Tue, 22 Feb 2011 20:15:29 -0400 Subject: [PATCH 006/190] Minimize to taskbar. Add icon. Post events from worker threads instead of using After. --- guiminer.py | 122 +++++++++++++++++++++++++++++++++++++++++++++------- setup.py | 2 +- 2 files changed, 107 insertions(+), 17 deletions(-) diff --git a/guiminer.py b/guiminer.py index 919071b..f66700c 100644 --- a/guiminer.py +++ b/guiminer.py @@ -3,8 +3,7 @@ import json from wx.lib.agw import flatnotebook as fnb - -USE_MOCK = False +from wx.lib.newevent import NewEvent def strip_whitespace(s): s = re.sub(r"( +)|\t+", " ", s) @@ -24,6 +23,13 @@ def get_module_path(): return os.path.dirname(sys.executable) else: return os.path.dirname(__file__) + +def get_icon(): + image_path = os.path.join(get_module_path(), 'logo.png') + image = wx.Image(image_path, wx.BITMAP_TYPE_PNG).ConvertToBitmap() + icon = wx.EmptyIcon() + icon.CopyFromBitmap(image) + return icon def _mkdir_p(path): try: @@ -33,6 +39,53 @@ def _mkdir_p(path): pass else: raise +(UpdateHashRateEvent, EVT_UPDATE_HASHRATE) = NewEvent() +(UpdateAcceptedEvent, EVT_UPDATE_ACCEPTED) = NewEvent() +(UpdateStatusdEvent, EVT_UPDATE_STATUS) = NewEvent() + +class GUIMinerTaskBarIcon(wx.TaskBarIcon): + TBMENU_RESTORE = wx.NewId() + TBMENU_CLOSE = wx.NewId() + TBMENU_CHANGE = wx.NewId() + TBMENU_REMOVE = wx.NewId() + + def __init__(self, frame): + wx.TaskBarIcon.__init__(self) + self.frame = frame + self.icon = get_icon() + self.timer = wx.Timer(self) + self.timer.Start(1000) + + self.SetIcon(self.icon, "poclbm-gui") + self.imgidx = 1 + self.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, self.on_taskbar_activate) + self.Bind(wx.EVT_MENU, self.on_taskbar_activate, id=self.TBMENU_RESTORE) + self.Bind(wx.EVT_MENU, self.on_taskbar_close, id=self.TBMENU_CLOSE) + self.Bind(wx.EVT_TIMER, self.on_update_tooltip) + + def create_popup_menu(self): + menu = wx.Menu() + menu.Append(self.TBMENU_RESTORE, "Restore") + menu.Append(self.TBMENU_CLOSE, "Close") + return menu + + def on_taskbar_activate(self, evt): + if self.frame.IsIconized(): + self.frame.Iconize(False) + if not self.frame.IsShown(): + self.frame.Show(True) + self.frame.Raise() + + def on_taskbar_close(self, evt): + wx.CallAfter(self.frame.Close) + + def on_update_tooltip(self, event): + """Refresh the taskbar icon's status message.""" + objs = self.frame.profile_objects + if objs: + text = '\n'.join(p.get_tooltip_text() for p in objs) + self.SetIcon(self.icon, text) + class MinerListenerThread(threading.Thread): def __init__(self, parent, miner): threading.Thread.__init__(self) @@ -47,18 +100,22 @@ def run(self): if not line: continue match = re.search(r"accepted", line, flags=re.I) if match is not None: - wx.CallAfter(self.parent.update_shares, True) + event = UpdateAcceptedEvent(accepted=True) + wx.PostEvent(self.parent, event) continue match = re.search(r"invalid|stale", line, flags=re.I) if match is not None: - wx.CallAfter(self.parent.update_shares, False) + event = UpdateAcceptedEvent(accepted=False) + wx.PostEvent(self.parent, event) continue match = re.search(r"(\d+) khash/s", line, flags=re.I) if match is not None: - wx.CallAfter(self.parent.update_khash, int(match.group(1))) + event = UpdateHashRateEvent(rate=int(match.group(1))) + wx.PostEvent(self.parent, event) continue # Possible error or new message, just pipe it through - wx.CallAfter(self.parent.update_status, line) + event = UpdateStatusEvent(text=line) + wx.PostEvent(self.parent, event) print 'Listener shutting down' @@ -94,7 +151,10 @@ def __init__(self, parent, id, name, devices, statusbar): self.__set_properties() self.__do_layout() - self.start.Bind(wx.EVT_BUTTON, self.toggle_mining) + self.start.Bind(wx.EVT_BUTTON, self.toggle_mining) + self.Bind(EVT_UPDATE_HASHRATE, self.on_update_khash) + self.Bind(EVT_UPDATE_ACCEPTED, lambda event: self.update_shares(event.accepted)) + self.Bind(EVT_UPDATE_STATUS, lambda event: self.update_status(event.text)) self.set_shares_statusbar_text() def __set_properties(self): @@ -177,7 +237,6 @@ def start_mining(self): self.is_mining = True self.set_status("Starting...", 1) - def stop_mining(self): if self.miner is not None: self.miner.terminate() @@ -189,13 +248,19 @@ def stop_mining(self): # TODO: stop all miners on program shutdown self.set_status("Stopped", 1) - def update_khash(self, rate): - self.last_rate = rate + def on_update_khash(self, event): + self.update_khash(event.rate) + event.Skip() + + def format_khash(self, rate): if rate > 1000: - text = "%.1f Mhash/s" % (rate/1000.) + return"%.1f Mhash/s" % (rate/1000.) else: - text = "%d khash/s" % rate - self.set_status(text, ProfilePanel.KHASH_INDEX) + return "%d khash/s" % rate + + def update_khash(self, rate): + self.last_rate = rate + self.set_status(self.format_khash(rate), ProfilePanel.KHASH_INDEX) if self.is_possible_error: self.set_shares_statusbar_text() self.is_possible_error = False @@ -226,6 +291,12 @@ def on_focus(self): self.set_shares_statusbar_text() self.update_khash(self.last_rate) + def get_tooltip_text(self): + if self.is_mining: + return "%s: %s" % (self.name, self.format_khash(self.last_rate)) + else: + return "%s: Stopped" % self.name + class MyFrame(wx.Frame): def __init__(self, *args, **kwds): wx.Frame.__init__(self, *args, **kwds) @@ -249,6 +320,16 @@ def __init__(self, *args, **kwds): self.menubar.Append(wxglade_tmp_menu, _("&Help")) self.SetMenuBar(self.menubar) self.statusbar = self.CreateStatusBar(2, 0) + + + try: + self.tbicon = GUIMinerTaskBarIcon(self) + except: + self.tbicon = None + raise + + self.SetIcon(get_icon()) + self.__set_properties() @@ -271,19 +352,19 @@ def __init__(self, *args, **kwds): self.Bind(wx.EVT_MENU, self.set_paths, id=self.ID_PATHS) self.Bind(wx.EVT_MENU, self.help_about, id=wx.ID_ABOUT) self.Bind(wx.EVT_CLOSE, self.on_close) + self.Bind(wx.EVT_ICONIZE, self.on_minimize) self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CLOSING, self.on_page_closing) self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CHANGED, self.on_page_changed) any_loaded = self.load_profile() if not any_loaded: # Create a default one for them to use - p = self._add_profile() - p.set_data(dict(name="slush's pool")) + p = self._add_profile(name="slush's pool") self.__do_layout() def __set_properties(self): - self.SetTitle(_("poclbm")) + self.SetTitle(_("poclbm-gui")) self.statusbar.SetStatusWidths([-1, 125]) statusbar_fields = [_(""), _("Not started")] for i in range(len(statusbar_fields)): @@ -335,6 +416,9 @@ def on_close(self, event): """On closing, stop any miners that are currently working.""" for p in self.profile_objects: p.stop_mining() + if self.tbicon is not None: + self.tbicon.RemoveIcon() + self.tbicon.Destroy() event.Skip() def load_profile(self, event=None): @@ -400,10 +484,16 @@ def on_page_changed(self, event): return # TODO p.on_focus() + def on_minimize(self, event): + self.Hide() + if __name__ == "__main__": import gettext gettext.install("app") # replace with the appropriate catalog name + global USE_MOCK + USE_MOCK = '--mock' in sys.argv + app = wx.PySimpleApp(0) wx.InitAllImageHandlers() frame_1 = MyFrame(None, -1, "") diff --git a/setup.py b/setup.py index 8990583..46a4ed0 100644 --- a/setup.py +++ b/setup.py @@ -5,4 +5,4 @@ console=['guiminer.py', 'poclbm.py'], # OpenCL.dll is vendor specific options=dict(py2exe=dict(dll_excludes=['OpenCL.dll'])), - data_files = ['BitcoinMiner.cl']) + data_files = ['BitcoinMiner.cl', 'logo.png']) From 389ff502d5475838697cf33039129a8c832b107e Mon Sep 17 00:00:00 2001 From: Kiv Date: Tue, 22 Feb 2011 20:25:18 -0400 Subject: [PATCH 007/190] Add logo. --- guiminer.py | 6 ++++-- logo.png | Bin 0 -> 13005 bytes 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 logo.png diff --git a/guiminer.py b/guiminer.py index f66700c..65e1dc3 100644 --- a/guiminer.py +++ b/guiminer.py @@ -245,7 +245,6 @@ def stop_mining(self): self.miner_listener.shutdown_event.set() self.miner_listener = None self.is_mining = False - # TODO: stop all miners on program shutdown self.set_status("Stopped", 1) def on_update_khash(self, event): @@ -289,7 +288,10 @@ def set_status(self, msg, index=0): def on_focus(self): """When we receive focus, update our status.""" self.set_shares_statusbar_text() - self.update_khash(self.last_rate) + if self.is_mining: + self.update_khash(self.last_rate) + else: + self.set_status("Stopped", 1) def get_tooltip_text(self): if self.is_mining: diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cf55a4be0763d5848cd22ca96fb312b2f64e5731 GIT binary patch literal 13005 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%0Diu4UcOu?1#y0Zy<;atSo9o=_a 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 ZfYNbQ78@NXMD+^-s?T34R?3?P{|^mu)`$QA literal 0 HcmV?d00001 From a83ee35ecf7ed22967445c31e4946490c30f0c7d Mon Sep 17 00:00:00 2001 From: Kiv Date: Wed, 23 Feb 2011 19:06:34 -0400 Subject: [PATCH 008/190] Redo about dialog with donation link. --- guiminer.py | 56 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 8 deletions(-) diff --git a/guiminer.py b/guiminer.py index 65e1dc3..94eb2c9 100644 --- a/guiminer.py +++ b/guiminer.py @@ -5,6 +5,8 @@ from wx.lib.agw import flatnotebook as fnb from wx.lib.newevent import NewEvent +__version__ = '2011-02-23' + def strip_whitespace(s): s = re.sub(r"( +)|\t+", " ", s) return s.strip() @@ -309,9 +311,9 @@ def __init__(self, *args, **kwds): # Menu Bar self.menubar = wx.MenuBar() wxglade_tmp_menu = wx.Menu() - wxglade_tmp_menu.Append(wx.ID_NEW, _("&New profiles..."), "", wx.ITEM_NORMAL) # TODO - wxglade_tmp_menu.Append(wx.ID_SAVE, _("&Save profiles"), "", wx.ITEM_NORMAL) - wxglade_tmp_menu.Append(wx.ID_OPEN, _("&Load profiles"), "", wx.ITEM_NORMAL) + wxglade_tmp_menu.Append(wx.ID_NEW, _("&New miner..."), "", wx.ITEM_NORMAL) # TODO + wxglade_tmp_menu.Append(wx.ID_SAVE, _("&Save miners"), "", wx.ITEM_NORMAL) + wxglade_tmp_menu.Append(wx.ID_OPEN, _("&Load miners"), "", wx.ITEM_NORMAL) self.menubar.Append(wxglade_tmp_menu, _("&File")) #wxglade_tmp_menu = wx.Menu() self.ID_PATHS = wx.NewId() @@ -455,11 +457,9 @@ def set_paths(self, event): event.Skip() def help_about(self, event): - info = wx.AboutDialogInfo() - info.Name = "Python OpenCL Bitcoin Miner GUI" - info.Website = ("https://github.com/Kiv/poclbm", "poclbm at Github") - info.Developers = ['Chris "Kiv" MacLeod', 'm0mchil'] - wx.AboutBox(info) + dialog = AboutGuiminer(self, -1, 'About') + dialog.ShowModal() + dialog.Destroy() def on_page_closing(self, event): try: @@ -489,6 +489,46 @@ def on_page_changed(self, event): def on_minimize(self, event): self.Hide() + +class AboutGuiminer(wx.Dialog): + donation_address = "1MDDh2h4cAZDafgc94mr9q95dhRYcJbNQo" + def __init__(self, parent, id, title): + wx.Dialog.__init__(self, parent, id, title) + panel = wx.Panel(self, -1) + vbox = wx.BoxSizer(wx.VERTICAL) + + text=\ +"""Python OpenCL Bitcoin Miner GUI + +Version: %s + +GUI by Chris 'Kiv' MacLeod +Original poclbm miner by m0mchil + +Get the source code or file issues at GitHub: + https://github.com/Kiv/poclbm + +If you enjoyed this software, support its development +by donating to: + +%s +""" % (__version__, AboutGuiminer.donation_address) + self.about_text = wx.StaticText(self, -1, text) + self.copy_btn = wx.Button(self, -1, "Copy address to clipboard") + vbox.Add(self.about_text) + vbox.Add(self.copy_btn, 0, wx.ALIGN_BOTTOM|wx.ALIGN_CENTER_HORIZONTAL, 0) + self.SetSizer(vbox) + + self.copy_btn.Bind(wx.EVT_BUTTON, self.on_copy) + + def on_copy(self, event): + if wx.TheClipboard.Open(): + data = wx.TextDataObject() + data.SetText(AboutGuiminer.donation_address) + wx.TheClipboard.SetData(data) + wx.TheClipboard.Close() + + if __name__ == "__main__": import gettext gettext.install("app") # replace with the appropriate catalog name From ab7da22593244574df63f550db1dc21ed89d1be1 Mon Sep 17 00:00:00 2001 From: Kiv Date: Wed, 23 Feb 2011 19:10:34 -0400 Subject: [PATCH 009/190] Redo about dialog with donation link. --- guiminer.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/guiminer.py b/guiminer.py index 94eb2c9..63bd4b2 100644 --- a/guiminer.py +++ b/guiminer.py @@ -474,10 +474,11 @@ def on_page_closing(self, event): dlg.Destroy() if do_stop: event.Veto() - else: - p = self.profile_objects.pop(event.GetSelection()) - p.stop_mining() - event.Skip() + return + + p = self.profile_objects.pop(event.GetSelection()) + p.stop_mining() + event.Skip() def on_page_changed(self, event): try: From b7c60cb5595a6e9e8a2d34269afc2dffa8208f10 Mon Sep 17 00:00:00 2001 From: Kiv Date: Wed, 23 Feb 2011 19:21:56 -0400 Subject: [PATCH 010/190] Terminate child processes only if they are still running. Save dialog made more informative. --- guiminer.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/guiminer.py b/guiminer.py index 63bd4b2..8aae652 100644 --- a/guiminer.py +++ b/guiminer.py @@ -43,7 +43,7 @@ def _mkdir_p(path): (UpdateHashRateEvent, EVT_UPDATE_HASHRATE) = NewEvent() (UpdateAcceptedEvent, EVT_UPDATE_ACCEPTED) = NewEvent() -(UpdateStatusdEvent, EVT_UPDATE_STATUS) = NewEvent() +(UpdateStatusEvent, EVT_UPDATE_STATUS) = NewEvent() class GUIMinerTaskBarIcon(wx.TaskBarIcon): TBMENU_RESTORE = wx.NewId() @@ -241,7 +241,9 @@ def start_mining(self): def stop_mining(self): if self.miner is not None: - self.miner.terminate() + if self.miner.returncode is not None: + # Terminate the child process if it's still running. + self.miner.terminate() self.miner = None if self.miner_listener is not None: self.miner_listener.shutdown_event.set() @@ -411,7 +413,7 @@ def save_profile(self, event): print 'Saving:', data with open(config_filename, 'w') as f: json.dump(data, f) - dlg = wx.MessageDialog(self, "Profiles saved successfully!", + dlg = wx.MessageDialog(self, "Profiles saved OK to %s." % config_filename, "Save successful", wx.OK|wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() From 28a1e9a9e244f33d78f5127fb5ed6938961e87a3 Mon Sep 17 00:00:00 2001 From: Kiv Date: Wed, 23 Feb 2011 20:29:31 -0400 Subject: [PATCH 011/190] Read difficulty1 messages from solo miner. Restore miner names correctly on startup. --- guiminer.py | 47 ++++++++++++++++++++++++++++++++------------- mockBitcoinMiner.py | 5 ++++- 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/guiminer.py b/guiminer.py index 8aae652..93e7843 100644 --- a/guiminer.py +++ b/guiminer.py @@ -43,6 +43,7 @@ def _mkdir_p(path): (UpdateHashRateEvent, EVT_UPDATE_HASHRATE) = NewEvent() (UpdateAcceptedEvent, EVT_UPDATE_ACCEPTED) = NewEvent() +(UpdateSoloCheckEvent, EVT_UPDATE_SOLOCHECK) = NewEvent() (UpdateStatusEvent, EVT_UPDATE_STATUS) = NewEvent() class GUIMinerTaskBarIcon(wx.TaskBarIcon): @@ -114,7 +115,12 @@ def run(self): if match is not None: event = UpdateHashRateEvent(rate=int(match.group(1))) wx.PostEvent(self.parent, event) - continue + continue + match = re.search(r"checking (\d+)", line, flags=re.I) + if match is not None: + event = UpdateSoloCheckEvent() + wx.PostEvent(self.parent, event) + continue # Possible error or new message, just pipe it through event = UpdateStatusEvent(text=line) wx.PostEvent(self.parent, event) @@ -123,11 +129,13 @@ def run(self): class ProfilePanel(wx.Panel): SHARES_INDEX = 0 # Indexes into the status bar - KHASH_INDEX = 1 - def __init__(self, parent, id, name, devices, statusbar): + KHASH_INDEX = 1 + SOLO = 0 + POOL = 1 + def __init__(self, parent, id, devices, statusbar): wx.Panel.__init__(self, parent, id) self.parent = parent - self.name = name + self.name = "Miner" self.statusbar = statusbar self.is_mining = False self.is_possible_error = False @@ -136,6 +144,8 @@ def __init__(self, parent, id, name, devices, statusbar): self.accepted_shares = 0 self.invalid_shares = 0 self.last_rate = 0 + self.last_update_type = ProfilePanel.POOL + self.diff1_hashes = 0 self.server_lbl = wx.StaticText(self, -1, _("Server:")) self.txt_server = wx.TextCtrl(self, -1, _("mining.bitcoin.cz")) self.port_lbl = wx.StaticText(self, -1, _("Port:")) @@ -157,6 +167,7 @@ def __init__(self, parent, id, name, devices, statusbar): self.Bind(EVT_UPDATE_HASHRATE, self.on_update_khash) self.Bind(EVT_UPDATE_ACCEPTED, lambda event: self.update_shares(event.accepted)) self.Bind(EVT_UPDATE_STATUS, lambda event: self.update_status(event.text)) + self.Bind(EVT_UPDATE_SOLOCHECK, lambda event: self.update_solo()) self.set_shares_statusbar_text() def __set_properties(self): @@ -180,7 +191,7 @@ def __do_layout(self): grid_sizer_1.Add(self.txt_flags, 0, wx.EXPAND, 0) grid_sizer_1.AddGrowableCol(1) grid_sizer_1.AddGrowableCol(3) - sizer_2.Add(grid_sizer_1, 1, wx.EXPAND, 0) + sizer_2.Add(grid_sizer_1, 1, wx.EXPAND|wx.ALL, 10) sizer_2.Add(self.start, 0, wx.ALIGN_BOTTOM|wx.ALIGN_CENTER_HORIZONTAL, 0) self.SetSizerAndFit(sizer_2) @@ -241,7 +252,7 @@ def start_mining(self): def stop_mining(self): if self.miner is not None: - if self.miner.returncode is not None: + if self.miner.returncode is None: # Terminate the child process if it's still running. self.miner.terminate() self.miner = None @@ -274,6 +285,7 @@ def set_shares_statusbar_text(self): self.set_status(text, ProfilePanel.SHARES_INDEX) def update_shares(self, accepted): + self.last_update_type = ProfilePanel.POOL if accepted: self.accepted_shares += 1 else: @@ -303,6 +315,15 @@ def get_tooltip_text(self): else: return "%s: Stopped" % self.name + def update_solo_status(self): + text = "Difficulty 1 hashes: %d" % self.diff1_hashes + self.set_status(text, 0) + + def update_solo(self): + self.last_update_type = ProfilePanel.SOLO + self.diff1_hashes += 1 + self.update_solo_status() + class MyFrame(wx.Frame): def __init__(self, *args, **kwds): wx.Frame.__init__(self, *args, **kwds) @@ -365,7 +386,7 @@ def __init__(self, *args, **kwds): any_loaded = self.load_profile() if not any_loaded: # Create a default one for them to use - p = self._add_profile(name="slush's pool") + p = self._add_profile(dict(name="slush's pool")) self.__do_layout() @@ -378,13 +399,14 @@ def __set_properties(self): def __do_layout(self): self.vertical_sizer = wx.BoxSizer(wx.VERTICAL) - self.vertical_sizer.Add(self.profiles, 1, wx.EXPAND, 0) + self.vertical_sizer.Add(self.profiles, 1, wx.EXPAND, 20) self.SetSizer(self.vertical_sizer) self.vertical_sizer.SetSizeHints(self) self.SetSizerAndFit(self.vertical_sizer) - def _add_profile(self, name="Default miner"): - panel = ProfilePanel(self.profiles, -1, name, self.devices, self.statusbar) + def _add_profile(self, data): + panel = ProfilePanel(self.profiles, -1, self.devices, self.statusbar) + panel.set_data(data) self.profile_objects.append(panel) self.profiles.AddPage(panel, panel.name) # Select new profile which is the last one. @@ -395,7 +417,7 @@ def _add_profile(self, name="Default miner"): def new_profile(self, event): dialog = wx.TextEntryDialog(self, "Name this miner:", "New miner") if dialog.ShowModal() == wx.ID_OK: - self._add_profile(dialog.GetValue()) + self._add_profile(dict(name=dialog.GetValue())) def _get_storage_location(self): if sys.platform == 'win32': @@ -450,8 +472,7 @@ def load_profile(self, event=None): self.profiles.DeletePage(i) # Create new miners for d in data: - panel = self._add_profile() - panel.set_data(d) + panel = self._add_profile(d) return any(data) def set_paths(self, event): diff --git a/mockBitcoinMiner.py b/mockBitcoinMiner.py index fd2c90c..87cf6db 100644 --- a/mockBitcoinMiner.py +++ b/mockBitcoinMiner.py @@ -39,7 +39,10 @@ def hashrate(self, rate): self.say('%s khash/s', rate) def blockFound(self, hash, accepted): - self.sayLine('%s, %s', (hash, if_else(accepted, 'accepted', 'invalid or stale'))) + if random.randint(0,1): + self.sayLine('%s, %s', (hash, if_else(accepted, 'accepted', 'invalid or stale'))) + else: + self.sayLine('checking %d' % random.randint(10000,100000)) def mine(self): self.start() From fcbaff145168dc3f392bfbd35e4326319ed2d5d6 Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 25 Feb 2011 15:02:08 -0400 Subject: [PATCH 012/190] Add docstrings and refactor. Support setting bitcoin client's path and writing bitcoin.conf. --- guiminer.py | 417 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 275 insertions(+), 142 deletions(-) diff --git a/guiminer.py b/guiminer.py index 93e7843..8ce4241 100644 --- a/guiminer.py +++ b/guiminer.py @@ -7,7 +7,32 @@ __version__ = '2011-02-23' -def strip_whitespace(s): +ABOUT_TEXT = \ +"""Python OpenCL Bitcoin Miner GUI + +Version: %s + +GUI by Chris 'Kiv' MacLeod +Original poclbm miner by m0mchil + +Get the source code or file issues at GitHub: + https://github.com/Kiv/poclbm + +If you enjoyed this software, support its development +by donating to: + +%s +""" + +# Events sent from the worker threads +(UpdateHashRateEvent, EVT_UPDATE_HASHRATE) = NewEvent() +(UpdateAcceptedEvent, EVT_UPDATE_ACCEPTED) = NewEvent() +(UpdateSoloCheckEvent, EVT_UPDATE_SOLOCHECK) = NewEvent() +(UpdateStatusEvent, EVT_UPDATE_STATUS) = NewEvent() + +# Utility functions +def merge_whitespace(s): + """Combine multiple whitespace characters found in s into one.""" s = re.sub(r"( +)|\t+", " ", s) return s.strip() @@ -17,36 +42,38 @@ def get_opencl_devices(): devices = platform.get_devices() if len(devices) == 0: raise IOError - return ['[%d] %s' % (i, strip_whitespace(device.name)[:25]) + # TODO: maybe use horizontal scrollbar to show long device names? + # Or maybe it's nice if we can show device aliases. + return ['[%d] %s' % (i, merge_whitespace(device.name)[:25]) for (i, device) in enumerate(devices)] def get_module_path(): - if hasattr(sys, 'frozen'): - return os.path.dirname(sys.executable) - else: - return os.path.dirname(__file__) + """Return the folder containing this script (or its .exe).""" + module_name = sys.executable if hasattr(sys, 'frozen') else __file__ + return os.path.dirname(module_name) def get_icon(): + """Return the Bitcoin program icon.""" image_path = os.path.join(get_module_path(), 'logo.png') image = wx.Image(image_path, wx.BITMAP_TYPE_PNG).ConvertToBitmap() icon = wx.EmptyIcon() icon.CopyFromBitmap(image) return icon -def _mkdir_p(path): +def mkdir_p(path): + """If the directory 'path' doesn't exist, create it. Same as mkdir -p.""" try: os.makedirs(path) - except OSError as exc: # Python >2.5 - if exc.errno == errno.EEXIST: - pass - else: raise - -(UpdateHashRateEvent, EVT_UPDATE_HASHRATE) = NewEvent() -(UpdateAcceptedEvent, EVT_UPDATE_ACCEPTED) = NewEvent() -(UpdateSoloCheckEvent, EVT_UPDATE_SOLOCHECK) = NewEvent() -(UpdateStatusEvent, EVT_UPDATE_STATUS) = NewEvent() + except OSError as exc: + if exc.errno != errno.EEXIST: + raise class GUIMinerTaskBarIcon(wx.TaskBarIcon): + """Taskbar icon for the GUI. + + Shows status messages on hover and opens on click. + TODO: right click on taskbar icon to open menu with some stuff in it. + """ TBMENU_RESTORE = wx.NewId() TBMENU_CLOSE = wx.NewId() TBMENU_CHANGE = wx.NewId() @@ -66,7 +93,8 @@ def __init__(self, frame): self.Bind(wx.EVT_MENU, self.on_taskbar_close, id=self.TBMENU_CLOSE) self.Bind(wx.EVT_TIMER, self.on_update_tooltip) - def create_popup_menu(self): + def CreatePopupMenu(self): + """Override from wx.TaskBarIcon. Creates the right-click menu.""" menu = wx.Menu() menu.Append(self.TBMENU_RESTORE, "Restore") menu.Append(self.TBMENU_CLOSE, "Close") @@ -86,7 +114,7 @@ def on_update_tooltip(self, event): """Refresh the taskbar icon's status message.""" objs = self.frame.profile_objects if objs: - text = '\n'.join(p.get_tooltip_text() for p in objs) + text = '\n'.join(p.get_taskbar_text() for p in objs) self.SetIcon(self.icon, text) class MinerListenerThread(threading.Thread): @@ -128,10 +156,16 @@ def run(self): class ProfilePanel(wx.Panel): - SHARES_INDEX = 0 # Indexes into the status bar - KHASH_INDEX = 1 - SOLO = 0 - POOL = 1 + """A tab in the GUI representing a miner instance. + + Each ProfilePanel has these responsibilities: + - Persist its data to and from the config file + - Launch a poclbm subprocess and monitor its progress + by creating a MinerListenerThread. + - Post updates to the GUI's statusbar; the format depends + whether the poclbm instance is working solo or in a pool. + """ + SOLO, POOL = range(2) def __init__(self, parent, id, devices, statusbar): wx.Panel.__init__(self, parent, id) self.parent = parent @@ -139,39 +173,36 @@ def __init__(self, parent, id, devices, statusbar): self.statusbar = statusbar self.is_mining = False self.is_possible_error = False - self.miner = None - self.miner_listener = None - self.accepted_shares = 0 - self.invalid_shares = 0 - self.last_rate = 0 + self.miner = None # subprocess.Popen instance when mining + self.miner_listener = None # MinerListenerThread when mining + self.accepted_shares = 0 # POOL mode only + self.invalid_shares = 0 # POOL mode only + self.diff1_hashes = 0 # SOLO mode only + self.last_rate = 0 # units of khash/s self.last_update_type = ProfilePanel.POOL - self.diff1_hashes = 0 self.server_lbl = wx.StaticText(self, -1, _("Server:")) - self.txt_server = wx.TextCtrl(self, -1, _("mining.bitcoin.cz")) + self.txt_server = wx.TextCtrl(self, -1, "mining.bitcoin.cz") self.port_lbl = wx.StaticText(self, -1, _("Port:")) - self.txt_port = wx.TextCtrl(self, -1, _("8332")) + self.txt_port = wx.TextCtrl(self, -1, "8332") self.user_lbl = wx.StaticText(self, -1, _("Username:")) self.txt_username = wx.TextCtrl(self, -1, _("")) self.pass_lbl = wx.StaticText(self, -1, _("Password:")) - self.txt_pass = wx.TextCtrl(self, -1, _(""), style=wx.TE_PASSWORD) + self.txt_pass = wx.TextCtrl(self, -1, "", style=wx.TE_PASSWORD) self.device_lbl = wx.StaticText(self, -1, _("Device:")) - self.combo_device = wx.ComboBox(self, -1, choices=devices, style=wx.CB_DROPDOWN) + self.device_listbox = wx.ComboBox(self, -1, choices=devices, style=wx.CB_DROPDOWN) self.flags_lbl = wx.StaticText(self, -1, _("Extra flags:")) - self.txt_flags = wx.TextCtrl(self, -1, _("")) + self.txt_flags = wx.TextCtrl(self, -1, "") self.start = wx.Button(self, -1, _("Start mining!")) - self.__set_properties() + self.device_listbox.SetSelection(0) self.__do_layout() self.start.Bind(wx.EVT_BUTTON, self.toggle_mining) - self.Bind(EVT_UPDATE_HASHRATE, self.on_update_khash) + self.Bind(EVT_UPDATE_HASHRATE, lambda event: self.update_khash(event.rate)) self.Bind(EVT_UPDATE_ACCEPTED, lambda event: self.update_shares(event.accepted)) self.Bind(EVT_UPDATE_STATUS, lambda event: self.update_status(event.text)) self.Bind(EVT_UPDATE_SOLOCHECK, lambda event: self.update_solo()) - self.set_shares_statusbar_text() - - def __set_properties(self): - self.combo_device.SetSelection(0) + self.update_shares_on_statusbar() def __do_layout(self): sizer_2 = wx.BoxSizer(wx.VERTICAL) @@ -186,16 +217,18 @@ def __do_layout(self): grid_sizer_1.Add(self.pass_lbl, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_1.Add(self.txt_pass, 0, wx.EXPAND, 0) grid_sizer_1.Add(self.device_lbl, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) - grid_sizer_1.Add(self.combo_device, 0, wx.EXPAND, 0) + grid_sizer_1.Add(self.device_listbox, 0, wx.EXPAND, 0) grid_sizer_1.Add(self.flags_lbl, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_1.Add(self.txt_flags, 0, wx.EXPAND, 0) grid_sizer_1.AddGrowableCol(1) grid_sizer_1.AddGrowableCol(3) - sizer_2.Add(grid_sizer_1, 1, wx.EXPAND|wx.ALL, 10) + TAB_PADDING = 10 + sizer_2.Add(grid_sizer_1, 1, wx.EXPAND|wx.ALL, TAB_PADDING) sizer_2.Add(self.start, 0, wx.ALIGN_BOTTOM|wx.ALIGN_CENTER_HORIZONTAL, 0) self.SetSizerAndFit(sizer_2) def toggle_mining(self, event): + """Stop or start the miner.""" if self.is_mining: self.stop_mining() self.start.SetLabel("Start mining!") @@ -204,25 +237,32 @@ def toggle_mining(self, event): self.start.SetLabel("Stop mining") def get_data(self): + """Return a dict of our profile data.""" return dict(name=self.name, server=self.txt_server.GetValue(), port=self.txt_port.GetValue(), username=self.txt_username.GetValue(), password=self.txt_pass.GetValue(), - device=self.combo_device.GetSelection(), # TODO this is probably not adequate + device=self.device_listbox.GetSelection(), flags=self.txt_flags.GetValue()) def set_data(self, data): + """Set our profile data to the information in data. See get_data().""" if 'name' in data: self.name = data['name'] if 'username' in data: self.txt_username.SetValue(data['username']) if 'server' in data: self.txt_server.SetValue(data['server']) if 'port' in data: self.txt_port.SetValue(data['port']) if 'password' in data: self.txt_pass.SetValue(data['password']) - if 'device' in data: self.combo_device.SetSelection(data['device']) if 'flags' in data: self.txt_flags.SetValue(data['flags']) + # Handle case where they removed devices since last run. + device_index = data.get('device', None) + if device_index is not None and device_index < self.device_listbox.GetCount(): + self.device_listbox.SetSelection(device_index) + def start_mining(self): - folder = get_module_path() + """Launch a poclbm subprocess and attach a MinerListenerThread.""" + folder = get_module_path() if USE_MOCK: executable = "python mockBitcoinMiner.py" else: @@ -236,7 +276,7 @@ def start_mining(self): self.txt_pass.GetValue(), self.txt_server.GetValue(), self.txt_port.GetValue(), - self.combo_device.GetSelection(), + self.device_listbox.GetSelection(), self.txt_flags.GetValue() ) try: @@ -251,9 +291,10 @@ def start_mining(self): self.set_status("Starting...", 1) def stop_mining(self): + """Terminate the poclbm process if able and its associated listener.""" if self.miner is not None: if self.miner.returncode is None: - # Terminate the child process if it's still running. + # It didn't return yet so it's still running. self.miner.terminate() self.miner = None if self.miner_listener is not None: @@ -262,37 +303,49 @@ def stop_mining(self): self.is_mining = False self.set_status("Stopped", 1) - def on_update_khash(self, event): - self.update_khash(event.rate) - event.Skip() - def format_khash(self, rate): + """Format rate for display. A rate of 0 means just connected.""" if rate > 1000: - return"%.1f Mhash/s" % (rate/1000.) + return "%.1f Mhash/s" % (rate/1000.) + elif rate == 0: + return "Connected." else: - return "%d khash/s" % rate - + return "%d khash/s" % rate + def update_khash(self, rate): + """Update our rate according to a report from the listener thread. + + If we are receiving rate messages then it means poclbm is no longer + reporting errors. + """ self.last_rate = rate - self.set_status(self.format_khash(rate), ProfilePanel.KHASH_INDEX) + self.set_status(self.format_khash(rate), 1) if self.is_possible_error: - self.set_shares_statusbar_text() + self.update_shares_on_statusbar() self.is_possible_error = False - def set_shares_statusbar_text(self): + def update_shares_on_statusbar(self): + """For pooled mining, show the shares on the statusbar.""" text = "Shares: %d accepted, %d stale/invalid" % \ (self.accepted_shares, self.invalid_shares) - self.set_status(text, ProfilePanel.SHARES_INDEX) + self.set_status(text, 0) def update_shares(self, accepted): + """Update our shares with a report from the listener thread.""" self.last_update_type = ProfilePanel.POOL if accepted: self.accepted_shares += 1 else: self.invalid_shares += 1 - self.set_shares_statusbar_text() + self.update_shares_on_statusbar() def update_status(self, msg): + """Update our status with a report from the listener thread. + + If we receive a message from poclbm we don't know how to interpret, + it's probably some kind of error state - in this case the best + thing to do is just show it to the user on the status bar. + """ self.set_status(msg) self.is_possible_error = True @@ -302,24 +355,36 @@ def set_status(self, msg, index=0): self.statusbar.SetStatusText(msg, index) def on_focus(self): - """When we receive focus, update our status.""" - self.set_shares_statusbar_text() + """When we receive focus, update our status. + + This ensures that when switching tabs, the statusbar always + shows the current tab's status. + """ + self.update_shares_on_statusbar() if self.is_mining: self.update_khash(self.last_rate) else: self.set_status("Stopped", 1) - def get_tooltip_text(self): + def get_taskbar_text(self): + """Return text for the hover state of the taskbar.""" if self.is_mining: return "%s: %s" % (self.name, self.format_khash(self.last_rate)) else: return "%s: Stopped" % self.name def update_solo_status(self): + """For solo mining, show the number of easy hashes solved. + + This is a rough indicator of how fast the miner is going, + since some small fraction of easy hashes are also valid solutions + to the block. + """ text = "Difficulty 1 hashes: %d" % self.diff1_hashes self.set_status(text, 0) def update_solo(self): + """Update our easy hashes with a report from the listener thread.""" self.last_update_type = ProfilePanel.SOLO self.diff1_hashes += 1 self.update_solo_status() @@ -329,68 +394,70 @@ def __init__(self, *args, **kwds): wx.Frame.__init__(self, *args, **kwds) style = fnb.FNB_X_ON_TAB | fnb.FNB_FF2 | fnb.FNB_NO_NAV_BUTTONS self.profiles = fnb.FlatNotebook(self, -1, style=style) - self.profile_objects = [] - - # Menu Bar + self.profile_objects = [] # List of ProfilePanel. # TODO: can we just get this from self.profiles? + self.menubar = wx.MenuBar() - wxglade_tmp_menu = wx.Menu() - wxglade_tmp_menu.Append(wx.ID_NEW, _("&New miner..."), "", wx.ITEM_NORMAL) # TODO - wxglade_tmp_menu.Append(wx.ID_SAVE, _("&Save miners"), "", wx.ITEM_NORMAL) - wxglade_tmp_menu.Append(wx.ID_OPEN, _("&Load miners"), "", wx.ITEM_NORMAL) - self.menubar.Append(wxglade_tmp_menu, _("&File")) - #wxglade_tmp_menu = wx.Menu() - self.ID_PATHS = wx.NewId() - #wxglade_tmp_menu.Append(self.ID_PATHS, _("&Paths..."), "", wx.ITEM_NORMAL) - #self.menubar.Append(wxglade_tmp_menu, _("&Settings")) - wxglade_tmp_menu = wx.Menu() - wxglade_tmp_menu.Append(wx.ID_ABOUT, _("&About..."), "", wx.ITEM_NORMAL) - self.menubar.Append(wxglade_tmp_menu, _("&Help")) + file_menu = wx.Menu() + file_menu.Append(wx.ID_NEW, _("&New miner..."), _("Create a new miner profile"), wx.ITEM_NORMAL) + file_menu.Append(wx.ID_SAVE, _("&Save settings"), _("Save your settings"), wx.ITEM_NORMAL) + file_menu.Append(wx.ID_OPEN, _("&Load settings"), _("Load stored settings"), wx.ITEM_NORMAL) + self.menubar.Append(file_menu, _("&File")) + + ID_SOLO, ID_PATHS, ID_LAUNCH = wx.NewId(), wx.NewId(), wx.NewId() + solo_menu = wx.Menu() + solo_menu.Append(ID_SOLO, "&Create solo password...", _("Configure a user/pass for solo mining"), wx.ITEM_NORMAL) + solo_menu.Append(ID_PATHS, "&Set Bitcoin client path...", _("Set the location of the official Bitcoin client"), wx.ITEM_NORMAL) + solo_menu.Append(ID_LAUNCH, "&Launch Bitcoin client", _("Launch the official Bitcoin client for solo mining"), wx.ITEM_NORMAL) + self.menubar.Append(solo_menu, _("&Solo utilities")) + + help_menu = wx.Menu() + help_menu.Append(wx.ID_ABOUT, _("&About..."), "", wx.ITEM_NORMAL) + self.menubar.Append(help_menu, _("&Help")) self.SetMenuBar(self.menubar) self.statusbar = self.CreateStatusBar(2, 0) + try: + self.bitcoin_executable = os.path.join(os.getenv("PROGRAMFILES"), "Bitcoin", "bitcoin.exe") + except: + self.bitcoin_executable = "" # TODO: where would Bitcoin probably be on Linux/Mac? try: self.tbicon = GUIMinerTaskBarIcon(self) except: - self.tbicon = None - raise - - self.SetIcon(get_icon()) - - + self.tbicon = None # TODO: what happens on Linux? + self.__set_properties() try: self.devices = get_opencl_devices() except: - dialog = wx.MessageDialog(self, -"""Couldn't find any OpenCL devices. + self.message("""Couldn't find any OpenCL devices. Check that your video card supports OpenCL and that you have a working version of OpenCL installed. If you have an AMD/ATI card you may need to install the ATI Stream SDK.""", "No OpenCL devices found.", wx.OK | wx.ICON_ERROR) - dialog.ShowModal() - dialog.Destroy() sys.exit(1) - self.Bind(wx.EVT_MENU, self.new_profile, id=wx.ID_NEW) - self.Bind(wx.EVT_MENU, self.save_profile, id=wx.ID_SAVE) - self.Bind(wx.EVT_MENU, self.load_profile, id=wx.ID_OPEN) - self.Bind(wx.EVT_MENU, self.set_paths, id=self.ID_PATHS) + self.Bind(wx.EVT_MENU, self.name_new_profile, id=wx.ID_NEW) + self.Bind(wx.EVT_MENU, self.save_profiles, id=wx.ID_SAVE) + self.Bind(wx.EVT_MENU, self.load_profiles, id=wx.ID_OPEN) + self.Bind(wx.EVT_MENU, self.set_paths, id=ID_PATHS) self.Bind(wx.EVT_MENU, self.help_about, id=wx.ID_ABOUT) + self.Bind(wx.EVT_MENU, self.create_solo_password, id=ID_SOLO) + self.Bind(wx.EVT_MENU, self.launch_solo_server, id=ID_LAUNCH) self.Bind(wx.EVT_CLOSE, self.on_close) self.Bind(wx.EVT_ICONIZE, self.on_minimize) - self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CLOSING, self.on_page_closing) self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CHANGED, self.on_page_changed) - any_loaded = self.load_profile() + any_loaded = self.load_profiles() if not any_loaded: # Create a default one for them to use - p = self._add_profile(dict(name="slush's pool")) + p = self.add_profile(dict(name="slush's pool")) self.__do_layout() def __set_properties(self): + self.SetIcon(get_icon()) self.SetTitle(_("poclbm-gui")) self.statusbar.SetStatusWidths([-1, 125]) statusbar_fields = [_(""), _("Not started")] @@ -404,22 +471,32 @@ def __do_layout(self): self.vertical_sizer.SetSizeHints(self) self.SetSizerAndFit(self.vertical_sizer) - def _add_profile(self, data): + def add_profile(self, data): + """Add a new ProfilePanel to the list of tabs.""" panel = ProfilePanel(self.profiles, -1, self.devices, self.statusbar) panel.set_data(data) self.profile_objects.append(panel) self.profiles.AddPage(panel, panel.name) - # Select new profile which is the last one. + # The newly created profile should have focus. self.profiles.EnsureVisible(self.profiles.GetPageCount()-1) self.__do_layout() return panel - def new_profile(self, event): + def message(self, *args, **kwargs): + """Utility method to show a message dialog and return their choice.""" + dialog = wx.MessageDialog(self, *args, **kwargs) + retval = dialog.ShowModal() + dialog.Destroy() + return retval + + def name_new_profile(self, event): + """Prompt for the new miner's name.""" dialog = wx.TextEntryDialog(self, "Name this miner:", "New miner") if dialog.ShowModal() == wx.ID_OK: - self._add_profile(dict(name=dialog.GetValue())) + self.add_profile(dict(name=dialog.GetValue())) - def _get_storage_location(self): + def get_storage_location(self): + """Get the folder and filename to store our JSON config.""" if sys.platform == 'win32': folder = os.path.join(os.environ['AppData'], 'poclbm') config_filename = os.path.join(folder, 'poclbm.ini') @@ -428,18 +505,6 @@ def _get_storage_location(self): config_filename = os.path.join(folder, '.poclbm') return folder, config_filename - def save_profile(self, event): - folder, config_filename = self._get_storage_location() - _mkdir_p(folder) - data = [p.get_data() for p in self.profile_objects] - print 'Saving:', data - with open(config_filename, 'w') as f: - json.dump(data, f) - dlg = wx.MessageDialog(self, "Profiles saved OK to %s." % config_filename, - "Save successful", wx.OK|wx.ICON_INFORMATION) - dlg.ShowModal() - dlg.Destroy() - def on_close(self, event): """On closing, stop any miners that are currently working.""" for p in self.profile_objects: @@ -448,22 +513,41 @@ def on_close(self, event): self.tbicon.RemoveIcon() self.tbicon.Destroy() event.Skip() + + def save_profiles(self, event): + """Save the current miner profiles to our config file in JSON format.""" + folder, config_filename = self.get_storage_location() + mkdir_p(folder) + profile_data = [p.get_data() for p in self.profile_objects] + config_data = dict(profiles=profile_data, + bitcoin_executable=self.bitcoin_executable) + print 'Saving:', config_data + with open(config_filename, 'w') as f: + json.dump(config_data, f) + self.message("Profiles saved OK to %s." % config_filename, + "Save successful", wx.OK|wx.ICON_INFORMATION) + # TODO: handle save failed - def load_profile(self, event=None): - """Load JSON profile info from the poclbm config file.""" - folder, config_filename = self._get_storage_location() + def load_profiles(self, event=None): + """Load JSON profile info from the config file.""" + folder, config_filename = self.get_storage_location() if not os.path.exists(config_filename): return # Nothing to load yet with open(config_filename) as f: - data = json.load(f) - print 'Loaded:', data + config_data = json.load(f) + print 'Loaded:', config_data + # TODO: handle load failed or corrupted data + + executable = config_data.get('bitcoin_executable', None) + if executable is not None: + self.bitcoin_executable = executable + + # Shut down any existing miners before they get clobbered if(any(p.is_mining for p in self.profile_objects)): - dlg = wx.MessageDialog(self, + result = self.message( "Loading profiles will stop any currently running miners. Continue?", "Load profile", wx.YES_NO | wx.NO_DEFAULT | wx.ICON_INFORMATION) - do_stop = dlg.ShowModal() == wx.ID_NO - dlg.Destroy() - if do_stop: + if result == wx.ID_NO: return while self.profile_objects: p = self.profile_objects.pop() @@ -471,13 +555,23 @@ def load_profile(self, event=None): for i in reversed(range(self.profiles.GetPageCount())): self.profiles.DeletePage(i) # Create new miners + data = config_data.get('profiles', []) for d in data: - panel = self._add_profile(d) + panel = self.add_profile(d) return any(data) def set_paths(self, event): - print "Event handler `set_paths' not implemented!" - event.Skip() + dialog = wx.FileDialog(self, + "Select path to Bitcoin.exe", + defaultFile="bitcoin.exe", + wildcard="bitcoin.exe", + style=wx.OPEN) + if dialog.ShowModal() == wx.ID_OK: + path = os.path.join(dialog.GetDirectory(), dialog.GetFilename()) + if os.path.exists(path): + self.bitcoin_executable = path + dialog.Destroy() + def help_about(self, event): dialog = AboutGuiminer(self, -1, 'About') @@ -490,12 +584,10 @@ def on_page_closing(self, event): except IndexError: return # TODO if p.is_mining: - dlg = wx.MessageDialog(self, + result = self.message( "Closing this miner will stop it. Continue?", "Close miner", wx.YES_NO | wx.NO_DEFAULT | wx.ICON_INFORMATION) - do_stop = dlg.ShowModal() == wx.ID_NO - dlg.Destroy() - if do_stop: + if result == wx.ID_NO: event.Veto() return @@ -513,6 +605,62 @@ def on_page_changed(self, event): def on_minimize(self, event): self.Hide() + def launch_solo_server(self, event): + try: + subprocess.Popen(self.bitcoin_executable + " -server") + except OSError: + self.message( + "Couldn't find Bitcoin at %s. Is your path set correctly?" % self.bitcoin_executable, + "Launch failed", wx.ICON_ERROR|wx.OK) + return + self.message( + "Server launched ok. You can start the miner now.", + "Launched ok.", + wx.OK) + + def create_solo_password(self, event): + filename = os.path.join(os.getenv("APPDATA"), "Bitcoin", "bitcoin.conf") + if os.path.exists(filename): + result = self.message("%s already exists. Overwrite?" % filename, + "bitcoin.conf already exists.", + wx.YES_NO | wx.NO_DEFAULT | wx.ICON_INFORMATION) + if result == wx.ID_NO: + return + + dialog = SoloPasswordRequest(self, 'Enter password') + result = dialog.ShowModal() + dialog.Destroy() + if result == wx.ID_CANCEL: + return + + with open(filename, "w") as f: + f.write('\nrpcuser=%s\nrpcpassword=%s' % dialog.get_value()) + f.close() + + self.message("Wrote bitcoin.conf ok.", "Success", wx.OK) + + +class SoloPasswordRequest(wx.Dialog): + def __init__(self, parent, title): + style = wx.DEFAULT_DIALOG_STYLE + vbox = wx.BoxSizer(wx.VERTICAL) + wx.Dialog.__init__(self, parent, -1, title, style=style) + self.user_lbl = wx.StaticText(self, -1, _("Username:")) + self.txt_username = wx.TextCtrl(self, -1, _("")) + self.pass_lbl = wx.StaticText(self, -1, _("Password:")) + self.txt_pass = wx.TextCtrl(self, -1, _(""), style=wx.TE_PASSWORD) + grid_sizer_1 = wx.FlexGridSizer(2, 2, 5, 5) + grid_sizer_1.Add(self.user_lbl, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) + grid_sizer_1.Add(self.txt_username, 0, wx.EXPAND, 0) + grid_sizer_1.Add(self.pass_lbl, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) + grid_sizer_1.Add(self.txt_pass, 0, wx.EXPAND, 0) + buttons = self.CreateButtonSizer(wx.OK|wx.CANCEL) + vbox.Add(grid_sizer_1, wx.EXPAND|wx.ALL, 10) + vbox.Add(buttons) + self.SetSizerAndFit(vbox) + + def get_value(self): + return self.txt_username.GetValue(), self.txt_pass.GetValue() class AboutGuiminer(wx.Dialog): donation_address = "1MDDh2h4cAZDafgc94mr9q95dhRYcJbNQo" @@ -521,22 +669,7 @@ def __init__(self, parent, id, title): panel = wx.Panel(self, -1) vbox = wx.BoxSizer(wx.VERTICAL) - text=\ -"""Python OpenCL Bitcoin Miner GUI - -Version: %s - -GUI by Chris 'Kiv' MacLeod -Original poclbm miner by m0mchil - -Get the source code or file issues at GitHub: - https://github.com/Kiv/poclbm - -If you enjoyed this software, support its development -by donating to: - -%s -""" % (__version__, AboutGuiminer.donation_address) + text = ABOUT_TEXT % (__version__, AboutGuiminer.donation_address) self.about_text = wx.StaticText(self, -1, text) self.copy_btn = wx.Button(self, -1, "Copy address to clipboard") vbox.Add(self.about_text) From 4570e96ef3c5146f6e51f8463c2027e3877ab679 Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 25 Feb 2011 15:22:17 -0400 Subject: [PATCH 013/190] Stop tray update timer on exit. Version bump. --- guiminer.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/guiminer.py b/guiminer.py index 8ce4241..9a6714e 100644 --- a/guiminer.py +++ b/guiminer.py @@ -5,7 +5,7 @@ from wx.lib.agw import flatnotebook as fnb from wx.lib.newevent import NewEvent -__version__ = '2011-02-23' +__version__ = '2011-02-25' ABOUT_TEXT = \ """Python OpenCL Bitcoin Miner GUI @@ -295,7 +295,10 @@ def stop_mining(self): if self.miner is not None: if self.miner.returncode is None: # It didn't return yet so it's still running. - self.miner.terminate() + try: + self.miner.terminate() + except OSError: + pass # TODO: Guess it wasn't still running? self.miner = None if self.miner_listener is not None: self.miner_listener.shutdown_event.set() @@ -511,6 +514,7 @@ def on_close(self, event): p.stop_mining() if self.tbicon is not None: self.tbicon.RemoveIcon() + self.tbicon.timer.Stop() self.tbicon.Destroy() event.Skip() From 2e5e38a42a4f16b6dfd6f988e7815932313a9bc5 Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 25 Feb 2011 15:28:53 -0400 Subject: [PATCH 014/190] More refactoring and docstrings. --- guiminer.py | 45 ++++++++++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/guiminer.py b/guiminer.py index 9a6714e..2951ccd 100644 --- a/guiminer.py +++ b/guiminer.py @@ -444,12 +444,12 @@ def __init__(self, *args, **kwds): self.Bind(wx.EVT_MENU, self.name_new_profile, id=wx.ID_NEW) self.Bind(wx.EVT_MENU, self.save_profiles, id=wx.ID_SAVE) self.Bind(wx.EVT_MENU, self.load_profiles, id=wx.ID_OPEN) - self.Bind(wx.EVT_MENU, self.set_paths, id=ID_PATHS) - self.Bind(wx.EVT_MENU, self.help_about, id=wx.ID_ABOUT) + self.Bind(wx.EVT_MENU, self.set_official_client_path, id=ID_PATHS) + self.Bind(wx.EVT_MENU, self.show_about_dialog, id=wx.ID_ABOUT) self.Bind(wx.EVT_MENU, self.create_solo_password, id=ID_SOLO) self.Bind(wx.EVT_MENU, self.launch_solo_server, id=ID_LAUNCH) self.Bind(wx.EVT_CLOSE, self.on_close) - self.Bind(wx.EVT_ICONIZE, self.on_minimize) + self.Bind(wx.EVT_ICONIZE, lambda event: self.Hide()) self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CLOSING, self.on_page_closing) self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CHANGED, self.on_page_changed) @@ -564,7 +564,8 @@ def load_profiles(self, event=None): panel = self.add_profile(d) return any(data) - def set_paths(self, event): + def set_official_client_path(self, event): + """Set the path to the official Bitcoin client.""" dialog = wx.FileDialog(self, "Select path to Bitcoin.exe", defaultFile="bitcoin.exe", @@ -576,13 +577,18 @@ def set_paths(self, event): self.bitcoin_executable = path dialog.Destroy() - - def help_about(self, event): + def show_about_dialog(self, event): + """Show the 'about' dialog.""" dialog = AboutGuiminer(self, -1, 'About') dialog.ShowModal() dialog.Destroy() def on_page_closing(self, event): + """Handle a tab closing event. + + If the tab has a miner running in it, we have to stop the miner + before letting the tab be removed. + """ try: p = self.profile_objects[event.GetSelection()] except IndexError: @@ -593,23 +599,27 @@ def on_page_closing(self, event): wx.YES_NO | wx.NO_DEFAULT | wx.ICON_INFORMATION) if result == wx.ID_NO: event.Veto() - return - + return p = self.profile_objects.pop(event.GetSelection()) p.stop_mining() - event.Skip() + event.Skip() # OK to close the tab now def on_page_changed(self, event): + """Handle a tab change event. + + Ensures the status bar shows the status of the tab that has focus. + """ try: p = self.profile_objects[event.GetSelection()] except IndexError: return # TODO p.on_focus() - def on_minimize(self, event): - self.Hide() - def launch_solo_server(self, event): + """Launch the official bitcoin client in server mode. + + This allows poclbm to connect to it for mining solo. + """ try: subprocess.Popen(self.bitcoin_executable + " -server") except OSError: @@ -618,11 +628,16 @@ def launch_solo_server(self, event): "Launch failed", wx.ICON_ERROR|wx.OK) return self.message( - "Server launched ok. You can start the miner now.", + "Client launched ok. You can start the miner now.", "Launched ok.", wx.OK) def create_solo_password(self, event): + """Prompt the user for login credentials to the bitcoin client. + + These are required to connect to the client over JSON-RPC and are + stored in 'bitcoin.conf'. + """ filename = os.path.join(os.getenv("APPDATA"), "Bitcoin", "bitcoin.conf") if os.path.exists(filename): result = self.message("%s already exists. Overwrite?" % filename, @@ -645,6 +660,7 @@ def create_solo_password(self, event): class SoloPasswordRequest(wx.Dialog): + """Dialog prompting user for login credentials for solo mining.""" def __init__(self, parent, title): style = wx.DEFAULT_DIALOG_STYLE vbox = wx.BoxSizer(wx.VERTICAL) @@ -664,9 +680,11 @@ def __init__(self, parent, title): self.SetSizerAndFit(vbox) def get_value(self): + """Return the (username, password) supplied by the user.""" return self.txt_username.GetValue(), self.txt_pass.GetValue() class AboutGuiminer(wx.Dialog): + """About dialog for the app with a donation address.""" donation_address = "1MDDh2h4cAZDafgc94mr9q95dhRYcJbNQo" def __init__(self, parent, id, title): wx.Dialog.__init__(self, parent, id, title) @@ -683,6 +701,7 @@ def __init__(self, parent, id, title): self.copy_btn.Bind(wx.EVT_BUTTON, self.on_copy) def on_copy(self, event): + """Copy the donation address to the clipboard.""" if wx.TheClipboard.Open(): data = wx.TextDataObject() data.SetText(AboutGuiminer.donation_address) From 6c96e9065922e33738c0467c0604adaf97143ebd Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 25 Feb 2011 15:48:35 -0400 Subject: [PATCH 015/190] Add README.txt --- README.txt | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 README.txt diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..7396cff --- /dev/null +++ b/README.txt @@ -0,0 +1,133 @@ +Python OpenCL Bitcoin Miner GUI (poclbm-gui) +============================================ + +by Chris 'Kiv' MacLeod +based on "poclbm" by m0mchil + +What is it? +----------- + +poclbm-gui is a GUI front end for the poclbm Bitcoin miner by m0mchil. It +allows you to use an OpenCL compatible video card to mine Bitcoins, without +having to use the command line. It supports both pooled mining and solo +mining. + +What is it not? +--------------- + +poclbm-gui does not replace the standard Bitcoin client from bitcoin.org - you +still need that program to view your account balance and send transactions. +It is not a server, so it has to connect either to a mining pool, or to your +computer's 'bitcoin.exe' if mining solo. + +The Latest Version +------------------ + +You can get the latest version on the project page at GitHub: + + https://github.com/Kiv/poclbm + +Features +-------- + +- Supports multiple miners in a tabbed interface. +- Remembers your login info between sessions. +- Supports both solo and pooled mining. +- Minimizes to tray. Hover on tray icon to see status. +- Displays your accepted and stale/invalid shares over time. + +Requirements +------------ + +- You need an OpenCL compatible GPU with a working version of OpenCL. If you +are unsure whether your GPU supports OpenCL, try the GPU Caps Viewer: + + http://www.ozone3d.net/gpu_caps_viewer/ + +For AMD/ATI cards, to get a version of OpenCL you need the Stream SDK which is +available here: + + http://developer.amd.com/gpu/AMDAPPSDK/downloads/pages/AMDAPPSDKDownloadArchive.aspx + +Instructions for Pooled Mining +------------------------------ + +Pooled mining is recommended for most users, since it gives steadier payouts +than solo mining. To mine in a pool, you need to register an account with a mining pool. +A good one by slush is here: + + http://mining.bitcoin.cz/ + +Once you have an account, double-click guiminer.exe to open it and enter your +miner account. You need a miner account for each GPU you have, so if you have two GPUs +you will need two separate accounts. If you have a multi-core CPU, one account is +enough but be warned that CPU mining is extremely slow compared to GPU mining and +probably not worth the electricity. + +Click "Start mining!" to connect to the server. The miner should connect and start +showing your hash rate. This is the number of attempts per second to solve the +current block. After a while the miner will also show "shares" accepted +by the pool. The more shares you have, the larger your share will be of +the 50 Bitcoins when the block is solved. + +To see if your hashing rate is comparable to others, you can look up your GPU on +this chart: + + http://pastebin.com/AvymGnMJ + +You can save your login info for next time by using File -> Save. Next time +you open the GUI your login will be remembered. + +You can run multiple CPUs/GPUs in separate tabs by using File -> New and entering +the new miner's login info. Remember to save your login info after it's entered. + +Solo Mining +----------- + +Solo mining is recommended for users with a lot of computing power available, +or if you can't find or connect to any pools. It doesn't give any award at +all unless you find a block (which takes weeks to months), at which point you +get 50 BTC all at once. + +For solo mining, instead of connecting to a pool server you connect to your own +local machine's copy of 'bitcoin.exe'. Instead of registering with the pool +server, you put your login info in a special file called 'bitcoin.conf'. + +poclbm-gui has utilities to help with these tasks. To create the bitcoin.conf, +choose "Solo utilities -> Create solo password..." and create a user and +password. It should show a message saying that it was successful. + +To launch bitcoin.exe in server mode, you might need to point poclbm-gui to +the location of bitcoin.exe. If you installed Bitcoin in the regular location +of Program Files/Bitcoin, you can skip this step. Otherwise choose "Solo +utilities -> Set Bitcoin client path". + +Then make sure bitcoin.exe is not running already and choose "Solo +utilities -> Launch Bitcoin client". This should bring up the official +Bitcoin client. You will need to leave this open while you are solo mining. + +Now you can enter your information in the text boxes. For "Server" type +"localhost" since the server is on your own machine. Put your username and +password that you chose earlier. Then press "Start mining!" to connect and +start mining. + + + +Running From Source +------------------- + +Running poclbm-gui from source requires: + - Python 2.6 or higher (Python 3 not supported) + - PyOpenCL + - wxPython + - numpy + +Once these are installed run "guiminer.py" to start. + +Bug Reporting +------------- + +This is very early software, so any bug reports are appreciated. Issues and +forks can be created at: + + https://github.com/Kiv/poclbm \ No newline at end of file From 68fdad9cc76bd90918cc365925e98065573a15ce Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 25 Feb 2011 16:00:40 -0400 Subject: [PATCH 016/190] Add screenshots --- screenshots/poclbm-gui-cpu.png | Bin 0 -> 11653 bytes screenshots/poclbm-gui-gpu.png | Bin 0 -> 17711 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 screenshots/poclbm-gui-cpu.png create mode 100644 screenshots/poclbm-gui-gpu.png diff --git a/screenshots/poclbm-gui-cpu.png b/screenshots/poclbm-gui-cpu.png new file mode 100644 index 0000000000000000000000000000000000000000..feb29057a9731feec85aca4b3cb35f5927094c4e GIT binary patch literal 11653 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 literal 0 HcmV?d00001 From fe72f8cbb152ccc5d44b849ca1839d4674350283 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sat, 26 Feb 2011 08:14:47 -0400 Subject: [PATCH 017/190] Hide tabs if a single tab is open. --- guiminer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index 2951ccd..2e73f22 100644 --- a/guiminer.py +++ b/guiminer.py @@ -395,7 +395,7 @@ def update_solo(self): class MyFrame(wx.Frame): def __init__(self, *args, **kwds): wx.Frame.__init__(self, *args, **kwds) - style = fnb.FNB_X_ON_TAB | fnb.FNB_FF2 | fnb.FNB_NO_NAV_BUTTONS + style = fnb.FNB_X_ON_TAB | fnb.FNB_FF2 | fnb.FNB_NO_NAV_BUTTONS | fnb.FNB_HIDE_ON_SINGLE_TAB self.profiles = fnb.FlatNotebook(self, -1, style=style) self.profile_objects = [] # List of ProfilePanel. # TODO: can we just get this from self.profiles? From a23c6621c0afe10728c9569c64a76271c4109323 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sat, 26 Feb 2011 10:23:50 -0400 Subject: [PATCH 018/190] Use logging module. Adjust GUI padding. --- guiminer.py | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/guiminer.py b/guiminer.py index 2e73f22..c81aca1 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1,4 +1,4 @@ -import sys, os, subprocess, errno, re, threading +import sys, os, subprocess, errno, re, threading, logging import wx import json @@ -68,6 +68,10 @@ def mkdir_p(path): if exc.errno != errno.EEXIST: raise +logging.basicConfig(filename=os.path.join(get_module_path(), 'guiminer.log'), + filemode='w', + level=logging.DEBUG) + class GUIMinerTaskBarIcon(wx.TaskBarIcon): """Taskbar icon for the GUI. @@ -125,7 +129,7 @@ def __init__(self, parent, miner): self.miner = miner def run(self): - print 'Listener started' + logging.debug('Listener started') while not self.shutdown_event.is_set(): line = self.miner.stdout.readline().strip() if not line: continue @@ -152,7 +156,7 @@ def run(self): # Possible error or new message, just pipe it through event = UpdateStatusEvent(text=line) wx.PostEvent(self.parent, event) - print 'Listener shutting down' + logging.debug('Listener shutting down') class ProfilePanel(wx.Panel): @@ -222,9 +226,8 @@ def __do_layout(self): grid_sizer_1.Add(self.txt_flags, 0, wx.EXPAND, 0) grid_sizer_1.AddGrowableCol(1) grid_sizer_1.AddGrowableCol(3) - TAB_PADDING = 10 - sizer_2.Add(grid_sizer_1, 1, wx.EXPAND|wx.ALL, TAB_PADDING) - sizer_2.Add(self.start, 0, wx.ALIGN_BOTTOM|wx.ALIGN_CENTER_HORIZONTAL, 0) + sizer_2.Add(grid_sizer_1, 1, wx.EXPAND|wx.LEFT|wx.RIGHT, 10) + sizer_2.Add(self.start, 0, wx.ALIGN_BOTTOM|wx.ALIGN_CENTER_HORIZONTAL|wx.BOTTOM, 5) self.SetSizerAndFit(sizer_2) def toggle_mining(self, event): @@ -280,7 +283,7 @@ def start_mining(self): self.txt_flags.GetValue() ) try: - print 'Running command: ', cmd + logging.debug('Running command: '+ cmd) self.miner = subprocess.Popen(cmd, cwd=folder, stdout=subprocess.PIPE) except OSError: raise #TODO @@ -525,7 +528,7 @@ def save_profiles(self, event): profile_data = [p.get_data() for p in self.profile_objects] config_data = dict(profiles=profile_data, bitcoin_executable=self.bitcoin_executable) - print 'Saving:', config_data + logging.debug('Saving: '+ str(config_data)) with open(config_filename, 'w') as f: json.dump(config_data, f) self.message("Profiles saved OK to %s." % config_filename, @@ -539,7 +542,7 @@ def load_profiles(self, event=None): return # Nothing to load yet with open(config_filename) as f: config_data = json.load(f) - print 'Loaded:', config_data + logging.debug('Loaded: ' + str(config_data)) # TODO: handle load failed or corrupted data executable = config_data.get('bitcoin_executable', None) @@ -716,9 +719,13 @@ def on_copy(self, event): global USE_MOCK USE_MOCK = '--mock' in sys.argv - app = wx.PySimpleApp(0) - wx.InitAllImageHandlers() - frame_1 = MyFrame(None, -1, "") - app.SetTopWindow(frame_1) - frame_1.Show() - app.MainLoop() + try: + app = wx.PySimpleApp(0) + wx.InitAllImageHandlers() + frame_1 = MyFrame(None, -1, "") + app.SetTopWindow(frame_1) + frame_1.Show() + app.MainLoop() + except: + logging.exception("Exception:") + raise From 29136076c56e3b7f9d2024fb2810402bfd68bd49 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sat, 26 Feb 2011 21:32:53 -0400 Subject: [PATCH 019/190] Add GNU GPL license. Tweak setup script. --- LICENSE | 675 +++++++++++++++++++++++++++++++++++++++++++++++++++- guiminer.py | 6 + setup.py | 13 +- 3 files changed, 689 insertions(+), 5 deletions(-) diff --git a/LICENSE b/LICENSE index 4ddfe2e..94a9ed0 100644 --- a/LICENSE +++ b/LICENSE @@ -1 +1,674 @@ -public domain \ No newline at end of file + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 3 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 . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/guiminer.py b/guiminer.py index c81aca1..a76c409 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1,3 +1,9 @@ +"""poclbm-gui - GUI miner for poclbm + +Copyright 2011 Chris MacLeod +This program is released until the GNU GPL. See LICENSE.txt for details. +""" + import sys, os, subprocess, errno, re, threading, logging import wx import json diff --git a/setup.py b/setup.py index 46a4ed0..fbe9fe3 100644 --- a/setup.py +++ b/setup.py @@ -1,8 +1,13 @@ from distutils.core import setup import py2exe -setup(#windows=['guiminer.py'], - console=['guiminer.py', 'poclbm.py'], +setup(windows=['guiminer.py'], + console=['poclbm.py'], # OpenCL.dll is vendor specific - options=dict(py2exe=dict(dll_excludes=['OpenCL.dll'])), - data_files = ['BitcoinMiner.cl', 'logo.png']) + options=dict(py2exe=dict( + dll_excludes=['OpenCL.dll'], + #bundle_files=1, + compressed=True, + optimize=2 + )), + data_files = ['msvcp90.dll', 'BitcoinMiner.cl', 'logo.png']) From 399c5ebf545360f367f06cd73341102711e14681 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 27 Feb 2011 13:54:39 -0400 Subject: [PATCH 020/190] Minimize to tray on close. Log to separate console tab as well as to guiminer.log. --- guiminer.py | 171 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 125 insertions(+), 46 deletions(-) diff --git a/guiminer.py b/guiminer.py index a76c409..ef73ccb 100644 --- a/guiminer.py +++ b/guiminer.py @@ -11,7 +11,7 @@ from wx.lib.agw import flatnotebook as fnb from wx.lib.newevent import NewEvent -__version__ = '2011-02-25' +__version__ = '2011-02-27' ABOUT_TEXT = \ """Python OpenCL Bitcoin Miner GUI @@ -74,9 +74,46 @@ def mkdir_p(path): if exc.errno != errno.EEXIST: raise -logging.basicConfig(filename=os.path.join(get_module_path(), 'guiminer.log'), - filemode='w', - level=logging.DEBUG) +def init_logger(): + """Set up and return the logging object and custom formatter.""" + logger = logging.getLogger("poclbm-gui") + logger.setLevel(logging.DEBUG) + file_handler = logging.FileHandler( + os.path.join(get_module_path(), 'guiminer.log'), 'w') + formatter = logging.Formatter("%(asctime)s: %(message)s", + "%Y-%m-%d %H:%M:%S") + file_handler.setFormatter(formatter) + logger.addHandler(file_handler) + return logger, formatter + +logger, formatter = init_logger() + +class ConsolePanel(wx.Panel): + """Panel that displays logging events. + + Uses with a StreamHandler to log events to a TextCtrl. Thread-safe. + """ + def __init__(self, parent): + wx.Panel.__init__(self, parent, -1) + self.parent = parent + + vbox = wx.BoxSizer(wx.VERTICAL) + style=wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL + self.text = wx.TextCtrl(self, -1, "", style=style) + vbox.Add(self.text, 1, wx.EXPAND) + self.SetSizer(vbox) + + self.handler = logging.StreamHandler(self) + logger.addHandler(self.handler) + + def on_close(self): + """On closing, stop handling logging events.""" + logger.removeHandler(self.handler) + + def write(self, text): + """Forward logging events to our TextCtrl.""" + wx.CallAfter(self.text.WriteText, text) + class GUIMinerTaskBarIcon(wx.TaskBarIcon): """Taskbar icon for the GUI. @@ -118,7 +155,7 @@ def on_taskbar_activate(self, evt): self.frame.Raise() def on_taskbar_close(self, evt): - wx.CallAfter(self.frame.Close) + wx.CallAfter(self.frame.Close, force=True) def on_update_tooltip(self, event): """Refresh the taskbar icon's status message.""" @@ -135,7 +172,7 @@ def __init__(self, parent, miner): self.miner = miner def run(self): - logging.debug('Listener started') + logger.debug('Listener for "%s" started' % self.parent.name) while not self.shutdown_event.is_set(): line = self.miner.stdout.readline().strip() if not line: continue @@ -161,8 +198,9 @@ def run(self): continue # Possible error or new message, just pipe it through event = UpdateStatusEvent(text=line) + logger.info('Listener for "%s": %s', self.parent.name, line) wx.PostEvent(self.parent, event) - logging.debug('Listener shutting down') + logger.debug('Listener for "%s" shutting down' % self.parent.name) class ProfilePanel(wx.Panel): @@ -289,7 +327,7 @@ def start_mining(self): self.txt_flags.GetValue() ) try: - logging.debug('Running command: '+ cmd) + logger.debug('Running command: ' + cmd) self.miner = subprocess.Popen(cmd, cwd=folder, stdout=subprocess.PIPE) except OSError: raise #TODO @@ -401,18 +439,20 @@ def update_solo(self): self.diff1_hashes += 1 self.update_solo_status() -class MyFrame(wx.Frame): +class PoclbmFrame(wx.Frame): def __init__(self, *args, **kwds): wx.Frame.__init__(self, *args, **kwds) style = fnb.FNB_X_ON_TAB | fnb.FNB_FF2 | fnb.FNB_NO_NAV_BUTTONS | fnb.FNB_HIDE_ON_SINGLE_TAB - self.profiles = fnb.FlatNotebook(self, -1, style=style) - self.profile_objects = [] # List of ProfilePanel. # TODO: can we just get this from self.profiles? + self.nb = fnb.FlatNotebook(self, -1, style=style) + self.profile_objects = [] # List of ProfilePanel. # TODO: can we just get this from self.nb? + self.console_panel = None self.menubar = wx.MenuBar() file_menu = wx.Menu() file_menu.Append(wx.ID_NEW, _("&New miner..."), _("Create a new miner profile"), wx.ITEM_NORMAL) file_menu.Append(wx.ID_SAVE, _("&Save settings"), _("Save your settings"), wx.ITEM_NORMAL) file_menu.Append(wx.ID_OPEN, _("&Load settings"), _("Load stored settings"), wx.ITEM_NORMAL) + file_menu.Append(wx.ID_EXIT, "", "", wx.ITEM_NORMAL) self.menubar.Append(file_menu, _("&File")) ID_SOLO, ID_PATHS, ID_LAUNCH = wx.NewId(), wx.NewId(), wx.NewId() @@ -422,8 +462,10 @@ def __init__(self, *args, **kwds): solo_menu.Append(ID_LAUNCH, "&Launch Bitcoin client", _("Launch the official Bitcoin client for solo mining"), wx.ITEM_NORMAL) self.menubar.Append(solo_menu, _("&Solo utilities")) + ID_CONSOLE = wx.NewId() help_menu = wx.Menu() - help_menu.Append(wx.ID_ABOUT, _("&About..."), "", wx.ITEM_NORMAL) + help_menu.Append(wx.ID_ABOUT, _("&About/Donate..."), "", wx.ITEM_NORMAL) + help_menu.Append(ID_CONSOLE, _("Show console"), "Show console logs", wx.ITEM_NORMAL) self.menubar.Append(help_menu, _("&Help")) self.SetMenuBar(self.menubar) self.statusbar = self.CreateStatusBar(2, 0) @@ -451,9 +493,11 @@ def __init__(self, *args, **kwds): sys.exit(1) self.Bind(wx.EVT_MENU, self.name_new_profile, id=wx.ID_NEW) - self.Bind(wx.EVT_MENU, self.save_profiles, id=wx.ID_SAVE) - self.Bind(wx.EVT_MENU, self.load_profiles, id=wx.ID_OPEN) + self.Bind(wx.EVT_MENU, self.save_config, id=wx.ID_SAVE) + self.Bind(wx.EVT_MENU, self.load_config, id=wx.ID_OPEN) + self.Bind(wx.EVT_MENU, self.on_menu_exit, id=wx.ID_EXIT) self.Bind(wx.EVT_MENU, self.set_official_client_path, id=ID_PATHS) + self.Bind(wx.EVT_MENU, self.show_console, id=ID_CONSOLE) self.Bind(wx.EVT_MENU, self.show_about_dialog, id=wx.ID_ABOUT) self.Bind(wx.EVT_MENU, self.create_solo_password, id=ID_SOLO) self.Bind(wx.EVT_MENU, self.launch_solo_server, id=ID_LAUNCH) @@ -462,10 +506,7 @@ def __init__(self, *args, **kwds): self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CLOSING, self.on_page_closing) self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CHANGED, self.on_page_changed) - any_loaded = self.load_profiles() - if not any_loaded: # Create a default one for them to use - p = self.add_profile(dict(name="slush's pool")) - + self.load_config() self.__do_layout() def __set_properties(self): @@ -478,19 +519,19 @@ def __set_properties(self): def __do_layout(self): self.vertical_sizer = wx.BoxSizer(wx.VERTICAL) - self.vertical_sizer.Add(self.profiles, 1, wx.EXPAND, 20) + self.vertical_sizer.Add(self.nb, 1, wx.EXPAND, 20) self.SetSizer(self.vertical_sizer) self.vertical_sizer.SetSizeHints(self) self.SetSizerAndFit(self.vertical_sizer) def add_profile(self, data): """Add a new ProfilePanel to the list of tabs.""" - panel = ProfilePanel(self.profiles, -1, self.devices, self.statusbar) + panel = ProfilePanel(self.nb, -1, self.devices, self.statusbar) panel.set_data(data) self.profile_objects.append(panel) - self.profiles.AddPage(panel, panel.name) + self.nb.AddPage(panel, panel.name) # The newly created profile should have focus. - self.profiles.EnsureVisible(self.profiles.GetPageCount()-1) + self.nb.EnsureVisible(self.nb.GetPageCount()-1) self.__do_layout() return panel @@ -505,7 +546,9 @@ def name_new_profile(self, event): """Prompt for the new miner's name.""" dialog = wx.TextEntryDialog(self, "Name this miner:", "New miner") if dialog.ShowModal() == wx.ID_OK: - self.add_profile(dict(name=dialog.GetValue())) + name = dialog.GetValue().strip() + if not name: name = "Untitled" + self.add_profile(dict(name=name)) def get_storage_location(self): """Get the folder and filename to store our JSON config.""" @@ -518,43 +561,53 @@ def get_storage_location(self): return folder, config_filename def on_close(self, event): - """On closing, stop any miners that are currently working.""" - for p in self.profile_objects: - p.stop_mining() - if self.tbicon is not None: - self.tbicon.RemoveIcon() - self.tbicon.timer.Stop() - self.tbicon.Destroy() - event.Skip() - - def save_profiles(self, event): + """Minimize to tray if they click "close" but exit otherwise. + + On closing, stop any miners that are currently working. + """ + if event.CanVeto(): + self.Hide() + event.Veto() + else: + if self.console_panel is not None: + self.console_panel.on_close() + for p in self.profile_objects: + p.stop_mining() + if self.tbicon is not None: + self.tbicon.RemoveIcon() + self.tbicon.timer.Stop() + self.tbicon.Destroy() + event.Skip() + + def save_config(self, event): """Save the current miner profiles to our config file in JSON format.""" folder, config_filename = self.get_storage_location() mkdir_p(folder) profile_data = [p.get_data() for p in self.profile_objects] - config_data = dict(profiles=profile_data, + config_data = dict(show_console=self.is_console_visible(), + profiles=profile_data, bitcoin_executable=self.bitcoin_executable) - logging.debug('Saving: '+ str(config_data)) + logger.debug('Saving: '+ json.dumps(config_data)) with open(config_filename, 'w') as f: json.dump(config_data, f) self.message("Profiles saved OK to %s." % config_filename, "Save successful", wx.OK|wx.ICON_INFORMATION) # TODO: handle save failed - def load_profiles(self, event=None): + def load_config(self, event=None): """Load JSON profile info from the config file.""" - folder, config_filename = self.get_storage_location() + _, config_filename = self.get_storage_location() if not os.path.exists(config_filename): return # Nothing to load yet with open(config_filename) as f: config_data = json.load(f) - logging.debug('Loaded: ' + str(config_data)) + logger.debug('Loaded: ' + json.dumps(config_data)) # TODO: handle load failed or corrupted data executable = config_data.get('bitcoin_executable', None) if executable is not None: self.bitcoin_executable = executable - + # Shut down any existing miners before they get clobbered if(any(p.is_mining for p in self.profile_objects)): result = self.message( @@ -565,14 +618,19 @@ def load_profiles(self, event=None): while self.profile_objects: p = self.profile_objects.pop() p.stop_mining() - for i in reversed(range(self.profiles.GetPageCount())): - self.profiles.DeletePage(i) + for i in reversed(range(self.nb.GetPageCount())): + self.nb.DeletePage(i) # Create new miners data = config_data.get('profiles', []) for d in data: - panel = self.add_profile(d) - return any(data) + self.add_profile(d) + + if not any(data): # Create a default one for them to use + self.add_profile(dict(name="slush's pool")) + if config_data.get('show_console', False): + self.show_console() + def set_official_client_path(self, event): """Set the path to the official Bitcoin client.""" dialog = wx.FileDialog(self, @@ -594,10 +652,17 @@ def show_about_dialog(self, event): def on_page_closing(self, event): """Handle a tab closing event. - + + If they are closing the console, we have to shut down the logger. If the tab has a miner running in it, we have to stop the miner before letting the tab be removed. """ + console_index = self.nb.GetPageIndex(self.console_panel) + if event.GetSelection() == console_index: + self.console_panel.on_close() + event.Skip() + return + try: p = self.profile_objects[event.GetSelection()] except IndexError: @@ -666,7 +731,21 @@ def create_solo_password(self, event): f.close() self.message("Wrote bitcoin.conf ok.", "Success", wx.OK) + + def is_console_visible(self): + """Return True if the console is visible.""" + return self.nb.GetPageIndex(self.console_panel) != -1 + def show_console(self, event=None): + """Show the console log in its own tab.""" + if self.is_console_visible(): + return # Console already shown + self.console_panel = ConsolePanel(self) + self.nb.AddPage(self.console_panel, "Console") + + def on_menu_exit(self, event): + self.Close(force=True) + class SoloPasswordRequest(wx.Dialog): """Dialog prompting user for login credentials for solo mining.""" @@ -692,12 +771,12 @@ def get_value(self): """Return the (username, password) supplied by the user.""" return self.txt_username.GetValue(), self.txt_pass.GetValue() + class AboutGuiminer(wx.Dialog): """About dialog for the app with a donation address.""" donation_address = "1MDDh2h4cAZDafgc94mr9q95dhRYcJbNQo" def __init__(self, parent, id, title): wx.Dialog.__init__(self, parent, id, title) - panel = wx.Panel(self, -1) vbox = wx.BoxSizer(wx.VERTICAL) text = ABOUT_TEXT % (__version__, AboutGuiminer.donation_address) @@ -728,7 +807,7 @@ def on_copy(self, event): try: app = wx.PySimpleApp(0) wx.InitAllImageHandlers() - frame_1 = MyFrame(None, -1, "") + frame_1 = PoclbmFrame(None, -1, "") app.SetTopWindow(frame_1) frame_1.Show() app.MainLoop() From a363d5e75f67fe99fecd492eb0ff3a63a506428b Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 27 Feb 2011 13:55:36 -0400 Subject: [PATCH 021/190] Format code with pydev --- guiminer.py | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/guiminer.py b/guiminer.py index ef73ccb..7715e3e 100644 --- a/guiminer.py +++ b/guiminer.py @@ -80,7 +80,7 @@ def init_logger(): logger.setLevel(logging.DEBUG) file_handler = logging.FileHandler( os.path.join(get_module_path(), 'guiminer.log'), 'w') - formatter = logging.Formatter("%(asctime)s: %(message)s", + formatter = logging.Formatter("%(asctime)s: %(message)s", "%Y-%m-%d %H:%M:%S") file_handler.setFormatter(formatter) logger.addHandler(file_handler) @@ -98,7 +98,7 @@ def __init__(self, parent): self.parent = parent vbox = wx.BoxSizer(wx.VERTICAL) - style=wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL + style = wx.TE_MULTILINE | wx.TE_READONLY | wx.HSCROLL self.text = wx.TextCtrl(self, -1, "", style=style) vbox.Add(self.text, 1, wx.EXPAND) self.SetSizer(vbox) @@ -122,9 +122,9 @@ class GUIMinerTaskBarIcon(wx.TaskBarIcon): TODO: right click on taskbar icon to open menu with some stuff in it. """ TBMENU_RESTORE = wx.NewId() - TBMENU_CLOSE = wx.NewId() - TBMENU_CHANGE = wx.NewId() - TBMENU_REMOVE = wx.NewId() + TBMENU_CLOSE = wx.NewId() + TBMENU_CHANGE = wx.NewId() + TBMENU_REMOVE = wx.NewId() def __init__(self, frame): wx.TaskBarIcon.__init__(self) @@ -144,7 +144,7 @@ def CreatePopupMenu(self): """Override from wx.TaskBarIcon. Creates the right-click menu.""" menu = wx.Menu() menu.Append(self.TBMENU_RESTORE, "Restore") - menu.Append(self.TBMENU_CLOSE, "Close") + menu.Append(self.TBMENU_CLOSE, "Close") return menu def on_taskbar_activate(self, evt): @@ -256,22 +256,22 @@ def __do_layout(self): sizer_2 = wx.BoxSizer(wx.VERTICAL) grid_sizer_1 = wx.FlexGridSizer(3, 4, 5, 5) sizer_2.Add((20, 10), 0, wx.EXPAND, 0) - grid_sizer_1.Add(self.server_lbl, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) + grid_sizer_1.Add(self.server_lbl, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_1.Add(self.txt_server, 0, wx.EXPAND, 0) - grid_sizer_1.Add(self.port_lbl, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) + grid_sizer_1.Add(self.port_lbl, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_1.Add(self.txt_port, 0, wx.EXPAND, 0) - grid_sizer_1.Add(self.user_lbl, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) + grid_sizer_1.Add(self.user_lbl, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_1.Add(self.txt_username, 0, wx.EXPAND, 0) - grid_sizer_1.Add(self.pass_lbl, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) + grid_sizer_1.Add(self.pass_lbl, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_1.Add(self.txt_pass, 0, wx.EXPAND, 0) - grid_sizer_1.Add(self.device_lbl, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) + grid_sizer_1.Add(self.device_lbl, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_1.Add(self.device_listbox, 0, wx.EXPAND, 0) - grid_sizer_1.Add(self.flags_lbl, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) + grid_sizer_1.Add(self.flags_lbl, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_1.Add(self.txt_flags, 0, wx.EXPAND, 0) grid_sizer_1.AddGrowableCol(1) grid_sizer_1.AddGrowableCol(3) - sizer_2.Add(grid_sizer_1, 1, wx.EXPAND|wx.LEFT|wx.RIGHT, 10) - sizer_2.Add(self.start, 0, wx.ALIGN_BOTTOM|wx.ALIGN_CENTER_HORIZONTAL|wx.BOTTOM, 5) + sizer_2.Add(grid_sizer_1, 1, wx.EXPAND | wx.LEFT | wx.RIGHT, 10) + sizer_2.Add(self.start, 0, wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_HORIZONTAL | wx.BOTTOM, 5) self.SetSizerAndFit(sizer_2) def toggle_mining(self, event): @@ -356,7 +356,7 @@ def stop_mining(self): def format_khash(self, rate): """Format rate for display. A rate of 0 means just connected.""" if rate > 1000: - return "%.1f Mhash/s" % (rate/1000.) + return "%.1f Mhash/s" % (rate / 1000.) elif rate == 0: return "Connected." else: @@ -531,7 +531,7 @@ def add_profile(self, data): self.profile_objects.append(panel) self.nb.AddPage(panel, panel.name) # The newly created profile should have focus. - self.nb.EnsureVisible(self.nb.GetPageCount()-1) + self.nb.EnsureVisible(self.nb.GetPageCount() - 1) self.__do_layout() return panel @@ -587,11 +587,11 @@ def save_config(self, event): config_data = dict(show_console=self.is_console_visible(), profiles=profile_data, bitcoin_executable=self.bitcoin_executable) - logger.debug('Saving: '+ json.dumps(config_data)) + logger.debug('Saving: ' + json.dumps(config_data)) with open(config_filename, 'w') as f: json.dump(config_data, f) self.message("Profiles saved OK to %s." % config_filename, - "Save successful", wx.OK|wx.ICON_INFORMATION) + "Save successful", wx.OK | wx.ICON_INFORMATION) # TODO: handle save failed def load_config(self, event=None): @@ -699,7 +699,7 @@ def launch_solo_server(self, event): except OSError: self.message( "Couldn't find Bitcoin at %s. Is your path set correctly?" % self.bitcoin_executable, - "Launch failed", wx.ICON_ERROR|wx.OK) + "Launch failed", wx.ICON_ERROR | wx.OK) return self.message( "Client launched ok. You can start the miner now.", @@ -758,12 +758,12 @@ def __init__(self, parent, title): self.pass_lbl = wx.StaticText(self, -1, _("Password:")) self.txt_pass = wx.TextCtrl(self, -1, _(""), style=wx.TE_PASSWORD) grid_sizer_1 = wx.FlexGridSizer(2, 2, 5, 5) - grid_sizer_1.Add(self.user_lbl, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) + grid_sizer_1.Add(self.user_lbl, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_1.Add(self.txt_username, 0, wx.EXPAND, 0) - grid_sizer_1.Add(self.pass_lbl, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) + grid_sizer_1.Add(self.pass_lbl, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_1.Add(self.txt_pass, 0, wx.EXPAND, 0) - buttons = self.CreateButtonSizer(wx.OK|wx.CANCEL) - vbox.Add(grid_sizer_1, wx.EXPAND|wx.ALL, 10) + buttons = self.CreateButtonSizer(wx.OK | wx.CANCEL) + vbox.Add(grid_sizer_1, wx.EXPAND | wx.ALL, 10) vbox.Add(buttons) self.SetSizerAndFit(vbox) @@ -783,7 +783,7 @@ def __init__(self, parent, id, title): self.about_text = wx.StaticText(self, -1, text) self.copy_btn = wx.Button(self, -1, "Copy address to clipboard") vbox.Add(self.about_text) - vbox.Add(self.copy_btn, 0, wx.ALIGN_BOTTOM|wx.ALIGN_CENTER_HORIZONTAL, 0) + vbox.Add(self.copy_btn, 0, wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_HORIZONTAL, 0) self.SetSizer(vbox) self.copy_btn.Bind(wx.EVT_BUTTON, self.on_copy) From cec09dc17077f333c8bae1a020bcdd8d48e85675 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 27 Feb 2011 13:57:13 -0400 Subject: [PATCH 022/190] Fix bug when closing console, then closing program --- guiminer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/guiminer.py b/guiminer.py index 7715e3e..ea9a6ec 100644 --- a/guiminer.py +++ b/guiminer.py @@ -660,6 +660,7 @@ def on_page_closing(self, event): console_index = self.nb.GetPageIndex(self.console_panel) if event.GetSelection() == console_index: self.console_panel.on_close() + self.console_panel = None event.Skip() return From da35df39e9fb1b4e8fe9577c50e452f29994ecf5 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 27 Feb 2011 14:57:51 -0400 Subject: [PATCH 023/190] Add tooltips to text fields. Avoid showing console window when frozen. --- guiminer.py | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/guiminer.py b/guiminer.py index ea9a6ec..ef04230 100644 --- a/guiminer.py +++ b/guiminer.py @@ -73,6 +73,11 @@ def mkdir_p(path): except OSError as exc: if exc.errno != errno.EEXIST: raise + +def add_tooltip(widget, text): + """Add a tooltip to widget with the specified text.""" + tooltip = wx.ToolTip(_(text)) + widget.SetToolTip(tooltip) def init_logger(): """Set up and return the logging object and custom formatter.""" @@ -250,7 +255,18 @@ def __init__(self, parent, id, devices, statusbar): self.Bind(EVT_UPDATE_ACCEPTED, lambda event: self.update_shares(event.accepted)) self.Bind(EVT_UPDATE_STATUS, lambda event: self.update_status(event.text)) self.Bind(EVT_UPDATE_SOLOCHECK, lambda event: self.update_solo()) - self.update_shares_on_statusbar() + self.update_shares_on_statusbar() + + add_tooltip(self.txt_server, + "Server address, without http:// prefix.\nPooled mining example: mining.bitcoin.cz\nSolo mining example: localhost") + add_tooltip(self.txt_port, + "Server port. This is usually 8332.") + add_tooltip(self.txt_username, + "For pooled mining, the miner username (not your account username).\nExample: Kiv.GPU") + add_tooltip(self.txt_pass, + "For pooled mining, the miner password (not your account password).") + add_tooltip(self.txt_flags, + "Extra flags to pass to the miner.\nFor Radeon HD 5xxx use -v -w128 for best results.") def __do_layout(self): sizer_2 = wx.BoxSizer(wx.VERTICAL) @@ -326,9 +342,16 @@ def start_mining(self): self.device_listbox.GetSelection(), self.txt_flags.GetValue() ) + # Avoid showing a console window when frozen + try: import win32process + except ImportError: flags = 0 + else: flags = win32process.CREATE_NO_WINDOW + try: logger.debug('Running command: ' + cmd) - self.miner = subprocess.Popen(cmd, cwd=folder, stdout=subprocess.PIPE) + self.miner = subprocess.Popen(cmd, cwd=folder, + stdout=subprocess.PIPE, + creationflags=flags) except OSError: raise #TODO self.miner_listener = MinerListenerThread(self, self.miner) From 7165e3216874ef82afdadd6dacbd3cae9c57e24d Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 27 Feb 2011 15:01:33 -0400 Subject: [PATCH 024/190] Add device tooltip --- guiminer.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/guiminer.py b/guiminer.py index ef04230..5034e93 100644 --- a/guiminer.py +++ b/guiminer.py @@ -257,6 +257,8 @@ def __init__(self, parent, id, devices, statusbar): self.Bind(EVT_UPDATE_SOLOCHECK, lambda event: self.update_solo()) self.update_shares_on_statusbar() + add_tooltip(self.device_listbox, + "Available OpenCL devices on your system.") add_tooltip(self.txt_server, "Server address, without http:// prefix.\nPooled mining example: mining.bitcoin.cz\nSolo mining example: localhost") add_tooltip(self.txt_port, From a2caf4f7cb3872ca34164b065409664b76def279 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 27 Feb 2011 15:23:56 -0400 Subject: [PATCH 025/190] Include license in distribution. Use .txt extension to be more friendly to Windows users. --- LICENSE => LICENSE.txt | 0 setup.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename LICENSE => LICENSE.txt (100%) diff --git a/LICENSE b/LICENSE.txt similarity index 100% rename from LICENSE rename to LICENSE.txt diff --git a/setup.py b/setup.py index fbe9fe3..689d57e 100644 --- a/setup.py +++ b/setup.py @@ -10,4 +10,4 @@ compressed=True, optimize=2 )), - data_files = ['msvcp90.dll', 'BitcoinMiner.cl', 'logo.png']) + data_files = ['msvcp90.dll', 'BitcoinMiner.cl', 'logo.png', 'LICENSE.txt']) From af63244241c3f5068917522959c381d984754b26 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 6 Mar 2011 09:04:23 -0400 Subject: [PATCH 026/190] Show last accepted time in status bar. --- guiminer.py | 29 ++++++++++++++++++++++++----- mockBitcoinMiner.py | 2 +- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/guiminer.py b/guiminer.py index 5034e93..53dff29 100644 --- a/guiminer.py +++ b/guiminer.py @@ -4,7 +4,7 @@ This program is released until the GNU GPL. See LICENSE.txt for details. """ -import sys, os, subprocess, errno, re, threading, logging +import sys, os, subprocess, errno, re, threading, logging, time import wx import json @@ -233,6 +233,7 @@ def __init__(self, parent, id, devices, statusbar): self.diff1_hashes = 0 # SOLO mode only self.last_rate = 0 # units of khash/s self.last_update_type = ProfilePanel.POOL + self.last_update_time = None self.server_lbl = wx.StaticText(self, -1, _("Server:")) self.txt_server = wx.TextCtrl(self, -1, "mining.bitcoin.cz") self.port_lbl = wx.StaticText(self, -1, _("Port:")) @@ -245,6 +246,8 @@ def __init__(self, parent, id, devices, statusbar): self.device_listbox = wx.ComboBox(self, -1, choices=devices, style=wx.CB_DROPDOWN) self.flags_lbl = wx.StaticText(self, -1, _("Extra flags:")) self.txt_flags = wx.TextCtrl(self, -1, "") + + #self.chk_autostart = wx.CheckBox(self, -1, "Start this miner when the GUI starts") self.start = wx.Button(self, -1, _("Start mining!")) self.device_listbox.SetSelection(0) @@ -272,7 +275,7 @@ def __init__(self, parent, id, devices, statusbar): def __do_layout(self): sizer_2 = wx.BoxSizer(wx.VERTICAL) - grid_sizer_1 = wx.FlexGridSizer(3, 4, 5, 5) + grid_sizer_1 = wx.FlexGridSizer(4, 4, 5, 5) sizer_2.Add((20, 10), 0, wx.EXPAND, 0) grid_sizer_1.Add(self.server_lbl, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_1.Add(self.txt_server, 0, wx.EXPAND, 0) @@ -289,6 +292,7 @@ def __do_layout(self): grid_sizer_1.AddGrowableCol(1) grid_sizer_1.AddGrowableCol(3) sizer_2.Add(grid_sizer_1, 1, wx.EXPAND | wx.LEFT | wx.RIGHT, 10) + #sizer_2.Add(self.chk_autostart, 0, wx.EXPAND, 0) # TODO sizer_2.Add(self.start, 0, wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_HORIZONTAL | wx.BOTTOM, 5) self.SetSizerAndFit(sizer_2) @@ -401,10 +405,22 @@ def update_khash(self, rate): def update_shares_on_statusbar(self): """For pooled mining, show the shares on the statusbar.""" - text = "Shares: %d accepted, %d stale/invalid" % \ - (self.accepted_shares, self.invalid_shares) + text = "Shares: %d accepted, %d stale/invalid %s " % \ + (self.accepted_shares, self.invalid_shares, + self.format_last_update_time()) self.set_status(text, 0) + def update_last_time(self): + """Set the last update time to now (in local time).""" + self.last_update_time = time.localtime() + + def format_last_update_time(self): + """Format last update time for display.""" + time_fmt = '%I:%M:%S%p' + if self.last_update_time is None: + return "" + return "(last at %s)" % time.strftime(time_fmt, self.last_update_time) + def update_shares(self, accepted): """Update our shares with a report from the listener thread.""" self.last_update_type = ProfilePanel.POOL @@ -412,6 +428,7 @@ def update_shares(self, accepted): self.accepted_shares += 1 else: self.invalid_shares += 1 + self.update_last_time() self.update_shares_on_statusbar() def update_status(self, msg): @@ -455,13 +472,15 @@ def update_solo_status(self): since some small fraction of easy hashes are also valid solutions to the block. """ - text = "Difficulty 1 hashes: %d" % self.diff1_hashes + text = "Difficulty 1 hashes: %d %s" % \ + (self.diff1_hashes, self.format_last_update_time()) self.set_status(text, 0) def update_solo(self): """Update our easy hashes with a report from the listener thread.""" self.last_update_type = ProfilePanel.SOLO self.diff1_hashes += 1 + self.update_last_time() self.update_solo_status() class PoclbmFrame(wx.Frame): diff --git a/mockBitcoinMiner.py b/mockBitcoinMiner.py index 87cf6db..3c4ed50 100644 --- a/mockBitcoinMiner.py +++ b/mockBitcoinMiner.py @@ -48,7 +48,7 @@ def mine(self): self.start() try: while True: - time.sleep(random.randint(3, 10)) + time.sleep(random.randint(3, 5)) hash = random.randint(0, 0xffffffff) accepted = (random.random() < 0.9) self.blockFound(struct.pack('I', long(hash)).encode('hex'), accepted) From 7a07b4dbad2758a2907dab4d96cd17aba1726921 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 6 Mar 2011 09:42:48 -0400 Subject: [PATCH 027/190] Remove profile_objects member and get miner panels directly from the notebook instead. Fix bug where the wrong status would be shown.ww --- guiminer.py | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/guiminer.py b/guiminer.py index 53dff29..9063321 100644 --- a/guiminer.py +++ b/guiminer.py @@ -164,7 +164,7 @@ def on_taskbar_close(self, evt): def on_update_tooltip(self, event): """Refresh the taskbar icon's status message.""" - objs = self.frame.profile_objects + objs = self.frame.profile_panels if objs: text = '\n'.join(p.get_taskbar_text() for p in objs) self.SetIcon(self.icon, text) @@ -487,8 +487,7 @@ class PoclbmFrame(wx.Frame): def __init__(self, *args, **kwds): wx.Frame.__init__(self, *args, **kwds) style = fnb.FNB_X_ON_TAB | fnb.FNB_FF2 | fnb.FNB_NO_NAV_BUTTONS | fnb.FNB_HIDE_ON_SINGLE_TAB - self.nb = fnb.FlatNotebook(self, -1, style=style) - self.profile_objects = [] # List of ProfilePanel. # TODO: can we just get this from self.nb? + self.nb = fnb.FlatNotebook(self, -1, style=style) self.console_panel = None self.menubar = wx.MenuBar() @@ -568,11 +567,16 @@ def __do_layout(self): self.vertical_sizer.SetSizeHints(self) self.SetSizerAndFit(self.vertical_sizer) + @property + def profile_panels(self): + """Return a list of currently available ProfilePanel.""" + pages = [self.nb.GetPage(i) for i in range(self.nb.GetPageCount())] + return [p for p in pages if p != self.console_panel] + def add_profile(self, data): """Add a new ProfilePanel to the list of tabs.""" panel = ProfilePanel(self.nb, -1, self.devices, self.statusbar) panel.set_data(data) - self.profile_objects.append(panel) self.nb.AddPage(panel, panel.name) # The newly created profile should have focus. self.nb.EnsureVisible(self.nb.GetPageCount() - 1) @@ -615,7 +619,7 @@ def on_close(self, event): else: if self.console_panel is not None: self.console_panel.on_close() - for p in self.profile_objects: + for p in self.profile_panels: p.stop_mining() if self.tbicon is not None: self.tbicon.RemoveIcon() @@ -627,7 +631,7 @@ def save_config(self, event): """Save the current miner profiles to our config file in JSON format.""" folder, config_filename = self.get_storage_location() mkdir_p(folder) - profile_data = [p.get_data() for p in self.profile_objects] + profile_data = [p.get_data() for p in self.profile_panels] config_data = dict(show_console=self.is_console_visible(), profiles=profile_data, bitcoin_executable=self.bitcoin_executable) @@ -653,17 +657,15 @@ def load_config(self, event=None): self.bitcoin_executable = executable # Shut down any existing miners before they get clobbered - if(any(p.is_mining for p in self.profile_objects)): + if(any(p.is_mining for p in self.profile_panels)): result = self.message( "Loading profiles will stop any currently running miners. Continue?", "Load profile", wx.YES_NO | wx.NO_DEFAULT | wx.ICON_INFORMATION) if result == wx.ID_NO: return - while self.profile_objects: - p = self.profile_objects.pop() + for p in reversed(self.profile_panels): p.stop_mining() - for i in reversed(range(self.nb.GetPageCount())): - self.nb.DeletePage(i) + self.nb.DeletePage(self.nb.GetPageIndex(p)) # Create new miners data = config_data.get('profiles', []) for d in data: @@ -707,11 +709,7 @@ def on_page_closing(self, event): self.console_panel = None event.Skip() return - - try: - p = self.profile_objects[event.GetSelection()] - except IndexError: - return # TODO + p = self.nb.GetPage(event.GetSelection()) if p.is_mining: result = self.message( "Closing this miner will stop it. Continue?", "Close miner", @@ -719,7 +717,6 @@ def on_page_closing(self, event): if result == wx.ID_NO: event.Veto() return - p = self.profile_objects.pop(event.GetSelection()) p.stop_mining() event.Skip() # OK to close the tab now @@ -728,11 +725,12 @@ def on_page_changed(self, event): Ensures the status bar shows the status of the tab that has focus. """ - try: - p = self.profile_objects[event.GetSelection()] - except IndexError: - return # TODO - p.on_focus() + p = self.nb.GetPage(event.GetSelection()) + if p == self.console_panel: + self.statusbar.SetStatusText("", 0) + self.statusbar.SetStatusText("", 1) + else: + p.on_focus() def launch_solo_server(self, event): """Launch the official bitcoin client in server mode. From f6a4f3ed6a0ee74f22a0e2b4d07591ad52211a8a Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 6 Mar 2011 13:51:49 -0400 Subject: [PATCH 028/190] Add summary panel. Add autostart functionality. --- guiminer.py | 256 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 216 insertions(+), 40 deletions(-) diff --git a/guiminer.py b/guiminer.py index 9063321..cf8a2e8 100644 --- a/guiminer.py +++ b/guiminer.py @@ -79,6 +79,17 @@ def add_tooltip(widget, text): tooltip = wx.ToolTip(_(text)) widget.SetToolTip(tooltip) +def format_khash(rate): + """Format rate for display. A rate of 0 means just connected.""" + if rate > 10**6: + return "%.1f Ghash/s" % (rate / 1000000.) + if rate > 10**3: + return "%.1f Mhash/s" % (rate / 1000.) + elif rate == 0: + return "Connected" + else: + return "%d khash/s" % rate + def init_logger(): """Set up and return the logging object and custom formatter.""" logger = logging.getLogger("poclbm-gui") @@ -110,6 +121,12 @@ def __init__(self, parent): self.handler = logging.StreamHandler(self) logger.addHandler(self.handler) + + def on_focus(self): + """On focus, clear the status bar.""" + # TODO: could show something helpful on the statusbar instead + self.parent.statusbar.SetStatusText("", 0) + self.parent.statusbar.SetStatusText("", 1) def on_close(self): """On closing, stop handling logging events.""" @@ -120,11 +137,67 @@ def write(self, text): wx.CallAfter(self.text.WriteText, text) +class SummaryPanel(wx.Panel): + """Panel that displays a summary of all miners.""" + + def __init__(self, parent): + wx.Panel.__init__(self, parent, -1) + self.parent = parent + + flags = wx.ALIGN_CENTER_HORIZONTAL | wx.ALL + border = 5 + self.column_headers = [ + (wx.StaticText(self, -1, _("Miner")), 0, flags, border), + (wx.StaticText(self, -1, _("Speed")), 0, flags, border), + (wx.StaticText(self, -1, _("Accepted")), 0, flags, border), + (wx.StaticText(self, -1, _("Stale")), 0, flags, border), + (wx.StaticText(self, -1, _("Start/Stop")), 0, flags, border), + (wx.StaticText(self, -1, _("Autostart")), 0, flags, border), + ] + + self.grid = wx.FlexGridSizer(0, len(self.column_headers), 2, 2) + + self.grid.AddMany(self.column_headers) + self.add_miners_to_grid() + + self.grid.AddGrowableCol(0) + self.grid.AddGrowableCol(1) + self.grid.AddGrowableCol(2) + self.grid.AddGrowableCol(3) + self.SetSizer(self.grid) + + def add_miners_to_grid(self): + """Add a summary row for each miner to the summary grid.""" + + # Remove any existing widgets except the column headers. + for i in reversed(range(len(self.column_headers), len(self.grid.GetChildren()))): + self.grid.Hide(i) + self.grid.Remove(i) + + for p in self.parent.profile_panels: + print p.name + p.clear_summary_widgets() + self.grid.AddMany(p.get_summary_widgets(self)) + + self.grid.Layout() + + def on_close(self): + pass + + def on_focus(self): + """On focus, show the statusbar text.""" + self.parent.statusbar.SetStatusText("", 0) # TODO: show something + total_rate = sum(p.last_rate for p in self.parent.profile_panels + if p.is_mining) + if any(p.is_mining for p in self.parent.profile_panels): + self.parent.statusbar.SetStatusText(format_khash(total_rate), 1) + else: + self.parent.statusbar.SetStatusText("", 0) + class GUIMinerTaskBarIcon(wx.TaskBarIcon): """Taskbar icon for the GUI. Shows status messages on hover and opens on click. - TODO: right click on taskbar icon to open menu with some stuff in it. """ TBMENU_RESTORE = wx.NewId() TBMENU_CLOSE = wx.NewId() @@ -219,7 +292,7 @@ class ProfilePanel(wx.Panel): whether the poclbm instance is working solo or in a pool. """ SOLO, POOL = range(2) - def __init__(self, parent, id, devices, statusbar): + def __init__(self, parent, id, devices, statusbar, data): wx.Panel.__init__(self, parent, id) self.parent = parent self.name = "Miner" @@ -234,6 +307,7 @@ def __init__(self, parent, id, devices, statusbar): self.last_rate = 0 # units of khash/s self.last_update_type = ProfilePanel.POOL self.last_update_time = None + self.autostart = False self.server_lbl = wx.StaticText(self, -1, _("Server:")) self.txt_server = wx.TextCtrl(self, -1, "mining.bitcoin.cz") self.port_lbl = wx.StaticText(self, -1, _("Port:")) @@ -246,11 +320,12 @@ def __init__(self, parent, id, devices, statusbar): self.device_listbox = wx.ComboBox(self, -1, choices=devices, style=wx.CB_DROPDOWN) self.flags_lbl = wx.StaticText(self, -1, _("Extra flags:")) self.txt_flags = wx.TextCtrl(self, -1, "") - + #self.chk_autostart = wx.CheckBox(self, -1, "Start this miner when the GUI starts") self.start = wx.Button(self, -1, _("Start mining!")) self.device_listbox.SetSelection(0) + self.set_data(data) self.__do_layout() self.start.Bind(wx.EVT_BUTTON, self.toggle_mining) @@ -272,11 +347,70 @@ def __init__(self, parent, id, devices, statusbar): "For pooled mining, the miner password (not your account password).") add_tooltip(self.txt_flags, "Extra flags to pass to the miner.\nFor Radeon HD 5xxx use -v -w128 for best results.") + + self.clear_summary_widgets() + + def clear_summary_widgets(self): + """Release all our summary widgets.""" + self.summary_name = None + self.summary_status = None + self.summary_shares_accepted = None + self.summary_shares_stale = None + self.summary_start = None + self.summary_autostart = None + + def get_start_stop_state(self): + """Return appropriate text for the start/stop button.""" + return "Stop" if self.is_mining else "Start" + + def update_summary(self): + """Update our summary fields if possible.""" + if not self.summary_name: + return # Assume none of the other fields are there either + + self.summary_name.SetLabel(self.name) + if not self.is_mining: + text = "Stopped" + elif self.is_possible_error: + text = "Connection problems" + else: + text = format_khash(self.last_rate) + self.summary_status.SetLabel(text) + + if self.last_update_type == ProfilePanel.SOLO: + self.summary_shares_accepted.SetLabel(str(self.diff1_hashes)) + self.summary_shares_invalid.SetLabel("-") + else: # TODO: we assume POOL here + self.summary_shares_accepted.SetLabel(str(self.accepted_shares)) + self.summary_shares_invalid.SetLabel(str(self.invalid_shares)) + + self.summary_start.SetLabel(self.get_start_stop_state()) + self.summary_autostart.SetValue(self.autostart) + + def get_summary_widgets(self, summary_panel): + """Return a list of summary widgets suitable for sizer.AddMany.""" + self.summary_name = wx.StaticText(summary_panel, -1, self.name) + self.summary_status = wx.StaticText(summary_panel, -1, "Stopped") + self.summary_shares_accepted = wx.StaticText(summary_panel, -1, "0") + self.summary_shares_invalid = wx.StaticText(summary_panel, -1, "0") + self.summary_start = wx.Button(summary_panel, -1, self.get_start_stop_state(), style=wx.BU_EXACTFIT) + self.summary_start.Bind(wx.EVT_BUTTON, self.toggle_mining) + self.summary_autostart = wx.CheckBox(summary_panel, -1) + self.summary_autostart.Bind(wx.EVT_CHECKBOX, self.toggle_autostart) + self.summary_autostart.SetValue(self.autostart) + return [ + (self.summary_name, 0, wx.ALIGN_CENTER_HORIZONTAL), + (self.summary_status, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.EXPAND, 0), + (self.summary_shares_accepted, 0, wx.ALIGN_CENTER_HORIZONTAL, 0), + (self.summary_shares_invalid, 0, wx.ALIGN_CENTER_HORIZONTAL, 0), + (self.summary_start, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.LEFT|wx.RIGHT, 0), + (self.summary_autostart, 0, wx.ALIGN_CENTER, 0) + ] def __do_layout(self): sizer_2 = wx.BoxSizer(wx.VERTICAL) - grid_sizer_1 = wx.FlexGridSizer(4, 4, 5, 5) sizer_2.Add((20, 10), 0, wx.EXPAND, 0) + grid_sizer_1 = wx.FlexGridSizer(4, 4, 5, 5) grid_sizer_1.Add(self.server_lbl, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_1.Add(self.txt_server, 0, wx.EXPAND, 0) grid_sizer_1.Add(self.port_lbl, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) @@ -296,14 +430,17 @@ def __do_layout(self): sizer_2.Add(self.start, 0, wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_HORIZONTAL | wx.BOTTOM, 5) self.SetSizerAndFit(sizer_2) + def toggle_autostart(self, event): + self.autostart = event.IsChecked() + def toggle_mining(self, event): """Stop or start the miner.""" if self.is_mining: - self.stop_mining() - self.start.SetLabel("Start mining!") + self.stop_mining() else: self.start_mining() - self.start.SetLabel("Stop mining") + self.start.SetLabel("%s mining!" % self.get_start_stop_state()) + self.update_summary() def get_data(self): """Return a dict of our profile data.""" @@ -313,7 +450,8 @@ def get_data(self): username=self.txt_username.GetValue(), password=self.txt_pass.GetValue(), device=self.device_listbox.GetSelection(), - flags=self.txt_flags.GetValue()) + flags=self.txt_flags.GetValue(), + autostart=self.autostart) def set_data(self, data): """Set our profile data to the information in data. See get_data().""" @@ -323,6 +461,7 @@ def set_data(self, data): if 'port' in data: self.txt_port.SetValue(data['port']) if 'password' in data: self.txt_pass.SetValue(data['password']) if 'flags' in data: self.txt_flags.SetValue(data['flags']) + if 'autostart' in data: self.autostart = data['autostart'] # Handle case where they removed devices since last run. device_index = data.get('device', None) @@ -381,16 +520,7 @@ def stop_mining(self): self.miner_listener = None self.is_mining = False self.set_status("Stopped", 1) - - def format_khash(self, rate): - """Format rate for display. A rate of 0 means just connected.""" - if rate > 1000: - return "%.1f Mhash/s" % (rate / 1000.) - elif rate == 0: - return "Connected." - else: - return "%d khash/s" % rate - + def update_khash(self, rate): """Update our rate according to a report from the listener thread. @@ -398,10 +528,11 @@ def update_khash(self, rate): reporting errors. """ self.last_rate = rate - self.set_status(self.format_khash(rate), 1) + self.set_status(format_khash(rate), 1) if self.is_possible_error: self.update_shares_on_statusbar() self.is_possible_error = False + self.update_summary() def update_shares_on_statusbar(self): """For pooled mining, show the shares on the statusbar.""" @@ -430,6 +561,7 @@ def update_shares(self, accepted): self.invalid_shares += 1 self.update_last_time() self.update_shares_on_statusbar() + self.update_summary() def update_status(self, msg): """Update our status with a report from the listener thread. @@ -440,6 +572,7 @@ def update_status(self, msg): """ self.set_status(msg) self.is_possible_error = True + self.update_summary() def set_status(self, msg, index=0): """Set the current statusbar text, but only if we have focus.""" @@ -461,7 +594,7 @@ def on_focus(self): def get_taskbar_text(self): """Return text for the hover state of the taskbar.""" if self.is_mining: - return "%s: %s" % (self.name, self.format_khash(self.last_rate)) + return "%s: %s" % (self.name, format_khash(self.last_rate)) else: return "%s: Stopped" % self.name @@ -482,13 +615,15 @@ def update_solo(self): self.diff1_hashes += 1 self.update_last_time() self.update_solo_status() + self.update_summary() class PoclbmFrame(wx.Frame): def __init__(self, *args, **kwds): wx.Frame.__init__(self, *args, **kwds) - style = fnb.FNB_X_ON_TAB | fnb.FNB_FF2 | fnb.FNB_NO_NAV_BUTTONS | fnb.FNB_HIDE_ON_SINGLE_TAB + style = fnb.FNB_X_ON_TAB | fnb.FNB_FF2 | fnb.FNB_HIDE_ON_SINGLE_TAB self.nb = fnb.FlatNotebook(self, -1, style=style) self.console_panel = None + self.summary_panel = None self.menubar = wx.MenuBar() file_menu = wx.Menu() @@ -498,17 +633,22 @@ def __init__(self, *args, **kwds): file_menu.Append(wx.ID_EXIT, "", "", wx.ITEM_NORMAL) self.menubar.Append(file_menu, _("&File")) + ID_SUMMARY, ID_CONSOLE = wx.NewId(), wx.NewId() + view_menu = wx.Menu() + view_menu.Append(ID_SUMMARY, _("Show summary"), "Show summary of all miners", wx.ITEM_NORMAL) + view_menu.Append(ID_CONSOLE, _("Show console"), "Show console logs", wx.ITEM_NORMAL) + self.menubar.Append(view_menu, _("&View")) + ID_SOLO, ID_PATHS, ID_LAUNCH = wx.NewId(), wx.NewId(), wx.NewId() solo_menu = wx.Menu() solo_menu.Append(ID_SOLO, "&Create solo password...", _("Configure a user/pass for solo mining"), wx.ITEM_NORMAL) solo_menu.Append(ID_PATHS, "&Set Bitcoin client path...", _("Set the location of the official Bitcoin client"), wx.ITEM_NORMAL) solo_menu.Append(ID_LAUNCH, "&Launch Bitcoin client", _("Launch the official Bitcoin client for solo mining"), wx.ITEM_NORMAL) self.menubar.Append(solo_menu, _("&Solo utilities")) - - ID_CONSOLE = wx.NewId() + help_menu = wx.Menu() help_menu.Append(wx.ID_ABOUT, _("&About/Donate..."), "", wx.ITEM_NORMAL) - help_menu.Append(ID_CONSOLE, _("Show console"), "Show console logs", wx.ITEM_NORMAL) + self.menubar.Append(help_menu, _("&Help")) self.SetMenuBar(self.menubar) self.statusbar = self.CreateStatusBar(2, 0) @@ -541,12 +681,14 @@ def __init__(self, *args, **kwds): self.Bind(wx.EVT_MENU, self.on_menu_exit, id=wx.ID_EXIT) self.Bind(wx.EVT_MENU, self.set_official_client_path, id=ID_PATHS) self.Bind(wx.EVT_MENU, self.show_console, id=ID_CONSOLE) + self.Bind(wx.EVT_MENU, self.show_summary, id=ID_SUMMARY) self.Bind(wx.EVT_MENU, self.show_about_dialog, id=wx.ID_ABOUT) self.Bind(wx.EVT_MENU, self.create_solo_password, id=ID_SOLO) self.Bind(wx.EVT_MENU, self.launch_solo_server, id=ID_LAUNCH) self.Bind(wx.EVT_CLOSE, self.on_close) self.Bind(wx.EVT_ICONIZE, lambda event: self.Hide()) self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CLOSING, self.on_page_closing) + self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CLOSED, self.on_page_closed) self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CHANGED, self.on_page_changed) self.load_config() @@ -571,15 +713,18 @@ def __do_layout(self): def profile_panels(self): """Return a list of currently available ProfilePanel.""" pages = [self.nb.GetPage(i) for i in range(self.nb.GetPageCount())] - return [p for p in pages if p != self.console_panel] + return [p for p in pages if + p != self.console_panel and p != self.summary_panel] def add_profile(self, data): """Add a new ProfilePanel to the list of tabs.""" - panel = ProfilePanel(self.nb, -1, self.devices, self.statusbar) - panel.set_data(data) + panel = ProfilePanel(self.nb, -1, self.devices, self.statusbar, data) self.nb.AddPage(panel, panel.name) # The newly created profile should have focus. self.nb.EnsureVisible(self.nb.GetPageCount() - 1) + + if self.summary_panel is not None: + self.summary_panel.add_miners_to_grid() # Show new entry on summary self.__do_layout() return panel @@ -619,6 +764,8 @@ def on_close(self, event): else: if self.console_panel is not None: self.console_panel.on_close() + if self.summary_panel is not None: + self.summary_panel.on_close() for p in self.profile_panels: p.stop_mining() if self.tbicon is not None: @@ -633,6 +780,7 @@ def save_config(self, event): mkdir_p(folder) profile_data = [p.get_data() for p in self.profile_panels] config_data = dict(show_console=self.is_console_visible(), + show_summary=self.is_summary_visible(), profiles=profile_data, bitcoin_executable=self.bitcoin_executable) logger.debug('Saving: ' + json.dumps(config_data)) @@ -666,17 +814,25 @@ def load_config(self, event=None): for p in reversed(self.profile_panels): p.stop_mining() self.nb.DeletePage(self.nb.GetPageIndex(p)) - # Create new miners + + # Miners go in the middle data = config_data.get('profiles', []) for d in data: self.add_profile(d) if not any(data): # Create a default one for them to use self.add_profile(dict(name="slush's pool")) - + + if config_data.get('show_summary', False): + self.show_summary() + if config_data.get('show_console', False): self.show_console() - + + for p in self.profile_panels: + if p.autostart: + p.start_mining() + def set_official_client_path(self, event): """Set the path to the official Bitcoin client.""" dialog = wx.FileDialog(self, @@ -699,17 +855,23 @@ def show_about_dialog(self, event): def on_page_closing(self, event): """Handle a tab closing event. - If they are closing the console, we have to shut down the logger. + If they are closing a special panel, we have to shut it down. If the tab has a miner running in it, we have to stop the miner before letting the tab be removed. """ - console_index = self.nb.GetPageIndex(self.console_panel) - if event.GetSelection() == console_index: + p = self.nb.GetPage(event.GetSelection()) + + if p == self.console_panel: self.console_panel.on_close() self.console_panel = None event.Skip() return - p = self.nb.GetPage(event.GetSelection()) + if p == self.summary_panel: + self.summary_panel.on_close() + self.summary_panel = None + event.Skip() + return + if p.is_mining: result = self.message( "Closing this miner will stop it. Continue?", "Close miner", @@ -719,6 +881,11 @@ def on_page_closing(self, event): return p.stop_mining() event.Skip() # OK to close the tab now + + def on_page_closed(self, event): + print 'page closed' + if self.summary_panel is not None: + self.summary_panel.add_miners_to_grid() # Remove miner summary def on_page_changed(self, event): """Handle a tab change event. @@ -726,11 +893,7 @@ def on_page_changed(self, event): Ensures the status bar shows the status of the tab that has focus. """ p = self.nb.GetPage(event.GetSelection()) - if p == self.console_panel: - self.statusbar.SetStatusText("", 0) - self.statusbar.SetStatusText("", 1) - else: - p.on_focus() + p.on_focus() def launch_solo_server(self, event): """Launch the official bitcoin client in server mode. @@ -785,7 +948,20 @@ def show_console(self, event=None): return # Console already shown self.console_panel = ConsolePanel(self) self.nb.AddPage(self.console_panel, "Console") - + self.nb.EnsureVisible(self.nb.GetPageCount() - 1) + + def is_summary_visible(self): + """Return True if the summary is visible.""" + return self.nb.GetPageIndex(self.summary_panel) != -1 + + def show_summary(self, event=None): + """Show the summary window in its own tab.""" + if self.is_summary_visible(): + return + self.summary_panel = SummaryPanel(self) + self.nb.InsertPage(0, self.summary_panel, "Summary") + self.nb.EnsureVisible(0) + def on_menu_exit(self, event): self.Close(force=True) From 5f6c49782b3b3efc0de187443ea5b530eb36c326 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 6 Mar 2011 14:03:23 -0400 Subject: [PATCH 029/190] Update total hash rate on summary panel each second. --- guiminer.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/guiminer.py b/guiminer.py index cf8a2e8..b4cfacf 100644 --- a/guiminer.py +++ b/guiminer.py @@ -143,7 +143,10 @@ class SummaryPanel(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent, -1) self.parent = parent - + self.timer = wx.Timer(self) + self.timer.Start(1000) + self.Bind(wx.EVT_TIMER, self.on_update_tooltip) + flags = wx.ALIGN_CENTER_HORIZONTAL | wx.ALL border = 5 self.column_headers = [ @@ -182,17 +185,20 @@ def add_miners_to_grid(self): self.grid.Layout() def on_close(self): - pass + self.timer.Stop() - def on_focus(self): - """On focus, show the statusbar text.""" + def on_update_tooltip(self, event=None): self.parent.statusbar.SetStatusText("", 0) # TODO: show something total_rate = sum(p.last_rate for p in self.parent.profile_panels if p.is_mining) if any(p.is_mining for p in self.parent.profile_panels): self.parent.statusbar.SetStatusText(format_khash(total_rate), 1) else: - self.parent.statusbar.SetStatusText("", 0) + self.parent.statusbar.SetStatusText("", 0) + + def on_focus(self): + """On focus, show the statusbar text.""" + self.on_update_tooltip() class GUIMinerTaskBarIcon(wx.TaskBarIcon): """Taskbar icon for the GUI. From bd161dd63160d749737ae93f694e6cdc2b592777 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 6 Mar 2011 17:42:42 -0400 Subject: [PATCH 030/190] Underline column headers on summary. Fix centering of values on summary. --- guiminer.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/guiminer.py b/guiminer.py index b4cfacf..76cda81 100644 --- a/guiminer.py +++ b/guiminer.py @@ -148,7 +148,7 @@ def __init__(self, parent): self.Bind(wx.EVT_TIMER, self.on_update_tooltip) flags = wx.ALIGN_CENTER_HORIZONTAL | wx.ALL - border = 5 + border = 5 self.column_headers = [ (wx.StaticText(self, -1, _("Miner")), 0, flags, border), (wx.StaticText(self, -1, _("Speed")), 0, flags, border), @@ -157,6 +157,10 @@ def __init__(self, parent): (wx.StaticText(self, -1, _("Start/Stop")), 0, flags, border), (wx.StaticText(self, -1, _("Autostart")), 0, flags, border), ] + font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) + font.SetUnderlined(True) + for st in self.column_headers: + st[0].SetFont(font) self.grid = wx.FlexGridSizer(0, len(self.column_headers), 2, 2) @@ -178,7 +182,6 @@ def add_miners_to_grid(self): self.grid.Remove(i) for p in self.parent.profile_panels: - print p.name p.clear_summary_widgets() self.grid.AddMany(p.get_summary_widgets(self)) @@ -187,7 +190,7 @@ def add_miners_to_grid(self): def on_close(self): self.timer.Stop() - def on_update_tooltip(self, event=None): + def on_update_tooltip(self, event=None): self.parent.statusbar.SetStatusText("", 0) # TODO: show something total_rate = sum(p.last_rate for p in self.parent.profile_panels if p.is_mining) @@ -371,8 +374,8 @@ def get_start_stop_state(self): def update_summary(self): """Update our summary fields if possible.""" - if not self.summary_name: - return # Assume none of the other fields are there either + if not self.summary_panel: + return self.summary_name.SetLabel(self.name) if not self.is_mining: @@ -391,10 +394,13 @@ def update_summary(self): self.summary_shares_invalid.SetLabel(str(self.invalid_shares)) self.summary_start.SetLabel(self.get_start_stop_state()) - self.summary_autostart.SetValue(self.autostart) + self.summary_autostart.SetValue(self.autostart) + + self.summary_panel.grid.Layout() def get_summary_widgets(self, summary_panel): """Return a list of summary widgets suitable for sizer.AddMany.""" + self.summary_panel = summary_panel self.summary_name = wx.StaticText(summary_panel, -1, self.name) self.summary_status = wx.StaticText(summary_panel, -1, "Stopped") self.summary_shares_accepted = wx.StaticText(summary_panel, -1, "0") @@ -406,10 +412,10 @@ def get_summary_widgets(self, summary_panel): self.summary_autostart.SetValue(self.autostart) return [ (self.summary_name, 0, wx.ALIGN_CENTER_HORIZONTAL), - (self.summary_status, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.EXPAND, 0), + (self.summary_status, 0, wx.ALIGN_CENTER_HORIZONTAL, 0), (self.summary_shares_accepted, 0, wx.ALIGN_CENTER_HORIZONTAL, 0), (self.summary_shares_invalid, 0, wx.ALIGN_CENTER_HORIZONTAL, 0), - (self.summary_start, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.LEFT|wx.RIGHT, 0), + (self.summary_start, 0, wx.ALIGN_CENTER, 0), (self.summary_autostart, 0, wx.ALIGN_CENTER, 0) ] @@ -889,7 +895,6 @@ def on_page_closing(self, event): event.Skip() # OK to close the tab now def on_page_closed(self, event): - print 'page closed' if self.summary_panel is not None: self.summary_panel.add_miners_to_grid() # Remove miner summary From 4f4f4444841b9f6d2b4910c35365f85d3a694021 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 6 Mar 2011 18:45:14 -0400 Subject: [PATCH 031/190] Don't include useless Tkinter files in distribution --- setup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 689d57e..d2e71e2 100644 --- a/setup.py +++ b/setup.py @@ -8,6 +8,7 @@ dll_excludes=['OpenCL.dll'], #bundle_files=1, compressed=True, - optimize=2 + optimize=2, + excludes = ["Tkconstants", "Tkinter", "tcl"], )), data_files = ['msvcp90.dll', 'BitcoinMiner.cl', 'logo.png', 'LICENSE.txt']) From 5aaf73a057d34fea4f30c7dae4722ea08b21fa5b Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 6 Mar 2011 18:45:58 -0400 Subject: [PATCH 032/190] Update summary thread every 2 seconds. Only update summary tooltip if summary has focus. --- guiminer.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/guiminer.py b/guiminer.py index 76cda81..93a5067 100644 --- a/guiminer.py +++ b/guiminer.py @@ -144,7 +144,7 @@ def __init__(self, parent): wx.Panel.__init__(self, parent, -1) self.parent = parent self.timer = wx.Timer(self) - self.timer.Start(1000) + self.timer.Start(2000) self.Bind(wx.EVT_TIMER, self.on_update_tooltip) flags = wx.ALIGN_CENTER_HORIZONTAL | wx.ALL @@ -190,7 +190,13 @@ def add_miners_to_grid(self): def on_close(self): self.timer.Stop() - def on_update_tooltip(self, event=None): + def on_update_tooltip(self, event=None): + if self.parent.nb.GetSelection() != self.parent.nb.GetPageIndex(self): + return + + for p in self.parent.profile_panels: + p.update_summary() + self.parent.statusbar.SetStatusText("", 0) # TODO: show something total_rate = sum(p.last_rate for p in self.parent.profile_panels if p.is_mining) @@ -395,7 +401,6 @@ def update_summary(self): self.summary_start.SetLabel(self.get_start_stop_state()) self.summary_autostart.SetValue(self.autostart) - self.summary_panel.grid.Layout() def get_summary_widgets(self, summary_panel): @@ -453,6 +458,7 @@ def toggle_mining(self, event): self.start_mining() self.start.SetLabel("%s mining!" % self.get_start_stop_state()) self.update_summary() + def get_data(self): """Return a dict of our profile data.""" @@ -544,7 +550,6 @@ def update_khash(self, rate): if self.is_possible_error: self.update_shares_on_statusbar() self.is_possible_error = False - self.update_summary() def update_shares_on_statusbar(self): """For pooled mining, show the shares on the statusbar.""" @@ -562,7 +567,7 @@ def format_last_update_time(self): time_fmt = '%I:%M:%S%p' if self.last_update_time is None: return "" - return "(last at %s)" % time.strftime(time_fmt, self.last_update_time) + return "- last at %s" % time.strftime(time_fmt, self.last_update_time) def update_shares(self, accepted): """Update our shares with a report from the listener thread.""" @@ -573,7 +578,6 @@ def update_shares(self, accepted): self.invalid_shares += 1 self.update_last_time() self.update_shares_on_statusbar() - self.update_summary() def update_status(self, msg): """Update our status with a report from the listener thread. @@ -584,7 +588,6 @@ def update_status(self, msg): """ self.set_status(msg) self.is_possible_error = True - self.update_summary() def set_status(self, msg, index=0): """Set the current statusbar text, but only if we have focus.""" @@ -627,7 +630,6 @@ def update_solo(self): self.diff1_hashes += 1 self.update_last_time() self.update_solo_status() - self.update_summary() class PoclbmFrame(wx.Frame): def __init__(self, *args, **kwds): From 13afed301943d68b5ceb1d8d44ce4049b5f9e204 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 6 Mar 2011 19:01:22 -0400 Subject: [PATCH 033/190] Version bump --- guiminer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index 93a5067..ed02151 100644 --- a/guiminer.py +++ b/guiminer.py @@ -11,7 +11,7 @@ from wx.lib.agw import flatnotebook as fnb from wx.lib.newevent import NewEvent -__version__ = '2011-02-27' +__version__ = '2011-03-06' ABOUT_TEXT = \ """Python OpenCL Bitcoin Miner GUI From f3f165dba32408666e41f23b7118a97cd20e4135 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 13 Mar 2011 21:07:15 -0300 Subject: [PATCH 034/190] Integrated support for different pools with default pool configurable. Hide stale shares if stale == 0. In summary panel, click the miner to go to that tab. Fix bug with opening summary tab with one miner open. --- defaults.ini | 5 + guiminer.py | 393 +++++++++++++++++++++++++++++++++++++-------------- servers.ini | 45 ++++++ setup.py | 7 +- 4 files changed, 344 insertions(+), 106 deletions(-) create mode 100644 defaults.ini create mode 100644 servers.ini diff --git a/defaults.ini b/defaults.ini new file mode 100644 index 0000000..9ae93c8 --- /dev/null +++ b/defaults.ini @@ -0,0 +1,5 @@ +{ + "default_server": "slush's pool", + "default_username": "username", + "default_password": "pass" +} \ No newline at end of file diff --git a/guiminer.py b/guiminer.py index ed02151..6327018 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1,7 +1,7 @@ """poclbm-gui - GUI miner for poclbm Copyright 2011 Chris MacLeod -This program is released until the GNU GPL. See LICENSE.txt for details. +This program is released under the GNU GPL. See LICENSE.txt for details. """ import sys, os, subprocess, errno, re, threading, logging, time @@ -9,9 +9,10 @@ import json from wx.lib.agw import flatnotebook as fnb +from wx.lib.agw import hyperlink from wx.lib.newevent import NewEvent -__version__ = '2011-03-06' +__version__ = '2011-03-13' ABOUT_TEXT = \ """Python OpenCL Bitcoin Miner GUI @@ -30,6 +31,9 @@ %s """ +# Layout constants +LBL_STYLE = wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL + # Events sent from the worker threads (UpdateHashRateEvent, EVT_UPDATE_HASHRATE) = NewEvent() (UpdateAcceptedEvent, EVT_UPDATE_ACCEPTED) = NewEvent() @@ -43,13 +47,12 @@ def merge_whitespace(s): return s.strip() def get_opencl_devices(): + """Return a list of available OpenCL devices.""" import pyopencl platform = pyopencl.get_platforms()[0] devices = platform.get_devices() if len(devices) == 0: raise IOError - # TODO: maybe use horizontal scrollbar to show long device names? - # Or maybe it's nice if we can show device aliases. return ['[%d] %s' % (i, merge_whitespace(device.name)[:25]) for (i, device) in enumerate(devices)] @@ -307,10 +310,11 @@ class ProfilePanel(wx.Panel): whether the poclbm instance is working solo or in a pool. """ SOLO, POOL = range(2) - def __init__(self, parent, id, devices, statusbar, data): + def __init__(self, parent, id, devices, servers, defaults, statusbar, data): wx.Panel.__init__(self, parent, id) self.parent = parent - self.name = "Miner" + self.servers = servers + self.defaults = defaults self.statusbar = statusbar self.is_mining = False self.is_possible_error = False @@ -323,47 +327,99 @@ def __init__(self, parent, id, devices, statusbar, data): self.last_update_type = ProfilePanel.POOL self.last_update_time = None self.autostart = False - self.server_lbl = wx.StaticText(self, -1, _("Server:")) - self.txt_server = wx.TextCtrl(self, -1, "mining.bitcoin.cz") + self.server_lbl = wx.StaticText(self, -1, _("Server:")) + self.server = wx.ComboBox(self, -1, + choices=[s['name'] for s in servers], + style=wx.CB_READONLY) + self.website_lbl = wx.StaticText(self, -1, _("Website:")) + self.website = hyperlink.HyperLinkCtrl(self, -1, "") + self.host_lbl = wx.StaticText(self, -1, _("Host:")) + self.txt_host = wx.TextCtrl(self, -1, "") self.port_lbl = wx.StaticText(self, -1, _("Port:")) - self.txt_port = wx.TextCtrl(self, -1, "8332") + self.txt_port = wx.TextCtrl(self, -1, "") self.user_lbl = wx.StaticText(self, -1, _("Username:")) - self.txt_username = wx.TextCtrl(self, -1, _("")) + self.txt_username = wx.TextCtrl(self, -1, "") self.pass_lbl = wx.StaticText(self, -1, _("Password:")) self.txt_pass = wx.TextCtrl(self, -1, "", style=wx.TE_PASSWORD) self.device_lbl = wx.StaticText(self, -1, _("Device:")) - self.device_listbox = wx.ComboBox(self, -1, choices=devices, style=wx.CB_DROPDOWN) - self.flags_lbl = wx.StaticText(self, -1, _("Extra flags:")) + self.device_listbox = wx.ComboBox(self, -1, choices=devices, style=wx.CB_READONLY) + self.flags_lbl = wx.StaticText(self, -1, _("Extra flags:")) self.txt_flags = wx.TextCtrl(self, -1, "") - - #self.chk_autostart = wx.CheckBox(self, -1, "Start this miner when the GUI starts") + self.extra_info = wx.StaticText(self, -1, "") + + self.all_widgets = [self.server_lbl, self.server, + self.website_lbl, self.website, + self.host_lbl, self.txt_host, + self.port_lbl, self.txt_port, + self.user_lbl, self.txt_username, + self.pass_lbl, self.txt_pass, + self.device_lbl, self.device_listbox, + self.flags_lbl, self.txt_flags, + self.extra_info] + self.start = wx.Button(self, -1, _("Start mining!")) self.device_listbox.SetSelection(0) - self.set_data(data) - self.__do_layout() + self.server.SetStringSelection(self.defaults.get('default_server')) + + self.set_data(data) self.start.Bind(wx.EVT_BUTTON, self.toggle_mining) + self.server.Bind(wx.EVT_COMBOBOX, self.on_select_server) self.Bind(EVT_UPDATE_HASHRATE, lambda event: self.update_khash(event.rate)) self.Bind(EVT_UPDATE_ACCEPTED, lambda event: self.update_shares(event.accepted)) self.Bind(EVT_UPDATE_STATUS, lambda event: self.update_status(event.text)) self.Bind(EVT_UPDATE_SOLOCHECK, lambda event: self.update_solo()) - self.update_shares_on_statusbar() - - add_tooltip(self.device_listbox, - "Available OpenCL devices on your system.") - add_tooltip(self.txt_server, - "Server address, without http:// prefix.\nPooled mining example: mining.bitcoin.cz\nSolo mining example: localhost") - add_tooltip(self.txt_port, - "Server port. This is usually 8332.") - add_tooltip(self.txt_username, - "For pooled mining, the miner username (not your account username).\nExample: Kiv.GPU") - add_tooltip(self.txt_pass, - "For pooled mining, the miner password (not your account password).") - add_tooltip(self.txt_flags, - "Extra flags to pass to the miner.\nFor Radeon HD 5xxx use -v -w128 for best results.") - + self.update_shares_on_statusbar() self.clear_summary_widgets() + + def get_data(self): + """Return a dict of our profile data.""" + return dict(name=self.name, + hostname=self.txt_host.GetValue(), + port=self.txt_port.GetValue(), + username=self.txt_username.GetValue(), + password=self.txt_pass.GetValue(), + device=self.device_listbox.GetSelection(), + flags=self.txt_flags.GetValue(), + autostart=self.autostart) + + def set_data(self, data): + """Set our profile data to the information in data. See get_data().""" + default_server = self.get_server_by_field(self.defaults['default_server'], 'name') + self.name = (data.get('name') or + default_server.get('name', 'Miner')) + + # Backwards compatibility: hostname key used to be called server. + # We only save out hostname now but accept server from old INI files. + hostname = (data.get('hostname') or + data.get('server') or + default_server['host']) + self.txt_host.SetValue(hostname) + server = self.get_server_by_field(hostname, 'host') + self.server.SetStringSelection(server['name']) + + self.txt_username.SetValue( + data.get('username') or + self.defaults.get('default_username', '')) + + self.txt_pass.SetValue( + data.get('password') or + self.defaults.get('default_password', '')) + + self.txt_port.SetValue(str( + data.get('port') or + server.get('port', 8332))) + + self.txt_flags.SetValue(data.get('flags', '')) + self.autostart = data.get('autostart', False) + + # Handle case where they removed devices since last run. + device_index = data.get('device', None) + if device_index is not None and device_index < self.device_listbox.GetCount(): + self.device_listbox.SetSelection(device_index) + + self.change_server(server) def clear_summary_widgets(self): """Release all our summary widgets.""" @@ -407,6 +463,8 @@ def get_summary_widgets(self, summary_panel): """Return a list of summary widgets suitable for sizer.AddMany.""" self.summary_panel = summary_panel self.summary_name = wx.StaticText(summary_panel, -1, self.name) + self.summary_name.Bind(wx.EVT_LEFT_UP, self.show_this_panel) + self.summary_status = wx.StaticText(summary_panel, -1, "Stopped") self.summary_shares_accepted = wx.StaticText(summary_panel, -1, "0") self.summary_shares_invalid = wx.StaticText(summary_panel, -1, "0") @@ -424,28 +482,9 @@ def get_summary_widgets(self, summary_panel): (self.summary_autostart, 0, wx.ALIGN_CENTER, 0) ] - def __do_layout(self): - sizer_2 = wx.BoxSizer(wx.VERTICAL) - sizer_2.Add((20, 10), 0, wx.EXPAND, 0) - grid_sizer_1 = wx.FlexGridSizer(4, 4, 5, 5) - grid_sizer_1.Add(self.server_lbl, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) - grid_sizer_1.Add(self.txt_server, 0, wx.EXPAND, 0) - grid_sizer_1.Add(self.port_lbl, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) - grid_sizer_1.Add(self.txt_port, 0, wx.EXPAND, 0) - grid_sizer_1.Add(self.user_lbl, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) - grid_sizer_1.Add(self.txt_username, 0, wx.EXPAND, 0) - grid_sizer_1.Add(self.pass_lbl, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) - grid_sizer_1.Add(self.txt_pass, 0, wx.EXPAND, 0) - grid_sizer_1.Add(self.device_lbl, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) - grid_sizer_1.Add(self.device_listbox, 0, wx.EXPAND, 0) - grid_sizer_1.Add(self.flags_lbl, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) - grid_sizer_1.Add(self.txt_flags, 0, wx.EXPAND, 0) - grid_sizer_1.AddGrowableCol(1) - grid_sizer_1.AddGrowableCol(3) - sizer_2.Add(grid_sizer_1, 1, wx.EXPAND | wx.LEFT | wx.RIGHT, 10) - #sizer_2.Add(self.chk_autostart, 0, wx.EXPAND, 0) # TODO - sizer_2.Add(self.start, 0, wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_HORIZONTAL | wx.BOTTOM, 5) - self.SetSizerAndFit(sizer_2) + def show_this_panel(self, event): + """Set focus to this panel.""" + self.parent.SetSelection(self.parent.GetPageIndex(self)) def toggle_autostart(self, event): self.autostart = event.IsChecked() @@ -459,33 +498,6 @@ def toggle_mining(self, event): self.start.SetLabel("%s mining!" % self.get_start_stop_state()) self.update_summary() - - def get_data(self): - """Return a dict of our profile data.""" - return dict(name=self.name, - server=self.txt_server.GetValue(), - port=self.txt_port.GetValue(), - username=self.txt_username.GetValue(), - password=self.txt_pass.GetValue(), - device=self.device_listbox.GetSelection(), - flags=self.txt_flags.GetValue(), - autostart=self.autostart) - - def set_data(self, data): - """Set our profile data to the information in data. See get_data().""" - if 'name' in data: self.name = data['name'] - if 'username' in data: self.txt_username.SetValue(data['username']) - if 'server' in data: self.txt_server.SetValue(data['server']) - if 'port' in data: self.txt_port.SetValue(data['port']) - if 'password' in data: self.txt_pass.SetValue(data['password']) - if 'flags' in data: self.txt_flags.SetValue(data['flags']) - if 'autostart' in data: self.autostart = data['autostart'] - - # Handle case where they removed devices since last run. - device_index = data.get('device', None) - if device_index is not None and device_index < self.device_listbox.GetCount(): - self.device_listbox.SetSelection(device_index) - def start_mining(self): """Launch a poclbm subprocess and attach a MinerListenerThread.""" folder = get_module_path() @@ -500,7 +512,7 @@ def start_mining(self): executable, self.txt_username.GetValue(), self.txt_pass.GetValue(), - self.txt_server.GetValue(), + self.txt_host.GetValue(), self.txt_port.GetValue(), self.device_listbox.GetSelection(), self.txt_flags.GetValue() @@ -553,9 +565,10 @@ def update_khash(self, rate): def update_shares_on_statusbar(self): """For pooled mining, show the shares on the statusbar.""" - text = "Shares: %d accepted, %d stale/invalid %s " % \ - (self.accepted_shares, self.invalid_shares, - self.format_last_update_time()) + text = "Shares: %d accepted" % self.accepted_shares + if self.invalid_shares > 0: + text += ", %d stale/invalid" % self.invalid_shares + text += " %s" % self.format_last_update_time() self.set_status(text, 0) def update_last_time(self): @@ -630,6 +643,162 @@ def update_solo(self): self.diff1_hashes += 1 self.update_last_time() self.update_solo_status() + + def on_select_server(self, event): + """Update our info in response to a new server choice.""" + new_server_name = self.server.GetValue() + new_server = self.get_server_by_field(new_server_name, 'name') + self.change_server(new_server) + + def get_server_by_field(self, target_val, field): + """Return the first server dict with the specified name.""" + for s in self.servers: + if s.get(field) == target_val: + return s + + def set_widgets_visible(self, widgets, show=False): + """Show or hide each widget in widgets according to the show flag.""" + for w in widgets: + if show: + w.Show() + else: + w.Hide() + + def set_tooltips(self): + add_tooltip(self.server, "Server to connect to. Different servers have different fees and features.\nCheck their websites for full information.") + add_tooltip(self.website, "Website of the currently selected server. Click to visit.") + add_tooltip(self.device_listbox, "Available OpenCL devices on your system.") + add_tooltip(self.txt_host, "Host address, without http:// prefix.") + add_tooltip(self.txt_port, "Server port. This is usually 8332.") + add_tooltip(self.txt_username, "The miner's username.\nMay be different than your account username.\nExample: Kiv.GPU") + add_tooltip(self.txt_pass, "The miner's password.\nMay be different than your account password.") + add_tooltip(self.txt_flags, "Extra flags to pass to the miner.\nFor Radeon HD 5xxx series use -v -w128 for best results.\nFor other cards consult the forum.") + + def change_server(self, new_server): + """Change the server to new_server, updating fields as needed.""" + + # Set defaults before we do server specific code + self.set_tooltips() + self.set_widgets_visible(self.all_widgets, True) + + self.website.SetLabel(new_server['url']) + self.website.SetURL(new_server['url']) + self.txt_host.SetValue(new_server['host']) + self.txt_port.SetValue(str(new_server['port'])) + + # Call server specific code. + name = new_server['name'].lower() + if name == "slush's pool": self.layout_slush() + elif name == "bitpenny": self.layout_bitpenny() + elif name == "deepbit": self.layout_deepbit() + else: self.layout_default() + + self.Layout() + + def layout_init(self): + """Create the sizers for this frame.""" + self.frame_sizer = wx.BoxSizer(wx.VERTICAL) + self.frame_sizer.Add((20, 10), 0, wx.EXPAND, 0) + self.inner_sizer = wx.GridBagSizer(10, 5) + + def layout_server_and_website(self, row): + """Lay out the server and website widgets in the specified row.""" + self.inner_sizer.Add(self.server_lbl, (row,0), flag=LBL_STYLE) + self.inner_sizer.Add(self.server, (row,1), flag=wx.EXPAND) + self.inner_sizer.Add(self.website_lbl, (row,2), flag=LBL_STYLE) + self.inner_sizer.Add(self.website, (row,3), flag=wx.ALIGN_CENTER_VERTICAL) + + def layout_host_and_port(self, row): + """Lay out the host and port widgets in the specified row.""" + self.inner_sizer.Add(self.host_lbl, (row,0), flag=LBL_STYLE) + self.inner_sizer.Add(self.txt_host, (row,1), flag=wx.EXPAND) + self.inner_sizer.Add(self.port_lbl, (row,2), flag=LBL_STYLE) + self.inner_sizer.Add(self.txt_port, (row,3), flag=wx.EXPAND) + + def layout_user_and_pass(self, row): + """Lay out the user and pass widgets in the specified row.""" + self.inner_sizer.Add(self.user_lbl, (row,0), flag=LBL_STYLE) + self.inner_sizer.Add(self.txt_username, (row,1), flag=wx.EXPAND) + self.inner_sizer.Add(self.pass_lbl, (row,2), flag=LBL_STYLE) + self.inner_sizer.Add(self.txt_pass, (row,3), flag=wx.EXPAND) + + def layout_device_and_flags(self, row): + """Lay out the device and flags widgets in the specified row.""" + self.inner_sizer.Add(self.device_lbl, (row,0), flag=LBL_STYLE) + self.inner_sizer.Add(self.device_listbox, (row,1), flag=wx.EXPAND) + self.inner_sizer.Add(self.flags_lbl, (row,2), flag=LBL_STYLE) + self.inner_sizer.Add(self.txt_flags, (row,3), flag=wx.EXPAND) + + def layout_finish(self): + """Lay out the start button and fit the sizer to the window.""" + self.frame_sizer.Add(self.inner_sizer, 1, wx.EXPAND | wx.LEFT | wx.RIGHT, 10) + self.frame_sizer.Add(self.start, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 5) + self.inner_sizer.AddGrowableCol(1) + self.inner_sizer.AddGrowableCol(3) + self.SetSizerAndFit(self.frame_sizer) + + def layout_default(self): + """Lay out a default miner with no custom changes.""" + self.user_lbl.SetLabel("Username:") + + self.set_widgets_visible([self.extra_info], False) + self.layout_init() + self.layout_server_and_website(row=0) + is_custom = self.server.GetSelection() in ["Other", "solo"] + if is_custom: + self.layout_host_and_port(row=1) + else: + self.set_widgets_visible([self.host_lbl, self.txt_host, + self.port_lbl, self.txt_port], False) + + self.layout_user_and_pass(row=1 + int(is_custom)) + self.layout_device_and_flags(row=2 + int(is_custom)) + self.layout_finish() + + ############################ + # Begin server specific code + def layout_bitpenny(self): + """BitPenny doesn't require registration or a password. + + The username is just their receiving address. + """ + invisible = [self.txt_pass, self.txt_host, self.txt_port, + self.pass_lbl, self.host_lbl, self.port_lbl] + self.set_widgets_visible(invisible, False) + + self.layout_init() + self.layout_server_and_website(row=0) + self.inner_sizer.Add(self.user_lbl, (1,0), flag=LBL_STYLE) + self.inner_sizer.Add(self.txt_username, (1,1), span=(1,3), flag=wx.EXPAND) + self.layout_device_and_flags(row=2) + self.inner_sizer.Add(self.extra_info,(3,0), span=(1,4), flag=wx.EXPAND) + self.layout_finish() + + self.extra_info.SetLabel("No registration is required - just enter an address and press Start.") + self.txt_pass.SetValue('poclbm-gui') + self.user_lbl.SetLabel("Address:") + add_tooltip(self.txt_username, + "Your receiving address for Bitcoins.\nE.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc") + + def layout_slush(self): + """Slush's pool uses a separate username for each miner.""" + self.layout_default() + add_tooltip(self.txt_username, + "Your miner username (not your account username).\nExample: Kiv.GPU") + add_tooltip(self.txt_pass, + "Your miner password (not your account password).") + + def layout_deepbit(self): + """Deepbit uses an email address for a username.""" + self.layout_default() + add_tooltip(self.txt_username, + "The e-mail address you registered with.") + self.user_lbl.SetLabel("Email:") + + # End server specific code + ########################## + + class PoclbmFrame(wx.Frame): def __init__(self, *args, **kwds): @@ -638,6 +807,17 @@ def __init__(self, *args, **kwds): self.nb = fnb.FlatNotebook(self, -1, style=style) self.console_panel = None self.summary_panel = None + + # Servers and defaults are required, it's a fatal error not to have + # them. + server_config_path = os.path.join(get_module_path(), 'servers.ini') + with open(server_config_path) as f: + data = json.load(f) + self.servers = data.get('servers') + + defaults_config_path = os.path.join(get_module_path(), 'defaults.ini') + with open(defaults_config_path) as f: + self.defaults = json.load(f) self.menubar = wx.MenuBar() file_menu = wx.Menu() @@ -722,6 +902,7 @@ def __do_layout(self): self.SetSizer(self.vertical_sizer) self.vertical_sizer.SetSizeHints(self) self.SetSizerAndFit(self.vertical_sizer) + self.Layout() @property def profile_panels(self): @@ -730,16 +911,17 @@ def profile_panels(self): return [p for p in pages if p != self.console_panel and p != self.summary_panel] - def add_profile(self, data): + def add_profile(self, data={}): """Add a new ProfilePanel to the list of tabs.""" - panel = ProfilePanel(self.nb, -1, self.devices, self.statusbar, data) + panel = ProfilePanel(self.nb, -1, self.devices, self.servers, + self.defaults, self.statusbar, data) self.nb.AddPage(panel, panel.name) # The newly created profile should have focus. self.nb.EnsureVisible(self.nb.GetPageCount() - 1) if self.summary_panel is not None: self.summary_panel.add_miners_to_grid() # Show new entry on summary - self.__do_layout() + return panel def message(self, *args, **kwargs): @@ -806,13 +988,13 @@ def save_config(self, event): def load_config(self, event=None): """Load JSON profile info from the config file.""" - _, config_filename = self.get_storage_location() - if not os.path.exists(config_filename): - return # Nothing to load yet - with open(config_filename) as f: - config_data = json.load(f) - logger.debug('Loaded: ' + json.dumps(config_data)) - # TODO: handle load failed or corrupted data + config_data = {} + + _, config_filename = self.get_storage_location() + if os.path.exists(config_filename): + with open(config_filename) as f: + config_data.update(json.load(f)) + logger.debug('Loaded: ' + json.dumps(config_data)) executable = config_data.get('bitcoin_executable', None) if executable is not None: @@ -828,17 +1010,17 @@ def load_config(self, event=None): for p in reversed(self.profile_panels): p.stop_mining() self.nb.DeletePage(self.nb.GetPageIndex(p)) - - # Miners go in the middle - data = config_data.get('profiles', []) - for d in data: - self.add_profile(d) - - if not any(data): # Create a default one for them to use - self.add_profile(dict(name="slush's pool")) + # If present, summary should be the leftmost tab on startup. if config_data.get('show_summary', False): - self.show_summary() + self.show_summary() + + profile_data = config_data.get('profiles', []) + for d in profile_data: + self.add_profile(d) + + if not any(profile_data): + self.add_profile() # Create a default one using defaults.ini if config_data.get('show_console', False): self.show_console() @@ -972,8 +1154,9 @@ def show_summary(self, event=None): if self.is_summary_visible(): return self.summary_panel = SummaryPanel(self) - self.nb.InsertPage(0, self.summary_panel, "Summary") - self.nb.EnsureVisible(0) + self.nb.AddPage(self.summary_panel, "Summary") + index = self.nb.GetPageIndex(self.summary_panel) + self.nb.SetSelection(index) def on_menu_exit(self, event): self.Close(force=True) diff --git a/servers.ini b/servers.ini new file mode 100644 index 0000000..8d74673 --- /dev/null +++ b/servers.ini @@ -0,0 +1,45 @@ +{ + "servers": [ + { + "name": "slush's pool", + "host": "mining.bitcoin.cz", + "url": "http://mining.bitcoin.cz", + "port": 8332 + }, + + { + "name": "deepbit", + "host": "deepbit.net", + "url": "http://deepbit.net", + "port": 8332 + }, + + { + "name": "BitPenny", + "host": "bitpenny.dyndns.biz", + "url": "http://bitpenny.com", + "port": 8332 + }, + + { + "name": "bitcoinpool", + "host": "bitcoinpool.com", + "url": "http://bitcoinpool.com", + "port": 8334 + }, + + { + "name": "solo", + "host": "localhost", + "url": "n/a", + "port": 8332 + }, + + { + "name": "Other", + "host": "", + "url": "n/a", + "port": 8332 + } + ] +} \ No newline at end of file diff --git a/setup.py b/setup.py index d2e71e2..b32a024 100644 --- a/setup.py +++ b/setup.py @@ -11,4 +11,9 @@ optimize=2, excludes = ["Tkconstants", "Tkinter", "tcl"], )), - data_files = ['msvcp90.dll', 'BitcoinMiner.cl', 'logo.png', 'LICENSE.txt']) + data_files = ['msvcp90.dll', + 'BitcoinMiner.cl', + 'logo.png', + 'LICENSE.txt', + 'servers.ini', + 'defaults.ini']) From 7e6bd9eb448389c31dcb917dea502a4ed62c3a75 Mon Sep 17 00:00:00 2001 From: Kiv Date: Mon, 14 Mar 2011 18:39:25 -0300 Subject: [PATCH 035/190] Better support for unrecognized servers. Pretty-print config file. Add BTCMiner server. --- guiminer.py | 31 +++++++++++++++++++------------ servers.ini | 7 +++++++ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/guiminer.py b/guiminer.py index 6327018..4aab248 100644 --- a/guiminer.py +++ b/guiminer.py @@ -386,7 +386,8 @@ def get_data(self): def set_data(self, data): """Set our profile data to the information in data. See get_data().""" - default_server = self.get_server_by_field(self.defaults['default_server'], 'name') + default_server = self.get_server_by_field( + self.defaults['default_server'], 'name') self.name = (data.get('name') or default_server.get('name', 'Miner')) @@ -397,8 +398,9 @@ def set_data(self, data): default_server['host']) self.txt_host.SetValue(hostname) server = self.get_server_by_field(hostname, 'host') - self.server.SetStringSelection(server['name']) - + + self.server.SetStringSelection(server.get('name', "Other")) + self.txt_username.SetValue( data.get('username') or self.defaults.get('default_username', '')) @@ -418,7 +420,7 @@ def set_data(self, data): device_index = data.get('device', None) if device_index is not None and device_index < self.device_listbox.GetCount(): self.device_listbox.SetSelection(device_index) - + self.change_server(server) def clear_summary_widgets(self): @@ -651,10 +653,11 @@ def on_select_server(self, event): self.change_server(new_server) def get_server_by_field(self, target_val, field): - """Return the first server dict with the specified name.""" + """Return the first server dict with the specified val, or {}.""" for s in self.servers: if s.get(field) == target_val: return s + return {} def set_widgets_visible(self, widgets, show=False): """Show or hide each widget in widgets according to the show flag.""" @@ -681,13 +684,17 @@ def change_server(self, new_server): self.set_tooltips() self.set_widgets_visible(self.all_widgets, True) - self.website.SetLabel(new_server['url']) - self.website.SetURL(new_server['url']) - self.txt_host.SetValue(new_server['host']) - self.txt_port.SetValue(str(new_server['port'])) + url = new_server.get('url', 'n/a') + self.website.SetLabel(url) + self.website.SetURL(url) + + if 'host' in new_server: + self.txt_host.SetValue(new_server['host']) + if 'port' in new_server: + self.txt_port.SetValue(str(new_server['port'])) # Call server specific code. - name = new_server['name'].lower() + name = new_server.get('name', 'Other').lower() if name == "slush's pool": self.layout_slush() elif name == "bitpenny": self.layout_bitpenny() elif name == "deepbit": self.layout_deepbit() @@ -744,7 +751,7 @@ def layout_default(self): self.set_widgets_visible([self.extra_info], False) self.layout_init() self.layout_server_and_website(row=0) - is_custom = self.server.GetSelection() in ["Other", "solo"] + is_custom = self.server.GetStringSelection().lower() in ["other", "solo"] if is_custom: self.layout_host_and_port(row=1) else: @@ -981,7 +988,7 @@ def save_config(self, event): bitcoin_executable=self.bitcoin_executable) logger.debug('Saving: ' + json.dumps(config_data)) with open(config_filename, 'w') as f: - json.dump(config_data, f) + json.dump(config_data, f, indent=4) self.message("Profiles saved OK to %s." % config_filename, "Save successful", wx.OK | wx.ICON_INFORMATION) # TODO: handle save failed diff --git a/servers.ini b/servers.ini index 8d74673..ccbbea3 100644 --- a/servers.ini +++ b/servers.ini @@ -28,6 +28,13 @@ "port": 8334 }, + { + "name": "BTCMine", + "host": "btcmine.com", + "url": "http://btcmine.com", + "port": 8332 + }, + { "name": "solo", "host": "localhost", From 4fbd6b3a882ac6ff406f7c5a353f460582735ea5 Mon Sep 17 00:00:00 2001 From: Kiv Date: Mon, 14 Mar 2011 19:22:05 -0300 Subject: [PATCH 036/190] Default miner name changed to default. Miners are renamable by right-clicking on the tab. --- guiminer.py | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/guiminer.py b/guiminer.py index 4aab248..0839b18 100644 --- a/guiminer.py +++ b/guiminer.py @@ -388,8 +388,7 @@ def set_data(self, data): """Set our profile data to the information in data. See get_data().""" default_server = self.get_server_by_field( self.defaults['default_server'], 'name') - self.name = (data.get('name') or - default_server.get('name', 'Miner')) + self.name = (data.get('name') or 'Default') # Backwards compatibility: hostname key used to be called server. # We only save out hostname now but accept server from old INI files. @@ -699,8 +698,17 @@ def change_server(self, new_server): elif name == "bitpenny": self.layout_bitpenny() elif name == "deepbit": self.layout_deepbit() else: self.layout_default() - - self.Layout() + + self.Layout() + + def set_name(self, name): + """Set the label on this miner's tab to name.""" + self.name = name + if self.summary_name: + self.summary_name.SetLabel(self.name) + page = self.parent.GetPageIndex(self) + if page != -1: + self.parent.SetPageText(page, name) def layout_init(self): """Create the sizers for this frame.""" @@ -811,7 +819,15 @@ class PoclbmFrame(wx.Frame): def __init__(self, *args, **kwds): wx.Frame.__init__(self, *args, **kwds) style = fnb.FNB_X_ON_TAB | fnb.FNB_FF2 | fnb.FNB_HIDE_ON_SINGLE_TAB - self.nb = fnb.FlatNotebook(self, -1, style=style) + self.nb = fnb.FlatNotebook(self, -1, style=style) + + # Set up notebook context menu + notebook_menu = wx.Menu() + ID_RENAME = wx.NewId() + notebook_menu.Append(ID_RENAME, "&Rename...", _("Rename this miner")) + self.nb.SetRightClickMenu(notebook_menu) + self.Bind(wx.EVT_MENU, self.rename_miner, id=ID_RENAME) + self.console_panel = None self.summary_panel = None @@ -927,8 +943,7 @@ def add_profile(self, data={}): self.nb.EnsureVisible(self.nb.GetPageCount() - 1) if self.summary_panel is not None: - self.summary_panel.add_miners_to_grid() # Show new entry on summary - + self.summary_panel.add_miners_to_grid() # Show new entry on summary return panel def message(self, *args, **kwargs): @@ -1167,7 +1182,16 @@ def show_summary(self, event=None): def on_menu_exit(self, event): self.Close(force=True) - + + def rename_miner(self, event): + """Change the name of a miner as displayed on the tab.""" + p = self.nb.GetPage(self.nb.GetSelection()) + if p not in self.profile_panels: + return + + dialog = wx.TextEntryDialog(self, "Rename to:", "Rename miner") + if dialog.ShowModal() == wx.ID_OK: + p.set_name(dialog.GetValue().strip()) class SoloPasswordRequest(wx.Dialog): """Dialog prompting user for login credentials for solo mining.""" From 5d4f0d2f7adae842d56e8c7b23a555166d50ee56 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 20 Mar 2011 13:36:05 -0300 Subject: [PATCH 037/190] Support viewing balance using token for authentication and HTTP GET. Statistics page shows shares for the past hour as well as for the whole session. --- guiminer.py | 325 +++++++++++++++++++++++++++++++++++++++++++++------- servers.ini | 14 ++- 2 files changed, 296 insertions(+), 43 deletions(-) diff --git a/guiminer.py b/guiminer.py index 0839b18..2358c65 100644 --- a/guiminer.py +++ b/guiminer.py @@ -4,9 +4,10 @@ This program is released under the GNU GPL. See LICENSE.txt for details. """ -import sys, os, subprocess, errno, re, threading, logging, time +import sys, os, subprocess, errno, re, threading, logging, time, httplib, urllib import wx import json +import collections from wx.lib.agw import flatnotebook as fnb from wx.lib.agw import hyperlink @@ -30,9 +31,12 @@ %s """ +# Time constants +SAMPLE_TIME_SECS = 3600 # Layout constants LBL_STYLE = wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL +BTN_STYLE = wx.ALIGN_CENTER_HORIZONTAL | wx.ALL # Events sent from the worker threads (UpdateHashRateEvent, EVT_UPDATE_HASHRATE) = NewEvent() @@ -92,7 +96,14 @@ def format_khash(rate): return "Connected" else: return "%d khash/s" % rate - + +def format_balance(amount): + """Format a quantity of Bitcoins in BTC.""" + amount = float(amount) + if amount > 0.001: + return "%.2f BTC" % amount + return "0" + def init_logger(): """Set up and return the logging object and custom formatter.""" logger = logging.getLogger("poclbm-gui") @@ -107,6 +118,19 @@ def init_logger(): logger, formatter = init_logger() +def http_request(hostname, *args): + """Do a HTTP request and return the response data.""" + try: + conn = httplib.HTTPConnection(hostname) + logger.debug("Requesting balance: %s", str(args)) + conn.request(*args) + response = conn.getresponse() + data = response.read() + logger.debug("Server replied: %s, %s", str(response.status), data) + return data + finally: + conn.close() + class ConsolePanel(wx.Panel): """Panel that displays logging events. @@ -320,12 +344,12 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): self.is_possible_error = False self.miner = None # subprocess.Popen instance when mining self.miner_listener = None # MinerListenerThread when mining - self.accepted_shares = 0 # POOL mode only + self.accepted_shares = 0 + self.accepted_times = collections.deque() self.invalid_shares = 0 # POOL mode only - self.diff1_hashes = 0 # SOLO mode only + self.invalid_times = collections.deque() self.last_rate = 0 # units of khash/s self.last_update_type = ProfilePanel.POOL - self.last_update_time = None self.autostart = False self.server_lbl = wx.StaticText(self, -1, _("Server:")) self.server = wx.ComboBox(self, -1, @@ -345,7 +369,14 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): self.device_listbox = wx.ComboBox(self, -1, choices=devices, style=wx.CB_READONLY) self.flags_lbl = wx.StaticText(self, -1, _("Extra flags:")) self.txt_flags = wx.TextCtrl(self, -1, "") - self.extra_info = wx.StaticText(self, -1, "") + self.extra_info = wx.StaticText(self, -1, "") + self.balance_lbl = wx.StaticText(self, -1, _("Balance:")) + self.balance_amt = wx.StaticText(self, -1, "0") + self.balance_refresh = wx.Button(self, -1, _("Refresh balance")) + self.balance_refresh_timer = wx.Timer() + self.withdraw = wx.Button(self, -1, _("Withdraw")) + self.balance_cooldown_seconds = 0 + self.balance_auth_token = "" self.all_widgets = [self.server_lbl, self.server, self.website_lbl, self.website, @@ -355,6 +386,8 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): self.pass_lbl, self.txt_pass, self.device_lbl, self.device_listbox, self.flags_lbl, self.txt_flags, + self.balance_lbl, self.balance_amt, + self.balance_refresh, self.withdraw, self.extra_info] self.start = wx.Button(self, -1, _("Start mining!")) @@ -366,6 +399,9 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): self.start.Bind(wx.EVT_BUTTON, self.toggle_mining) self.server.Bind(wx.EVT_COMBOBOX, self.on_select_server) + self.balance_refresh_timer.Bind(wx.EVT_TIMER, self.on_balance_cooldown_tick) + self.balance_refresh.Bind(wx.EVT_BUTTON, self.on_balance_refresh) + self.withdraw.Bind(wx.EVT_BUTTON, self.on_withdraw) self.Bind(EVT_UPDATE_HASHRATE, lambda event: self.update_khash(event.rate)) self.Bind(EVT_UPDATE_ACCEPTED, lambda event: self.update_shares(event.accepted)) self.Bind(EVT_UPDATE_STATUS, lambda event: self.update_status(event.text)) @@ -373,6 +409,18 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): self.update_shares_on_statusbar() self.clear_summary_widgets() + @property + def last_update_time(self): + """Return the local time of the last accepted share.""" + if self.accepted_times: + return time.localtime(self.accepted_times[-1]) + return None + + @property + def server_config(self): + hostname = self.txt_host.GetValue() + return self.get_server_by_field(hostname, 'host') + def get_data(self): """Return a dict of our profile data.""" return dict(name=self.name, @@ -382,23 +430,23 @@ def get_data(self): password=self.txt_pass.GetValue(), device=self.device_listbox.GetSelection(), flags=self.txt_flags.GetValue(), - autostart=self.autostart) + autostart=self.autostart, + balance_auth_token=self.balance_auth_token) def set_data(self, data): """Set our profile data to the information in data. See get_data().""" - default_server = self.get_server_by_field( - self.defaults['default_server'], 'name') + default_server_config = self.get_server_by_field( + self.defaults['default_server'], 'name') self.name = (data.get('name') or 'Default') # Backwards compatibility: hostname key used to be called server. # We only save out hostname now but accept server from old INI files. hostname = (data.get('hostname') or data.get('server') or - default_server['host']) + default_server_config['host']) self.txt_host.SetValue(hostname) - server = self.get_server_by_field(hostname, 'host') - self.server.SetStringSelection(server.get('name', "Other")) + self.server.SetStringSelection(self.server_config.get('name', "Other")) self.txt_username.SetValue( data.get('username') or @@ -410,17 +458,19 @@ def set_data(self, data): self.txt_port.SetValue(str( data.get('port') or - server.get('port', 8332))) + self.server_config.get('port', 8332))) self.txt_flags.SetValue(data.get('flags', '')) - self.autostart = data.get('autostart', False) + self.autostart = data.get('autostart', False) # Handle case where they removed devices since last run. device_index = data.get('device', None) if device_index is not None and device_index < self.device_listbox.GetCount(): self.device_listbox.SetSelection(device_index) - self.change_server(server) + self.change_server(self.server_config) + + self.balance_auth_token = data.get('balance_auth_token', '') def clear_summary_widgets(self): """Release all our summary widgets.""" @@ -449,12 +499,14 @@ def update_summary(self): text = format_khash(self.last_rate) self.summary_status.SetLabel(text) + self.summary_shares_accepted.SetLabel("%d (%d)" % + (self.accepted_shares, len(self.accepted_times))) + if self.last_update_type == ProfilePanel.SOLO: - self.summary_shares_accepted.SetLabel(str(self.diff1_hashes)) self.summary_shares_invalid.SetLabel("-") - else: # TODO: we assume POOL here - self.summary_shares_accepted.SetLabel(str(self.accepted_shares)) - self.summary_shares_invalid.SetLabel(str(self.invalid_shares)) + else: + self.summary_shares_invalid.SetLabel("%d (%d)" % + (self.invalid_shares, len(self.invalid_times))) self.summary_start.SetLabel(self.get_start_stop_state()) self.summary_autostart.SetValue(self.autostart) @@ -535,6 +587,12 @@ def start_mining(self): self.miner_listener.start() self.is_mining = True self.set_status("Starting...", 1) + + + def on_close(self): + """Prepare to close gracefully.""" + self.stop_mining() + self.balance_refresh_timer.Stop() def stop_mining(self): """Terminate the poclbm process if able and its associated listener.""" @@ -572,9 +630,18 @@ def update_shares_on_statusbar(self): text += " %s" % self.format_last_update_time() self.set_status(text, 0) - def update_last_time(self): + def update_last_time(self, accepted): """Set the last update time to now (in local time).""" - self.last_update_time = time.localtime() + + now = time.time() + if accepted: + self.accepted_times.append(now) + while now - self.accepted_times[0] > SAMPLE_TIME_SECS: + self.accepted_times.popleft() + else: + self.invalid_times.append(now) + while now - self.invalid_times[0] > SAMPLE_TIME_SECS: + self.invalid_times.popleft() def format_last_update_time(self): """Format last update time for display.""" @@ -590,7 +657,7 @@ def update_shares(self, accepted): self.accepted_shares += 1 else: self.invalid_shares += 1 - self.update_last_time() + self.update_last_time(accepted) self.update_shares_on_statusbar() def update_status(self, msg): @@ -635,14 +702,14 @@ def update_solo_status(self): to the block. """ text = "Difficulty 1 hashes: %d %s" % \ - (self.diff1_hashes, self.format_last_update_time()) + (self.accepted_shares, self.format_last_update_time()) self.set_status(text, 0) def update_solo(self): """Update our easy hashes with a report from the listener thread.""" self.last_update_type = ProfilePanel.SOLO - self.diff1_hashes += 1 - self.update_last_time() + self.accepted_shares += 1 + self.update_last_time(True) self.update_solo_status() def on_select_server(self, event): @@ -681,25 +748,137 @@ def change_server(self, new_server): # Set defaults before we do server specific code self.set_tooltips() - self.set_widgets_visible(self.all_widgets, True) + self.set_widgets_visible(self.all_widgets, True) + self.withdraw.Disable() url = new_server.get('url', 'n/a') self.website.SetLabel(url) self.website.SetURL(url) + # Invalidate any previous auth token since it won't be valid for the + # new server. + self.balance_auth_token = "" + if 'host' in new_server: self.txt_host.SetValue(new_server['host']) if 'port' in new_server: self.txt_port.SetValue(str(new_server['port'])) + # Call server specific code. + # TODO: probably best to use hostname as the unique identifier in code. name = new_server.get('name', 'Other').lower() if name == "slush's pool": self.layout_slush() elif name == "bitpenny": self.layout_bitpenny() - elif name == "deepbit": self.layout_deepbit() + elif name == "deepbit": self.layout_deepbit() + elif name == "btcmine": self.layout_btcmine() else: self.layout_default() - self.Layout() + self.Layout() + + def on_balance_refresh(self, event=None, withdraw=False): + """Refresh the miner's balance from the server.""" + host = self.server_config.get("host") + + if host in ["mining.bitcoin.cz", "btcmine.com"]: + if not self.balance_auth_token: + self.prompt_auth_token() + if not self.balance_auth_token: # They cancelled the dialog + return + self.http_thread = threading.Thread( + target=self.request_balance_get, + args=(self.balance_auth_token,)) + self.http_thread.start() + + elif host in ["bitpenny.dyndns.biz"]: + self.http_thread = threading.Thread( + target=self.request_balance_post, args=(withdraw,)) + self.http_thread.start() + + self.balance_refresh.Disable() # TODO: handle timeout + self.balance_cooldown_seconds = 10 + self.balance_refresh_timer.Start(1000) + + def on_balance_cooldown_tick(self, event=None): + """Each second, decrement the cooldown for refreshing balance.""" + self.balance_cooldown_seconds -= 1 + self.balance_refresh.SetLabel("%d..." % self.balance_cooldown_seconds) + if self.balance_cooldown_seconds <= 0: + self.balance_refresh_timer.Stop() + self.balance_refresh.Enable() + self.balance_refresh.SetLabel(_("Refresh balance")) + + def prompt_auth_token(self): + """Prompt user for an auth token, returning the token on success. + + On failure, return the empty string. + """ + url = self.server_config.get('balance_token_url') + dialog = BalanceAuthRequest(self, url) + result = dialog.ShowModal() + dialog.Destroy() + if result == wx.ID_CANCEL: + return + self.balance_auth_token = dialog.get_value() # TODO: validate token? + + def request_balance_get(self, balance_auth_token): + """Request our balance from the server via HTTP GET and auth token.""" + data = http_request( + self.server_config['balance_host'], + "GET", + self.server_config["balance_url"] % balance_auth_token + ) + if not data: + data = "Connection error" + else: + try: + info = json.loads(data) + confirmed = info.get('confirmed_reward') or info.get('confirmed', 0) + unconfirmed = info.get('unconfirmed_reward') or info.get('unconformed', 0) + data = "%s confirmed, %s unconfirmed" % ( + format_balance(confirmed), + format_balance(unconfirmed)) + except: # TODO: what exception here? + data = "Bad response from server." + + wx.CallAfter(self.balance_amt.SetLabel, data) + + def request_balance_post(self, withdraw): + """Request our balance from the server via HTTP POST.""" + server_config = self.server_config + # Assume BitPenny for now; support other miners later. + post_params = dict(a=self.txt_username.GetValue()) + if withdraw: post_params['w'] = 1 + + data = http_request( + server_config['balance_host'], + "POST", + server_config['balance_url'], + urllib.urlencode(post_params), + {"Content-type": "application/x-www-form-urlencoded"} + ) + if not data: + data = "Connection error" + elif withdraw: + data = "Withdraw OK" + wx.CallAfter(self.on_balance_received, data) + + def on_balance_received(self, balance): + """Set the balance in the GUI.""" + try: + amt = float(balance) + except ValueError: # Response was some kind of error + self.balance_amt.SetLabel(balance) + else: + if amt > 0.1: + self.withdraw.Enable() + amt_str = format_balance(amt) + self.balance_amt.SetLabel(amt_str) + self.Layout() + + def on_withdraw(self, event): + self.withdraw.Disable() + self.on_balance_refresh(withdraw=True) def set_name(self, name): """Set the label on this miner's tab to name.""" @@ -714,7 +893,8 @@ def layout_init(self): """Create the sizers for this frame.""" self.frame_sizer = wx.BoxSizer(wx.VERTICAL) self.frame_sizer.Add((20, 10), 0, wx.EXPAND, 0) - self.inner_sizer = wx.GridBagSizer(10, 5) + self.inner_sizer = wx.GridBagSizer(10, 5) + self.button_sizer = wx.BoxSizer(wx.HORIZONTAL) def layout_server_and_website(self, row): """Lay out the server and website widgets in the specified row.""" @@ -744,19 +924,30 @@ def layout_device_and_flags(self, row): self.inner_sizer.Add(self.flags_lbl, (row,2), flag=LBL_STYLE) self.inner_sizer.Add(self.txt_flags, (row,3), flag=wx.EXPAND) + def layout_balance(self, row): + """Lay out the balance widgets in the specified row.""" + self.inner_sizer.Add(self.balance_lbl, (row,0), flag=LBL_STYLE) + self.inner_sizer.Add(self.balance_amt, (row,1)) + def layout_finish(self): - """Lay out the start button and fit the sizer to the window.""" + """Lay out the buttons and fit the sizer to the window.""" self.frame_sizer.Add(self.inner_sizer, 1, wx.EXPAND | wx.LEFT | wx.RIGHT, 10) - self.frame_sizer.Add(self.start, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 5) + self.frame_sizer.Add(self.button_sizer, 0, wx.ALIGN_CENTER_HORIZONTAL) self.inner_sizer.AddGrowableCol(1) - self.inner_sizer.AddGrowableCol(3) - self.SetSizerAndFit(self.frame_sizer) + self.inner_sizer.AddGrowableCol(3) + for btn in [self.start, self.balance_refresh, self.withdraw]: + self.button_sizer.Add(btn, 0, BTN_STYLE, 5) + self.SetSizerAndFit(self.frame_sizer) def layout_default(self): """Lay out a default miner with no custom changes.""" self.user_lbl.SetLabel("Username:") - self.set_widgets_visible([self.extra_info], False) + self.set_widgets_visible([self.extra_info, + self.balance_lbl, + self.balance_amt, + self.balance_refresh, + self.withdraw], False) self.layout_init() self.layout_server_and_website(row=0) is_custom = self.server.GetStringSelection().lower() in ["other", "solo"] @@ -786,9 +977,10 @@ def layout_bitpenny(self): self.inner_sizer.Add(self.user_lbl, (1,0), flag=LBL_STYLE) self.inner_sizer.Add(self.txt_username, (1,1), span=(1,3), flag=wx.EXPAND) self.layout_device_and_flags(row=2) - self.inner_sizer.Add(self.extra_info,(3,0), span=(1,4), flag=wx.EXPAND) + self.layout_balance(row=3) + self.inner_sizer.Add(self.extra_info,(4,0), span=(1,4), flag=wx.ALIGN_CENTER_HORIZONTAL) self.layout_finish() - + self.extra_info.SetLabel("No registration is required - just enter an address and press Start.") self.txt_pass.SetValue('poclbm-gui') self.user_lbl.SetLabel("Address:") @@ -797,12 +989,37 @@ def layout_bitpenny(self): def layout_slush(self): """Slush's pool uses a separate username for each miner.""" - self.layout_default() + self.set_widgets_visible([self.host_lbl, self.txt_host, + self.port_lbl, self.txt_port, + self.withdraw], False) + self.layout_init() + self.layout_server_and_website(row=0) + self.layout_user_and_pass(row=1) + self.layout_device_and_flags(row=2) + self.layout_balance(row=3) + self.layout_finish() + add_tooltip(self.txt_username, "Your miner username (not your account username).\nExample: Kiv.GPU") add_tooltip(self.txt_pass, "Your miner password (not your account password).") + def layout_btcmine(self): + self.set_widgets_visible([self.host_lbl, self.txt_host, + self.port_lbl, self.txt_port, + self.withdraw], False) + self.layout_init() + self.layout_server_and_website(row=0) + self.layout_user_and_pass(row=1) + self.layout_device_and_flags(row=2) + self.layout_balance(row=3) + self.layout_finish() + + add_tooltip(self.txt_username, + "Your miner username. \nExample: kiv123@kiv123") + add_tooltip(self.txt_pass, + "Your miner password (not your account password).") + def layout_deepbit(self): """Deepbit uses an email address for a username.""" self.layout_default() @@ -985,7 +1202,7 @@ def on_close(self, event): if self.summary_panel is not None: self.summary_panel.on_close() for p in self.profile_panels: - p.stop_mining() + p.on_close() if self.tbicon is not None: self.tbicon.RemoveIcon() self.tbicon.timer.Stop() @@ -1030,7 +1247,7 @@ def load_config(self, event=None): if result == wx.ID_NO: return for p in reversed(self.profile_panels): - p.stop_mining() + p.on_close() self.nb.DeletePage(self.nb.GetPageIndex(p)) # If present, summary should be the leftmost tab on startup. @@ -1097,7 +1314,7 @@ def on_page_closing(self, event): if result == wx.ID_NO: event.Veto() return - p.stop_mining() + p.on_close() event.Skip() # OK to close the tab now def on_page_closed(self, event): @@ -1218,6 +1435,34 @@ def get_value(self): return self.txt_username.GetValue(), self.txt_pass.GetValue() +class BalanceAuthRequest(wx.Dialog): + """Dialog prompting user for an auth token to refresh their balance.""" + instructions = \ +"""Click the link below to log in to the pool and get a special token. +This token lets you securely check your balance. +To remember this token for the future, save your miner settings.""" + def __init__(self, parent, url): + style = wx.DEFAULT_DIALOG_STYLE + vbox = wx.BoxSizer(wx.VERTICAL) + wx.Dialog.__init__(self, parent, -1, "Refresh balance", style=style) + self.instructions = wx.StaticText(self, -1, BalanceAuthRequest.instructions) + self.website = hyperlink.HyperLinkCtrl(self, -1, url) + self.txt_token = wx.TextCtrl(self, -1, "(Paste token here)") + buttons = self.CreateButtonSizer(wx.OK | wx.CANCEL) + + vbox.AddMany([ + (self.instructions, 0, wx.ALL, 10), + (self.website, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 10), + (self.txt_token, 0, wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL, 10), + (buttons, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 10) + ]) + self.SetSizerAndFit(vbox) + + def get_value(self): + """Return the auth token supplied by the user.""" + return self.txt_token.GetValue() + + class AboutGuiminer(wx.Dialog): """About dialog for the app with a donation address.""" donation_address = "1MDDh2h4cAZDafgc94mr9q95dhRYcJbNQo" diff --git a/servers.ini b/servers.ini index ccbbea3..9a9ed15 100644 --- a/servers.ini +++ b/servers.ini @@ -4,7 +4,10 @@ "name": "slush's pool", "host": "mining.bitcoin.cz", "url": "http://mining.bitcoin.cz", - "port": 8332 + "port": 8332, + "balance_token_url": "http://mining.bitcoin.cz/accounts/token-manage/", + "balance_host": "mining.bitcoin.cz", + "balance_url": "/accounts/profile/json/%s" }, { @@ -18,7 +21,9 @@ "name": "BitPenny", "host": "bitpenny.dyndns.biz", "url": "http://bitpenny.com", - "port": 8332 + "port": 8332, + "balance_host": "bitpenny.com", + "balance_url": "/gui.php" }, { @@ -32,7 +37,10 @@ "name": "BTCMine", "host": "btcmine.com", "url": "http://btcmine.com", - "port": 8332 + "port": 8332, + "balance_host": "btcmine.com", + "balance_url": "/api/getbalance/%s/", + "balance_token_url": "http://btcmine.com/user/profile/" }, { From b6d601b3f49aba38c5c0feb8bc39bf4dfb20ab3c Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 20 Mar 2011 13:39:26 -0300 Subject: [PATCH 038/190] Clean up mockBitcoinMiner.py --- mockBitcoinMiner.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/mockBitcoinMiner.py b/mockBitcoinMiner.py index 3c4ed50..f4df85c 100644 --- a/mockBitcoinMiner.py +++ b/mockBitcoinMiner.py @@ -1,7 +1,6 @@ import threading import time import random -import socket import sys import Queue import datetime @@ -11,10 +10,10 @@ TIME_FORMAT = '%d/%m/%Y %H:%M:%S' def if_else(condition, trueVal, falseVal): - if condition: - return trueVal - else: - return falseVal + if condition: + return trueVal + else: + return falseVal class MockBitcoinMiner(threading.Thread): """Mock version of class BitcoinMiner. From 43693c0046a77118659b4b35500ed24a6211674d Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 20 Mar 2011 18:50:26 -0300 Subject: [PATCH 039/190] Add pause all miners option to tray context menu. --- guiminer.py | 42 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/guiminer.py b/guiminer.py index 2358c65..b9cc443 100644 --- a/guiminer.py +++ b/guiminer.py @@ -242,6 +242,7 @@ class GUIMinerTaskBarIcon(wx.TaskBarIcon): Shows status messages on hover and opens on click. """ TBMENU_RESTORE = wx.NewId() + TBMENU_PAUSE = wx.NewId() TBMENU_CLOSE = wx.NewId() TBMENU_CHANGE = wx.NewId() TBMENU_REMOVE = wx.NewId() @@ -252,19 +253,24 @@ def __init__(self, frame): self.icon = get_icon() self.timer = wx.Timer(self) self.timer.Start(1000) + self.is_paused = False + self.SetIcon(self.icon, "poclbm-gui") self.imgidx = 1 self.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, self.on_taskbar_activate) self.Bind(wx.EVT_MENU, self.on_taskbar_activate, id=self.TBMENU_RESTORE) self.Bind(wx.EVT_MENU, self.on_taskbar_close, id=self.TBMENU_CLOSE) + self.Bind(wx.EVT_MENU, self.on_pause, id=self.TBMENU_PAUSE) self.Bind(wx.EVT_TIMER, self.on_update_tooltip) def CreatePopupMenu(self): """Override from wx.TaskBarIcon. Creates the right-click menu.""" menu = wx.Menu() + menu.AppendCheckItem(self.TBMENU_PAUSE, "Pause all") + menu.Check(self.TBMENU_PAUSE, self.is_paused) menu.Append(self.TBMENU_RESTORE, "Restore") - menu.Append(self.TBMENU_CLOSE, "Close") + menu.Append(self.TBMENU_CLOSE, "Close") return menu def on_taskbar_activate(self, evt): @@ -282,8 +288,19 @@ def on_update_tooltip(self, event): objs = self.frame.profile_panels if objs: text = '\n'.join(p.get_taskbar_text() for p in objs) - self.SetIcon(self.icon, text) - + self.SetIcon(self.icon, text) + + def on_pause(self, event): + """Pause or resume the currently running miners.""" + self.is_paused = event.Checked() + for miner in self.frame.profile_panels: + if self.is_paused: + miner.pause() + else: + miner.resume() + #event.Skip() # Allow the box to become checked + + class MinerListenerThread(threading.Thread): def __init__(self, parent, miner): threading.Thread.__init__(self) @@ -341,6 +358,7 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): self.defaults = defaults self.statusbar = statusbar self.is_mining = False + self.is_paused = False self.is_possible_error = False self.miner = None # subprocess.Popen instance when mining self.miner_listener = None # MinerListenerThread when mining @@ -421,6 +439,18 @@ def server_config(self): hostname = self.txt_host.GetValue() return self.get_server_by_field(hostname, 'host') + def pause(self): + """Pause the miner if we are mining, otherwise do nothing.""" + if self.is_mining: + self.stop_mining() + self.is_paused = True + + def resume(self): + """Resume the miner if we are paused, otherwise do nothing.""" + if self.is_paused: + self.start_mining() + self.is_paused = False + def get_data(self): """Return a dict of our profile data.""" return dict(name=self.name, @@ -491,7 +521,9 @@ def update_summary(self): return self.summary_name.SetLabel(self.name) - if not self.is_mining: + if self.is_paused: + text = "Paused" + elif not self.is_mining: text = "Stopped" elif self.is_possible_error: text = "Connection problems" @@ -553,6 +585,7 @@ def toggle_mining(self, event): def start_mining(self): """Launch a poclbm subprocess and attach a MinerListenerThread.""" + self.is_paused = False folder = get_module_path() if USE_MOCK: executable = "python mockBitcoinMiner.py" @@ -609,6 +642,7 @@ def stop_mining(self): self.miner_listener = None self.is_mining = False self.set_status("Stopped", 1) + self.is_paused = False def update_khash(self, rate): """Update our rate according to a report from the listener thread. From 65acdcb724373f8c261a70a24918ac2afd98ddc9 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 20 Mar 2011 18:50:47 -0300 Subject: [PATCH 040/190] Fix bug where hashrate would remain on summary panel's status bar even if no miners were running. --- guiminer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index b9cc443..87ad55b 100644 --- a/guiminer.py +++ b/guiminer.py @@ -230,7 +230,7 @@ def on_update_tooltip(self, event=None): if any(p.is_mining for p in self.parent.profile_panels): self.parent.statusbar.SetStatusText(format_khash(total_rate), 1) else: - self.parent.statusbar.SetStatusText("", 0) + self.parent.statusbar.SetStatusText("", 1) def on_focus(self): """On focus, show the statusbar text.""" From 0c773fba2cfd882fe9f97f6c33d107958adfa5e7 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 20 Mar 2011 19:17:30 -0300 Subject: [PATCH 041/190] Update README for interface changes --- README.txt | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/README.txt b/README.txt index 7396cff..04dc80f 100644 --- a/README.txt +++ b/README.txt @@ -53,16 +53,19 @@ Instructions for Pooled Mining ------------------------------ Pooled mining is recommended for most users, since it gives steadier payouts -than solo mining. To mine in a pool, you need to register an account with a mining pool. -A good one by slush is here: +than solo mining. Several pool servers are supported out of the box; you can +select one from the "Server" dropdown menu. Different servers have different +fees and features; you can visit the website for each one to learn more. Also, +the official Bitcoin forums are a good source for information: - http://mining.bitcoin.cz/ + http://www.bitcoin.org/smf/ + +Most servers require (free) registration; to register go to the server website +and follow their instructions. -Once you have an account, double-click guiminer.exe to open it and enter your -miner account. You need a miner account for each GPU you have, so if you have two GPUs -you will need two separate accounts. If you have a multi-core CPU, one account is -enough but be warned that CPU mining is extremely slow compared to GPU mining and -probably not worth the electricity. +Once you've registered, you can enter your login information in the fields of +the GUI. The "Extra flags" field is optional and can be used to fine-tune GPU +performance. Click "Start mining!" to connect to the server. The miner should connect and start showing your hash rate. This is the number of attempts per second to solve the @@ -106,10 +109,10 @@ Then make sure bitcoin.exe is not running already and choose "Solo utilities -> Launch Bitcoin client". This should bring up the official Bitcoin client. You will need to leave this open while you are solo mining. -Now you can enter your information in the text boxes. For "Server" type -"localhost" since the server is on your own machine. Put your username and -password that you chose earlier. Then press "Start mining!" to connect and -start mining. +Now you can enter your information in the text boxes. Make sure the "Host" +option reads "localhost" since the server is on your own machine. Put your +username and password that you chose earlier. Then press "Start mining!" to +connect and start mining. From 2ae1eee5c625c9551cd95c151241f055ffbc7db5 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 27 Mar 2011 11:42:56 -0300 Subject: [PATCH 042/190] Fix bug where autostarted miners would have the wrong label on their tab's start button. --- guiminer.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/guiminer.py b/guiminer.py index 2e93e53..ed870ce 100644 --- a/guiminer.py +++ b/guiminer.py @@ -579,8 +579,7 @@ def toggle_mining(self, event): if self.is_mining: self.stop_mining() else: - self.start_mining() - self.start.SetLabel("%s mining!" % self.get_start_stop_state()) + self.start_mining() self.update_summary() def start_mining(self): @@ -620,6 +619,7 @@ def start_mining(self): self.miner_listener.start() self.is_mining = True self.set_status("Starting...", 1) + self.start.SetLabel("%s mining!" % self.get_start_stop_state()) def on_close(self): @@ -641,8 +641,9 @@ def stop_mining(self): self.miner_listener.shutdown_event.set() self.miner_listener = None self.is_mining = False - self.set_status("Stopped", 1) self.is_paused = False + self.set_status("Stopped", 1) + self.start.SetLabel("%s mining!" % self.get_start_stop_state()) def update_khash(self, rate): """Update our rate according to a report from the listener thread. From 9f52f391627b3b0861bcd7534e83fab6bf6f8cc7 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 27 Mar 2011 12:14:34 -0300 Subject: [PATCH 043/190] Show blocks found in status for solo mining. Fix bug where status would show shares instead of diff1 when solo mining. --- guiminer.py | 60 ++++++++++++++++++++++++++--------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/guiminer.py b/guiminer.py index ed870ce..3e25990 100644 --- a/guiminer.py +++ b/guiminer.py @@ -350,7 +350,6 @@ class ProfilePanel(wx.Panel): - Post updates to the GUI's statusbar; the format depends whether the poclbm instance is working solo or in a pool. """ - SOLO, POOL = range(2) def __init__(self, parent, id, devices, servers, defaults, statusbar, data): wx.Panel.__init__(self, parent, id) self.parent = parent @@ -362,12 +361,12 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): self.is_possible_error = False self.miner = None # subprocess.Popen instance when mining self.miner_listener = None # MinerListenerThread when mining - self.accepted_shares = 0 + self.solo_blocks_found = 0 + self.accepted_shares = 0 # shares for pool, diff1 hashes for solo self.accepted_times = collections.deque() - self.invalid_shares = 0 # POOL mode only + self.invalid_shares = 0 self.invalid_times = collections.deque() self.last_rate = 0 # units of khash/s - self.last_update_type = ProfilePanel.POOL self.autostart = False self.server_lbl = wx.StaticText(self, -1, _("Server:")) self.server = wx.ComboBox(self, -1, @@ -424,7 +423,7 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): self.Bind(EVT_UPDATE_ACCEPTED, lambda event: self.update_shares(event.accepted)) self.Bind(EVT_UPDATE_STATUS, lambda event: self.update_status(event.text)) self.Bind(EVT_UPDATE_SOLOCHECK, lambda event: self.update_solo()) - self.update_shares_on_statusbar() + self.update_statusbar() self.clear_summary_widgets() @property @@ -438,6 +437,11 @@ def last_update_time(self): def server_config(self): hostname = self.txt_host.GetValue() return self.get_server_by_field(hostname, 'host') + + @property + def is_solo(self): + """Return True if this miner is configured for solo mining.""" + return self.server.GetStringSelection() == "solo" def pause(self): """Pause the miner if we are mining, otherwise do nothing.""" @@ -534,7 +538,7 @@ def update_summary(self): self.summary_shares_accepted.SetLabel("%d (%d)" % (self.accepted_shares, len(self.accepted_times))) - if self.last_update_type == ProfilePanel.SOLO: + if self.is_solo: self.summary_shares_invalid.SetLabel("-") else: self.summary_shares_invalid.SetLabel("%d (%d)" % @@ -654,15 +658,22 @@ def update_khash(self, rate): self.last_rate = rate self.set_status(format_khash(rate), 1) if self.is_possible_error: - self.update_shares_on_statusbar() + self.update_statusbar() self.is_possible_error = False - def update_shares_on_statusbar(self): - """For pooled mining, show the shares on the statusbar.""" - text = "Shares: %d accepted" % self.accepted_shares - if self.invalid_shares > 0: - text += ", %d stale/invalid" % self.invalid_shares - text += " %s" % self.format_last_update_time() + def update_statusbar(self): + """Show the shares or equivalent on the statusbar.""" + if self.is_solo: + text = "Difficulty 1 hashes: %d %s" % \ + (self.accepted_shares, self.format_last_update_time()) + if self.solo_blocks_found > 0: + block_text = "Blocks: %d, " % self.solo_blocks_found + text = block_text + text + else: + text = "Shares: %d accepted" % self.accepted_shares + if self.invalid_shares > 0: + text += ", %d stale/invalid" % self.invalid_shares + text += " %s" % self.format_last_update_time() self.set_status(text, 0) def update_last_time(self, accepted): @@ -687,13 +698,14 @@ def format_last_update_time(self): def update_shares(self, accepted): """Update our shares with a report from the listener thread.""" - self.last_update_type = ProfilePanel.POOL - if accepted: + if self.is_solo and accepted: + self.solo_blocks_found += 1 + elif accepted: self.accepted_shares += 1 else: self.invalid_shares += 1 self.update_last_time(accepted) - self.update_shares_on_statusbar() + self.update_statusbar() def update_status(self, msg): """Update our status with a report from the listener thread. @@ -716,7 +728,7 @@ def on_focus(self): This ensures that when switching tabs, the statusbar always shows the current tab's status. """ - self.update_shares_on_statusbar() + self.update_statusbar() if self.is_mining: self.update_khash(self.last_rate) else: @@ -729,23 +741,11 @@ def get_taskbar_text(self): else: return "%s: Stopped" % self.name - def update_solo_status(self): - """For solo mining, show the number of easy hashes solved. - - This is a rough indicator of how fast the miner is going, - since some small fraction of easy hashes are also valid solutions - to the block. - """ - text = "Difficulty 1 hashes: %d %s" % \ - (self.accepted_shares, self.format_last_update_time()) - self.set_status(text, 0) - def update_solo(self): """Update our easy hashes with a report from the listener thread.""" - self.last_update_type = ProfilePanel.SOLO self.accepted_shares += 1 self.update_last_time(True) - self.update_solo_status() + self.update_statusbar() def on_select_server(self, event): """Update our info in response to a new server choice.""" From 6ca92a2b6c74a3d9397ba713bb7ad2d80e66fffc Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 27 Mar 2011 14:31:36 -0300 Subject: [PATCH 044/190] Mark modified miners with a asterisk and prompt to save modified miners on exit. --- guiminer.py | 70 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 56 insertions(+), 14 deletions(-) diff --git a/guiminer.py b/guiminer.py index 3e25990..c0ba161 100644 --- a/guiminer.py +++ b/guiminer.py @@ -395,17 +395,20 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): self.balance_cooldown_seconds = 0 self.balance_auth_token = "" - self.all_widgets = [self.server_lbl, self.server, - self.website_lbl, self.website, - self.host_lbl, self.txt_host, - self.port_lbl, self.txt_port, - self.user_lbl, self.txt_username, - self.pass_lbl, self.txt_pass, - self.device_lbl, self.device_listbox, - self.flags_lbl, self.txt_flags, - self.balance_lbl, self.balance_amt, - self.balance_refresh, self.withdraw, - self.extra_info] + self.labels = [self.server_lbl, self.website_lbl, + self.host_lbl, self.port_lbl, + self.user_lbl, self.pass_lbl, + self.device_lbl, self.flags_lbl, + self.balance_lbl] + self.txts = [self.txt_host, self.txt_port, + self.txt_username, self.txt_pass, + self.txt_flags] + self.all_widgets = [self.server, self.website, + self.device_listbox, + self.balance_amt, + self.balance_refresh, + self.withdraw] + self.labels + self.txts + # self.extra_info not included because it's invisible by default self.start = wx.Button(self, -1, _("Start mining!")) @@ -414,6 +417,10 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): self.set_data(data) + for txt in self.txts: + txt.Bind(wx.EVT_KEY_UP, self.check_if_modified) + self.device_listbox.Bind(wx.EVT_COMBOBOX, self.check_if_modified) + self.start.Bind(wx.EVT_BUTTON, self.toggle_mining) self.server.Bind(wx.EVT_COMBOBOX, self.on_select_server) self.balance_refresh_timer.Bind(wx.EVT_TIMER, self.on_balance_cooldown_tick) @@ -443,6 +450,11 @@ def is_solo(self): """Return True if this miner is configured for solo mining.""" return self.server.GetStringSelection() == "solo" + @property + def is_modified(self): + """Return True if this miner has unsaved changes pending.""" + return self.last_data != self.get_data() + def pause(self): """Pause the miner if we are mining, otherwise do nothing.""" if self.is_mining: @@ -469,6 +481,7 @@ def get_data(self): def set_data(self, data): """Set our profile data to the information in data. See get_data().""" + self.last_data = data default_server_config = self.get_server_by_field( self.defaults['default_server'], 'name') self.name = (data.get('name') or 'Default') @@ -811,6 +824,8 @@ def change_server(self, new_server): self.Layout() + self.update_tab_name() + def on_balance_refresh(self, event=None, withdraw=False): """Refresh the miner's balance from the server.""" host = self.server_config.get("host") @@ -920,9 +935,26 @@ def set_name(self, name): self.name = name if self.summary_name: self.summary_name.SetLabel(self.name) + self.set_tab_name(name) + + def update_tab_name(self): + """Update the tab name to reflect modified status.""" + name = self.name + if self.is_modified: + name += "*" page = self.parent.GetPageIndex(self) if page != -1: self.parent.SetPageText(page, name) + + def check_if_modified(self, event): + """Update the title of the tab to have an asterisk if we are modified.""" + self.update_tab_name() + event.Skip() + + def on_saved(self): + """Update our last data after a save.""" + self.last_data = self.get_data() + self.update_tab_name() def layout_init(self): """Create the sizers for this frame.""" @@ -1232,6 +1264,14 @@ def on_close(self, event): self.Hide() event.Veto() else: + if any(p.is_modified for p in self.profile_panels): + dialog = wx.MessageDialog(self, 'Do you want to save changes?', 'Save', + wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION) + retval = dialog.ShowModal() + dialog.Destroy() + if retval == wx.ID_YES: + self.save_config() + if self.console_panel is not None: self.console_panel.on_close() if self.summary_panel is not None: @@ -1244,7 +1284,7 @@ def on_close(self, event): self.tbicon.Destroy() event.Skip() - def save_config(self, event): + def save_config(self, event=None): """Save the current miner profiles to our config file in JSON format.""" folder, config_filename = self.get_storage_location() mkdir_p(folder) @@ -1256,8 +1296,10 @@ def save_config(self, event): logger.debug('Saving: ' + json.dumps(config_data)) with open(config_filename, 'w') as f: json.dump(config_data, f, indent=4) - self.message("Profiles saved OK to %s." % config_filename, - "Save successful", wx.OK | wx.ICON_INFORMATION) + self.message("Profiles saved OK to %s." % config_filename, + "Save successful", wx.OK | wx.ICON_INFORMATION) + for p in self.profile_panels: + p.on_saved() # TODO: handle save failed def load_config(self, event=None): From 7cb01fc540c19b169cc96f86d61cf620821c6c09 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 27 Mar 2011 14:33:20 -0300 Subject: [PATCH 045/190] Clarify text for Launch BitcoinClient. --- guiminer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guiminer.py b/guiminer.py index c0ba161..649ece8 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1144,7 +1144,7 @@ def __init__(self, *args, **kwds): solo_menu = wx.Menu() solo_menu.Append(ID_SOLO, "&Create solo password...", _("Configure a user/pass for solo mining"), wx.ITEM_NORMAL) solo_menu.Append(ID_PATHS, "&Set Bitcoin client path...", _("Set the location of the official Bitcoin client"), wx.ITEM_NORMAL) - solo_menu.Append(ID_LAUNCH, "&Launch Bitcoin client", _("Launch the official Bitcoin client for solo mining"), wx.ITEM_NORMAL) + solo_menu.Append(ID_LAUNCH, "&Launch Bitcoin client as server", _("Launch the official Bitcoin client as a server for solo mining"), wx.ITEM_NORMAL) self.menubar.Append(solo_menu, _("&Solo utilities")) help_menu = wx.Menu() @@ -1419,7 +1419,7 @@ def launch_solo_server(self, event): "Launch failed", wx.ICON_ERROR | wx.OK) return self.message( - "Client launched ok. You can start the miner now.", + "Client launched ok. You can start a miner now with the solo set to 'server'.", "Launched ok.", wx.OK) From 69c7e5f952a66d2adab9803a63d54c8e6560a9c8 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 27 Mar 2011 14:36:19 -0300 Subject: [PATCH 046/190] Fix typo when updating tab name. --- guiminer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index 649ece8..c97f816 100644 --- a/guiminer.py +++ b/guiminer.py @@ -935,7 +935,7 @@ def set_name(self, name): self.name = name if self.summary_name: self.summary_name.SetLabel(self.name) - self.set_tab_name(name) + self.update_tab_name() def update_tab_name(self): """Update the tab name to reflect modified status.""" From fb30db90c4852e14a942007502a3f340c4b148b3 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 27 Mar 2011 14:37:57 -0300 Subject: [PATCH 047/190] Version bump --- guiminer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index c97f816..5dc29c6 100644 --- a/guiminer.py +++ b/guiminer.py @@ -13,7 +13,7 @@ from wx.lib.agw import hyperlink from wx.lib.newevent import NewEvent -__version__ = '2011-03-20' +__version__ = '2011-03-27' ABOUT_TEXT = \ """Python OpenCL Bitcoin Miner GUI From f348f19cd8b6ef30d5ad9af023943330c58d5b08 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 27 Mar 2011 18:56:53 -0300 Subject: [PATCH 048/190] Use .ico icon instead of .png icon to support multiple icon sizes. --- guiminer.py | 27 +++++++++++---------------- logo.ico | Bin 0 -> 370070 bytes logo.png | Bin 13005 -> 0 bytes setup.py | 2 +- 4 files changed, 12 insertions(+), 17 deletions(-) create mode 100644 logo.ico delete mode 100644 logo.png diff --git a/guiminer.py b/guiminer.py index 5dc29c6..851ead0 100644 --- a/guiminer.py +++ b/guiminer.py @@ -33,6 +33,7 @@ """ # Time constants SAMPLE_TIME_SECS = 3600 +REFRESH_RATE_MILLIS = 2000 # Layout constants LBL_STYLE = wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL @@ -65,13 +66,9 @@ def get_module_path(): module_name = sys.executable if hasattr(sys, 'frozen') else __file__ return os.path.dirname(module_name) -def get_icon(): - """Return the Bitcoin program icon.""" - image_path = os.path.join(get_module_path(), 'logo.png') - image = wx.Image(image_path, wx.BITMAP_TYPE_PNG).ConvertToBitmap() - icon = wx.EmptyIcon() - icon.CopyFromBitmap(image) - return icon +def get_icon_bundle(): + """Return the Bitcoin program icon bundle.""" + return wx.IconBundleFromFile("logo.ico", wx.BITMAP_TYPE_ICO) def mkdir_p(path): """If the directory 'path' doesn't exist, create it. Same as mkdir -p.""" @@ -171,7 +168,7 @@ def __init__(self, parent): wx.Panel.__init__(self, parent, -1) self.parent = parent self.timer = wx.Timer(self) - self.timer.Start(2000) + self.timer.Start(REFRESH_RATE_MILLIS) self.Bind(wx.EVT_TIMER, self.on_update_tooltip) flags = wx.ALIGN_CENTER_HORIZONTAL | wx.ALL @@ -250,12 +247,10 @@ class GUIMinerTaskBarIcon(wx.TaskBarIcon): def __init__(self, frame): wx.TaskBarIcon.__init__(self) self.frame = frame - self.icon = get_icon() + self.icon = get_icon_bundle().GetIcon((16,16)) # TODO: linux size? self.timer = wx.Timer(self) - self.timer.Start(1000) + self.timer.Start(REFRESH_RATE_MILLIS) self.is_paused = False - - self.SetIcon(self.icon, "poclbm-gui") self.imgidx = 1 self.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, self.on_taskbar_activate) @@ -272,7 +267,7 @@ def CreatePopupMenu(self): menu.Append(self.TBMENU_RESTORE, "Restore") menu.Append(self.TBMENU_CLOSE, "Close") return menu - + def on_taskbar_activate(self, evt): if self.frame.IsIconized(): self.frame.Iconize(False) @@ -288,7 +283,7 @@ def on_update_tooltip(self, event): objs = self.frame.profile_panels if objs: text = '\n'.join(p.get_taskbar_text() for p in objs) - self.SetIcon(self.icon, text) + self.SetIcon(self.icon, text) def on_pause(self, event): """Pause or resume the currently running miners.""" @@ -1162,7 +1157,7 @@ def __init__(self, *args, **kwds): try: self.tbicon = GUIMinerTaskBarIcon(self) except: - self.tbicon = None # TODO: what happens on Linux? + self.tbicon = None # TODO: what happens on Linux? self.__set_properties() @@ -1196,7 +1191,7 @@ def __init__(self, *args, **kwds): self.__do_layout() def __set_properties(self): - self.SetIcon(get_icon()) + self.SetIcons(get_icon_bundle()) self.SetTitle(_("poclbm-gui")) self.statusbar.SetStatusWidths([-1, 125]) statusbar_fields = [_(""), _("Not started")] diff --git a/logo.ico b/logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..a3bf8e3b646bd5960ab4a799e32afaa7b24d64b6 GIT binary patch literal 370070 zcmeI53%ngwb^k*tr8H7ZDcV$Hh=`CP4HVH@Ye6aaN2G{KQ;ak!MXS~#r4dtV#VR5q z@-l`HLPX>d-T@IYVn9TSF~kreV0ai1Awmooa^LsP|M#79=H9t;=bSU|Gjq<`pU*lo zXC8a@Ua!6O+H3DUY0`F+{$SEeUph%?_euZy`;#Vpn6uq$|F6>Z`*dx;{p$bsoHXfE zyG@#O@WHkJd%tbcq*uLp(xlT)tN;JQ?Is=e8O}+&PuhF;-=FmFr*AiDZ~fyFy9>5+ zf0c*w4JOBNw)4ZEU(kDiV3A;hV6YCHbL{~Cv;K44n=Du&aGJod?kyHf4te*k;CoXW z=f$(5dDQb9{qF1=`klY~R-bdn#vy0w`3=jngfi$|>Pxvs-#`1_LFX&~H|RXIb;P;w zzCq{WpA9|Up=|9$6x^RrFE&I^4b&MTE4-}o|^Y_gUQQyh^w~N98?L^tf7iy!z|ozoB;)t4gly=p5dk zz`x)-PVd4y=Lw)yqwlo3&b#Lb8uCT(yZqPl)cHX{tNf$hU$49(;X=}DHG3~`54uj^2VH|t8s_&8*Yr6X)P9|*Z@%WjUT08xpZ`tT(S~{HJLd)P4!C?lGno{SlF6ng+T-xW*HtnzTh~?p1GrcnCe5s&WdEI=UQhU)e zIN}_4Q@^uX-zR|wFHs)a_P@V!LVF&T_oaFdSwpXd>K5uUeL=7Du50^Tyl;AO>|5S9 z!;Zh%HWJpR2g|@W`8N78c+dS$JM}x+D8bY#9NZ~7&<>t_`+(aP-Y?t4pFaD;NW3{m z-(K42`_%u&Uko{X4_nDg&^}0K%8D)JrCT1U*%*!Tu3ulGBke|L{kcB#qF!hBIt{$M zp*b?(e{Y8DfNcX~->2OE`wh-l>-v@k_r|@C4f&!kf4|N3I@u++K04$T&$Y?kd;J8P zY+QczZ}M&0&#-&ruA%Ez%5L`3mFtI`c|RC%Zr)I%k9Qq=@Dtw~a3bnPz8&fNl<|u{ zuGz2Nw;COx!#~{^ss4OB68`!AJEa5t3Huw_#D3?9KJ?OKTPE@-c?5uO!vn$Vq5t6l zKaU+7sN*Rs$MAzLf_Gcwy+-$!w0LGT4`hzMlb6n4HQsJt_VclO$n5SDZR63r>fcz2W~ed_1s9{g1sQ_aC~Y-_=K6xj3Gsep-ZlkJB>^^>5hw|1RG45`8)N-Jj6C z$VJ$@forb*)w{F-*q2S;p?&+dWUa@i1HA9jry@RGiDDS)Vd|K@>@<^ZXqu=d!{!?us{MaH7Y`h8f zR~-kj>`!$3-v|#azURN+(Ejvrp}goP@|^#@EY8WZsr~IM19)g^3&$)UbPct;y>AAO zdLDi_M*y!Ttv~O=*P-+delzU9-USy+1?Y>Y<=|O#%BYPSmUofhodTYjD?4h2j@yUjS;RGcd#d#9JRMi-IEe1WwsVjEbN5>P z`uOufJ-=G@oF|xCM49=9$~#@KP~`-_QRSw^b8cP>mEW|y>Y=Y_bUJ9$f^4njqj_)<(6F<-R&&TtO+rEzF;m>c}`C5H%R#;i$ zUQ<5D3cyPX9?1H>%Tu%Cme>Ehbj!)Y6*|QEb8vq_kLnPGXZ+8A*Ri_AJm=dd`^yyd zTs-cUy~ZO5Oe!+Q$88I$ud{JXS_pC@HGHVW=l*I9bDrW;3j zCOZFM^Piw`q$L^y`$vuAP~Mn4)9880V9)-|>L4DUELaPl*Z9UehVu_)+iyv)!?+iH zMeu#pwf$~?fj+|}YX|FXTK)ZcT_WfoKmYj7d(eRmb*t{7dn4spsBk~W=GDb;R0sOyQ`_esQ*DhN( z=zK$Cl8jGM*Snt_a;{iE=&B5=w74TF7&wk{a+eu$2a>u)Q&v8&?pDx_b)w#jCNfIxXFN>+)F3 zyVtq)p)p^kmk<7T|G0e&UZU*uMMl3_`*t}0knh2YQ~8d@Fo^q@FTd`9^roLT9)EsB zIv*Yk=Yda(SNzX&J|IO~)3e@t;qL}{Ot@blxYNT^l%to2hfjR9{sem*pz*q}ym)t^ z;%kEGx8gb4y|8y$Tyy){?la1pV^jWdbx{pR?z8%Tu6*5I^7!H3ZW}+&QLA&!&Y+$1 zlK1@A{`Dfg7;uFS0g8Xp#1GTYKo~4b#p9s%|=^=c} zjB(ZK7>|EccF)H#T6YfzQIGgl8GH4oCtetK_0MwYp-u9;dwBLg!}*V;cS2&E;*@1r zcF#E7>8D+I9me=avg6{7cqx*>HK`xU$Jov z&pz8hWdy$y?un<}YaHw6$UrdNBi_J=PE4JP13gQ9Y18~;ZQgsd!L{#s-{jchye7XZ z$I4j4ssI1P^BR6?*K6l{s2{)>H~91tF@>YgsNDW@uMP7*kBwU6-C8~U&o@4Ib^n4< ze(>|oD38?2=<-S(hojGr@=}jei`y9E4aUz7SPD z;w8uQXpKgr`3HEW4?Ii13Ev6v&Wvw+ z{6LwTofD%=xuIzdU&=Gi`T6SWo4W=8w;zVp$0ToVwlG+%wigVe8a z@2RYmm-c`}J?M9G4SNk53<*465$|~KMLX~Ltg@X@cCM++ll7god<$@W4yup;ymrlh zf8sgMe@*Ry$1iS7maY+J&Nb@v9^$a---vn?Zt-n4^dC|O;efH0Z7%+W8;<^S7gu$h zH9Mapx_F6r9_oZWL~M~4%i!hPEFa%9vNL-kjmaoKjk(CK20vc;>*u5Y>vizuKUz{%_@Zu5U4BfZd86 z>-HaNbQqKM8s2OF^^B_nd`I4K<2Q61_2uVT=CHga8^q7dP+8~d2wmFD}r zbPs!RqhO_;p}#s;_onMSb^J^%9*8+nBs&(32ja927Mv#V;X1*ZxqZ`wLHdY`=K3wF(`9&z(kS#}e^uWq}iW23TXd7W?Z&9>n|-`+uRl7P6@ zEbA60FTQ=EV28MLOY^+Gx32*EAWm8He0G(}vQL^iMSWM_`G_Fkk0}Kn=vN#cwH|Sw zQ{M3VB0-*X%pz~>OaIhjR4)i`eUnRPG zb@z^xJ+Un4U1Z72E7N0(K4g~PS`^0Dt*)uwCuCiBeCzn9Kd5Wy#t zqBVo=yhp~{y;xi3`TG;k6etJSYb|wwp240>RCnH^{@0C*g>&3>7P!aSIsP$j=7ql8 z=l4qU-H7j=)QIj}S041?Qrq*)>-49OX|5;b12^O5-D@ZgeGswiSv*JGc58$K-J?&H z`a9lSTMq}sI#YM@{*1;T{fRlcdn(4~kSqG!IBDj^0`FJMG-KbM>|{}{dLCzm)nE6Z zeI|Wa>dN@Bmzdj6J-B{YKnJi+MOf@B?`lZUT_b=sGcv3{b)3Khx`tmNlkZT^>lHKZ zCF;REd}0EW$ATwcmz%L+8J`q|dohvHV#l;t=2aNnyh>*%24z9~6>RJ;zo^Gd7%m!zyA?;NBux;&tJ7lhnz`JHzv zz7p9^QeWOd7JjZakoX1SF^E@gm45Kc%y{5DU;PvDKCvVI_PkZuiK!x<@FQA(kTsaV zIW{6Z?eX>8oBN$-6*JT*v2H|0cJl`6uQJR?LVMnU|1SuM?`u?cV)J>Y)%U!04jbje ze44 zn}_-k`vM-YWdYWT3`@vL$oi2J>hkjQdL8-=jnb#0trs&PUthhwd)}Co_dk>4@tQN) zC`DQ8jJ4bR{ls8itSuK(mn7G`@wg=KHhhOQXCxA#3H!HM*@=H_CPS=W+U)(9_txoo z#vQZF)0F|r8J3#q0Afao&25y3Z9O#FT6t0HL)|m?<6I|$OCIn{ZjL@ znkDYP{i<3#a)$Jx?t>ZTH;VUWI^b)Hn`Pb*Yx_n?&>i0qak&|nmAdCr|7JQMN}a== zc}VMJ(YMYJ2h=@t{-=DjgN<}RSlyytBkp=^PC;sZpzfLLKkDC12T)hqH{z{X58+@BLokO39fYly&GM#x@OoIn)=oITKKM=QerB_Bq`61m4xJU2(ErV7NPm!i zaijD$`3uvOt^O{yKYf5K@|utb^<%A&utZ`E{n)QR}Z!~*9;=MU~ZhFLL6MYYT z)+jZj;nD_pBd?9Jg_`kBjQY6ob$Wh7jCW$;Vc#ZwfuIh6=kX7FYh^aV+b7jtWKiBm zmA~izIxmC#Ld!&7mUTYE5^F9qj~qW5{$ct(t$bMf+ zEHSUI)w&tpdp!F^t!a{BIS*3a9{n@%e}|Qg^%ok^->X}*Bfcf(>tpw3B=g{Koc|j< z=vrpuAJiG1hF<>hR=dfxMmhT%8iwQ=Jg_4@CsytXFHZKGa~s_UtIf!?=*W1NlZ%ys&}>@mcP{QMx-VWr2e6I=_t62&`R17n+xtXu(JId( zugqB=@n^EG9%DJI{SjqcC}9~UtSJyh2I_KvE+B?9OC99qg?`A8zKzO9*(1q(Bb?~{ zodmb#frFg$TtV3z)ho_*@)6|12RY$@vSw0u4^PSuSy-4;c^mO>lI!TKR6Ot1Iqays zj~8q!As%S2PY5e>*4OkM>;vqHB=pJS9qhGO?R#3B=zGY+iGtMq1?7qF6G$7p3mxeX5{oA1<#tM#)!Y z^Ur_I0vGtE@y{Ma-cia>re{=U;_K!J;Me7Xbppm6(bt1@;GApR+j?#nxUdI7M)@V3uHV(e<(KHTP?YCVL9dsS5?rZL1(ko15er@?Ir?r;Zcw?aH-X zRpu$-duPGn0_gp)U|5iZmRY>Rx6v2qi6aC%R~ffuExYi#lK_3bOhDf#3)X7O<8G^XSsyKeFf(TXtVR6SDtxNX3Acu{~}L%6p^>^ML!e$e!HNZx;-o2pbjhQ zbuwF_!8oPxgWqkoV67l4+?OpM{F&6TZGOEXWH|0Ogb&)wb%L_dE3fjv2S>!kQ>Q&I z92_XPvy12+bp@mIWjGN%lf|RhRiQDy0_$ee2X2W3sj#s3h2x?)2rl!WQC@kfyt@fj8tpUVefo)|jSceik;*wu@SxE? zGunIlb3M5A7t+3bHYIKj?tOTR$h-BCcl#Aw}K z9IS*EMcV`VCVq)Z(!RjGDT>0+q9W-px__ifv}Zmx>oxu9xjoLSwPwYU*Yvylw^XSP z5z6}UB6vXMI6#1Jx+vaG^c`dzdb1b$yRPkb&efjo|M%3e!@d-xqp#~Pa*vusb%=@M zUOj(co;;xZcM&i)RYZMKedCo{Z{vqg3_Gl`8n|DzER4`2B2@rx3DK^KX#Q5=}*q7!LB-T4ZTvp8jo4Y8}sU7&o|UNv&%wz zuN=Ykb%VT+)CQPxPOrO`G3!F}8L?4Td9-;%xweNeC5B{-r3BF{b7v&_HGO8;b*PaGQn{an-GJ?@^{;S|j7Dt@T* z#Ru&BQPQ>{@_b{_enlDSAH@d17mQDs_31BMGw7^&X4n~MY&K@c0QH>M8;*UlDQn4a zc)N<&vJFs~_Yn-2tn8z>Y-IzmFIP_jU7jT)JpJN`^M-F^y06P<{Zr5dn(o_*2lUK2 zDZY_KIUDAIUS;pKW_u`SNyjvKv9D&l)t?1x%5{58hZcb#eL4)Z}&UjxPQpq zYjG%itF~X zdS`Kj_cE&k@_@gUJ+ksn1F{{U^`){U*pm*wEq)qkf`1?Vj87k(#L>G>tT2AwN4KOi zKA!Izad!WDspvm$?<~C_O>1<<=7>@@ z?-_UkUSZF=H0j;tiZyyzbs4n*RafS37Vh(b7Vlf$JVq-i&Ka|L=~sI)^~J80EtfQ% zr*;M1;_+3RkI;H_{;1B6Ygc)YuSd6J-w0$K-wCfWXCP@>p|L~8kK2XkknbL=y0|(( z_X=(M{bhmvr{2+cTt6wkc`xhuPHdK^wkG4%_0JBM%@;Ik1Bf20{4^>0{52Y{!A9~D zHsK?`9dWLCaL74JdncP4llLcFw zJePZ!vA?17b?PS(=e@ti&uA;L55XDZzR)sm%6g6m<)Ms8QVHq*f@qGvpLJVur*W%q z)ac#VUSmwRFD46QZ3FD8IH9|rOlAWz4h{db!b8FL8S8DU&p&E?!QD@vj*t5+ZGgQN z^*S#$m`~VBCoI#rRmprn@ZwQ|Q=-zKozI~kh`WoMva$j2SDqsuVba9dMqJ-R0r);y z-)NidAE$oU-tWCWe*Y^A8vx$p+XDm{CrFzV4>Daoq&W30=vn6T-cr!FQrG{rZLk5b zP3Oo*l~nJ;E}zoeHRdpu5YIQOOl|G^#lcCDHURw&eD+^oJ?Nx~J-B1zaM}8Oem=Zc z_%Gb=ABX1tXN#}_koVoCtN-%{1J17#`g*)3f>_WJ#(??h5ABHw@?R_Mc^)Zl)N)`ls5fH{Y3m)X^Li^IM<>SX+S{ncxoVFOB68im}ip`*3LEJEL0clg8 zY((M+N=|o=C!sy-26_KWe@tovyz`nq=e6p;vli5s?-_L0271Bgb52Wl-p6PCx0@TApp#N7H{|~YcWNiZs%5Hl^F}}Aewu4x3>^IhcIP;zX%|9A+W5JWG58&sm z4eA?|uull>@d1|EMhPuj8XJJQ`o#A`XJY#HR(vozh4>!E`SAUEfZirXe5Rh^`80em zNAq1uHU^0ApD}SWr|#uBsKu!_{{4{Q)l>xx&2AfY^_UEB0G@SKVkq=;iFye zv%kaY1Tlf^|B;3U*bQG*JCY>*o8p_}*c>_Ime}8&1jGVYjt6LqS>q{gN^1kS^iLQI zSR(pw70o9Lcgz8(WFHVY`X~8S;-<7V0R6#cYtc3<&j&RhwIuSt3fcpr|H3NDKV@c| zjWrzOq_j4`UtY|*^2x>$ne$!}TrY<9fXZ`hNy-!(H^kI4w<2yzY6IXGVlHQrL>w?{ zn3e?B$Egk;{b#65h0p)a0uQbYa9{p5fTy#WlbAFu(VD^~Sr2U7{BQU`w0JlRdK8^U z5jFrihIJ>?%>SpoU|wU<_-XJx{Ql$C1J?fq4W2DanH!cP4;uhI58a6gT_%|yNV!nW z>35eZ7G#m9`@N%Re?(R3pM?#89-%D(4p`dfd|GohR{c7gm{9r(@KcHKd!$Eq@2Ij( z78JJrTb8&;Y6E;(bIxgxS-YKn**De>IX~Ar4Jk!kC>=}8|6u)~EbE&xuh8}1RAOv^ zWhwJ+OFfg?0F1{xrnP7C3JYcJ(h}k`bp6LV{VO{baOjnNV?x*FGx+L5n(zBE*$*Y8 zf3x*p@da-xVVRrak?~yOb=sY<@rm_gt%{Ph_a6SBZNv4Sg+JPWbE-stX#aZIYgx?M zO3FXXBU!R`(Cy!0i~)1NV+()xltI~}`if7xxP-8JZJ?oH;4O-gUxV=SLF zMgL2&Aj~T&iC?D~??Kajpm8hEbGMg~hw-1Vjs|uW>!}g9*{<~A@2Gv(UKAzO^I?3j zq7~h}`=WiRd;yHNo_5zjrv0+CeDfvEA*>MX;fKRL`nEdiS=IwyD+uGG!mkml!FWv( ziT%azeQMZU>*tZ*HdZh{d?I}uS%LUn4NY6o-G5)t&n~chEqQ7W#cXZM$;5x+g%Rg} ze>C8{L$STYh7ni9{P2r4UehSCetgN+^lpa3So=T12ckXuzpg6_4-j+5T26T+_UIs{ z!ygldoyq~@jM~0kJ zG_&rA99MkHcH4j^6q~xiVc8X@xN1|^OnB8sJx*% zO%XgG;!nGt z4{pHuw7lsXC4ZHJ{ew&4AM6r71lObc_eP;n-p?2h6sG^6{mi`SnI!)@4_I4}kG`iJ z1-GS=`yijFeAolnCD!g|iv#TJQndF$ng{=@ob(ImmlzLZgM*deG>GRi|5tgLOIF!6 z1xm!b_}QAy*(y07oS^dKn>Jk#4+r4v<7K98)Uv4_`wJMGG9HMA1IAbnjEdhXJg53F zc3jCZgM#^X3Am~PO_P*SbvsgEeZ+}+fPVeaNpM=Vci?Zq*@AvSx3>wzRuf-4rD}9c zTVB-}yP%uAh zMDy{2IP1j!!p-)A!v!k@!-A^o1nNK=N1bBL!R|!*#;KF=wU6K&LFM)+te2Ux?;EGi z_Uy#@YQiDD?t@-06(k}Y!&3CAISS&0rWmrQ0lSxPNR2}`iLfz1+xT43r-Qh7q<$a z8~S3Cpf>~C#Nia=th~VP_;wx?t zAlI7(^m+60i?qs@IFBs?^aMKMJi&>A!v!-09oMh!H2$*slt+h2UTD*i^`ix!5iAot zD5zqbHD$))m$U8Rl34#TJRf4U8R_$(8@1qm2 z6&4GqGj%r`!Sq4uwQQ5hVA1c1-=_*@3y^ngcx>pZ%5&OsQ}^`(#^dG+DlreXXr8g} zRky7dPZP_quizxXErJ&WY2~I<-v>9h3FZlA2`sMCY=g?#2Jmg2e^1r%9zi#^@kw6x25dzwu zcE;V9z8SA?unDdd94auMq1gnP+63Y$Z2Y+b`k*Fz<;DRtnj^5d0@DMj^niG1iU6Mz zF?c5T)xrU>6(tRKXU3wfTkv zc;IOPK0;f+zk~IF=zFMOwZP=wa1h1=cZoONVzzZU+q!J{6HTWIm}4GBbGv4E@$rS@emo6MD^Jfh>#f`lk-@g;h_Re=6(rQ_|s;V23ZtP(H1shvD+-)^mcL?hyO<_r1-QRr&V7@nf? z0PC`zWOCSA4%>kv(T269Z!x(yy_Yi&uqOM|cJR1;GhFwG9*pZfnls&_wiEVT=i3y_ zC3v&RW4JsPi5Jn~M1k4+oiB4`)2s9cK3XKN+qcH_jc`vK-(o@8_`=H5T{I!C#O4$h z7&j<<)7Q5-JKZH`W!9^=iyx<3`#jb@=Y+Jdh!sk3e)%d{5+ubyq zXF4Fg4v^dve{Hg4IH)2IoMAd3xek!rpKY>ly079qaJK1ycsfAz-cexl^{vgXVw)dU zX43%?eS(tv9R#*6pUHlh998++W#Vhwo2-Q%5RMiIs!V4qyV0)^511X$ME)iB*55bT zX(T(Ha@}-5hz^kKpK0yB**#st1812}aLgwtnxEVybnlcl%<7TePCMCjfE&|0*JR(? z{VwH!b0-1oB^b{d4vYuJc!2e6cJ6c?pgLMy?-1N!khpRM*iMBX2Ne#99V_N0B{@!E%m-S^BFPL9td*xrof9vw>mefO{TI;Z@g*1orr_n-!N{CUTjAsgZ4>L-{^E-Ob+4sx4>z}Xp z-w$8b@BHg`2b^j0)ko0*`0tS6q{(~$LfkGD!XHkYzCl6Sv%B}-c#;&#dvEA{_ALbi>kK>Lf_!12FlI$ZPll-zpYs+Z-W%e|y2oh~@2g z*#{5!?tzt0m=D1CB6nSOw{YCHJq7jcV~oZVX^aox?0d}zV7xJrH*&zqaqX}HR1eni zT$e+ADsLz3A|Jr}mJcMb{%fz851-#p%AKb%ipAHc=t12Fyw z=Z_rla#E2tfXcs%;PD*l(Gfa%)CaJ!`aS?+jj0doh%)bBH^m(jd&D>ga}`)u^d(x0 z=#S1C50kb2AoqBNXPL81Yy|lbCtz|ubF9as0Of79=L?6v{tKeevtr&kU-Uy;89pN9vh-8JZ( zeEWd=%s<`O@4QuOknVj^uRF&X{XyOwU477{@#3v`DCYe_Yyg$X+WrXqS|uOA)ejCk ze|T1H?SVbDwh-$Df8g8w&SxdVi+?t#c*bF8?Qce$XI^xiZE|ZcUpa2-mnpPGW1>IX zG~!(O^C1WQaKttJ&J4|$!ae}d1u=Qvo*(1ILTmuh=MzSw)_hteAHdU+>r3t*a(?vW zuw;Dvdckq!JkImXLw;n-h;!+>A?KJI`d!T`VuW)H-cGuGIjEE?q!6QsQ7nCwTVNl`uk=RCx+!W?00n=bvE9MgoAs9rya7^0m{?X^lM@B2l+EA9{~P%#@;-? zIsIdN>F>V2-<@l?;_+eUxALteT@TQcw=y2L^kNGP)ck|y7l^6@56?mVuM6_G{co<1 zv+x1nhyQ~!Ywi0H8h68Qe(R&d&L*w@pLC948RfiHna*1^=;}Xos_|V*9Ndtl{0rZE z32YyanC(A&n$`z!mwfX0$5}_P6WjMza__(YP2mAwhv|Tp@{g>}%t{9+uhZdWgZMZ| z>jUufznweIMOq`(?GKqhpp`tHk%jzA=Gn*Rag+V{vJcME`T$JkCt~2tdj{ROM2jPC z%9F@!>ajrOG23LnDV{_1FmdzPs*GO|8~@!DYXVM`fbPCR{Nej=indomm-FsyaZ0LK z0O4xi@8676Fue23A( zuDN(wo<{zK!x@5YhRbjsbLCzBXm1|eD{C0_;rez?@PW6NOr=~p*dam z@Q^zufURXb8j1sCcScejpm*mPUdQl?yt6-_C-3mxEVV($-!kA_xMtA#>C?mR{Fn|E zw^CNC)(_}0`ERTPPfjBLl6&I)h$ZS;+ho9`jR zv*OwSdgs(m$EV4AnWZ{<*;tzZ+sx(*Hq?Q!_6w5Scl=x*Vn{rD-rD!*vR2k7Kd3$# z{j^SRvl7-XRv$p$=vdnypB*tdpVB<@)#k4&t2oCl*LO810^jVPb+NyyiEf||u&?w|6oQ-I(0Pea>&Tb<+$w%@*%-w(AIq1$uTL0`w>2$*9?^ax}^#K~`xLc#N|C0M@ z0`?beluzZa(+BwDul6|XwcE)FSzrB3ZT=u~d$eSnn7Qd1FJlb>eCFO7zr-oy6Tyb& zo*%g8t@+J*BdpcQnA;&&^gHKkUhXe7H?a(9)zc#mw8gL6$^4tJZZGJ)siITUK7gK? zlQ92E;T(QGNU^zn9i##_YYmW<8;6~9e=?}`dk38TCF`%0UmSTw&XI9!AN=HLWCR%_ z4{(SMVZA=~Jm1>iUOhnn6G8qLCCImO_{L8J|9<MDTW^*hep zib1+Su}H^iJ%08bMy_e2nSX$+^B;N5lcs#jv_U0R5v!`j-)6$*2LS|mn=d9AW zO1sjHzo?A^&g%?jT0`Db3GoM|$#ij=N8h#RG@he2fF`Bf5n80CcbG_VmPVou_@Os+6vI zXxN?iTGloWoF4z3{2o5`aV914=Eo64;W9QEnj;7kn@=z4mt;4UYjdJ+&uEmm=-ZZ zjr>a7LpLnn(Ab8^QWnbY0{|E7Us!Z9`5)tHkGBKIaXvuZJ3MfIR3^IZI(8%SP7FQ% zt7h^Zh8uYP$ZO*H5t7PB*?j<$ztZc>zhlgvN?Omj?_Kkt)&&>s8tLgUx^>~TLxfk? z2cWutq6_QaP{*a=8}!8*mu=` ze}UnuDXt>(61sza!p#Ns0m|wFpfB|*tr76^=VA<~WTYtY;m}_*o^FbRvwiY^v*D^K zu43^LcJFC-72^jis}I1NTUoU9GbW4Q#^V25^79SIzvRBF=KL0+=NK1w=hc0&VhNHq zeP#3kc=7*twjut1oz^8|jK;?PTgv|$$pSI|y9!tvC{`P1&o{;wK7iL;*u6dg>>vL) zYEs>n)V7(Oj`u}fPzjODK?dj`#x@L>!UbEgGy2$uAHV#vU8Xg528s{u^~Byi66F|o1A}_i%&axufKM- z37y~rAdZ(?d3bDitbz{!Jw-cD9~%3f zy*-bRKmUT&gU%zrEk2H?nU48|%JUBS9hl!|?S5+cNA@>$avR+4x|Puf;L5w&c;+c0 z@3i%=Ry)uBz~?A__5sDv50^{qU6pYC!^6%#+P59wW4r0vA>V&W^|09g9NYhP_yB@) z-|*d04o}{ZALhugp4lh0KHuf*hupFI5{kSl_w3Db()S15@(1hIA#&I*eYVx)Ki{^b zXdl3TYA-X^-DO=uZyh6Skm<7N+2eq93|YUFbxeDTnWEgxoNs!MwUsIBeu^o^PO&+C zne!@bzqS84w*RzGMfw0}%ZYy1G-pZIC^LI2QnEV$c|3&%$ z$|$dSm1()w{CM@ka_@y+V%=o&Uy%Hp40xJ?_Rs#ZV(*zN^p7|6yL)Q9PV;W}(wqX?*4@9}>+GrhjrO{z zHiz&%*Y`W0`oZAnJi`22`Q~5Pw9Rp5UesqcKeT9blah`Z3;rVsE^8hCIu@XRH_W zgI~6Hv7l4$v^{_$$l_8xb5?}sOh06#BirQzVC^n!_p3A)@MO&qW}htDarVlZELlf} z=`%C8hV=rH@C5xE^a63YSspWI@nyHrnF@3|C5r?+TLl3*M{;_ zv=88Cn}(hLzH`tyTx({{K;9+iter)hjxI_n>#gXI+`UA4;IEeUIsf-m@wNc^?(eVc zckA1#tX+Jcy?@vPs3E`Fz3g#Qqz_=}{e#Z$eM$4@CHHyCdm}z!t)bUmsC~h-rdZMG zO!+YA!!#?jRQ2%`N;gff?Wig zn>^RHcB50vRJ0EOe;bFIp^qiC_6jyIIN ztQ|+cB7Fc4m%s-Ae=+Xx={pKE0L0wv3vTiss`GC~_UrO*F#rX(i{0h}K>o2oSd)0D zKsO-qO~g2~)AlK8+j@ad{y$pMGIm_M@8Q|=0o=5q7@t@fd;r7*?R#;rvsH5mib^Xt z4!bc9HU==k2Ka`U^z$$u{V6hnS{_3R9v{4)k%>wpyO z13(`3)*L$KtL2@_5C?$$zuzUjg^mHo@-`wqd7O4L*p4@v!-Jd2fA7D%yK7iNQ`m$Sm0K_}aFF5uGJ#*Ym0}lO; zv~=pA_s9AEeDc4&>bRRAbzcY_ZA8|SYt?Q@>%Ew=67qH%`(me^XL0huQ5cLz`I z{YPD25O}r{GF0_4cd`$FIOo@B{{JfN-CK0J_0eH>Z$OLv8)yG4@yopbTyk_=)n%!Q zaX-RWa2(Kl02A>R#AD|FtL_6}9dO$GH^|R-wdUNlGcm@9 z&w+Tu0RMOU|3yK05B?Xv-eWi`o^Pt?10b%BIlZj+z27B$&R6aobT$|4;}6p_AH0P< z0E?$#1>|NJ5d66=AX-c1^fD$?!J;f4TEiS$qJyrOj0_+BVK6ainKJWpYt~slgnq%OS`-fz=^x57Xt@$yQ?eFOW$vu65yG{O!)qjku z;aj&9j)7mv&-c;q4!C1{yP2OqN_!mJ_V?)k8wY5uU!%|<@-xhnKU;A$mL_80nums5 zd*Ag@%4cb9QzRUm?8$T7qwvdoAX^ipARR#epYiqE9xKtH`b04-{L0TZjX3YWso&i{ zteyLqR#4v{yQAy;#+84b*Za#WSno=<4aCy2PDYV?WEL*WF+TX%^CQkFD+irdX?y}7 zANtXFF%}M%Cy{yoJHq#D!+9*6C*o1Y;gSF4zp%C+x&O=$2enr~pF6Jia^c2!FcA)B z`(-)Fx$r(&@VMbW5&m29Eo~ZcKiIX4)^vBj|0h}_=p^|**&~ELzRlfF#dFB)LS^!#US9NM~D9vOD}+dEypaJ4h6se;Va`JDDXe1l^4>Gv?#0K8<# z|J|Gye!snv%6r&*%I`X(O*H-t#?!w-dc%vSXFvM8pB#36SKuDFg$sC-53(lbVORFm z+xni``kW^BS?j80VKSWNnq>d&CjYJFA6ds=&3w6!-KKbY_33~5boa`8P!%j#J?Q+w znVNHCKE14E-k;wgX=FX@UCBOsgx+g9ps^0XhtJ&jH5#uj^L)9WOcwcn-LoUkH1+e% z)^E&5DP=5iykD5y`>&~7wmx_h9{~R9Jr?#lztq~ZmclX6CtnA)5%Y~x^0~bq&Wm&W zGMnYO=(UsJVWV3(?=o*5Ul#jpc4``uYD2$0{bF(*_X%5Qsa{cU*6~L+snHCleK?0@e1g; zW0xn_apnWaMfQ=&U9y(ABLvjG~|0Qj|M$OrKF^TJ%k(pP^n<%mJ}S zw580OU9={7zZ{z$+rE{|c>RPlK7bG3YWwuH!gGuJE0Mvx<-A$``uzuZ))RpfO!^1q=q{-p{N+ zp-E)1UGJ#8)(@!r0Rprv#2z&cyZwM~+Wj00Hz+=#noDltv%z*PmlS$exasAq)J zDFT}x)FvI^`T(@fX4!oJtT*x_t%ttng|&4CDj!{VjNhbUF1Z6bu|0?&J1^6tB z#+iLjI4`3Q0C{JA66>OW_|^f%D)u?Al%6sk3B|!S;pL5a%W0nZtNingwxP7mo#)f~ z0Pc7q{dxdl^6u^PMV!KJ>Zf3<7>|VFpmcFQNpyv1YkP>d!3Ij}19+~-ac0)%9kr5A zYz@`~WIwpV4J5vQVCRnfzNb3U_QTV`nt{ZUUms-g` z>jSdxp=ZxydszFPNbb=KjP>nSMp;f;Ce?@7K=TC@tOL^e0KR-rwDkZ)Ti1>^dp@zu zd-ec*{!+~AO)Be+-c!A7&A@`?Kdld7`Gz4kcG|);t$+B;O=K=vR@dz7IuP+H>-nWe`mp+rUQ!Msa8IKpuDqB zIdhk>8|XVQZ^>v?2o6>V&!wE#*G!(1+*3WL3Ctf@kR82?WcjiOYJq^Qi};Z0_=H{_qNNsU;g3!!_&x6)!$Y9j~DoHV&{gBZsCEsRhQo^$}jmp z*>r&Ez%Ju~le3VWPRT>GKeNl|-z{yN)pMdfcSfhkZI<3|N< z0VewiWZ%;TqW>8kzysz3pXdYc2AouG-A+&L%5;?c&odohwm`*rU|yMIsOn`A?dJ-5 zE5-xe(8gIE$J;i<^d4Vzc`IZ2h1bIc%$G2pGaQtW2jI;k%P2dYQYPVde}U~QVDeu! z`QISEJg`&btjzTgo~H|L6O@eytUTRG6V|htQD&Lxw6Y1`I|>$>4lo_qW*%TYyGriQ z(+N63xc{hNYnyq%+Wqcp_wnqIuYX9@<))L$FM3QB zEHfQoIxuG*xLNsIUq3}mU!HnLv^hy&{Q(mxu9^T`Rx5H=>bf`WC@m zrUOg|HsFEPx_)RQ{;})Tm3@zPqVEm@#t5DkSbJ_bfCt!zYQA76k5BAaeOYftL(zH< z!BWAn!1O@(;^1=8e`YgYv3s4X3q<>a1S?Djbe#@l&W_poC5_`LTIY%vjuEUeJ<#!b z02&`B*uH2Uv+tGLju21mBw#;6n@iAn{Q+Y3PZZc(J!|uu?m-|P*+qbl5S}sLK(%oI z4WZ=}Yk$k#{+5kC@Qi@@#nvyVo({lmI5!*L+WOqv`l$Lu{J5t8pA&u1 zeu3$NY;XWB!6~@iGb%moIkN@Y!2{w^`~^5zx->BQTjanXjD8H`5K`>1l$wf`x+hf^N1A@Y@qx zu|P0eFtr)(?4H^4ox}s;cj5|Y=S~nT7OWF&6LhM5uvK+iB|zSZvt|rshfboY)x~sF zQXY^j>?oKape_8o06#ZlTvgNwl=(ryGQnpAM+>lhOy13=?_1??Zx&#~-yk?!@NvN*0%YCR(=b^#SGHFkl!k3>XFs1BL;^fMLKeU>GnA7zPXjh5^HX PVZbn87%&V}9s~a$0XzE+ literal 0 HcmV?d00001 diff --git a/logo.png b/logo.png deleted file mode 100644 index cf55a4be0763d5848cd22ca96fb312b2f64e5731..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13005 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%0Diu4UcOu?1#y0Zy<;atSo9o=_a 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 ZfYNbQ78@NXMD+^-s?T34R?3?P{|^mu)`$QA diff --git a/setup.py b/setup.py index b32a024..60b6def 100644 --- a/setup.py +++ b/setup.py @@ -13,7 +13,7 @@ )), data_files = ['msvcp90.dll', 'BitcoinMiner.cl', - 'logo.png', + 'logo.ico', 'LICENSE.txt', 'servers.ini', 'defaults.ini']) From 3504bf08e47f26112b335c22d30de8f5bc631b96 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 27 Mar 2011 19:05:53 -0300 Subject: [PATCH 049/190] Increase balance printout to three decimal places. --- guiminer.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/guiminer.py b/guiminer.py index 851ead0..b2eaeb6 100644 --- a/guiminer.py +++ b/guiminer.py @@ -96,10 +96,7 @@ def format_khash(rate): def format_balance(amount): """Format a quantity of Bitcoins in BTC.""" - amount = float(amount) - if amount > 0.001: - return "%.2f BTC" % amount - return "0" + return "%.3f BTC" % float(amount) def init_logger(): """Set up and return the logging object and custom formatter.""" From 6cc6c0ce0af132d0fe3b9420cd6e314f31ae9dcf Mon Sep 17 00:00:00 2001 From: Kiv Date: Tue, 29 Mar 2011 20:33:58 -0300 Subject: [PATCH 050/190] Force use of 16x16 icon for taskbar. Edit logo to remove translucent pixels. --- guiminer.py | 11 ++++++++++- logo.ico | Bin 370070 -> 99678 bytes setup.py | 6 +++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/guiminer.py b/guiminer.py index b2eaeb6..01dbbc5 100644 --- a/guiminer.py +++ b/guiminer.py @@ -66,6 +66,15 @@ def get_module_path(): module_name = sys.executable if hasattr(sys, 'frozen') else __file__ return os.path.dirname(module_name) +def get_taskbar_icon(): + """Return the taskbar icon. + + This works around Window's annoying behavior of ignoring the 16x16 image + and using nearest neighbour downsampling on the 32x32 image instead.""" + ib = wx.IconBundleFromFile("logo.ico", wx.BITMAP_TYPE_ICO) + return ib.GetIcon((16,16)) + return icon + def get_icon_bundle(): """Return the Bitcoin program icon bundle.""" return wx.IconBundleFromFile("logo.ico", wx.BITMAP_TYPE_ICO) @@ -244,7 +253,7 @@ class GUIMinerTaskBarIcon(wx.TaskBarIcon): def __init__(self, frame): wx.TaskBarIcon.__init__(self) self.frame = frame - self.icon = get_icon_bundle().GetIcon((16,16)) # TODO: linux size? + self.icon = get_taskbar_icon() self.timer = wx.Timer(self) self.timer.Start(REFRESH_RATE_MILLIS) self.is_paused = False diff --git a/logo.ico b/logo.ico index a3bf8e3b646bd5960ab4a799e32afaa7b24d64b6..8da15668848fb3ed92ccb5412388cfa0693b5337 100644 GIT binary patch delta 606 zcmZutze~eV5WYu$q!`htNmG?-hKdm_1Xq{DQKX}jgNxu4oGXp@h&fsDt&N#@4oN5yZ5gBT<)D04*?hyfOA3%>=J`L0C3$j-v&5E z&T(XZzXEW#gH9{WHGsx30}YYtkMaQToPmu!I0ll$3uerp`K?F4#quT9MV=>GA_%{A zAR49;J#5{0qG@QNXy{SLDAuCglO~&{UKWOnk@gZD!;Y2;`=a#bH v;g3}!(;uPqXCbtqbW^l3OD<4%hs&Y&s)SxQ7kZq@00_Ntk?G{68mj#P=QZPC delta 18569 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 diff --git a/setup.py b/setup.py index 60b6def..93f6f90 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,11 @@ from distutils.core import setup import py2exe -setup(windows=['guiminer.py'], +setup(windows=[ + {'script': 'guiminer.py', + 'icon_resources': [(0, "logo.ico")] + } + ], console=['poclbm.py'], # OpenCL.dll is vendor specific options=dict(py2exe=dict( From 4938f5d4117bfee4e1b752a954bf1589b1fcce62 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sat, 2 Apr 2011 09:54:37 -0300 Subject: [PATCH 051/190] Add balance requesting for deepbit.net. --- guiminer.py | 27 +++++++++++++++++++-------- servers.ini | 5 ++++- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/guiminer.py b/guiminer.py index 01dbbc5..18b6fcf 100644 --- a/guiminer.py +++ b/guiminer.py @@ -338,7 +338,7 @@ def run(self): event = UpdateStatusEvent(text=line) logger.info('Listener for "%s": %s', self.parent.name, line) wx.PostEvent(self.parent, event) - logger.debug('Listener for "%s" shutting down' % self.parent.name) + logger.debug('Listener for "%s" shutting down', self.parent.name) class ProfilePanel(wx.Panel): @@ -831,7 +831,10 @@ def on_balance_refresh(self, event=None, withdraw=False): """Refresh the miner's balance from the server.""" host = self.server_config.get("host") - if host in ["mining.bitcoin.cz", "btcmine.com"]: + HOSTS_REQUIRING_AUTH_TOKEN = ["mining.bitcoin.cz", + "btcmine.com", + "deepbit.net"] + if host in HOSTS_REQUIRING_AUTH_TOKEN: if not self.balance_auth_token: self.prompt_auth_token() if not self.balance_auth_token: # They cancelled the dialog @@ -846,7 +849,7 @@ def on_balance_refresh(self, event=None, withdraw=False): target=self.request_balance_post, args=(withdraw,)) self.http_thread.start() - self.balance_refresh.Disable() # TODO: handle timeout + self.balance_refresh.Disable() self.balance_cooldown_seconds = 10 self.balance_refresh_timer.Start(1000) @@ -886,9 +889,9 @@ def request_balance_get(self, balance_auth_token): info = json.loads(data) confirmed = info.get('confirmed_reward') or info.get('confirmed', 0) unconfirmed = info.get('unconfirmed_reward') or info.get('unconformed', 0) - data = "%s confirmed, %s unconfirmed" % ( - format_balance(confirmed), - format_balance(unconfirmed)) + data = "%s confirmed" % format_balance(confirmed) + if unconfirmed > 0: + data += ", %s unconfirmed" % format_balance(unconfirmed) except: # TODO: what exception here? data = "Bad response from server." @@ -1090,7 +1093,15 @@ def layout_btcmine(self): def layout_deepbit(self): """Deepbit uses an email address for a username.""" - self.layout_default() + self.set_widgets_visible([self.host_lbl, self.txt_host, + self.port_lbl, self.txt_port, + self.withdraw], False) + self.layout_init() + self.layout_server_and_website(row=0) + self.layout_user_and_pass(row=1) + self.layout_device_and_flags(row=2) + self.layout_balance(row=3) + self.layout_finish() add_tooltip(self.txt_username, "The e-mail address you registered with.") self.user_lbl.SetLabel("Email:") @@ -1198,7 +1209,7 @@ def __init__(self, *args, **kwds): def __set_properties(self): self.SetIcons(get_icon_bundle()) - self.SetTitle(_("poclbm-gui")) + self.SetTitle(_("poclbm-gui - v" + __version__)) self.statusbar.SetStatusWidths([-1, 125]) statusbar_fields = [_(""), _("Not started")] for i in range(len(statusbar_fields)): diff --git a/servers.ini b/servers.ini index 9a9ed15..7cab797 100644 --- a/servers.ini +++ b/servers.ini @@ -14,7 +14,10 @@ "name": "deepbit", "host": "deepbit.net", "url": "http://deepbit.net", - "port": 8332 + "port": 8332, + "balance_token_url": "http://deepbit.net/settings/", + "balance_host": "deepbit.net", + "balance_url": "/api/%s" }, { From 16883637f9e764425c5756bf0a726653e1f225f0 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sat, 2 Apr 2011 17:54:06 -0300 Subject: [PATCH 052/190] Support puddinpop's RPC miners. --- guiminer.py | 306 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 206 insertions(+), 100 deletions(-) diff --git a/guiminer.py b/guiminer.py index 18b6fcf..e713c09 100644 --- a/guiminer.py +++ b/guiminer.py @@ -13,15 +13,16 @@ from wx.lib.agw import hyperlink from wx.lib.newevent import NewEvent -__version__ = '2011-03-27' +__version__ = '2011-04-02' ABOUT_TEXT = \ -"""Python OpenCL Bitcoin Miner GUI +"""GUIMiner Version: %s GUI by Chris 'Kiv' MacLeod Original poclbm miner by m0mchil +Original rpcminers by puddinpop Get the source code or file issues at GitHub: https://github.com/Kiv/poclbm @@ -30,7 +31,18 @@ by donating to: %s + +Even a single Bitcoin is appreciated and helps motivate +further work on this software. """ +# Alternate backends that we know how to call +SUPPORTED_BACKENDS = [ + "rpcminer-4way.exe", + "rpcminer-cpu.exe", + "rpcminer-cuda.exe", + "rpcminer-opencl.exe", +] + # Time constants SAMPLE_TIME_SECS = 3600 REFRESH_RATE_MILLIS = 2000 @@ -52,7 +64,11 @@ def merge_whitespace(s): return s.strip() def get_opencl_devices(): - """Return a list of available OpenCL devices.""" + """Return a list of available OpenCL devices. + + Raises ImportError if OpenCL is not found. + Raises IOError if no OpenCL devices are found. + """ import pyopencl platform = pyopencl.get_platforms()[0] devices = platform.get_devices() @@ -73,7 +89,6 @@ def get_taskbar_icon(): and using nearest neighbour downsampling on the 32x32 image instead.""" ib = wx.IconBundleFromFile("logo.ico", wx.BITMAP_TYPE_ICO) return ib.GetIcon((16,16)) - return icon def get_icon_bundle(): """Return the Bitcoin program icon bundle.""" @@ -99,7 +114,7 @@ def format_khash(rate): if rate > 10**3: return "%.1f Mhash/s" % (rate / 1000.) elif rate == 0: - return "Connected" + return "Connecting..." else: return "%d khash/s" % rate @@ -303,53 +318,55 @@ def on_pause(self, event): class MinerListenerThread(threading.Thread): + LINES = [ + (r"accepted|\"result\": true", + lambda _: UpdateAcceptedEvent(accepted=True)), + (r"invalid|stale", lambda _: + UpdateAcceptedEvent(accepted=False)), + (r"(\d+) khash/s", lambda match: + UpdateHashRateEvent(rate=int(match.group(1)))), + (r"checking (\d+)", lambda _: + UpdateSoloCheckEvent()), + (r"Target =", + lambda _: None) # Just ignore this + ] + def __init__(self, parent, miner): threading.Thread.__init__(self) self.shutdown_event = threading.Event() self.parent = parent self.miner = miner - + def run(self): logger.debug('Listener for "%s" started' % self.parent.name) while not self.shutdown_event.is_set(): line = self.miner.stdout.readline().strip() + logger.debug("Line: %s", line) if not line: continue - match = re.search(r"accepted", line, flags=re.I) - if match is not None: - event = UpdateAcceptedEvent(accepted=True) - wx.PostEvent(self.parent, event) - continue - match = re.search(r"invalid|stale", line, flags=re.I) - if match is not None: - event = UpdateAcceptedEvent(accepted=False) - wx.PostEvent(self.parent, event) - continue - match = re.search(r"(\d+) khash/s", line, flags=re.I) - if match is not None: - event = UpdateHashRateEvent(rate=int(match.group(1))) - wx.PostEvent(self.parent, event) - continue - match = re.search(r"checking (\d+)", line, flags=re.I) - if match is not None: - event = UpdateSoloCheckEvent() + for s, event_func in MinerListenerThread.LINES: + match = re.search(s, line, flags=re.I) + if match is not None: + event = event_func(match) + if event is not None: + wx.PostEvent(self.parent, event) + break + else: + # Possible error or new message, just pipe it through + event = UpdateStatusEvent(text=line) + logger.info('Listener for "%s": %s', self.parent.name, line) wx.PostEvent(self.parent, event) - continue - # Possible error or new message, just pipe it through - event = UpdateStatusEvent(text=line) - logger.info('Listener for "%s": %s', self.parent.name, line) - wx.PostEvent(self.parent, event) logger.debug('Listener for "%s" shutting down', self.parent.name) -class ProfilePanel(wx.Panel): +class MinerTab(wx.Panel): """A tab in the GUI representing a miner instance. - Each ProfilePanel has these responsibilities: + Each MinerTab has these responsibilities: - Persist its data to and from the config file - - Launch a poclbm subprocess and monitor its progress + - Launch a backend subprocess and monitor its progress by creating a MinerListenerThread. - - Post updates to the GUI's statusbar; the format depends - whether the poclbm instance is working solo or in a pool. + - Post updates to the GUI's statusbar & summary panel; the format depends + whether the backend is working solo or in a pool. """ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): wx.Panel.__init__(self, parent, id) @@ -361,7 +378,7 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): self.is_paused = False self.is_possible_error = False self.miner = None # subprocess.Popen instance when mining - self.miner_listener = None # MinerListenerThread when mining + self.miner_listener = None # MinerListenerThread when mining self.solo_blocks_found = 0 self.accepted_shares = 0 # shares for pool, diff1 hashes for solo self.accepted_times = collections.deque() @@ -375,6 +392,8 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): style=wx.CB_READONLY) self.website_lbl = wx.StaticText(self, -1, _("Website:")) self.website = hyperlink.HyperLinkCtrl(self, -1, "") + self.external_lbl = wx.StaticText(self, -1, _("Ext. Path:")) + self.txt_external = wx.TextCtrl(self, -1, "") self.host_lbl = wx.StaticText(self, -1, _("Host:")) self.txt_host = wx.TextCtrl(self, -1, "") self.port_lbl = wx.StaticText(self, -1, _("Port:")) @@ -409,7 +428,9 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): self.balance_amt, self.balance_refresh, self.withdraw] + self.labels + self.txts - # self.extra_info not included because it's invisible by default + self.hidden_widgets = [self.extra_info, + self.txt_external, + self.external_lbl] self.start = wx.Button(self, -1, _("Start mining!")) @@ -456,6 +477,16 @@ def is_modified(self): """Return True if this miner has unsaved changes pending.""" return self.last_data != self.get_data() + @property + def external_path(self): + """Return the path to an external miner, or "" if none is present.""" + return self.txt_external.GetValue() + + @property + def is_external_miner(self): + """Return True if this miner has an external path configured.""" + return self.txt_external.GetValue() != "" + def pause(self): """Pause the miner if we are mining, otherwise do nothing.""" if self.is_mining: @@ -478,7 +509,8 @@ def get_data(self): device=self.device_listbox.GetSelection(), flags=self.txt_flags.GetValue(), autostart=self.autostart, - balance_auth_token=self.balance_auth_token) + balance_auth_token=self.balance_auth_token, + external_path=self.external_path) def set_data(self, data): """Set our profile data to the information in data. See get_data().""" @@ -509,7 +541,8 @@ def set_data(self, data): self.server_config.get('port', 8332))) self.txt_flags.SetValue(data.get('flags', '')) - self.autostart = data.get('autostart', False) + self.autostart = data.get('autostart', False) + self.txt_external.SetValue(data.get('external_path', '')) # Handle case where they removed devices since last run. device_index = data.get('device', None) @@ -599,10 +632,8 @@ def toggle_mining(self, event): else: self.start_mining() self.update_summary() - - def start_mining(self): - """Launch a poclbm subprocess and attach a MinerListenerThread.""" - self.is_paused = False + + def configure_subprocess_poclbm(self): folder = get_module_path() if USE_MOCK: executable = "python mockBitcoinMiner.py" @@ -620,14 +651,45 @@ def start_mining(self): self.device_listbox.GetSelection(), self.txt_flags.GetValue() ) + return cmd, folder + + def configure_subprocess_rpcminer(self): + # TODO: is this true that we always expect HTTP for rpcminer? + # If so we should strip it automatically for the other one too + host = self.txt_host.GetValue() + if not host.startswith("http://"): host = "http://" + host + + cmd = "%s -user=%s -password=%s -url=%s:%s %s" % ( + self.external_path, + self.txt_username.GetValue(), + self.txt_pass.GetValue(), + host, + self.txt_port.GetValue(), + self.txt_flags.GetValue() + ) + return cmd, os.path.dirname(self.external_path) + + def start_mining(self): + """Launch a miner subprocess and attach a MinerListenerThread.""" + self.is_paused = False + # Avoid showing a console window when frozen try: import win32process except ImportError: flags = 0 else: flags = win32process.CREATE_NO_WINDOW + + # Determine what command line arguments to use + if not self.is_external_miner: + conf_func = self.configure_subprocess_poclbm + elif "rpcminer" in self.external_path: + conf_func = self.configure_subprocess_rpcminer + else: + raise # TODO: handle unrecognized miner + cmd, cwd = conf_func() try: logger.debug('Running command: ' + cmd) - self.miner = subprocess.Popen(cmd, cwd=folder, + self.miner = subprocess.Popen(cmd, cwd=cwd, stdout=subprocess.PIPE, creationflags=flags) except OSError: @@ -637,8 +699,7 @@ def start_mining(self): self.miner_listener.start() self.is_mining = True self.set_status("Starting...", 1) - self.start.SetLabel("%s mining!" % self.get_start_stop_state()) - + self.start.SetLabel("%s mining!" % self.get_start_stop_state()) def on_close(self): """Prepare to close gracefully.""" @@ -961,11 +1022,20 @@ def on_saved(self): self.update_tab_name() def layout_init(self): - """Create the sizers for this frame.""" + """Create the sizers for this frame and set up the external text. + + Return the lowest row that is available. + """ self.frame_sizer = wx.BoxSizer(wx.VERTICAL) self.frame_sizer.Add((20, 10), 0, wx.EXPAND, 0) self.inner_sizer = wx.GridBagSizer(10, 5) self.button_sizer = wx.BoxSizer(wx.HORIZONTAL) + row = 0 + if self.is_external_miner: + self.inner_sizer.Add(self.external_lbl, (row,0), flag=LBL_STYLE) + self.inner_sizer.Add(self.txt_external, (row,1), span=(1,3), flag=wx.EXPAND) + row += 1 + return row def layout_server_and_website(self, row): """Lay out the server and website widgets in the specified row.""" @@ -989,11 +1059,19 @@ def layout_user_and_pass(self, row): self.inner_sizer.Add(self.txt_pass, (row,3), flag=wx.EXPAND) def layout_device_and_flags(self, row): - """Lay out the device and flags widgets in the specified row.""" - self.inner_sizer.Add(self.device_lbl, (row,0), flag=LBL_STYLE) - self.inner_sizer.Add(self.device_listbox, (row,1), flag=wx.EXPAND) - self.inner_sizer.Add(self.flags_lbl, (row,2), flag=LBL_STYLE) - self.inner_sizer.Add(self.txt_flags, (row,3), flag=wx.EXPAND) + """Lay out the device and flags widgets in the specified row. + + Hide the device widgets if there's an external miner present. + """ + no_external = not self.is_external_miner + self.set_widgets_visible([self.device_lbl, self.device_listbox], no_external) + if no_external: + self.inner_sizer.Add(self.device_lbl, (row,0), flag=LBL_STYLE) + self.inner_sizer.Add(self.device_listbox, (row,1), flag=wx.EXPAND) + col = 2 * (no_external) + self.inner_sizer.Add(self.flags_lbl, (row,col), flag=LBL_STYLE) + span = (1,1) if no_external else (1,4) + self.inner_sizer.Add(self.txt_flags, (row,col+1), span=span, flag=wx.EXPAND) def layout_balance(self, row): """Lay out the balance widgets in the specified row.""" @@ -1008,28 +1086,31 @@ def layout_finish(self): self.inner_sizer.AddGrowableCol(3) for btn in [self.start, self.balance_refresh, self.withdraw]: self.button_sizer.Add(btn, 0, BTN_STYLE, 5) + + self.set_widgets_visible([self.external_lbl, self.txt_external], + self.is_external_miner) self.SetSizerAndFit(self.frame_sizer) def layout_default(self): """Lay out a default miner with no custom changes.""" self.user_lbl.SetLabel("Username:") - self.set_widgets_visible([self.extra_info, - self.balance_lbl, + self.set_widgets_visible(self.hidden_widgets, False) + self.set_widgets_visible([self.balance_lbl, self.balance_amt, self.balance_refresh, self.withdraw], False) - self.layout_init() - self.layout_server_and_website(row=0) + row = self.layout_init() + self.layout_server_and_website(row=row) is_custom = self.server.GetStringSelection().lower() in ["other", "solo"] if is_custom: - self.layout_host_and_port(row=1) + self.layout_host_and_port(row=row+1) else: self.set_widgets_visible([self.host_lbl, self.txt_host, self.port_lbl, self.txt_port], False) - self.layout_user_and_pass(row=1 + int(is_custom)) - self.layout_device_and_flags(row=2 + int(is_custom)) + self.layout_user_and_pass(row=row + 1 + int(is_custom)) + self.layout_device_and_flags(row=row + 2 + int(is_custom)) self.layout_finish() ############################ @@ -1043,13 +1124,13 @@ def layout_bitpenny(self): self.pass_lbl, self.host_lbl, self.port_lbl] self.set_widgets_visible(invisible, False) - self.layout_init() - self.layout_server_and_website(row=0) - self.inner_sizer.Add(self.user_lbl, (1,0), flag=LBL_STYLE) - self.inner_sizer.Add(self.txt_username, (1,1), span=(1,3), flag=wx.EXPAND) - self.layout_device_and_flags(row=2) - self.layout_balance(row=3) - self.inner_sizer.Add(self.extra_info,(4,0), span=(1,4), flag=wx.ALIGN_CENTER_HORIZONTAL) + row = self.layout_init() + self.layout_server_and_website(row=row) + self.inner_sizer.Add(self.user_lbl, (row+1,0), flag=LBL_STYLE) + self.inner_sizer.Add(self.txt_username, (row+1,1), span=(1,3), flag=wx.EXPAND) + self.layout_device_and_flags(row=row+2) + self.layout_balance(row=row+3) + self.inner_sizer.Add(self.extra_info,(row+4,0), span=(1,4), flag=wx.ALIGN_CENTER_HORIZONTAL) self.layout_finish() self.extra_info.SetLabel("No registration is required - just enter an address and press Start.") @@ -1063,11 +1144,11 @@ def layout_slush(self): self.set_widgets_visible([self.host_lbl, self.txt_host, self.port_lbl, self.txt_port, self.withdraw], False) - self.layout_init() - self.layout_server_and_website(row=0) - self.layout_user_and_pass(row=1) - self.layout_device_and_flags(row=2) - self.layout_balance(row=3) + row = self.layout_init() + self.layout_server_and_website(row=row) + self.layout_user_and_pass(row=row+1) + self.layout_device_and_flags(row=row+2) + self.layout_balance(row=row+3) self.layout_finish() add_tooltip(self.txt_username, @@ -1079,11 +1160,11 @@ def layout_btcmine(self): self.set_widgets_visible([self.host_lbl, self.txt_host, self.port_lbl, self.txt_port, self.withdraw], False) - self.layout_init() - self.layout_server_and_website(row=0) - self.layout_user_and_pass(row=1) - self.layout_device_and_flags(row=2) - self.layout_balance(row=3) + row = self.layout_init() + self.layout_server_and_website(row=row) + self.layout_user_and_pass(row=row+1) + self.layout_device_and_flags(row=row+2) + self.layout_balance(row=row+3) self.layout_finish() add_tooltip(self.txt_username, @@ -1096,22 +1177,21 @@ def layout_deepbit(self): self.set_widgets_visible([self.host_lbl, self.txt_host, self.port_lbl, self.txt_port, self.withdraw], False) - self.layout_init() - self.layout_server_and_website(row=0) - self.layout_user_and_pass(row=1) - self.layout_device_and_flags(row=2) - self.layout_balance(row=3) + row = self.layout_init() + self.layout_server_and_website(row=row) + self.layout_user_and_pass(row=row+1) + self.layout_device_and_flags(row=row+2) + self.layout_balance(row=row+3) self.layout_finish() add_tooltip(self.txt_username, "The e-mail address you registered with.") self.user_lbl.SetLabel("Email:") # End server specific code - ########################## - + ########################## -class PoclbmFrame(wx.Frame): +class GUIMiner(wx.Frame): def __init__(self, *args, **kwds): wx.Frame.__init__(self, *args, **kwds) style = fnb.FNB_X_ON_TAB | fnb.FNB_FF2 | fnb.FNB_HIDE_ON_SINGLE_TAB @@ -1137,10 +1217,12 @@ def __init__(self, *args, **kwds): defaults_config_path = os.path.join(get_module_path(), 'defaults.ini') with open(defaults_config_path) as f: self.defaults = json.load(f) - + + ID_NEW_EXTERNAL = wx.NewId() self.menubar = wx.MenuBar() file_menu = wx.Menu() - file_menu.Append(wx.ID_NEW, _("&New miner..."), _("Create a new miner profile"), wx.ITEM_NORMAL) + file_menu.Append(wx.ID_NEW, _("&New OpenCL miner..."), _("Create a new miner profile"), wx.ITEM_NORMAL) + file_menu.Append(ID_NEW_EXTERNAL, _("New &other miner..."), _("Create a CPU or CUDA miner (requires external program)"), wx.ITEM_NORMAL) file_menu.Append(wx.ID_SAVE, _("&Save settings"), _("Save your settings"), wx.ITEM_NORMAL) file_menu.Append(wx.ID_OPEN, _("&Load settings"), _("Load stored settings"), wx.ITEM_NORMAL) file_menu.Append(wx.ID_EXIT, "", "", wx.ITEM_NORMAL) @@ -1176,19 +1258,23 @@ def __init__(self, *args, **kwds): except: self.tbicon = None # TODO: what happens on Linux? - self.__set_properties() + self.set_properties() try: self.devices = get_opencl_devices() except: - self.message("""Couldn't find any OpenCL devices. -Check that your video card supports OpenCL and that you have a working version of OpenCL installed. -If you have an AMD/ATI card you may need to install the ATI Stream SDK.""", + self.message("""No OpenCL devices were found. +If you only want to mine using CPU or CUDA, you can ignore this message. +If you want to mine on ATI graphics cards, you may need to install the ATI Stream +SDK, or your GPU may not support OpenCL. +""", "No OpenCL devices found.", - wx.OK | wx.ICON_ERROR) - sys.exit(1) + wx.OK | wx.ICON_INFORMATION) + file_menu.Enable(wx.ID_NEW, False) + file_menu.SetHelpString(wx.ID_NEW, "OpenCL not found - can't add a OpenCL miner") self.Bind(wx.EVT_MENU, self.name_new_profile, id=wx.ID_NEW) + self.Bind(wx.EVT_MENU, self.new_external_profile, id=ID_NEW_EXTERNAL) self.Bind(wx.EVT_MENU, self.save_config, id=wx.ID_SAVE) self.Bind(wx.EVT_MENU, self.load_config, id=wx.ID_OPEN) self.Bind(wx.EVT_MENU, self.on_menu_exit, id=wx.ID_EXIT) @@ -1205,9 +1291,9 @@ def __init__(self, *args, **kwds): self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CHANGED, self.on_page_changed) self.load_config() - self.__do_layout() + self.do_layout() - def __set_properties(self): + def set_properties(self): self.SetIcons(get_icon_bundle()) self.SetTitle(_("poclbm-gui - v" + __version__)) self.statusbar.SetStatusWidths([-1, 125]) @@ -1215,7 +1301,7 @@ def __set_properties(self): for i in range(len(statusbar_fields)): self.statusbar.SetStatusText(statusbar_fields[i], i) - def __do_layout(self): + def do_layout(self): self.vertical_sizer = wx.BoxSizer(wx.VERTICAL) self.vertical_sizer.Add(self.nb, 1, wx.EXPAND, 20) self.SetSizer(self.vertical_sizer) @@ -1225,14 +1311,14 @@ def __do_layout(self): @property def profile_panels(self): - """Return a list of currently available ProfilePanel.""" + """Return a list of currently available MinerTab.""" pages = [self.nb.GetPage(i) for i in range(self.nb.GetPageCount())] return [p for p in pages if p != self.console_panel and p != self.summary_panel] def add_profile(self, data={}): - """Add a new ProfilePanel to the list of tabs.""" - panel = ProfilePanel(self.nb, -1, self.devices, self.servers, + """Add a new MinerTab to the list of tabs.""" + panel = MinerTab(self.nb, -1, self.devices, self.servers, self.defaults, self.statusbar, data) self.nb.AddPage(panel, panel.name) # The newly created profile should have focus. @@ -1249,13 +1335,33 @@ def message(self, *args, **kwargs): dialog.Destroy() return retval - def name_new_profile(self, event): + def name_new_profile(self, event=None, extra_profile_data={}): """Prompt for the new miner's name.""" dialog = wx.TextEntryDialog(self, "Name this miner:", "New miner") if dialog.ShowModal() == wx.ID_OK: name = dialog.GetValue().strip() if not name: name = "Untitled" - self.add_profile(dict(name=name)) + data = extra_profile_data.copy() + data['name'] = name + self.add_profile(data) + + def new_external_profile(self, event): + """Prompt for an external miner path, then create a miner.""" + dialog = wx.FileDialog(self, + "Select external miner:", + defaultDir=os.path.join(get_module_path(), 'miners'), + defaultFile="", + wildcard='External miner (*.exe)|*.exe', + style=wx.OPEN) + if dialog.ShowModal() == wx.ID_OK: + path = os.path.join(dialog.GetDirectory(), dialog.GetFilename()) + # TODO: if filename isn't in backends, show error dialog + if not os.path.exists(path): + return # TODO: should this ever happen? + else: + return + dialog.Destroy() + self.name_new_profile(extra_profile_data=dict(external_path=path)) def get_storage_location(self): """Get the folder and filename to store our JSON config.""" @@ -1587,7 +1693,7 @@ def on_copy(self, event): try: app = wx.PySimpleApp(0) wx.InitAllImageHandlers() - frame_1 = PoclbmFrame(None, -1, "") + frame_1 = GUIMiner(None, -1, "") app.SetTopWindow(frame_1) frame_1.Show() app.MainLoop() From b8343fae0836bc554aa4a66991385aec67c25a27 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sat, 2 Apr 2011 17:55:28 -0300 Subject: [PATCH 053/190] Update header text. --- guiminer.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index e713c09..c5ab671 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1,4 +1,8 @@ -"""poclbm-gui - GUI miner for poclbm +"""GUIMiner - graphical frontend to Bitcoin miners. + +Currently supports: +- m0mchil's "poclbm" +- puddinpop's "rpcminer". Copyright 2011 Chris MacLeod This program is released under the GNU GPL. See LICENSE.txt for details. From 366ed855ddefb7ace5baba630d89ff9ab1c72396 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sat, 2 Apr 2011 17:56:16 -0300 Subject: [PATCH 054/190] Refactor get_taskbar_icon --- guiminer.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/guiminer.py b/guiminer.py index c5ab671..097852f 100644 --- a/guiminer.py +++ b/guiminer.py @@ -86,17 +86,17 @@ def get_module_path(): module_name = sys.executable if hasattr(sys, 'frozen') else __file__ return os.path.dirname(module_name) +def get_icon_bundle(): + """Return the Bitcoin program icon bundle.""" + return wx.IconBundleFromFile("logo.ico", wx.BITMAP_TYPE_ICO) + def get_taskbar_icon(): """Return the taskbar icon. This works around Window's annoying behavior of ignoring the 16x16 image and using nearest neighbour downsampling on the 32x32 image instead.""" - ib = wx.IconBundleFromFile("logo.ico", wx.BITMAP_TYPE_ICO) + ib = get_icon_bundle() return ib.GetIcon((16,16)) - -def get_icon_bundle(): - """Return the Bitcoin program icon bundle.""" - return wx.IconBundleFromFile("logo.ico", wx.BITMAP_TYPE_ICO) def mkdir_p(path): """If the directory 'path' doesn't exist, create it. Same as mkdir -p.""" From 956f962cdbcd114283ec78b73253b8d9df015d76 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sat, 2 Apr 2011 18:05:03 -0300 Subject: [PATCH 055/190] Show in device dropdown menu if no devices are present. --- guiminer.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/guiminer.py b/guiminer.py index 097852f..689af0c 100644 --- a/guiminer.py +++ b/guiminer.py @@ -407,7 +407,7 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): self.pass_lbl = wx.StaticText(self, -1, _("Password:")) self.txt_pass = wx.TextCtrl(self, -1, "", style=wx.TE_PASSWORD) self.device_lbl = wx.StaticText(self, -1, _("Device:")) - self.device_listbox = wx.ComboBox(self, -1, choices=devices, style=wx.CB_READONLY) + self.device_listbox = wx.ComboBox(self, -1, choices=devices or ["No OpenCL devices"], style=wx.CB_READONLY) self.flags_lbl = wx.StaticText(self, -1, _("Extra flags:")) self.txt_flags = wx.TextCtrl(self, -1, "") self.extra_info = wx.StaticText(self, -1, "") @@ -1267,6 +1267,7 @@ def __init__(self, *args, **kwds): try: self.devices = get_opencl_devices() except: + self.devices = [] self.message("""No OpenCL devices were found. If you only want to mine using CPU or CUDA, you can ignore this message. If you want to mine on ATI graphics cards, you may need to install the ATI Stream @@ -1276,7 +1277,7 @@ def __init__(self, *args, **kwds): wx.OK | wx.ICON_INFORMATION) file_menu.Enable(wx.ID_NEW, False) file_menu.SetHelpString(wx.ID_NEW, "OpenCL not found - can't add a OpenCL miner") - + self.Bind(wx.EVT_MENU, self.name_new_profile, id=wx.ID_NEW) self.Bind(wx.EVT_MENU, self.new_external_profile, id=ID_NEW_EXTERNAL) self.Bind(wx.EVT_MENU, self.save_config, id=wx.ID_SAVE) From 7ce656befcda4dad70cfc7e8e498f76f1c147e5a Mon Sep 17 00:00:00 2001 From: Kiv Date: Sat, 2 Apr 2011 22:44:45 -0300 Subject: [PATCH 056/190] Add partial support for ufasoft miner. --- guiminer.py | 59 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 11 deletions(-) diff --git a/guiminer.py b/guiminer.py index 689af0c..e89e8ec 100644 --- a/guiminer.py +++ b/guiminer.py @@ -2,7 +2,8 @@ Currently supports: - m0mchil's "poclbm" -- puddinpop's "rpcminer". +- puddinpop's "rpcminer" +- ufasoft's "bitcoin-miner" (partial support) Copyright 2011 Chris MacLeod This program is released under the GNU GPL. See LICENSE.txt for details. @@ -26,7 +27,8 @@ GUI by Chris 'Kiv' MacLeod Original poclbm miner by m0mchil -Original rpcminers by puddinpop +Original rpcminer by puddinpop +Original bitcoin-miner by ufasoft Get the source code or file issues at GitHub: https://github.com/Kiv/poclbm @@ -45,6 +47,7 @@ "rpcminer-cpu.exe", "rpcminer-cuda.exe", "rpcminer-opencl.exe", + "bitcoin-miner.exe" ] # Time constants @@ -323,16 +326,18 @@ def on_pause(self, event): class MinerListenerThread(threading.Thread): LINES = [ + (r"Target =|average rate", + lambda _: None), # Just ignore this (r"accepted|\"result\": true", lambda _: UpdateAcceptedEvent(accepted=True)), (r"invalid|stale", lambda _: UpdateAcceptedEvent(accepted=False)), (r"(\d+) khash/s", lambda match: UpdateHashRateEvent(rate=int(match.group(1)))), + (r"(\d+) Mhash/s", lambda match: + UpdateHashRateEvent(rate=int(match.group(1)) * 1000)), (r"checking (\d+)", lambda _: UpdateSoloCheckEvent()), - (r"Target =", - lambda _: None) # Just ignore this ] def __init__(self, parent, miner): @@ -491,6 +496,14 @@ def is_external_miner(self): """Return True if this miner has an external path configured.""" return self.txt_external.GetValue() != "" + @property + def host_with_http_prefix(self): + """Return the host address, with http:// prepended if needed.""" + host = self.txt_host.GetValue() + if not host.startswith("http://"): + host = "http://" + host + return host + def pause(self): """Pause the miner if we are mining, otherwise do nothing.""" if self.is_mining: @@ -637,7 +650,10 @@ def toggle_mining(self, event): self.start_mining() self.update_summary() + ############################# + # Begin backend specific code def configure_subprocess_poclbm(self): + """Set up the command line for poclbm.""" folder = get_module_path() if USE_MOCK: executable = "python mockBitcoinMiner.py" @@ -658,21 +674,37 @@ def configure_subprocess_poclbm(self): return cmd, folder def configure_subprocess_rpcminer(self): - # TODO: is this true that we always expect HTTP for rpcminer? - # If so we should strip it automatically for the other one too - host = self.txt_host.GetValue() - if not host.startswith("http://"): host = "http://" + host + """Set up the command line for rpcminer. + The hostname must start with http:// for these miners. + """ cmd = "%s -user=%s -password=%s -url=%s:%s %s" % ( self.external_path, self.txt_username.GetValue(), self.txt_pass.GetValue(), - host, + self.host_with_http_prefix, self.txt_port.GetValue(), self.txt_flags.GetValue() ) return cmd, os.path.dirname(self.external_path) + def configure_subprocess_ufasoft(self): + """Set up the command line for ufasoft's SSE2 miner. + + The hostname must start with http:// for these miners. + """ + cmd = "%s -u %s -p %s -o %s:%s %s" % ( + self.external_path, + self.txt_username.GetValue(), + self.txt_pass.GetValue(), + self.host_with_http_prefix, + self.txt_port.GetValue(), + self.txt_flags.GetValue()) + return cmd, os.path.dirname(self.external_path) + + # End backend specific code + ########################### + def start_mining(self): """Launch a miner subprocess and attach a MinerListenerThread.""" self.is_paused = False @@ -687,10 +719,15 @@ def start_mining(self): conf_func = self.configure_subprocess_poclbm elif "rpcminer" in self.external_path: conf_func = self.configure_subprocess_rpcminer + elif "bitcoin-miner" in self.external_path: + conf_func = self.configure_subprocess_ufasoft else: - raise # TODO: handle unrecognized miner + raise ValueError # TODO: handle unrecognized miner cmd, cwd = conf_func() - + + # TODO: ufasoft prints to stderr for some reason and also won't + # seem to die - probably we have to get him to change things + # so his miner will play nice. try: logger.debug('Running command: ' + cmd) self.miner = subprocess.Popen(cmd, cwd=cwd, From 89d3e468c10d44478f26752bdab8f75e2e4e342f Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 3 Apr 2011 09:36:06 -0300 Subject: [PATCH 057/190] Disable partial ufasoft support for this release. --- guiminer.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/guiminer.py b/guiminer.py index e89e8ec..7bdd8cb 100644 --- a/guiminer.py +++ b/guiminer.py @@ -3,7 +3,6 @@ Currently supports: - m0mchil's "poclbm" - puddinpop's "rpcminer" -- ufasoft's "bitcoin-miner" (partial support) Copyright 2011 Chris MacLeod This program is released under the GNU GPL. See LICENSE.txt for details. @@ -28,7 +27,6 @@ GUI by Chris 'Kiv' MacLeod Original poclbm miner by m0mchil Original rpcminer by puddinpop -Original bitcoin-miner by ufasoft Get the source code or file issues at GitHub: https://github.com/Kiv/poclbm @@ -47,7 +45,7 @@ "rpcminer-cpu.exe", "rpcminer-cuda.exe", "rpcminer-opencl.exe", - "bitcoin-miner.exe" + #"bitcoin-miner.exe" # Doesn't work yet ] # Time constants From edb3375e4b3752bf82893a59edaae333f60ce512 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 3 Apr 2011 09:36:51 -0300 Subject: [PATCH 058/190] Code cleanup. --- guiminer.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/guiminer.py b/guiminer.py index 7bdd8cb..bd2dd6d 100644 --- a/guiminer.py +++ b/guiminer.py @@ -174,7 +174,6 @@ def __init__(self, parent): def on_focus(self): """On focus, clear the status bar.""" - # TODO: could show something helpful on the statusbar instead self.parent.statusbar.SetStatusText("", 0) self.parent.statusbar.SetStatusText("", 1) @@ -195,7 +194,7 @@ def __init__(self, parent): self.parent = parent self.timer = wx.Timer(self) self.timer.Start(REFRESH_RATE_MILLIS) - self.Bind(wx.EVT_TIMER, self.on_update_tooltip) + self.Bind(wx.EVT_TIMER, self.on_timer) flags = wx.ALIGN_CENTER_HORIZONTAL | wx.ALL border = 5 @@ -240,7 +239,8 @@ def add_miners_to_grid(self): def on_close(self): self.timer.Stop() - def on_update_tooltip(self, event=None): + def on_timer(self, event=None): + """Whenever the timer goes off, fefresh the summary data.""" if self.parent.nb.GetSelection() != self.parent.nb.GetPageIndex(self): return @@ -257,7 +257,7 @@ def on_update_tooltip(self, event=None): def on_focus(self): """On focus, show the statusbar text.""" - self.on_update_tooltip() + self.on_timer() class GUIMinerTaskBarIcon(wx.TaskBarIcon): """Taskbar icon for the GUI. @@ -277,13 +277,13 @@ def __init__(self, frame): self.timer = wx.Timer(self) self.timer.Start(REFRESH_RATE_MILLIS) self.is_paused = False - self.SetIcon(self.icon, "poclbm-gui") + self.SetIcon(self.icon, "GUIMiner") self.imgidx = 1 self.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, self.on_taskbar_activate) self.Bind(wx.EVT_MENU, self.on_taskbar_activate, id=self.TBMENU_RESTORE) self.Bind(wx.EVT_MENU, self.on_taskbar_close, id=self.TBMENU_CLOSE) self.Bind(wx.EVT_MENU, self.on_pause, id=self.TBMENU_PAUSE) - self.Bind(wx.EVT_TIMER, self.on_update_tooltip) + self.Bind(wx.EVT_TIMER, self.on_timer) def CreatePopupMenu(self): """Override from wx.TaskBarIcon. Creates the right-click menu.""" @@ -304,7 +304,7 @@ def on_taskbar_activate(self, evt): def on_taskbar_close(self, evt): wx.CallAfter(self.frame.Close, force=True) - def on_update_tooltip(self, event): + def on_timer(self, event): """Refresh the taskbar icon's status message.""" objs = self.frame.profile_panels if objs: @@ -319,13 +319,12 @@ def on_pause(self, event): miner.pause() else: miner.resume() - #event.Skip() # Allow the box to become checked class MinerListenerThread(threading.Thread): LINES = [ - (r"Target =|average rate", - lambda _: None), # Just ignore this + (r"Target =|average rate|Sending to server|found hash!", + lambda _: None), # Just ignore lines like these (r"accepted|\"result\": true", lambda _: UpdateAcceptedEvent(accepted=True)), (r"invalid|stale", lambda _: @@ -345,7 +344,7 @@ def __init__(self, parent, miner): self.miner = miner def run(self): - logger.debug('Listener for "%s" started' % self.parent.name) + logger.info('Listener for "%s" started' % self.parent.name) while not self.shutdown_event.is_set(): line = self.miner.stdout.readline().strip() logger.debug("Line: %s", line) @@ -362,7 +361,7 @@ def run(self): event = UpdateStatusEvent(text=line) logger.info('Listener for "%s": %s', self.parent.name, line) wx.PostEvent(self.parent, event) - logger.debug('Listener for "%s" shutting down', self.parent.name) + logger.info('Listener for "%s" shutting down', self.parent.name) class MinerTab(wx.Panel): @@ -732,7 +731,7 @@ def start_mining(self): stdout=subprocess.PIPE, creationflags=flags) except OSError: - raise #TODO + raise #TODO: the folder or exe could not exist self.miner_listener = MinerListenerThread(self, self.miner) self.miner_listener.daemon = True self.miner_listener.start() From 793272323fa1cf38c40f7069e4b7d6417e38da13 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 3 Apr 2011 09:37:46 -0300 Subject: [PATCH 059/190] Use host URL instead of name as unique pool identifier. --- guiminer.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/guiminer.py b/guiminer.py index bd2dd6d..df0a151 100644 --- a/guiminer.py +++ b/guiminer.py @@ -913,13 +913,12 @@ def change_server(self, new_server): self.txt_port.SetValue(str(new_server['port'])) - # Call server specific code. - # TODO: probably best to use hostname as the unique identifier in code. - name = new_server.get('name', 'Other').lower() - if name == "slush's pool": self.layout_slush() - elif name == "bitpenny": self.layout_bitpenny() - elif name == "deepbit": self.layout_deepbit() - elif name == "btcmine": self.layout_btcmine() + # Call server specific code. + host = new_server.get('host', "").lower() + if host == "mining.bitcoin.cz": self.layout_slush() + elif host == "bitpenny.dyndns.biz": self.layout_bitpenny() + elif host == "deepbit.net": self.layout_deepbit() + elif host == "btcmine.com": self.layout_btcmine() else: self.layout_default() self.Layout() From 003027162c0ccdf6ddaaf0a290f076217a963369 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 3 Apr 2011 09:38:46 -0300 Subject: [PATCH 060/190] Warn user if unsupported backend selected. Warn user if save failed because destination was not writable. --- guiminer.py | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/guiminer.py b/guiminer.py index df0a151..b27d69c 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1391,13 +1391,16 @@ def new_external_profile(self, event): defaultFile="", wildcard='External miner (*.exe)|*.exe', style=wx.OPEN) - if dialog.ShowModal() == wx.ID_OK: - path = os.path.join(dialog.GetDirectory(), dialog.GetFilename()) - # TODO: if filename isn't in backends, show error dialog - if not os.path.exists(path): - return # TODO: should this ever happen? - else: + if dialog.ShowModal() != wx.ID_OK: return + + if dialog.GetFilename() not in SUPPORTED_BACKENDS: + self.message( + "Unsupported external miner %s. Supported are: %s" % ( + dialog.GetFilename(), '\n'.join(SUPPORTED_BACKENDS)), + "Miner not supported", wx.OK | wx.ICON_ERROR) + return + path = os.path.join(dialog.GetDirectory(), dialog.GetFilename()) dialog.Destroy() self.name_new_profile(extra_profile_data=dict(external_path=path)) @@ -1450,13 +1453,18 @@ def save_config(self, event=None): profiles=profile_data, bitcoin_executable=self.bitcoin_executable) logger.debug('Saving: ' + json.dumps(config_data)) - with open(config_filename, 'w') as f: - json.dump(config_data, f, indent=4) - self.message("Profiles saved OK to %s." % config_filename, + try: + with open(config_filename, 'w') as f: + json.dump(config_data, f, indent=4) + except IOError: + self.message("Couldn't write save file %s." + "\nCheck the location is writable." % config_filename, + "Save unsuccessful", wx.OK | wx.ICON_ERROR) + else: + self.message("Profiles saved OK to %s." % config_filename, "Save successful", wx.OK | wx.ICON_INFORMATION) - for p in self.profile_panels: - p.on_saved() - # TODO: handle save failed + for p in self.profile_panels: + p.on_saved() def load_config(self, event=None): """Load JSON profile info from the config file.""" From c12822a260fb7146df19019cea5f71f247026d33 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 3 Apr 2011 10:36:17 -0300 Subject: [PATCH 061/190] Reorganize HTTP request code. Support withdrawal of money from deepbit. --- guiminer.py | 144 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 96 insertions(+), 48 deletions(-) diff --git a/guiminer.py b/guiminer.py index b27d69c..897a2fd 100644 --- a/guiminer.py +++ b/guiminer.py @@ -925,32 +925,6 @@ def change_server(self, new_server): self.update_tab_name() - def on_balance_refresh(self, event=None, withdraw=False): - """Refresh the miner's balance from the server.""" - host = self.server_config.get("host") - - HOSTS_REQUIRING_AUTH_TOKEN = ["mining.bitcoin.cz", - "btcmine.com", - "deepbit.net"] - if host in HOSTS_REQUIRING_AUTH_TOKEN: - if not self.balance_auth_token: - self.prompt_auth_token() - if not self.balance_auth_token: # They cancelled the dialog - return - self.http_thread = threading.Thread( - target=self.request_balance_get, - args=(self.balance_auth_token,)) - self.http_thread.start() - - elif host in ["bitpenny.dyndns.biz"]: - self.http_thread = threading.Thread( - target=self.request_balance_post, args=(withdraw,)) - self.http_thread.start() - - self.balance_refresh.Disable() - self.balance_cooldown_seconds = 10 - self.balance_refresh_timer.Start(1000) - def on_balance_cooldown_tick(self, event=None): """Each second, decrement the cooldown for refreshing balance.""" self.balance_cooldown_seconds -= 1 @@ -960,11 +934,13 @@ def on_balance_cooldown_tick(self, event=None): self.balance_refresh.Enable() self.balance_refresh.SetLabel(_("Refresh balance")) - def prompt_auth_token(self): - """Prompt user for an auth token, returning the token on success. + def require_auth_token(self): + """Prompt the user for an auth token if they don't have one already. - On failure, return the empty string. - """ + Set the result to self.balance_auth_token and return None. + """ + if self.balance_auth_token: + return url = self.server_config.get('balance_token_url') dialog = BalanceAuthRequest(self, url) result = dialog.ShowModal() @@ -974,7 +950,10 @@ def prompt_auth_token(self): self.balance_auth_token = dialog.get_value() # TODO: validate token? def request_balance_get(self, balance_auth_token): - """Request our balance from the server via HTTP GET and auth token.""" + """Request our balance from the server via HTTP GET and auth token. + + This method should be run in its own thread. + """ data = http_request( self.server_config['balance_host'], "GET", @@ -987,6 +966,10 @@ def request_balance_get(self, balance_auth_token): info = json.loads(data) confirmed = info.get('confirmed_reward') or info.get('confirmed', 0) unconfirmed = info.get('unconfirmed_reward') or info.get('unconformed', 0) + if self.server_config.get('host') == "deepbit.net": + ipa = info.get('ipa', False) + self.withdraw.Enable(ipa) + data = "%s confirmed" % format_balance(confirmed) if unconfirmed > 0: data += ", %s unconfirmed" % format_balance(unconfirmed) @@ -994,18 +977,85 @@ def request_balance_get(self, balance_auth_token): data = "Bad response from server." wx.CallAfter(self.balance_amt.SetLabel, data) - - def request_balance_post(self, withdraw): - """Request our balance from the server via HTTP POST.""" - server_config = self.server_config - # Assume BitPenny for now; support other miners later. - post_params = dict(a=self.txt_username.GetValue()) - if withdraw: post_params['w'] = 1 - + + def on_withdraw(self, event): + self.withdraw.Disable() + host = self.server_config.get('host') + if host == 'bitpenny.dyndns.biz': + self.withdraw_bitpenny() + elif host == 'deepbit.net': + self.withdraw_deepbit() + + def on_balance_refresh(self, event=None): + """Refresh the miner's balance from the server.""" + host = self.server_config.get("host") + + HOSTS_REQUIRING_AUTH_TOKEN = ["mining.bitcoin.cz", + "btcmine.com", + "deepbit.net"] + if host in HOSTS_REQUIRING_AUTH_TOKEN: + self.require_auth_token() + if not self.balance_auth_token: # They cancelled the dialog + return + self.http_thread = threading.Thread( + target=self.request_balance_get, + args=(self.balance_auth_token,)) + self.http_thread.start() + elif host == 'bitpenny.dyndns.biz': + self.http_thread = threading.Thread( + target=self.request_payout_bitpenny, args=(False,)) + self.http_thread.start() + + self.balance_refresh.Disable() + self.balance_cooldown_seconds = 10 + self.balance_refresh_timer.Start(1000) + + ################################# + # Begin server specific HTTP code + + def withdraw_deepbit(self): + """Launch a thread to withdraw from deepbit.""" + self.require_auth_token() + if not self.balance_auth_token: # User refused to provide token + return + self.http_thread = threading.Thread( + target=self.request_payout_deepbit, + args=(self.balance_auth_token,)) + self.http_thread.start() + + def withdraw_bitpenny(self): + self.http_thread = threading.Thread( + target=self.request_payout_bitpenny, args=(True,)) + self.http_thread.start() # TODO: look at aliasing of this variable + + def request_payout_deepbit(self, balance_auth_token): + """Request payout from deepbit's server via HTTP POST.""" + post_params = dict(id=1, + method="request_payout") + data = http_request( + self.server_config['balance_host'], + "POST", + self.server_config['balance_url'] % balance_auth_token, + json.dumps(post_params), + {"Content-type": "application/json; charset=utf-8"} + ) + # TODO: check response code of request + if not data: + data = "Connection error" + else: + data = "Withdraw OK" + wx.CallAfter(self.on_balance_received, data) + + def request_payout_bitpenny(self, withdraw): + """Request our balance from BitPenny via HTTP POST. + + If withdraw is True, also request a withdrawal. + """ + post_params = dict(a=self.txt_username.GetValue(), w=int(withdraw)) data = http_request( - server_config['balance_host'], + self.server_config['balance_host'], "POST", - server_config['balance_url'], + self.server_config['balance_url'], urllib.urlencode(post_params), {"Content-type": "application/x-www-form-urlencoded"} ) @@ -1027,11 +1077,10 @@ def on_balance_received(self, balance): amt_str = format_balance(amt) self.balance_amt.SetLabel(amt_str) self.Layout() - - def on_withdraw(self, event): - self.withdraw.Disable() - self.on_balance_refresh(withdraw=True) - + + # End server specific HTTP code + ############################### + def set_name(self, name): """Set the label on this miner's tab to name.""" self.name = name @@ -1212,8 +1261,7 @@ def layout_btcmine(self): def layout_deepbit(self): """Deepbit uses an email address for a username.""" self.set_widgets_visible([self.host_lbl, self.txt_host, - self.port_lbl, self.txt_port, - self.withdraw], False) + self.port_lbl, self.txt_port], False) row = self.layout_init() self.layout_server_and_website(row=row) self.layout_user_and_pass(row=row+1) From f4967b33d81c104a6e9b48576847376cf1000e90 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 3 Apr 2011 10:38:29 -0300 Subject: [PATCH 062/190] Fix console tab bug where text would go to the current cursor position instead of the end of the window. --- guiminer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index 897a2fd..d0aa7c9 100644 --- a/guiminer.py +++ b/guiminer.py @@ -183,7 +183,7 @@ def on_close(self): def write(self, text): """Forward logging events to our TextCtrl.""" - wx.CallAfter(self.text.WriteText, text) + wx.CallAfter(self.text.AppendText, text) class SummaryPanel(wx.Panel): From 0586bc5b241de214acd036188d671a31bd3af263 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 3 Apr 2011 10:46:24 -0300 Subject: [PATCH 063/190] Update README.txt to new name and multiple backend support. --- README.txt | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/README.txt b/README.txt index 04dc80f..6506e69 100644 --- a/README.txt +++ b/README.txt @@ -1,16 +1,17 @@ -Python OpenCL Bitcoin Miner GUI (poclbm-gui) -============================================ +GUIMiner - a graphical interface for mining Bitcoins +==================================================== by Chris 'Kiv' MacLeod -based on "poclbm" by m0mchil +based on "poclbm" by m0mchil, 'rpcminer' by puddinpop What is it? ----------- -poclbm-gui is a GUI front end for the poclbm Bitcoin miner by m0mchil. It -allows you to use an OpenCL compatible video card to mine Bitcoins, without -having to use the command line. It supports both pooled mining and solo -mining. +GUIMiner is a graphical front end for mining Bitcoins. It provides a more +convenient way to operate Bitcoin miners without having to use the command +line. It supports both NVIDIA and ATI GPUs, as well as CPU mining. It +supports both pooled mining and solo mining, with a wide list of pool +servers pre-set with the program. What is it not? --------------- @@ -33,14 +34,18 @@ Features - Supports multiple miners in a tabbed interface. - Remembers your login info between sessions. - Supports both solo and pooled mining. +- Supports OpenCL, CUDA, and CPU mining. - Minimizes to tray. Hover on tray icon to see status. -- Displays your accepted and stale/invalid shares over time. +- Displays your accepted and stale/invalid shares over time. +- View your account balance with a pool and/or withdraw funds from + the GUI, at participating pools. Requirements ------------ -- You need an OpenCL compatible GPU with a working version of OpenCL. If you -are unsure whether your GPU supports OpenCL, try the GPU Caps Viewer: +- To mine using an ATI GPU, you need an OpenCL compatible card with a +working version of OpenCL installed. If you are unsure whether your GPU +supports OpenCL, try the GPU Caps Viewer: http://www.ozone3d.net/gpu_caps_viewer/ @@ -49,6 +54,13 @@ available here: http://developer.amd.com/gpu/AMDAPPSDK/downloads/pages/AMDAPPSDKDownloadArchive.aspx +For NVIDIA cards, you can also install OpenCL and mine that way, or you can +install CUDA and use rpcminer-CUDA which may provide slightly higher performance +since it is optimized specifically for NVIDIA cards. + +For CPU mining, you don't need anything special; you can mine using rpcminer-cpu +or rpcminer-4way; try both to see which has better performance on your CPU. + Instructions for Pooled Mining ------------------------------ @@ -96,11 +108,11 @@ For solo mining, instead of connecting to a pool server you connect to your own local machine's copy of 'bitcoin.exe'. Instead of registering with the pool server, you put your login info in a special file called 'bitcoin.conf'. -poclbm-gui has utilities to help with these tasks. To create the bitcoin.conf, +GUIMiner has utilities to help with these tasks. To create the bitcoin.conf, choose "Solo utilities -> Create solo password..." and create a user and password. It should show a message saying that it was successful. -To launch bitcoin.exe in server mode, you might need to point poclbm-gui to +To launch bitcoin.exe in server mode, you might need to point GUIMiner to the location of bitcoin.exe. If you installed Bitcoin in the regular location of Program Files/Bitcoin, you can skip this step. Otherwise choose "Solo utilities -> Set Bitcoin client path". @@ -119,10 +131,12 @@ connect and start mining. Running From Source ------------------- -Running poclbm-gui from source requires: +Running GUIMiner from source requires: - Python 2.6 or higher (Python 3 not supported) - - PyOpenCL - wxPython + +Mining using OpenCL with poclbm also requires: + - PyOpenCL - numpy Once these are installed run "guiminer.py" to start. From 59bdc42e1ca2826fee24d44d6d5f40700d3619b2 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 3 Apr 2011 10:46:42 -0300 Subject: [PATCH 064/190] Version bump for pre-release testing. --- guiminer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index d0aa7c9..6de087f 100644 --- a/guiminer.py +++ b/guiminer.py @@ -17,7 +17,7 @@ from wx.lib.agw import hyperlink from wx.lib.newevent import NewEvent -__version__ = '2011-04-02' +__version__ = '2011-04-03-pre' ABOUT_TEXT = \ """GUIMiner From 5de88ef07becdcfa0fe3beb0678407d35c24d5f0 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 3 Apr 2011 11:05:16 -0300 Subject: [PATCH 065/190] Fix exception on exit if summary panel was never opened. --- guiminer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index 6de087f..c0f1b2d 100644 --- a/guiminer.py +++ b/guiminer.py @@ -392,7 +392,8 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): self.invalid_times = collections.deque() self.last_rate = 0 # units of khash/s self.autostart = False - self.server_lbl = wx.StaticText(self, -1, _("Server:")) + self.server_lbl = wx.StaticText(self, -1, _("Server:")) + self.summary_panel = None # SummaryPanel instance if summary open self.server = wx.ComboBox(self, -1, choices=[s['name'] for s in servers], style=wx.CB_READONLY) From f86d751518b14013e5eeeaee8a73764044af0317 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 3 Apr 2011 13:21:52 -0300 Subject: [PATCH 066/190] Update user agent to include guiminer. --- BitcoinMiner.py | 2 +- guiminer.py | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/BitcoinMiner.py b/BitcoinMiner.py index 0f47225..4ead36d 100644 --- a/BitcoinMiner.py +++ b/BitcoinMiner.py @@ -27,7 +27,7 @@ def socketwrap(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0): VERSION = '201103.beta3' -USER_AGENT = 'poclbm/' + VERSION +USER_AGENT = 'guiminer/poclbm/' + VERSION TIME_FORMAT = '%d/%m/%Y %H:%M:%S' diff --git a/guiminer.py b/guiminer.py index c0f1b2d..7472999 100644 --- a/guiminer.py +++ b/guiminer.py @@ -48,6 +48,8 @@ #"bitcoin-miner.exe" # Doesn't work yet ] +USER_AGENT = "guiminer/" + __version__ + # Time constants SAMPLE_TIME_SECS = 3600 REFRESH_RATE_MILLIS = 2000 @@ -347,7 +349,7 @@ def run(self): logger.info('Listener for "%s" started' % self.parent.name) while not self.shutdown_event.is_set(): line = self.miner.stdout.readline().strip() - logger.debug("Line: %s", line) + #logger.debug("Line: %s", line) if not line: continue for s, event_func in MinerListenerThread.LINES: match = re.search(s, line, flags=re.I) @@ -1038,7 +1040,8 @@ def request_payout_deepbit(self, balance_auth_token): "POST", self.server_config['balance_url'] % balance_auth_token, json.dumps(post_params), - {"Content-type": "application/json; charset=utf-8"} + {"Content-type": "application/json; charset=utf-8", + "User-Agent": USER_AGENT} ) # TODO: check response code of request if not data: From 4b587460232e28076ed10dd8537a723989d142fb Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 3 Apr 2011 18:32:51 -0300 Subject: [PATCH 067/190] Store parent_name in listener thread to avoid accessing parent after it's destroyed during shutdown. --- guiminer.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/guiminer.py b/guiminer.py index 7472999..421c98b 100644 --- a/guiminer.py +++ b/guiminer.py @@ -343,10 +343,11 @@ def __init__(self, parent, miner): threading.Thread.__init__(self) self.shutdown_event = threading.Event() self.parent = parent + self.parent_name = parent.name self.miner = miner def run(self): - logger.info('Listener for "%s" started' % self.parent.name) + logger.info('Listener for "%s" started' % self.parent_name) while not self.shutdown_event.is_set(): line = self.miner.stdout.readline().strip() #logger.debug("Line: %s", line) @@ -361,9 +362,9 @@ def run(self): else: # Possible error or new message, just pipe it through event = UpdateStatusEvent(text=line) - logger.info('Listener for "%s": %s', self.parent.name, line) + logger.info('Listener for "%s": %s', self.parent_name, line) wx.PostEvent(self.parent, event) - logger.info('Listener for "%s" shutting down', self.parent.name) + logger.info('Listener for "%s" shutting down', self.parent_name) class MinerTab(wx.Panel): From 1f444d4033c6207cb2d40244f176f96d8ef6d814 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 3 Apr 2011 18:33:37 -0300 Subject: [PATCH 068/190] Fix typo in launch bitcoin dialog --- guiminer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index 421c98b..48987cd 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1636,7 +1636,7 @@ def launch_solo_server(self, event): "Launch failed", wx.ICON_ERROR | wx.OK) return self.message( - "Client launched ok. You can start a miner now with the solo set to 'server'.", + "Client launched ok. You can start a miner now with the server set to 'solo'.", "Launched ok.", wx.OK) From 2e2e702aef3cf0b274141a67d4edc955e3261ac0 Mon Sep 17 00:00:00 2001 From: Kiv Date: Wed, 6 Apr 2011 07:59:22 -0300 Subject: [PATCH 069/190] Ignore whitespace in backend output. --- guiminer.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/guiminer.py b/guiminer.py index 48987cd..78ce517 100644 --- a/guiminer.py +++ b/guiminer.py @@ -327,13 +327,13 @@ class MinerListenerThread(threading.Thread): LINES = [ (r"Target =|average rate|Sending to server|found hash!", lambda _: None), # Just ignore lines like these - (r"accepted|\"result\": true", + (r"accepted|\"result\":\s*true", lambda _: UpdateAcceptedEvent(accepted=True)), (r"invalid|stale", lambda _: UpdateAcceptedEvent(accepted=False)), - (r"(\d+) khash/s", lambda match: + (r"(\d+)\s*khash/s", lambda match: UpdateHashRateEvent(rate=int(match.group(1)))), - (r"(\d+) Mhash/s", lambda match: + (r"(\d+)\s*Mhash/s", lambda match: UpdateHashRateEvent(rate=int(match.group(1)) * 1000)), (r"checking (\d+)", lambda _: UpdateSoloCheckEvent()), From 80f326896f55bba6e6a4ae4dfa7ac54c566a0575 Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 15 Apr 2011 20:56:53 -0300 Subject: [PATCH 070/190] Improve Linux support. --- guiminer.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/guiminer.py b/guiminer.py index 78ce517..64185f9 100644 --- a/guiminer.py +++ b/guiminer.py @@ -12,6 +12,7 @@ import wx import json import collections +import shlex from wx.lib.agw import flatnotebook as fnb from wx.lib.agw import hyperlink @@ -87,7 +88,8 @@ def get_opencl_devices(): def get_module_path(): """Return the folder containing this script (or its .exe).""" module_name = sys.executable if hasattr(sys, 'frozen') else __file__ - return os.path.dirname(module_name) + abs_path = os.path.abspath(module_name) + return os.path.dirname(abs_path) def get_icon_bundle(): """Return the Bitcoin program icon bundle.""" @@ -428,6 +430,7 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): self.labels = [self.server_lbl, self.website_lbl, self.host_lbl, self.port_lbl, self.user_lbl, self.pass_lbl, + self.device_lbl, self.flags_lbl, self.balance_lbl] self.txts = [self.txt_host, self.txt_port, @@ -733,7 +736,8 @@ def start_mining(self): logger.debug('Running command: ' + cmd) self.miner = subprocess.Popen(cmd, cwd=cwd, stdout=subprocess.PIPE, - creationflags=flags) + creationflags=flags, + shell=(sys.platform != 'win32')) except OSError: raise #TODO: the folder or exe could not exist self.miner_listener = MinerListenerThread(self, self.miner) @@ -1437,17 +1441,22 @@ def name_new_profile(self, event=None, extra_profile_data={}): self.add_profile(data) def new_external_profile(self, event): - """Prompt for an external miner path, then create a miner.""" + """Prompt for an external miner path, then create a miner. + + On Windows we validate against legal miners; on Linux they can pick + whatever they want. + """ + wildcard = 'External miner (*.exe)|*.exe' if sys.platform == 'win32' else '*.*' dialog = wx.FileDialog(self, "Select external miner:", defaultDir=os.path.join(get_module_path(), 'miners'), defaultFile="", - wildcard='External miner (*.exe)|*.exe', + wildcard=wildcard, style=wx.OPEN) if dialog.ShowModal() != wx.ID_OK: return - if dialog.GetFilename() not in SUPPORTED_BACKENDS: + if sys.platform == 'win32' and dialog.GetFilename() not in SUPPORTED_BACKENDS: self.message( "Unsupported external miner %s. Supported are: %s" % ( dialog.GetFilename(), '\n'.join(SUPPORTED_BACKENDS)), From 22f9f0a173e48b617450a4ac404b7ea51a85a323 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sat, 16 Apr 2011 09:57:56 -0300 Subject: [PATCH 071/190] Start support for internationalization. Fix location of Bitcoin.conf on Linux. --- guiminer.py | 307 +++++++++++++++++++++++++++------------------------- 1 file changed, 162 insertions(+), 145 deletions(-) diff --git a/guiminer.py b/guiminer.py index 64185f9..42c3bd1 100644 --- a/guiminer.py +++ b/guiminer.py @@ -12,15 +12,31 @@ import wx import json import collections -import shlex from wx.lib.agw import flatnotebook as fnb from wx.lib.agw import hyperlink from wx.lib.newevent import NewEvent -__version__ = '2011-04-03-pre' +__version__ = '2011-04-16' -ABOUT_TEXT = \ +def get_module_path(): + """Return the folder containing this script (or its .exe).""" + module_name = sys.executable if hasattr(sys, 'frozen') else __file__ + abs_path = os.path.abspath(module_name) + return os.path.dirname(abs_path) + +global USE_MOCK +USE_MOCK = '--mock' in sys.argv +# Set up localization; requires the app to be created +app = wx.PySimpleApp(0) +wx.InitAllImageHandlers() +locale = wx.Locale(wx.LANGUAGE_RUSSIAN) +locale.AddCatalogLookupPathPrefix(os.path.join(get_module_path(), "locale")) +locale.AddCatalog("guiminer") +_ = wx.GetTranslation + + +ABOUT_TEXT = _( """GUIMiner Version: %s @@ -39,7 +55,19 @@ Even a single Bitcoin is appreciated and helps motivate further work on this software. -""" +""") + +# Translatable strings that are used repeatedly +STR_NOT_STARTED = _("Not started") +STR_STARTING = _("Starting...") +STR_STOPPED = _("Stopped") +STR_PAUSED = _("Paused") +STR_MINING = _("%s mining!") +STR_REFRESH_BALANCE = _("Refresh balance") +STR_CONNECTION_ERROR = _("Connection error") +STR_USERNAME = _("Username:") +STR_PASSWORD = _("Password:") + # Alternate backends that we know how to call SUPPORTED_BACKENDS = [ "rpcminer-4way.exe", @@ -85,12 +113,6 @@ def get_opencl_devices(): return ['[%d] %s' % (i, merge_whitespace(device.name)[:25]) for (i, device) in enumerate(devices)] -def get_module_path(): - """Return the folder containing this script (or its .exe).""" - module_name = sys.executable if hasattr(sys, 'frozen') else __file__ - abs_path = os.path.abspath(module_name) - return os.path.dirname(abs_path) - def get_icon_bundle(): """Return the Bitcoin program icon bundle.""" return wx.IconBundleFromFile("logo.ico", wx.BITMAP_TYPE_ICO) @@ -113,19 +135,19 @@ def mkdir_p(path): def add_tooltip(widget, text): """Add a tooltip to widget with the specified text.""" - tooltip = wx.ToolTip(_(text)) + tooltip = wx.ToolTip(text) widget.SetToolTip(tooltip) def format_khash(rate): """Format rate for display. A rate of 0 means just connected.""" if rate > 10**6: - return "%.1f Ghash/s" % (rate / 1000000.) + return _("%.1f Ghash/s") % (rate / 1000000.) if rate > 10**3: - return "%.1f Mhash/s" % (rate / 1000.) + return _("%.1f Mhash/s") % (rate / 1000.) elif rate == 0: - return "Connecting..." + return _("Connecting...") else: - return "%d khash/s" % rate + return _("%d khash/s") % rate def format_balance(amount): """Format a quantity of Bitcoins in BTC.""" @@ -149,11 +171,11 @@ def http_request(hostname, *args): """Do a HTTP request and return the response data.""" try: conn = httplib.HTTPConnection(hostname) - logger.debug("Requesting balance: %s", str(args)) + logger.debug(_("Requesting balance: %s"), str(args)) conn.request(*args) response = conn.getresponse() data = response.read() - logger.debug("Server replied: %s, %s", str(response.status), data) + logger.debug(_("Server replied: %s, %s"), str(response.status), data) return data finally: conn.close() @@ -292,10 +314,10 @@ def __init__(self, frame): def CreatePopupMenu(self): """Override from wx.TaskBarIcon. Creates the right-click menu.""" menu = wx.Menu() - menu.AppendCheckItem(self.TBMENU_PAUSE, "Pause all") + menu.AppendCheckItem(self.TBMENU_PAUSE, _("Pause all")) menu.Check(self.TBMENU_PAUSE, self.is_paused) - menu.Append(self.TBMENU_RESTORE, "Restore") - menu.Append(self.TBMENU_CLOSE, "Close") + menu.Append(self.TBMENU_RESTORE, _("Restore")) + menu.Append(self.TBMENU_CLOSE, _("Close")) return menu def on_taskbar_activate(self, evt): @@ -349,7 +371,7 @@ def __init__(self, parent, miner): self.miner = miner def run(self): - logger.info('Listener for "%s" started' % self.parent_name) + logger.info(_('Listener for "%s" started') % self.parent_name) while not self.shutdown_event.is_set(): line = self.miner.stdout.readline().strip() #logger.debug("Line: %s", line) @@ -364,9 +386,9 @@ def run(self): else: # Possible error or new message, just pipe it through event = UpdateStatusEvent(text=line) - logger.info('Listener for "%s": %s', self.parent_name, line) + logger.info(_('Listener for "%s": %s'), self.parent_name, line) wx.PostEvent(self.parent, event) - logger.info('Listener for "%s" shutting down', self.parent_name) + logger.info(_('Listener for "%s" shutting down'), self.parent_name) class MinerTab(wx.Panel): @@ -410,18 +432,18 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): self.txt_host = wx.TextCtrl(self, -1, "") self.port_lbl = wx.StaticText(self, -1, _("Port:")) self.txt_port = wx.TextCtrl(self, -1, "") - self.user_lbl = wx.StaticText(self, -1, _("Username:")) + self.user_lbl = wx.StaticText(self, -1, STR_USERNAME) self.txt_username = wx.TextCtrl(self, -1, "") - self.pass_lbl = wx.StaticText(self, -1, _("Password:")) + self.pass_lbl = wx.StaticText(self, -1, STR_PASSWORD) self.txt_pass = wx.TextCtrl(self, -1, "", style=wx.TE_PASSWORD) self.device_lbl = wx.StaticText(self, -1, _("Device:")) - self.device_listbox = wx.ComboBox(self, -1, choices=devices or ["No OpenCL devices"], style=wx.CB_READONLY) + self.device_listbox = wx.ComboBox(self, -1, choices=devices or [_("No OpenCL devices")], style=wx.CB_READONLY) self.flags_lbl = wx.StaticText(self, -1, _("Extra flags:")) self.txt_flags = wx.TextCtrl(self, -1, "") self.extra_info = wx.StaticText(self, -1, "") self.balance_lbl = wx.StaticText(self, -1, _("Balance:")) self.balance_amt = wx.StaticText(self, -1, "0") - self.balance_refresh = wx.Button(self, -1, _("Refresh balance")) + self.balance_refresh = wx.Button(self, -1, STR_REFRESH_BALANCE) self.balance_refresh_timer = wx.Timer() self.withdraw = wx.Button(self, -1, _("Withdraw")) self.balance_cooldown_seconds = 0 @@ -538,7 +560,7 @@ def set_data(self, data): self.last_data = data default_server_config = self.get_server_by_field( self.defaults['default_server'], 'name') - self.name = (data.get('name') or 'Default') + self.name = (data.get('name') or _('Default')) # Backwards compatibility: hostname key used to be called server. # We only save out hostname now but accept server from old INI files. @@ -585,7 +607,7 @@ def clear_summary_widgets(self): def get_start_stop_state(self): """Return appropriate text for the start/stop button.""" - return "Stop" if self.is_mining else "Start" + return _("Stop") if self.is_mining else _("Start") def update_summary(self): """Update our summary fields if possible.""" @@ -594,11 +616,11 @@ def update_summary(self): self.summary_name.SetLabel(self.name) if self.is_paused: - text = "Paused" + text = STR_PAUSED elif not self.is_mining: - text = "Stopped" + text = STR_STOPPED elif self.is_possible_error: - text = "Connection problems" + text = _("Connection problems") else: text = format_khash(self.last_rate) self.summary_status.SetLabel(text) @@ -622,7 +644,7 @@ def get_summary_widgets(self, summary_panel): self.summary_name = wx.StaticText(summary_panel, -1, self.name) self.summary_name.Bind(wx.EVT_LEFT_UP, self.show_this_panel) - self.summary_status = wx.StaticText(summary_panel, -1, "Stopped") + self.summary_status = wx.StaticText(summary_panel, -1, STR_STOPPED) self.summary_shares_accepted = wx.StaticText(summary_panel, -1, "0") self.summary_shares_invalid = wx.StaticText(summary_panel, -1, "0") self.summary_start = wx.Button(summary_panel, -1, self.get_start_stop_state(), style=wx.BU_EXACTFIT) @@ -733,7 +755,7 @@ def start_mining(self): # seem to die - probably we have to get him to change things # so his miner will play nice. try: - logger.debug('Running command: ' + cmd) + logger.debug(_('Running command: ') + cmd) self.miner = subprocess.Popen(cmd, cwd=cwd, stdout=subprocess.PIPE, creationflags=flags, @@ -744,8 +766,8 @@ def start_mining(self): self.miner_listener.daemon = True self.miner_listener.start() self.is_mining = True - self.set_status("Starting...", 1) - self.start.SetLabel("%s mining!" % self.get_start_stop_state()) + self.set_status(STR_STARTING, 1) + self.start.SetLabel(STR_MINING % self.get_start_stop_state()) def on_close(self): """Prepare to close gracefully.""" @@ -767,8 +789,8 @@ def stop_mining(self): self.miner_listener = None self.is_mining = False self.is_paused = False - self.set_status("Stopped", 1) - self.start.SetLabel("%s mining!" % self.get_start_stop_state()) + self.set_status(STR_STOPPED, 1) + self.start.SetLabel(STR_MINING % self.get_start_stop_state()) def update_khash(self, rate): """Update our rate according to a report from the listener thread. @@ -785,15 +807,15 @@ def update_khash(self, rate): def update_statusbar(self): """Show the shares or equivalent on the statusbar.""" if self.is_solo: - text = "Difficulty 1 hashes: %d %s" % \ + text = _("Difficulty 1 hashes: %d %s") % \ (self.accepted_shares, self.format_last_update_time()) if self.solo_blocks_found > 0: - block_text = "Blocks: %d, " % self.solo_blocks_found + block_text = _("Blocks: %d, ") % self.solo_blocks_found text = block_text + text else: - text = "Shares: %d accepted" % self.accepted_shares + text = _("Shares: %d accepted") % self.accepted_shares if self.invalid_shares > 0: - text += ", %d stale/invalid" % self.invalid_shares + text += _(", %d stale/invalid") % self.invalid_shares text += " %s" % self.format_last_update_time() self.set_status(text, 0) @@ -815,7 +837,7 @@ def format_last_update_time(self): time_fmt = '%I:%M:%S%p' if self.last_update_time is None: return "" - return "- last at %s" % time.strftime(time_fmt, self.last_update_time) + return _("- last at %s") % time.strftime(time_fmt, self.last_update_time) def update_shares(self, accepted): """Update our shares with a report from the listener thread.""" @@ -853,14 +875,12 @@ def on_focus(self): if self.is_mining: self.update_khash(self.last_rate) else: - self.set_status("Stopped", 1) + self.set_status(STR_STOPPED, 1) def get_taskbar_text(self): """Return text for the hover state of the taskbar.""" - if self.is_mining: - return "%s: %s" % (self.name, format_khash(self.last_rate)) - else: - return "%s: Stopped" % self.name + rate = format_khash(self.last_rate) if self.is_mining else STR_STOPPED + return "%s: %s" % (self.name, rate) def update_solo(self): """Update our easy hashes with a report from the listener thread.""" @@ -890,14 +910,14 @@ def set_widgets_visible(self, widgets, show=False): w.Hide() def set_tooltips(self): - add_tooltip(self.server, "Server to connect to. Different servers have different fees and features.\nCheck their websites for full information.") - add_tooltip(self.website, "Website of the currently selected server. Click to visit.") - add_tooltip(self.device_listbox, "Available OpenCL devices on your system.") - add_tooltip(self.txt_host, "Host address, without http:// prefix.") - add_tooltip(self.txt_port, "Server port. This is usually 8332.") - add_tooltip(self.txt_username, "The miner's username.\nMay be different than your account username.\nExample: Kiv.GPU") - add_tooltip(self.txt_pass, "The miner's password.\nMay be different than your account password.") - add_tooltip(self.txt_flags, "Extra flags to pass to the miner.\nFor Radeon HD 5xxx series use -v -w128 for best results.\nFor other cards consult the forum.") + add_tooltip(self.server, _("Server to connect to. Different servers have different fees and features.\nCheck their websites for full information.")) + add_tooltip(self.website, _("Website of the currently selected server. Click to visit.")) + add_tooltip(self.device_listbox, _("Available OpenCL devices on your system.")) + add_tooltip(self.txt_host, _("Host address, without http:// prefix.")) + add_tooltip(self.txt_port, _("Server port. This is usually 8332.")) + add_tooltip(self.txt_username, _("The miner's username.\nMay be different than your account username.\nExample: Kiv.GPU")) + add_tooltip(self.txt_pass, _("The miner's password.\nMay be different than your account password.")) + add_tooltip(self.txt_flags, _("Extra flags to pass to the miner.\nFor Radeon HD 5xxx series use -v -w128 for best results.\nFor other cards consult the forum.")) def change_server(self, new_server): """Change the server to new_server, updating fields as needed.""" @@ -940,7 +960,7 @@ def on_balance_cooldown_tick(self, event=None): if self.balance_cooldown_seconds <= 0: self.balance_refresh_timer.Stop() self.balance_refresh.Enable() - self.balance_refresh.SetLabel(_("Refresh balance")) + self.balance_refresh.SetLabel(STR_REFRESH_BALANCE) def require_auth_token(self): """Prompt the user for an auth token if they don't have one already. @@ -968,7 +988,7 @@ def request_balance_get(self, balance_auth_token): self.server_config["balance_url"] % balance_auth_token ) if not data: - data = "Connection error" + data = STR_CONNECTION_ERROR else: try: info = json.loads(data) @@ -978,11 +998,11 @@ def request_balance_get(self, balance_auth_token): ipa = info.get('ipa', False) self.withdraw.Enable(ipa) - data = "%s confirmed" % format_balance(confirmed) + data = _("%s confirmed") % format_balance(confirmed) if unconfirmed > 0: - data += ", %s unconfirmed" % format_balance(unconfirmed) + data += _(", %s unconfirmed") % format_balance(unconfirmed) except: # TODO: what exception here? - data = "Bad response from server." + data = _("Bad response from server.") wx.CallAfter(self.balance_amt.SetLabel, data) @@ -1050,7 +1070,7 @@ def request_payout_deepbit(self, balance_auth_token): ) # TODO: check response code of request if not data: - data = "Connection error" + data = STR_CONNECTION_ERROR else: data = "Withdraw OK" wx.CallAfter(self.on_balance_received, data) @@ -1069,9 +1089,9 @@ def request_payout_bitpenny(self, withdraw): {"Content-type": "application/x-www-form-urlencoded"} ) if not data: - data = "Connection error" + data = STR_CONNECTION_ERROR elif withdraw: - data = "Withdraw OK" + data = _("Withdraw OK") wx.CallAfter(self.on_balance_received, data) def on_balance_received(self, balance): @@ -1188,7 +1208,7 @@ def layout_finish(self): def layout_default(self): """Lay out a default miner with no custom changes.""" - self.user_lbl.SetLabel("Username:") + self.user_lbl.SetLabel(STR_USERNAME) self.set_widgets_visible(self.hidden_widgets, False) self.set_widgets_visible([self.balance_lbl, @@ -1197,7 +1217,8 @@ def layout_default(self): self.withdraw], False) row = self.layout_init() self.layout_server_and_website(row=row) - is_custom = self.server.GetStringSelection().lower() in ["other", "solo"] + customs = ["other", "solo"] + is_custom = self.server.GetStringSelection().lower() in customs if is_custom: self.layout_host_and_port(row=row+1) else: @@ -1228,11 +1249,11 @@ def layout_bitpenny(self): self.inner_sizer.Add(self.extra_info,(row+4,0), span=(1,4), flag=wx.ALIGN_CENTER_HORIZONTAL) self.layout_finish() - self.extra_info.SetLabel("No registration is required - just enter an address and press Start.") + self.extra_info.SetLabel(_("No registration is required - just enter an address and press Start.")) self.txt_pass.SetValue('poclbm-gui') self.user_lbl.SetLabel("Address:") add_tooltip(self.txt_username, - "Your receiving address for Bitcoins.\nE.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc") + _("Your receiving address for Bitcoins.\nE.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc")) def layout_slush(self): """Slush's pool uses a separate username for each miner.""" @@ -1247,9 +1268,9 @@ def layout_slush(self): self.layout_finish() add_tooltip(self.txt_username, - "Your miner username (not your account username).\nExample: Kiv.GPU") + _("Your miner username (not your account username).\nExample: Kiv.GPU")) add_tooltip(self.txt_pass, - "Your miner password (not your account password).") + _("Your miner password (not your account password).")) def layout_btcmine(self): self.set_widgets_visible([self.host_lbl, self.txt_host, @@ -1263,9 +1284,9 @@ def layout_btcmine(self): self.layout_finish() add_tooltip(self.txt_username, - "Your miner username. \nExample: kiv123@kiv123") + _("Your miner username. \nExample: kiv123@kiv123")) add_tooltip(self.txt_pass, - "Your miner password (not your account password).") + _("Your miner password (not your account password).")) def layout_deepbit(self): """Deepbit uses an email address for a username.""" @@ -1278,8 +1299,8 @@ def layout_deepbit(self): self.layout_balance(row=row+3) self.layout_finish() add_tooltip(self.txt_username, - "The e-mail address you registered with.") - self.user_lbl.SetLabel("Email:") + _("The e-mail address you registered with.")) + self.user_lbl.SetLabel(_("Email:")) # End server specific code ########################## @@ -1294,7 +1315,7 @@ def __init__(self, *args, **kwds): # Set up notebook context menu notebook_menu = wx.Menu() ID_RENAME = wx.NewId() - notebook_menu.Append(ID_RENAME, "&Rename...", _("Rename this miner")) + notebook_menu.Append(ID_RENAME, _("&Rename..."), _("Rename this miner")) self.nb.SetRightClickMenu(notebook_menu) self.Bind(wx.EVT_MENU, self.rename_miner, id=ID_RENAME) @@ -1324,15 +1345,15 @@ def __init__(self, *args, **kwds): ID_SUMMARY, ID_CONSOLE = wx.NewId(), wx.NewId() view_menu = wx.Menu() - view_menu.Append(ID_SUMMARY, _("Show summary"), "Show summary of all miners", wx.ITEM_NORMAL) - view_menu.Append(ID_CONSOLE, _("Show console"), "Show console logs", wx.ITEM_NORMAL) + view_menu.Append(ID_SUMMARY, _("Show summary"), _("Show summary of all miners"), wx.ITEM_NORMAL) + view_menu.Append(ID_CONSOLE, _("Show console"), _("Show console logs"), wx.ITEM_NORMAL) self.menubar.Append(view_menu, _("&View")) ID_SOLO, ID_PATHS, ID_LAUNCH = wx.NewId(), wx.NewId(), wx.NewId() solo_menu = wx.Menu() - solo_menu.Append(ID_SOLO, "&Create solo password...", _("Configure a user/pass for solo mining"), wx.ITEM_NORMAL) - solo_menu.Append(ID_PATHS, "&Set Bitcoin client path...", _("Set the location of the official Bitcoin client"), wx.ITEM_NORMAL) - solo_menu.Append(ID_LAUNCH, "&Launch Bitcoin client as server", _("Launch the official Bitcoin client as a server for solo mining"), wx.ITEM_NORMAL) + solo_menu.Append(ID_SOLO, _("&Create solo password..."), _("Configure a user/pass for solo mining"), wx.ITEM_NORMAL) + solo_menu.Append(ID_PATHS, _("&Set Bitcoin client path..."), _("Set the location of the official Bitcoin client"), wx.ITEM_NORMAL) + solo_menu.Append(ID_LAUNCH, _("&Launch Bitcoin client as server"), _("Launch the official Bitcoin client as a server for solo mining"), wx.ITEM_NORMAL) self.menubar.Append(solo_menu, _("&Solo utilities")) help_menu = wx.Menu() @@ -1350,7 +1371,7 @@ def __init__(self, *args, **kwds): try: self.tbicon = GUIMinerTaskBarIcon(self) except: - self.tbicon = None # TODO: what happens on Linux? + logging.error(_("Failed to load taskbar icon; continuing.")) self.set_properties() @@ -1358,15 +1379,15 @@ def __init__(self, *args, **kwds): self.devices = get_opencl_devices() except: self.devices = [] - self.message("""No OpenCL devices were found. + self.message(_("""No OpenCL devices were found. If you only want to mine using CPU or CUDA, you can ignore this message. If you want to mine on ATI graphics cards, you may need to install the ATI Stream SDK, or your GPU may not support OpenCL. -""", - "No OpenCL devices found.", +"""), + _("No OpenCL devices found."), wx.OK | wx.ICON_INFORMATION) file_menu.Enable(wx.ID_NEW, False) - file_menu.SetHelpString(wx.ID_NEW, "OpenCL not found - can't add a OpenCL miner") + file_menu.SetHelpString(wx.ID_NEW, _("OpenCL not found - can't add a OpenCL miner")) self.Bind(wx.EVT_MENU, self.name_new_profile, id=wx.ID_NEW) self.Bind(wx.EVT_MENU, self.new_external_profile, id=ID_NEW_EXTERNAL) @@ -1390,9 +1411,9 @@ def __init__(self, *args, **kwds): def set_properties(self): self.SetIcons(get_icon_bundle()) - self.SetTitle(_("poclbm-gui - v" + __version__)) + self.SetTitle(_("GUIMiner - v%s") % __version__) self.statusbar.SetStatusWidths([-1, 125]) - statusbar_fields = [_(""), _("Not started")] + statusbar_fields = [_(""), STR_NOT_STARTED] for i in range(len(statusbar_fields)): self.statusbar.SetStatusText(statusbar_fields[i], i) @@ -1435,7 +1456,7 @@ def name_new_profile(self, event=None, extra_profile_data={}): dialog = wx.TextEntryDialog(self, "Name this miner:", "New miner") if dialog.ShowModal() == wx.ID_OK: name = dialog.GetValue().strip() - if not name: name = "Untitled" + if not name: name = _("Untitled") data = extra_profile_data.copy() data['name'] = name self.add_profile(data) @@ -1446,9 +1467,9 @@ def new_external_profile(self, event): On Windows we validate against legal miners; on Linux they can pick whatever they want. """ - wildcard = 'External miner (*.exe)|*.exe' if sys.platform == 'win32' else '*.*' + wildcard = _('External miner (*.exe)|*.exe') if sys.platform == 'win32' else '*.*' dialog = wx.FileDialog(self, - "Select external miner:", + _("Select external miner:"), defaultDir=os.path.join(get_module_path(), 'miners'), defaultFile="", wildcard=wildcard, @@ -1458,9 +1479,9 @@ def new_external_profile(self, event): if sys.platform == 'win32' and dialog.GetFilename() not in SUPPORTED_BACKENDS: self.message( - "Unsupported external miner %s. Supported are: %s" % ( + _("Unsupported external miner %s. Supported are: %s") % ( dialog.GetFilename(), '\n'.join(SUPPORTED_BACKENDS)), - "Miner not supported", wx.OK | wx.ICON_ERROR) + _("Miner not supported"), wx.OK | wx.ICON_ERROR) return path = os.path.join(dialog.GetDirectory(), dialog.GetFilename()) dialog.Destroy() @@ -1486,7 +1507,7 @@ def on_close(self, event): event.Veto() else: if any(p.is_modified for p in self.profile_panels): - dialog = wx.MessageDialog(self, 'Do you want to save changes?', 'Save', + dialog = wx.MessageDialog(self, _('Do you want to save changes?'), _('Save'), wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION) retval = dialog.ShowModal() dialog.Destroy() @@ -1514,17 +1535,17 @@ def save_config(self, event=None): show_summary=self.is_summary_visible(), profiles=profile_data, bitcoin_executable=self.bitcoin_executable) - logger.debug('Saving: ' + json.dumps(config_data)) + logger.debug(_('Saving: ') + json.dumps(config_data)) try: with open(config_filename, 'w') as f: json.dump(config_data, f, indent=4) except IOError: - self.message("Couldn't write save file %s." - "\nCheck the location is writable." % config_filename, - "Save unsuccessful", wx.OK | wx.ICON_ERROR) + self.message( + _("Couldn't write save file %s.\nCheck the location is writable.") % config_filename, + _("Save unsuccessful"), wx.OK | wx.ICON_ERROR) else: - self.message("Profiles saved OK to %s." % config_filename, - "Save successful", wx.OK | wx.ICON_INFORMATION) + self.message(_("Profiles saved OK to %s.") % config_filename, + _("Save successful"), wx.OK | wx.ICON_INFORMATION) for p in self.profile_panels: p.on_saved() @@ -1532,11 +1553,11 @@ def load_config(self, event=None): """Load JSON profile info from the config file.""" config_data = {} - _, config_filename = self.get_storage_location() + config_filename = self.get_storage_location()[1] if os.path.exists(config_filename): with open(config_filename) as f: config_data.update(json.load(f)) - logger.debug('Loaded: ' + json.dumps(config_data)) + logger.debug(_('Loaded: %s') % json.dumps(config_data)) executable = config_data.get('bitcoin_executable', None) if executable is not None: @@ -1545,8 +1566,8 @@ def load_config(self, event=None): # Shut down any existing miners before they get clobbered if(any(p.is_mining for p in self.profile_panels)): result = self.message( - "Loading profiles will stop any currently running miners. Continue?", - "Load profile", wx.YES_NO | wx.NO_DEFAULT | wx.ICON_INFORMATION) + _("Loading profiles will stop any currently running miners. Continue?"), + _("Load profile"), wx.YES_NO | wx.NO_DEFAULT | wx.ICON_INFORMATION) if result == wx.ID_NO: return for p in reversed(self.profile_panels): @@ -1573,10 +1594,11 @@ def load_config(self, event=None): def set_official_client_path(self, event): """Set the path to the official Bitcoin client.""" + wildcard = "bitcoin.exe" if sys.platform == 'win32' else '*.*' dialog = wx.FileDialog(self, - "Select path to Bitcoin.exe", + _("Select path to Bitcoin.exe"), defaultFile="bitcoin.exe", - wildcard="bitcoin.exe", + wildcard=wildcard, style=wx.OPEN) if dialog.ShowModal() == wx.ID_OK: path = os.path.join(dialog.GetDirectory(), dialog.GetFilename()) @@ -1586,7 +1608,7 @@ def set_official_client_path(self, event): def show_about_dialog(self, event): """Show the 'about' dialog.""" - dialog = AboutGuiminer(self, -1, 'About') + dialog = AboutGuiminer(self, -1, _('About')) dialog.ShowModal() dialog.Destroy() @@ -1612,7 +1634,8 @@ def on_page_closing(self, event): if p.is_mining: result = self.message( - "Closing this miner will stop it. Continue?", "Close miner", + _("Closing this miner will stop it. Continue?"), + _("Close miner"), wx.YES_NO | wx.NO_DEFAULT | wx.ICON_INFORMATION) if result == wx.ID_NO: event.Veto() @@ -1641,12 +1664,12 @@ def launch_solo_server(self, event): subprocess.Popen(self.bitcoin_executable + " -server") except OSError: self.message( - "Couldn't find Bitcoin at %s. Is your path set correctly?" % self.bitcoin_executable, - "Launch failed", wx.ICON_ERROR | wx.OK) + _("Couldn't find Bitcoin at %s. Is your path set correctly?") % self.bitcoin_executable, + _("Launch failed"), wx.ICON_ERROR | wx.OK) return self.message( - "Client launched ok. You can start a miner now with the server set to 'solo'.", - "Launched ok.", + _("Client launched ok. You can start a miner now with the server set to 'solo'."), + _("Launched ok."), wx.OK) def create_solo_password(self, event): @@ -1655,15 +1678,19 @@ def create_solo_password(self, event): These are required to connect to the client over JSON-RPC and are stored in 'bitcoin.conf'. """ - filename = os.path.join(os.getenv("APPDATA"), "Bitcoin", "bitcoin.conf") + if sys.platform == 'win32': + filename = os.path.join(os.getenv("APPDATA"), "Bitcoin", "bitcoin.conf") + else: # Assume Linux for now TODO test + filename = os.path.join(os.getenv('HOME'), ".bitcoin") if os.path.exists(filename): - result = self.message("%s already exists. Overwrite?" % filename, - "bitcoin.conf already exists.", + result = self.message( + _("%s already exists. Overwrite?") % filename, + _("bitcoin.conf already exists."), wx.YES_NO | wx.NO_DEFAULT | wx.ICON_INFORMATION) if result == wx.ID_NO: return - dialog = SoloPasswordRequest(self, 'Enter password') + dialog = SoloPasswordRequest(self, _('Enter password')) result = dialog.ShowModal() dialog.Destroy() if result == wx.ID_CANCEL: @@ -1673,7 +1700,7 @@ def create_solo_password(self, event): f.write('\nrpcuser=%s\nrpcpassword=%s' % dialog.get_value()) f.close() - self.message("Wrote bitcoin.conf ok.", "Success", wx.OK) + self.message(_("Wrote bitcoin config ok."), _("Success"), wx.OK) def is_console_visible(self): """Return True if the console is visible.""" @@ -1684,7 +1711,7 @@ def show_console(self, event=None): if self.is_console_visible(): return # Console already shown self.console_panel = ConsolePanel(self) - self.nb.AddPage(self.console_panel, "Console") + self.nb.AddPage(self.console_panel, _("Console")) self.nb.EnsureVisible(self.nb.GetPageCount() - 1) def is_summary_visible(self): @@ -1696,7 +1723,7 @@ def show_summary(self, event=None): if self.is_summary_visible(): return self.summary_panel = SummaryPanel(self) - self.nb.AddPage(self.summary_panel, "Summary") + self.nb.AddPage(self.summary_panel, _("Summary")) index = self.nb.GetPageIndex(self.summary_panel) self.nb.SetSelection(index) @@ -1709,7 +1736,7 @@ def rename_miner(self, event): if p not in self.profile_panels: return - dialog = wx.TextEntryDialog(self, "Rename to:", "Rename miner") + dialog = wx.TextEntryDialog(self, _("Rename to:"), _("Rename miner")) if dialog.ShowModal() == wx.ID_OK: p.set_name(dialog.GetValue().strip()) @@ -1719,9 +1746,9 @@ def __init__(self, parent, title): style = wx.DEFAULT_DIALOG_STYLE vbox = wx.BoxSizer(wx.VERTICAL) wx.Dialog.__init__(self, parent, -1, title, style=style) - self.user_lbl = wx.StaticText(self, -1, _("Username:")) + self.user_lbl = wx.StaticText(self, -1, STR_USERNAME) self.txt_username = wx.TextCtrl(self, -1, _("")) - self.pass_lbl = wx.StaticText(self, -1, _("Password:")) + self.pass_lbl = wx.StaticText(self, -1, STR_PASSWORD) self.txt_pass = wx.TextCtrl(self, -1, _(""), style=wx.TE_PASSWORD) grid_sizer_1 = wx.FlexGridSizer(2, 2, 5, 5) grid_sizer_1.Add(self.user_lbl, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) @@ -1741,16 +1768,16 @@ def get_value(self): class BalanceAuthRequest(wx.Dialog): """Dialog prompting user for an auth token to refresh their balance.""" instructions = \ -"""Click the link below to log in to the pool and get a special token. +_("""Click the link below to log in to the pool and get a special token. This token lets you securely check your balance. -To remember this token for the future, save your miner settings.""" +To remember this token for the future, save your miner settings.""") def __init__(self, parent, url): style = wx.DEFAULT_DIALOG_STYLE vbox = wx.BoxSizer(wx.VERTICAL) - wx.Dialog.__init__(self, parent, -1, "Refresh balance", style=style) + wx.Dialog.__init__(self, parent, -1, STR_REFRESH_BALANCE, style=style) self.instructions = wx.StaticText(self, -1, BalanceAuthRequest.instructions) self.website = hyperlink.HyperLinkCtrl(self, -1, url) - self.txt_token = wx.TextCtrl(self, -1, "(Paste token here)") + self.txt_token = wx.TextCtrl(self, -1, _("(Paste token here)")) buttons = self.CreateButtonSizer(wx.OK | wx.CANCEL) vbox.AddMany([ @@ -1775,7 +1802,7 @@ def __init__(self, parent, id, title): text = ABOUT_TEXT % (__version__, AboutGuiminer.donation_address) self.about_text = wx.StaticText(self, -1, text) - self.copy_btn = wx.Button(self, -1, "Copy address to clipboard") + self.copy_btn = wx.Button(self, -1, _("Copy address to clipboard")) vbox.Add(self.about_text) vbox.Add(self.copy_btn, 0, wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_HORIZONTAL, 0) self.SetSizer(vbox) @@ -1789,22 +1816,12 @@ def on_copy(self, event): data.SetText(AboutGuiminer.donation_address) wx.TheClipboard.SetData(data) wx.TheClipboard.Close() - - -if __name__ == "__main__": - import gettext - gettext.install("app") # replace with the appropriate catalog name - - global USE_MOCK - USE_MOCK = '--mock' in sys.argv - - try: - app = wx.PySimpleApp(0) - wx.InitAllImageHandlers() - frame_1 = GUIMiner(None, -1, "") - app.SetTopWindow(frame_1) - frame_1.Show() - app.MainLoop() - except: - logging.exception("Exception:") - raise + +try: + frame_1 = GUIMiner(None, -1, "") + app.SetTopWindow(frame_1) + frame_1.Show() + app.MainLoop() +except: + logging.exception("Exception:") + raise From 978af206d572e7ffb233030ed5f74e1e3f445c43 Mon Sep 17 00:00:00 2001 From: Kiv Date: Wed, 20 Apr 2011 07:53:17 -0300 Subject: [PATCH 072/190] Add po_to_mo tool to help translator. --- guiminer.py | 2 +- po_to_mo.py | 20 ++++++++++++++++++++ setup.py | 2 +- 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 po_to_mo.py diff --git a/guiminer.py b/guiminer.py index 42c3bd1..c5b9d5f 100644 --- a/guiminer.py +++ b/guiminer.py @@ -17,7 +17,7 @@ from wx.lib.agw import hyperlink from wx.lib.newevent import NewEvent -__version__ = '2011-04-16' +__version__ = '2011-04-19' def get_module_path(): """Return the folder containing this script (or its .exe).""" diff --git a/po_to_mo.py b/po_to_mo.py new file mode 100644 index 0000000..5da3f2e --- /dev/null +++ b/po_to_mo.py @@ -0,0 +1,20 @@ +import os, sys + +import polib + +def get_module_path(): + """Return the folder containing this script (or its .exe).""" + module_name = sys.executable if hasattr(sys, 'frozen') else __file__ + abs_path = os.path.abspath(module_name) + return os.path.dirname(abs_path) + +po = polib.pofile('guiminer_ru.po') +path = os.path.join(get_module_path(), 'locale', 'ru', 'LC_MESSAGES', 'guiminer.mo') +try: + po.save_as_mofile(path) +except: + print "Couldn't save file" + raise +else: + print "Save OK. Press any key to continue." + raw_input() diff --git a/setup.py b/setup.py index 93f6f90..c889e2b 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ 'icon_resources': [(0, "logo.ico")] } ], - console=['poclbm.py'], + console=['poclbm.py', 'po_to_mo.py'], # OpenCL.dll is vendor specific options=dict(py2exe=dict( dll_excludes=['OpenCL.dll'], From c05551ad2c1a1901c21efd5714ee0b5c7f567114 Mon Sep 17 00:00:00 2001 From: Kiv Date: Wed, 20 Apr 2011 21:36:53 -0300 Subject: [PATCH 073/190] Add Russian .po file. Use dictionary for string formatting instead of positional arguments to permit reordering of arguments. --- guiminer.py | 60 +++-- guiminer_ru.po | 675 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 710 insertions(+), 25 deletions(-) create mode 100644 guiminer_ru.po diff --git a/guiminer.py b/guiminer.py index c5b9d5f..de27da0 100644 --- a/guiminer.py +++ b/guiminer.py @@ -17,7 +17,7 @@ from wx.lib.agw import hyperlink from wx.lib.newevent import NewEvent -__version__ = '2011-04-19' +__version__ = '2011-04-20' def get_module_path(): """Return the folder containing this script (or its .exe).""" @@ -25,11 +25,11 @@ def get_module_path(): abs_path = os.path.abspath(module_name) return os.path.dirname(abs_path) -global USE_MOCK USE_MOCK = '--mock' in sys.argv # Set up localization; requires the app to be created app = wx.PySimpleApp(0) -wx.InitAllImageHandlers() +wx.InitAllImageHandlers() + locale = wx.Locale(wx.LANGUAGE_RUSSIAN) locale.AddCatalogLookupPathPrefix(os.path.join(get_module_path(), "locale")) locale.AddCatalog("guiminer") @@ -39,7 +39,7 @@ def get_module_path(): ABOUT_TEXT = _( """GUIMiner -Version: %s +Version: %(version)s GUI by Chris 'Kiv' MacLeod Original poclbm miner by m0mchil @@ -51,7 +51,7 @@ def get_module_path(): If you enjoyed this software, support its development by donating to: -%s +%(address)s Even a single Bitcoin is appreciated and helps motivate further work on this software. @@ -62,11 +62,14 @@ def get_module_path(): STR_STARTING = _("Starting...") STR_STOPPED = _("Stopped") STR_PAUSED = _("Paused") -STR_MINING = _("%s mining!") +STR_START_MINING = _("Start mining!") +STR_STOP_MINING = _("Stop mining") STR_REFRESH_BALANCE = _("Refresh balance") STR_CONNECTION_ERROR = _("Connection error") STR_USERNAME = _("Username:") STR_PASSWORD = _("Password:") +STR_QUIT = _("Quit this program") +STR_ABOUT = _("Show about dialog") # Alternate backends that we know how to call SUPPORTED_BACKENDS = [ @@ -171,11 +174,12 @@ def http_request(hostname, *args): """Do a HTTP request and return the response data.""" try: conn = httplib.HTTPConnection(hostname) - logger.debug(_("Requesting balance: %s"), str(args)) + logger.debug(_("Requesting balance: %(request)s"), request=args) conn.request(*args) response = conn.getresponse() data = response.read() - logger.debug(_("Server replied: %s, %s"), str(response.status), data) + logger.debug(_("Server replied: %(status)s, %(data)s"), + status=str(response.status), data=data) return data finally: conn.close() @@ -386,7 +390,8 @@ def run(self): else: # Possible error or new message, just pipe it through event = UpdateStatusEvent(text=line) - logger.info(_('Listener for "%s": %s'), self.parent_name, line) + logger.info(_('Listener for "%(name)s": %(line)s'), + name=self.parent_name, line=line) wx.PostEvent(self.parent, event) logger.info(_('Listener for "%s" shutting down'), self.parent_name) @@ -467,7 +472,7 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): self.txt_external, self.external_lbl] - self.start = wx.Button(self, -1, _("Start mining!")) + self.start = wx.Button(self, -1, STR_START_MINING) self.device_listbox.SetSelection(0) self.server.SetStringSelection(self.defaults.get('default_server')) @@ -609,6 +614,9 @@ def get_start_stop_state(self): """Return appropriate text for the start/stop button.""" return _("Stop") if self.is_mining else _("Start") + def get_start_label(self): + return STR_STOP_MINING if self.is_mining else STR_START_MINING + def update_summary(self): """Update our summary fields if possible.""" if not self.summary_panel: @@ -767,7 +775,7 @@ def start_mining(self): self.miner_listener.start() self.is_mining = True self.set_status(STR_STARTING, 1) - self.start.SetLabel(STR_MINING % self.get_start_stop_state()) + self.start.SetLabel(self.get_start_label()) def on_close(self): """Prepare to close gracefully.""" @@ -790,7 +798,7 @@ def stop_mining(self): self.is_mining = False self.is_paused = False self.set_status(STR_STOPPED, 1) - self.start.SetLabel(STR_MINING % self.get_start_stop_state()) + self.start.SetLabel(self.get_start_label()) def update_khash(self, rate): """Update our rate according to a report from the listener thread. @@ -807,8 +815,9 @@ def update_khash(self, rate): def update_statusbar(self): """Show the shares or equivalent on the statusbar.""" if self.is_solo: - text = _("Difficulty 1 hashes: %d %s") % \ - (self.accepted_shares, self.format_last_update_time()) + text = _("Difficulty 1 hashes: %(nhashes)d %(update_time)s") % \ + dict(nhashes=self.accepted_shares, + update_time=self.format_last_update_time()) if self.solo_blocks_found > 0: block_text = _("Blocks: %d, ") % self.solo_blocks_found text = block_text + text @@ -1251,7 +1260,7 @@ def layout_bitpenny(self): self.extra_info.SetLabel(_("No registration is required - just enter an address and press Start.")) self.txt_pass.SetValue('poclbm-gui') - self.user_lbl.SetLabel("Address:") + self.user_lbl.SetLabel(_("Address:")) add_tooltip(self.txt_username, _("Your receiving address for Bitcoins.\nE.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc")) @@ -1340,7 +1349,7 @@ def __init__(self, *args, **kwds): file_menu.Append(ID_NEW_EXTERNAL, _("New &other miner..."), _("Create a CPU or CUDA miner (requires external program)"), wx.ITEM_NORMAL) file_menu.Append(wx.ID_SAVE, _("&Save settings"), _("Save your settings"), wx.ITEM_NORMAL) file_menu.Append(wx.ID_OPEN, _("&Load settings"), _("Load stored settings"), wx.ITEM_NORMAL) - file_menu.Append(wx.ID_EXIT, "", "", wx.ITEM_NORMAL) + file_menu.Append(wx.ID_EXIT, "", STR_QUIT, wx.ITEM_NORMAL) self.menubar.Append(file_menu, _("&File")) ID_SUMMARY, ID_CONSOLE = wx.NewId(), wx.NewId() @@ -1355,9 +1364,9 @@ def __init__(self, *args, **kwds): solo_menu.Append(ID_PATHS, _("&Set Bitcoin client path..."), _("Set the location of the official Bitcoin client"), wx.ITEM_NORMAL) solo_menu.Append(ID_LAUNCH, _("&Launch Bitcoin client as server"), _("Launch the official Bitcoin client as a server for solo mining"), wx.ITEM_NORMAL) self.menubar.Append(solo_menu, _("&Solo utilities")) - + help_menu = wx.Menu() - help_menu.Append(wx.ID_ABOUT, _("&About/Donate..."), "", wx.ITEM_NORMAL) + help_menu.Append(wx.ID_ABOUT, _("&About/Donate..."), STR_ABOUT, wx.ITEM_NORMAL) self.menubar.Append(help_menu, _("&Help")) self.SetMenuBar(self.menubar) @@ -1413,7 +1422,7 @@ def set_properties(self): self.SetIcons(get_icon_bundle()) self.SetTitle(_("GUIMiner - v%s") % __version__) self.statusbar.SetStatusWidths([-1, 125]) - statusbar_fields = [_(""), STR_NOT_STARTED] + statusbar_fields = ["", STR_NOT_STARTED] for i in range(len(statusbar_fields)): self.statusbar.SetStatusText(statusbar_fields[i], i) @@ -1453,7 +1462,7 @@ def message(self, *args, **kwargs): def name_new_profile(self, event=None, extra_profile_data={}): """Prompt for the new miner's name.""" - dialog = wx.TextEntryDialog(self, "Name this miner:", "New miner") + dialog = wx.TextEntryDialog(self, _("Name this miner:"), _("New miner")) if dialog.ShowModal() == wx.ID_OK: name = dialog.GetValue().strip() if not name: name = _("Untitled") @@ -1479,8 +1488,8 @@ def new_external_profile(self, event): if sys.platform == 'win32' and dialog.GetFilename() not in SUPPORTED_BACKENDS: self.message( - _("Unsupported external miner %s. Supported are: %s") % ( - dialog.GetFilename(), '\n'.join(SUPPORTED_BACKENDS)), + _("Unsupported external miner %(filename)s. Supported are: %(supported)s") % \ + dict(filename=dialog.GetFilename(), supported='\n'.join(SUPPORTED_BACKENDS)), _("Miner not supported"), wx.OK | wx.ICON_ERROR) return path = os.path.join(dialog.GetDirectory(), dialog.GetFilename()) @@ -1747,9 +1756,9 @@ def __init__(self, parent, title): vbox = wx.BoxSizer(wx.VERTICAL) wx.Dialog.__init__(self, parent, -1, title, style=style) self.user_lbl = wx.StaticText(self, -1, STR_USERNAME) - self.txt_username = wx.TextCtrl(self, -1, _("")) + self.txt_username = wx.TextCtrl(self, -1, "") self.pass_lbl = wx.StaticText(self, -1, STR_PASSWORD) - self.txt_pass = wx.TextCtrl(self, -1, _(""), style=wx.TE_PASSWORD) + self.txt_pass = wx.TextCtrl(self, -1, "", style=wx.TE_PASSWORD) grid_sizer_1 = wx.FlexGridSizer(2, 2, 5, 5) grid_sizer_1.Add(self.user_lbl, 0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_1.Add(self.txt_username, 0, wx.EXPAND, 0) @@ -1800,7 +1809,8 @@ def __init__(self, parent, id, title): wx.Dialog.__init__(self, parent, id, title) vbox = wx.BoxSizer(wx.VERTICAL) - text = ABOUT_TEXT % (__version__, AboutGuiminer.donation_address) + text = ABOUT_TEXT % dict(version=__version__, + address=AboutGuiminer.donation_address) self.about_text = wx.StaticText(self, -1, text) self.copy_btn = wx.Button(self, -1, _("Copy address to clipboard")) vbox.Add(self.about_text) diff --git a/guiminer_ru.po b/guiminer_ru.po new file mode 100644 index 0000000..790ec5d --- /dev/null +++ b/guiminer_ru.po @@ -0,0 +1,675 @@ +msgid "" +msgstr "" +"Project-Id-Version: guiminer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-04-20 21:30-0300\n" +"PO-Revision-Date: 2011-04-20 19:55-0400\n" +"Last-Translator: Chris MacLeod \n" +"Language-Team: Russian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: guiminer.py:40 +#, python-format +msgid "" +"GUIMiner\n" +"\n" +"Version: %(version)s\n" +"\n" +"GUI by Chris 'Kiv' MacLeod\n" +"Original poclbm miner by m0mchil\n" +"Original rpcminer by puddinpop\n" +"\n" +"Get the source code or file issues at GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"If you enjoyed this software, support its development\n" +"by donating to:\n" +"\n" +"%(address)s\n" +"\n" +"Even a single Bitcoin is appreciated and helps motivate\n" +"further work on this software.\n" +msgstr "" +"GUIMiner\n" +"\n" +"Версия: %(version)s\n" +"\n" +"Автор GUI: Chris 'Kiv' MacLeod\n" +"Автор poclbm miner: m0mchil\n" +"Автор rpcminer: puddinpop\n" +"\n" +"Исходники и файлы доступны на GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"Если вам понравилась программа - поддержите её развитие\n" +"переведите деньги на:\n" +"\n" +"%(address)s\n" +"\n" +"Даже один Биткоин полезен и помогает мотивировать\n" +"дальнейшую работу над этой программой.\n" + +#: guiminer.py:61 +msgid "Not started" +msgstr "Не запущен" + +#: guiminer.py:62 +msgid "Starting..." +msgstr "Запускается..." + +#: guiminer.py:63 +msgid "Stopped" +msgstr "Остановлен" + +#: guiminer.py:64 +msgid "Paused" +msgstr "Пауза" + +#: guiminer.py:65 +msgid "Start mining!" +msgstr "Старт генерации" + +#: guiminer.py:66 +msgid "Stop mining" +msgstr "" + +#: guiminer.py:67 +msgid "Refresh balance" +msgstr "Проверить баланс" + +#: guiminer.py:68 +msgid "Connection error" +msgstr "Ошибка связи" + +#: guiminer.py:69 +msgid "Username:" +msgstr "Логин:" + +#: guiminer.py:70 +msgid "Password:" +msgstr "Пароль:" + +#: guiminer.py:71 +msgid "Quit this program" +msgstr "" + +#: guiminer.py:72 +msgid "Show about dialog" +msgstr "" + +#: guiminer.py:147 +#, python-format +msgid "%.1f Ghash/s" +msgstr "%.1f Ghash/s" + +#: guiminer.py:149 +#, python-format +msgid "%.1f Mhash/s" +msgstr "%.1f Mhash/s" + +#: guiminer.py:151 +msgid "Connecting..." +msgstr "Соединяемся..." + +#: guiminer.py:153 +#, python-format +msgid "%d khash/s" +msgstr "%d khash/s" + +#: guiminer.py:177 +#, python-format +msgid "Requesting balance: %(request)s" +msgstr "Запрашивается баланс: %(request)s" + +#: guiminer.py:181 +#, python-format +msgid "Server replied: %(status)s, %(data)s" +msgstr "Ответ сервера: %(status)s, %(data)s" + +#: guiminer.py:232 +msgid "Miner" +msgstr "Генератор" + +#: guiminer.py:233 +msgid "Speed" +msgstr "Скорость" + +#: guiminer.py:234 +msgid "Accepted" +msgstr "Принято" + +#: guiminer.py:235 +msgid "Stale" +msgstr "Сбой" + +#: guiminer.py:236 +msgid "Start/Stop" +msgstr "Старт/Стоп" + +#: guiminer.py:237 +msgid "Autostart" +msgstr "Автостарт" + +#: guiminer.py:321 +msgid "Pause all" +msgstr "Приостановить все" + +#: guiminer.py:323 +msgid "Restore" +msgstr "Восстановить" + +#: guiminer.py:324 +msgid "Close" +msgstr "Закрыть" + +#: guiminer.py:378 +#, python-format +msgid "Listener for \"%s\" started" +msgstr "Прослушивание \"%s\" начато" + +#: guiminer.py:393 +#, python-format +msgid "Listener for \"%(name)s\": %(line)s" +msgstr "Прослушивание \"%(name)s\": %(line)s" + +#: guiminer.py:396 +#, python-format +msgid "Listener for \"%s\" shutting down" +msgstr "Прослушивание \"%s\" завершается" + +#: guiminer.py:427 +msgid "Server:" +msgstr "Сервер:" + +#: guiminer.py:432 +msgid "Website:" +msgstr "Вэбсайт:" + +#: guiminer.py:434 +msgid "Ext. Path:" +msgstr "Вншн. путь:" + +#: guiminer.py:436 +msgid "Host:" +msgstr "Хост:" + +#: guiminer.py:438 +msgid "Port:" +msgstr "Порт:" + +#: guiminer.py:444 +msgid "Device:" +msgstr "Устройство:" + +#: guiminer.py:445 +msgid "No OpenCL devices" +msgstr "Нет OPENCL устройств" + +#: guiminer.py:446 +msgid "Extra flags:" +msgstr "Доп. параметры:" + +#: guiminer.py:449 +msgid "Balance:" +msgstr "Баланс:" + +#: guiminer.py:453 +msgid "Withdraw" +msgstr "Снять деньги" + +#: guiminer.py:568 +msgid "Default" +msgstr "По умолчанию" + +#: guiminer.py:615 +msgid "Start" +msgstr "Старт" + +#: guiminer.py:615 +msgid "Stop" +msgstr "Стоп" + +#: guiminer.py:631 +msgid "Connection problems" +msgstr "Сбой связи" + +#: guiminer.py:766 +msgid "Running command: " +msgstr "Выполняется команда: " + +#: guiminer.py:818 +#, python-format +msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" +msgstr "Хэши сложности 1: %(nhashes)d %(update_time)s" + +#: guiminer.py:822 +#, python-format +msgid "Blocks: %d, " +msgstr "Блоки: %d, " + +#: guiminer.py:825 +#, python-format +msgid "Shares: %d accepted" +msgstr "Доли: %d приняты" + +#: guiminer.py:827 +#, python-format +msgid ", %d stale/invalid" +msgstr ", %d дубли/сбойные" + +#: guiminer.py:849 +#, python-format +msgid "- last at %s" +msgstr "- последняя в %s" + +#: guiminer.py:922 +msgid "" +"Server to connect to. Different servers have different fees and features.\n" +"Check their websites for full information." +msgstr "" +"Сервер для подключения. Разные серверы имеют разные возможности и взимаемый процент.\n" +"Подробней смотрите на их сайтах." + +#: guiminer.py:923 +msgid "Website of the currently selected server. Click to visit." +msgstr "Вэбсайт выбранного сервера. Нажмите чтобы открыть." + +#: guiminer.py:924 +msgid "Available OpenCL devices on your system." +msgstr "OpenCL устройства, доступные на вашей системе." + +#: guiminer.py:925 +msgid "Host address, without http:// prefix." +msgstr "Адрес Хоста, без http:// префикса." + +#: guiminer.py:926 +msgid "Server port. This is usually 8332." +msgstr "Порт сервера. Обычно 8332." + +#: guiminer.py:927 +msgid "" +"The miner's username.\n" +"May be different than your account username.\n" +"Example: Kiv.GPU" +msgstr "" +"Логин генератора (miner username).\n" +"Может отличаться от логина вашего аккаунта.\n" +"Пример: Kiv.GPU" + +#: guiminer.py:928 +msgid "" +"The miner's password.\n" +"May be different than your account password." +msgstr "" +"Пароль генератора (miner password).\n" +"Может отличаться от пароля вашего аккаунта." + +#: guiminer.py:929 +msgid "" +"Extra flags to pass to the miner.\n" +"For Radeon HD 5xxx series use -v -w128 for best results.\n" +"For other cards consult the forum." +msgstr "" +"Доп. параметры передаваемые генератору.\n" +"Для лучших результатов на Радеонах HD 5xxx серий, используйте -v -w128.\n" +"По поводу других видеокарт - проверьте форум." + +#: guiminer.py:1010 +#, python-format +msgid "%s confirmed" +msgstr "%s подтверждено" + +#: guiminer.py:1012 +#, python-format +msgid ", %s unconfirmed" +msgstr ", %s не подтверждено" + +#: guiminer.py:1014 +msgid "Bad response from server." +msgstr "Неправильный ответ сервера." + +#: guiminer.py:1103 +msgid "Withdraw OK" +msgstr "Выплата произведена" + +#: guiminer.py:1261 +msgid "No registration is required - just enter an address and press Start." +msgstr "Регистрации не требуется - введите ваш счет и нажмите Старт." + +#: guiminer.py:1263 +msgid "Address:" +msgstr "" + +#: guiminer.py:1265 +msgid "" +"Your receiving address for Bitcoins.\n" +"E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" +msgstr "" +"Ваш счет для получения Биткоинов.\n" +"Пример: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" + +#: guiminer.py:1280 +msgid "" +"Your miner username (not your account username).\n" +"Example: Kiv.GPU" +msgstr "" +"Логин генератора (miner username), может отличаться от логина аккаунта.\n" +"Пример: Kiv.GPU" + +#: guiminer.py:1282 guiminer.py:1298 +msgid "Your miner password (not your account password)." +msgstr "Пароль генератора, может отличаться от пароля аккаунта ." + +#: guiminer.py:1296 +msgid "" +"Your miner username. \n" +"Example: kiv123@kiv123" +msgstr "" +"Логин генератора. \n" +"Например: kiv123@kiv123" + +#: guiminer.py:1311 +msgid "The e-mail address you registered with." +msgstr "Эл. почта под которой вы зарегистрировались." + +#: guiminer.py:1312 +msgid "Email:" +msgstr "Эмэйл:" + +#: guiminer.py:1327 +msgid "&Rename..." +msgstr "&Переименовать..." + +#: guiminer.py:1327 +msgid "Rename this miner" +msgstr "Переименовать этот генератор" + +#: guiminer.py:1348 +msgid "&New OpenCL miner..." +msgstr "&Создать OpenCL генератор..." + +#: guiminer.py:1348 +msgid "Create a new miner profile" +msgstr "Создать новый профиль генератора" + +#: guiminer.py:1349 +msgid "Create a CPU or CUDA miner (requires external program)" +msgstr "Создать CPU или CUDA генератор (требуется дополнительный софт)" + +#: guiminer.py:1349 +msgid "New &other miner..." +msgstr "Создать &другой генератор..." + +#: guiminer.py:1350 +msgid "&Save settings" +msgstr "&Сохранить настройки" + +#: guiminer.py:1350 +msgid "Save your settings" +msgstr "Сохранить текущие настройки генераторов" + +#: guiminer.py:1351 +msgid "&Load settings" +msgstr "&Загрузить настройки" + +#: guiminer.py:1351 +msgid "Load stored settings" +msgstr "Загрузить сохраненные настройки генераторов" + +#: guiminer.py:1353 +msgid "&File" +msgstr "&Файл" + +#: guiminer.py:1357 +msgid "Show summary" +msgstr "Показать итоги" + +#: guiminer.py:1357 +msgid "Show summary of all miners" +msgstr "Показать таблицу со всеми генераторами" + +#: guiminer.py:1358 +msgid "Show console" +msgstr "Показать консоль" + +#: guiminer.py:1358 +msgid "Show console logs" +msgstr "Показывает лог консоли" + +#: guiminer.py:1359 +msgid "&View" +msgstr "&Вид" + +#: guiminer.py:1363 +msgid "&Create solo password..." +msgstr "&Создать соло пароль..." + +#: guiminer.py:1363 +msgid "Configure a user/pass for solo mining" +msgstr "Настроить логин/пароль для генерирования в одиночку (без пула)" + +#: guiminer.py:1364 +msgid "&Set Bitcoin client path..." +msgstr "&Путь к клиенту Bitcoin..." + +#: guiminer.py:1364 +msgid "Set the location of the official Bitcoin client" +msgstr "Указать путь к официальному клиенту Bitcoin." + +#: guiminer.py:1365 +msgid "&Launch Bitcoin client as server" +msgstr "&Запустить Bitcoin клиент как сервер" + +#: guiminer.py:1365 +msgid "Launch the official Bitcoin client as a server for solo mining" +msgstr "Запустить официальный Bitcoin клиент в режиме сервера для одиночного генерирования" + +#: guiminer.py:1366 +msgid "&Solo utilities" +msgstr "&Соло режим" + +#: guiminer.py:1369 +msgid "&About/Donate..." +msgstr "&О программе/Помочь..." + +#: guiminer.py:1371 +msgid "&Help" +msgstr "&Помощь" + +#: guiminer.py:1383 +msgid "Failed to load taskbar icon; continuing." +msgstr "Не удалось загрузить иконку таскбара; продолжаю...." + +#: guiminer.py:1391 +msgid "" +"No OpenCL devices were found.\n" +"If you only want to mine using CPU or CUDA, you can ignore this message.\n" +"If you want to mine on ATI graphics cards, you may need to install the ATI Stream\n" +"SDK, or your GPU may not support OpenCL.\n" +msgstr "" +"Не обнаружено OpenCL устройств.\n" +"Если вы собирались генерировать используя CPU или CUDA, игнорируйте это сообщение.\n" +"Если вы хотите генерировать на видеокартах ATI, нужно установить ATI Stream\n" +"SDK. Или возможно, ваша карта не поддерживает OpenCL.\n" + +#: guiminer.py:1396 +msgid "No OpenCL devices found." +msgstr "Не обнаружено OpenCL устройств." + +#: guiminer.py:1399 +msgid "OpenCL not found - can't add a OpenCL miner" +msgstr "OpenCL не обнаружен - нельзя добавить OpenCL генератор" + +#: guiminer.py:1423 +#, python-format +msgid "GUIMiner - v%s" +msgstr "GUIMiner - v%s" + +#: guiminer.py:1465 +msgid "Name this miner:" +msgstr "" + +#: guiminer.py:1465 +msgid "New miner" +msgstr "" + +#: guiminer.py:1468 +msgid "Untitled" +msgstr "Без имени" + +#: guiminer.py:1479 +msgid "External miner (*.exe)|*.exe" +msgstr "Внешний генератор (*.exe)|*.exe" + +#: guiminer.py:1481 +msgid "Select external miner:" +msgstr "Выберите внешний генератор:" + +#: guiminer.py:1491 +#, python-format +msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" +msgstr "Неподдерживаемый внешний генератор %(filename)s. Поддерживаемые: %(supported)s" + +#: guiminer.py:1493 +msgid "Miner not supported" +msgstr "Генератор не поддерживается" + +#: guiminer.py:1519 +msgid "Do you want to save changes?" +msgstr "Сохранить настройки?" + +#: guiminer.py:1519 +msgid "Save" +msgstr "Сохранить" + +#: guiminer.py:1547 +msgid "Saving: " +msgstr "Сохранение: " + +#: guiminer.py:1553 +#, python-format +msgid "" +"Couldn't write save file %s.\n" +"Check the location is writable." +msgstr "" +"Не могу записать файл %s.\n" +"Проверьте, не указан ли для целевой папки параметр \"только для чтения" + +#: guiminer.py:1554 +msgid "Save unsuccessful" +msgstr "Сохранение не удалось" + +#: guiminer.py:1556 +#, python-format +msgid "Profiles saved OK to %s." +msgstr "Профили успешно сохранены в %s." + +#: guiminer.py:1557 +msgid "Save successful" +msgstr "Сохранение успешно" + +#: guiminer.py:1569 +#, python-format +msgid "Loaded: %s" +msgstr "Загружено: %s" + +#: guiminer.py:1578 +msgid "Loading profiles will stop any currently running miners. Continue?" +msgstr "Загрузка настроек остановит все текущие генераторы. Продолжить?" + +#: guiminer.py:1579 +msgid "Load profile" +msgstr "Загрузить настройки" + +#: guiminer.py:1608 +msgid "Select path to Bitcoin.exe" +msgstr "Указать расположение Bitcoin.exe" + +#: guiminer.py:1620 +msgid "About" +msgstr "О программе" + +#: guiminer.py:1646 +msgid "Closing this miner will stop it. Continue?" +msgstr "Закрытие генератора остановит его. Продолжить?" + +#: guiminer.py:1647 +msgid "Close miner" +msgstr "Закрыть генератор" + +#: guiminer.py:1676 +#, python-format +msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" +msgstr "Не могу найти Bitcoin в %s. Путь указан правильно?" + +#: guiminer.py:1677 +msgid "Launch failed" +msgstr "Сбой запуска" + +#: guiminer.py:1680 +msgid "Client launched ok. You can start a miner now with the server set to 'solo'." +msgstr "Клиент успешно запущен. Можно запустить генератор с указанием на \"Соло\" сервер." + +#: guiminer.py:1681 +msgid "Launched ok." +msgstr "Успешно запущено." + +#: guiminer.py:1696 +#, python-format +msgid "%s already exists. Overwrite?" +msgstr "%s Уже существует. Перезаписать?" + +#: guiminer.py:1697 +msgid "bitcoin.conf already exists." +msgstr "bitcoin.conf уже существует." + +#: guiminer.py:1702 +msgid "Enter password" +msgstr "Введите пароль" + +#: guiminer.py:1712 +msgid "Success" +msgstr "Успешно" + +#: guiminer.py:1712 +msgid "Wrote bitcoin config ok." +msgstr "bitcoin.conf успешно записан." + +#: guiminer.py:1723 +msgid "Console" +msgstr "Консоль" + +#: guiminer.py:1735 +msgid "Summary" +msgstr "Итог" + +#: guiminer.py:1748 +msgid "Rename miner" +msgstr "Переименовать генератор" + +#: guiminer.py:1748 +msgid "Rename to:" +msgstr "Переименовать в:" + +#: guiminer.py:1780 +msgid "" +"Click the link below to log in to the pool and get a special token. \n" +"This token lets you securely check your balance.\n" +"To remember this token for the future, save your miner settings." +msgstr "" +"Нажмите ссылку ниже, чтобы войти в пул и получить специальный код (API token). \n" +"Этот код позволяет проверять состояние баланса.\n" +"При сохранении настроек, код сохраняется." + +#: guiminer.py:1789 +msgid "(Paste token here)" +msgstr "(Копируйте код сюда)" + +#: guiminer.py:1815 +msgid "Copy address to clipboard" +msgstr "Копировать адрес в буфер обмена" + +#~ msgid "%s mining!" +#~ msgstr "%s генерации" From 929d9843ba877783f3cd9f4403f13b06e3381aa4 Mon Sep 17 00:00:00 2001 From: Kiv Date: Wed, 20 Apr 2011 21:45:05 -0300 Subject: [PATCH 074/190] Add gitignore and messages.pot --- .gitignore | 3 + messages.pot | 635 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 638 insertions(+) create mode 100644 .gitignore create mode 100644 messages.pot diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..49ece72 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.pyc +.project +.pydevproject \ No newline at end of file diff --git a/messages.pot b/messages.pot new file mode 100644 index 0000000..d376734 --- /dev/null +++ b/messages.pot @@ -0,0 +1,635 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-04-20 21:30-0300\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: 8bit\n" + +#: guiminer.py:40 +#, python-format +msgid "" +"GUIMiner\n" +"\n" +"Version: %(version)s\n" +"\n" +"GUI by Chris 'Kiv' MacLeod\n" +"Original poclbm miner by m0mchil\n" +"Original rpcminer by puddinpop\n" +"\n" +"Get the source code or file issues at GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"If you enjoyed this software, support its development\n" +"by donating to:\n" +"\n" +"%(address)s\n" +"\n" +"Even a single Bitcoin is appreciated and helps motivate\n" +"further work on this software.\n" +msgstr "" + +#: guiminer.py:61 +msgid "Not started" +msgstr "" + +#: guiminer.py:62 +msgid "Starting..." +msgstr "" + +#: guiminer.py:63 +msgid "Stopped" +msgstr "" + +#: guiminer.py:64 +msgid "Paused" +msgstr "" + +#: guiminer.py:65 +msgid "Start mining!" +msgstr "" + +#: guiminer.py:66 +msgid "Stop mining" +msgstr "" + +#: guiminer.py:67 +msgid "Refresh balance" +msgstr "" + +#: guiminer.py:68 +msgid "Connection error" +msgstr "" + +#: guiminer.py:69 +msgid "Username:" +msgstr "" + +#: guiminer.py:70 +msgid "Password:" +msgstr "" + +#: guiminer.py:71 +msgid "Quit this program" +msgstr "" + +#: guiminer.py:72 +msgid "Show about dialog" +msgstr "" + +#: guiminer.py:147 +#, python-format +msgid "%.1f Ghash/s" +msgstr "" + +#: guiminer.py:149 +#, python-format +msgid "%.1f Mhash/s" +msgstr "" + +#: guiminer.py:151 +msgid "Connecting..." +msgstr "" + +#: guiminer.py:153 +#, python-format +msgid "%d khash/s" +msgstr "" + +#: guiminer.py:177 +#, python-format +msgid "Requesting balance: %(request)s" +msgstr "" + +#: guiminer.py:181 +#, python-format +msgid "Server replied: %(status)s, %(data)s" +msgstr "" + +#: guiminer.py:232 +msgid "Miner" +msgstr "" + +#: guiminer.py:233 +msgid "Speed" +msgstr "" + +#: guiminer.py:234 +msgid "Accepted" +msgstr "" + +#: guiminer.py:235 +msgid "Stale" +msgstr "" + +#: guiminer.py:236 +msgid "Start/Stop" +msgstr "" + +#: guiminer.py:237 +msgid "Autostart" +msgstr "" + +#: guiminer.py:321 +msgid "Pause all" +msgstr "" + +#: guiminer.py:323 +msgid "Restore" +msgstr "" + +#: guiminer.py:324 +msgid "Close" +msgstr "" + +#: guiminer.py:378 +#, python-format +msgid "Listener for \"%s\" started" +msgstr "" + +#: guiminer.py:393 +#, python-format +msgid "Listener for \"%(name)s\": %(line)s" +msgstr "" + +#: guiminer.py:396 +#, python-format +msgid "Listener for \"%s\" shutting down" +msgstr "" + +#: guiminer.py:427 +msgid "Server:" +msgstr "" + +#: guiminer.py:432 +msgid "Website:" +msgstr "" + +#: guiminer.py:434 +msgid "Ext. Path:" +msgstr "" + +#: guiminer.py:436 +msgid "Host:" +msgstr "" + +#: guiminer.py:438 +msgid "Port:" +msgstr "" + +#: guiminer.py:444 +msgid "Device:" +msgstr "" + +#: guiminer.py:445 +msgid "No OpenCL devices" +msgstr "" + +#: guiminer.py:446 +msgid "Extra flags:" +msgstr "" + +#: guiminer.py:449 +msgid "Balance:" +msgstr "" + +#: guiminer.py:453 +msgid "Withdraw" +msgstr "" + +#: guiminer.py:568 +msgid "Default" +msgstr "" + +#: guiminer.py:615 +msgid "Start" +msgstr "" + +#: guiminer.py:615 +msgid "Stop" +msgstr "" + +#: guiminer.py:631 +msgid "Connection problems" +msgstr "" + +#: guiminer.py:766 +msgid "Running command: " +msgstr "" + +#: guiminer.py:818 +#, python-format +msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" +msgstr "" + +#: guiminer.py:822 +#, python-format +msgid "Blocks: %d, " +msgstr "" + +#: guiminer.py:825 +#, python-format +msgid "Shares: %d accepted" +msgstr "" + +#: guiminer.py:827 +#, python-format +msgid ", %d stale/invalid" +msgstr "" + +#: guiminer.py:849 +#, python-format +msgid "- last at %s" +msgstr "" + +#: guiminer.py:922 +msgid "" +"Server to connect to. Different servers have different fees and features.\n" +"Check their websites for full information." +msgstr "" + +#: guiminer.py:923 +msgid "Website of the currently selected server. Click to visit." +msgstr "" + +#: guiminer.py:924 +msgid "Available OpenCL devices on your system." +msgstr "" + +#: guiminer.py:925 +msgid "Host address, without http:// prefix." +msgstr "" + +#: guiminer.py:926 +msgid "Server port. This is usually 8332." +msgstr "" + +#: guiminer.py:927 +msgid "" +"The miner's username.\n" +"May be different than your account username.\n" +"Example: Kiv.GPU" +msgstr "" + +#: guiminer.py:928 +msgid "" +"The miner's password.\n" +"May be different than your account password." +msgstr "" + +#: guiminer.py:929 +msgid "" +"Extra flags to pass to the miner.\n" +"For Radeon HD 5xxx series use -v -w128 for best results.\n" +"For other cards consult the forum." +msgstr "" + +#: guiminer.py:1010 +#, python-format +msgid "%s confirmed" +msgstr "" + +#: guiminer.py:1012 +#, python-format +msgid ", %s unconfirmed" +msgstr "" + +#: guiminer.py:1014 +msgid "Bad response from server." +msgstr "" + +#: guiminer.py:1103 +msgid "Withdraw OK" +msgstr "" + +#: guiminer.py:1261 +msgid "No registration is required - just enter an address and press Start." +msgstr "" + +#: guiminer.py:1263 +msgid "Address:" +msgstr "" + +#: guiminer.py:1265 +msgid "" +"Your receiving address for Bitcoins.\n" +"E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" +msgstr "" + +#: guiminer.py:1280 +msgid "" +"Your miner username (not your account username).\n" +"Example: Kiv.GPU" +msgstr "" + +#: guiminer.py:1282 guiminer.py:1298 +msgid "Your miner password (not your account password)." +msgstr "" + +#: guiminer.py:1296 +msgid "" +"Your miner username. \n" +"Example: kiv123@kiv123" +msgstr "" + +#: guiminer.py:1311 +msgid "The e-mail address you registered with." +msgstr "" + +#: guiminer.py:1312 +msgid "Email:" +msgstr "" + +#: guiminer.py:1327 +msgid "&Rename..." +msgstr "" + +#: guiminer.py:1327 +msgid "Rename this miner" +msgstr "" + +#: guiminer.py:1348 +msgid "&New OpenCL miner..." +msgstr "" + +#: guiminer.py:1348 +msgid "Create a new miner profile" +msgstr "" + +#: guiminer.py:1349 +msgid "Create a CPU or CUDA miner (requires external program)" +msgstr "" + +#: guiminer.py:1349 +msgid "New &other miner..." +msgstr "" + +#: guiminer.py:1350 +msgid "&Save settings" +msgstr "" + +#: guiminer.py:1350 +msgid "Save your settings" +msgstr "" + +#: guiminer.py:1351 +msgid "&Load settings" +msgstr "" + +#: guiminer.py:1351 +msgid "Load stored settings" +msgstr "" + +#: guiminer.py:1353 +msgid "&File" +msgstr "" + +#: guiminer.py:1357 +msgid "Show summary" +msgstr "" + +#: guiminer.py:1357 +msgid "Show summary of all miners" +msgstr "" + +#: guiminer.py:1358 +msgid "Show console" +msgstr "" + +#: guiminer.py:1358 +msgid "Show console logs" +msgstr "" + +#: guiminer.py:1359 +msgid "&View" +msgstr "" + +#: guiminer.py:1363 +msgid "&Create solo password..." +msgstr "" + +#: guiminer.py:1363 +msgid "Configure a user/pass for solo mining" +msgstr "" + +#: guiminer.py:1364 +msgid "&Set Bitcoin client path..." +msgstr "" + +#: guiminer.py:1364 +msgid "Set the location of the official Bitcoin client" +msgstr "" + +#: guiminer.py:1365 +msgid "&Launch Bitcoin client as server" +msgstr "" + +#: guiminer.py:1365 +msgid "Launch the official Bitcoin client as a server for solo mining" +msgstr "" + +#: guiminer.py:1366 +msgid "&Solo utilities" +msgstr "" + +#: guiminer.py:1369 +msgid "&About/Donate..." +msgstr "" + +#: guiminer.py:1371 +msgid "&Help" +msgstr "" + +#: guiminer.py:1383 +msgid "Failed to load taskbar icon; continuing." +msgstr "" + +#: guiminer.py:1391 +msgid "" +"No OpenCL devices were found.\n" +"If you only want to mine using CPU or CUDA, you can ignore this message.\n" +"If you want to mine on ATI graphics cards, you may need to install the ATI Stream\n" +"SDK, or your GPU may not support OpenCL.\n" +msgstr "" + +#: guiminer.py:1396 +msgid "No OpenCL devices found." +msgstr "" + +#: guiminer.py:1399 +msgid "OpenCL not found - can't add a OpenCL miner" +msgstr "" + +#: guiminer.py:1423 +#, python-format +msgid "GUIMiner - v%s" +msgstr "" + +#: guiminer.py:1465 +msgid "Name this miner:" +msgstr "" + +#: guiminer.py:1465 +msgid "New miner" +msgstr "" + +#: guiminer.py:1468 +msgid "Untitled" +msgstr "" + +#: guiminer.py:1479 +msgid "External miner (*.exe)|*.exe" +msgstr "" + +#: guiminer.py:1481 +msgid "Select external miner:" +msgstr "" + +#: guiminer.py:1491 +#, python-format +msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" +msgstr "" + +#: guiminer.py:1493 +msgid "Miner not supported" +msgstr "" + +#: guiminer.py:1519 +msgid "Do you want to save changes?" +msgstr "" + +#: guiminer.py:1519 +msgid "Save" +msgstr "" + +#: guiminer.py:1547 +msgid "Saving: " +msgstr "" + +#: guiminer.py:1553 +#, python-format +msgid "" +"Couldn't write save file %s.\n" +"Check the location is writable." +msgstr "" + +#: guiminer.py:1554 +msgid "Save unsuccessful" +msgstr "" + +#: guiminer.py:1556 +#, python-format +msgid "Profiles saved OK to %s." +msgstr "" + +#: guiminer.py:1557 +msgid "Save successful" +msgstr "" + +#: guiminer.py:1569 +#, python-format +msgid "Loaded: %s" +msgstr "" + +#: guiminer.py:1578 +msgid "Loading profiles will stop any currently running miners. Continue?" +msgstr "" + +#: guiminer.py:1579 +msgid "Load profile" +msgstr "" + +#: guiminer.py:1608 +msgid "Select path to Bitcoin.exe" +msgstr "" + +#: guiminer.py:1620 +msgid "About" +msgstr "" + +#: guiminer.py:1646 +msgid "Closing this miner will stop it. Continue?" +msgstr "" + +#: guiminer.py:1647 +msgid "Close miner" +msgstr "" + +#: guiminer.py:1676 +#, python-format +msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" +msgstr "" + +#: guiminer.py:1677 +msgid "Launch failed" +msgstr "" + +#: guiminer.py:1680 +msgid "Client launched ok. You can start a miner now with the server set to 'solo'." +msgstr "" + +#: guiminer.py:1681 +msgid "Launched ok." +msgstr "" + +#: guiminer.py:1696 +#, python-format +msgid "%s already exists. Overwrite?" +msgstr "" + +#: guiminer.py:1697 +msgid "bitcoin.conf already exists." +msgstr "" + +#: guiminer.py:1702 +msgid "Enter password" +msgstr "" + +#: guiminer.py:1712 +msgid "Success" +msgstr "" + +#: guiminer.py:1712 +msgid "Wrote bitcoin config ok." +msgstr "" + +#: guiminer.py:1723 +msgid "Console" +msgstr "" + +#: guiminer.py:1735 +msgid "Summary" +msgstr "" + +#: guiminer.py:1748 +msgid "Rename miner" +msgstr "" + +#: guiminer.py:1748 +msgid "Rename to:" +msgstr "" + +#: guiminer.py:1780 +msgid "" +"Click the link below to log in to the pool and get a special token. \n" +"This token lets you securely check your balance.\n" +"To remember this token for the future, save your miner settings." +msgstr "" + +#: guiminer.py:1789 +msgid "(Paste token here)" +msgstr "" + +#: guiminer.py:1815 +msgid "Copy address to clipboard" +msgstr "" From aa985fe4a9213eb85cf8fa70d93273a5880c83c7 Mon Sep 17 00:00:00 2001 From: Kiv Date: Tue, 26 Apr 2011 19:19:01 -0300 Subject: [PATCH 075/190] Fix exception raised by bad arguments to logger. Update translation. --- guiminer.py | 8 ++++---- guiminer_ru.po | 20 ++++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/guiminer.py b/guiminer.py index de27da0..1eb08e8 100644 --- a/guiminer.py +++ b/guiminer.py @@ -174,12 +174,12 @@ def http_request(hostname, *args): """Do a HTTP request and return the response data.""" try: conn = httplib.HTTPConnection(hostname) - logger.debug(_("Requesting balance: %(request)s"), request=args) + logger.debug(_("Requesting balance: %(request)s"), dict(request=args)) conn.request(*args) response = conn.getresponse() data = response.read() logger.debug(_("Server replied: %(status)s, %(data)s"), - status=str(response.status), data=data) + dict(status=str(response.status), data=data)) return data finally: conn.close() @@ -391,7 +391,7 @@ def run(self): # Possible error or new message, just pipe it through event = UpdateStatusEvent(text=line) logger.info(_('Listener for "%(name)s": %(line)s'), - name=self.parent_name, line=line) + dict(name=self.parent_name, line=line)) wx.PostEvent(self.parent, event) logger.info(_('Listener for "%s" shutting down'), self.parent_name) @@ -1349,7 +1349,7 @@ def __init__(self, *args, **kwds): file_menu.Append(ID_NEW_EXTERNAL, _("New &other miner..."), _("Create a CPU or CUDA miner (requires external program)"), wx.ITEM_NORMAL) file_menu.Append(wx.ID_SAVE, _("&Save settings"), _("Save your settings"), wx.ITEM_NORMAL) file_menu.Append(wx.ID_OPEN, _("&Load settings"), _("Load stored settings"), wx.ITEM_NORMAL) - file_menu.Append(wx.ID_EXIT, "", STR_QUIT, wx.ITEM_NORMAL) + file_menu.Append(wx.ID_EXIT, _("Quit"), STR_QUIT, wx.ITEM_NORMAL) self.menubar.Append(file_menu, _("&File")) ID_SUMMARY, ID_CONSOLE = wx.NewId(), wx.NewId() diff --git a/guiminer_ru.po b/guiminer_ru.po index 790ec5d..77bd817 100644 --- a/guiminer_ru.po +++ b/guiminer_ru.po @@ -69,11 +69,11 @@ msgstr "Пауза" #: guiminer.py:65 msgid "Start mining!" -msgstr "Старт генерации" +msgstr "Старт!" #: guiminer.py:66 msgid "Stop mining" -msgstr "" +msgstr "Стоп!" #: guiminer.py:67 msgid "Refresh balance" @@ -93,11 +93,11 @@ msgstr "Пароль:" #: guiminer.py:71 msgid "Quit this program" -msgstr "" +msgstr "Выход из программы" #: guiminer.py:72 msgid "Show about dialog" -msgstr "" +msgstr "Показать информацию о программе" #: guiminer.py:147 #, python-format @@ -205,7 +205,7 @@ msgstr "Устройство:" #: guiminer.py:445 msgid "No OpenCL devices" -msgstr "Нет OPENCL устройств" +msgstr "Нет OpenCL устройств" #: guiminer.py:446 msgid "Extra flags:" @@ -336,11 +336,11 @@ msgstr "Выплата произведена" #: guiminer.py:1261 msgid "No registration is required - just enter an address and press Start." -msgstr "Регистрации не требуется - введите ваш счет и нажмите Старт." +msgstr "Регистрации не требуется - введите ваш адрес и нажмите Старт." #: guiminer.py:1263 msgid "Address:" -msgstr "" +msgstr "Адрес:" #: guiminer.py:1265 msgid "" @@ -436,7 +436,7 @@ msgstr "Показать консоль" #: guiminer.py:1358 msgid "Show console logs" -msgstr "Показывает лог консоли" +msgstr "Показать лог консоли" #: guiminer.py:1359 msgid "&View" @@ -509,11 +509,11 @@ msgstr "GUIMiner - v%s" #: guiminer.py:1465 msgid "Name this miner:" -msgstr "" +msgstr "Назовите генератор:" #: guiminer.py:1465 msgid "New miner" -msgstr "" +msgstr "Новый генератор" #: guiminer.py:1468 msgid "Untitled" From c989d1691bbc872585f3238b2f0f3e53fc53f0a0 Mon Sep 17 00:00:00 2001 From: Kiv Date: Thu, 28 Apr 2011 21:39:58 -0300 Subject: [PATCH 076/190] Add language menu to switch languages --- guiminer.py | 118 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 100 insertions(+), 18 deletions(-) diff --git a/guiminer.py b/guiminer.py index 1eb08e8..075b6ca 100644 --- a/guiminer.py +++ b/guiminer.py @@ -17,7 +17,7 @@ from wx.lib.agw import hyperlink from wx.lib.newevent import NewEvent -__version__ = '2011-04-20' +__version__ = '2011-04-26' def get_module_path(): """Return the folder containing this script (or its .exe).""" @@ -30,11 +30,13 @@ def get_module_path(): app = wx.PySimpleApp(0) wx.InitAllImageHandlers() -locale = wx.Locale(wx.LANGUAGE_RUSSIAN) -locale.AddCatalogLookupPathPrefix(os.path.join(get_module_path(), "locale")) -locale.AddCatalog("guiminer") _ = wx.GetTranslation +LANGUAGES = { + "English": wx.LANGUAGE_ENGLISH, + "Russian": wx.LANGUAGE_RUSSIAN +} +LANGUAGES_REVERSE = dict((v,k) for (k,v) in LANGUAGES.items()) ABOUT_TEXT = _( """GUIMiner @@ -1248,6 +1250,7 @@ def layout_bitpenny(self): invisible = [self.txt_pass, self.txt_host, self.txt_port, self.pass_lbl, self.host_lbl, self.port_lbl] self.set_widgets_visible(invisible, False) + self.set_widgets_visible([self.extra_info], True) row = self.layout_init() self.layout_server_and_website(row=row) @@ -1268,7 +1271,7 @@ def layout_slush(self): """Slush's pool uses a separate username for each miner.""" self.set_widgets_visible([self.host_lbl, self.txt_host, self.port_lbl, self.txt_port, - self.withdraw], False) + self.withdraw, self.extra_info], False) row = self.layout_init() self.layout_server_and_website(row=row) self.layout_user_and_pass(row=row+1) @@ -1284,7 +1287,7 @@ def layout_slush(self): def layout_btcmine(self): self.set_widgets_visible([self.host_lbl, self.txt_host, self.port_lbl, self.txt_port, - self.withdraw], False) + self.withdraw, self.extra_info], False) row = self.layout_init() self.layout_server_and_website(row=row) self.layout_user_and_pass(row=row+1) @@ -1300,7 +1303,8 @@ def layout_btcmine(self): def layout_deepbit(self): """Deepbit uses an email address for a username.""" self.set_widgets_visible([self.host_lbl, self.txt_host, - self.port_lbl, self.txt_port], False) + self.port_lbl, self.txt_port, + self.extra_info], False) row = self.layout_init() self.layout_server_and_website(row=row) self.layout_user_and_pass(row=row+1) @@ -1318,6 +1322,10 @@ def layout_deepbit(self): class GUIMiner(wx.Frame): def __init__(self, *args, **kwds): wx.Frame.__init__(self, *args, **kwds) + self.locale = None + + self.load_language() + style = fnb.FNB_X_ON_TAB | fnb.FNB_FF2 | fnb.FNB_HIDE_ON_SINGLE_TAB self.nb = fnb.FlatNotebook(self, -1, style=style) @@ -1364,6 +1372,11 @@ def __init__(self, *args, **kwds): solo_menu.Append(ID_PATHS, _("&Set Bitcoin client path..."), _("Set the location of the official Bitcoin client"), wx.ITEM_NORMAL) solo_menu.Append(ID_LAUNCH, _("&Launch Bitcoin client as server"), _("Launch the official Bitcoin client as a server for solo mining"), wx.ITEM_NORMAL) self.menubar.Append(solo_menu, _("&Solo utilities")) + + ID_CHANGE_LANGUAGE = wx.NewId() + lang_menu = wx.Menu() + lang_menu.Append(ID_CHANGE_LANGUAGE, "&Change language...", "", wx.ITEM_NORMAL) + self.menubar.Append(lang_menu, _("Language")) help_menu = wx.Menu() help_menu.Append(wx.ID_ABOUT, _("&About/Donate..."), STR_ABOUT, wx.ITEM_NORMAL) @@ -1409,6 +1422,7 @@ def __init__(self, *args, **kwds): self.Bind(wx.EVT_MENU, self.show_about_dialog, id=wx.ID_ABOUT) self.Bind(wx.EVT_MENU, self.create_solo_password, id=ID_SOLO) self.Bind(wx.EVT_MENU, self.launch_solo_server, id=ID_LAUNCH) + self.Bind(wx.EVT_MENU, self.change_language, id=ID_CHANGE_LANGUAGE) self.Bind(wx.EVT_CLOSE, self.on_close) self.Bind(wx.EVT_ICONIZE, lambda event: self.Hide()) self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CLOSING, self.on_page_closing) @@ -1571,7 +1585,7 @@ def load_config(self, event=None): executable = config_data.get('bitcoin_executable', None) if executable is not None: self.bitcoin_executable = executable - + # Shut down any existing miners before they get clobbered if(any(p.is_mining for p in self.profile_panels)): result = self.message( @@ -1747,7 +1761,70 @@ def rename_miner(self, event): dialog = wx.TextEntryDialog(self, _("Rename to:"), _("Rename miner")) if dialog.ShowModal() == wx.ID_OK: - p.set_name(dialog.GetValue().strip()) + p.set_name(dialog.GetValue().strip()) + + def change_language(self, event): + dialog = ChangeLanguageDialog(self, _('Change language'), self.language) + result = dialog.ShowModal() + dialog.Destroy() + if result == wx.ID_CANCEL: + return + + language_name = dialog.get_value() + self.update_language(LANGUAGES[language_name]) + self.save_language() + + def update_language(self, language): + self.language = language + if self.locale: + del self.locale + + self.locale = wx.Locale(language) + if self.locale.IsOk(): + self.locale.AddCatalogLookupPathPrefix(os.path.join(get_module_path(), "locale")) + self.locale.AddCatalog("guiminer") + else: + self.locale = None + + def load_language(self): + language_config = os.path.join(get_module_path(), 'default_language.ini') + language_data = dict() + if os.path.exists(language_config): + with open(language_config) as f: + language_data.update(json.load(f)) + logger.debug(_('Loaded: %s') % json.dumps(language_data)) + language_str = language_data.get('language', "English") + self.update_language(LANGUAGES.get(language_str, wx.LANGUAGE_ENGLISH)) + + def save_language(self): + language_config = os.path.join(get_module_path(), 'default_language.ini') + language_str = LANGUAGES_REVERSE.get(self.language) + with open(language_config, 'w') as f: + json.dump(dict(language=language_str), f) + +class ChangeLanguageDialog(wx.Dialog): + """Dialog prompting the user to change languages.""" + def __init__(self, parent, title, current_language): + style = wx.DEFAULT_DIALOG_STYLE + vbox = wx.BoxSizer(wx.VERTICAL) + wx.Dialog.__init__(self, parent, -1, title, style=style) + self.lbl = wx.StaticText(self, -1, + _("Choose language (requires restart to take full effect)")) + vbox.Add(self.lbl, 0, wx.ALL, 10) + self.language_choices = wx.ComboBox(self, -1, + choices=sorted(LANGUAGES.keys()), + style=wx.CB_READONLY) + + self.language_choices.SetStringSelection(LANGUAGES_REVERSE[current_language]) + + vbox.Add(self.language_choices, 0, wx.ALL, 10) + buttons = self.CreateButtonSizer(wx.OK | wx.CANCEL) + vbox.Add(buttons, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 10) + self.SetSizerAndFit(vbox) + + def get_value(self): + return self.language_choices.GetStringSelection() + class SoloPasswordRequest(wx.Dialog): """Dialog prompting user for login credentials for solo mining.""" @@ -1826,12 +1903,17 @@ def on_copy(self, event): data.SetText(AboutGuiminer.donation_address) wx.TheClipboard.SetData(data) wx.TheClipboard.Close() - -try: - frame_1 = GUIMiner(None, -1, "") - app.SetTopWindow(frame_1) - frame_1.Show() - app.MainLoop() -except: - logging.exception("Exception:") - raise + +def run(): + try: + frame_1 = GUIMiner(None, -1, "") + app.SetTopWindow(frame_1) + frame_1.Show() + app.MainLoop() + except: + logging.exception("Exception:") + raise + + +if __name__ == "__main__": + run() From 0b0865c70dfc92c73dad7e9a8e645e96394656f7 Mon Sep 17 00:00:00 2001 From: Kiv Date: Thu, 28 Apr 2011 21:41:15 -0300 Subject: [PATCH 077/190] Add README file to distribution. --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index c889e2b..cd83c01 100644 --- a/setup.py +++ b/setup.py @@ -20,4 +20,5 @@ 'logo.ico', 'LICENSE.txt', 'servers.ini', + 'README.txt', 'defaults.ini']) From cca1aec3f777ce6de73c736073bc87d6bd008482 Mon Sep 17 00:00:00 2001 From: Kiv Date: Thu, 28 Apr 2011 21:42:07 -0300 Subject: [PATCH 078/190] Version bump. --- guiminer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index 075b6ca..760b4d5 100644 --- a/guiminer.py +++ b/guiminer.py @@ -17,7 +17,7 @@ from wx.lib.agw import hyperlink from wx.lib.newevent import NewEvent -__version__ = '2011-04-26' +__version__ = '2011-04-28' def get_module_path(): """Return the folder containing this script (or its .exe).""" From 89ffd167e7f87bfed6073527f7af714405ebc0bb Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 1 May 2011 13:27:27 -0300 Subject: [PATCH 079/190] Improve Russian translation; fix issue where some strings would not be translated. --- guiminer.py | 80 ++++++------ guiminer_ru.po | 325 +++++++++++++++++++++++++++---------------------- messages.pot | 298 ++++++++++++++++++++++++--------------------- 3 files changed, 378 insertions(+), 325 deletions(-) diff --git a/guiminer.py b/guiminer.py index 760b4d5..80d00a2 100644 --- a/guiminer.py +++ b/guiminer.py @@ -17,7 +17,7 @@ from wx.lib.agw import hyperlink from wx.lib.newevent import NewEvent -__version__ = '2011-04-28' +__version__ = '2011-05-01' def get_module_path(): """Return the folder containing this script (or its .exe).""" @@ -38,6 +38,38 @@ def get_module_path(): } LANGUAGES_REVERSE = dict((v,k) for (k,v) in LANGUAGES.items()) +locale = None +language = None +def update_language(new_language): + global locale, language + language = new_language + if locale: + del locale + + locale = wx.Locale(language) + if locale.IsOk(): + locale.AddCatalogLookupPathPrefix(os.path.join(get_module_path(), "locale")) + locale.AddCatalog("guiminer") + else: + locale = None + +def load_language(): + language_config = os.path.join(get_module_path(), 'default_language.ini') + language_data = dict() + if os.path.exists(language_config): + with open(language_config) as f: + language_data.update(json.load(f)) + language_str = language_data.get('language', "English") + update_language(LANGUAGES.get(language_str, wx.LANGUAGE_ENGLISH)) + +def save_language(): + language_config = os.path.join(get_module_path(), 'default_language.ini') + language_str = LANGUAGES_REVERSE.get(language) + with open(language_config, 'w') as f: + json.dump(dict(language=language_str), f) + +load_language() + ABOUT_TEXT = _( """GUIMiner @@ -1321,11 +1353,7 @@ def layout_deepbit(self): class GUIMiner(wx.Frame): def __init__(self, *args, **kwds): - wx.Frame.__init__(self, *args, **kwds) - self.locale = None - - self.load_language() - + wx.Frame.__init__(self, *args, **kwds) style = fnb.FNB_X_ON_TAB | fnb.FNB_FF2 | fnb.FNB_HIDE_ON_SINGLE_TAB self.nb = fnb.FlatNotebook(self, -1, style=style) @@ -1375,7 +1403,7 @@ def __init__(self, *args, **kwds): ID_CHANGE_LANGUAGE = wx.NewId() lang_menu = wx.Menu() - lang_menu.Append(ID_CHANGE_LANGUAGE, "&Change language...", "", wx.ITEM_NORMAL) + lang_menu.Append(ID_CHANGE_LANGUAGE, _("&Change language..."), "", wx.ITEM_NORMAL) self.menubar.Append(lang_menu, _("Language")) help_menu = wx.Menu() @@ -1422,7 +1450,7 @@ def __init__(self, *args, **kwds): self.Bind(wx.EVT_MENU, self.show_about_dialog, id=wx.ID_ABOUT) self.Bind(wx.EVT_MENU, self.create_solo_password, id=ID_SOLO) self.Bind(wx.EVT_MENU, self.launch_solo_server, id=ID_LAUNCH) - self.Bind(wx.EVT_MENU, self.change_language, id=ID_CHANGE_LANGUAGE) + self.Bind(wx.EVT_MENU, self.on_change_language, id=ID_CHANGE_LANGUAGE) self.Bind(wx.EVT_CLOSE, self.on_close) self.Bind(wx.EVT_ICONIZE, lambda event: self.Hide()) self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CLOSING, self.on_page_closing) @@ -1763,44 +1791,18 @@ def rename_miner(self, event): if dialog.ShowModal() == wx.ID_OK: p.set_name(dialog.GetValue().strip()) - def change_language(self, event): - dialog = ChangeLanguageDialog(self, _('Change language'), self.language) + def on_change_language(self, event): + dialog = ChangeLanguageDialog(self, _('Change language'), language) result = dialog.ShowModal() dialog.Destroy() if result == wx.ID_CANCEL: return language_name = dialog.get_value() - self.update_language(LANGUAGES[language_name]) - self.save_language() - - def update_language(self, language): - self.language = language - if self.locale: - del self.locale - - self.locale = wx.Locale(language) - if self.locale.IsOk(): - self.locale.AddCatalogLookupPathPrefix(os.path.join(get_module_path(), "locale")) - self.locale.AddCatalog("guiminer") - else: - self.locale = None + update_language(LANGUAGES[language_name]) + save_language() - def load_language(self): - language_config = os.path.join(get_module_path(), 'default_language.ini') - language_data = dict() - if os.path.exists(language_config): - with open(language_config) as f: - language_data.update(json.load(f)) - logger.debug(_('Loaded: %s') % json.dumps(language_data)) - language_str = language_data.get('language', "English") - self.update_language(LANGUAGES.get(language_str, wx.LANGUAGE_ENGLISH)) - - def save_language(self): - language_config = os.path.join(get_module_path(), 'default_language.ini') - language_str = LANGUAGES_REVERSE.get(self.language) - with open(language_config, 'w') as f: - json.dump(dict(language=language_str), f) + class ChangeLanguageDialog(wx.Dialog): """Dialog prompting the user to change languages.""" diff --git a/guiminer_ru.po b/guiminer_ru.po index 77bd817..6057374 100644 --- a/guiminer_ru.po +++ b/guiminer_ru.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-04-20 21:30-0300\n" +"POT-Creation-Date: 2011-05-01 08:49-0300\n" "PO-Revision-Date: 2011-04-20 19:55-0400\n" "Last-Translator: Chris MacLeod \n" "Language-Team: Russian\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: guiminer.py:40 +#: guiminer.py:74 #, python-format msgid "" "GUIMiner\n" @@ -51,244 +51,245 @@ msgstr "" "Даже один Биткоин полезен и помогает мотивировать\n" "дальнейшую работу над этой программой.\n" -#: guiminer.py:61 +#: guiminer.py:95 msgid "Not started" msgstr "Не запущен" -#: guiminer.py:62 +#: guiminer.py:96 msgid "Starting..." msgstr "Запускается..." -#: guiminer.py:63 +#: guiminer.py:97 msgid "Stopped" msgstr "Остановлен" -#: guiminer.py:64 +#: guiminer.py:98 msgid "Paused" msgstr "Пауза" -#: guiminer.py:65 +#: guiminer.py:99 msgid "Start mining!" msgstr "Старт!" -#: guiminer.py:66 +#: guiminer.py:100 msgid "Stop mining" msgstr "Стоп!" -#: guiminer.py:67 +#: guiminer.py:101 msgid "Refresh balance" msgstr "Проверить баланс" -#: guiminer.py:68 +#: guiminer.py:102 msgid "Connection error" msgstr "Ошибка связи" -#: guiminer.py:69 +#: guiminer.py:103 msgid "Username:" msgstr "Логин:" -#: guiminer.py:70 +#: guiminer.py:104 msgid "Password:" msgstr "Пароль:" -#: guiminer.py:71 +#: guiminer.py:105 msgid "Quit this program" msgstr "Выход из программы" -#: guiminer.py:72 +#: guiminer.py:106 msgid "Show about dialog" msgstr "Показать информацию о программе" -#: guiminer.py:147 +#: guiminer.py:181 #, python-format msgid "%.1f Ghash/s" msgstr "%.1f Ghash/s" -#: guiminer.py:149 +#: guiminer.py:183 #, python-format msgid "%.1f Mhash/s" msgstr "%.1f Mhash/s" -#: guiminer.py:151 +#: guiminer.py:185 msgid "Connecting..." msgstr "Соединяемся..." -#: guiminer.py:153 +#: guiminer.py:187 #, python-format msgid "%d khash/s" msgstr "%d khash/s" -#: guiminer.py:177 +#: guiminer.py:211 #, python-format msgid "Requesting balance: %(request)s" msgstr "Запрашивается баланс: %(request)s" -#: guiminer.py:181 +#: guiminer.py:215 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "Ответ сервера: %(status)s, %(data)s" -#: guiminer.py:232 +#: guiminer.py:266 msgid "Miner" msgstr "Генератор" -#: guiminer.py:233 +#: guiminer.py:267 msgid "Speed" msgstr "Скорость" -#: guiminer.py:234 +#: guiminer.py:268 msgid "Accepted" msgstr "Принято" -#: guiminer.py:235 +#: guiminer.py:269 msgid "Stale" msgstr "Сбой" -#: guiminer.py:236 +#: guiminer.py:270 msgid "Start/Stop" msgstr "Старт/Стоп" -#: guiminer.py:237 +#: guiminer.py:271 msgid "Autostart" msgstr "Автостарт" -#: guiminer.py:321 +#: guiminer.py:355 msgid "Pause all" msgstr "Приостановить все" -#: guiminer.py:323 +#: guiminer.py:357 msgid "Restore" msgstr "Восстановить" -#: guiminer.py:324 +#: guiminer.py:358 msgid "Close" msgstr "Закрыть" -#: guiminer.py:378 +#: guiminer.py:412 #, python-format msgid "Listener for \"%s\" started" msgstr "Прослушивание \"%s\" начато" -#: guiminer.py:393 +#: guiminer.py:427 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "Прослушивание \"%(name)s\": %(line)s" -#: guiminer.py:396 +#: guiminer.py:430 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "Прослушивание \"%s\" завершается" -#: guiminer.py:427 +#: guiminer.py:461 msgid "Server:" msgstr "Сервер:" -#: guiminer.py:432 +#: guiminer.py:466 msgid "Website:" msgstr "Вэбсайт:" -#: guiminer.py:434 +#: guiminer.py:468 msgid "Ext. Path:" msgstr "Вншн. путь:" -#: guiminer.py:436 +#: guiminer.py:470 msgid "Host:" msgstr "Хост:" -#: guiminer.py:438 +#: guiminer.py:472 msgid "Port:" msgstr "Порт:" -#: guiminer.py:444 +#: guiminer.py:478 msgid "Device:" msgstr "Устройство:" -#: guiminer.py:445 +#: guiminer.py:479 msgid "No OpenCL devices" msgstr "Нет OpenCL устройств" -#: guiminer.py:446 +#: guiminer.py:480 msgid "Extra flags:" msgstr "Доп. параметры:" -#: guiminer.py:449 +#: guiminer.py:483 msgid "Balance:" msgstr "Баланс:" -#: guiminer.py:453 +#: guiminer.py:487 msgid "Withdraw" msgstr "Снять деньги" -#: guiminer.py:568 +#: guiminer.py:602 msgid "Default" msgstr "По умолчанию" -#: guiminer.py:615 +#: guiminer.py:649 msgid "Start" msgstr "Старт" -#: guiminer.py:615 +#: guiminer.py:649 msgid "Stop" msgstr "Стоп" -#: guiminer.py:631 +#: guiminer.py:665 msgid "Connection problems" msgstr "Сбой связи" -#: guiminer.py:766 +#: guiminer.py:800 msgid "Running command: " msgstr "Выполняется команда: " -#: guiminer.py:818 +#: guiminer.py:852 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "Хэши сложности 1: %(nhashes)d %(update_time)s" -#: guiminer.py:822 +#: guiminer.py:856 #, python-format msgid "Blocks: %d, " msgstr "Блоки: %d, " -#: guiminer.py:825 +#: guiminer.py:859 #, python-format msgid "Shares: %d accepted" msgstr "Доли: %d приняты" -#: guiminer.py:827 +#: guiminer.py:861 #, python-format msgid ", %d stale/invalid" msgstr ", %d дубли/сбойные" -#: guiminer.py:849 +#: guiminer.py:883 #, python-format msgid "- last at %s" msgstr "- последняя в %s" -#: guiminer.py:922 +#: guiminer.py:956 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." msgstr "" -"Сервер для подключения. Разные серверы имеют разные возможности и взимаемый процент.\n" +"Сервер для подключения. Разные серверы имеют разные возможности и взимаемый " +"процент.\n" "Подробней смотрите на их сайтах." -#: guiminer.py:923 +#: guiminer.py:957 msgid "Website of the currently selected server. Click to visit." msgstr "Вэбсайт выбранного сервера. Нажмите чтобы открыть." -#: guiminer.py:924 +#: guiminer.py:958 msgid "Available OpenCL devices on your system." msgstr "OpenCL устройства, доступные на вашей системе." -#: guiminer.py:925 +#: guiminer.py:959 msgid "Host address, without http:// prefix." msgstr "Адрес Хоста, без http:// префикса." -#: guiminer.py:926 +#: guiminer.py:960 msgid "Server port. This is usually 8332." msgstr "Порт сервера. Обычно 8332." -#: guiminer.py:927 +#: guiminer.py:961 msgid "" "The miner's username.\n" "May be different than your account username.\n" @@ -298,7 +299,7 @@ msgstr "" "Может отличаться от логина вашего аккаунта.\n" "Пример: Kiv.GPU" -#: guiminer.py:928 +#: guiminer.py:962 msgid "" "The miner's password.\n" "May be different than your account password." @@ -306,7 +307,7 @@ msgstr "" "Пароль генератора (miner password).\n" "Может отличаться от пароля вашего аккаунта." -#: guiminer.py:929 +#: guiminer.py:963 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" @@ -316,33 +317,33 @@ msgstr "" "Для лучших результатов на Радеонах HD 5xxx серий, используйте -v -w128.\n" "По поводу других видеокарт - проверьте форум." -#: guiminer.py:1010 +#: guiminer.py:1044 #, python-format msgid "%s confirmed" msgstr "%s подтверждено" -#: guiminer.py:1012 +#: guiminer.py:1046 #, python-format msgid ", %s unconfirmed" msgstr ", %s не подтверждено" -#: guiminer.py:1014 +#: guiminer.py:1048 msgid "Bad response from server." msgstr "Неправильный ответ сервера." -#: guiminer.py:1103 +#: guiminer.py:1137 msgid "Withdraw OK" msgstr "Выплата произведена" -#: guiminer.py:1261 +#: guiminer.py:1296 msgid "No registration is required - just enter an address and press Start." msgstr "Регистрации не требуется - введите ваш адрес и нажмите Старт." -#: guiminer.py:1263 +#: guiminer.py:1298 msgid "Address:" msgstr "Адрес:" -#: guiminer.py:1265 +#: guiminer.py:1300 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" @@ -350,7 +351,7 @@ msgstr "" "Ваш счет для получения Биткоинов.\n" "Пример: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" -#: guiminer.py:1280 +#: guiminer.py:1315 msgid "" "Your miner username (not your account username).\n" "Example: Kiv.GPU" @@ -358,11 +359,11 @@ msgstr "" "Логин генератора (miner username), может отличаться от логина аккаунта.\n" "Пример: Kiv.GPU" -#: guiminer.py:1282 guiminer.py:1298 +#: guiminer.py:1317 guiminer.py:1333 msgid "Your miner password (not your account password)." msgstr "Пароль генератора, может отличаться от пароля аккаунта ." -#: guiminer.py:1296 +#: guiminer.py:1331 msgid "" "Your miner username. \n" "Example: kiv123@kiv123" @@ -370,185 +371,203 @@ msgstr "" "Логин генератора. \n" "Например: kiv123@kiv123" -#: guiminer.py:1311 +#: guiminer.py:1347 msgid "The e-mail address you registered with." msgstr "Эл. почта под которой вы зарегистрировались." -#: guiminer.py:1312 +#: guiminer.py:1348 msgid "Email:" msgstr "Эмэйл:" -#: guiminer.py:1327 +#: guiminer.py:1363 msgid "&Rename..." msgstr "&Переименовать..." -#: guiminer.py:1327 +#: guiminer.py:1363 msgid "Rename this miner" msgstr "Переименовать этот генератор" -#: guiminer.py:1348 +#: guiminer.py:1384 msgid "&New OpenCL miner..." msgstr "&Создать OpenCL генератор..." -#: guiminer.py:1348 +#: guiminer.py:1384 msgid "Create a new miner profile" msgstr "Создать новый профиль генератора" -#: guiminer.py:1349 +#: guiminer.py:1385 msgid "Create a CPU or CUDA miner (requires external program)" msgstr "Создать CPU или CUDA генератор (требуется дополнительный софт)" -#: guiminer.py:1349 +#: guiminer.py:1385 msgid "New &other miner..." msgstr "Создать &другой генератор..." -#: guiminer.py:1350 +#: guiminer.py:1386 msgid "&Save settings" msgstr "&Сохранить настройки" -#: guiminer.py:1350 +#: guiminer.py:1386 msgid "Save your settings" msgstr "Сохранить текущие настройки генераторов" -#: guiminer.py:1351 +#: guiminer.py:1387 msgid "&Load settings" msgstr "&Загрузить настройки" -#: guiminer.py:1351 +#: guiminer.py:1387 msgid "Load stored settings" msgstr "Загрузить сохраненные настройки генераторов" -#: guiminer.py:1353 +#: guiminer.py:1388 +msgid "Quit" +msgstr "Выход" + +#: guiminer.py:1389 msgid "&File" msgstr "&Файл" -#: guiminer.py:1357 +#: guiminer.py:1393 msgid "Show summary" msgstr "Показать итоги" -#: guiminer.py:1357 +#: guiminer.py:1393 msgid "Show summary of all miners" msgstr "Показать таблицу со всеми генераторами" -#: guiminer.py:1358 +#: guiminer.py:1394 msgid "Show console" msgstr "Показать консоль" -#: guiminer.py:1358 +#: guiminer.py:1394 msgid "Show console logs" msgstr "Показать лог консоли" -#: guiminer.py:1359 +#: guiminer.py:1395 msgid "&View" msgstr "&Вид" -#: guiminer.py:1363 +#: guiminer.py:1399 msgid "&Create solo password..." msgstr "&Создать соло пароль..." -#: guiminer.py:1363 +#: guiminer.py:1399 msgid "Configure a user/pass for solo mining" msgstr "Настроить логин/пароль для генерирования в одиночку (без пула)" -#: guiminer.py:1364 +#: guiminer.py:1400 msgid "&Set Bitcoin client path..." msgstr "&Путь к клиенту Bitcoin..." -#: guiminer.py:1364 +#: guiminer.py:1400 msgid "Set the location of the official Bitcoin client" msgstr "Указать путь к официальному клиенту Bitcoin." -#: guiminer.py:1365 +#: guiminer.py:1401 msgid "&Launch Bitcoin client as server" msgstr "&Запустить Bitcoin клиент как сервер" -#: guiminer.py:1365 +#: guiminer.py:1401 msgid "Launch the official Bitcoin client as a server for solo mining" -msgstr "Запустить официальный Bitcoin клиент в режиме сервера для одиночного генерирования" +msgstr "" +"Запустить официальный Bitcoin клиент в режиме сервера для одиночного " +"генерирования" -#: guiminer.py:1366 +#: guiminer.py:1402 msgid "&Solo utilities" msgstr "&Соло режим" -#: guiminer.py:1369 +#: guiminer.py:1406 +msgid "&Change language..." +msgstr "Изменить язык..." + +#: guiminer.py:1407 +msgid "Language" +msgstr "Язык" + +#: guiminer.py:1410 msgid "&About/Donate..." msgstr "&О программе/Помочь..." -#: guiminer.py:1371 +#: guiminer.py:1412 msgid "&Help" msgstr "&Помощь" -#: guiminer.py:1383 +#: guiminer.py:1424 msgid "Failed to load taskbar icon; continuing." msgstr "Не удалось загрузить иконку таскбара; продолжаю...." -#: guiminer.py:1391 +#: guiminer.py:1432 msgid "" "No OpenCL devices were found.\n" "If you only want to mine using CPU or CUDA, you can ignore this message.\n" -"If you want to mine on ATI graphics cards, you may need to install the ATI Stream\n" +"If you want to mine on ATI graphics cards, you may need to install the ATI " +"Stream\n" "SDK, or your GPU may not support OpenCL.\n" msgstr "" "Не обнаружено OpenCL устройств.\n" -"Если вы собирались генерировать используя CPU или CUDA, игнорируйте это сообщение.\n" +"Если вы собирались генерировать используя CPU или CUDA, игнорируйте это " +"сообщение.\n" "Если вы хотите генерировать на видеокартах ATI, нужно установить ATI Stream\n" "SDK. Или возможно, ваша карта не поддерживает OpenCL.\n" -#: guiminer.py:1396 +#: guiminer.py:1437 msgid "No OpenCL devices found." msgstr "Не обнаружено OpenCL устройств." -#: guiminer.py:1399 +#: guiminer.py:1440 msgid "OpenCL not found - can't add a OpenCL miner" msgstr "OpenCL не обнаружен - нельзя добавить OpenCL генератор" -#: guiminer.py:1423 +#: guiminer.py:1465 #, python-format msgid "GUIMiner - v%s" msgstr "GUIMiner - v%s" -#: guiminer.py:1465 +#: guiminer.py:1507 msgid "Name this miner:" msgstr "Назовите генератор:" -#: guiminer.py:1465 +#: guiminer.py:1507 msgid "New miner" msgstr "Новый генератор" -#: guiminer.py:1468 +#: guiminer.py:1510 msgid "Untitled" msgstr "Без имени" -#: guiminer.py:1479 +#: guiminer.py:1521 msgid "External miner (*.exe)|*.exe" msgstr "Внешний генератор (*.exe)|*.exe" -#: guiminer.py:1481 +#: guiminer.py:1523 msgid "Select external miner:" msgstr "Выберите внешний генератор:" -#: guiminer.py:1491 +#: guiminer.py:1533 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" -msgstr "Неподдерживаемый внешний генератор %(filename)s. Поддерживаемые: %(supported)s" +msgstr "" +"Неподдерживаемый внешний генератор %(filename)s. Поддерживаемые: %(supported)" +"s" -#: guiminer.py:1493 +#: guiminer.py:1535 msgid "Miner not supported" msgstr "Генератор не поддерживается" -#: guiminer.py:1519 +#: guiminer.py:1561 msgid "Do you want to save changes?" msgstr "Сохранить настройки?" -#: guiminer.py:1519 +#: guiminer.py:1561 msgid "Save" msgstr "Сохранить" -#: guiminer.py:1547 +#: guiminer.py:1589 msgid "Saving: " msgstr "Сохранение: " -#: guiminer.py:1553 +#: guiminer.py:1595 #, python-format msgid "" "Couldn't write save file %s.\n" @@ -557,117 +576,129 @@ msgstr "" "Не могу записать файл %s.\n" "Проверьте, не указан ли для целевой папки параметр \"только для чтения" -#: guiminer.py:1554 +#: guiminer.py:1596 msgid "Save unsuccessful" msgstr "Сохранение не удалось" -#: guiminer.py:1556 +#: guiminer.py:1598 #, python-format msgid "Profiles saved OK to %s." msgstr "Профили успешно сохранены в %s." -#: guiminer.py:1557 +#: guiminer.py:1599 msgid "Save successful" msgstr "Сохранение успешно" -#: guiminer.py:1569 +#: guiminer.py:1611 #, python-format msgid "Loaded: %s" msgstr "Загружено: %s" -#: guiminer.py:1578 +#: guiminer.py:1620 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "Загрузка настроек остановит все текущие генераторы. Продолжить?" -#: guiminer.py:1579 +#: guiminer.py:1621 msgid "Load profile" msgstr "Загрузить настройки" -#: guiminer.py:1608 +#: guiminer.py:1650 msgid "Select path to Bitcoin.exe" msgstr "Указать расположение Bitcoin.exe" -#: guiminer.py:1620 +#: guiminer.py:1662 msgid "About" msgstr "О программе" -#: guiminer.py:1646 +#: guiminer.py:1688 msgid "Closing this miner will stop it. Continue?" msgstr "Закрытие генератора остановит его. Продолжить?" -#: guiminer.py:1647 +#: guiminer.py:1689 msgid "Close miner" msgstr "Закрыть генератор" -#: guiminer.py:1676 +#: guiminer.py:1718 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" msgstr "Не могу найти Bitcoin в %s. Путь указан правильно?" -#: guiminer.py:1677 +#: guiminer.py:1719 msgid "Launch failed" msgstr "Сбой запуска" -#: guiminer.py:1680 -msgid "Client launched ok. You can start a miner now with the server set to 'solo'." -msgstr "Клиент успешно запущен. Можно запустить генератор с указанием на \"Соло\" сервер." +#: guiminer.py:1722 +msgid "" +"Client launched ok. You can start a miner now with the server set to 'solo'." +msgstr "" +"Клиент успешно запущен. Можно запустить генератор с указанием на \"Соло\" " +"сервер." -#: guiminer.py:1681 +#: guiminer.py:1723 msgid "Launched ok." msgstr "Успешно запущено." -#: guiminer.py:1696 +#: guiminer.py:1738 #, python-format msgid "%s already exists. Overwrite?" msgstr "%s Уже существует. Перезаписать?" -#: guiminer.py:1697 +#: guiminer.py:1739 msgid "bitcoin.conf already exists." msgstr "bitcoin.conf уже существует." -#: guiminer.py:1702 +#: guiminer.py:1744 msgid "Enter password" msgstr "Введите пароль" -#: guiminer.py:1712 +#: guiminer.py:1754 msgid "Success" msgstr "Успешно" -#: guiminer.py:1712 +#: guiminer.py:1754 msgid "Wrote bitcoin config ok." msgstr "bitcoin.conf успешно записан." -#: guiminer.py:1723 +#: guiminer.py:1765 msgid "Console" msgstr "Консоль" -#: guiminer.py:1735 +#: guiminer.py:1777 msgid "Summary" msgstr "Итог" -#: guiminer.py:1748 +#: guiminer.py:1790 msgid "Rename miner" msgstr "Переименовать генератор" -#: guiminer.py:1748 +#: guiminer.py:1790 msgid "Rename to:" msgstr "Переименовать в:" -#: guiminer.py:1780 +#: guiminer.py:1795 +msgid "Change language" +msgstr "Изменить язык" + +#: guiminer.py:1814 +msgid "Choose language (requires restart to take full effect)" +msgstr "Выбрать другой язык (требуется перезапуск программы)" + +#: guiminer.py:1859 msgid "" "Click the link below to log in to the pool and get a special token. \n" "This token lets you securely check your balance.\n" "To remember this token for the future, save your miner settings." msgstr "" -"Нажмите ссылку ниже, чтобы войти в пул и получить специальный код (API token). \n" +"Нажмите ссылку ниже, чтобы войти в пул и получить специальный код (API " +"token). \n" "Этот код позволяет проверять состояние баланса.\n" "При сохранении настроек, код сохраняется." -#: guiminer.py:1789 +#: guiminer.py:1868 msgid "(Paste token here)" msgstr "(Копируйте код сюда)" -#: guiminer.py:1815 +#: guiminer.py:1894 msgid "Copy address to clipboard" msgstr "Копировать адрес в буфер обмена" diff --git a/messages.pot b/messages.pot index d376734..be06283 100644 --- a/messages.pot +++ b/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-04-20 21:30-0300\n" +"POT-Creation-Date: 2011-05-01 08:49-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: guiminer.py:40 +#: guiminer.py:74 #, python-format msgid "" "GUIMiner\n" @@ -39,422 +39,434 @@ msgid "" "further work on this software.\n" msgstr "" -#: guiminer.py:61 +#: guiminer.py:95 msgid "Not started" msgstr "" -#: guiminer.py:62 +#: guiminer.py:96 msgid "Starting..." msgstr "" -#: guiminer.py:63 +#: guiminer.py:97 msgid "Stopped" msgstr "" -#: guiminer.py:64 +#: guiminer.py:98 msgid "Paused" msgstr "" -#: guiminer.py:65 +#: guiminer.py:99 msgid "Start mining!" msgstr "" -#: guiminer.py:66 +#: guiminer.py:100 msgid "Stop mining" msgstr "" -#: guiminer.py:67 +#: guiminer.py:101 msgid "Refresh balance" msgstr "" -#: guiminer.py:68 +#: guiminer.py:102 msgid "Connection error" msgstr "" -#: guiminer.py:69 +#: guiminer.py:103 msgid "Username:" msgstr "" -#: guiminer.py:70 +#: guiminer.py:104 msgid "Password:" msgstr "" -#: guiminer.py:71 +#: guiminer.py:105 msgid "Quit this program" msgstr "" -#: guiminer.py:72 +#: guiminer.py:106 msgid "Show about dialog" msgstr "" -#: guiminer.py:147 +#: guiminer.py:181 #, python-format msgid "%.1f Ghash/s" msgstr "" -#: guiminer.py:149 +#: guiminer.py:183 #, python-format msgid "%.1f Mhash/s" msgstr "" -#: guiminer.py:151 +#: guiminer.py:185 msgid "Connecting..." msgstr "" -#: guiminer.py:153 +#: guiminer.py:187 #, python-format msgid "%d khash/s" msgstr "" -#: guiminer.py:177 +#: guiminer.py:211 #, python-format msgid "Requesting balance: %(request)s" msgstr "" -#: guiminer.py:181 +#: guiminer.py:215 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "" -#: guiminer.py:232 +#: guiminer.py:266 msgid "Miner" msgstr "" -#: guiminer.py:233 +#: guiminer.py:267 msgid "Speed" msgstr "" -#: guiminer.py:234 +#: guiminer.py:268 msgid "Accepted" msgstr "" -#: guiminer.py:235 +#: guiminer.py:269 msgid "Stale" msgstr "" -#: guiminer.py:236 +#: guiminer.py:270 msgid "Start/Stop" msgstr "" -#: guiminer.py:237 +#: guiminer.py:271 msgid "Autostart" msgstr "" -#: guiminer.py:321 +#: guiminer.py:355 msgid "Pause all" msgstr "" -#: guiminer.py:323 +#: guiminer.py:357 msgid "Restore" msgstr "" -#: guiminer.py:324 +#: guiminer.py:358 msgid "Close" msgstr "" -#: guiminer.py:378 +#: guiminer.py:412 #, python-format msgid "Listener for \"%s\" started" msgstr "" -#: guiminer.py:393 +#: guiminer.py:427 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "" -#: guiminer.py:396 +#: guiminer.py:430 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "" -#: guiminer.py:427 +#: guiminer.py:461 msgid "Server:" msgstr "" -#: guiminer.py:432 +#: guiminer.py:466 msgid "Website:" msgstr "" -#: guiminer.py:434 +#: guiminer.py:468 msgid "Ext. Path:" msgstr "" -#: guiminer.py:436 +#: guiminer.py:470 msgid "Host:" msgstr "" -#: guiminer.py:438 +#: guiminer.py:472 msgid "Port:" msgstr "" -#: guiminer.py:444 +#: guiminer.py:478 msgid "Device:" msgstr "" -#: guiminer.py:445 +#: guiminer.py:479 msgid "No OpenCL devices" msgstr "" -#: guiminer.py:446 +#: guiminer.py:480 msgid "Extra flags:" msgstr "" -#: guiminer.py:449 +#: guiminer.py:483 msgid "Balance:" msgstr "" -#: guiminer.py:453 +#: guiminer.py:487 msgid "Withdraw" msgstr "" -#: guiminer.py:568 +#: guiminer.py:602 msgid "Default" msgstr "" -#: guiminer.py:615 +#: guiminer.py:649 msgid "Start" msgstr "" -#: guiminer.py:615 +#: guiminer.py:649 msgid "Stop" msgstr "" -#: guiminer.py:631 +#: guiminer.py:665 msgid "Connection problems" msgstr "" -#: guiminer.py:766 +#: guiminer.py:800 msgid "Running command: " msgstr "" -#: guiminer.py:818 +#: guiminer.py:852 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "" -#: guiminer.py:822 +#: guiminer.py:856 #, python-format msgid "Blocks: %d, " msgstr "" -#: guiminer.py:825 +#: guiminer.py:859 #, python-format msgid "Shares: %d accepted" msgstr "" -#: guiminer.py:827 +#: guiminer.py:861 #, python-format msgid ", %d stale/invalid" msgstr "" -#: guiminer.py:849 +#: guiminer.py:883 #, python-format msgid "- last at %s" msgstr "" -#: guiminer.py:922 +#: guiminer.py:956 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." msgstr "" -#: guiminer.py:923 +#: guiminer.py:957 msgid "Website of the currently selected server. Click to visit." msgstr "" -#: guiminer.py:924 +#: guiminer.py:958 msgid "Available OpenCL devices on your system." msgstr "" -#: guiminer.py:925 +#: guiminer.py:959 msgid "Host address, without http:// prefix." msgstr "" -#: guiminer.py:926 +#: guiminer.py:960 msgid "Server port. This is usually 8332." msgstr "" -#: guiminer.py:927 +#: guiminer.py:961 msgid "" "The miner's username.\n" "May be different than your account username.\n" "Example: Kiv.GPU" msgstr "" -#: guiminer.py:928 +#: guiminer.py:962 msgid "" "The miner's password.\n" "May be different than your account password." msgstr "" -#: guiminer.py:929 +#: guiminer.py:963 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" "For other cards consult the forum." msgstr "" -#: guiminer.py:1010 +#: guiminer.py:1044 #, python-format msgid "%s confirmed" msgstr "" -#: guiminer.py:1012 +#: guiminer.py:1046 #, python-format msgid ", %s unconfirmed" msgstr "" -#: guiminer.py:1014 +#: guiminer.py:1048 msgid "Bad response from server." msgstr "" -#: guiminer.py:1103 +#: guiminer.py:1137 msgid "Withdraw OK" msgstr "" -#: guiminer.py:1261 +#: guiminer.py:1296 msgid "No registration is required - just enter an address and press Start." msgstr "" -#: guiminer.py:1263 +#: guiminer.py:1298 msgid "Address:" msgstr "" -#: guiminer.py:1265 +#: guiminer.py:1300 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" msgstr "" -#: guiminer.py:1280 +#: guiminer.py:1315 msgid "" "Your miner username (not your account username).\n" "Example: Kiv.GPU" msgstr "" -#: guiminer.py:1282 guiminer.py:1298 +#: guiminer.py:1317 guiminer.py:1333 msgid "Your miner password (not your account password)." msgstr "" -#: guiminer.py:1296 +#: guiminer.py:1331 msgid "" "Your miner username. \n" "Example: kiv123@kiv123" msgstr "" -#: guiminer.py:1311 +#: guiminer.py:1347 msgid "The e-mail address you registered with." msgstr "" -#: guiminer.py:1312 +#: guiminer.py:1348 msgid "Email:" msgstr "" -#: guiminer.py:1327 +#: guiminer.py:1363 msgid "&Rename..." msgstr "" -#: guiminer.py:1327 +#: guiminer.py:1363 msgid "Rename this miner" msgstr "" -#: guiminer.py:1348 +#: guiminer.py:1384 msgid "&New OpenCL miner..." msgstr "" -#: guiminer.py:1348 +#: guiminer.py:1384 msgid "Create a new miner profile" msgstr "" -#: guiminer.py:1349 +#: guiminer.py:1385 msgid "Create a CPU or CUDA miner (requires external program)" msgstr "" -#: guiminer.py:1349 +#: guiminer.py:1385 msgid "New &other miner..." msgstr "" -#: guiminer.py:1350 +#: guiminer.py:1386 msgid "&Save settings" msgstr "" -#: guiminer.py:1350 +#: guiminer.py:1386 msgid "Save your settings" msgstr "" -#: guiminer.py:1351 +#: guiminer.py:1387 msgid "&Load settings" msgstr "" -#: guiminer.py:1351 +#: guiminer.py:1387 msgid "Load stored settings" msgstr "" -#: guiminer.py:1353 +#: guiminer.py:1388 +msgid "Quit" +msgstr "" + +#: guiminer.py:1389 msgid "&File" msgstr "" -#: guiminer.py:1357 +#: guiminer.py:1393 msgid "Show summary" msgstr "" -#: guiminer.py:1357 +#: guiminer.py:1393 msgid "Show summary of all miners" msgstr "" -#: guiminer.py:1358 +#: guiminer.py:1394 msgid "Show console" msgstr "" -#: guiminer.py:1358 +#: guiminer.py:1394 msgid "Show console logs" msgstr "" -#: guiminer.py:1359 +#: guiminer.py:1395 msgid "&View" msgstr "" -#: guiminer.py:1363 +#: guiminer.py:1399 msgid "&Create solo password..." msgstr "" -#: guiminer.py:1363 +#: guiminer.py:1399 msgid "Configure a user/pass for solo mining" msgstr "" -#: guiminer.py:1364 +#: guiminer.py:1400 msgid "&Set Bitcoin client path..." msgstr "" -#: guiminer.py:1364 +#: guiminer.py:1400 msgid "Set the location of the official Bitcoin client" msgstr "" -#: guiminer.py:1365 +#: guiminer.py:1401 msgid "&Launch Bitcoin client as server" msgstr "" -#: guiminer.py:1365 +#: guiminer.py:1401 msgid "Launch the official Bitcoin client as a server for solo mining" msgstr "" -#: guiminer.py:1366 +#: guiminer.py:1402 msgid "&Solo utilities" msgstr "" -#: guiminer.py:1369 +#: guiminer.py:1406 +msgid "&Change language..." +msgstr "" + +#: guiminer.py:1407 +msgid "Language" +msgstr "" + +#: guiminer.py:1410 msgid "&About/Donate..." msgstr "" -#: guiminer.py:1371 +#: guiminer.py:1412 msgid "&Help" msgstr "" -#: guiminer.py:1383 +#: guiminer.py:1424 msgid "Failed to load taskbar icon; continuing." msgstr "" -#: guiminer.py:1391 +#: guiminer.py:1432 msgid "" "No OpenCL devices were found.\n" "If you only want to mine using CPU or CUDA, you can ignore this message.\n" @@ -462,174 +474,182 @@ msgid "" "SDK, or your GPU may not support OpenCL.\n" msgstr "" -#: guiminer.py:1396 +#: guiminer.py:1437 msgid "No OpenCL devices found." msgstr "" -#: guiminer.py:1399 +#: guiminer.py:1440 msgid "OpenCL not found - can't add a OpenCL miner" msgstr "" -#: guiminer.py:1423 +#: guiminer.py:1465 #, python-format msgid "GUIMiner - v%s" msgstr "" -#: guiminer.py:1465 +#: guiminer.py:1507 msgid "Name this miner:" msgstr "" -#: guiminer.py:1465 +#: guiminer.py:1507 msgid "New miner" msgstr "" -#: guiminer.py:1468 +#: guiminer.py:1510 msgid "Untitled" msgstr "" -#: guiminer.py:1479 +#: guiminer.py:1521 msgid "External miner (*.exe)|*.exe" msgstr "" -#: guiminer.py:1481 +#: guiminer.py:1523 msgid "Select external miner:" msgstr "" -#: guiminer.py:1491 +#: guiminer.py:1533 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" msgstr "" -#: guiminer.py:1493 +#: guiminer.py:1535 msgid "Miner not supported" msgstr "" -#: guiminer.py:1519 +#: guiminer.py:1561 msgid "Do you want to save changes?" msgstr "" -#: guiminer.py:1519 +#: guiminer.py:1561 msgid "Save" msgstr "" -#: guiminer.py:1547 +#: guiminer.py:1589 msgid "Saving: " msgstr "" -#: guiminer.py:1553 +#: guiminer.py:1595 #, python-format msgid "" "Couldn't write save file %s.\n" "Check the location is writable." msgstr "" -#: guiminer.py:1554 +#: guiminer.py:1596 msgid "Save unsuccessful" msgstr "" -#: guiminer.py:1556 +#: guiminer.py:1598 #, python-format msgid "Profiles saved OK to %s." msgstr "" -#: guiminer.py:1557 +#: guiminer.py:1599 msgid "Save successful" msgstr "" -#: guiminer.py:1569 +#: guiminer.py:1611 #, python-format msgid "Loaded: %s" msgstr "" -#: guiminer.py:1578 +#: guiminer.py:1620 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "" -#: guiminer.py:1579 +#: guiminer.py:1621 msgid "Load profile" msgstr "" -#: guiminer.py:1608 +#: guiminer.py:1650 msgid "Select path to Bitcoin.exe" msgstr "" -#: guiminer.py:1620 +#: guiminer.py:1662 msgid "About" msgstr "" -#: guiminer.py:1646 +#: guiminer.py:1688 msgid "Closing this miner will stop it. Continue?" msgstr "" -#: guiminer.py:1647 +#: guiminer.py:1689 msgid "Close miner" msgstr "" -#: guiminer.py:1676 +#: guiminer.py:1718 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" msgstr "" -#: guiminer.py:1677 +#: guiminer.py:1719 msgid "Launch failed" msgstr "" -#: guiminer.py:1680 +#: guiminer.py:1722 msgid "Client launched ok. You can start a miner now with the server set to 'solo'." msgstr "" -#: guiminer.py:1681 +#: guiminer.py:1723 msgid "Launched ok." msgstr "" -#: guiminer.py:1696 +#: guiminer.py:1738 #, python-format msgid "%s already exists. Overwrite?" msgstr "" -#: guiminer.py:1697 +#: guiminer.py:1739 msgid "bitcoin.conf already exists." msgstr "" -#: guiminer.py:1702 +#: guiminer.py:1744 msgid "Enter password" msgstr "" -#: guiminer.py:1712 +#: guiminer.py:1754 msgid "Success" msgstr "" -#: guiminer.py:1712 +#: guiminer.py:1754 msgid "Wrote bitcoin config ok." msgstr "" -#: guiminer.py:1723 +#: guiminer.py:1765 msgid "Console" msgstr "" -#: guiminer.py:1735 +#: guiminer.py:1777 msgid "Summary" msgstr "" -#: guiminer.py:1748 +#: guiminer.py:1790 msgid "Rename miner" msgstr "" -#: guiminer.py:1748 +#: guiminer.py:1790 msgid "Rename to:" msgstr "" -#: guiminer.py:1780 +#: guiminer.py:1795 +msgid "Change language" +msgstr "" + +#: guiminer.py:1814 +msgid "Choose language (requires restart to take full effect)" +msgstr "" + +#: guiminer.py:1859 msgid "" "Click the link below to log in to the pool and get a special token. \n" "This token lets you securely check your balance.\n" "To remember this token for the future, save your miner settings." msgstr "" -#: guiminer.py:1789 +#: guiminer.py:1868 msgid "(Paste token here)" msgstr "" -#: guiminer.py:1815 +#: guiminer.py:1894 msgid "Copy address to clipboard" msgstr "" From f73b485d89b449b6abaa46dbae06533f7c549a40 Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 20 May 2011 20:29:47 -0300 Subject: [PATCH 080/190] Fix missing translation of 'Withdraw OK' --- guiminer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index 80d00a2..b751abb 100644 --- a/guiminer.py +++ b/guiminer.py @@ -34,6 +34,7 @@ def get_module_path(): LANGUAGES = { "English": wx.LANGUAGE_ENGLISH, + "Spanish": wx.LANGUAGE_SPANISH, "Russian": wx.LANGUAGE_RUSSIAN } LANGUAGES_REVERSE = dict((v,k) for (k,v) in LANGUAGES.items()) @@ -1115,7 +1116,7 @@ def request_payout_deepbit(self, balance_auth_token): if not data: data = STR_CONNECTION_ERROR else: - data = "Withdraw OK" + data = _("Withdraw OK") wx.CallAfter(self.on_balance_received, data) def request_payout_bitpenny(self, withdraw): From 9a48b221d86015430c9299cf41d721bc4e9db4ee Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 20 May 2011 20:30:37 -0300 Subject: [PATCH 081/190] Add Spanish language file. --- guiminer_es.po | 697 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 697 insertions(+) create mode 100644 guiminer_es.po diff --git a/guiminer_es.po b/guiminer_es.po new file mode 100644 index 0000000..803036b --- /dev/null +++ b/guiminer_es.po @@ -0,0 +1,697 @@ +msgid "" +msgstr "" +"Project-Id-Version: guiminer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-05-20 00:00-0000\n" +"PO-Revision-Date: 2011-05-20 00:00-0000\n" +"Last-Translator: Bitcoins Wallet \n" +"Language-Team: Español\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: guiminer.py:74 +#, python-format +msgid "" +"GUIMiner\n" +"\n" +"Version: %(version)s\n" +"\n" +"GUI by Chris 'Kiv' MacLeod\n" +"Original poclbm miner by m0mchil\n" +"Original rpcminer by puddinpop\n" +"\n" +"Get the source code or file issues at GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"If you enjoyed this software, support its development\n" +"by donating to:\n" +"\n" +"%(address)s\n" +"\n" +"Even a single Bitcoin is appreciated and helps motivate\n" +"further work on this software.\n" +msgstr "" +"GUIMiner versión: %(version)s\n" +"\n" +"GUI por: Chris 'Kiv' MacLeod\n" +"Minero poclbm original por: m0mchil\n" +"Minero rpcminer original por: puddinpop\n" +"Traducción al español por: http://www.BitcoinsWallet.com\n" +"\n" +"Código fuente o errores en GitHub: https://github.com/Kiv/poclbm\n" +"\n" +"Si has disfrutado con este software, apoya a su desarrollo donando a:\n" +"%(address)s\n" +"\n" +"Incluso una sóla Bitcoin se aprecia y ayuda a motivar\n" +"a los desarrolladores en el trabajo futuro.\n" + +#: guiminer.py:95 +msgid "Not started" +msgstr "No iniciado" + +#: guiminer.py:96 +msgid "Starting..." +msgstr "Empezando..." + +#: guiminer.py:97 +msgid "Stopped" +msgstr "Detenido" + +#: guiminer.py:98 +msgid "Paused" +msgstr "Pausado" + +#: guiminer.py:99 +msgid "Start mining!" +msgstr "Iniciar la minería" + +#: guiminer.py:100 +msgid "Stop mining" +msgstr "Parar la minería" + +#: guiminer.py:101 +msgid "Refresh balance" +msgstr "Actualizar saldo" + +#: guiminer.py:102 +msgid "Connection error" +msgstr "Error de conexión" + +#: guiminer.py:103 +msgid "Username:" +msgstr "Usuario:" + +#: guiminer.py:104 +msgid "Password:" +msgstr "Contraseña:" + +#: guiminer.py:105 +msgid "Quit this program" +msgstr "Salir del programa" + +#: guiminer.py:106 +msgid "Show about dialog" +msgstr "Acerca de..." + +#: guiminer.py:181 +#, python-format +msgid "%.1f Ghash/s" +msgstr "%.1f Ghash/s" + +#: guiminer.py:183 +#, python-format +msgid "%.1f Mhash/s" +msgstr "%.1f Mhash/s" + +#: guiminer.py:185 +msgid "Connecting..." +msgstr "Conectando..." + +#: guiminer.py:187 +#, python-format +msgid "%d khash/s" +msgstr "%d khash/s" + +#: guiminer.py:211 +#, python-format +msgid "Requesting balance: %(request)s" +msgstr "Solicitando saldo: %(request)s" + +#: guiminer.py:215 +#, python-format +msgid "Server replied: %(status)s, %(data)s" +msgstr "Contestación del Servidor: %(status)s, %(data)s" + +#: guiminer.py:266 +msgid "Miner" +msgstr "Minero" + +#: guiminer.py:267 +msgid "Speed" +msgstr "Velocidad" + +#: guiminer.py:268 +msgid "Accepted" +msgstr "Aceptado" + +#: guiminer.py:269 +msgid "Stale" +msgstr "Caducado" + +#: guiminer.py:270 +msgid "Start/Stop" +msgstr "Iniciar/Parar" + +#: guiminer.py:271 +msgid "Autostart" +msgstr "Inicio auto." + +#: guiminer.py:355 +msgid "Pause all" +msgstr "Pausar todos" + +#: guiminer.py:357 +msgid "Restore" +msgstr "Restaurar" + +#: guiminer.py:358 +msgid "Close" +msgstr "Cerrar" + +#: guiminer.py:412 +#, python-format +msgid "Listener for \"%s\" started" +msgstr "Minero \"%s\" iniciado" + +#: guiminer.py:427 +#, python-format +msgid "Listener for \"%(name)s\": %(line)s" +msgstr "Minero \"%(name)s\": %(line)s" + +#: guiminer.py:430 +#, python-format +msgid "Listener for \"%s\" shutting down" +msgstr "Minero \"%s\" cerrando" + +#: guiminer.py:461 +msgid "Server:" +msgstr "Grupo:" + +#: guiminer.py:466 +msgid "Website:" +msgstr "Sitio web:" + +#: guiminer.py:468 +msgid "Ext. Path:" +msgstr "Ruta externa" + +#: guiminer.py:470 +msgid "Host:" +msgstr "Servidor:" + +#: guiminer.py:472 +msgid "Port:" +msgstr "Puerto:" + +#: guiminer.py:478 +msgid "Device:" +msgstr "Dispositivo:" + +#: guiminer.py:479 +msgid "No OpenCL devices" +msgstr "No hay dispositivos OpenCL" + +#: guiminer.py:480 +msgid "Extra flags:" +msgstr "Opciones extra:" + +#: guiminer.py:483 +msgid "Balance:" +msgstr "Saldo:" + +#: guiminer.py:487 +msgid "Withdraw" +msgstr "Retirar saldo" + +#: guiminer.py:602 +msgid "Default" +msgstr "Por defecto" + +#: guiminer.py:649 +msgid "Start" +msgstr "Iniciar" + +#: guiminer.py:649 +msgid "Stop" +msgstr "Parar" + +#: guiminer.py:665 +msgid "Connection problems" +msgstr "Problemas de conexión" + +#: guiminer.py:800 +msgid "Running command: " +msgstr "Ejecutando comando: " + +#: guiminer.py:852 +#, python-format +msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" +msgstr "Dificultad 1 hashes: %(nhashes)d %(update_time)s" + +#: guiminer.py:856 +#, python-format +msgid "Blocks: %d, " +msgstr "Bloques: %d, " + +#: guiminer.py:859 +#, python-format +msgid "Shares: %d accepted" +msgstr "Tareas: %d aceptadas" + +#: guiminer.py:861 +#, python-format +msgid ", %d stale/invalid" +msgstr ", %d caducada/inválida" + +#: guiminer.py:883 +#, python-format +msgid "- last at %s" +msgstr "- última: %s" + +#: guiminer.py:956 +msgid "" +"Server to connect to. Different servers have different fees and features.\n" +"Check their websites for full information." +msgstr "" +"Grupo donde conectar. Cada grupo tiene diferentes tasas y características.\n" +"Ver sus páginas web para obtener toda la información." + +#: guiminer.py:957 +msgid "Website of the currently selected server. Click to visit." +msgstr "Página web del grupo seleccionado actualmente. Clic para visitar" + +#: guiminer.py:958 +msgid "Available OpenCL devices on your system." +msgstr "Dispositivos OpenCL disponibles en tu sistema" + +#: guiminer.py:959 +msgid "Host address, without http:// prefix." +msgstr "Dirección del Servidor, sin el prefijo http://." + +#: guiminer.py:960 +msgid "Server port. This is usually 8332." +msgstr "Puerto del servidor. Generalmente 8332." + +#: guiminer.py:961 +msgid "" +"The miner's username.\n" +"May be different than your account username.\n" +"Example: Kiv.GPU" +msgstr "" +"El usuario del minero.\n" +"Puede ser diferente al usuario de la cuenta.\n" +"Ejemplo: BitcoinsWallet.GPU" + +#: guiminer.py:962 +msgid "" +"The miner's password.\n" +"May be different than your account password." +msgstr "" +"Contraseña del minero.\n" +"Puede ser diferente a la contraseña de la cuenta.\n" + +#: guiminer.py:963 +msgid "" +"Extra flags to pass to the miner.\n" +"For Radeon HD 5xxx series use -v -w128 for best results.\n" +"For other cards consult the forum." +msgstr "" +"Opciones extra para utilizar con el minero.\n" +"Para obtener mejores resultados con las Radeon HD 5xxx utiliza -v -w128.\n" +"Para otras tarjetas, consultar el foro: http://forum.bitcoin.org/." + +#: guiminer.py:1044 +#, python-format +msgid "%s confirmed" +msgstr "%s confirmado" + +#: guiminer.py:1046 +#, python-format +msgid ", %s unconfirmed" +msgstr ", %s sin confirmar" + +#: guiminer.py:1048 +msgid "Bad response from server." +msgstr "Respuesta incorrecta del servidor." + +#: guiminer.py:1137 +msgid "Withdraw OK" +msgstr "Retirada de saldo correcta" + +#: guiminer.py:1296 +msgid "No registration is required - just enter an address and press Start." +msgstr "No es necesario el registro - sólo introduce una dirección y presiona Iniciar." + +#: guiminer.py:1298 +msgid "Address:" +msgstr "Dirección:" + +#: guiminer.py:1300 +msgid "" +"Your receiving address for Bitcoins.\n" +"E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" +msgstr "" +"Tu cuenta para recibir Bitcoins.\n" +"Ejemplo: 1LSEcWhBwvQ6r5wWC6ZfHRtDrTmybqXbLk" + +#: guiminer.py:1315 +msgid "" +"Your miner username (not your account username).\n" +"Example: Kiv.GPU" +msgstr "" +"Tu usuario del minero, (no el usuario de la cuenta).\n" +"Ejemplo: BitcoinsWallet.GPU" + +#: guiminer.py:1317 guiminer.py:1333 +msgid "Your miner password (not your account password)." +msgstr "Contraseña del minero (no la contraseña de la cuenta).\n" + +#: guiminer.py:1331 +msgid "" +"Your miner username. \n" +"Example: kiv123@kiv123" +msgstr "" +"El usuario del minero. \n" +"Ejemplo: BitcoinsWallet@kiv123" + +#: guiminer.py:1347 +msgid "The e-mail address you registered with." +msgstr "El correo electrónico con el que te registraste." + +#: guiminer.py:1348 +msgid "Email:" +msgstr "Correo electrónico:" + +#: guiminer.py:1363 +msgid "&Rename..." +msgstr "&Renombrar..." + +#: guiminer.py:1363 +msgid "Rename this miner" +msgstr "Renombrar este minero" + +#: guiminer.py:1384 +msgid "&New OpenCL miner..." +msgstr "&Nuevo minero OpenCL..." + +#: guiminer.py:1384 +msgid "Create a new miner profile" +msgstr "Crear un nuevo perfil de minero" + +#: guiminer.py:1385 +msgid "Create a CPU or CUDA miner (requires external program)" +msgstr "Crear un nuevo minero CPU o CUDA (requiere un programa externo)" + +#: guiminer.py:1385 +msgid "New &other miner..." +msgstr "Nuevo minero diferente..." + +#: guiminer.py:1386 +msgid "&Save settings" +msgstr "&Guardar opciones" + +#: guiminer.py:1386 +msgid "Save your settings" +msgstr "Guardar tus opciones" + +#: guiminer.py:1387 +msgid "&Load settings" +msgstr "&Cargar opciones" + +#: guiminer.py:1387 +msgid "Load stored settings" +msgstr "Cargar las opciones guardadas" + +#: guiminer.py:1388 +msgid "Quit" +msgstr "Salir" + +#: guiminer.py:1389 +msgid "&File" +msgstr "&Archivo" + +#: guiminer.py:1393 +msgid "Show summary" +msgstr "Mostrar sumario" + +#: guiminer.py:1393 +msgid "Show summary of all miners" +msgstr "Mostrar sumario de todos los mineros" + +#: guiminer.py:1394 +msgid "Show console" +msgstr "Mostrar consola" + +#: guiminer.py:1394 +msgid "Show console logs" +msgstr "Mostrar los registros de la consola" + +#: guiminer.py:1395 +msgid "&View" +msgstr "&Ver" + +#: guiminer.py:1399 +msgid "&Create solo password..." +msgstr "&Crear usuario/contraseña..." + +#: guiminer.py:1399 +msgid "Configure a user/pass for solo mining" +msgstr "Configurar un usuario/contraseña para la minería en modo 'solo'" + +#: guiminer.py:1400 +msgid "&Set Bitcoin client path..." +msgstr "&Configurar la ruta del cliente Bitcoin..." + +#: guiminer.py:1400 +msgid "Set the location of the official Bitcoin client" +msgstr "Configurar la ruta del cliente oficial Bitcoin." + +#: guiminer.py:1401 +msgid "&Launch Bitcoin client as server" +msgstr "&Ejecutar el cliente Bitcoin como servidor" + +#: guiminer.py:1401 +msgid "Launch the official Bitcoin client as a server for solo mining" +msgstr "Ejecutar el cliente Bitcoin como servidor para la minería en modo 'solo'" + +#: guiminer.py:1402 +msgid "&Solo utilities" +msgstr "&Minería en modo 'solo'" + +#: guiminer.py:1406 +msgid "&Change language..." +msgstr "&Cambiar idioma..." + +#: guiminer.py:1407 +msgid "Language" +msgstr "Idioma" + +#: guiminer.py:1410 +msgid "&About/Donate..." +msgstr "&Acerca de/Donaciones..." + +#: guiminer.py:1412 +msgid "&Help" +msgstr "&Ayuda" + +#: guiminer.py:1424 +msgid "Failed to load taskbar icon; continuing." +msgstr "Error al cargar el icono de bandeja del sistema; continunando...." + +#: guiminer.py:1432 +msgid "" +"No OpenCL devices were found.\n" +"If you only want to mine using CPU or CUDA, you can ignore this message.\n" +"If you want to mine on ATI graphics cards, you may need to install the ATI " +"Stream\n" +"SDK, or your GPU may not support OpenCL.\n" +msgstr "" +"No se han encontrado dispositivos OpenCL.\n" +"Si sólo quieres minar utilizando CPU or CUDA, puedes ignorar este mensaje.\n" +"Si quieres minar con tarjetas gráficas ATI, podrías necesitar instalar el SDK " +"del ATI Stream\n" +"o tu GPU podría no aceptar OpenCL.\n" + +#: guiminer.py:1437 +msgid "No OpenCL devices found." +"No se han encontrado dispositivos OpenCL." + +#: guiminer.py:1440 +msgid "OpenCL not found - can't add a OpenCL miner" +msgstr "OpenCL no encontrado. No se puede añadir un minero OpenCL" + +#: guiminer.py:1465 +#, python-format +msgid "GUIMiner - v%s" +msgstr "GUIMiner - v%s" + +#: guiminer.py:1507 +msgid "Name this miner:" +msgstr "Nombre para este minero:" + +#: guiminer.py:1507 +msgid "New miner" +msgstr "Nuevo minero" + +#: guiminer.py:1510 +msgid "Untitled" +msgstr "Sin nombre" + +#: guiminer.py:1521 + +msgid "External miner (*.exe)|*.exe" +msgstr "Minero externo (*.exe)|*.exe" + +#: guiminer.py:1523 +msgid "Select external miner:" +msgstr "Seleccionar un minero externo:" + +#: guiminer.py:1533 +#, python-format +msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" +msgstr "Minero externo %(filename)s no compatible. Los compatibles son: %(supported)" + +#: guiminer.py:1535 +msgid "Miner not supported" +msgstr "Minero no compatible" + +#: guiminer.py:1561 +msgid "Do you want to save changes?" +msgstr "¿Quieres guardar los cambios?" + +#: guiminer.py:1561 +msgid "Save" +msgstr "Guardar" + +#: guiminer.py:1589 +msgid "Saving: " +msgstr "Guardando: " + +#: guiminer.py:1595 +#, python-format +msgid "" +"Couldn't write save file %s.\n" +"Check the location is writable." +msgstr "" +"No se puede guardar el archivo %s.\n" +"Comprueba que la ubicación permite la escritura" + +#: guiminer.py:1596 +msgid "Save unsuccessful" +msgstr "Error al guardar" + +#: guiminer.py:1598 +#, python-format +msgid "Profiles saved OK to %s." +msgstr "Los perfiles se han guardado correctamente en %s." + +#: guiminer.py:1599 +msgid "Save successful" +msgstr "Guardado correcto" + +#: guiminer.py:1611 +#, python-format +msgid "Loaded: %s" +msgstr "Cargado: %s" + +#: guiminer.py:1620 +msgid "Loading profiles will stop any currently running miners. Continue?" +msgstr "Cargar los perfiles parará los mineros que trabajen ahora. Продолжить?" + +#: guiminer.py:1621 +msgid "Load profile" +msgstr "Cargar perfil" + +#: guiminer.py:1650 +msgid "Select path to Bitcoin.exe" +msgstr "Seleccionar ruta para Bitcoin.exe" + +#: guiminer.py:1662 +msgid "About" +msgstr "Acerca de" + +#: guiminer.py:1688 +msgid "Closing this miner will stop it. Continue?" +msgstr "Cerrar este minero lo parará. ¿Continuar?" + +#: guiminer.py:1689 +msgid "Close miner" +msgstr "Cerrar minero" + +#: guiminer.py:1718 +#, python-format +msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" +msgstr "No se puede encontrar Bitcoin en %s. ¿La ruta es correcta?" + +#: guiminer.py:1719 +msgid "Launch failed" +msgstr "Fallo al iniciar" + +#: guiminer.py:1722 +msgid "" +"Client launched ok. You can start a miner now with the server set to 'solo'." +msgstr "" +"Cliente ejecutado correctamente. Ahora puedes iniciar\n" +"un minero con el servidor configurado en modo 'solo'" + +#: guiminer.py:1723 +msgid "Launched ok." +msgstr "Ejecutado correctamente." + +#: guiminer.py:1738 +#, python-format +msgid "%s already exists. Overwrite?" +msgstr "%s ya existe. ¿Sobreescribir?" + +#: guiminer.py:1739 +msgid "bitcoin.conf already exists." +msgstr "bitcoin.conf ya existe." + +#: guiminer.py:1744 +msgid "Enter password" +msgstr "Introducir contraseña" + +#: guiminer.py:1754 +msgid "Success" +msgstr "Correcto" + +#: guiminer.py:1754 +msgid "Wrote bitcoin config ok." +msgstr "bitcoin.conf escrito correctamente." + +#: guiminer.py:1765 +msgid "Console" +msgstr "Consola" + +#: guiminer.py:1777 +msgid "Summary" +msgstr "Sumario" + +#: guiminer.py:1790 +msgid "Rename miner" +msgstr "Renombrar minero" + +#: guiminer.py:1790 +msgid "Rename to:" +msgstr "Renombrar a:" + +#: guiminer.py:1795 +msgid "Change language" +msgstr "Cambiar idioma" + +#: guiminer.py:1814 +msgid "Choose language (requires restart to take full effect)" +msgstr "Elegir idioma (se necesita reiniciar para completar)" + +#: guiminer.py:1859 +msgid "" +"Click the link below to log in to the pool and get a special token. \n" +"This token lets you securely check your balance.\n" +"To remember this token for the future, save your miner settings." +msgstr "" +"Hacer clic en el enlace de abajo para entrar en el grupo y conseguir el\n" +"código de la API. Este código te permitirá comprobar tu saldo de forma segura.\n" +"Para guardar este código, deberás guardar la configuración de tu minero." + +#: guiminer.py:1868 +msgid "(Paste token here)" +msgstr "(Pegar el código aquí)" + +#: guiminer.py:1894 +msgid "Copy address to clipboard" +msgstr "Copiar dirección al portapapeles" + +#~ msgid "%s mining!" +#~ msgstr "%s minería" From 880694e6d76625dbcf5ee8f47e5ced890da14872 Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 20 May 2011 21:02:21 -0300 Subject: [PATCH 082/190] Add 'Don't show again' checkbox to OpenCL warning and persist their decision in their poclbm.ini. --- guiminer.py | 64 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 50 insertions(+), 14 deletions(-) diff --git a/guiminer.py b/guiminer.py index b751abb..1e0fe8a 100644 --- a/guiminer.py +++ b/guiminer.py @@ -144,7 +144,7 @@ def get_opencl_devices(): Raises IOError if no OpenCL devices are found. """ import pyopencl - platform = pyopencl.get_platforms()[0] + platform = pyopencl.get_platforms()[0] #@UndefinedVariable devices = platform.get_devices() if len(devices) == 0: raise IOError @@ -1378,6 +1378,9 @@ def __init__(self, *args, **kwds): defaults_config_path = os.path.join(get_module_path(), 'defaults.ini') with open(defaults_config_path) as f: self.defaults = json.load(f) + + self.parse_config() + self.do_show_opencl_warning = self.config_data.get('show_opencl_warning', True) ID_NEW_EXTERNAL = wx.NewId() self.menubar = wx.MenuBar() @@ -1430,15 +1433,13 @@ def __init__(self, *args, **kwds): self.devices = get_opencl_devices() except: self.devices = [] - self.message(_("""No OpenCL devices were found. -If you only want to mine using CPU or CUDA, you can ignore this message. -If you want to mine on ATI graphics cards, you may need to install the ATI Stream -SDK, or your GPU may not support OpenCL. -"""), - _("No OpenCL devices found."), - wx.OK | wx.ICON_INFORMATION) file_menu.Enable(wx.ID_NEW, False) file_menu.SetHelpString(wx.ID_NEW, _("OpenCL not found - can't add a OpenCL miner")) + + if self.do_show_opencl_warning: + dialog = OpenCLWarningDialog(self) + dialog.ShowModal() + self.do_show_opencl_warning = not dialog.is_box_checked() self.Bind(wx.EVT_MENU, self.name_new_profile, id=wx.ID_NEW) self.Bind(wx.EVT_MENU, self.new_external_profile, id=ID_NEW_EXTERNAL) @@ -1586,7 +1587,8 @@ def save_config(self, event=None): config_data = dict(show_console=self.is_console_visible(), show_summary=self.is_summary_visible(), profiles=profile_data, - bitcoin_executable=self.bitcoin_executable) + bitcoin_executable=self.bitcoin_executable, + show_opencl_warning=self.do_show_opencl_warning) logger.debug(_('Saving: ') + json.dumps(config_data)) try: with open(config_filename, 'w') as f: @@ -1601,16 +1603,21 @@ def save_config(self, event=None): for p in self.profile_panels: p.on_saved() - def load_config(self, event=None): - """Load JSON profile info from the config file.""" - config_data = {} + def parse_config(self): + """Set self.config_data to a dictionary of config values.""" + self.config_data = {} config_filename = self.get_storage_location()[1] if os.path.exists(config_filename): with open(config_filename) as f: - config_data.update(json.load(f)) - logger.debug(_('Loaded: %s') % json.dumps(config_data)) + self.config_data.update(json.load(f)) + logger.debug(_('Loaded: %s') % json.dumps(self.config_data)) + + def load_config(self, event=None): + """Load JSON profile info from the config file.""" + self.parse_config() + config_data = self.config_data executable = config_data.get('bitcoin_executable', None) if executable is not None: self.bitcoin_executable = executable @@ -1907,6 +1914,35 @@ def on_copy(self, event): wx.TheClipboard.SetData(data) wx.TheClipboard.Close() + +class OpenCLWarningDialog(wx.Dialog): + """Warning dialog when a user does not have OpenCL installed.""" + def __init__(self, parent): + wx.Dialog.__init__(self, parent, -1, _("No OpenCL devices found.")) + vbox = wx.BoxSizer(wx.VERTICAL) + self.message = wx.StaticText(self, -1, + _("""No OpenCL devices were found. + If you only want to mine using CPU or CUDA, you can ignore this message. + If you want to mine on ATI graphics cards, you may need to install the ATI Stream + SDK, or your GPU may not support OpenCL.""")) + vbox.Add(self.message, 0, wx.ALL, 10) + + hbox = wx.BoxSizer(wx.HORIZONTAL) + + self.no_show_chk = wx.CheckBox(self, -1) + hbox.Add(self.no_show_chk) + self.no_show_txt = wx.StaticText(self, -1, _("Don't show this message again")) + hbox.Add((5,0)) + hbox.Add(self.no_show_txt) + vbox.Add(hbox, 0, wx.ALL, 10) + buttons = self.CreateButtonSizer(wx.OK) + vbox.Add(buttons, 0, wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_HORIZONTAL, 0) + self.SetSizerAndFit(vbox) + + def is_box_checked(self): + return self.no_show_chk.GetValue() + + def run(): try: frame_1 = GUIMiner(None, -1, "") From f0e42898408413e36e25ff067c2a869cca0ef48d Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 20 May 2011 21:19:12 -0300 Subject: [PATCH 083/190] Reset statistics on change of server. --- guiminer.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/guiminer.py b/guiminer.py index 1e0fe8a..21e4d2b 100644 --- a/guiminer.py +++ b/guiminer.py @@ -963,8 +963,18 @@ def set_tooltips(self): add_tooltip(self.txt_pass, _("The miner's password.\nMay be different than your account password.")) add_tooltip(self.txt_flags, _("Extra flags to pass to the miner.\nFor Radeon HD 5xxx series use -v -w128 for best results.\nFor other cards consult the forum.")) + def reset_statistics(self): + """Reset our share statistics to zero.""" + self.solo_blocks_found = 0 + self.accepted_shares = 0 + self.accepted_times.clear() + self.invalid_shares = 0 + self.invalid_times.clear() + self.update_statusbar() + def change_server(self, new_server): """Change the server to new_server, updating fields as needed.""" + self.reset_statistics() # Set defaults before we do server specific code self.set_tooltips() From 434011edd45337b4fcaa5986aea4ef07a746fbf7 Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 20 May 2011 21:38:01 -0300 Subject: [PATCH 084/190] If balance auth token is rejected, reset it and prompt the user again. --- guiminer.py | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/guiminer.py b/guiminer.py index 21e4d2b..7a45795 100644 --- a/guiminer.py +++ b/guiminer.py @@ -214,8 +214,8 @@ def http_request(hostname, *args): response = conn.getresponse() data = response.read() logger.debug(_("Server replied: %(status)s, %(data)s"), - dict(status=str(response.status), data=data)) - return data + dict(status=str(response.status), data=data)) + return response, data finally: conn.close() @@ -1030,18 +1030,32 @@ def require_auth_token(self): if result == wx.ID_CANCEL: return self.balance_auth_token = dialog.get_value() # TODO: validate token? + + def is_auth_token_rejected(self, response): + """If the server rejected our token, reset auth_token and return True. + Otherwise, return False. + """ + if response.status in [401, 403]: # 401 Unauthorized or 403 Forbidden + # Token rejected by the server - reset their token so they'll be + # prompted again + self.balance_auth_token = "" + return True + return False + def request_balance_get(self, balance_auth_token): """Request our balance from the server via HTTP GET and auth token. This method should be run in its own thread. """ - data = http_request( + response, data = http_request( self.server_config['balance_host'], "GET", self.server_config["balance_url"] % balance_auth_token ) - if not data: + if self.is_auth_token_rejected(response): + data = _("Auth token rejected by server.") + elif not data: data = STR_CONNECTION_ERROR else: try: @@ -1114,7 +1128,7 @@ def request_payout_deepbit(self, balance_auth_token): """Request payout from deepbit's server via HTTP POST.""" post_params = dict(id=1, method="request_payout") - data = http_request( + response, data = http_request( self.server_config['balance_host'], "POST", self.server_config['balance_url'] % balance_auth_token, @@ -1122,8 +1136,9 @@ def request_payout_deepbit(self, balance_auth_token): {"Content-type": "application/json; charset=utf-8", "User-Agent": USER_AGENT} ) - # TODO: check response code of request - if not data: + if self.is_auth_token_rejected(response): + data = _("Auth token rejected by server.") + elif not data: data = STR_CONNECTION_ERROR else: data = _("Withdraw OK") @@ -1135,14 +1150,16 @@ def request_payout_bitpenny(self, withdraw): If withdraw is True, also request a withdrawal. """ post_params = dict(a=self.txt_username.GetValue(), w=int(withdraw)) - data = http_request( + response, data = http_request( self.server_config['balance_host'], "POST", self.server_config['balance_url'], urllib.urlencode(post_params), {"Content-type": "application/x-www-form-urlencoded"} ) - if not data: + if self.is_auth_token_rejected(response): + data = _("Auth token rejected by server.") + elif not data: data = STR_CONNECTION_ERROR elif withdraw: data = _("Withdraw OK") From d3e5d3b91e0d13383261ecd0370dece0da357224 Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 20 May 2011 21:57:07 -0300 Subject: [PATCH 085/190] Update po_to_mo helper to handle multiple languages. --- guiminer.py | 2 +- po_to_mo.py | 32 +++++++++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/guiminer.py b/guiminer.py index 7a45795..8e7a546 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1061,7 +1061,7 @@ def request_balance_get(self, balance_auth_token): try: info = json.loads(data) confirmed = info.get('confirmed_reward') or info.get('confirmed', 0) - unconfirmed = info.get('unconfirmed_reward') or info.get('unconformed', 0) + unconfirmed = info.get('unconfirmed_reward') or info.get('unconfirmed', 0) if self.server_config.get('host') == "deepbit.net": ipa = info.get('ipa', False) self.withdraw.Enable(ipa) diff --git a/po_to_mo.py b/po_to_mo.py index 5da3f2e..915d86a 100644 --- a/po_to_mo.py +++ b/po_to_mo.py @@ -1,4 +1,4 @@ -import os, sys +import os, sys, re, errno import polib @@ -8,8 +8,34 @@ def get_module_path(): abs_path = os.path.abspath(module_name) return os.path.dirname(abs_path) -po = polib.pofile('guiminer_ru.po') -path = os.path.join(get_module_path(), 'locale', 'ru', 'LC_MESSAGES', 'guiminer.mo') + +def print_usage(): + """Print usage message and exit.""" + print 'Usage: po_to_mo (or drag pofile onto executable icon).' + raw_input() + sys.exit(1) + +if len(sys.argv) < 2: + print_usage() + +po_filename = sys.argv[1] + +match = re.match(r'guiminer_(\w*).po', po_filename) +if match is None: + print_usage() +else: + language_code = match.group(1) + +po = polib.pofile(po_filename) + +folder = os.path.join(get_module_path(), 'locale', language_code, 'LC_MESSAGES') +try: + os.makedirs(folder) +except OSError as exc: + if exc.errno != errno.EEXIST: + raise + +path = os.path.join(folder, 'guiminer.mo') try: po.save_as_mofile(path) except: From ca1c6310607d2908292452a1b576c70d28b5d40a Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 20 May 2011 22:04:20 -0300 Subject: [PATCH 086/190] Fix issue where About dialog would be cut off. --- guiminer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index 8e7a546..9b84c96 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1929,7 +1929,7 @@ def __init__(self, parent, id, title): self.copy_btn = wx.Button(self, -1, _("Copy address to clipboard")) vbox.Add(self.about_text) vbox.Add(self.copy_btn, 0, wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_HORIZONTAL, 0) - self.SetSizer(vbox) + self.SetSizerAndFit(vbox) self.copy_btn.Bind(wx.EVT_BUTTON, self.on_copy) From d9761882c621f56656515607d614864ee4b26e45 Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 20 May 2011 22:47:24 -0300 Subject: [PATCH 087/190] Add BTC Guild pool server. --- guiminer.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/guiminer.py b/guiminer.py index 9b84c96..a9de26c 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1000,7 +1000,8 @@ def change_server(self, new_server): if host == "mining.bitcoin.cz": self.layout_slush() elif host == "bitpenny.dyndns.biz": self.layout_bitpenny() elif host == "deepbit.net": self.layout_deepbit() - elif host == "btcmine.com": self.layout_btcmine() + elif host == "btcmine.com": self.layout_btcmine() + elif host == "btcguild.com": self.layout_btcguild() else: self.layout_default() self.Layout() @@ -1060,8 +1061,14 @@ def request_balance_get(self, balance_auth_token): else: try: info = json.loads(data) - confirmed = info.get('confirmed_reward') or info.get('confirmed', 0) - unconfirmed = info.get('unconfirmed_reward') or info.get('unconfirmed', 0) + confirmed = (info.get('confirmed_reward') or + info.get('confirmed') or + info.get('user', {}).get('confirmed_rewards') or + 0) + unconfirmed = (info.get('unconfirmed_reward') or + info.get('unconfirmed') or + info.get('user', {}).get('unconfirmed_rewards') or + 0) if self.server_config.get('host') == "deepbit.net": ipa = info.get('ipa', False) self.withdraw.Enable(ipa) @@ -1088,7 +1095,8 @@ def on_balance_refresh(self, event=None): HOSTS_REQUIRING_AUTH_TOKEN = ["mining.bitcoin.cz", "btcmine.com", - "deepbit.net"] + "deepbit.net", + "btcguild.com"] if host in HOSTS_REQUIRING_AUTH_TOKEN: self.require_auth_token() if not self.balance_auth_token: # They cancelled the dialog @@ -1343,6 +1351,10 @@ def layout_slush(self): _("Your miner username (not your account username).\nExample: Kiv.GPU")) add_tooltip(self.txt_pass, _("Your miner password (not your account password).")) + + def layout_btcguild(self): + """BTC Guild has the same layout as slush for now.""" + self.layout_slush() def layout_btcmine(self): self.set_widgets_visible([self.host_lbl, self.txt_host, From a0b15a5e4a84ee0f4d624fad6e702f5b2194e01a Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 20 May 2011 22:47:43 -0300 Subject: [PATCH 088/190] Add BTC Guild to servers.ini. --- README.txt | 10 ++++++++++ servers.ini | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/README.txt b/README.txt index 6506e69..767715c 100644 --- a/README.txt +++ b/README.txt @@ -126,6 +126,16 @@ option reads "localhost" since the server is on your own machine. Put your username and password that you chose earlier. Then press "Start mining!" to connect and start mining. +Useful OpenCL flags +------------------- + +These flags can be entered in the Extra Flags field when using the OpenCL +miner: + +-v Enable vectors, which is faster on some cards. +-f60 Set priority to number, a higher number is lower priority. Increase + this to reduce desktop lag or to make a miner yield GPU to other + miners or games. Running From Source diff --git a/servers.ini b/servers.ini index 7cab797..cef22db 100644 --- a/servers.ini +++ b/servers.ini @@ -19,6 +19,15 @@ "balance_host": "deepbit.net", "balance_url": "/api/%s" }, + + { "name": "BTC Guild", + "host": "btcguild.com", + "url": "http://btcguild.com", + "port": 8332, + "balance_token_url": "http://btcguild.com/my_api.php", + "balance_host": "btcguild.com", + "balance_url": "/api.php?api_key=%s" + }, { "name": "BitPenny", From d8b9e5737e6c936e190397a8038771c2a2fa0566 Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 20 May 2011 22:50:44 -0300 Subject: [PATCH 089/190] Update README --- README.txt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/README.txt b/README.txt index 767715c..556fca4 100644 --- a/README.txt +++ b/README.txt @@ -130,12 +130,15 @@ Useful OpenCL flags ------------------- These flags can be entered in the Extra Flags field when using the OpenCL -miner: +miner to tweak the miner settings: -v Enable vectors, which is faster on some cards. --f60 Set priority to number, a higher number is lower priority. Increase - this to reduce desktop lag or to make a miner yield GPU to other - miners or games. +-f30 Set priority to the specified number (default 30). + A higher number is lower priority. Increase this to reduce desktop + lag or to make a miner yield GPU control to other miners or games. + +These are the most useful flags; for a complete list, see here: + http://forum.bitcoin.org/?topic=4122.0 Running From Source From c0edfd1c5cfff6a5d96a3c4a18548e54d9b9d1b7 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sat, 21 May 2011 10:27:23 -0300 Subject: [PATCH 090/190] Update README to include -s flag. --- README.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.txt b/README.txt index 556fca4..45138c6 100644 --- a/README.txt +++ b/README.txt @@ -136,6 +136,9 @@ miner to tweak the miner settings: -f30 Set priority to the specified number (default 30). A higher number is lower priority. Increase this to reduce desktop lag or to make a miner yield GPU control to other miners or games. +-s0.01 Sleep for the specified number of seconds between iterations (default 0). + Increase this to reduce hashing performance if your temperatures are + too high. These are the most useful flags; for a complete list, see here: http://forum.bitcoin.org/?topic=4122.0 From 7eb650752ce8c09793eeda38fc78d0beccfefb08 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sat, 21 May 2011 10:38:59 -0300 Subject: [PATCH 091/190] Handle case of non-ascii characters in auth token. --- guiminer.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index a9de26c..3c9ed50 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1100,7 +1100,11 @@ def on_balance_refresh(self, event=None): if host in HOSTS_REQUIRING_AUTH_TOKEN: self.require_auth_token() if not self.balance_auth_token: # They cancelled the dialog - return + return + try: + self.balance_auth_token.decode('ascii') + except UnicodeDecodeError: + return # Invalid characters in auth token self.http_thread = threading.Thread( target=self.request_balance_get, args=(self.balance_auth_token,)) From 7014e12216b8b7c52b83da087629c9335a672284 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sat, 21 May 2011 11:12:28 -0300 Subject: [PATCH 092/190] Add timestamp to console logs. --- guiminer.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/guiminer.py b/guiminer.py index 3c9ed50..a63e252 100644 --- a/guiminer.py +++ b/guiminer.py @@ -235,6 +235,10 @@ def __init__(self, parent): self.SetSizer(vbox) self.handler = logging.StreamHandler(self) + + formatter = logging.Formatter("%(asctime)s: %(message)s", + "%Y-%m-%d %H:%M:%S") + self.handler.setFormatter(formatter) logger.addHandler(self.handler) def on_focus(self): From 009cdffc8e55891ed5945594d1a2d29763049f96 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sat, 21 May 2011 18:03:52 -0300 Subject: [PATCH 093/190] Update language files and version bump. --- guiminer.py | 2 +- guiminer_es.po | 342 +++++++++++++++++++++++++------------------------ guiminer_ru.po | 328 ++++++++++++++++++++++++----------------------- messages.pot | 316 +++++++++++++++++++++++---------------------- po_to_mo.py | 4 +- 5 files changed, 511 insertions(+), 481 deletions(-) diff --git a/guiminer.py b/guiminer.py index a63e252..c43e28c 100644 --- a/guiminer.py +++ b/guiminer.py @@ -17,7 +17,7 @@ from wx.lib.agw import hyperlink from wx.lib.newevent import NewEvent -__version__ = '2011-05-01' +__version__ = '2011-05-21' def get_module_path(): """Return the folder containing this script (or its .exe).""" diff --git a/guiminer_es.po b/guiminer_es.po index 803036b..42c574b 100644 --- a/guiminer_es.po +++ b/guiminer_es.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-20 00:00-0000\n" +"POT-Creation-Date: 2011-05-20 23:09-0300\n" "PO-Revision-Date: 2011-05-20 00:00-0000\n" "Last-Translator: Bitcoins Wallet \n" "Language-Team: Español\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: guiminer.py:74 +#: guiminer.py:75 #, python-format msgid "" "GUIMiner\n" @@ -47,220 +47,220 @@ msgstr "" "Incluso una sóla Bitcoin se aprecia y ayuda a motivar\n" "a los desarrolladores en el trabajo futuro.\n" -#: guiminer.py:95 +#: guiminer.py:96 msgid "Not started" msgstr "No iniciado" -#: guiminer.py:96 +#: guiminer.py:97 msgid "Starting..." msgstr "Empezando..." -#: guiminer.py:97 +#: guiminer.py:98 msgid "Stopped" msgstr "Detenido" -#: guiminer.py:98 +#: guiminer.py:99 msgid "Paused" msgstr "Pausado" -#: guiminer.py:99 +#: guiminer.py:100 msgid "Start mining!" msgstr "Iniciar la minería" -#: guiminer.py:100 +#: guiminer.py:101 msgid "Stop mining" msgstr "Parar la minería" -#: guiminer.py:101 +#: guiminer.py:102 msgid "Refresh balance" msgstr "Actualizar saldo" -#: guiminer.py:102 +#: guiminer.py:103 msgid "Connection error" msgstr "Error de conexión" -#: guiminer.py:103 +#: guiminer.py:104 msgid "Username:" msgstr "Usuario:" -#: guiminer.py:104 +#: guiminer.py:105 msgid "Password:" msgstr "Contraseña:" -#: guiminer.py:105 +#: guiminer.py:106 msgid "Quit this program" msgstr "Salir del programa" -#: guiminer.py:106 +#: guiminer.py:107 msgid "Show about dialog" msgstr "Acerca de..." -#: guiminer.py:181 +#: guiminer.py:182 #, python-format msgid "%.1f Ghash/s" msgstr "%.1f Ghash/s" -#: guiminer.py:183 +#: guiminer.py:184 #, python-format msgid "%.1f Mhash/s" msgstr "%.1f Mhash/s" -#: guiminer.py:185 +#: guiminer.py:186 msgid "Connecting..." msgstr "Conectando..." -#: guiminer.py:187 +#: guiminer.py:188 #, python-format msgid "%d khash/s" msgstr "%d khash/s" -#: guiminer.py:211 +#: guiminer.py:212 #, python-format msgid "Requesting balance: %(request)s" msgstr "Solicitando saldo: %(request)s" -#: guiminer.py:215 +#: guiminer.py:216 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "Contestación del Servidor: %(status)s, %(data)s" -#: guiminer.py:266 +#: guiminer.py:267 msgid "Miner" msgstr "Minero" -#: guiminer.py:267 +#: guiminer.py:268 msgid "Speed" msgstr "Velocidad" -#: guiminer.py:268 +#: guiminer.py:269 msgid "Accepted" msgstr "Aceptado" -#: guiminer.py:269 +#: guiminer.py:270 msgid "Stale" msgstr "Caducado" -#: guiminer.py:270 +#: guiminer.py:271 msgid "Start/Stop" msgstr "Iniciar/Parar" -#: guiminer.py:271 +#: guiminer.py:272 msgid "Autostart" msgstr "Inicio auto." -#: guiminer.py:355 +#: guiminer.py:356 msgid "Pause all" msgstr "Pausar todos" -#: guiminer.py:357 +#: guiminer.py:358 msgid "Restore" msgstr "Restaurar" -#: guiminer.py:358 +#: guiminer.py:359 msgid "Close" msgstr "Cerrar" -#: guiminer.py:412 +#: guiminer.py:413 #, python-format msgid "Listener for \"%s\" started" msgstr "Minero \"%s\" iniciado" -#: guiminer.py:427 +#: guiminer.py:428 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "Minero \"%(name)s\": %(line)s" -#: guiminer.py:430 +#: guiminer.py:431 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "Minero \"%s\" cerrando" -#: guiminer.py:461 +#: guiminer.py:462 msgid "Server:" msgstr "Grupo:" -#: guiminer.py:466 +#: guiminer.py:467 msgid "Website:" msgstr "Sitio web:" -#: guiminer.py:468 +#: guiminer.py:469 msgid "Ext. Path:" msgstr "Ruta externa" -#: guiminer.py:470 +#: guiminer.py:471 msgid "Host:" msgstr "Servidor:" -#: guiminer.py:472 +#: guiminer.py:473 msgid "Port:" msgstr "Puerto:" -#: guiminer.py:478 +#: guiminer.py:479 msgid "Device:" msgstr "Dispositivo:" -#: guiminer.py:479 +#: guiminer.py:480 msgid "No OpenCL devices" msgstr "No hay dispositivos OpenCL" -#: guiminer.py:480 +#: guiminer.py:481 msgid "Extra flags:" msgstr "Opciones extra:" -#: guiminer.py:483 +#: guiminer.py:484 msgid "Balance:" msgstr "Saldo:" -#: guiminer.py:487 +#: guiminer.py:488 msgid "Withdraw" msgstr "Retirar saldo" -#: guiminer.py:602 +#: guiminer.py:603 msgid "Default" msgstr "Por defecto" -#: guiminer.py:649 +#: guiminer.py:650 msgid "Start" msgstr "Iniciar" -#: guiminer.py:649 +#: guiminer.py:650 msgid "Stop" msgstr "Parar" -#: guiminer.py:665 +#: guiminer.py:666 msgid "Connection problems" msgstr "Problemas de conexión" -#: guiminer.py:800 +#: guiminer.py:801 msgid "Running command: " msgstr "Ejecutando comando: " -#: guiminer.py:852 +#: guiminer.py:853 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "Dificultad 1 hashes: %(nhashes)d %(update_time)s" -#: guiminer.py:856 +#: guiminer.py:857 #, python-format msgid "Blocks: %d, " msgstr "Bloques: %d, " -#: guiminer.py:859 +#: guiminer.py:860 #, python-format msgid "Shares: %d accepted" msgstr "Tareas: %d aceptadas" -#: guiminer.py:861 +#: guiminer.py:862 #, python-format msgid ", %d stale/invalid" msgstr ", %d caducada/inválida" -#: guiminer.py:883 +#: guiminer.py:884 #, python-format msgid "- last at %s" msgstr "- última: %s" -#: guiminer.py:956 +#: guiminer.py:957 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." @@ -268,23 +268,23 @@ msgstr "" "Grupo donde conectar. Cada grupo tiene diferentes tasas y características.\n" "Ver sus páginas web para obtener toda la información." -#: guiminer.py:957 +#: guiminer.py:958 msgid "Website of the currently selected server. Click to visit." msgstr "Página web del grupo seleccionado actualmente. Clic para visitar" -#: guiminer.py:958 +#: guiminer.py:959 msgid "Available OpenCL devices on your system." msgstr "Dispositivos OpenCL disponibles en tu sistema" -#: guiminer.py:959 +#: guiminer.py:960 msgid "Host address, without http:// prefix." msgstr "Dirección del Servidor, sin el prefijo http://." -#: guiminer.py:960 +#: guiminer.py:961 msgid "Server port. This is usually 8332." msgstr "Puerto del servidor. Generalmente 8332." -#: guiminer.py:961 +#: guiminer.py:962 msgid "" "The miner's username.\n" "May be different than your account username.\n" @@ -294,7 +294,7 @@ msgstr "" "Puede ser diferente al usuario de la cuenta.\n" "Ejemplo: BitcoinsWallet.GPU" -#: guiminer.py:962 +#: guiminer.py:963 msgid "" "The miner's password.\n" "May be different than your account password." @@ -302,7 +302,7 @@ msgstr "" "Contraseña del minero.\n" "Puede ser diferente a la contraseña de la cuenta.\n" -#: guiminer.py:963 +#: guiminer.py:964 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" @@ -312,33 +312,39 @@ msgstr "" "Para obtener mejores resultados con las Radeon HD 5xxx utiliza -v -w128.\n" "Para otras tarjetas, consultar el foro: http://forum.bitcoin.org/." -#: guiminer.py:1044 +#: guiminer.py:1058 guiminer.py:1148 guiminer.py:1169 +msgid "Auth token rejected by server." +msgstr "Código de autorización rechazado por el servidor" + +#: guiminer.py:1076 #, python-format msgid "%s confirmed" msgstr "%s confirmado" -#: guiminer.py:1046 +#: guiminer.py:1078 #, python-format msgid ", %s unconfirmed" msgstr ", %s sin confirmar" -#: guiminer.py:1048 +#: guiminer.py:1080 msgid "Bad response from server." msgstr "Respuesta incorrecta del servidor." -#: guiminer.py:1137 +#: guiminer.py:1152 guiminer.py:1173 msgid "Withdraw OK" msgstr "Retirada de saldo correcta" -#: guiminer.py:1296 +#: guiminer.py:1332 msgid "No registration is required - just enter an address and press Start." -msgstr "No es necesario el registro - sólo introduce una dirección y presiona Iniciar." +msgstr "" +"No es necesario el registro - sólo introduce una dirección y presiona " +"Iniciar." -#: guiminer.py:1298 +#: guiminer.py:1334 msgid "Address:" msgstr "Dirección:" -#: guiminer.py:1300 +#: guiminer.py:1336 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" @@ -346,7 +352,7 @@ msgstr "" "Tu cuenta para recibir Bitcoins.\n" "Ejemplo: 1LSEcWhBwvQ6r5wWC6ZfHRtDrTmybqXbLk" -#: guiminer.py:1315 +#: guiminer.py:1351 msgid "" "Your miner username (not your account username).\n" "Example: Kiv.GPU" @@ -354,11 +360,11 @@ msgstr "" "Tu usuario del minero, (no el usuario de la cuenta).\n" "Ejemplo: BitcoinsWallet.GPU" -#: guiminer.py:1317 guiminer.py:1333 +#: guiminer.py:1353 guiminer.py:1373 msgid "Your miner password (not your account password)." msgstr "Contraseña del minero (no la contraseña de la cuenta).\n" -#: guiminer.py:1331 +#: guiminer.py:1371 msgid "" "Your miner username. \n" "Example: kiv123@kiv123" @@ -366,200 +372,183 @@ msgstr "" "El usuario del minero. \n" "Ejemplo: BitcoinsWallet@kiv123" -#: guiminer.py:1347 +#: guiminer.py:1387 msgid "The e-mail address you registered with." msgstr "El correo electrónico con el que te registraste." -#: guiminer.py:1348 +#: guiminer.py:1388 msgid "Email:" msgstr "Correo electrónico:" -#: guiminer.py:1363 +#: guiminer.py:1403 msgid "&Rename..." msgstr "&Renombrar..." -#: guiminer.py:1363 +#: guiminer.py:1403 msgid "Rename this miner" msgstr "Renombrar este minero" -#: guiminer.py:1384 +#: guiminer.py:1427 msgid "&New OpenCL miner..." msgstr "&Nuevo minero OpenCL..." -#: guiminer.py:1384 +#: guiminer.py:1427 msgid "Create a new miner profile" msgstr "Crear un nuevo perfil de minero" -#: guiminer.py:1385 +#: guiminer.py:1428 msgid "Create a CPU or CUDA miner (requires external program)" msgstr "Crear un nuevo minero CPU o CUDA (requiere un programa externo)" -#: guiminer.py:1385 +#: guiminer.py:1428 msgid "New &other miner..." msgstr "Nuevo minero diferente..." -#: guiminer.py:1386 +#: guiminer.py:1429 msgid "&Save settings" msgstr "&Guardar opciones" -#: guiminer.py:1386 +#: guiminer.py:1429 msgid "Save your settings" msgstr "Guardar tus opciones" -#: guiminer.py:1387 +#: guiminer.py:1430 msgid "&Load settings" msgstr "&Cargar opciones" -#: guiminer.py:1387 +#: guiminer.py:1430 msgid "Load stored settings" msgstr "Cargar las opciones guardadas" -#: guiminer.py:1388 +#: guiminer.py:1431 msgid "Quit" msgstr "Salir" -#: guiminer.py:1389 +#: guiminer.py:1432 msgid "&File" msgstr "&Archivo" -#: guiminer.py:1393 +#: guiminer.py:1436 msgid "Show summary" msgstr "Mostrar sumario" -#: guiminer.py:1393 +#: guiminer.py:1436 msgid "Show summary of all miners" msgstr "Mostrar sumario de todos los mineros" -#: guiminer.py:1394 +#: guiminer.py:1437 msgid "Show console" msgstr "Mostrar consola" -#: guiminer.py:1394 +#: guiminer.py:1437 msgid "Show console logs" msgstr "Mostrar los registros de la consola" -#: guiminer.py:1395 +#: guiminer.py:1438 msgid "&View" msgstr "&Ver" -#: guiminer.py:1399 +#: guiminer.py:1442 msgid "&Create solo password..." msgstr "&Crear usuario/contraseña..." -#: guiminer.py:1399 +#: guiminer.py:1442 msgid "Configure a user/pass for solo mining" msgstr "Configurar un usuario/contraseña para la minería en modo 'solo'" -#: guiminer.py:1400 +#: guiminer.py:1443 msgid "&Set Bitcoin client path..." msgstr "&Configurar la ruta del cliente Bitcoin..." -#: guiminer.py:1400 +#: guiminer.py:1443 msgid "Set the location of the official Bitcoin client" msgstr "Configurar la ruta del cliente oficial Bitcoin." -#: guiminer.py:1401 +#: guiminer.py:1444 msgid "&Launch Bitcoin client as server" msgstr "&Ejecutar el cliente Bitcoin como servidor" -#: guiminer.py:1401 +#: guiminer.py:1444 msgid "Launch the official Bitcoin client as a server for solo mining" -msgstr "Ejecutar el cliente Bitcoin como servidor para la minería en modo 'solo'" +msgstr "" +"Ejecutar el cliente Bitcoin como servidor para la minería en modo 'solo'" -#: guiminer.py:1402 +#: guiminer.py:1445 msgid "&Solo utilities" msgstr "&Minería en modo 'solo'" -#: guiminer.py:1406 +#: guiminer.py:1449 msgid "&Change language..." msgstr "&Cambiar idioma..." -#: guiminer.py:1407 +#: guiminer.py:1450 msgid "Language" msgstr "Idioma" -#: guiminer.py:1410 +#: guiminer.py:1453 msgid "&About/Donate..." msgstr "&Acerca de/Donaciones..." -#: guiminer.py:1412 +#: guiminer.py:1455 msgid "&Help" msgstr "&Ayuda" -#: guiminer.py:1424 +#: guiminer.py:1467 msgid "Failed to load taskbar icon; continuing." msgstr "Error al cargar el icono de bandeja del sistema; continunando...." -#: guiminer.py:1432 -msgid "" -"No OpenCL devices were found.\n" -"If you only want to mine using CPU or CUDA, you can ignore this message.\n" -"If you want to mine on ATI graphics cards, you may need to install the ATI " -"Stream\n" -"SDK, or your GPU may not support OpenCL.\n" -msgstr "" -"No se han encontrado dispositivos OpenCL.\n" -"Si sólo quieres minar utilizando CPU or CUDA, puedes ignorar este mensaje.\n" -"Si quieres minar con tarjetas gráficas ATI, podrías necesitar instalar el SDK " -"del ATI Stream\n" -"o tu GPU podría no aceptar OpenCL.\n" - -#: guiminer.py:1437 -msgid "No OpenCL devices found." -"No se han encontrado dispositivos OpenCL." - -#: guiminer.py:1440 +#: guiminer.py:1476 msgid "OpenCL not found - can't add a OpenCL miner" msgstr "OpenCL no encontrado. No se puede añadir un minero OpenCL" -#: guiminer.py:1465 +#: guiminer.py:1506 #, python-format msgid "GUIMiner - v%s" msgstr "GUIMiner - v%s" -#: guiminer.py:1507 +#: guiminer.py:1548 msgid "Name this miner:" msgstr "Nombre para este minero:" -#: guiminer.py:1507 +#: guiminer.py:1548 msgid "New miner" msgstr "Nuevo minero" -#: guiminer.py:1510 +#: guiminer.py:1551 msgid "Untitled" msgstr "Sin nombre" -#: guiminer.py:1521 - +#: guiminer.py:1562 msgid "External miner (*.exe)|*.exe" msgstr "Minero externo (*.exe)|*.exe" -#: guiminer.py:1523 +#: guiminer.py:1564 msgid "Select external miner:" msgstr "Seleccionar un minero externo:" -#: guiminer.py:1533 +#: guiminer.py:1574 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" -msgstr "Minero externo %(filename)s no compatible. Los compatibles son: %(supported)" +msgstr "" +"Minero externo %(filename)s no compatible. Los compatibles son: %(supported)" -#: guiminer.py:1535 +#: guiminer.py:1576 msgid "Miner not supported" msgstr "Minero no compatible" -#: guiminer.py:1561 +#: guiminer.py:1602 msgid "Do you want to save changes?" msgstr "¿Quieres guardar los cambios?" -#: guiminer.py:1561 +#: guiminer.py:1602 msgid "Save" msgstr "Guardar" -#: guiminer.py:1589 +#: guiminer.py:1631 msgid "Saving: " msgstr "Guardando: " -#: guiminer.py:1595 +#: guiminer.py:1637 #, python-format msgid "" "Couldn't write save file %s.\n" @@ -568,130 +557,153 @@ msgstr "" "No se puede guardar el archivo %s.\n" "Comprueba que la ubicación permite la escritura" -#: guiminer.py:1596 +#: guiminer.py:1638 msgid "Save unsuccessful" msgstr "Error al guardar" -#: guiminer.py:1598 +#: guiminer.py:1640 #, python-format msgid "Profiles saved OK to %s." msgstr "Los perfiles se han guardado correctamente en %s." -#: guiminer.py:1599 +#: guiminer.py:1641 msgid "Save successful" msgstr "Guardado correcto" -#: guiminer.py:1611 +#: guiminer.py:1653 #, python-format msgid "Loaded: %s" msgstr "Cargado: %s" -#: guiminer.py:1620 +#: guiminer.py:1667 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "Cargar los perfiles parará los mineros que trabajen ahora. Продолжить?" -#: guiminer.py:1621 +#: guiminer.py:1668 msgid "Load profile" msgstr "Cargar perfil" -#: guiminer.py:1650 +#: guiminer.py:1697 msgid "Select path to Bitcoin.exe" msgstr "Seleccionar ruta para Bitcoin.exe" -#: guiminer.py:1662 +#: guiminer.py:1709 msgid "About" msgstr "Acerca de" -#: guiminer.py:1688 +#: guiminer.py:1735 msgid "Closing this miner will stop it. Continue?" msgstr "Cerrar este minero lo parará. ¿Continuar?" -#: guiminer.py:1689 +#: guiminer.py:1736 msgid "Close miner" msgstr "Cerrar minero" -#: guiminer.py:1718 +#: guiminer.py:1765 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" msgstr "No se puede encontrar Bitcoin en %s. ¿La ruta es correcta?" -#: guiminer.py:1719 +#: guiminer.py:1766 msgid "Launch failed" msgstr "Fallo al iniciar" -#: guiminer.py:1722 +#: guiminer.py:1769 msgid "" "Client launched ok. You can start a miner now with the server set to 'solo'." msgstr "" "Cliente ejecutado correctamente. Ahora puedes iniciar\n" "un minero con el servidor configurado en modo 'solo'" -#: guiminer.py:1723 +#: guiminer.py:1770 msgid "Launched ok." msgstr "Ejecutado correctamente." -#: guiminer.py:1738 +#: guiminer.py:1785 #, python-format msgid "%s already exists. Overwrite?" msgstr "%s ya existe. ¿Sobreescribir?" -#: guiminer.py:1739 +#: guiminer.py:1786 msgid "bitcoin.conf already exists." msgstr "bitcoin.conf ya existe." -#: guiminer.py:1744 +#: guiminer.py:1791 msgid "Enter password" msgstr "Introducir contraseña" -#: guiminer.py:1754 +#: guiminer.py:1801 msgid "Success" msgstr "Correcto" -#: guiminer.py:1754 +#: guiminer.py:1801 msgid "Wrote bitcoin config ok." msgstr "bitcoin.conf escrito correctamente." -#: guiminer.py:1765 +#: guiminer.py:1812 msgid "Console" msgstr "Consola" -#: guiminer.py:1777 +#: guiminer.py:1824 msgid "Summary" msgstr "Sumario" -#: guiminer.py:1790 +#: guiminer.py:1837 msgid "Rename miner" msgstr "Renombrar minero" -#: guiminer.py:1790 +#: guiminer.py:1837 msgid "Rename to:" msgstr "Renombrar a:" -#: guiminer.py:1795 +#: guiminer.py:1842 msgid "Change language" msgstr "Cambiar idioma" -#: guiminer.py:1814 +#: guiminer.py:1861 msgid "Choose language (requires restart to take full effect)" msgstr "Elegir idioma (se necesita reiniciar para completar)" -#: guiminer.py:1859 +#: guiminer.py:1906 msgid "" "Click the link below to log in to the pool and get a special token. \n" "This token lets you securely check your balance.\n" "To remember this token for the future, save your miner settings." msgstr "" "Hacer clic en el enlace de abajo para entrar en el grupo y conseguir el\n" -"código de la API. Este código te permitirá comprobar tu saldo de forma segura.\n" +"código de la API. Este código te permitirá comprobar tu saldo de forma " +"segura.\n" "Para guardar este código, deberás guardar la configuración de tu minero." -#: guiminer.py:1868 +#: guiminer.py:1915 msgid "(Paste token here)" msgstr "(Pegar el código aquí)" -#: guiminer.py:1894 +#: guiminer.py:1941 msgid "Copy address to clipboard" msgstr "Copiar dirección al portapapeles" +#: guiminer.py:1960 +msgid "No OpenCL devices found." +msgstr "No se han encontrado dispositivos OpenCL." + +#: guiminer.py:1963 +msgid "" +"No OpenCL devices were found.\n" +" If you only want to mine using CPU or CUDA, you can ignore this message.\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI " +"Stream\n" +" SDK, or your GPU may not support OpenCL." +msgstr "" +"No se han encontrado dispositivos OpenCL.\n" +"Si sólo quieres minar utilizando CPU or CUDA, puedes ignorar este mensaje.\n" +"Si quieres minar con tarjetas gráficas ATI, podrías necesitar instalar el " +"SDK del ATI Stream\n" +"o tu GPU podría no aceptar OpenCL.\n" + +#: guiminer.py:1973 +msgid "Don't show this message again" +msgstr "No volver a mostrar este mensaje" + #~ msgid "%s mining!" #~ msgstr "%s minería" diff --git a/guiminer_ru.po b/guiminer_ru.po index 6057374..d7e9723 100644 --- a/guiminer_ru.po +++ b/guiminer_ru.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-01 08:49-0300\n" +"POT-Creation-Date: 2011-05-20 23:09-0300\n" "PO-Revision-Date: 2011-04-20 19:55-0400\n" "Last-Translator: Chris MacLeod \n" "Language-Team: Russian\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: guiminer.py:74 +#: guiminer.py:75 #, python-format msgid "" "GUIMiner\n" @@ -51,220 +51,220 @@ msgstr "" "Даже один Биткоин полезен и помогает мотивировать\n" "дальнейшую работу над этой программой.\n" -#: guiminer.py:95 +#: guiminer.py:96 msgid "Not started" msgstr "Не запущен" -#: guiminer.py:96 +#: guiminer.py:97 msgid "Starting..." msgstr "Запускается..." -#: guiminer.py:97 +#: guiminer.py:98 msgid "Stopped" msgstr "Остановлен" -#: guiminer.py:98 +#: guiminer.py:99 msgid "Paused" msgstr "Пауза" -#: guiminer.py:99 +#: guiminer.py:100 msgid "Start mining!" msgstr "Старт!" -#: guiminer.py:100 +#: guiminer.py:101 msgid "Stop mining" msgstr "Стоп!" -#: guiminer.py:101 +#: guiminer.py:102 msgid "Refresh balance" msgstr "Проверить баланс" -#: guiminer.py:102 +#: guiminer.py:103 msgid "Connection error" msgstr "Ошибка связи" -#: guiminer.py:103 +#: guiminer.py:104 msgid "Username:" msgstr "Логин:" -#: guiminer.py:104 +#: guiminer.py:105 msgid "Password:" msgstr "Пароль:" -#: guiminer.py:105 +#: guiminer.py:106 msgid "Quit this program" msgstr "Выход из программы" -#: guiminer.py:106 +#: guiminer.py:107 msgid "Show about dialog" msgstr "Показать информацию о программе" -#: guiminer.py:181 +#: guiminer.py:182 #, python-format msgid "%.1f Ghash/s" msgstr "%.1f Ghash/s" -#: guiminer.py:183 +#: guiminer.py:184 #, python-format msgid "%.1f Mhash/s" msgstr "%.1f Mhash/s" -#: guiminer.py:185 +#: guiminer.py:186 msgid "Connecting..." msgstr "Соединяемся..." -#: guiminer.py:187 +#: guiminer.py:188 #, python-format msgid "%d khash/s" msgstr "%d khash/s" -#: guiminer.py:211 +#: guiminer.py:212 #, python-format msgid "Requesting balance: %(request)s" msgstr "Запрашивается баланс: %(request)s" -#: guiminer.py:215 +#: guiminer.py:216 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "Ответ сервера: %(status)s, %(data)s" -#: guiminer.py:266 +#: guiminer.py:267 msgid "Miner" msgstr "Генератор" -#: guiminer.py:267 +#: guiminer.py:268 msgid "Speed" msgstr "Скорость" -#: guiminer.py:268 +#: guiminer.py:269 msgid "Accepted" msgstr "Принято" -#: guiminer.py:269 +#: guiminer.py:270 msgid "Stale" msgstr "Сбой" -#: guiminer.py:270 +#: guiminer.py:271 msgid "Start/Stop" msgstr "Старт/Стоп" -#: guiminer.py:271 +#: guiminer.py:272 msgid "Autostart" msgstr "Автостарт" -#: guiminer.py:355 +#: guiminer.py:356 msgid "Pause all" msgstr "Приостановить все" -#: guiminer.py:357 +#: guiminer.py:358 msgid "Restore" msgstr "Восстановить" -#: guiminer.py:358 +#: guiminer.py:359 msgid "Close" msgstr "Закрыть" -#: guiminer.py:412 +#: guiminer.py:413 #, python-format msgid "Listener for \"%s\" started" msgstr "Прослушивание \"%s\" начато" -#: guiminer.py:427 +#: guiminer.py:428 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "Прослушивание \"%(name)s\": %(line)s" -#: guiminer.py:430 +#: guiminer.py:431 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "Прослушивание \"%s\" завершается" -#: guiminer.py:461 +#: guiminer.py:462 msgid "Server:" msgstr "Сервер:" -#: guiminer.py:466 +#: guiminer.py:467 msgid "Website:" msgstr "Вэбсайт:" -#: guiminer.py:468 +#: guiminer.py:469 msgid "Ext. Path:" msgstr "Вншн. путь:" -#: guiminer.py:470 +#: guiminer.py:471 msgid "Host:" msgstr "Хост:" -#: guiminer.py:472 +#: guiminer.py:473 msgid "Port:" msgstr "Порт:" -#: guiminer.py:478 +#: guiminer.py:479 msgid "Device:" msgstr "Устройство:" -#: guiminer.py:479 +#: guiminer.py:480 msgid "No OpenCL devices" msgstr "Нет OpenCL устройств" -#: guiminer.py:480 +#: guiminer.py:481 msgid "Extra flags:" msgstr "Доп. параметры:" -#: guiminer.py:483 +#: guiminer.py:484 msgid "Balance:" msgstr "Баланс:" -#: guiminer.py:487 +#: guiminer.py:488 msgid "Withdraw" msgstr "Снять деньги" -#: guiminer.py:602 +#: guiminer.py:603 msgid "Default" msgstr "По умолчанию" -#: guiminer.py:649 +#: guiminer.py:650 msgid "Start" msgstr "Старт" -#: guiminer.py:649 +#: guiminer.py:650 msgid "Stop" msgstr "Стоп" -#: guiminer.py:665 +#: guiminer.py:666 msgid "Connection problems" msgstr "Сбой связи" -#: guiminer.py:800 +#: guiminer.py:801 msgid "Running command: " msgstr "Выполняется команда: " -#: guiminer.py:852 +#: guiminer.py:853 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "Хэши сложности 1: %(nhashes)d %(update_time)s" -#: guiminer.py:856 +#: guiminer.py:857 #, python-format msgid "Blocks: %d, " msgstr "Блоки: %d, " -#: guiminer.py:859 +#: guiminer.py:860 #, python-format msgid "Shares: %d accepted" msgstr "Доли: %d приняты" -#: guiminer.py:861 +#: guiminer.py:862 #, python-format msgid ", %d stale/invalid" msgstr ", %d дубли/сбойные" -#: guiminer.py:883 +#: guiminer.py:884 #, python-format msgid "- last at %s" msgstr "- последняя в %s" -#: guiminer.py:956 +#: guiminer.py:957 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." @@ -273,23 +273,23 @@ msgstr "" "процент.\n" "Подробней смотрите на их сайтах." -#: guiminer.py:957 +#: guiminer.py:958 msgid "Website of the currently selected server. Click to visit." msgstr "Вэбсайт выбранного сервера. Нажмите чтобы открыть." -#: guiminer.py:958 +#: guiminer.py:959 msgid "Available OpenCL devices on your system." msgstr "OpenCL устройства, доступные на вашей системе." -#: guiminer.py:959 +#: guiminer.py:960 msgid "Host address, without http:// prefix." msgstr "Адрес Хоста, без http:// префикса." -#: guiminer.py:960 +#: guiminer.py:961 msgid "Server port. This is usually 8332." msgstr "Порт сервера. Обычно 8332." -#: guiminer.py:961 +#: guiminer.py:962 msgid "" "The miner's username.\n" "May be different than your account username.\n" @@ -299,7 +299,7 @@ msgstr "" "Может отличаться от логина вашего аккаунта.\n" "Пример: Kiv.GPU" -#: guiminer.py:962 +#: guiminer.py:963 msgid "" "The miner's password.\n" "May be different than your account password." @@ -307,7 +307,7 @@ msgstr "" "Пароль генератора (miner password).\n" "Может отличаться от пароля вашего аккаунта." -#: guiminer.py:963 +#: guiminer.py:964 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" @@ -317,33 +317,37 @@ msgstr "" "Для лучших результатов на Радеонах HD 5xxx серий, используйте -v -w128.\n" "По поводу других видеокарт - проверьте форум." -#: guiminer.py:1044 +#: guiminer.py:1058 guiminer.py:1148 guiminer.py:1169 +msgid "Auth token rejected by server." +msgstr "" + +#: guiminer.py:1076 #, python-format msgid "%s confirmed" msgstr "%s подтверждено" -#: guiminer.py:1046 +#: guiminer.py:1078 #, python-format msgid ", %s unconfirmed" msgstr ", %s не подтверждено" -#: guiminer.py:1048 +#: guiminer.py:1080 msgid "Bad response from server." msgstr "Неправильный ответ сервера." -#: guiminer.py:1137 +#: guiminer.py:1152 guiminer.py:1173 msgid "Withdraw OK" msgstr "Выплата произведена" -#: guiminer.py:1296 +#: guiminer.py:1332 msgid "No registration is required - just enter an address and press Start." msgstr "Регистрации не требуется - введите ваш адрес и нажмите Старт." -#: guiminer.py:1298 +#: guiminer.py:1334 msgid "Address:" msgstr "Адрес:" -#: guiminer.py:1300 +#: guiminer.py:1336 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" @@ -351,7 +355,7 @@ msgstr "" "Ваш счет для получения Биткоинов.\n" "Пример: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" -#: guiminer.py:1315 +#: guiminer.py:1351 msgid "" "Your miner username (not your account username).\n" "Example: Kiv.GPU" @@ -359,11 +363,11 @@ msgstr "" "Логин генератора (miner username), может отличаться от логина аккаунта.\n" "Пример: Kiv.GPU" -#: guiminer.py:1317 guiminer.py:1333 +#: guiminer.py:1353 guiminer.py:1373 msgid "Your miner password (not your account password)." msgstr "Пароль генератора, может отличаться от пароля аккаунта ." -#: guiminer.py:1331 +#: guiminer.py:1371 msgid "" "Your miner username. \n" "Example: kiv123@kiv123" @@ -371,203 +375,185 @@ msgstr "" "Логин генератора. \n" "Например: kiv123@kiv123" -#: guiminer.py:1347 +#: guiminer.py:1387 msgid "The e-mail address you registered with." msgstr "Эл. почта под которой вы зарегистрировались." -#: guiminer.py:1348 +#: guiminer.py:1388 msgid "Email:" msgstr "Эмэйл:" -#: guiminer.py:1363 +#: guiminer.py:1403 msgid "&Rename..." msgstr "&Переименовать..." -#: guiminer.py:1363 +#: guiminer.py:1403 msgid "Rename this miner" msgstr "Переименовать этот генератор" -#: guiminer.py:1384 +#: guiminer.py:1427 msgid "&New OpenCL miner..." msgstr "&Создать OpenCL генератор..." -#: guiminer.py:1384 +#: guiminer.py:1427 msgid "Create a new miner profile" msgstr "Создать новый профиль генератора" -#: guiminer.py:1385 +#: guiminer.py:1428 msgid "Create a CPU or CUDA miner (requires external program)" msgstr "Создать CPU или CUDA генератор (требуется дополнительный софт)" -#: guiminer.py:1385 +#: guiminer.py:1428 msgid "New &other miner..." msgstr "Создать &другой генератор..." -#: guiminer.py:1386 +#: guiminer.py:1429 msgid "&Save settings" msgstr "&Сохранить настройки" -#: guiminer.py:1386 +#: guiminer.py:1429 msgid "Save your settings" msgstr "Сохранить текущие настройки генераторов" -#: guiminer.py:1387 +#: guiminer.py:1430 msgid "&Load settings" msgstr "&Загрузить настройки" -#: guiminer.py:1387 +#: guiminer.py:1430 msgid "Load stored settings" msgstr "Загрузить сохраненные настройки генераторов" -#: guiminer.py:1388 +#: guiminer.py:1431 msgid "Quit" msgstr "Выход" -#: guiminer.py:1389 +#: guiminer.py:1432 msgid "&File" msgstr "&Файл" -#: guiminer.py:1393 +#: guiminer.py:1436 msgid "Show summary" msgstr "Показать итоги" -#: guiminer.py:1393 +#: guiminer.py:1436 msgid "Show summary of all miners" msgstr "Показать таблицу со всеми генераторами" -#: guiminer.py:1394 +#: guiminer.py:1437 msgid "Show console" msgstr "Показать консоль" -#: guiminer.py:1394 +#: guiminer.py:1437 msgid "Show console logs" msgstr "Показать лог консоли" -#: guiminer.py:1395 +#: guiminer.py:1438 msgid "&View" msgstr "&Вид" -#: guiminer.py:1399 +#: guiminer.py:1442 msgid "&Create solo password..." msgstr "&Создать соло пароль..." -#: guiminer.py:1399 +#: guiminer.py:1442 msgid "Configure a user/pass for solo mining" msgstr "Настроить логин/пароль для генерирования в одиночку (без пула)" -#: guiminer.py:1400 +#: guiminer.py:1443 msgid "&Set Bitcoin client path..." msgstr "&Путь к клиенту Bitcoin..." -#: guiminer.py:1400 +#: guiminer.py:1443 msgid "Set the location of the official Bitcoin client" msgstr "Указать путь к официальному клиенту Bitcoin." -#: guiminer.py:1401 +#: guiminer.py:1444 msgid "&Launch Bitcoin client as server" msgstr "&Запустить Bitcoin клиент как сервер" -#: guiminer.py:1401 +#: guiminer.py:1444 msgid "Launch the official Bitcoin client as a server for solo mining" msgstr "" "Запустить официальный Bitcoin клиент в режиме сервера для одиночного " "генерирования" -#: guiminer.py:1402 +#: guiminer.py:1445 msgid "&Solo utilities" msgstr "&Соло режим" -#: guiminer.py:1406 +#: guiminer.py:1449 msgid "&Change language..." msgstr "Изменить язык..." -#: guiminer.py:1407 +#: guiminer.py:1450 msgid "Language" msgstr "Язык" -#: guiminer.py:1410 +#: guiminer.py:1453 msgid "&About/Donate..." msgstr "&О программе/Помочь..." -#: guiminer.py:1412 +#: guiminer.py:1455 msgid "&Help" msgstr "&Помощь" -#: guiminer.py:1424 +#: guiminer.py:1467 msgid "Failed to load taskbar icon; continuing." msgstr "Не удалось загрузить иконку таскбара; продолжаю...." -#: guiminer.py:1432 -msgid "" -"No OpenCL devices were found.\n" -"If you only want to mine using CPU or CUDA, you can ignore this message.\n" -"If you want to mine on ATI graphics cards, you may need to install the ATI " -"Stream\n" -"SDK, or your GPU may not support OpenCL.\n" -msgstr "" -"Не обнаружено OpenCL устройств.\n" -"Если вы собирались генерировать используя CPU или CUDA, игнорируйте это " -"сообщение.\n" -"Если вы хотите генерировать на видеокартах ATI, нужно установить ATI Stream\n" -"SDK. Или возможно, ваша карта не поддерживает OpenCL.\n" - -#: guiminer.py:1437 -msgid "No OpenCL devices found." -msgstr "Не обнаружено OpenCL устройств." - -#: guiminer.py:1440 +#: guiminer.py:1476 msgid "OpenCL not found - can't add a OpenCL miner" msgstr "OpenCL не обнаружен - нельзя добавить OpenCL генератор" -#: guiminer.py:1465 +#: guiminer.py:1506 #, python-format msgid "GUIMiner - v%s" msgstr "GUIMiner - v%s" -#: guiminer.py:1507 +#: guiminer.py:1548 msgid "Name this miner:" msgstr "Назовите генератор:" -#: guiminer.py:1507 +#: guiminer.py:1548 msgid "New miner" msgstr "Новый генератор" -#: guiminer.py:1510 +#: guiminer.py:1551 msgid "Untitled" msgstr "Без имени" -#: guiminer.py:1521 +#: guiminer.py:1562 msgid "External miner (*.exe)|*.exe" msgstr "Внешний генератор (*.exe)|*.exe" -#: guiminer.py:1523 +#: guiminer.py:1564 msgid "Select external miner:" msgstr "Выберите внешний генератор:" -#: guiminer.py:1533 +#: guiminer.py:1574 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" msgstr "" "Неподдерживаемый внешний генератор %(filename)s. Поддерживаемые: %(supported)" "s" -#: guiminer.py:1535 +#: guiminer.py:1576 msgid "Miner not supported" msgstr "Генератор не поддерживается" -#: guiminer.py:1561 +#: guiminer.py:1602 msgid "Do you want to save changes?" msgstr "Сохранить настройки?" -#: guiminer.py:1561 +#: guiminer.py:1602 msgid "Save" msgstr "Сохранить" -#: guiminer.py:1589 +#: guiminer.py:1631 msgid "Saving: " msgstr "Сохранение: " -#: guiminer.py:1595 +#: guiminer.py:1637 #, python-format msgid "" "Couldn't write save file %s.\n" @@ -576,114 +562,114 @@ msgstr "" "Не могу записать файл %s.\n" "Проверьте, не указан ли для целевой папки параметр \"только для чтения" -#: guiminer.py:1596 +#: guiminer.py:1638 msgid "Save unsuccessful" msgstr "Сохранение не удалось" -#: guiminer.py:1598 +#: guiminer.py:1640 #, python-format msgid "Profiles saved OK to %s." msgstr "Профили успешно сохранены в %s." -#: guiminer.py:1599 +#: guiminer.py:1641 msgid "Save successful" msgstr "Сохранение успешно" -#: guiminer.py:1611 +#: guiminer.py:1653 #, python-format msgid "Loaded: %s" msgstr "Загружено: %s" -#: guiminer.py:1620 +#: guiminer.py:1667 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "Загрузка настроек остановит все текущие генераторы. Продолжить?" -#: guiminer.py:1621 +#: guiminer.py:1668 msgid "Load profile" msgstr "Загрузить настройки" -#: guiminer.py:1650 +#: guiminer.py:1697 msgid "Select path to Bitcoin.exe" msgstr "Указать расположение Bitcoin.exe" -#: guiminer.py:1662 +#: guiminer.py:1709 msgid "About" msgstr "О программе" -#: guiminer.py:1688 +#: guiminer.py:1735 msgid "Closing this miner will stop it. Continue?" msgstr "Закрытие генератора остановит его. Продолжить?" -#: guiminer.py:1689 +#: guiminer.py:1736 msgid "Close miner" msgstr "Закрыть генератор" -#: guiminer.py:1718 +#: guiminer.py:1765 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" msgstr "Не могу найти Bitcoin в %s. Путь указан правильно?" -#: guiminer.py:1719 +#: guiminer.py:1766 msgid "Launch failed" msgstr "Сбой запуска" -#: guiminer.py:1722 +#: guiminer.py:1769 msgid "" "Client launched ok. You can start a miner now with the server set to 'solo'." msgstr "" "Клиент успешно запущен. Можно запустить генератор с указанием на \"Соло\" " "сервер." -#: guiminer.py:1723 +#: guiminer.py:1770 msgid "Launched ok." msgstr "Успешно запущено." -#: guiminer.py:1738 +#: guiminer.py:1785 #, python-format msgid "%s already exists. Overwrite?" msgstr "%s Уже существует. Перезаписать?" -#: guiminer.py:1739 +#: guiminer.py:1786 msgid "bitcoin.conf already exists." msgstr "bitcoin.conf уже существует." -#: guiminer.py:1744 +#: guiminer.py:1791 msgid "Enter password" msgstr "Введите пароль" -#: guiminer.py:1754 +#: guiminer.py:1801 msgid "Success" msgstr "Успешно" -#: guiminer.py:1754 +#: guiminer.py:1801 msgid "Wrote bitcoin config ok." msgstr "bitcoin.conf успешно записан." -#: guiminer.py:1765 +#: guiminer.py:1812 msgid "Console" msgstr "Консоль" -#: guiminer.py:1777 +#: guiminer.py:1824 msgid "Summary" msgstr "Итог" -#: guiminer.py:1790 +#: guiminer.py:1837 msgid "Rename miner" msgstr "Переименовать генератор" -#: guiminer.py:1790 +#: guiminer.py:1837 msgid "Rename to:" msgstr "Переименовать в:" -#: guiminer.py:1795 +#: guiminer.py:1842 msgid "Change language" msgstr "Изменить язык" -#: guiminer.py:1814 +#: guiminer.py:1861 msgid "Choose language (requires restart to take full effect)" msgstr "Выбрать другой язык (требуется перезапуск программы)" -#: guiminer.py:1859 +#: guiminer.py:1906 msgid "" "Click the link below to log in to the pool and get a special token. \n" "This token lets you securely check your balance.\n" @@ -694,13 +680,35 @@ msgstr "" "Этот код позволяет проверять состояние баланса.\n" "При сохранении настроек, код сохраняется." -#: guiminer.py:1868 +#: guiminer.py:1915 msgid "(Paste token here)" msgstr "(Копируйте код сюда)" -#: guiminer.py:1894 +#: guiminer.py:1941 msgid "Copy address to clipboard" msgstr "Копировать адрес в буфер обмена" +#: guiminer.py:1960 +msgid "No OpenCL devices found." +msgstr "Не обнаружено OpenCL устройств." + +#: guiminer.py:1963 +msgid "" +"No OpenCL devices were found.\n" +" If you only want to mine using CPU or CUDA, you can ignore this message.\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI " +"Stream\n" +" SDK, or your GPU may not support OpenCL." +msgstr "" +"Не обнаружено OpenCL устройств.\n" +"Если вы собирались генерировать используя CPU или CUDA, игнорируйте это " +"сообщение.\n" +"Если вы хотите генерировать на видеокартах ATI, нужно установить ATI Stream\n" +"SDK. Или возможно, ваша карта не поддерживает OpenCL.\n" + +#: guiminer.py:1973 +msgid "Don't show this message again" +msgstr "" + #~ msgid "%s mining!" #~ msgstr "%s генерации" diff --git a/messages.pot b/messages.pot index be06283..b8b81e7 100644 --- a/messages.pot +++ b/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-01 08:49-0300\n" +"POT-Creation-Date: 2011-05-20 23:09-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: guiminer.py:74 +#: guiminer.py:75 #, python-format msgid "" "GUIMiner\n" @@ -39,617 +39,625 @@ msgid "" "further work on this software.\n" msgstr "" -#: guiminer.py:95 +#: guiminer.py:96 msgid "Not started" msgstr "" -#: guiminer.py:96 +#: guiminer.py:97 msgid "Starting..." msgstr "" -#: guiminer.py:97 +#: guiminer.py:98 msgid "Stopped" msgstr "" -#: guiminer.py:98 +#: guiminer.py:99 msgid "Paused" msgstr "" -#: guiminer.py:99 +#: guiminer.py:100 msgid "Start mining!" msgstr "" -#: guiminer.py:100 +#: guiminer.py:101 msgid "Stop mining" msgstr "" -#: guiminer.py:101 +#: guiminer.py:102 msgid "Refresh balance" msgstr "" -#: guiminer.py:102 +#: guiminer.py:103 msgid "Connection error" msgstr "" -#: guiminer.py:103 +#: guiminer.py:104 msgid "Username:" msgstr "" -#: guiminer.py:104 +#: guiminer.py:105 msgid "Password:" msgstr "" -#: guiminer.py:105 +#: guiminer.py:106 msgid "Quit this program" msgstr "" -#: guiminer.py:106 +#: guiminer.py:107 msgid "Show about dialog" msgstr "" -#: guiminer.py:181 +#: guiminer.py:182 #, python-format msgid "%.1f Ghash/s" msgstr "" -#: guiminer.py:183 +#: guiminer.py:184 #, python-format msgid "%.1f Mhash/s" msgstr "" -#: guiminer.py:185 +#: guiminer.py:186 msgid "Connecting..." msgstr "" -#: guiminer.py:187 +#: guiminer.py:188 #, python-format msgid "%d khash/s" msgstr "" -#: guiminer.py:211 +#: guiminer.py:212 #, python-format msgid "Requesting balance: %(request)s" msgstr "" -#: guiminer.py:215 +#: guiminer.py:216 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "" -#: guiminer.py:266 +#: guiminer.py:267 msgid "Miner" msgstr "" -#: guiminer.py:267 +#: guiminer.py:268 msgid "Speed" msgstr "" -#: guiminer.py:268 +#: guiminer.py:269 msgid "Accepted" msgstr "" -#: guiminer.py:269 +#: guiminer.py:270 msgid "Stale" msgstr "" -#: guiminer.py:270 +#: guiminer.py:271 msgid "Start/Stop" msgstr "" -#: guiminer.py:271 +#: guiminer.py:272 msgid "Autostart" msgstr "" -#: guiminer.py:355 +#: guiminer.py:356 msgid "Pause all" msgstr "" -#: guiminer.py:357 +#: guiminer.py:358 msgid "Restore" msgstr "" -#: guiminer.py:358 +#: guiminer.py:359 msgid "Close" msgstr "" -#: guiminer.py:412 +#: guiminer.py:413 #, python-format msgid "Listener for \"%s\" started" msgstr "" -#: guiminer.py:427 +#: guiminer.py:428 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "" -#: guiminer.py:430 +#: guiminer.py:431 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "" -#: guiminer.py:461 +#: guiminer.py:462 msgid "Server:" msgstr "" -#: guiminer.py:466 +#: guiminer.py:467 msgid "Website:" msgstr "" -#: guiminer.py:468 +#: guiminer.py:469 msgid "Ext. Path:" msgstr "" -#: guiminer.py:470 +#: guiminer.py:471 msgid "Host:" msgstr "" -#: guiminer.py:472 +#: guiminer.py:473 msgid "Port:" msgstr "" -#: guiminer.py:478 +#: guiminer.py:479 msgid "Device:" msgstr "" -#: guiminer.py:479 +#: guiminer.py:480 msgid "No OpenCL devices" msgstr "" -#: guiminer.py:480 +#: guiminer.py:481 msgid "Extra flags:" msgstr "" -#: guiminer.py:483 +#: guiminer.py:484 msgid "Balance:" msgstr "" -#: guiminer.py:487 +#: guiminer.py:488 msgid "Withdraw" msgstr "" -#: guiminer.py:602 +#: guiminer.py:603 msgid "Default" msgstr "" -#: guiminer.py:649 +#: guiminer.py:650 msgid "Start" msgstr "" -#: guiminer.py:649 +#: guiminer.py:650 msgid "Stop" msgstr "" -#: guiminer.py:665 +#: guiminer.py:666 msgid "Connection problems" msgstr "" -#: guiminer.py:800 +#: guiminer.py:801 msgid "Running command: " msgstr "" -#: guiminer.py:852 +#: guiminer.py:853 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "" -#: guiminer.py:856 +#: guiminer.py:857 #, python-format msgid "Blocks: %d, " msgstr "" -#: guiminer.py:859 +#: guiminer.py:860 #, python-format msgid "Shares: %d accepted" msgstr "" -#: guiminer.py:861 +#: guiminer.py:862 #, python-format msgid ", %d stale/invalid" msgstr "" -#: guiminer.py:883 +#: guiminer.py:884 #, python-format msgid "- last at %s" msgstr "" -#: guiminer.py:956 +#: guiminer.py:957 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." msgstr "" -#: guiminer.py:957 +#: guiminer.py:958 msgid "Website of the currently selected server. Click to visit." msgstr "" -#: guiminer.py:958 +#: guiminer.py:959 msgid "Available OpenCL devices on your system." msgstr "" -#: guiminer.py:959 +#: guiminer.py:960 msgid "Host address, without http:// prefix." msgstr "" -#: guiminer.py:960 +#: guiminer.py:961 msgid "Server port. This is usually 8332." msgstr "" -#: guiminer.py:961 +#: guiminer.py:962 msgid "" "The miner's username.\n" "May be different than your account username.\n" "Example: Kiv.GPU" msgstr "" -#: guiminer.py:962 +#: guiminer.py:963 msgid "" "The miner's password.\n" "May be different than your account password." msgstr "" -#: guiminer.py:963 +#: guiminer.py:964 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" "For other cards consult the forum." msgstr "" -#: guiminer.py:1044 +#: guiminer.py:1058 guiminer.py:1148 guiminer.py:1169 +msgid "Auth token rejected by server." +msgstr "" + +#: guiminer.py:1076 #, python-format msgid "%s confirmed" msgstr "" -#: guiminer.py:1046 +#: guiminer.py:1078 #, python-format msgid ", %s unconfirmed" msgstr "" -#: guiminer.py:1048 +#: guiminer.py:1080 msgid "Bad response from server." msgstr "" -#: guiminer.py:1137 +#: guiminer.py:1152 guiminer.py:1173 msgid "Withdraw OK" msgstr "" -#: guiminer.py:1296 +#: guiminer.py:1332 msgid "No registration is required - just enter an address and press Start." msgstr "" -#: guiminer.py:1298 +#: guiminer.py:1334 msgid "Address:" msgstr "" -#: guiminer.py:1300 +#: guiminer.py:1336 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" msgstr "" -#: guiminer.py:1315 +#: guiminer.py:1351 msgid "" "Your miner username (not your account username).\n" "Example: Kiv.GPU" msgstr "" -#: guiminer.py:1317 guiminer.py:1333 +#: guiminer.py:1353 guiminer.py:1373 msgid "Your miner password (not your account password)." msgstr "" -#: guiminer.py:1331 +#: guiminer.py:1371 msgid "" "Your miner username. \n" "Example: kiv123@kiv123" msgstr "" -#: guiminer.py:1347 +#: guiminer.py:1387 msgid "The e-mail address you registered with." msgstr "" -#: guiminer.py:1348 +#: guiminer.py:1388 msgid "Email:" msgstr "" -#: guiminer.py:1363 +#: guiminer.py:1403 msgid "&Rename..." msgstr "" -#: guiminer.py:1363 +#: guiminer.py:1403 msgid "Rename this miner" msgstr "" -#: guiminer.py:1384 +#: guiminer.py:1427 msgid "&New OpenCL miner..." msgstr "" -#: guiminer.py:1384 +#: guiminer.py:1427 msgid "Create a new miner profile" msgstr "" -#: guiminer.py:1385 +#: guiminer.py:1428 msgid "Create a CPU or CUDA miner (requires external program)" msgstr "" -#: guiminer.py:1385 +#: guiminer.py:1428 msgid "New &other miner..." msgstr "" -#: guiminer.py:1386 +#: guiminer.py:1429 msgid "&Save settings" msgstr "" -#: guiminer.py:1386 +#: guiminer.py:1429 msgid "Save your settings" msgstr "" -#: guiminer.py:1387 +#: guiminer.py:1430 msgid "&Load settings" msgstr "" -#: guiminer.py:1387 +#: guiminer.py:1430 msgid "Load stored settings" msgstr "" -#: guiminer.py:1388 +#: guiminer.py:1431 msgid "Quit" msgstr "" -#: guiminer.py:1389 +#: guiminer.py:1432 msgid "&File" msgstr "" -#: guiminer.py:1393 +#: guiminer.py:1436 msgid "Show summary" msgstr "" -#: guiminer.py:1393 +#: guiminer.py:1436 msgid "Show summary of all miners" msgstr "" -#: guiminer.py:1394 +#: guiminer.py:1437 msgid "Show console" msgstr "" -#: guiminer.py:1394 +#: guiminer.py:1437 msgid "Show console logs" msgstr "" -#: guiminer.py:1395 +#: guiminer.py:1438 msgid "&View" msgstr "" -#: guiminer.py:1399 +#: guiminer.py:1442 msgid "&Create solo password..." msgstr "" -#: guiminer.py:1399 +#: guiminer.py:1442 msgid "Configure a user/pass for solo mining" msgstr "" -#: guiminer.py:1400 +#: guiminer.py:1443 msgid "&Set Bitcoin client path..." msgstr "" -#: guiminer.py:1400 +#: guiminer.py:1443 msgid "Set the location of the official Bitcoin client" msgstr "" -#: guiminer.py:1401 +#: guiminer.py:1444 msgid "&Launch Bitcoin client as server" msgstr "" -#: guiminer.py:1401 +#: guiminer.py:1444 msgid "Launch the official Bitcoin client as a server for solo mining" msgstr "" -#: guiminer.py:1402 +#: guiminer.py:1445 msgid "&Solo utilities" msgstr "" -#: guiminer.py:1406 +#: guiminer.py:1449 msgid "&Change language..." msgstr "" -#: guiminer.py:1407 +#: guiminer.py:1450 msgid "Language" msgstr "" -#: guiminer.py:1410 +#: guiminer.py:1453 msgid "&About/Donate..." msgstr "" -#: guiminer.py:1412 +#: guiminer.py:1455 msgid "&Help" msgstr "" -#: guiminer.py:1424 +#: guiminer.py:1467 msgid "Failed to load taskbar icon; continuing." msgstr "" -#: guiminer.py:1432 -msgid "" -"No OpenCL devices were found.\n" -"If you only want to mine using CPU or CUDA, you can ignore this message.\n" -"If you want to mine on ATI graphics cards, you may need to install the ATI Stream\n" -"SDK, or your GPU may not support OpenCL.\n" -msgstr "" - -#: guiminer.py:1437 -msgid "No OpenCL devices found." -msgstr "" - -#: guiminer.py:1440 +#: guiminer.py:1476 msgid "OpenCL not found - can't add a OpenCL miner" msgstr "" -#: guiminer.py:1465 +#: guiminer.py:1506 #, python-format msgid "GUIMiner - v%s" msgstr "" -#: guiminer.py:1507 +#: guiminer.py:1548 msgid "Name this miner:" msgstr "" -#: guiminer.py:1507 +#: guiminer.py:1548 msgid "New miner" msgstr "" -#: guiminer.py:1510 +#: guiminer.py:1551 msgid "Untitled" msgstr "" -#: guiminer.py:1521 +#: guiminer.py:1562 msgid "External miner (*.exe)|*.exe" msgstr "" -#: guiminer.py:1523 +#: guiminer.py:1564 msgid "Select external miner:" msgstr "" -#: guiminer.py:1533 +#: guiminer.py:1574 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" msgstr "" -#: guiminer.py:1535 +#: guiminer.py:1576 msgid "Miner not supported" msgstr "" -#: guiminer.py:1561 +#: guiminer.py:1602 msgid "Do you want to save changes?" msgstr "" -#: guiminer.py:1561 +#: guiminer.py:1602 msgid "Save" msgstr "" -#: guiminer.py:1589 +#: guiminer.py:1631 msgid "Saving: " msgstr "" -#: guiminer.py:1595 +#: guiminer.py:1637 #, python-format msgid "" "Couldn't write save file %s.\n" "Check the location is writable." msgstr "" -#: guiminer.py:1596 +#: guiminer.py:1638 msgid "Save unsuccessful" msgstr "" -#: guiminer.py:1598 +#: guiminer.py:1640 #, python-format msgid "Profiles saved OK to %s." msgstr "" -#: guiminer.py:1599 +#: guiminer.py:1641 msgid "Save successful" msgstr "" -#: guiminer.py:1611 +#: guiminer.py:1653 #, python-format msgid "Loaded: %s" msgstr "" -#: guiminer.py:1620 +#: guiminer.py:1667 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "" -#: guiminer.py:1621 +#: guiminer.py:1668 msgid "Load profile" msgstr "" -#: guiminer.py:1650 +#: guiminer.py:1697 msgid "Select path to Bitcoin.exe" msgstr "" -#: guiminer.py:1662 +#: guiminer.py:1709 msgid "About" msgstr "" -#: guiminer.py:1688 +#: guiminer.py:1735 msgid "Closing this miner will stop it. Continue?" msgstr "" -#: guiminer.py:1689 +#: guiminer.py:1736 msgid "Close miner" msgstr "" -#: guiminer.py:1718 +#: guiminer.py:1765 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" msgstr "" -#: guiminer.py:1719 +#: guiminer.py:1766 msgid "Launch failed" msgstr "" -#: guiminer.py:1722 +#: guiminer.py:1769 msgid "Client launched ok. You can start a miner now with the server set to 'solo'." msgstr "" -#: guiminer.py:1723 +#: guiminer.py:1770 msgid "Launched ok." msgstr "" -#: guiminer.py:1738 +#: guiminer.py:1785 #, python-format msgid "%s already exists. Overwrite?" msgstr "" -#: guiminer.py:1739 +#: guiminer.py:1786 msgid "bitcoin.conf already exists." msgstr "" -#: guiminer.py:1744 +#: guiminer.py:1791 msgid "Enter password" msgstr "" -#: guiminer.py:1754 +#: guiminer.py:1801 msgid "Success" msgstr "" -#: guiminer.py:1754 +#: guiminer.py:1801 msgid "Wrote bitcoin config ok." msgstr "" -#: guiminer.py:1765 +#: guiminer.py:1812 msgid "Console" msgstr "" -#: guiminer.py:1777 +#: guiminer.py:1824 msgid "Summary" msgstr "" -#: guiminer.py:1790 +#: guiminer.py:1837 msgid "Rename miner" msgstr "" -#: guiminer.py:1790 +#: guiminer.py:1837 msgid "Rename to:" msgstr "" -#: guiminer.py:1795 +#: guiminer.py:1842 msgid "Change language" msgstr "" -#: guiminer.py:1814 +#: guiminer.py:1861 msgid "Choose language (requires restart to take full effect)" msgstr "" -#: guiminer.py:1859 +#: guiminer.py:1906 msgid "" "Click the link below to log in to the pool and get a special token. \n" "This token lets you securely check your balance.\n" "To remember this token for the future, save your miner settings." msgstr "" -#: guiminer.py:1868 +#: guiminer.py:1915 msgid "(Paste token here)" msgstr "" -#: guiminer.py:1894 +#: guiminer.py:1941 msgid "Copy address to clipboard" msgstr "" + +#: guiminer.py:1960 +msgid "No OpenCL devices found." +msgstr "" + +#: guiminer.py:1963 +msgid "" +"No OpenCL devices were found.\n" +" If you only want to mine using CPU or CUDA, you can ignore this message.\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI Stream\n" +" SDK, or your GPU may not support OpenCL." +msgstr "" + +#: guiminer.py:1973 +msgid "Don't show this message again" +msgstr "" diff --git a/po_to_mo.py b/po_to_mo.py index 915d86a..f7d443a 100644 --- a/po_to_mo.py +++ b/po_to_mo.py @@ -16,11 +16,13 @@ def print_usage(): sys.exit(1) if len(sys.argv) < 2: + print len(sys.argv) print_usage() po_filename = sys.argv[1] +print 'Got filename', po_filename -match = re.match(r'guiminer_(\w*).po', po_filename) +match = re.search(r'guiminer_(\w*).po', po_filename) if match is None: print_usage() else: From c5c16bac2064d2eb235f8a4771335a0502c1e44d Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 22 May 2011 07:52:09 -0300 Subject: [PATCH 094/190] Update Russian translation. --- guiminer_ru.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guiminer_ru.po b/guiminer_ru.po index d7e9723..b5613e4 100644 --- a/guiminer_ru.po +++ b/guiminer_ru.po @@ -319,7 +319,7 @@ msgstr "" #: guiminer.py:1058 guiminer.py:1148 guiminer.py:1169 msgid "Auth token rejected by server." -msgstr "" +msgstr "Код авторизации не принят сервером" #: guiminer.py:1076 #, python-format @@ -708,7 +708,7 @@ msgstr "" #: guiminer.py:1973 msgid "Don't show this message again" -msgstr "" +msgstr "Больше не показывать это сообщение." #~ msgid "%s mining!" #~ msgstr "%s генерации" From 0861c228066891f5ac8a3aa8da747e4d5e2d1ada Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Thu, 2 Jun 2011 17:21:17 +0800 Subject: [PATCH 095/190] Added Chinese Simp translation --- guiminer.py | 3 +- guiminer_zh-CN.po | 707 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 709 insertions(+), 1 deletion(-) create mode 100644 guiminer_zh-CN.po diff --git a/guiminer.py b/guiminer.py index c43e28c..d6a882c 100644 --- a/guiminer.py +++ b/guiminer.py @@ -35,7 +35,8 @@ def get_module_path(): LANGUAGES = { "English": wx.LANGUAGE_ENGLISH, "Spanish": wx.LANGUAGE_SPANISH, - "Russian": wx.LANGUAGE_RUSSIAN + "Russian": wx.LANGUAGE_RUSSIAN, + "Chinese Simplified": wx.LANGUAGE_CHINESE_CHINA } LANGUAGES_REVERSE = dict((v,k) for (k,v) in LANGUAGES.items()) diff --git a/guiminer_zh-CN.po b/guiminer_zh-CN.po new file mode 100644 index 0000000..bf7ceca --- /dev/null +++ b/guiminer_zh-CN.po @@ -0,0 +1,707 @@ +msgid "" +msgstr "" +"Project-Id-Version: guiminer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-05-20 23:09-0300\n" +"PO-Revision-Date: \n" +"Last-Translator: Dean Lee \n" +"Language-Team: Chinese Simp \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Basepath: /\n" +"X-Poedit-Language: Chinese\n" + +#: guiminer.py:75 +#, python-format +msgid "" +"GUIMiner\n" +"\n" +"Version: %(version)s\n" +"\n" +"GUI by Chris 'Kiv' MacLeod\n" +"Original poclbm miner by m0mchil\n" +"Original rpcminer by puddinpop\n" +"\n" +"Get the source code or file issues at GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"If you enjoyed this software, support its development\n" +"by donating to:\n" +"\n" +"%(address)s\n" +"\n" +"Even a single Bitcoin is appreciated and helps motivate\n" +"further work on this software.\n" +msgstr "" +"GUIMiner\n" +"\n" +"版本: %(version)s\n" +"\n" +"GUI 作者 Chris 'Kiv' MacLeod\n" +"原 poclbm miner 作者 m0mchil\n" +"原 rpcminer 作者 puddinpop\n" +"\n" +"可在 GitHub 获取源码或提交问题:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"如果您喜欢本软件,请支持其开发\n" +"捐助请发往:\n" +"\n" +"%(address)s\n" +"\n" +"每一分 Bitcoin 都欢迎,\n" +"它们将推动本软件的进一步开发。\n" + +#: guiminer.py:96 +msgid "Not started" +msgstr "未启动" + +#: guiminer.py:97 +msgid "Starting..." +msgstr "正在启动..." + +#: guiminer.py:98 +msgid "Stopped" +msgstr "已停止" + +#: guiminer.py:99 +msgid "Paused" +msgstr "已暂停" + +#: guiminer.py:100 +msgid "Start mining!" +msgstr "开始采矿!" + +#: guiminer.py:101 +msgid "Stop mining" +msgstr "停止采矿" + +#: guiminer.py:102 +msgid "Refresh balance" +msgstr "刷新余额" + +#: guiminer.py:103 +msgid "Connection error" +msgstr "连接错误" + +#: guiminer.py:104 +msgid "Username:" +msgstr "用户名:" + +#: guiminer.py:105 +msgid "Password:" +msgstr "密码:" + +#: guiminer.py:106 +msgid "Quit this program" +msgstr "退出本程序" + +#: guiminer.py:107 +msgid "Show about dialog" +msgstr "显示关于窗口" + +#: guiminer.py:182 +#, python-format +msgid "%.1f Ghash/s" +msgstr "%.1f Ghash/s" + +#: guiminer.py:184 +#, python-format +msgid "%.1f Mhash/s" +msgstr "%.1f Mhash/s" + +#: guiminer.py:186 +msgid "Connecting..." +msgstr "正在连接..." + +#: guiminer.py:188 +#, python-format +msgid "%d khash/s" +msgstr "%d khash/s" + +#: guiminer.py:212 +#, python-format +msgid "Requesting balance: %(request)s" +msgstr "正在请求余额: %(request)s" + +#: guiminer.py:216 +#, python-format +msgid "Server replied: %(status)s, %(data)s" +msgstr "服务器回复: %(status)s, %(data)s" + +#: guiminer.py:267 +msgid "Miner" +msgstr "采矿器" + +#: guiminer.py:268 +msgid "Speed" +msgstr "速度" + +#: guiminer.py:269 +msgid "Accepted" +msgstr "已接受" + +#: guiminer.py:270 +msgid "Stale" +msgstr "过时" + +#: guiminer.py:271 +msgid "Start/Stop" +msgstr "启动/停止" + +#: guiminer.py:272 +msgid "Autostart" +msgstr "自动启动" + +#: guiminer.py:356 +msgid "Pause all" +msgstr "全部暂停" + +#: guiminer.py:358 +msgid "Restore" +msgstr "回复" + +#: guiminer.py:359 +msgid "Close" +msgstr "关闭" + +#: guiminer.py:413 +#, python-format +msgid "Listener for \"%s\" started" +msgstr "\"%s\" 监听器已启动" + +#: guiminer.py:428 +#, python-format +msgid "Listener for \"%(name)s\": %(line)s" +msgstr "\"%(name)s\" 监听器已启动: %(line)s" + +#: guiminer.py:431 +#, python-format +msgid "Listener for \"%s\" shutting down" +msgstr "\"%s\" 监听器正在关闭" + +#: guiminer.py:462 +msgid "Server:" +msgstr "服务器:" + +#: guiminer.py:467 +msgid "Website:" +msgstr "网站:" + +#: guiminer.py:469 +msgid "Ext. Path:" +msgstr "外部路径:" + +#: guiminer.py:471 +msgid "Host:" +msgstr "主机:" + +#: guiminer.py:473 +msgid "Port:" +msgstr "端口:" + +#: guiminer.py:479 +msgid "Device:" +msgstr "设备:" + +#: guiminer.py:480 +msgid "No OpenCL devices" +msgstr "无 OpenCL 设备" + +#: guiminer.py:481 +msgid "Extra flags:" +msgstr "附加参数:" + +#: guiminer.py:484 +msgid "Balance:" +msgstr "余额:" + +#: guiminer.py:488 +msgid "Withdraw" +msgstr "取款" + +#: guiminer.py:603 +msgid "Default" +msgstr "默认" + +#: guiminer.py:650 +msgid "Start" +msgstr "启动" + +#: guiminer.py:650 +msgid "Stop" +msgstr "停止" + +#: guiminer.py:666 +msgid "Connection problems" +msgstr "连接问题" + +#: guiminer.py:801 +msgid "Running command: " +msgstr "正在运行命令: " + +#: guiminer.py:853 +#, python-format +msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" +msgstr "难度为 1 的 hash: %(nhashes)d %(update_time)s" + +#: guiminer.py:857 +#, python-format +msgid "Blocks: %d, " +msgstr "块: %d, " + +#: guiminer.py:860 +#, python-format +msgid "Shares: %d accepted" +msgstr "贡献: %d 已接受" + +#: guiminer.py:862 +#, python-format +msgid ", %d stale/invalid" +msgstr ", %d 过时/无效" + +#: guiminer.py:884 +#, python-format +msgid "- last at %s" +msgstr "- 更新于 %s" + +#: guiminer.py:957 +msgid "" +"Server to connect to. Different servers have different fees and features.\n" +"Check their websites for full information." +msgstr "" +"要连接到的服务器。不同的服务器有不同的费用与功能。\n" +"完整信息请查看其网站。" + +#: guiminer.py:958 +msgid "Website of the currently selected server. Click to visit." +msgstr "当前所选服务器的网站。点击可访问。" + +#: guiminer.py:959 +msgid "Available OpenCL devices on your system." +msgstr "您系统中可用的 OpenCL 设备。" + +#: guiminer.py:960 +msgid "Host address, without http:// prefix." +msgstr "主机地址,无需 http:// 前缀。" + +#: guiminer.py:961 +msgid "Server port. This is usually 8332." +msgstr "服务器端口。通常为 8332。" + +#: guiminer.py:962 +msgid "" +"The miner's username.\n" +"May be different than your account username.\n" +"Example: Kiv.GPU" +msgstr "" +"采矿器的用户名。\n" +"可以与账号用户名不同。\n" +"示例: Kiv.GPU" + +#: guiminer.py:963 +msgid "" +"The miner's password.\n" +"May be different than your account password." +msgstr "" +"采矿器的密码。\n" +"可以与账号密码不同。" + +#: guiminer.py:964 +msgid "" +"Extra flags to pass to the miner.\n" +"For Radeon HD 5xxx series use -v -w128 for best results.\n" +"For other cards consult the forum." +msgstr "" +"要传送给采矿器的附加参数。\n" +"Radeon HD 5xxx 系列可使用 -v -w128 获取最佳效果。\n" +"其他显卡的参数参见论坛。" + +#: guiminer.py:1058 +#: guiminer.py:1148 +#: guiminer.py:1169 +msgid "Auth token rejected by server." +msgstr "身份认证 token 被服务器拒绝。" + +#: guiminer.py:1076 +#, python-format +msgid "%s confirmed" +msgstr "%s 已确认" + +#: guiminer.py:1078 +#, python-format +msgid ", %s unconfirmed" +msgstr ", %s 未确认" + +#: guiminer.py:1080 +msgid "Bad response from server." +msgstr "服务器响应错误。" + +#: guiminer.py:1152 +#: guiminer.py:1173 +msgid "Withdraw OK" +msgstr "取款成功" + +#: guiminer.py:1332 +msgid "No registration is required - just enter an address and press Start." +msgstr "无需注册 - 只需输入地址并按“启动”。" + +#: guiminer.py:1334 +msgid "Address:" +msgstr "地址:" + +#: guiminer.py:1336 +msgid "" +"Your receiving address for Bitcoins.\n" +"E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" +msgstr "" +"您接收 Bitcoins 的地址。\n" +"例如: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" + +#: guiminer.py:1351 +msgid "" +"Your miner username (not your account username).\n" +"Example: Kiv.GPU" +msgstr "" +"您的采矿器用户名 (不是账号用户名)。\n" +"示例: Kiv.GPU" + +#: guiminer.py:1353 +#: guiminer.py:1373 +msgid "Your miner password (not your account password)." +msgstr "您的采矿器密码 (不是账号密码)。" + +#: guiminer.py:1371 +msgid "" +"Your miner username. \n" +"Example: kiv123@kiv123" +msgstr "" +"您的采矿器用户名。\n" +"示例: kiv123@kiv123" + +#: guiminer.py:1387 +msgid "The e-mail address you registered with." +msgstr "您注册时使用的 e-mail 地址。" + +#: guiminer.py:1388 +msgid "Email:" +msgstr "Email:" + +#: guiminer.py:1403 +msgid "&Rename..." +msgstr "重命名(&R)..." + +#: guiminer.py:1403 +msgid "Rename this miner" +msgstr "重命名该采矿器" + +#: guiminer.py:1427 +msgid "&New OpenCL miner..." +msgstr "新建 OpenCL 采矿器(&N)..." + +#: guiminer.py:1427 +msgid "Create a new miner profile" +msgstr "创建新的采矿器配置文件" + +#: guiminer.py:1428 +msgid "Create a CPU or CUDA miner (requires external program)" +msgstr "创建 CPU 或 CUDA 采矿器 (需要外部程序)" + +#: guiminer.py:1428 +msgid "New &other miner..." +msgstr "新建其他采矿器(&O)..." + +#: guiminer.py:1429 +msgid "&Save settings" +msgstr "保存设置(&S)" + +#: guiminer.py:1429 +msgid "Save your settings" +msgstr "保存您的设置" + +#: guiminer.py:1430 +msgid "&Load settings" +msgstr "加载设置(&L)" + +#: guiminer.py:1430 +msgid "Load stored settings" +msgstr "加载已储存的设置" + +#: guiminer.py:1431 +msgid "Quit" +msgstr "退出" + +#: guiminer.py:1432 +msgid "&File" +msgstr "文件(&F)" + +#: guiminer.py:1436 +msgid "Show summary" +msgstr "显示概览" + +#: guiminer.py:1436 +msgid "Show summary of all miners" +msgstr "显示全部采矿器的概览" + +#: guiminer.py:1437 +msgid "Show console" +msgstr "显示终端" + +#: guiminer.py:1437 +msgid "Show console logs" +msgstr "显示终端日志" + +#: guiminer.py:1438 +msgid "&View" +msgstr "查看(&V)" + +#: guiminer.py:1442 +msgid "&Create solo password..." +msgstr "创建独自采矿密码(&C)..." + +#: guiminer.py:1442 +msgid "Configure a user/pass for solo mining" +msgstr "配置独自采矿的用户名/密码" + +#: guiminer.py:1443 +msgid "&Set Bitcoin client path..." +msgstr "设置 Bitcoin 客户端路径(&S)..." + +#: guiminer.py:1443 +msgid "Set the location of the official Bitcoin client" +msgstr "设置官方 Bitcoin 客户端的位置" + +#: guiminer.py:1444 +msgid "&Launch Bitcoin client as server" +msgstr "将 Bitcoin 客户端作为服务器启动(&L)" + +#: guiminer.py:1444 +msgid "Launch the official Bitcoin client as a server for solo mining" +msgstr "将官方 Bitcoin 客户端作为独自采矿的服务器启动" + +#: guiminer.py:1445 +msgid "&Solo utilities" +msgstr "独自采矿(&S)" + +#: guiminer.py:1449 +msgid "&Change language..." +msgstr "更改语言(&C)..." + +#: guiminer.py:1450 +msgid "Language" +msgstr "语言" + +#: guiminer.py:1453 +msgid "&About/Donate..." +msgstr "关于/捐助(&A)..." + +#: guiminer.py:1455 +msgid "&Help" +msgstr "帮助(&H)" + +#: guiminer.py:1467 +msgid "Failed to load taskbar icon; continuing." +msgstr "无法加载任务栏图标; 正在继续。" + +#: guiminer.py:1476 +msgid "OpenCL not found - can't add a OpenCL miner" +msgstr "未找到 OpenCL - 无法添加 OpenCL 采矿器" + +#: guiminer.py:1506 +#, python-format +msgid "GUIMiner - v%s" +msgstr "GUIMiner - v%s" + +#: guiminer.py:1548 +msgid "Name this miner:" +msgstr "为该采矿器命名:" + +#: guiminer.py:1548 +msgid "New miner" +msgstr "新建采矿器" + +#: guiminer.py:1551 +msgid "Untitled" +msgstr "无标题" + +#: guiminer.py:1562 +msgid "External miner (*.exe)|*.exe" +msgstr "外部采矿器 (*.exe)|*.exe" + +#: guiminer.py:1564 +msgid "Select external miner:" +msgstr "选择外部采矿器:" + +#: guiminer.py:1574 +#, python-format +msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" +msgstr "不支持的外部采矿器 %(filename)s。支持: %(supported)s" + +#: guiminer.py:1576 +msgid "Miner not supported" +msgstr "采矿器不支持" + +#: guiminer.py:1602 +msgid "Do you want to save changes?" +msgstr "是否希望保存变更?" + +#: guiminer.py:1602 +msgid "Save" +msgstr "保存" + +#: guiminer.py:1631 +msgid "Saving: " +msgstr "正在保存: " + +#: guiminer.py:1637 +#, python-format +msgid "" +"Couldn't write save file %s.\n" +"Check the location is writable." +msgstr "" +"无法写入保存文件 %s。\n" +"检查其位置是否可写。" + +#: guiminer.py:1638 +msgid "Save unsuccessful" +msgstr "保存失败" + +#: guiminer.py:1640 +#, python-format +msgid "Profiles saved OK to %s." +msgstr "配置文件成功保存于 %s。" + +#: guiminer.py:1641 +msgid "Save successful" +msgstr "保存成功" + +#: guiminer.py:1653 +#, python-format +msgid "Loaded: %s" +msgstr "已加载: %s" + +#: guiminer.py:1667 +msgid "Loading profiles will stop any currently running miners. Continue?" +msgstr "加载配置文件将停止当前正在运行的全部采矿器。是否继续?" + +#: guiminer.py:1668 +msgid "Load profile" +msgstr "加载配置文件" + +#: guiminer.py:1697 +msgid "Select path to Bitcoin.exe" +msgstr "选择 Bitcoin.exe 的路径" + +#: guiminer.py:1709 +msgid "About" +msgstr "关于" + +#: guiminer.py:1735 +msgid "Closing this miner will stop it. Continue?" +msgstr "关闭该采矿器将停止其采矿。是否继续?" + +#: guiminer.py:1736 +msgid "Close miner" +msgstr "关闭采矿器" + +#: guiminer.py:1765 +#, python-format +msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" +msgstr "无法在 %s 找到 Bitcoin。您的路径设置是否正确?" + +#: guiminer.py:1766 +msgid "Launch failed" +msgstr "启动失败" + +#: guiminer.py:1769 +msgid "Client launched ok. You can start a miner now with the server set to 'solo'." +msgstr "客户端启动成功。您现在可以启动服务器设为 'solo' 的采矿器。" + +#: guiminer.py:1770 +msgid "Launched ok." +msgstr "启动成功。" + +#: guiminer.py:1785 +#, python-format +msgid "%s already exists. Overwrite?" +msgstr "%s 已存在。是否覆写?" + +#: guiminer.py:1786 +msgid "bitcoin.conf already exists." +msgstr "bitcoin.conf 已存在。" + +#: guiminer.py:1791 +msgid "Enter password" +msgstr "输入密码" + +#: guiminer.py:1801 +msgid "Success" +msgstr "成功" + +#: guiminer.py:1801 +msgid "Wrote bitcoin config ok." +msgstr "写入 bitcoin 配置成功。" + +#: guiminer.py:1812 +msgid "Console" +msgstr "终端" + +#: guiminer.py:1824 +msgid "Summary" +msgstr "概览" + +#: guiminer.py:1837 +msgid "Rename miner" +msgstr "重命名采矿器" + +#: guiminer.py:1837 +msgid "Rename to:" +msgstr "重命名为:" + +#: guiminer.py:1842 +msgid "Change language" +msgstr "更改语言" + +#: guiminer.py:1861 +msgid "Choose language (requires restart to take full effect)" +msgstr "选择语言 (需要重新启动方可完全生效)" + +#: guiminer.py:1906 +msgid "" +"Click the link below to log in to the pool and get a special token. \n" +"This token lets you securely check your balance.\n" +"To remember this token for the future, save your miner settings." +msgstr "" +"点击下面的连接并登录矿场获取特别的 token。\n" +"该 token 允许您安全地检查余额。\n" +"要记住该 token 供日后使用,请保存采矿器设置。" + +#: guiminer.py:1915 +msgid "(Paste token here)" +msgstr "(在此粘贴 token)" + +#: guiminer.py:1941 +msgid "Copy address to clipboard" +msgstr "复制地址到剪贴板" + +#: guiminer.py:1960 +msgid "No OpenCL devices found." +msgstr "未找到 OpenCL 设备。" + +#: guiminer.py:1963 +msgid "" +"No OpenCL devices were found.\n" +" If you only want to mine using CPU or CUDA, you can ignore this message.\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI Stream\n" +" SDK, or your GPU may not support OpenCL." +msgstr "" +"未找到 OpenCL 设备。\n" +" 如果您只想使用 CPU 或 CUDA 采矿,可忽略本信息。\n" +" 如果您想用 ATI 显卡采矿,可能需要安装 ATI Stream SDK,\n" +" 若已安装,可能您的 GPU 不支持 OpenCL。" + +#: guiminer.py:1973 +msgid "Don't show this message again" +msgstr "不要再次显示本信息" + From 5138cd2fe7b84063080b7a5b534b9091e333f9dc Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 5 Jun 2011 11:55:55 -0300 Subject: [PATCH 096/190] Improve Phoenix support.\ --- guiminer.py | 66 ++++++++++++++++++++++++++++++++++++++++++++--------- setup.py | 3 ++- 2 files changed, 57 insertions(+), 12 deletions(-) diff --git a/guiminer.py b/guiminer.py index c43e28c..e68d722 100644 --- a/guiminer.py +++ b/guiminer.py @@ -17,7 +17,7 @@ from wx.lib.agw import hyperlink from wx.lib.newevent import NewEvent -__version__ = '2011-05-21' +__version__ = '2011-05-23/phoenix' def get_module_path(): """Return the folder containing this script (or its .exe).""" @@ -112,7 +112,8 @@ def save_language(): "rpcminer-cpu.exe", "rpcminer-cuda.exe", "rpcminer-opencl.exe", - #"bitcoin-miner.exe" # Doesn't work yet + "phoenix.py", + "phoenix.exe" ] USER_AGENT = "guiminer/" + __version__ @@ -419,7 +420,7 @@ def run(self): line = self.miner.stdout.readline().strip() #logger.debug("Line: %s", line) if not line: continue - for s, event_func in MinerListenerThread.LINES: + for s, event_func in self.LINES: # Use self to allow subclassing match = re.search(s, line, flags=re.I) if match is not None: event = event_func(match) @@ -434,6 +435,19 @@ def run(self): wx.PostEvent(self.parent, event) logger.info(_('Listener for "%s" shutting down'), self.parent_name) +class PhoenixListenerThread(MinerListenerThread): + LINES = [ + (r"Result: .* accepted", + lambda _: UpdateAcceptedEvent(accepted=True)), + (r"Result: .* rejected", lambda _: + UpdateAcceptedEvent(accepted=False)), + (r"(\d+)\.?(\d*) Khash/sec", lambda match: + UpdateHashRateEvent(rate=float(match.group(1)+'.'+match.group(2)))), + (r"(\d+)\.?(\d*) Mhash/sec", lambda match: + UpdateHashRateEvent(rate=float(match.group(1)+'.'+match.group(2)) * 1000)), + (r"Currently on block", + lambda _: None), # Just ignore lines like these + ] class MinerTab(wx.Panel): """A tab in the GUI representing a miner instance. @@ -573,6 +587,14 @@ def host_with_http_prefix(self): if not host.startswith("http://"): host = "http://" + host return host + + @property + def host_without_http_prefix(self): + """Return the host address, with http:// stripped off if needed.""" + host = self.txt_host.GetValue() + if host.startswith("http://"): + return host[len('http://'):] + return host def pause(self): """Pause the miner if we are mining, otherwise do nothing.""" @@ -775,6 +797,22 @@ def configure_subprocess_ufasoft(self): self.txt_flags.GetValue()) return cmd, os.path.dirname(self.external_path) + def configure_subprocess_phoenix(self): + """Set up the command line for phoenix miner.""" + path = self.external_path + if path.endswith('.py'): + path = "python " + path + + cmd = "%s -u http://%s:%s@%s:%s DEVICE=%d %s" % ( + path, + self.txt_username.GetValue(), + self.txt_pass.GetValue(), + self.host_without_http_prefix, + self.txt_port.GetValue(), + self.device_listbox.GetSelection(), + self.txt_flags.GetValue()) + return cmd, os.path.dirname(self.external_path) + # End backend specific code ########################### @@ -788,12 +826,18 @@ def start_mining(self): else: flags = win32process.CREATE_NO_WINDOW # Determine what command line arguments to use + + listener_cls = MinerListenerThread if not self.is_external_miner: conf_func = self.configure_subprocess_poclbm elif "rpcminer" in self.external_path: conf_func = self.configure_subprocess_rpcminer elif "bitcoin-miner" in self.external_path: conf_func = self.configure_subprocess_ufasoft + elif "phoenix" in self.external_path: + conf_func = self.configure_subprocess_phoenix + listener_cls = PhoenixListenerThread + else: raise ValueError # TODO: handle unrecognized miner cmd, cwd = conf_func() @@ -809,7 +853,7 @@ def start_mining(self): shell=(sys.platform != 'win32')) except OSError: raise #TODO: the folder or exe could not exist - self.miner_listener = MinerListenerThread(self, self.miner) + self.miner_listener = listener_cls(self, self.miner) self.miner_listener.daemon = True self.miner_listener.start() self.is_mining = True @@ -1263,16 +1307,16 @@ def layout_user_and_pass(self, row): def layout_device_and_flags(self, row): """Lay out the device and flags widgets in the specified row. - Hide the device widgets if there's an external miner present. + Hide the device dropdown if RPCMiner is present since it doesn't use it. """ - no_external = not self.is_external_miner - self.set_widgets_visible([self.device_lbl, self.device_listbox], no_external) - if no_external: + device_visible = 'rpcminer' not in self.external_path + self.set_widgets_visible([self.device_lbl, self.device_listbox], device_visible) + if device_visible: self.inner_sizer.Add(self.device_lbl, (row,0), flag=LBL_STYLE) self.inner_sizer.Add(self.device_listbox, (row,1), flag=wx.EXPAND) - col = 2 * (no_external) + col = 2 * (device_visible) self.inner_sizer.Add(self.flags_lbl, (row,col), flag=LBL_STYLE) - span = (1,1) if no_external else (1,4) + span = (1,1) if device_visible else (1,4) self.inner_sizer.Add(self.txt_flags, (row,col+1), span=span, flag=wx.EXPAND) def layout_balance(self, row): @@ -1567,7 +1611,7 @@ def new_external_profile(self, event): On Windows we validate against legal miners; on Linux they can pick whatever they want. """ - wildcard = _('External miner (*.exe)|*.exe') if sys.platform == 'win32' else '*.*' + wildcard = _('External miner (*.exe)|*.exe|(*.py)|*.py') if sys.platform == 'win32' else '*.*' dialog = wx.FileDialog(self, _("Select external miner:"), defaultDir=os.path.join(get_module_path(), 'miners'), diff --git a/setup.py b/setup.py index cd83c01..a14eaee 100644 --- a/setup.py +++ b/setup.py @@ -6,9 +6,10 @@ 'icon_resources': [(0, "logo.ico")] } ], - console=['poclbm.py', 'po_to_mo.py'], + console=['miners/phoenix/phoenix.py', 'poclbm.py', 'po_to_mo.py'], # OpenCL.dll is vendor specific options=dict(py2exe=dict( + includes="minerutil, twisted.web.resource, QueueReader", dll_excludes=['OpenCL.dll'], #bundle_files=1, compressed=True, From c9f5a7a00707cf556e34061847869de9e3dc7b5c Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 5 Jun 2011 13:31:20 -0300 Subject: [PATCH 097/190] Change host for deepbit to pit.deepbit.net. --- guiminer_zh-CN.po => guiminer_zh.po | 0 servers.ini | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename guiminer_zh-CN.po => guiminer_zh.po (100%) diff --git a/guiminer_zh-CN.po b/guiminer_zh.po similarity index 100% rename from guiminer_zh-CN.po rename to guiminer_zh.po diff --git a/servers.ini b/servers.ini index cef22db..6d168e1 100644 --- a/servers.ini +++ b/servers.ini @@ -12,7 +12,7 @@ { "name": "deepbit", - "host": "deepbit.net", + "host": "pit.deepbit.net", "url": "http://deepbit.net", "port": 8332, "balance_token_url": "http://deepbit.net/settings/", From f15f7b2c4d9e640c2d7130b3a82ef310781e6876 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 5 Jun 2011 13:31:34 -0300 Subject: [PATCH 098/190] Update languages. --- guiminer.py | 9 ++++++--- po_to_mo.py | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/guiminer.py b/guiminer.py index d6a882c..779448c 100644 --- a/guiminer.py +++ b/guiminer.py @@ -17,7 +17,7 @@ from wx.lib.agw import hyperlink from wx.lib.newevent import NewEvent -__version__ = '2011-05-21' +__version__ = '2011-06-05' def get_module_path(): """Return the folder containing this script (or its .exe).""" @@ -33,10 +33,13 @@ def get_module_path(): _ = wx.GetTranslation LANGUAGES = { + "Chinese Simplified": wx.LANGUAGE_CHINESE_SIMPLIFIED, "English": wx.LANGUAGE_ENGLISH, + "French": wx.LANGUAGE_FRENCH, + "German": wx.LANGUAGE_GERMAN, + "Hungarian": wx.LANGUAGE_HUNGARIAN, "Spanish": wx.LANGUAGE_SPANISH, - "Russian": wx.LANGUAGE_RUSSIAN, - "Chinese Simplified": wx.LANGUAGE_CHINESE_CHINA + "Russian": wx.LANGUAGE_RUSSIAN, } LANGUAGES_REVERSE = dict((v,k) for (k,v) in LANGUAGES.items()) diff --git a/po_to_mo.py b/po_to_mo.py index f7d443a..7b6a9b1 100644 --- a/po_to_mo.py +++ b/po_to_mo.py @@ -22,7 +22,7 @@ def print_usage(): po_filename = sys.argv[1] print 'Got filename', po_filename -match = re.search(r'guiminer_(\w*).po', po_filename) +match = re.search(r'guiminer_(.*).po', po_filename) if match is None: print_usage() else: From 8be03f9c89d93cef5c016db629422b89b3a120e2 Mon Sep 17 00:00:00 2001 From: Baba Z Buehler Date: Wed, 8 Jun 2011 02:02:38 -0500 Subject: [PATCH 099/190] updates for ufasoft miner; redirect subprocess stderr to stdout pipe, use universal newlines to catch ufasoft's \r during hash speed output and process decimal mhash/s output --- guiminer.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/guiminer.py b/guiminer.py index d6a882c..b45424a 100644 --- a/guiminer.py +++ b/guiminer.py @@ -113,7 +113,7 @@ def save_language(): "rpcminer-cpu.exe", "rpcminer-cuda.exe", "rpcminer-opencl.exe", - #"bitcoin-miner.exe" # Doesn't work yet + "bitcoin-miner.exe" ] USER_AGENT = "guiminer/" + __version__ @@ -401,6 +401,8 @@ class MinerListenerThread(threading.Thread): UpdateAcceptedEvent(accepted=False)), (r"(\d+)\s*khash/s", lambda match: UpdateHashRateEvent(rate=int(match.group(1)))), + (r"(\d+\.\d+)\s*Mhash/s", lambda match: + UpdateHashRateEvent(rate=float(match.group(1)) * 1000)), (r"(\d+)\s*Mhash/s", lambda match: UpdateHashRateEvent(rate=int(match.group(1)) * 1000)), (r"checking (\d+)", lambda _: @@ -799,13 +801,15 @@ def start_mining(self): raise ValueError # TODO: handle unrecognized miner cmd, cwd = conf_func() - # TODO: ufasoft prints to stderr for some reason and also won't - # seem to die - probably we have to get him to change things - # so his miner will play nice. + # for ufasoft: + # redirect stderr to stdout + # use universal_newlines to catch the \r output on Mhash/s lines try: logger.debug(_('Running command: ') + cmd) self.miner = subprocess.Popen(cmd, cwd=cwd, stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + universal_newlines=True, creationflags=flags, shell=(sys.platform != 'win32')) except OSError: From 6726b6cc68700b3c6188dd4e6a1db4720267107e Mon Sep 17 00:00:00 2001 From: Kiv Date: Wed, 8 Jun 2011 19:56:58 -0300 Subject: [PATCH 100/190] Start support for multiple platforms. --- guiminer.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/guiminer.py b/guiminer.py index 779448c..2aa68e7 100644 --- a/guiminer.py +++ b/guiminer.py @@ -148,12 +148,16 @@ def get_opencl_devices(): Raises IOError if no OpenCL devices are found. """ import pyopencl - platform = pyopencl.get_platforms()[0] #@UndefinedVariable - devices = platform.get_devices() - if len(devices) == 0: - raise IOError - return ['[%d] %s' % (i, merge_whitespace(device.name)[:25]) - for (i, device) in enumerate(devices)] + device_strings = [] + platforms = pyopencl.get_platforms() #@UndefinedVariable + for i, platform in enumerate(platforms): + devices = platform.get_devices() + for j, device in enumerate(devices): + device_strings.append('[%d-%d] %s' % + (i, j, merge_whitespace(device.name)[:25])) + if len(device_strings) == 0: + raise IOError + return device_strings def get_icon_bundle(): """Return the Bitcoin program icon bundle.""" From 64f5c1612a3d686e716906be117f3b156eb99408 Mon Sep 17 00:00:00 2001 From: Kiv Date: Wed, 8 Jun 2011 20:06:07 -0300 Subject: [PATCH 101/190] Update comment block. --- guiminer.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/guiminer.py b/guiminer.py index 0b7c55a..d128d12 100644 --- a/guiminer.py +++ b/guiminer.py @@ -3,6 +3,8 @@ Currently supports: - m0mchil's "poclbm" - puddinpop's "rpcminer" +- jedi95's "Phoenix" +- ufasoft's SSE miner Copyright 2011 Chris MacLeod This program is released under the GNU GPL. See LICENSE.txt for details. From 4c230de3a1506f428006012d181d65247ff2bd9b Mon Sep 17 00:00:00 2001 From: Kiv Date: Wed, 8 Jun 2011 21:51:17 -0300 Subject: [PATCH 102/190] Support multiple platforms. --- README.txt | 8 ++++++-- guiminer.py | 36 ++++++++++++++++++++++++++++++------ 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/README.txt b/README.txt index 45138c6..953e570 100644 --- a/README.txt +++ b/README.txt @@ -2,7 +2,11 @@ GUIMiner - a graphical interface for mining Bitcoins ==================================================== by Chris 'Kiv' MacLeod -based on "poclbm" by m0mchil, 'rpcminer' by puddinpop +based on: +- "poclbm" by m0mchil +- 'rpcminer' by puddinpop +- "phoenix" by jedi95 +- bitcoin-miner by ufasoft What is it? ----------- @@ -16,7 +20,7 @@ servers pre-set with the program. What is it not? --------------- -poclbm-gui does not replace the standard Bitcoin client from bitcoin.org - you +GUIMiner does not replace the standard Bitcoin client from bitcoin.org - you still need that program to view your account balance and send transactions. It is not a server, so it has to connect either to a mining pool, or to your computer's 'bitcoin.exe' if mining solo. diff --git a/guiminer.py b/guiminer.py index 69a2448..8094a41 100644 --- a/guiminer.py +++ b/guiminer.py @@ -4,7 +4,7 @@ - m0mchil's "poclbm" - puddinpop's "rpcminer" - jedi95's "Phoenix" -- ufasoft's SSE miner +- ufasoft's "bitcoin-miner" Copyright 2011 Chris MacLeod This program is released under the GNU GPL. See LICENSE.txt for details. @@ -608,6 +608,28 @@ def host_without_http_prefix(self): if host.startswith("http://"): return host[len('http://'):] return host + + @property + def device_index(self): + """Return the index of the currently selected OpenCL device.""" + s = self.device_listbox.GetStringSelection() + match = re.search(r'\[(\d+)-(\d+)\]', s) + assert match is not None + return int(match.group(2)) + + @property + def platform_index(self): + """Return the index of the currently selected OpenCL platform.""" + s = self.device_listbox.GetStringSelection() + match = re.search(r'\[(\d+)-(\d+)\]', s) + assert match is not None + return int(match.group(1)) + + @property + def is_device_visible(self): + """Return True if we are using a backend with device selection.""" + NO_DEVICE_SELECTION = ['rpcminer', 'bitcoin-miner'] + return not any(d in self.external_path for d in NO_DEVICE_SELECTION) def pause(self): """Pause the miner if we are mining, otherwise do nothing.""" @@ -770,13 +792,14 @@ def configure_subprocess_poclbm(self): executable = "poclbm.exe" else: executable = "python poclbm.py" - cmd = "%s --user=%s --pass=%s -o %s -p %s -d%d --verbose %s" % ( + cmd = "%s --user=%s --pass=%s -o %s -p %s --device=%d --platform=%d --verbose %s" % ( executable, self.txt_username.GetValue(), self.txt_pass.GetValue(), self.txt_host.GetValue(), self.txt_port.GetValue(), - self.device_listbox.GetSelection(), + self.device_index, + self.platform_index, self.txt_flags.GetValue() ) return cmd, folder @@ -816,13 +839,14 @@ def configure_subprocess_phoenix(self): if path.endswith('.py'): path = "python " + path - cmd = "%s -u http://%s:%s@%s:%s DEVICE=%d %s" % ( + cmd = "%s -u http://%s:%s@%s:%s PLATFORM=%d DEVICE=%d %s" % ( path, self.txt_username.GetValue(), self.txt_pass.GetValue(), self.host_without_http_prefix, self.txt_port.GetValue(), - self.device_listbox.GetSelection(), + self.platform_index, + self.device_index, self.txt_flags.GetValue()) return cmd, os.path.dirname(self.external_path) @@ -1324,7 +1348,7 @@ def layout_device_and_flags(self, row): Hide the device dropdown if RPCMiner is present since it doesn't use it. """ - device_visible = 'rpcminer' not in self.external_path + device_visible = self.is_device_visible self.set_widgets_visible([self.device_lbl, self.device_listbox], device_visible) if device_visible: self.inner_sizer.Add(self.device_lbl, (row,0), flag=LBL_STYLE) From cc193b902c3bf270ccb5bc0ba35acf2ac2585444 Mon Sep 17 00:00:00 2001 From: backburn Date: Thu, 9 Jun 2011 00:08:47 -0700 Subject: [PATCH 103/190] Add BitClockers.com mining pool to servers.ini --- servers.ini | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/servers.ini b/servers.ini index 6d168e1..7d5179d 100644 --- a/servers.ini +++ b/servers.ini @@ -54,6 +54,16 @@ "balance_url": "/api/getbalance/%s/", "balance_token_url": "http://btcmine.com/user/profile/" }, + + { + "name": "BitClockers", + "host": "pool.bitclockers.com", + "url": "http://bitclockers.com", + "port": 8332, + "balance_host": "bitclockers.com", + "balance_url": "/api/%s/", + "balance_token_url": "http://bitclockers.com/dashboard/" + }, { "name": "solo", From 302c0a4e476f0e78f919d90efdec26d1092231e9 Mon Sep 17 00:00:00 2001 From: Kiv Date: Thu, 9 Jun 2011 12:12:11 -0300 Subject: [PATCH 104/190] Fix missing balance refresh on Deepbit. Update URL for BTC Guild to include www. --- guiminer.py | 8 ++++---- servers.ini | 6 +++--- setup.py | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/guiminer.py b/guiminer.py index 8094a41..94e3a4b 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1086,7 +1086,7 @@ def change_server(self, new_server): host = new_server.get('host', "").lower() if host == "mining.bitcoin.cz": self.layout_slush() elif host == "bitpenny.dyndns.biz": self.layout_bitpenny() - elif host == "deepbit.net": self.layout_deepbit() + elif host == "pit.deepbit.net": self.layout_deepbit() elif host == "btcmine.com": self.layout_btcmine() elif host == "btcguild.com": self.layout_btcguild() else: self.layout_default() @@ -1156,7 +1156,7 @@ def request_balance_get(self, balance_auth_token): info.get('unconfirmed') or info.get('user', {}).get('unconfirmed_rewards') or 0) - if self.server_config.get('host') == "deepbit.net": + if self.server_config.get('host') == "pit.deepbit.net": ipa = info.get('ipa', False) self.withdraw.Enable(ipa) @@ -1173,7 +1173,7 @@ def on_withdraw(self, event): host = self.server_config.get('host') if host == 'bitpenny.dyndns.biz': self.withdraw_bitpenny() - elif host == 'deepbit.net': + elif host == 'pit.deepbit.net': self.withdraw_deepbit() def on_balance_refresh(self, event=None): @@ -1182,7 +1182,7 @@ def on_balance_refresh(self, event=None): HOSTS_REQUIRING_AUTH_TOKEN = ["mining.bitcoin.cz", "btcmine.com", - "deepbit.net", + "pit.deepbit.net", "btcguild.com"] if host in HOSTS_REQUIRING_AUTH_TOKEN: self.require_auth_token() diff --git a/servers.ini b/servers.ini index 6d168e1..07cc9b1 100644 --- a/servers.ini +++ b/servers.ini @@ -22,10 +22,10 @@ { "name": "BTC Guild", "host": "btcguild.com", - "url": "http://btcguild.com", + "url": "http://www.btcguild.com", "port": 8332, - "balance_token_url": "http://btcguild.com/my_api.php", - "balance_host": "btcguild.com", + "balance_token_url": "http://www.btcguild.com/my_api.php", + "balance_host": "www.btcguild.com", "balance_url": "/api.php?api_key=%s" }, diff --git a/setup.py b/setup.py index a14eaee..815f02d 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ 'icon_resources': [(0, "logo.ico")] } ], - console=['miners/phoenix/phoenix.py', 'poclbm.py', 'po_to_mo.py'], + console=['phoenix.py', 'poclbm.py', 'po_to_mo.py'], # OpenCL.dll is vendor specific options=dict(py2exe=dict( includes="minerutil, twisted.web.resource, QueueReader", From 896c83ccb43dd412cd9ac82025cb5ebeb00ec592 Mon Sep 17 00:00:00 2001 From: Kiv Date: Thu, 9 Jun 2011 12:48:42 -0300 Subject: [PATCH 105/190] Add menu items to create different types of miner. --- guiminer.py | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/guiminer.py b/guiminer.py index 94e3a4b..5bca49f 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1512,11 +1512,16 @@ def __init__(self, *args, **kwds): self.parse_config() self.do_show_opencl_warning = self.config_data.get('show_opencl_warning', True) - ID_NEW_EXTERNAL = wx.NewId() + ID_NEW_EXTERNAL, ID_NEW_PHOENIX, ID_NEW_CUDA, ID_NEW_UFASOFT = wx.NewId(), wx.NewId(), wx.NewId(), wx.NewId() self.menubar = wx.MenuBar() - file_menu = wx.Menu() - file_menu.Append(wx.ID_NEW, _("&New OpenCL miner..."), _("Create a new miner profile"), wx.ITEM_NORMAL) - file_menu.Append(ID_NEW_EXTERNAL, _("New &other miner..."), _("Create a CPU or CUDA miner (requires external program)"), wx.ITEM_NORMAL) + file_menu = wx.Menu() + new_menu = wx.Menu() + new_menu.Append(wx.ID_NEW, _("&New OpenCL miner..."), _("Create a new OpenCL miner (default for ATI cards)"), wx.ITEM_NORMAL) + new_menu.Append(ID_NEW_PHOENIX, _("New Phoenix miner..."), _("Create a new Phoenix miner (for some ATI cards)"), wx.ITEM_NORMAL) + new_menu.Append(ID_NEW_CUDA, _("New CUDA miner..."), _("Create a new CUDA miner (for NVIDIA cards)"), wx.ITEM_NORMAL) + new_menu.Append(ID_NEW_UFASOFT, _("New Ufasoft CPU miner..."), _("Create a new Ufasoft miner (for CPUs)"), wx.ITEM_NORMAL) + new_menu.Append(ID_NEW_EXTERNAL, _("New &other miner..."), _("Create a new custom miner (requires external program)"), wx.ITEM_NORMAL) + file_menu.AppendMenu(wx.NewId(), 'New miner', new_menu) file_menu.Append(wx.ID_SAVE, _("&Save settings"), _("Save your settings"), wx.ITEM_NORMAL) file_menu.Append(wx.ID_OPEN, _("&Load settings"), _("Load stored settings"), wx.ITEM_NORMAL) file_menu.Append(wx.ID_EXIT, _("Quit"), STR_QUIT, wx.ITEM_NORMAL) @@ -1572,6 +1577,9 @@ def __init__(self, *args, **kwds): self.do_show_opencl_warning = not dialog.is_box_checked() self.Bind(wx.EVT_MENU, self.name_new_profile, id=wx.ID_NEW) + self.Bind(wx.EVT_MENU, self.new_phoenix_profile, id=ID_NEW_PHOENIX) + self.Bind(wx.EVT_MENU, self.new_ufasoft_profile, id=ID_NEW_UFASOFT) + self.Bind(wx.EVT_MENU, self.new_cuda_profile, id=ID_NEW_CUDA) self.Bind(wx.EVT_MENU, self.new_external_profile, id=ID_NEW_EXTERNAL) self.Bind(wx.EVT_MENU, self.save_config, id=wx.ID_SAVE) self.Bind(wx.EVT_MENU, self.load_config, id=wx.ID_OPEN) @@ -1670,6 +1678,21 @@ def new_external_profile(self, event): dialog.Destroy() self.name_new_profile(extra_profile_data=dict(external_path=path)) + def new_phoenix_profile(self, event): + """Create a new miner using the Phoenix OpenCL miner backend.""" + path = os.path.join(get_module_path(), 'phoenix.exe') + self.name_new_profile(extra_profile_data=dict(external_path=path)) + + def new_ufasoft_profile(self, event): + """Create a new miner using the Ufasoft CPU miner backend.""" + path = os.path.join(get_module_path(), 'miners', 'ufasoft', 'bitcoin-miner.exe') + self.name_new_profile(extra_profile_data=dict(external_path=path)) + + def new_cuda_profile(self, event): + """Create a new miner using the CUDA GPU miner backend.""" + path = os.path.join(get_module_path(), 'miners', 'puddinpop', 'rpcminer-cuda.exe') + self.name_new_profile(extra_profile_data=dict(external_path=path)) + def get_storage_location(self): """Get the folder and filename to store our JSON config.""" if sys.platform == 'win32': From f6b179116fee333255717ed1b2b9d082822a07b0 Mon Sep 17 00:00:00 2001 From: Kiv Date: Thu, 9 Jun 2011 12:48:53 -0300 Subject: [PATCH 106/190] Add option to start GUI minimized. --- guiminer.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/guiminer.py b/guiminer.py index 5bca49f..6878b4a 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1540,6 +1540,12 @@ def __init__(self, *args, **kwds): solo_menu.Append(ID_LAUNCH, _("&Launch Bitcoin client as server"), _("Launch the official Bitcoin client as a server for solo mining"), wx.ITEM_NORMAL) self.menubar.Append(solo_menu, _("&Solo utilities")) + ID_START_MINIMIZED = wx.NewId() + self.options_menu = wx.Menu() + self.start_minimized_chk = self.options_menu.Append(ID_START_MINIMIZED, _("Start &minimized"), _("Start the GUI minimized to the tray."), wx.ITEM_CHECK) + self.options_menu.Check(ID_START_MINIMIZED, self.config_data.get('start_minimized', False)) + self.menubar.Append(self.options_menu, _("&Options")) + ID_CHANGE_LANGUAGE = wx.NewId() lang_menu = wx.Menu() lang_menu.Append(ID_CHANGE_LANGUAGE, _("&Change language..."), "", wx.ITEM_NORMAL) @@ -1599,6 +1605,9 @@ def __init__(self, *args, **kwds): self.load_config() self.do_layout() + + if not self.start_minimized_chk.IsChecked(): + self.Show() def set_properties(self): self.SetIcons(get_icon_bundle()) @@ -1741,7 +1750,8 @@ def save_config(self, event=None): show_summary=self.is_summary_visible(), profiles=profile_data, bitcoin_executable=self.bitcoin_executable, - show_opencl_warning=self.do_show_opencl_warning) + show_opencl_warning=self.do_show_opencl_warning, + start_minimized=self.start_minimized_chk.IsChecked()) logger.debug(_('Saving: ') + json.dumps(config_data)) try: with open(config_filename, 'w') as f: @@ -2099,8 +2109,7 @@ def is_box_checked(self): def run(): try: frame_1 = GUIMiner(None, -1, "") - app.SetTopWindow(frame_1) - frame_1.Show() + app.SetTopWindow(frame_1) app.MainLoop() except: logging.exception("Exception:") From 02d873592dce568bae89e93afc223e7820600e1c Mon Sep 17 00:00:00 2001 From: Kiv Date: Thu, 9 Jun 2011 13:27:53 -0300 Subject: [PATCH 107/190] Add donation menu. --- guiminer.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/guiminer.py b/guiminer.py index 6878b4a..3646412 100644 --- a/guiminer.py +++ b/guiminer.py @@ -14,12 +14,13 @@ import wx import json import collections +import webbrowser from wx.lib.agw import flatnotebook as fnb from wx.lib.agw import hyperlink from wx.lib.newevent import NewEvent -__version__ = '2011-06-08' +__version__ = '2011-06-09' def get_module_path(): """Return the folder containing this script (or its .exe).""" @@ -45,6 +46,8 @@ def get_module_path(): } LANGUAGES_REVERSE = dict((v,k) for (k,v) in LANGUAGES.items()) +DONATE_SMALL_URL = 'https://www.mybitcoin.com/sci/paypage.php?t=XFxBkKwtjVYHmQmHzVP1jE_euOoSpMZcXJ5XDtQ1EhISH6nuDWExVwvVYXHQjDC-ApO9Zlwww7tqJnCVP4kBSoaaOdLpyFYSKI9LbTjwnKi-tZEMYKmmfhSqGLWNS_BoVHN0RJFwsQlxKleftmfKG7dpRfQ9or2uX1RE1aWesJA9AsU%2C' + locale = None language = None def update_language(new_language): @@ -1550,9 +1553,14 @@ def __init__(self, *args, **kwds): lang_menu = wx.Menu() lang_menu.Append(ID_CHANGE_LANGUAGE, _("&Change language..."), "", wx.ITEM_NORMAL) self.menubar.Append(lang_menu, _("Language")) - + + ID_DONATE_SMALL = wx.NewId() + donate_menu = wx.Menu() + donate_menu.Append(ID_DONATE_SMALL, _("&Donate 99 cents..."), _("Donate $0.99 USD worth of Bitcoins to support GUIMiner development")) + self.menubar.Append(donate_menu, _("&Donate")) + help_menu = wx.Menu() - help_menu.Append(wx.ID_ABOUT, _("&About/Donate..."), STR_ABOUT, wx.ITEM_NORMAL) + help_menu.Append(wx.ID_ABOUT, _("&About..."), STR_ABOUT, wx.ITEM_NORMAL) self.menubar.Append(help_menu, _("&Help")) self.SetMenuBar(self.menubar) @@ -1597,6 +1605,7 @@ def __init__(self, *args, **kwds): self.Bind(wx.EVT_MENU, self.create_solo_password, id=ID_SOLO) self.Bind(wx.EVT_MENU, self.launch_solo_server, id=ID_LAUNCH) self.Bind(wx.EVT_MENU, self.on_change_language, id=ID_CHANGE_LANGUAGE) + self.Bind(wx.EVT_MENU, self.on_donate, id=ID_DONATE_SMALL) self.Bind(wx.EVT_CLOSE, self.on_close) self.Bind(wx.EVT_ICONIZE, lambda event: self.Hide()) self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CLOSING, self.on_page_closing) @@ -1973,7 +1982,8 @@ def on_change_language(self, event): update_language(LANGUAGES[language_name]) save_language() - + def on_donate(self, event): + webbrowser.open(DONATE_SMALL_URL) class ChangeLanguageDialog(wx.Dialog): """Dialog prompting the user to change languages.""" From 707ab4da754f804248fbc3cffdbaff5db641e93a Mon Sep 17 00:00:00 2001 From: Kiv Date: Thu, 9 Jun 2011 13:32:55 -0300 Subject: [PATCH 108/190] Update PO files and include all PO files in repository. --- guiminer_de.po | 781 ++++++++++++++++++++++++++++++++++++++++++++++++ guiminer_es.po | 358 ++++++++++++---------- guiminer_fr.po | 783 +++++++++++++++++++++++++++++++++++++++++++++++++ guiminer_hu.po | 769 ++++++++++++++++++++++++++++++++++++++++++++++++ guiminer_ru.po | 358 ++++++++++++---------- guiminer_zh.po | 369 +++++++++++++---------- messages.pot | 348 ++++++++++++---------- 7 files changed, 3159 insertions(+), 607 deletions(-) create mode 100644 guiminer_de.po create mode 100644 guiminer_fr.po create mode 100644 guiminer_hu.po diff --git a/guiminer_de.po b/guiminer_de.po new file mode 100644 index 0000000..bef9f58 --- /dev/null +++ b/guiminer_de.po @@ -0,0 +1,781 @@ +msgid "" +msgstr "" +"Project-Id-Version: guiminer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-06-09 13:29-0300\n" +"PO-Revision-Date: 2011-06-05 16:30+0100\n" +"Last-Translator: Liikaa \n" +"Language-Team: German\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: guiminer.py:84 +#, python-format +msgid "" +"GUIMiner\n" +"\n" +"Version: %(version)s\n" +"\n" +"GUI by Chris 'Kiv' MacLeod\n" +"Original poclbm miner by m0mchil\n" +"Original rpcminer by puddinpop\n" +"\n" +"Get the source code or file issues at GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"If you enjoyed this software, support its development\n" +"by donating to:\n" +"\n" +"%(address)s\n" +"\n" +"Even a single Bitcoin is appreciated and helps motivate\n" +"further work on this software.\n" +msgstr "" +"\n" +" GUIMiner\n" +"\n" +" Version: %(version)s\n" +"\n" +" GUI: Chris 'Kiv' MacLeod\n" +"\n" +" Komponenten:\n" +"\tpoclbm: m0mchil\n" +"\trpcminer: puddinpop\n" +"\n" +" Deutsche Übersetzung: Liikaa\n" +"\n" +" Quelltext und Bugtracker sind auf GitHub zu finden: \n" +"\thttps://github.com/Kiv/poclbm\n" +"\n" +" Wenn dir dieses Programm gefällt, unterstütze die\n" +" Entwicklung mit einer Spende an:\n" +"\n" +" %(address)s\n" +"\n" +" Selbst ein einzelner Bitcoin motiviert,\n" +" die Entwicklung fortzuführen. Have phun ;)\n" + +#: guiminer.py:105 +msgid "Not started" +msgstr "Nicht gestartet" + +#: guiminer.py:106 +msgid "Starting..." +msgstr "Starte..." + +#: guiminer.py:107 +msgid "Stopped" +msgstr "Gestoppt" + +#: guiminer.py:108 +msgid "Paused" +msgstr "Pausiert" + +#: guiminer.py:109 +msgid "Start mining!" +msgstr "Start!" + +#: guiminer.py:110 +msgid "Stop mining" +msgstr "Stop!" + +#: guiminer.py:111 +msgid "Refresh balance" +msgstr "Guthaben aktualisieren" + +#: guiminer.py:112 +msgid "Connection error" +msgstr "Verbindungsfehler" + +#: guiminer.py:113 +msgid "Username:" +msgstr "Benutzername:" + +#: guiminer.py:114 +msgid "Password:" +msgstr "Passwort:" + +#: guiminer.py:115 +msgid "Quit this program" +msgstr "Programm beenden" + +#: guiminer.py:116 +msgid "Show about dialog" +msgstr "Über" + +#: guiminer.py:197 +#, python-format +msgid "%.1f Ghash/s" +msgstr "%.1f Ghash/s" + +#: guiminer.py:199 +#, python-format +msgid "%.1f Mhash/s" +msgstr "%.1f Mhash/s" + +#: guiminer.py:201 +msgid "Connecting..." +msgstr "Verbinde..." + +#: guiminer.py:203 +#, python-format +msgid "%d khash/s" +msgstr "%d khash/s" + +#: guiminer.py:227 +#, python-format +msgid "Requesting balance: %(request)s" +msgstr "Guthaben wird abgerufen: %(request)s" + +#: guiminer.py:231 +#, python-format +msgid "Server replied: %(status)s, %(data)s" +msgstr "Serverantwort: %(status)s, %(data)s" + +#: guiminer.py:286 +msgid "Miner" +msgstr "Miner" + +#: guiminer.py:287 +msgid "Speed" +msgstr "Geschwindigkeit" + +#: guiminer.py:288 +msgid "Accepted" +msgstr "Akzeptiert" + +#: guiminer.py:289 +msgid "Stale" +msgstr "Ungültig" + +#: guiminer.py:290 +msgid "Start/Stop" +msgstr "Start/Stop" + +#: guiminer.py:291 +msgid "Autostart" +msgstr "Autostart" + +#: guiminer.py:375 +msgid "Pause all" +msgstr "Alle pausieren" + +#: guiminer.py:377 +msgid "Restore" +msgstr "Wiederherstellen" + +#: guiminer.py:378 +msgid "Close" +msgstr "Schließen" + +#: guiminer.py:434 +#, python-format +msgid "Listener for \"%s\" started" +msgstr "Listener für \"%s\" gestartet" + +#: guiminer.py:449 +#, python-format +msgid "Listener for \"%(name)s\": %(line)s" +msgstr "Listener für \"%(name)s\": %(line)s" + +#: guiminer.py:452 +#, python-format +msgid "Listener for \"%s\" shutting down" +msgstr "Listener für \"%s\" wird angehalten" + +#: guiminer.py:496 +msgid "Server:" +msgstr "Server:" + +#: guiminer.py:501 +msgid "Website:" +msgstr "Website:" + +#: guiminer.py:503 +msgid "Ext. Path:" +msgstr "Ext. Pfad:" + +#: guiminer.py:505 +msgid "Host:" +msgstr "Host:" + +#: guiminer.py:507 +msgid "Port:" +msgstr "Port:" + +#: guiminer.py:513 +msgid "Device:" +msgstr "Gerät:" + +#: guiminer.py:514 +msgid "No OpenCL devices" +msgstr "Keine OpenCL-Geräte" + +#: guiminer.py:515 +msgid "Extra flags:" +msgstr "Extra Parameter:" + +#: guiminer.py:518 +msgid "Balance:" +msgstr "Guthaben:" + +#: guiminer.py:522 +msgid "Withdraw" +msgstr "Überweisung" + +#: guiminer.py:667 +msgid "Default" +msgstr "Standard" + +#: guiminer.py:714 +msgid "Start" +msgstr "Start" + +#: guiminer.py:714 +msgid "Stop" +msgstr "Stop" + +#: guiminer.py:730 +msgid "Connection problems" +msgstr "Verbindungsprobleme" + +#: guiminer.py:889 +msgid "Running command: " +msgstr "Wird ausgeführt: " + +#: guiminer.py:943 +#, python-format +msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" +msgstr "Schwierigkeit 1 hashes: %(nhashes)d %(update_time)s" + +#: guiminer.py:947 +#, python-format +msgid "Blocks: %d, " +msgstr "Blöcke: %d, " + +#: guiminer.py:950 +#, python-format +msgid "Shares: %d accepted" +msgstr "Shares: %d akzeptiert" + +#: guiminer.py:952 +#, python-format +msgid ", %d stale/invalid" +msgstr ", %d ungültig" + +#: guiminer.py:974 +#, python-format +msgid "- last at %s" +msgstr "- zuletzt um %s" + +#: guiminer.py:1047 +msgid "" +"Server to connect to. Different servers have different fees and features.\n" +"Check their websites for full information." +msgstr "" +"Zu verwendender Server. Verschiedene Server haben unterschiedliche " +"Funktionen\n" +"und erheben abweichende Gebühren. (siehe Website für ausführliche " +"Informationen)" + +#: guiminer.py:1048 +msgid "Website of the currently selected server. Click to visit." +msgstr "Website des momentan ausgewählten Servers. Hier klicken zum Aufrufen." + +#: guiminer.py:1049 +msgid "Available OpenCL devices on your system." +msgstr "Verfügbare OpenCL-Geräte" + +#: guiminer.py:1050 +msgid "Host address, without http:// prefix." +msgstr "Host-Adresse, ohne führendes 'http://'" + +#: guiminer.py:1051 +msgid "Server port. This is usually 8332." +msgstr "Server-Port. Standardmäßig 8332." + +#: guiminer.py:1052 +msgid "" +"The miner's username.\n" +"May be different than your account username.\n" +"Example: Kiv.GPU" +msgstr "" +"Miner-Benutzername.\n" +"Kann sich vom Account-Benutzernamen unterscheiden.\n" +"Beispiel: Kiv.GPU" + +#: guiminer.py:1053 +msgid "" +"The miner's password.\n" +"May be different than your account password." +msgstr "" +"Miner-Passwort.\n" +"Kann sich vom Account-Passwort unterscheiden." + +#: guiminer.py:1054 +msgid "" +"Extra flags to pass to the miner.\n" +"For Radeon HD 5xxx series use -v -w128 for best results.\n" +"For other cards consult the forum." +msgstr "" +"Extra-Parameter für den Aufruf.\n" +"Auf Karten der Radeon HD 5000 Serie werden die besten Ergebnisse\n" +"mit -v -w128 erzielt. Für andere Karten siehe Forum.\n" +"Die Priorität kann von 0 (hoch) bis 100 (niedrig) festgelegt\n" +"werden. (Beispiel: -f60)" + +#: guiminer.py:1148 guiminer.py:1242 guiminer.py:1263 +msgid "Auth token rejected by server." +msgstr "Authentifizierung fehlgeschlagen." + +#: guiminer.py:1166 +#, python-format +msgid "%s confirmed" +msgstr "%s bestätigt" + +#: guiminer.py:1168 +#, python-format +msgid ", %s unconfirmed" +msgstr ", %s unbestätigt" + +#: guiminer.py:1170 +msgid "Bad response from server." +msgstr "Fehlerhafte Serverantwort." + +#: guiminer.py:1246 guiminer.py:1267 +msgid "Withdraw OK" +msgstr "Überweisung getätigt" + +#: guiminer.py:1426 +msgid "No registration is required - just enter an address and press Start." +msgstr "Keine Registrierung erforderlich. Einfach Adresse eingeben und starten" + +#: guiminer.py:1428 +msgid "Address:" +msgstr "Adresse:" + +#: guiminer.py:1430 +msgid "" +"Your receiving address for Bitcoins.\n" +"E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" +msgstr "" +"Adresse für eingehende Transaktionen.\n" +"Beispiel: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" + +#: guiminer.py:1445 +msgid "" +"Your miner username (not your account username).\n" +"Example: Kiv.GPU" +msgstr "" +"Miner-Benutzername (nicht der Account-Benutzername)\n" +"Beispiel: Kiv.GPU" + +#: guiminer.py:1447 guiminer.py:1467 +msgid "Your miner password (not your account password)." +msgstr "Miner-Passwort (nicht der Account-Passwort)" + +#: guiminer.py:1465 +#, fuzzy +msgid "" +"Your miner username. \n" +"Example: kiv123@kiv123" +msgstr "" +"Логин генератора. \n" +"Beispiel: kiv123@kiv123" + +#: guiminer.py:1481 +msgid "The e-mail address you registered with." +msgstr "E-Mail-Adresse aus der Registrierung." + +#: guiminer.py:1482 +msgid "Email:" +msgstr "E-Mail:" + +#: guiminer.py:1497 +msgid "&Rename..." +msgstr "&Umbenennen..." + +#: guiminer.py:1497 +msgid "Rename this miner" +msgstr "Diesen Miner umbenennen" + +#: guiminer.py:1522 +msgid "&New OpenCL miner..." +msgstr "&Neuer OpenCL-Miner..." + +#: guiminer.py:1522 +msgid "Create a new OpenCL miner (default for ATI cards)" +msgstr "" + +#: guiminer.py:1523 +#, fuzzy +msgid "Create a new Phoenix miner (for some ATI cards)" +msgstr "Neues Miner-&Profil erstellen" + +#: guiminer.py:1523 +#, fuzzy +msgid "New Phoenix miner..." +msgstr "Neuen &externen Miner..." + +#: guiminer.py:1524 +msgid "Create a new CUDA miner (for NVIDIA cards)" +msgstr "" + +#: guiminer.py:1524 +#, fuzzy +msgid "New CUDA miner..." +msgstr "&Neuer OpenCL-Miner..." + +#: guiminer.py:1525 +#, fuzzy +msgid "Create a new Ufasoft miner (for CPUs)" +msgstr "Neues Miner-&Profil erstellen" + +#: guiminer.py:1525 +#, fuzzy +msgid "New Ufasoft CPU miner..." +msgstr "Neuen &externen Miner..." + +#: guiminer.py:1526 +#, fuzzy +msgid "Create a new custom miner (requires external program)" +msgstr "Neuen CPU- oder CUDA-Miner erstellen (erfordert externe Anwendung)" + +#: guiminer.py:1526 +msgid "New &other miner..." +msgstr "Neuen &externen Miner..." + +#: guiminer.py:1528 +msgid "&Save settings" +msgstr "Einstellungen &speichern" + +#: guiminer.py:1528 +msgid "Save your settings" +msgstr "Einstellungen speichern" + +#: guiminer.py:1529 +msgid "&Load settings" +msgstr "&Einstellungen &laden" + +#: guiminer.py:1529 +msgid "Load stored settings" +msgstr "Einstellungen laden" + +#: guiminer.py:1530 +msgid "Quit" +msgstr "&Beenden" + +#: guiminer.py:1531 +msgid "&File" +msgstr "&Datei" + +#: guiminer.py:1535 +msgid "Show summary" +msgstr "&Zusammenfassung anzeigen" + +#: guiminer.py:1535 +msgid "Show summary of all miners" +msgstr "Zusammenfassung aller Miner anzeigen" + +#: guiminer.py:1536 +msgid "Show console" +msgstr "&Konsole anzeigen" + +#: guiminer.py:1536 +msgid "Show console logs" +msgstr "Konsolen-Logs anzeigen" + +#: guiminer.py:1537 +msgid "&View" +msgstr "&Ansicht" + +#: guiminer.py:1541 +msgid "&Create solo password..." +msgstr "&Solo-Passwort erstellen..." + +#: guiminer.py:1541 +msgid "Configure a user/pass for solo mining" +msgstr "Benutzername/Password für Solo-Mining festlegen" + +#: guiminer.py:1542 +msgid "&Set Bitcoin client path..." +msgstr "Bitcoin-Client-&Pfad..." + +#: guiminer.py:1542 +msgid "Set the location of the official Bitcoin client" +msgstr "Pfad zum offiziellen Bitcoin-Client festlegen." + +#: guiminer.py:1543 +msgid "&Launch Bitcoin client as server" +msgstr "&Bitcoin-Client als Server starten" + +#: guiminer.py:1543 +msgid "Launch the official Bitcoin client as a server for solo mining" +msgstr "Startet den offiziellen Bitcoin-CLient im Servermodus für Solo-Mining" + +#: guiminer.py:1544 +msgid "&Solo utilities" +msgstr "Solo-&Werkzeuge" + +#: guiminer.py:1548 +#, fuzzy +msgid "Start &minimized" +msgstr "Start!" + +#: guiminer.py:1548 +msgid "Start the GUI minimized to the tray." +msgstr "" + +#: guiminer.py:1550 +msgid "&Options" +msgstr "" + +#: guiminer.py:1554 +msgid "&Change language..." +msgstr "&Sprache wechseln..." + +#: guiminer.py:1555 +msgid "Language" +msgstr "&Sprache" + +#: guiminer.py:1559 +msgid "&Donate 99 cents..." +msgstr "" + +#: guiminer.py:1559 +msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" +msgstr "" + +#: guiminer.py:1560 +#, fuzzy +msgid "&Donate" +msgstr "&Über/Spenden..." + +#: guiminer.py:1563 +#, fuzzy +msgid "&About..." +msgstr "&Über/Spenden..." + +#: guiminer.py:1565 +msgid "&Help" +msgstr "&Hilfe" + +#: guiminer.py:1577 +msgid "Failed to load taskbar icon; continuing." +msgstr "Fehler beim Laden des Icons; fahre fort...." + +#: guiminer.py:1586 +msgid "OpenCL not found - can't add a OpenCL miner" +msgstr "" +"OpenCL wurde nicht gefunden - OpenCL-Miner kann nicht hinzugefügt werden" + +#: guiminer.py:1623 +#, python-format +msgid "GUIMiner - v%s" +msgstr "GUIMiner - v%s" + +#: guiminer.py:1665 +msgid "Name this miner:" +msgstr "Name des Miners:" + +#: guiminer.py:1665 +msgid "New miner" +msgstr "Neuer Miner" + +#: guiminer.py:1668 +msgid "Untitled" +msgstr "Unbenannt" + +#: guiminer.py:1679 +#, fuzzy +msgid "External miner (*.exe)|*.exe|(*.py)|*.py" +msgstr "Externer Miner (*.exe)|*.exe" + +#: guiminer.py:1681 +msgid "Select external miner:" +msgstr "Externen Miner auswählen:" + +#: guiminer.py:1691 +#, python-format +msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" +msgstr "" +"Nicht unterstützter externer Miner %(filename)s. Unterstützt werden: %" +"(supported)s" + +#: guiminer.py:1693 +msgid "Miner not supported" +msgstr "Miner nicht unterstützt" + +#: guiminer.py:1734 +msgid "Do you want to save changes?" +msgstr "Einstellungen speichern?" + +#: guiminer.py:1734 +msgid "Save" +msgstr "Speichern" + +#: guiminer.py:1764 +msgid "Saving: " +msgstr "Speichern: " + +#: guiminer.py:1770 +#, python-format +msgid "" +"Couldn't write save file %s.\n" +"Check the location is writable." +msgstr "" +"Konnte Konfigurationsdatei %s nicht schreiben.\n" +"Überprüfe die Datei auf Beschreibbarkeit" + +#: guiminer.py:1771 +msgid "Save unsuccessful" +msgstr "Speichern nicht erfolgreich" + +#: guiminer.py:1773 +#, python-format +msgid "Profiles saved OK to %s." +msgstr "Profile erfolgreich gespeichert unter %s." + +#: guiminer.py:1774 +msgid "Save successful" +msgstr "Erfolgreich gespeichert" + +#: guiminer.py:1786 +#, python-format +msgid "Loaded: %s" +msgstr "Geladen: %s" + +#: guiminer.py:1800 +msgid "Loading profiles will stop any currently running miners. Continue?" +msgstr "Laden der Profile unterbricht alle Operationen. Fortfahren?" + +#: guiminer.py:1801 +msgid "Load profile" +msgstr "Profil laden" + +#: guiminer.py:1830 +msgid "Select path to Bitcoin.exe" +msgstr "Pfad zur Bitcoin.exe wählen" + +#: guiminer.py:1842 +msgid "About" +msgstr "Über" + +#: guiminer.py:1868 +msgid "Closing this miner will stop it. Continue?" +msgstr "Schließen des Miners beendet ihn. Fortfahren?" + +#: guiminer.py:1869 +msgid "Close miner" +msgstr "Miner schließen" + +#: guiminer.py:1898 +#, python-format +msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" +msgstr "Konnte Bitcoin nicht unter %s finden. Pfad korrekt?" + +#: guiminer.py:1899 +msgid "Launch failed" +msgstr "Aufruf fehlgeschlagen" + +#: guiminer.py:1902 +msgid "" +"Client launched ok. You can start a miner now with the server set to 'solo'." +msgstr "" +"Client erfolgreich gestartet. Neuer Miner mit Server \"solo\" kann gestartet " +"werden." + +#: guiminer.py:1903 +msgid "Launched ok." +msgstr "Aufruf erfolgreich." + +#: guiminer.py:1918 +#, python-format +msgid "%s already exists. Overwrite?" +msgstr "%s existiert bereits. Fortfahren?" + +#: guiminer.py:1919 +msgid "bitcoin.conf already exists." +msgstr "bitcoin.conf existiert bereits." + +#: guiminer.py:1924 +msgid "Enter password" +msgstr "Passwort eingeben" + +#: guiminer.py:1934 +msgid "Success" +msgstr "Erfolgreich" + +#: guiminer.py:1934 +msgid "Wrote bitcoin config ok." +msgstr "bitcoin.conf geschrieben." + +#: guiminer.py:1945 +msgid "Console" +msgstr "Konsole" + +#: guiminer.py:1957 +msgid "Summary" +msgstr "Zusammenfassung" + +#: guiminer.py:1970 +msgid "Rename miner" +msgstr "Miner umbenennen" + +#: guiminer.py:1970 +msgid "Rename to:" +msgstr "Umbenennen zu:" + +#: guiminer.py:1975 +msgid "Change language" +msgstr "Sprache wechseln" + +#: guiminer.py:1995 +msgid "Choose language (requires restart to take full effect)" +msgstr "Sprache auswählen (Neustart erforderlich)" + +#: guiminer.py:2040 +msgid "" +"Click the link below to log in to the pool and get a special token. \n" +"This token lets you securely check your balance.\n" +"To remember this token for the future, save your miner settings." +msgstr "" +"Klicke auf den Link um einen API-Token zu erhalten. \n" +"Dieser Token erlaubt das sichere Abrufen des Guthabens.\n" +"Um diesen Token für die Zukunft zu sichern, müssen die\n" +"Einstellungen gespeichert werden." + +#: guiminer.py:2049 +msgid "(Paste token here)" +msgstr "(Token hier einfügen)" + +#: guiminer.py:2075 +msgid "Copy address to clipboard" +msgstr "Adresse in die Zwischenablage kopieren" + +#: guiminer.py:2094 +msgid "No OpenCL devices found." +msgstr "Keine OpenCL-Geräte gefunden." + +#: guiminer.py:2097 +msgid "" +"No OpenCL devices were found.\n" +" If you only want to mine using CPU or CUDA, you can ignore this message.\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI " +"Stream\n" +" SDK, or your GPU may not support OpenCL." +msgstr "" +"Es konnten keine OpenCL-Geräte gefunden werden.\n" +"Wenn nur die CPU oder CUDA verwendet werden sollen, kann diese Meldung " +"ignoriert werden.\n" +"Wenn OpenCL mit einer ATI/AMD-Grafikkarte genutzt werden soll, \n" +"muss das AMD Stream SDK oder der aktuelle Catalyst-Treiber \n" +"installiert werden." + +#: guiminer.py:2107 +msgid "Don't show this message again" +msgstr "Diese Nachrift nicht wieder anzeigen" + +#~ msgid "%s mining!" +#~ msgstr "%s" diff --git a/guiminer_es.po b/guiminer_es.po index 42c574b..2abbd75 100644 --- a/guiminer_es.po +++ b/guiminer_es.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-20 23:09-0300\n" +"POT-Creation-Date: 2011-06-09 13:29-0300\n" "PO-Revision-Date: 2011-05-20 00:00-0000\n" "Last-Translator: Bitcoins Wallet \n" "Language-Team: Español\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: guiminer.py:75 +#: guiminer.py:84 #, python-format msgid "" "GUIMiner\n" @@ -47,220 +47,220 @@ msgstr "" "Incluso una sóla Bitcoin se aprecia y ayuda a motivar\n" "a los desarrolladores en el trabajo futuro.\n" -#: guiminer.py:96 +#: guiminer.py:105 msgid "Not started" msgstr "No iniciado" -#: guiminer.py:97 +#: guiminer.py:106 msgid "Starting..." msgstr "Empezando..." -#: guiminer.py:98 +#: guiminer.py:107 msgid "Stopped" msgstr "Detenido" -#: guiminer.py:99 +#: guiminer.py:108 msgid "Paused" msgstr "Pausado" -#: guiminer.py:100 +#: guiminer.py:109 msgid "Start mining!" msgstr "Iniciar la minería" -#: guiminer.py:101 +#: guiminer.py:110 msgid "Stop mining" msgstr "Parar la minería" -#: guiminer.py:102 +#: guiminer.py:111 msgid "Refresh balance" msgstr "Actualizar saldo" -#: guiminer.py:103 +#: guiminer.py:112 msgid "Connection error" msgstr "Error de conexión" -#: guiminer.py:104 +#: guiminer.py:113 msgid "Username:" msgstr "Usuario:" -#: guiminer.py:105 +#: guiminer.py:114 msgid "Password:" msgstr "Contraseña:" -#: guiminer.py:106 +#: guiminer.py:115 msgid "Quit this program" msgstr "Salir del programa" -#: guiminer.py:107 +#: guiminer.py:116 msgid "Show about dialog" msgstr "Acerca de..." -#: guiminer.py:182 +#: guiminer.py:197 #, python-format msgid "%.1f Ghash/s" msgstr "%.1f Ghash/s" -#: guiminer.py:184 +#: guiminer.py:199 #, python-format msgid "%.1f Mhash/s" msgstr "%.1f Mhash/s" -#: guiminer.py:186 +#: guiminer.py:201 msgid "Connecting..." msgstr "Conectando..." -#: guiminer.py:188 +#: guiminer.py:203 #, python-format msgid "%d khash/s" msgstr "%d khash/s" -#: guiminer.py:212 +#: guiminer.py:227 #, python-format msgid "Requesting balance: %(request)s" msgstr "Solicitando saldo: %(request)s" -#: guiminer.py:216 +#: guiminer.py:231 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "Contestación del Servidor: %(status)s, %(data)s" -#: guiminer.py:267 +#: guiminer.py:286 msgid "Miner" msgstr "Minero" -#: guiminer.py:268 +#: guiminer.py:287 msgid "Speed" msgstr "Velocidad" -#: guiminer.py:269 +#: guiminer.py:288 msgid "Accepted" msgstr "Aceptado" -#: guiminer.py:270 +#: guiminer.py:289 msgid "Stale" msgstr "Caducado" -#: guiminer.py:271 +#: guiminer.py:290 msgid "Start/Stop" msgstr "Iniciar/Parar" -#: guiminer.py:272 +#: guiminer.py:291 msgid "Autostart" msgstr "Inicio auto." -#: guiminer.py:356 +#: guiminer.py:375 msgid "Pause all" msgstr "Pausar todos" -#: guiminer.py:358 +#: guiminer.py:377 msgid "Restore" msgstr "Restaurar" -#: guiminer.py:359 +#: guiminer.py:378 msgid "Close" msgstr "Cerrar" -#: guiminer.py:413 +#: guiminer.py:434 #, python-format msgid "Listener for \"%s\" started" msgstr "Minero \"%s\" iniciado" -#: guiminer.py:428 +#: guiminer.py:449 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "Minero \"%(name)s\": %(line)s" -#: guiminer.py:431 +#: guiminer.py:452 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "Minero \"%s\" cerrando" -#: guiminer.py:462 +#: guiminer.py:496 msgid "Server:" msgstr "Grupo:" -#: guiminer.py:467 +#: guiminer.py:501 msgid "Website:" msgstr "Sitio web:" -#: guiminer.py:469 +#: guiminer.py:503 msgid "Ext. Path:" msgstr "Ruta externa" -#: guiminer.py:471 +#: guiminer.py:505 msgid "Host:" msgstr "Servidor:" -#: guiminer.py:473 +#: guiminer.py:507 msgid "Port:" msgstr "Puerto:" -#: guiminer.py:479 +#: guiminer.py:513 msgid "Device:" msgstr "Dispositivo:" -#: guiminer.py:480 +#: guiminer.py:514 msgid "No OpenCL devices" msgstr "No hay dispositivos OpenCL" -#: guiminer.py:481 +#: guiminer.py:515 msgid "Extra flags:" msgstr "Opciones extra:" -#: guiminer.py:484 +#: guiminer.py:518 msgid "Balance:" msgstr "Saldo:" -#: guiminer.py:488 +#: guiminer.py:522 msgid "Withdraw" msgstr "Retirar saldo" -#: guiminer.py:603 +#: guiminer.py:667 msgid "Default" msgstr "Por defecto" -#: guiminer.py:650 +#: guiminer.py:714 msgid "Start" msgstr "Iniciar" -#: guiminer.py:650 +#: guiminer.py:714 msgid "Stop" msgstr "Parar" -#: guiminer.py:666 +#: guiminer.py:730 msgid "Connection problems" msgstr "Problemas de conexión" -#: guiminer.py:801 +#: guiminer.py:889 msgid "Running command: " msgstr "Ejecutando comando: " -#: guiminer.py:853 +#: guiminer.py:943 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "Dificultad 1 hashes: %(nhashes)d %(update_time)s" -#: guiminer.py:857 +#: guiminer.py:947 #, python-format msgid "Blocks: %d, " msgstr "Bloques: %d, " -#: guiminer.py:860 +#: guiminer.py:950 #, python-format msgid "Shares: %d accepted" msgstr "Tareas: %d aceptadas" -#: guiminer.py:862 +#: guiminer.py:952 #, python-format msgid ", %d stale/invalid" msgstr ", %d caducada/inválida" -#: guiminer.py:884 +#: guiminer.py:974 #, python-format msgid "- last at %s" msgstr "- última: %s" -#: guiminer.py:957 +#: guiminer.py:1047 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." @@ -268,23 +268,23 @@ msgstr "" "Grupo donde conectar. Cada grupo tiene diferentes tasas y características.\n" "Ver sus páginas web para obtener toda la información." -#: guiminer.py:958 +#: guiminer.py:1048 msgid "Website of the currently selected server. Click to visit." msgstr "Página web del grupo seleccionado actualmente. Clic para visitar" -#: guiminer.py:959 +#: guiminer.py:1049 msgid "Available OpenCL devices on your system." msgstr "Dispositivos OpenCL disponibles en tu sistema" -#: guiminer.py:960 +#: guiminer.py:1050 msgid "Host address, without http:// prefix." msgstr "Dirección del Servidor, sin el prefijo http://." -#: guiminer.py:961 +#: guiminer.py:1051 msgid "Server port. This is usually 8332." msgstr "Puerto del servidor. Generalmente 8332." -#: guiminer.py:962 +#: guiminer.py:1052 msgid "" "The miner's username.\n" "May be different than your account username.\n" @@ -294,7 +294,7 @@ msgstr "" "Puede ser diferente al usuario de la cuenta.\n" "Ejemplo: BitcoinsWallet.GPU" -#: guiminer.py:963 +#: guiminer.py:1053 msgid "" "The miner's password.\n" "May be different than your account password." @@ -302,7 +302,7 @@ msgstr "" "Contraseña del minero.\n" "Puede ser diferente a la contraseña de la cuenta.\n" -#: guiminer.py:964 +#: guiminer.py:1054 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" @@ -312,39 +312,39 @@ msgstr "" "Para obtener mejores resultados con las Radeon HD 5xxx utiliza -v -w128.\n" "Para otras tarjetas, consultar el foro: http://forum.bitcoin.org/." -#: guiminer.py:1058 guiminer.py:1148 guiminer.py:1169 +#: guiminer.py:1148 guiminer.py:1242 guiminer.py:1263 msgid "Auth token rejected by server." msgstr "Código de autorización rechazado por el servidor" -#: guiminer.py:1076 +#: guiminer.py:1166 #, python-format msgid "%s confirmed" msgstr "%s confirmado" -#: guiminer.py:1078 +#: guiminer.py:1168 #, python-format msgid ", %s unconfirmed" msgstr ", %s sin confirmar" -#: guiminer.py:1080 +#: guiminer.py:1170 msgid "Bad response from server." msgstr "Respuesta incorrecta del servidor." -#: guiminer.py:1152 guiminer.py:1173 +#: guiminer.py:1246 guiminer.py:1267 msgid "Withdraw OK" msgstr "Retirada de saldo correcta" -#: guiminer.py:1332 +#: guiminer.py:1426 msgid "No registration is required - just enter an address and press Start." msgstr "" "No es necesario el registro - sólo introduce una dirección y presiona " "Iniciar." -#: guiminer.py:1334 +#: guiminer.py:1428 msgid "Address:" msgstr "Dirección:" -#: guiminer.py:1336 +#: guiminer.py:1430 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" @@ -352,7 +352,7 @@ msgstr "" "Tu cuenta para recibir Bitcoins.\n" "Ejemplo: 1LSEcWhBwvQ6r5wWC6ZfHRtDrTmybqXbLk" -#: guiminer.py:1351 +#: guiminer.py:1445 msgid "" "Your miner username (not your account username).\n" "Example: Kiv.GPU" @@ -360,11 +360,11 @@ msgstr "" "Tu usuario del minero, (no el usuario de la cuenta).\n" "Ejemplo: BitcoinsWallet.GPU" -#: guiminer.py:1353 guiminer.py:1373 +#: guiminer.py:1447 guiminer.py:1467 msgid "Your miner password (not your account password)." msgstr "Contraseña del minero (no la contraseña de la cuenta).\n" -#: guiminer.py:1371 +#: guiminer.py:1465 msgid "" "Your miner username. \n" "Example: kiv123@kiv123" @@ -372,183 +372,241 @@ msgstr "" "El usuario del minero. \n" "Ejemplo: BitcoinsWallet@kiv123" -#: guiminer.py:1387 +#: guiminer.py:1481 msgid "The e-mail address you registered with." msgstr "El correo electrónico con el que te registraste." -#: guiminer.py:1388 +#: guiminer.py:1482 msgid "Email:" msgstr "Correo electrónico:" -#: guiminer.py:1403 +#: guiminer.py:1497 msgid "&Rename..." msgstr "&Renombrar..." -#: guiminer.py:1403 +#: guiminer.py:1497 msgid "Rename this miner" msgstr "Renombrar este minero" -#: guiminer.py:1427 +#: guiminer.py:1522 msgid "&New OpenCL miner..." msgstr "&Nuevo minero OpenCL..." -#: guiminer.py:1427 -msgid "Create a new miner profile" +#: guiminer.py:1522 +msgid "Create a new OpenCL miner (default for ATI cards)" +msgstr "" + +#: guiminer.py:1523 +#, fuzzy +msgid "Create a new Phoenix miner (for some ATI cards)" msgstr "Crear un nuevo perfil de minero" -#: guiminer.py:1428 -msgid "Create a CPU or CUDA miner (requires external program)" +#: guiminer.py:1523 +#, fuzzy +msgid "New Phoenix miner..." +msgstr "Nuevo minero diferente..." + +#: guiminer.py:1524 +msgid "Create a new CUDA miner (for NVIDIA cards)" +msgstr "" + +#: guiminer.py:1524 +#, fuzzy +msgid "New CUDA miner..." +msgstr "&Nuevo minero OpenCL..." + +#: guiminer.py:1525 +#, fuzzy +msgid "Create a new Ufasoft miner (for CPUs)" +msgstr "Crear un nuevo perfil de minero" + +#: guiminer.py:1525 +#, fuzzy +msgid "New Ufasoft CPU miner..." +msgstr "Nuevo minero diferente..." + +#: guiminer.py:1526 +#, fuzzy +msgid "Create a new custom miner (requires external program)" msgstr "Crear un nuevo minero CPU o CUDA (requiere un programa externo)" -#: guiminer.py:1428 +#: guiminer.py:1526 msgid "New &other miner..." msgstr "Nuevo minero diferente..." -#: guiminer.py:1429 +#: guiminer.py:1528 msgid "&Save settings" msgstr "&Guardar opciones" -#: guiminer.py:1429 +#: guiminer.py:1528 msgid "Save your settings" msgstr "Guardar tus opciones" -#: guiminer.py:1430 +#: guiminer.py:1529 msgid "&Load settings" msgstr "&Cargar opciones" -#: guiminer.py:1430 +#: guiminer.py:1529 msgid "Load stored settings" msgstr "Cargar las opciones guardadas" -#: guiminer.py:1431 +#: guiminer.py:1530 msgid "Quit" msgstr "Salir" -#: guiminer.py:1432 +#: guiminer.py:1531 msgid "&File" msgstr "&Archivo" -#: guiminer.py:1436 +#: guiminer.py:1535 msgid "Show summary" msgstr "Mostrar sumario" -#: guiminer.py:1436 +#: guiminer.py:1535 msgid "Show summary of all miners" msgstr "Mostrar sumario de todos los mineros" -#: guiminer.py:1437 +#: guiminer.py:1536 msgid "Show console" msgstr "Mostrar consola" -#: guiminer.py:1437 +#: guiminer.py:1536 msgid "Show console logs" msgstr "Mostrar los registros de la consola" -#: guiminer.py:1438 +#: guiminer.py:1537 msgid "&View" msgstr "&Ver" -#: guiminer.py:1442 +#: guiminer.py:1541 msgid "&Create solo password..." msgstr "&Crear usuario/contraseña..." -#: guiminer.py:1442 +#: guiminer.py:1541 msgid "Configure a user/pass for solo mining" msgstr "Configurar un usuario/contraseña para la minería en modo 'solo'" -#: guiminer.py:1443 +#: guiminer.py:1542 msgid "&Set Bitcoin client path..." msgstr "&Configurar la ruta del cliente Bitcoin..." -#: guiminer.py:1443 +#: guiminer.py:1542 msgid "Set the location of the official Bitcoin client" msgstr "Configurar la ruta del cliente oficial Bitcoin." -#: guiminer.py:1444 +#: guiminer.py:1543 msgid "&Launch Bitcoin client as server" msgstr "&Ejecutar el cliente Bitcoin como servidor" -#: guiminer.py:1444 +#: guiminer.py:1543 msgid "Launch the official Bitcoin client as a server for solo mining" msgstr "" "Ejecutar el cliente Bitcoin como servidor para la minería en modo 'solo'" -#: guiminer.py:1445 +#: guiminer.py:1544 msgid "&Solo utilities" msgstr "&Minería en modo 'solo'" -#: guiminer.py:1449 +#: guiminer.py:1548 +#, fuzzy +msgid "Start &minimized" +msgstr "Iniciar la minería" + +#: guiminer.py:1548 +msgid "Start the GUI minimized to the tray." +msgstr "" + +#: guiminer.py:1550 +msgid "&Options" +msgstr "" + +#: guiminer.py:1554 msgid "&Change language..." msgstr "&Cambiar idioma..." -#: guiminer.py:1450 +#: guiminer.py:1555 msgid "Language" msgstr "Idioma" -#: guiminer.py:1453 -msgid "&About/Donate..." +#: guiminer.py:1559 +msgid "&Donate 99 cents..." +msgstr "" + +#: guiminer.py:1559 +msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" +msgstr "" + +#: guiminer.py:1560 +#, fuzzy +msgid "&Donate" +msgstr "&Acerca de/Donaciones..." + +#: guiminer.py:1563 +#, fuzzy +msgid "&About..." msgstr "&Acerca de/Donaciones..." -#: guiminer.py:1455 +#: guiminer.py:1565 msgid "&Help" msgstr "&Ayuda" -#: guiminer.py:1467 +#: guiminer.py:1577 msgid "Failed to load taskbar icon; continuing." msgstr "Error al cargar el icono de bandeja del sistema; continunando...." -#: guiminer.py:1476 +#: guiminer.py:1586 msgid "OpenCL not found - can't add a OpenCL miner" msgstr "OpenCL no encontrado. No se puede añadir un minero OpenCL" -#: guiminer.py:1506 +#: guiminer.py:1623 #, python-format msgid "GUIMiner - v%s" msgstr "GUIMiner - v%s" -#: guiminer.py:1548 +#: guiminer.py:1665 msgid "Name this miner:" msgstr "Nombre para este minero:" -#: guiminer.py:1548 +#: guiminer.py:1665 msgid "New miner" msgstr "Nuevo minero" -#: guiminer.py:1551 +#: guiminer.py:1668 msgid "Untitled" msgstr "Sin nombre" -#: guiminer.py:1562 -msgid "External miner (*.exe)|*.exe" +#: guiminer.py:1679 +#, fuzzy +msgid "External miner (*.exe)|*.exe|(*.py)|*.py" msgstr "Minero externo (*.exe)|*.exe" -#: guiminer.py:1564 +#: guiminer.py:1681 msgid "Select external miner:" msgstr "Seleccionar un minero externo:" -#: guiminer.py:1574 +#: guiminer.py:1691 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" msgstr "" "Minero externo %(filename)s no compatible. Los compatibles son: %(supported)" -#: guiminer.py:1576 +#: guiminer.py:1693 msgid "Miner not supported" msgstr "Minero no compatible" -#: guiminer.py:1602 +#: guiminer.py:1734 msgid "Do you want to save changes?" msgstr "¿Quieres guardar los cambios?" -#: guiminer.py:1602 +#: guiminer.py:1734 msgid "Save" msgstr "Guardar" -#: guiminer.py:1631 +#: guiminer.py:1764 msgid "Saving: " msgstr "Guardando: " -#: guiminer.py:1637 +#: guiminer.py:1770 #, python-format msgid "" "Couldn't write save file %s.\n" @@ -557,114 +615,114 @@ msgstr "" "No se puede guardar el archivo %s.\n" "Comprueba que la ubicación permite la escritura" -#: guiminer.py:1638 +#: guiminer.py:1771 msgid "Save unsuccessful" msgstr "Error al guardar" -#: guiminer.py:1640 +#: guiminer.py:1773 #, python-format msgid "Profiles saved OK to %s." msgstr "Los perfiles se han guardado correctamente en %s." -#: guiminer.py:1641 +#: guiminer.py:1774 msgid "Save successful" msgstr "Guardado correcto" -#: guiminer.py:1653 +#: guiminer.py:1786 #, python-format msgid "Loaded: %s" msgstr "Cargado: %s" -#: guiminer.py:1667 +#: guiminer.py:1800 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "Cargar los perfiles parará los mineros que trabajen ahora. Продолжить?" -#: guiminer.py:1668 +#: guiminer.py:1801 msgid "Load profile" msgstr "Cargar perfil" -#: guiminer.py:1697 +#: guiminer.py:1830 msgid "Select path to Bitcoin.exe" msgstr "Seleccionar ruta para Bitcoin.exe" -#: guiminer.py:1709 +#: guiminer.py:1842 msgid "About" msgstr "Acerca de" -#: guiminer.py:1735 +#: guiminer.py:1868 msgid "Closing this miner will stop it. Continue?" msgstr "Cerrar este minero lo parará. ¿Continuar?" -#: guiminer.py:1736 +#: guiminer.py:1869 msgid "Close miner" msgstr "Cerrar minero" -#: guiminer.py:1765 +#: guiminer.py:1898 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" msgstr "No se puede encontrar Bitcoin en %s. ¿La ruta es correcta?" -#: guiminer.py:1766 +#: guiminer.py:1899 msgid "Launch failed" msgstr "Fallo al iniciar" -#: guiminer.py:1769 +#: guiminer.py:1902 msgid "" "Client launched ok. You can start a miner now with the server set to 'solo'." msgstr "" "Cliente ejecutado correctamente. Ahora puedes iniciar\n" "un minero con el servidor configurado en modo 'solo'" -#: guiminer.py:1770 +#: guiminer.py:1903 msgid "Launched ok." msgstr "Ejecutado correctamente." -#: guiminer.py:1785 +#: guiminer.py:1918 #, python-format msgid "%s already exists. Overwrite?" msgstr "%s ya existe. ¿Sobreescribir?" -#: guiminer.py:1786 +#: guiminer.py:1919 msgid "bitcoin.conf already exists." msgstr "bitcoin.conf ya existe." -#: guiminer.py:1791 +#: guiminer.py:1924 msgid "Enter password" msgstr "Introducir contraseña" -#: guiminer.py:1801 +#: guiminer.py:1934 msgid "Success" msgstr "Correcto" -#: guiminer.py:1801 +#: guiminer.py:1934 msgid "Wrote bitcoin config ok." msgstr "bitcoin.conf escrito correctamente." -#: guiminer.py:1812 +#: guiminer.py:1945 msgid "Console" msgstr "Consola" -#: guiminer.py:1824 +#: guiminer.py:1957 msgid "Summary" msgstr "Sumario" -#: guiminer.py:1837 +#: guiminer.py:1970 msgid "Rename miner" msgstr "Renombrar minero" -#: guiminer.py:1837 +#: guiminer.py:1970 msgid "Rename to:" msgstr "Renombrar a:" -#: guiminer.py:1842 +#: guiminer.py:1975 msgid "Change language" msgstr "Cambiar idioma" -#: guiminer.py:1861 +#: guiminer.py:1995 msgid "Choose language (requires restart to take full effect)" msgstr "Elegir idioma (se necesita reiniciar para completar)" -#: guiminer.py:1906 +#: guiminer.py:2040 msgid "" "Click the link below to log in to the pool and get a special token. \n" "This token lets you securely check your balance.\n" @@ -675,19 +733,19 @@ msgstr "" "segura.\n" "Para guardar este código, deberás guardar la configuración de tu minero." -#: guiminer.py:1915 +#: guiminer.py:2049 msgid "(Paste token here)" msgstr "(Pegar el código aquí)" -#: guiminer.py:1941 +#: guiminer.py:2075 msgid "Copy address to clipboard" msgstr "Copiar dirección al portapapeles" -#: guiminer.py:1960 +#: guiminer.py:2094 msgid "No OpenCL devices found." msgstr "No se han encontrado dispositivos OpenCL." -#: guiminer.py:1963 +#: guiminer.py:2097 msgid "" "No OpenCL devices were found.\n" " If you only want to mine using CPU or CUDA, you can ignore this message.\n" @@ -701,7 +759,7 @@ msgstr "" "SDK del ATI Stream\n" "o tu GPU podría no aceptar OpenCL.\n" -#: guiminer.py:1973 +#: guiminer.py:2107 msgid "Don't show this message again" msgstr "No volver a mostrar este mensaje" diff --git a/guiminer_fr.po b/guiminer_fr.po new file mode 100644 index 0000000..d66c8cb --- /dev/null +++ b/guiminer_fr.po @@ -0,0 +1,783 @@ +msgid "" +msgstr "" +"Project-Id-Version: guiminer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-06-09 13:29-0300\n" +"PO-Revision-Date: 2011-05-24 18:37+0100\n" +"Last-Translator: Cramoisan Florian \n" +"Language-Team: Russian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: guiminer.py:84 +#, python-format +msgid "" +"GUIMiner\n" +"\n" +"Version: %(version)s\n" +"\n" +"GUI by Chris 'Kiv' MacLeod\n" +"Original poclbm miner by m0mchil\n" +"Original rpcminer by puddinpop\n" +"\n" +"Get the source code or file issues at GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"If you enjoyed this software, support its development\n" +"by donating to:\n" +"\n" +"%(address)s\n" +"\n" +"Even a single Bitcoin is appreciated and helps motivate\n" +"further work on this software.\n" +msgstr "" +" \n" +"\n" +" GUIMiner\n" +" \n" +" Version: %(version)s\n" +" \n" +" Interface par Chris 'Kiv' MacLeod\n" +" Miner poclbm original par m0mchil\n" +" Rrpcminer original par puddinpop\n" +" \n" +" Trouvez le code source sur GitHub:\n" +" https://github.com/Kiv/poclbm\n" +" \n" +" Si ce logiciel vous plaît aidez à son développement\n" +" en donnant à :\n" +" \n" +" %(address)s\n" +" \n" +" Chaque Bitcoin donné compte et nous motive\n" +" pour continuer le travail sur ce logiciel.\n" +" \n" +" Traduction par Florian Cramoisan. \n" +" Signalez toute erreur de traduction à florian.cramoisan@gmail.com.\n" +"\n" +"\n" + +#: guiminer.py:105 +msgid "Not started" +msgstr "Non démarré" + +#: guiminer.py:106 +msgid "Starting..." +msgstr "Démarrage..." + +#: guiminer.py:107 +msgid "Stopped" +msgstr "Arrêté" + +#: guiminer.py:108 +msgid "Paused" +msgstr "En pause" + +#: guiminer.py:109 +msgid "Start mining!" +msgstr "Commencer le minage!" + +#: guiminer.py:110 +msgid "Stop mining" +msgstr "Arrêter de miner!" + +#: guiminer.py:111 +msgid "Refresh balance" +msgstr "Raffraîchir la répartition" + +#: guiminer.py:112 +msgid "Connection error" +msgstr "Erreur de connection" + +#: guiminer.py:113 +msgid "Username:" +msgstr "Nom d'utilisateur:" + +#: guiminer.py:114 +msgid "Password:" +msgstr "Mot de passe:" + +#: guiminer.py:115 +msgid "Quit this program" +msgstr "Quitter le programme" + +#: guiminer.py:116 +msgid "Show about dialog" +msgstr "Afficher la boîte de dialogue À Propos" + +#: guiminer.py:197 +#, python-format +msgid "%.1f Ghash/s" +msgstr "%.1f Ghash/s" + +#: guiminer.py:199 +#, python-format +msgid "%.1f Mhash/s" +msgstr "%.1f Mhash/s" + +#: guiminer.py:201 +msgid "Connecting..." +msgstr "Connexion en cours..." + +#: guiminer.py:203 +#, python-format +msgid "%d khash/s" +msgstr "%d khash/s" + +#: guiminer.py:227 +#, python-format +msgid "Requesting balance: %(request)s" +msgstr "Requête de répartition : %(request)s" + +#: guiminer.py:231 +#, python-format +msgid "Server replied: %(status)s, %(data)s" +msgstr "Réponse du serveur: %(status)s, %(data)s" + +#: guiminer.py:286 +msgid "Miner" +msgstr "Miner" + +#: guiminer.py:287 +msgid "Speed" +msgstr "Vitesse" + +#: guiminer.py:288 +msgid "Accepted" +msgstr "Accepté" + +# Pas totalement sur pour stale, donc si quelqu'un a une idée... +# Je suis ouvert à toute correction vous pouvez me joindre à l'adresse florian.cramoisan@gmail.com +# Cordialement Florian Cramoisan +#: guiminer.py:289 +msgid "Stale" +msgstr "Périmé (Stale)" + +#: guiminer.py:290 +msgid "Start/Stop" +msgstr "Démarrer/Arrêter" + +#: guiminer.py:291 +msgid "Autostart" +msgstr "Démarrage auto" + +#: guiminer.py:375 +msgid "Pause all" +msgstr "Mettre tout en pause" + +#: guiminer.py:377 +msgid "Restore" +msgstr "Restaurer" + +#: guiminer.py:378 +msgid "Close" +msgstr "Fermer" + +#: guiminer.py:434 +#, python-format +msgid "Listener for \"%s\" started" +msgstr "Démarrage de l'écoute de \"%s\" " + +#: guiminer.py:449 +#, python-format +msgid "Listener for \"%(name)s\": %(line)s" +msgstr "Écouteur pour \"%(name)s\": %(line)s" + +#: guiminer.py:452 +#, python-format +msgid "Listener for \"%s\" shutting down" +msgstr "Arrêt de l'écoute de \"%s\" " + +#: guiminer.py:496 +msgid "Server:" +msgstr "Serveur:" + +#: guiminer.py:501 +msgid "Website:" +msgstr "Site Web:" + +#: guiminer.py:503 +msgid "Ext. Path:" +msgstr "Chemin :" + +#: guiminer.py:505 +msgid "Host:" +msgstr "Hôte:" + +#: guiminer.py:507 +msgid "Port:" +msgstr "Port:" + +#: guiminer.py:513 +msgid "Device:" +msgstr "Périphérique:" + +#: guiminer.py:514 +msgid "No OpenCL devices" +msgstr "Aucun périphérique OpenCL" + +#: guiminer.py:515 +msgid "Extra flags:" +msgstr "Paramètres supplémentaires:" + +#: guiminer.py:518 +msgid "Balance:" +msgstr "Répartition: " + +#: guiminer.py:522 +msgid "Withdraw" +msgstr "Se retirer" + +#: guiminer.py:667 +msgid "Default" +msgstr "Défaut" + +#: guiminer.py:714 +msgid "Start" +msgstr "Démarrer" + +#: guiminer.py:714 +msgid "Stop" +msgstr "Arrêter" + +#: guiminer.py:730 +msgid "Connection problems" +msgstr "Problème lors de la connexion" + +#: guiminer.py:889 +msgid "Running command: " +msgstr "Execution de la commande: " + +#: guiminer.py:943 +#, python-format +msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" +msgstr "Difficulté 1 hash: %(nhashes)d %(update_time)s" + +#: guiminer.py:947 +#, python-format +msgid "Blocks: %d, " +msgstr "Blocs: %d, " + +#: guiminer.py:950 +#, python-format +msgid "Shares: %d accepted" +msgstr "Partages: %d accepté" + +#: guiminer.py:952 +#, python-format +msgid ", %d stale/invalid" +msgstr ", %d est invalide" + +#: guiminer.py:974 +#, python-format +msgid "- last at %s" +msgstr "Dernière modification le %s" + +#: guiminer.py:1047 +msgid "" +"Server to connect to. Different servers have different fees and features.\n" +"Check their websites for full information." +msgstr "" +"Serveur auquel se connecter. Chaque serveur à des différentes taxes et " +"options.\n" +"Regardez leur site pour plus d'informations." + +#: guiminer.py:1048 +msgid "Website of the currently selected server. Click to visit." +msgstr "Site web du serveur selectionné. Cliquez pour le visiter" + +#: guiminer.py:1049 +msgid "Available OpenCL devices on your system." +msgstr "Périphériques OpenCL Disponibles." + +#: guiminer.py:1050 +msgid "Host address, without http:// prefix." +msgstr "Adresse de l'hôte, sans le préfixe http://." + +#: guiminer.py:1051 +msgid "Server port. This is usually 8332." +msgstr "Port du serveur. Habituellement 8332." + +#: guiminer.py:1052 +msgid "" +"The miner's username.\n" +"May be different than your account username.\n" +"Example: Kiv.GPU" +msgstr "" +"Nom d'uilisateur du miner.\n" +"Peut différer du nom d'utilisateur de votre compte.\n" +"Exemple: Kiv.GPU" + +#: guiminer.py:1053 +msgid "" +"The miner's password.\n" +"May be different than your account password." +msgstr "" +"Mot de passe du miner.\n" +"Peut différer du mot de passe de votre compte." + +#: guiminer.py:1054 +msgid "" +"Extra flags to pass to the miner.\n" +"For Radeon HD 5xxx series use -v -w128 for best results.\n" +"For other cards consult the forum." +msgstr "" +"Paramètres supplémentaires à passer au miner.\n" +"Pour les ATI Radéon HD série 5xxx utiliser -v -w128 afin d'optimiser le " +"rendement.\n" +"Pour les autres cartes, consultez le forum." + +#: guiminer.py:1148 guiminer.py:1242 guiminer.py:1263 +msgid "Auth token rejected by server." +msgstr "" + +#: guiminer.py:1166 +#, python-format +msgid "%s confirmed" +msgstr "%s confirmé" + +#: guiminer.py:1168 +#, python-format +msgid ", %s unconfirmed" +msgstr ", %s n'a pas été confirmé" + +#: guiminer.py:1170 +msgid "Bad response from server." +msgstr "Mauvaise réponse du serveur." + +#: guiminer.py:1246 guiminer.py:1267 +msgid "Withdraw OK" +msgstr "Retiré" + +#: guiminer.py:1426 +msgid "No registration is required - just enter an address and press Start." +msgstr "" +"Aucun enregistrement requis, entrez seulement une adresse et cliquez sur " +"Démarrer" + +#: guiminer.py:1428 +msgid "Address:" +msgstr "&Adresse électronique :" + +#: guiminer.py:1430 +msgid "" +"Your receiving address for Bitcoins.\n" +"E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" +msgstr "" +"Votre adresse de réception des bitcoins.\n" +"Example: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" + +#: guiminer.py:1445 +msgid "" +"Your miner username (not your account username).\n" +"Example: Kiv.GPU" +msgstr "" +"Votre nom d'utilisateur de miner (pas celui de votre compte). \n" +"Example:kiv.GPU" + +#: guiminer.py:1447 guiminer.py:1467 +msgid "Your miner password (not your account password)." +msgstr "Votre mot de passe de miner (pas celui de votre compte)." + +#: guiminer.py:1465 +msgid "" +"Your miner username. \n" +"Example: kiv123@kiv123" +msgstr "" +"Votre nom d'utilisateur de miner. \n" +"Example:kiv123@kiv123" + +#: guiminer.py:1481 +msgid "The e-mail address you registered with." +msgstr "L'adresse mail avec laquelle vous vous êtes enregistré." + +#: guiminer.py:1482 +msgid "Email:" +msgstr "Email:" + +#: guiminer.py:1497 +msgid "&Rename..." +msgstr "&Renommer..." + +#: guiminer.py:1497 +msgid "Rename this miner" +msgstr "Renommer le miner" + +#: guiminer.py:1522 +msgid "&New OpenCL miner..." +msgstr "&Nouveau miner OpenCL..." + +#: guiminer.py:1522 +msgid "Create a new OpenCL miner (default for ATI cards)" +msgstr "" + +#: guiminer.py:1523 +#, fuzzy +msgid "Create a new Phoenix miner (for some ATI cards)" +msgstr "Créer un profil avec un nouveau miner" + +#: guiminer.py:1523 +#, fuzzy +msgid "New Phoenix miner..." +msgstr "N&ouveau miner..." + +#: guiminer.py:1524 +msgid "Create a new CUDA miner (for NVIDIA cards)" +msgstr "" + +#: guiminer.py:1524 +#, fuzzy +msgid "New CUDA miner..." +msgstr "&Nouveau miner OpenCL..." + +#: guiminer.py:1525 +#, fuzzy +msgid "Create a new Ufasoft miner (for CPUs)" +msgstr "Créer un profil avec un nouveau miner" + +#: guiminer.py:1525 +#, fuzzy +msgid "New Ufasoft CPU miner..." +msgstr "N&ouveau miner..." + +#: guiminer.py:1526 +#, fuzzy +msgid "Create a new custom miner (requires external program)" +msgstr "Créer un miner CPU ou CUDA (nécessite un programme externe)" + +#: guiminer.py:1526 +msgid "New &other miner..." +msgstr "N&ouveau miner..." + +#: guiminer.py:1528 +msgid "&Save settings" +msgstr "&Sauver les paramètres" + +#: guiminer.py:1528 +msgid "Save your settings" +msgstr "Sauver vos paramètres" + +#: guiminer.py:1529 +msgid "&Load settings" +msgstr "&Charger les paramètres" + +#: guiminer.py:1529 +msgid "Load stored settings" +msgstr "Charger des paramètres enregistrés" + +#: guiminer.py:1530 +msgid "Quit" +msgstr "Quitter" + +#: guiminer.py:1531 +msgid "&File" +msgstr "&Fichier" + +#: guiminer.py:1535 +msgid "Show summary" +msgstr "Afficher le résumé" + +#: guiminer.py:1535 +msgid "Show summary of all miners" +msgstr "Afficher le résumé pour tous les miners" + +#: guiminer.py:1536 +msgid "Show console" +msgstr "Afficher la console" + +#: guiminer.py:1536 +msgid "Show console logs" +msgstr "Afficher les logs de la console" + +#: guiminer.py:1537 +msgid "&View" +msgstr "&Affichage" + +#: guiminer.py:1541 +msgid "&Create solo password..." +msgstr "&Créer un mot de passe solo..." + +#: guiminer.py:1541 +msgid "Configure a user/pass for solo mining" +msgstr "Veuillez fournir un utilisateur/mot de passe pour le mining en solo" + +#: guiminer.py:1542 +msgid "&Set Bitcoin client path..." +msgstr "&Changer le chemin vers le client Bitcoin..." + +#: guiminer.py:1542 +msgid "Set the location of the official Bitcoin client" +msgstr "Chemin du Bitcoin officiel" + +#: guiminer.py:1543 +msgid "&Launch Bitcoin client as server" +msgstr "&Lancer le client bitcoin en tant que serveur" + +#: guiminer.py:1543 +msgid "Launch the official Bitcoin client as a server for solo mining" +msgstr "Lancer le client Bitcoin officiel pour un minage solo." + +#: guiminer.py:1544 +msgid "&Solo utilities" +msgstr "&Outils solo" + +#: guiminer.py:1548 +#, fuzzy +msgid "Start &minimized" +msgstr "Commencer le minage!" + +#: guiminer.py:1548 +msgid "Start the GUI minimized to the tray." +msgstr "" + +#: guiminer.py:1550 +msgid "&Options" +msgstr "" + +#: guiminer.py:1554 +msgid "&Change language..." +msgstr "&Changer de langue..." + +#: guiminer.py:1555 +msgid "Language" +msgstr "Langue" + +#: guiminer.py:1559 +msgid "&Donate 99 cents..." +msgstr "" + +#: guiminer.py:1559 +msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" +msgstr "" + +#: guiminer.py:1560 +#, fuzzy +msgid "&Donate" +msgstr "&A propos/Faire un Don ..." + +#: guiminer.py:1563 +#, fuzzy +msgid "&About..." +msgstr "&A propos/Faire un Don ..." + +#: guiminer.py:1565 +msgid "&Help" +msgstr "&Aide" + +#: guiminer.py:1577 +msgid "Failed to load taskbar icon; continuing." +msgstr "Erreur du chargement de l'icone de notification. L'exécution continue." + +#: guiminer.py:1586 +msgid "OpenCL not found - can't add a OpenCL miner" +msgstr "Impossible de trouver OpenCL : impossible d'ajouter un miner OpenCL" + +#: guiminer.py:1623 +#, python-format +msgid "GUIMiner - v%s" +msgstr "GUIMiner - v%s" + +#: guiminer.py:1665 +msgid "Name this miner:" +msgstr "Nom du miner:" + +#: guiminer.py:1665 +msgid "New miner" +msgstr "Nouveau miner" + +#: guiminer.py:1668 +msgid "Untitled" +msgstr "Sans titre" + +#: guiminer.py:1679 +#, fuzzy +msgid "External miner (*.exe)|*.exe|(*.py)|*.py" +msgstr "Miner externe (*.exe)|*.exe" + +#: guiminer.py:1681 +msgid "Select external miner:" +msgstr "Choisissez un miner externe:" + +#: guiminer.py:1691 +#, python-format +msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" +msgstr "" +"Miner externe non supporté %(filename)s. Les miners actuellement supportés " +"sont: %(supported)s" + +#: guiminer.py:1693 +msgid "Miner not supported" +msgstr "Miner non supporté" + +#: guiminer.py:1734 +msgid "Do you want to save changes?" +msgstr "Voulez-vous sauvegarder les modifications ?" + +#: guiminer.py:1734 +msgid "Save" +msgstr "Sauvegarder" + +#: guiminer.py:1764 +msgid "Saving: " +msgstr "Sauvegarde: " + +#: guiminer.py:1770 +#, python-format +msgid "" +"Couldn't write save file %s.\n" +"Check the location is writable." +msgstr "" +"Impossible d'écrire la sauvegarde dans le fichier %s.\n" +"Vérifiez l'emplacement." + +#: guiminer.py:1771 +msgid "Save unsuccessful" +msgstr "Echec de la sauvegarde" + +#: guiminer.py:1773 +#, python-format +msgid "Profiles saved OK to %s." +msgstr "Profil sauvé vers %s." + +#: guiminer.py:1774 +msgid "Save successful" +msgstr "Sauvegarde effectuée" + +#: guiminer.py:1786 +#, python-format +msgid "Loaded: %s" +msgstr "Chargé: %s" + +#: guiminer.py:1800 +msgid "Loading profiles will stop any currently running miners. Continue?" +msgstr "Charger des profils arrêtera les miners en cours. Continuer ?" + +#: guiminer.py:1801 +msgid "Load profile" +msgstr "Charger un profil" + +#: guiminer.py:1830 +msgid "Select path to Bitcoin.exe" +msgstr "Choisir le chemin vers Bitcoin.exe" + +#: guiminer.py:1842 +msgid "About" +msgstr "&A propos" + +#: guiminer.py:1868 +msgid "Closing this miner will stop it. Continue?" +msgstr "Fermer le miner l'arrêtera. Continuer ?" + +#: guiminer.py:1869 +msgid "Close miner" +msgstr "Fermer le miner" + +#: guiminer.py:1898 +#, python-format +msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" +msgstr "" +"Impossible de trouver bitcoin au chemin %s. Vérifiez que le chemin a bien " +"été paramétré." + +#: guiminer.py:1899 +msgid "Launch failed" +msgstr "Erreur de lancement" + +#: guiminer.py:1902 +msgid "" +"Client launched ok. You can start a miner now with the server set to 'solo'." +msgstr "" +"Client lancé. Vous pouvez maintenant lancer un miner sur le serveur 'solo'." + +#: guiminer.py:1903 +msgid "Launched ok." +msgstr "Lancement réussi." + +#: guiminer.py:1918 +#, python-format +msgid "%s already exists. Overwrite?" +msgstr "%s Existe déjà. L'écraser ?" + +#: guiminer.py:1919 +msgid "bitcoin.conf already exists." +msgstr "bitcoin.conf existe déjà." + +#: guiminer.py:1924 +msgid "Enter password" +msgstr "Entrez le mot de passe" + +#: guiminer.py:1934 +msgid "Success" +msgstr "Succès" + +#: guiminer.py:1934 +msgid "Wrote bitcoin config ok." +msgstr "Écriture de la configuration bitcoin réussie." + +#: guiminer.py:1945 +msgid "Console" +msgstr "Console" + +#: guiminer.py:1957 +msgid "Summary" +msgstr "Résumé" + +#: guiminer.py:1970 +msgid "Rename miner" +msgstr "Renommer le miner" + +#: guiminer.py:1970 +msgid "Rename to:" +msgstr "Renommer :" + +#: guiminer.py:1975 +msgid "Change language" +msgstr "Changer de langue" + +#: guiminer.py:1995 +msgid "Choose language (requires restart to take full effect)" +msgstr "Choisissez une langue (Requiert un redémarrage)" + +#: guiminer.py:2040 +msgid "" +"Click the link below to log in to the pool and get a special token. \n" +"This token lets you securely check your balance.\n" +"To remember this token for the future, save your miner settings." +msgstr "" +"Cliquez sur le lien ci-dessous pour vous connecter et obtenir un jeton (API " +"token). \n" +"Ce jeton vous permettra de vérifier votre répartition de manière sécurisée.\n" +"Pour se souvenir de ce jeton, sauvegardez les paramètres." + +#: guiminer.py:2049 +msgid "(Paste token here)" +msgstr "(Coller le jeton ici)" + +#: guiminer.py:2075 +msgid "Copy address to clipboard" +msgstr "Copier l'adresse dans le presse-papier" + +#: guiminer.py:2094 +msgid "No OpenCL devices found." +msgstr "Aucun périphérique OpenCL touvé." + +#: guiminer.py:2097 +#, fuzzy +msgid "" +"No OpenCL devices were found.\n" +" If you only want to mine using CPU or CUDA, you can ignore this message.\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI " +"Stream\n" +" SDK, or your GPU may not support OpenCL." +msgstr "" +"Aucun périphérique OpenCL n'a été trouvé.\n" +" Si vous souhaitez seulement miner avec CPU ou CUDA, ignorez ce message.\n" +" Si vous souhaitez miner avec une carte ATI, vous devez installer ATI " +"Stream\n" +" SDK (2.1 de préférence), sinon il se peut que votre GPU ne supporte pas " +"OpenCL.\n" + +#: guiminer.py:2107 +msgid "Don't show this message again" +msgstr "" diff --git a/guiminer_hu.po b/guiminer_hu.po new file mode 100644 index 0000000..17a47b5 --- /dev/null +++ b/guiminer_hu.po @@ -0,0 +1,769 @@ +msgid "" +msgstr "" +"Project-Id-Version: guiminer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-06-09 13:29-0300\n" +"PO-Revision-Date: 2011-06-04 18:34+0100\n" +"Last-Translator: Underyx \n" +"Language-Team: Español\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: guiminer.py:84 +#, python-format +msgid "" +"GUIMiner\n" +"\n" +"Version: %(version)s\n" +"\n" +"GUI by Chris 'Kiv' MacLeod\n" +"Original poclbm miner by m0mchil\n" +"Original rpcminer by puddinpop\n" +"\n" +"Get the source code or file issues at GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"If you enjoyed this software, support its development\n" +"by donating to:\n" +"\n" +"%(address)s\n" +"\n" +"Even a single Bitcoin is appreciated and helps motivate\n" +"further work on this software.\n" +msgstr "" +"GUIMiner\n" +"\n" +"verzió: %(version)s\n" +"\n" +"GUI készítője: Chris 'Kiv' MacLeod\n" +"Eredeti poclbm bányászprogram készítője: m0mchil\n" +"Eredeti rpcminer bányászprogram készítője: puddinpop\n" +"\n" +"A forráskód elérhető GitHubon: https://github.com/Kiv/poclbm\n" +"\n" +"Ha hasznosnak találtad a programot, kérlek, adományozz a készítőnek:\n" +"%(address)s\n" +"\n" +"Egyetlen bitcoin is nagy motiváció a program továbbfejlesztésére.\n" + +#: guiminer.py:105 +msgid "Not started" +msgstr "Nincs elindítva" + +#: guiminer.py:106 +msgid "Starting..." +msgstr "Indítás..." + +#: guiminer.py:107 +msgid "Stopped" +msgstr "Leállítva" + +#: guiminer.py:108 +msgid "Paused" +msgstr "Leállítva" + +#: guiminer.py:109 +msgid "Start mining!" +msgstr "Bányászat indítása" + +#: guiminer.py:110 +msgid "Stop mining" +msgstr "Bányászat leállítása" + +#: guiminer.py:111 +msgid "Refresh balance" +msgstr "Egyenleg frissítése" + +#: guiminer.py:112 +msgid "Connection error" +msgstr "Kapcsolódási hiba" + +#: guiminer.py:113 +msgid "Username:" +msgstr "Felhasználónév:" + +#: guiminer.py:114 +msgid "Password:" +msgstr "Jelszó:" + +#: guiminer.py:115 +msgid "Quit this program" +msgstr "Kilépés a programból" + +#: guiminer.py:116 +msgid "Show about dialog" +msgstr "Névjegy megjelenítése..." + +#: guiminer.py:197 +#, python-format +msgid "%.1f Ghash/s" +msgstr "%.1f Ghash/s" + +#: guiminer.py:199 +#, python-format +msgid "%.1f Mhash/s" +msgstr "%.1f Mhash/s" + +#: guiminer.py:201 +msgid "Connecting..." +msgstr "Kapcsolódás..." + +#: guiminer.py:203 +#, python-format +msgid "%d khash/s" +msgstr "%d khash/s" + +#: guiminer.py:227 +#, python-format +msgid "Requesting balance: %(request)s" +msgstr "Egyenleg lekérése: %(request)s" + +#: guiminer.py:231 +#, python-format +msgid "Server replied: %(status)s, %(data)s" +msgstr "A szerver válasza: %(status)s, %(data)s" + +#: guiminer.py:286 +msgid "Miner" +msgstr "Bányász" + +#: guiminer.py:287 +msgid "Speed" +msgstr "Sebesség" + +#: guiminer.py:288 +msgid "Accepted" +msgstr "Elfogadva" + +#: guiminer.py:289 +msgid "Stale" +msgstr "Érvénytelen" + +#: guiminer.py:290 +msgid "Start/Stop" +msgstr "Indítás/Leállítás" + +#: guiminer.py:291 +msgid "Autostart" +msgstr "Automatikus indítás" + +#: guiminer.py:375 +msgid "Pause all" +msgstr "Mind leállítása" + +#: guiminer.py:377 +msgid "Restore" +msgstr "Visszaállítás" + +#: guiminer.py:378 +msgid "Close" +msgstr "Bezárás" + +#: guiminer.py:434 +#, python-format +msgid "Listener for \"%s\" started" +msgstr "\"%s\" elindult" + +#: guiminer.py:449 +#, python-format +msgid "Listener for \"%(name)s\": %(line)s" +msgstr "Üzenet - \"%(name)s\": %(line)s" + +#: guiminer.py:452 +#, python-format +msgid "Listener for \"%s\" shutting down" +msgstr "\"%s\" leállt" + +#: guiminer.py:496 +msgid "Server:" +msgstr "Szerver:" + +#: guiminer.py:501 +msgid "Website:" +msgstr "Weboldal:" + +#: guiminer.py:503 +msgid "Ext. Path:" +msgstr "Külső útvonal:" + +#: guiminer.py:505 +msgid "Host:" +msgstr "Szerver:" + +#: guiminer.py:507 +msgid "Port:" +msgstr "Port:" + +#: guiminer.py:513 +msgid "Device:" +msgstr "Eszköz:" + +#: guiminer.py:514 +msgid "No OpenCL devices" +msgstr "Nincs OpenCL eszközöd" + +#: guiminer.py:515 +msgid "Extra flags:" +msgstr "Extra beállítások:" + +#: guiminer.py:518 +msgid "Balance:" +msgstr "Egyenleg:" + +#: guiminer.py:522 +msgid "Withdraw" +msgstr "Visszavonás" + +#: guiminer.py:667 +msgid "Default" +msgstr "Alapértelmezett" + +#: guiminer.py:714 +msgid "Start" +msgstr "Indítás" + +#: guiminer.py:714 +msgid "Stop" +msgstr "Leállítás" + +#: guiminer.py:730 +msgid "Connection problems" +msgstr "Kapcsolódási problémák" + +#: guiminer.py:889 +msgid "Running command: " +msgstr "Futtatási parancs: " + +#: guiminer.py:943 +#, python-format +msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" +msgstr "Nehézség 1 hash-ek: %(nhashes)d %(update_time)s" + +#: guiminer.py:947 +#, python-format +msgid "Blocks: %d, " +msgstr "Blokkok: %d, " + +#: guiminer.py:950 +#, python-format +msgid "Shares: %d accepted" +msgstr "Részblokkok: %d elfogadva" + +#: guiminer.py:952 +#, python-format +msgid ", %d stale/invalid" +msgstr ", %d érvénytelen" + +#: guiminer.py:974 +#, python-format +msgid "- last at %s" +msgstr "- legutóbbi ekkor: %s" + +#: guiminer.py:1047 +msgid "" +"Server to connect to. Different servers have different fees and features.\n" +"Check their websites for full information." +msgstr "" +"A használandó szerver. Különböző szervereknek különböző díjaik és funkcióik " +"vannak.\n" +"További információért nézd meg a weboldalukat." + +#: guiminer.py:1048 +msgid "Website of the currently selected server. Click to visit." +msgstr "A kiválasztott szerver weboldala." + +#: guiminer.py:1049 +msgid "Available OpenCL devices on your system." +msgstr "A rendszered elérhető OpenCL eszközei." + +#: guiminer.py:1050 +msgid "Host address, without http:// prefix." +msgstr "Szerver címe, a http:// nélkül." + +#: guiminer.py:1051 +msgid "Server port. This is usually 8332." +msgstr "A szerver portja. Ez általában 8332." + +#: guiminer.py:1052 +msgid "" +"The miner's username.\n" +"May be different than your account username.\n" +"Example: Kiv.GPU" +msgstr "" +"A bányász felhasználóneve.\n" +"Lehet, hogy különbözik a fiókod felhasználónevétől.\n" +"Például: Kiv.GPU" + +#: guiminer.py:1053 +msgid "" +"The miner's password.\n" +"May be different than your account password." +msgstr "" +"A bányász jelszava.\n" +"Lehet, hogy különbözik a fiókod jelszavától.\n" + +#: guiminer.py:1054 +msgid "" +"Extra flags to pass to the miner.\n" +"For Radeon HD 5xxx series use -v -w128 for best results.\n" +"For other cards consult the forum." +msgstr "" +"A bányászprogramnak küldött extra beállítások.\n" +"Radeon HD 5xxx-es videokártyáknál használd azt, hogy -v -w128.\n" +"Más videokártyáknál nézz utána a fórumban (forum.bitcoin.org)." + +#: guiminer.py:1148 guiminer.py:1242 guiminer.py:1263 +msgid "Auth token rejected by server." +msgstr "Azonosítási kód visszautasítva a szerver által." + +#: guiminer.py:1166 +#, python-format +msgid "%s confirmed" +msgstr "%s visszaigazolt" + +#: guiminer.py:1168 +#, python-format +msgid ", %s unconfirmed" +msgstr ", %s nincs visszaigazolva" + +#: guiminer.py:1170 +msgid "Bad response from server." +msgstr "Hibás válasz a szervertől." + +#: guiminer.py:1246 guiminer.py:1267 +msgid "Withdraw OK" +msgstr "Sikeres visszavonás" + +#: guiminer.py:1426 +msgid "No registration is required - just enter an address and press Start." +msgstr "" +"Nem kell regisztrálni - csak írd be a címed és nyomj az Indítás gombra." + +#: guiminer.py:1428 +msgid "Address:" +msgstr "Cím:" + +#: guiminer.py:1430 +msgid "" +"Your receiving address for Bitcoins.\n" +"E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" +msgstr "" +"A Bitcoin címed, amire a pénz érkezzen.\n" +"Például: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" + +#: guiminer.py:1445 +msgid "" +"Your miner username (not your account username).\n" +"Example: Kiv.GPU" +msgstr "" +"A bányász felhasználóneve (nem a fiók felhasználóneve).\n" +"Például: Kiv.GPU" + +#: guiminer.py:1447 guiminer.py:1467 +msgid "Your miner password (not your account password)." +msgstr "A bányász jelszava (nem a fiók jelszava)." + +#: guiminer.py:1465 +msgid "" +"Your miner username. \n" +"Example: kiv123@kiv123" +msgstr "" +"A bányász felhasználóneve. \n" +"Például: kiv123@kiv123" + +#: guiminer.py:1481 +msgid "The e-mail address you registered with." +msgstr "Az e-mail cím, amivel regisztráltál" + +#: guiminer.py:1482 +msgid "Email:" +msgstr "E-mail cím:" + +#: guiminer.py:1497 +msgid "&Rename..." +msgstr "&Átnevezés..." + +#: guiminer.py:1497 +msgid "Rename this miner" +msgstr "Bányász átnevezése" + +#: guiminer.py:1522 +msgid "&New OpenCL miner..." +msgstr "&Új OpenCL bányász..." + +#: guiminer.py:1522 +msgid "Create a new OpenCL miner (default for ATI cards)" +msgstr "" + +#: guiminer.py:1523 +#, fuzzy +msgid "Create a new Phoenix miner (for some ATI cards)" +msgstr "Új bányászprofil" + +#: guiminer.py:1523 +#, fuzzy +msgid "New Phoenix miner..." +msgstr "Új külső bányász..." + +#: guiminer.py:1524 +msgid "Create a new CUDA miner (for NVIDIA cards)" +msgstr "" + +#: guiminer.py:1524 +#, fuzzy +msgid "New CUDA miner..." +msgstr "&Új OpenCL bányász..." + +#: guiminer.py:1525 +#, fuzzy +msgid "Create a new Ufasoft miner (for CPUs)" +msgstr "Új bányászprofil" + +#: guiminer.py:1525 +#, fuzzy +msgid "New Ufasoft CPU miner..." +msgstr "Új külső bányász..." + +#: guiminer.py:1526 +#, fuzzy +msgid "Create a new custom miner (requires external program)" +msgstr "Új CPU, vagy CUDA bányász (külső bányászprogrammal)" + +#: guiminer.py:1526 +msgid "New &other miner..." +msgstr "Új külső bányász..." + +#: guiminer.py:1528 +msgid "&Save settings" +msgstr "&Beállítások mentése" + +#: guiminer.py:1528 +msgid "Save your settings" +msgstr "Beállítások mentése" + +#: guiminer.py:1529 +msgid "&Load settings" +msgstr "&Beállítások betöltése" + +#: guiminer.py:1529 +msgid "Load stored settings" +msgstr "Elmentett beállítások betöltése" + +#: guiminer.py:1530 +msgid "Quit" +msgstr "Kilépés" + +#: guiminer.py:1531 +msgid "&File" +msgstr "&Fájl" + +#: guiminer.py:1535 +msgid "Show summary" +msgstr "Összegzés megjelenítése" + +#: guiminer.py:1535 +msgid "Show summary of all miners" +msgstr "Minden bányász összegsésének megjelenítése" + +#: guiminer.py:1536 +msgid "Show console" +msgstr "Konzol megjelenítése..." + +#: guiminer.py:1536 +msgid "Show console logs" +msgstr "Konzolnaplók megjelenítése..." + +#: guiminer.py:1537 +msgid "&View" +msgstr "&Nézet" + +#: guiminer.py:1541 +msgid "&Create solo password..." +msgstr "&Szóló jelszó készítése..." + +#: guiminer.py:1541 +msgid "Configure a user/pass for solo mining" +msgstr "Felhasználónév és jelszó beállítása szóló bányászathoz" + +#: guiminer.py:1542 +msgid "&Set Bitcoin client path..." +msgstr "&Bitcoin kliens helyének megadása..." + +#: guiminer.py:1542 +msgid "Set the location of the official Bitcoin client" +msgstr "Add meg a hivatalos Bitcoin kliens helyét" + +#: guiminer.py:1543 +msgid "&Launch Bitcoin client as server" +msgstr "&Bitcoin kliens indítása szerverként" + +#: guiminer.py:1543 +msgid "Launch the official Bitcoin client as a server for solo mining" +msgstr "" +"Szóló bányászathoz indítsd el a hivatalos Bitcoin bányászprogramot " +"szerverként" + +#: guiminer.py:1544 +msgid "&Solo utilities" +msgstr "&Szóló eszközök" + +#: guiminer.py:1548 +#, fuzzy +msgid "Start &minimized" +msgstr "Bányászat indítása" + +#: guiminer.py:1548 +msgid "Start the GUI minimized to the tray." +msgstr "" + +#: guiminer.py:1550 +msgid "&Options" +msgstr "" + +#: guiminer.py:1554 +msgid "&Change language..." +msgstr "&Nyelv változtatása..." + +#: guiminer.py:1555 +msgid "Language" +msgstr "Nyelv" + +#: guiminer.py:1559 +msgid "&Donate 99 cents..." +msgstr "" + +#: guiminer.py:1559 +msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" +msgstr "" + +#: guiminer.py:1560 +#, fuzzy +msgid "&Donate" +msgstr "&Névjegy/Adományok..." + +#: guiminer.py:1563 +#, fuzzy +msgid "&About..." +msgstr "&Névjegy/Adományok..." + +#: guiminer.py:1565 +msgid "&Help" +msgstr "&Segítség" + +#: guiminer.py:1577 +msgid "Failed to load taskbar icon; continuing." +msgstr "Tálcaikon betöltése sikertelen; folytatás..." + +#: guiminer.py:1586 +msgid "OpenCL not found - can't add a OpenCL miner" +msgstr "Az OpenCL nem található - nem lehet OpenCL bányászt indítani" + +#: guiminer.py:1623 +#, python-format +msgid "GUIMiner - v%s" +msgstr "GUIMiner - v%s" + +#: guiminer.py:1665 +msgid "Name this miner:" +msgstr "Bányász neve:" + +#: guiminer.py:1665 +msgid "New miner" +msgstr "Új bányász" + +#: guiminer.py:1668 +msgid "Untitled" +msgstr "Névtelen" + +#: guiminer.py:1679 +#, fuzzy +msgid "External miner (*.exe)|*.exe|(*.py)|*.py" +msgstr "Külső bányászprogram (*.exe)|*.exe" + +#: guiminer.py:1681 +msgid "Select external miner:" +msgstr "Válaszd ki a külső bányászprogramot:" + +#: guiminer.py:1691 +#, fuzzy, python-format +msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" +msgstr "" +"A külső bányászprogram (%(filename)s) nem támogatott. A következőket " +"használhatod: %(supported)" + +#: guiminer.py:1693 +msgid "Miner not supported" +msgstr "A bányászprogram nem támogatott" + +#: guiminer.py:1734 +msgid "Do you want to save changes?" +msgstr "Elmented a változtatásokat?" + +#: guiminer.py:1734 +msgid "Save" +msgstr "Mentés" + +#: guiminer.py:1764 +msgid "Saving: " +msgstr "Mentés:" + +#: guiminer.py:1770 +#, python-format +msgid "" +"Couldn't write save file %s.\n" +"Check the location is writable." +msgstr "" +"Nem sikerült ide menteni: %s.\n" +"Ellenőrizd le hogy írható-e a mappa!" + +#: guiminer.py:1771 +msgid "Save unsuccessful" +msgstr "Sikertelen mentés" + +#: guiminer.py:1773 +#, python-format +msgid "Profiles saved OK to %s." +msgstr "Profil sikeresen elmentve ide: %s." + +#: guiminer.py:1774 +msgid "Save successful" +msgstr "Sikeres mentés" + +#: guiminer.py:1786 +#, python-format +msgid "Loaded: %s" +msgstr "Betöltve: %s" + +#: guiminer.py:1800 +msgid "Loading profiles will stop any currently running miners. Continue?" +msgstr "" +"Egy profil betöltése le fogja állítani a jelenleg futó bányászokat. Biztos " +"ezt akarod?" + +#: guiminer.py:1801 +msgid "Load profile" +msgstr "Profil betöltve" + +#: guiminer.py:1830 +msgid "Select path to Bitcoin.exe" +msgstr "Válaszd ki a Bitcoin.exe programfájlt" + +#: guiminer.py:1842 +msgid "About" +msgstr "Névjegy" + +#: guiminer.py:1868 +msgid "Closing this miner will stop it. Continue?" +msgstr "A bányász bezárásával leállítod azt. Biztos bezárod?" + +#: guiminer.py:1869 +msgid "Close miner" +msgstr "Bányász bezárása" + +#: guiminer.py:1898 +#, python-format +msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" +msgstr "A Bitcoin nem található itt: %s. Biztos ez a helyes útvonal?" + +#: guiminer.py:1899 +msgid "Launch failed" +msgstr "Indítás sikertelen" + +#: guiminer.py:1902 +msgid "" +"Client launched ok. You can start a miner now with the server set to 'solo'." +msgstr "" +"A kliens sikeresen elindult. Most már elkezdhetsz bányászni úgy, hogy a " +"szerver \"Szóló\"-ra van állítva." + +#: guiminer.py:1903 +msgid "Launched ok." +msgstr "Sikeres indítás" + +#: guiminer.py:1918 +#, python-format +msgid "%s already exists. Overwrite?" +msgstr "%s már létezik. Felülírja?" + +#: guiminer.py:1919 +msgid "bitcoin.conf already exists." +msgstr "A bitcoin.conf fájl már létezik." + +#: guiminer.py:1924 +msgid "Enter password" +msgstr "Írd be a jelszavad" + +#: guiminer.py:1934 +msgid "Success" +msgstr "Sikerült" + +#: guiminer.py:1934 +msgid "Wrote bitcoin config ok." +msgstr "Bitcoin konfiguráció sikeresen megírva." + +#: guiminer.py:1945 +msgid "Console" +msgstr "Konzol" + +#: guiminer.py:1957 +msgid "Summary" +msgstr "Összegzés" + +#: guiminer.py:1970 +msgid "Rename miner" +msgstr "Bányász átnevezése" + +#: guiminer.py:1970 +msgid "Rename to:" +msgstr "Átnevezés erre:" + +#: guiminer.py:1975 +msgid "Change language" +msgstr "Nyelv változtatása" + +#: guiminer.py:1995 +msgid "Choose language (requires restart to take full effect)" +msgstr "Válassz nyelvet (a beállítás a program újraindításakor lép érvénybe)" + +#: guiminer.py:2040 +msgid "" +"Click the link below to log in to the pool and get a special token. \n" +"This token lets you securely check your balance.\n" +"To remember this token for the future, save your miner settings." +msgstr "" +"Kattints a lenti linkre hogy a bányászcsapat oldalán kapj egy kódot.\n" +"Ez a kód fogja lehetővé tenni, hogy a program lekérdezhesse az egyenleged.\n" +"Mentsd el a program beállításait majd, hogy ne kelljen később újra beírnod a " +"kódot." + +#: guiminer.py:2049 +msgid "(Paste token here)" +msgstr "(Írd be ide a kódot)" + +#: guiminer.py:2075 +msgid "Copy address to clipboard" +msgstr "Cím másolása vágólapra" + +#: guiminer.py:2094 +msgid "No OpenCL devices found." +msgstr "Nem található OpenCL eszköz." + +#: guiminer.py:2097 +msgid "" +"No OpenCL devices were found.\n" +" If you only want to mine using CPU or CUDA, you can ignore this message.\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI " +"Stream\n" +" SDK, or your GPU may not support OpenCL." +msgstr "" +"Nem található OpenCL eszköz.\n" +"Ha csak CPU-val vagy CUDA-val akarsz bányászni, hagyd figyelmen kívül ezt az " +"üzenetet.\n" +"Ha ATI videokártyával akarsz bányászni, lehet, hogy fel kell telepítened az " +"ATI Stream SDK-t,\n" +"vagy pedig a videokártyád nem támogatja az OpenCL-t.\n" + +#: guiminer.py:2107 +msgid "Don't show this message again" +msgstr "Ne mutasd ezt többször" diff --git a/guiminer_ru.po b/guiminer_ru.po index b5613e4..a13a5b0 100644 --- a/guiminer_ru.po +++ b/guiminer_ru.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-20 23:09-0300\n" +"POT-Creation-Date: 2011-06-09 13:29-0300\n" "PO-Revision-Date: 2011-04-20 19:55-0400\n" "Last-Translator: Chris MacLeod \n" "Language-Team: Russian\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: guiminer.py:75 +#: guiminer.py:84 #, python-format msgid "" "GUIMiner\n" @@ -51,220 +51,220 @@ msgstr "" "Даже один Биткоин полезен и помогает мотивировать\n" "дальнейшую работу над этой программой.\n" -#: guiminer.py:96 +#: guiminer.py:105 msgid "Not started" msgstr "Не запущен" -#: guiminer.py:97 +#: guiminer.py:106 msgid "Starting..." msgstr "Запускается..." -#: guiminer.py:98 +#: guiminer.py:107 msgid "Stopped" msgstr "Остановлен" -#: guiminer.py:99 +#: guiminer.py:108 msgid "Paused" msgstr "Пауза" -#: guiminer.py:100 +#: guiminer.py:109 msgid "Start mining!" msgstr "Старт!" -#: guiminer.py:101 +#: guiminer.py:110 msgid "Stop mining" msgstr "Стоп!" -#: guiminer.py:102 +#: guiminer.py:111 msgid "Refresh balance" msgstr "Проверить баланс" -#: guiminer.py:103 +#: guiminer.py:112 msgid "Connection error" msgstr "Ошибка связи" -#: guiminer.py:104 +#: guiminer.py:113 msgid "Username:" msgstr "Логин:" -#: guiminer.py:105 +#: guiminer.py:114 msgid "Password:" msgstr "Пароль:" -#: guiminer.py:106 +#: guiminer.py:115 msgid "Quit this program" msgstr "Выход из программы" -#: guiminer.py:107 +#: guiminer.py:116 msgid "Show about dialog" msgstr "Показать информацию о программе" -#: guiminer.py:182 +#: guiminer.py:197 #, python-format msgid "%.1f Ghash/s" msgstr "%.1f Ghash/s" -#: guiminer.py:184 +#: guiminer.py:199 #, python-format msgid "%.1f Mhash/s" msgstr "%.1f Mhash/s" -#: guiminer.py:186 +#: guiminer.py:201 msgid "Connecting..." msgstr "Соединяемся..." -#: guiminer.py:188 +#: guiminer.py:203 #, python-format msgid "%d khash/s" msgstr "%d khash/s" -#: guiminer.py:212 +#: guiminer.py:227 #, python-format msgid "Requesting balance: %(request)s" msgstr "Запрашивается баланс: %(request)s" -#: guiminer.py:216 +#: guiminer.py:231 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "Ответ сервера: %(status)s, %(data)s" -#: guiminer.py:267 +#: guiminer.py:286 msgid "Miner" msgstr "Генератор" -#: guiminer.py:268 +#: guiminer.py:287 msgid "Speed" msgstr "Скорость" -#: guiminer.py:269 +#: guiminer.py:288 msgid "Accepted" msgstr "Принято" -#: guiminer.py:270 +#: guiminer.py:289 msgid "Stale" msgstr "Сбой" -#: guiminer.py:271 +#: guiminer.py:290 msgid "Start/Stop" msgstr "Старт/Стоп" -#: guiminer.py:272 +#: guiminer.py:291 msgid "Autostart" msgstr "Автостарт" -#: guiminer.py:356 +#: guiminer.py:375 msgid "Pause all" msgstr "Приостановить все" -#: guiminer.py:358 +#: guiminer.py:377 msgid "Restore" msgstr "Восстановить" -#: guiminer.py:359 +#: guiminer.py:378 msgid "Close" msgstr "Закрыть" -#: guiminer.py:413 +#: guiminer.py:434 #, python-format msgid "Listener for \"%s\" started" msgstr "Прослушивание \"%s\" начато" -#: guiminer.py:428 +#: guiminer.py:449 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "Прослушивание \"%(name)s\": %(line)s" -#: guiminer.py:431 +#: guiminer.py:452 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "Прослушивание \"%s\" завершается" -#: guiminer.py:462 +#: guiminer.py:496 msgid "Server:" msgstr "Сервер:" -#: guiminer.py:467 +#: guiminer.py:501 msgid "Website:" msgstr "Вэбсайт:" -#: guiminer.py:469 +#: guiminer.py:503 msgid "Ext. Path:" msgstr "Вншн. путь:" -#: guiminer.py:471 +#: guiminer.py:505 msgid "Host:" msgstr "Хост:" -#: guiminer.py:473 +#: guiminer.py:507 msgid "Port:" msgstr "Порт:" -#: guiminer.py:479 +#: guiminer.py:513 msgid "Device:" msgstr "Устройство:" -#: guiminer.py:480 +#: guiminer.py:514 msgid "No OpenCL devices" msgstr "Нет OpenCL устройств" -#: guiminer.py:481 +#: guiminer.py:515 msgid "Extra flags:" msgstr "Доп. параметры:" -#: guiminer.py:484 +#: guiminer.py:518 msgid "Balance:" msgstr "Баланс:" -#: guiminer.py:488 +#: guiminer.py:522 msgid "Withdraw" msgstr "Снять деньги" -#: guiminer.py:603 +#: guiminer.py:667 msgid "Default" msgstr "По умолчанию" -#: guiminer.py:650 +#: guiminer.py:714 msgid "Start" msgstr "Старт" -#: guiminer.py:650 +#: guiminer.py:714 msgid "Stop" msgstr "Стоп" -#: guiminer.py:666 +#: guiminer.py:730 msgid "Connection problems" msgstr "Сбой связи" -#: guiminer.py:801 +#: guiminer.py:889 msgid "Running command: " msgstr "Выполняется команда: " -#: guiminer.py:853 +#: guiminer.py:943 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "Хэши сложности 1: %(nhashes)d %(update_time)s" -#: guiminer.py:857 +#: guiminer.py:947 #, python-format msgid "Blocks: %d, " msgstr "Блоки: %d, " -#: guiminer.py:860 +#: guiminer.py:950 #, python-format msgid "Shares: %d accepted" msgstr "Доли: %d приняты" -#: guiminer.py:862 +#: guiminer.py:952 #, python-format msgid ", %d stale/invalid" msgstr ", %d дубли/сбойные" -#: guiminer.py:884 +#: guiminer.py:974 #, python-format msgid "- last at %s" msgstr "- последняя в %s" -#: guiminer.py:957 +#: guiminer.py:1047 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." @@ -273,23 +273,23 @@ msgstr "" "процент.\n" "Подробней смотрите на их сайтах." -#: guiminer.py:958 +#: guiminer.py:1048 msgid "Website of the currently selected server. Click to visit." msgstr "Вэбсайт выбранного сервера. Нажмите чтобы открыть." -#: guiminer.py:959 +#: guiminer.py:1049 msgid "Available OpenCL devices on your system." msgstr "OpenCL устройства, доступные на вашей системе." -#: guiminer.py:960 +#: guiminer.py:1050 msgid "Host address, without http:// prefix." msgstr "Адрес Хоста, без http:// префикса." -#: guiminer.py:961 +#: guiminer.py:1051 msgid "Server port. This is usually 8332." msgstr "Порт сервера. Обычно 8332." -#: guiminer.py:962 +#: guiminer.py:1052 msgid "" "The miner's username.\n" "May be different than your account username.\n" @@ -299,7 +299,7 @@ msgstr "" "Может отличаться от логина вашего аккаунта.\n" "Пример: Kiv.GPU" -#: guiminer.py:963 +#: guiminer.py:1053 msgid "" "The miner's password.\n" "May be different than your account password." @@ -307,7 +307,7 @@ msgstr "" "Пароль генератора (miner password).\n" "Может отличаться от пароля вашего аккаунта." -#: guiminer.py:964 +#: guiminer.py:1054 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" @@ -317,37 +317,37 @@ msgstr "" "Для лучших результатов на Радеонах HD 5xxx серий, используйте -v -w128.\n" "По поводу других видеокарт - проверьте форум." -#: guiminer.py:1058 guiminer.py:1148 guiminer.py:1169 +#: guiminer.py:1148 guiminer.py:1242 guiminer.py:1263 msgid "Auth token rejected by server." msgstr "Код авторизации не принят сервером" -#: guiminer.py:1076 +#: guiminer.py:1166 #, python-format msgid "%s confirmed" msgstr "%s подтверждено" -#: guiminer.py:1078 +#: guiminer.py:1168 #, python-format msgid ", %s unconfirmed" msgstr ", %s не подтверждено" -#: guiminer.py:1080 +#: guiminer.py:1170 msgid "Bad response from server." msgstr "Неправильный ответ сервера." -#: guiminer.py:1152 guiminer.py:1173 +#: guiminer.py:1246 guiminer.py:1267 msgid "Withdraw OK" msgstr "Выплата произведена" -#: guiminer.py:1332 +#: guiminer.py:1426 msgid "No registration is required - just enter an address and press Start." msgstr "Регистрации не требуется - введите ваш адрес и нажмите Старт." -#: guiminer.py:1334 +#: guiminer.py:1428 msgid "Address:" msgstr "Адрес:" -#: guiminer.py:1336 +#: guiminer.py:1430 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" @@ -355,7 +355,7 @@ msgstr "" "Ваш счет для получения Биткоинов.\n" "Пример: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" -#: guiminer.py:1351 +#: guiminer.py:1445 msgid "" "Your miner username (not your account username).\n" "Example: Kiv.GPU" @@ -363,11 +363,11 @@ msgstr "" "Логин генератора (miner username), может отличаться от логина аккаунта.\n" "Пример: Kiv.GPU" -#: guiminer.py:1353 guiminer.py:1373 +#: guiminer.py:1447 guiminer.py:1467 msgid "Your miner password (not your account password)." msgstr "Пароль генератора, может отличаться от пароля аккаунта ." -#: guiminer.py:1371 +#: guiminer.py:1465 msgid "" "Your miner username. \n" "Example: kiv123@kiv123" @@ -375,185 +375,243 @@ msgstr "" "Логин генератора. \n" "Например: kiv123@kiv123" -#: guiminer.py:1387 +#: guiminer.py:1481 msgid "The e-mail address you registered with." msgstr "Эл. почта под которой вы зарегистрировались." -#: guiminer.py:1388 +#: guiminer.py:1482 msgid "Email:" msgstr "Эмэйл:" -#: guiminer.py:1403 +#: guiminer.py:1497 msgid "&Rename..." msgstr "&Переименовать..." -#: guiminer.py:1403 +#: guiminer.py:1497 msgid "Rename this miner" msgstr "Переименовать этот генератор" -#: guiminer.py:1427 +#: guiminer.py:1522 msgid "&New OpenCL miner..." msgstr "&Создать OpenCL генератор..." -#: guiminer.py:1427 -msgid "Create a new miner profile" +#: guiminer.py:1522 +msgid "Create a new OpenCL miner (default for ATI cards)" +msgstr "" + +#: guiminer.py:1523 +#, fuzzy +msgid "Create a new Phoenix miner (for some ATI cards)" msgstr "Создать новый профиль генератора" -#: guiminer.py:1428 -msgid "Create a CPU or CUDA miner (requires external program)" +#: guiminer.py:1523 +#, fuzzy +msgid "New Phoenix miner..." +msgstr "Создать &другой генератор..." + +#: guiminer.py:1524 +msgid "Create a new CUDA miner (for NVIDIA cards)" +msgstr "" + +#: guiminer.py:1524 +#, fuzzy +msgid "New CUDA miner..." +msgstr "&Создать OpenCL генератор..." + +#: guiminer.py:1525 +#, fuzzy +msgid "Create a new Ufasoft miner (for CPUs)" +msgstr "Создать новый профиль генератора" + +#: guiminer.py:1525 +#, fuzzy +msgid "New Ufasoft CPU miner..." +msgstr "Создать &другой генератор..." + +#: guiminer.py:1526 +#, fuzzy +msgid "Create a new custom miner (requires external program)" msgstr "Создать CPU или CUDA генератор (требуется дополнительный софт)" -#: guiminer.py:1428 +#: guiminer.py:1526 msgid "New &other miner..." msgstr "Создать &другой генератор..." -#: guiminer.py:1429 +#: guiminer.py:1528 msgid "&Save settings" msgstr "&Сохранить настройки" -#: guiminer.py:1429 +#: guiminer.py:1528 msgid "Save your settings" msgstr "Сохранить текущие настройки генераторов" -#: guiminer.py:1430 +#: guiminer.py:1529 msgid "&Load settings" msgstr "&Загрузить настройки" -#: guiminer.py:1430 +#: guiminer.py:1529 msgid "Load stored settings" msgstr "Загрузить сохраненные настройки генераторов" -#: guiminer.py:1431 +#: guiminer.py:1530 msgid "Quit" msgstr "Выход" -#: guiminer.py:1432 +#: guiminer.py:1531 msgid "&File" msgstr "&Файл" -#: guiminer.py:1436 +#: guiminer.py:1535 msgid "Show summary" msgstr "Показать итоги" -#: guiminer.py:1436 +#: guiminer.py:1535 msgid "Show summary of all miners" msgstr "Показать таблицу со всеми генераторами" -#: guiminer.py:1437 +#: guiminer.py:1536 msgid "Show console" msgstr "Показать консоль" -#: guiminer.py:1437 +#: guiminer.py:1536 msgid "Show console logs" msgstr "Показать лог консоли" -#: guiminer.py:1438 +#: guiminer.py:1537 msgid "&View" msgstr "&Вид" -#: guiminer.py:1442 +#: guiminer.py:1541 msgid "&Create solo password..." msgstr "&Создать соло пароль..." -#: guiminer.py:1442 +#: guiminer.py:1541 msgid "Configure a user/pass for solo mining" msgstr "Настроить логин/пароль для генерирования в одиночку (без пула)" -#: guiminer.py:1443 +#: guiminer.py:1542 msgid "&Set Bitcoin client path..." msgstr "&Путь к клиенту Bitcoin..." -#: guiminer.py:1443 +#: guiminer.py:1542 msgid "Set the location of the official Bitcoin client" msgstr "Указать путь к официальному клиенту Bitcoin." -#: guiminer.py:1444 +#: guiminer.py:1543 msgid "&Launch Bitcoin client as server" msgstr "&Запустить Bitcoin клиент как сервер" -#: guiminer.py:1444 +#: guiminer.py:1543 msgid "Launch the official Bitcoin client as a server for solo mining" msgstr "" "Запустить официальный Bitcoin клиент в режиме сервера для одиночного " "генерирования" -#: guiminer.py:1445 +#: guiminer.py:1544 msgid "&Solo utilities" msgstr "&Соло режим" -#: guiminer.py:1449 +#: guiminer.py:1548 +#, fuzzy +msgid "Start &minimized" +msgstr "Старт!" + +#: guiminer.py:1548 +msgid "Start the GUI minimized to the tray." +msgstr "" + +#: guiminer.py:1550 +msgid "&Options" +msgstr "" + +#: guiminer.py:1554 msgid "&Change language..." msgstr "Изменить язык..." -#: guiminer.py:1450 +#: guiminer.py:1555 msgid "Language" msgstr "Язык" -#: guiminer.py:1453 -msgid "&About/Donate..." +#: guiminer.py:1559 +msgid "&Donate 99 cents..." +msgstr "" + +#: guiminer.py:1559 +msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" +msgstr "" + +#: guiminer.py:1560 +#, fuzzy +msgid "&Donate" +msgstr "&О программе/Помочь..." + +#: guiminer.py:1563 +#, fuzzy +msgid "&About..." msgstr "&О программе/Помочь..." -#: guiminer.py:1455 +#: guiminer.py:1565 msgid "&Help" msgstr "&Помощь" -#: guiminer.py:1467 +#: guiminer.py:1577 msgid "Failed to load taskbar icon; continuing." msgstr "Не удалось загрузить иконку таскбара; продолжаю...." -#: guiminer.py:1476 +#: guiminer.py:1586 msgid "OpenCL not found - can't add a OpenCL miner" msgstr "OpenCL не обнаружен - нельзя добавить OpenCL генератор" -#: guiminer.py:1506 +#: guiminer.py:1623 #, python-format msgid "GUIMiner - v%s" msgstr "GUIMiner - v%s" -#: guiminer.py:1548 +#: guiminer.py:1665 msgid "Name this miner:" msgstr "Назовите генератор:" -#: guiminer.py:1548 +#: guiminer.py:1665 msgid "New miner" msgstr "Новый генератор" -#: guiminer.py:1551 +#: guiminer.py:1668 msgid "Untitled" msgstr "Без имени" -#: guiminer.py:1562 -msgid "External miner (*.exe)|*.exe" +#: guiminer.py:1679 +#, fuzzy +msgid "External miner (*.exe)|*.exe|(*.py)|*.py" msgstr "Внешний генератор (*.exe)|*.exe" -#: guiminer.py:1564 +#: guiminer.py:1681 msgid "Select external miner:" msgstr "Выберите внешний генератор:" -#: guiminer.py:1574 +#: guiminer.py:1691 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" msgstr "" "Неподдерживаемый внешний генератор %(filename)s. Поддерживаемые: %(supported)" "s" -#: guiminer.py:1576 +#: guiminer.py:1693 msgid "Miner not supported" msgstr "Генератор не поддерживается" -#: guiminer.py:1602 +#: guiminer.py:1734 msgid "Do you want to save changes?" msgstr "Сохранить настройки?" -#: guiminer.py:1602 +#: guiminer.py:1734 msgid "Save" msgstr "Сохранить" -#: guiminer.py:1631 +#: guiminer.py:1764 msgid "Saving: " msgstr "Сохранение: " -#: guiminer.py:1637 +#: guiminer.py:1770 #, python-format msgid "" "Couldn't write save file %s.\n" @@ -562,114 +620,114 @@ msgstr "" "Не могу записать файл %s.\n" "Проверьте, не указан ли для целевой папки параметр \"только для чтения" -#: guiminer.py:1638 +#: guiminer.py:1771 msgid "Save unsuccessful" msgstr "Сохранение не удалось" -#: guiminer.py:1640 +#: guiminer.py:1773 #, python-format msgid "Profiles saved OK to %s." msgstr "Профили успешно сохранены в %s." -#: guiminer.py:1641 +#: guiminer.py:1774 msgid "Save successful" msgstr "Сохранение успешно" -#: guiminer.py:1653 +#: guiminer.py:1786 #, python-format msgid "Loaded: %s" msgstr "Загружено: %s" -#: guiminer.py:1667 +#: guiminer.py:1800 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "Загрузка настроек остановит все текущие генераторы. Продолжить?" -#: guiminer.py:1668 +#: guiminer.py:1801 msgid "Load profile" msgstr "Загрузить настройки" -#: guiminer.py:1697 +#: guiminer.py:1830 msgid "Select path to Bitcoin.exe" msgstr "Указать расположение Bitcoin.exe" -#: guiminer.py:1709 +#: guiminer.py:1842 msgid "About" msgstr "О программе" -#: guiminer.py:1735 +#: guiminer.py:1868 msgid "Closing this miner will stop it. Continue?" msgstr "Закрытие генератора остановит его. Продолжить?" -#: guiminer.py:1736 +#: guiminer.py:1869 msgid "Close miner" msgstr "Закрыть генератор" -#: guiminer.py:1765 +#: guiminer.py:1898 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" msgstr "Не могу найти Bitcoin в %s. Путь указан правильно?" -#: guiminer.py:1766 +#: guiminer.py:1899 msgid "Launch failed" msgstr "Сбой запуска" -#: guiminer.py:1769 +#: guiminer.py:1902 msgid "" "Client launched ok. You can start a miner now with the server set to 'solo'." msgstr "" "Клиент успешно запущен. Можно запустить генератор с указанием на \"Соло\" " "сервер." -#: guiminer.py:1770 +#: guiminer.py:1903 msgid "Launched ok." msgstr "Успешно запущено." -#: guiminer.py:1785 +#: guiminer.py:1918 #, python-format msgid "%s already exists. Overwrite?" msgstr "%s Уже существует. Перезаписать?" -#: guiminer.py:1786 +#: guiminer.py:1919 msgid "bitcoin.conf already exists." msgstr "bitcoin.conf уже существует." -#: guiminer.py:1791 +#: guiminer.py:1924 msgid "Enter password" msgstr "Введите пароль" -#: guiminer.py:1801 +#: guiminer.py:1934 msgid "Success" msgstr "Успешно" -#: guiminer.py:1801 +#: guiminer.py:1934 msgid "Wrote bitcoin config ok." msgstr "bitcoin.conf успешно записан." -#: guiminer.py:1812 +#: guiminer.py:1945 msgid "Console" msgstr "Консоль" -#: guiminer.py:1824 +#: guiminer.py:1957 msgid "Summary" msgstr "Итог" -#: guiminer.py:1837 +#: guiminer.py:1970 msgid "Rename miner" msgstr "Переименовать генератор" -#: guiminer.py:1837 +#: guiminer.py:1970 msgid "Rename to:" msgstr "Переименовать в:" -#: guiminer.py:1842 +#: guiminer.py:1975 msgid "Change language" msgstr "Изменить язык" -#: guiminer.py:1861 +#: guiminer.py:1995 msgid "Choose language (requires restart to take full effect)" msgstr "Выбрать другой язык (требуется перезапуск программы)" -#: guiminer.py:1906 +#: guiminer.py:2040 msgid "" "Click the link below to log in to the pool and get a special token. \n" "This token lets you securely check your balance.\n" @@ -680,19 +738,19 @@ msgstr "" "Этот код позволяет проверять состояние баланса.\n" "При сохранении настроек, код сохраняется." -#: guiminer.py:1915 +#: guiminer.py:2049 msgid "(Paste token here)" msgstr "(Копируйте код сюда)" -#: guiminer.py:1941 +#: guiminer.py:2075 msgid "Copy address to clipboard" msgstr "Копировать адрес в буфер обмена" -#: guiminer.py:1960 +#: guiminer.py:2094 msgid "No OpenCL devices found." msgstr "Не обнаружено OpenCL устройств." -#: guiminer.py:1963 +#: guiminer.py:2097 msgid "" "No OpenCL devices were found.\n" " If you only want to mine using CPU or CUDA, you can ignore this message.\n" @@ -706,7 +764,7 @@ msgstr "" "Если вы хотите генерировать на видеокартах ATI, нужно установить ATI Stream\n" "SDK. Или возможно, ваша карта не поддерживает OpenCL.\n" -#: guiminer.py:1973 +#: guiminer.py:2107 msgid "Don't show this message again" msgstr "Больше не показывать это сообщение." diff --git a/guiminer_zh.po b/guiminer_zh.po index bf7ceca..39eebd3 100644 --- a/guiminer_zh.po +++ b/guiminer_zh.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-20 23:09-0300\n" +"POT-Creation-Date: 2011-06-09 13:29-0300\n" "PO-Revision-Date: \n" "Last-Translator: Dean Lee \n" "Language-Team: Chinese Simp \n" @@ -12,7 +12,7 @@ msgstr "" "X-Poedit-Basepath: /\n" "X-Poedit-Language: Chinese\n" -#: guiminer.py:75 +#: guiminer.py:84 #, python-format msgid "" "GUIMiner\n" @@ -53,220 +53,220 @@ msgstr "" "每一分 Bitcoin 都欢迎,\n" "它们将推动本软件的进一步开发。\n" -#: guiminer.py:96 +#: guiminer.py:105 msgid "Not started" msgstr "未启动" -#: guiminer.py:97 +#: guiminer.py:106 msgid "Starting..." msgstr "正在启动..." -#: guiminer.py:98 +#: guiminer.py:107 msgid "Stopped" msgstr "已停止" -#: guiminer.py:99 +#: guiminer.py:108 msgid "Paused" msgstr "已暂停" -#: guiminer.py:100 +#: guiminer.py:109 msgid "Start mining!" msgstr "开始采矿!" -#: guiminer.py:101 +#: guiminer.py:110 msgid "Stop mining" msgstr "停止采矿" -#: guiminer.py:102 +#: guiminer.py:111 msgid "Refresh balance" msgstr "刷新余额" -#: guiminer.py:103 +#: guiminer.py:112 msgid "Connection error" msgstr "连接错误" -#: guiminer.py:104 +#: guiminer.py:113 msgid "Username:" msgstr "用户名:" -#: guiminer.py:105 +#: guiminer.py:114 msgid "Password:" msgstr "密码:" -#: guiminer.py:106 +#: guiminer.py:115 msgid "Quit this program" msgstr "退出本程序" -#: guiminer.py:107 +#: guiminer.py:116 msgid "Show about dialog" msgstr "显示关于窗口" -#: guiminer.py:182 +#: guiminer.py:197 #, python-format msgid "%.1f Ghash/s" msgstr "%.1f Ghash/s" -#: guiminer.py:184 +#: guiminer.py:199 #, python-format msgid "%.1f Mhash/s" msgstr "%.1f Mhash/s" -#: guiminer.py:186 +#: guiminer.py:201 msgid "Connecting..." msgstr "正在连接..." -#: guiminer.py:188 +#: guiminer.py:203 #, python-format msgid "%d khash/s" msgstr "%d khash/s" -#: guiminer.py:212 +#: guiminer.py:227 #, python-format msgid "Requesting balance: %(request)s" msgstr "正在请求余额: %(request)s" -#: guiminer.py:216 +#: guiminer.py:231 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "服务器回复: %(status)s, %(data)s" -#: guiminer.py:267 +#: guiminer.py:286 msgid "Miner" msgstr "采矿器" -#: guiminer.py:268 +#: guiminer.py:287 msgid "Speed" msgstr "速度" -#: guiminer.py:269 +#: guiminer.py:288 msgid "Accepted" msgstr "已接受" -#: guiminer.py:270 +#: guiminer.py:289 msgid "Stale" msgstr "过时" -#: guiminer.py:271 +#: guiminer.py:290 msgid "Start/Stop" msgstr "启动/停止" -#: guiminer.py:272 +#: guiminer.py:291 msgid "Autostart" msgstr "自动启动" -#: guiminer.py:356 +#: guiminer.py:375 msgid "Pause all" msgstr "全部暂停" -#: guiminer.py:358 +#: guiminer.py:377 msgid "Restore" msgstr "回复" -#: guiminer.py:359 +#: guiminer.py:378 msgid "Close" msgstr "关闭" -#: guiminer.py:413 +#: guiminer.py:434 #, python-format msgid "Listener for \"%s\" started" msgstr "\"%s\" 监听器已启动" -#: guiminer.py:428 +#: guiminer.py:449 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "\"%(name)s\" 监听器已启动: %(line)s" -#: guiminer.py:431 +#: guiminer.py:452 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "\"%s\" 监听器正在关闭" -#: guiminer.py:462 +#: guiminer.py:496 msgid "Server:" msgstr "服务器:" -#: guiminer.py:467 +#: guiminer.py:501 msgid "Website:" msgstr "网站:" -#: guiminer.py:469 +#: guiminer.py:503 msgid "Ext. Path:" msgstr "外部路径:" -#: guiminer.py:471 +#: guiminer.py:505 msgid "Host:" msgstr "主机:" -#: guiminer.py:473 +#: guiminer.py:507 msgid "Port:" msgstr "端口:" -#: guiminer.py:479 +#: guiminer.py:513 msgid "Device:" msgstr "设备:" -#: guiminer.py:480 +#: guiminer.py:514 msgid "No OpenCL devices" msgstr "无 OpenCL 设备" -#: guiminer.py:481 +#: guiminer.py:515 msgid "Extra flags:" msgstr "附加参数:" -#: guiminer.py:484 +#: guiminer.py:518 msgid "Balance:" msgstr "余额:" -#: guiminer.py:488 +#: guiminer.py:522 msgid "Withdraw" msgstr "取款" -#: guiminer.py:603 +#: guiminer.py:667 msgid "Default" msgstr "默认" -#: guiminer.py:650 +#: guiminer.py:714 msgid "Start" msgstr "启动" -#: guiminer.py:650 +#: guiminer.py:714 msgid "Stop" msgstr "停止" -#: guiminer.py:666 +#: guiminer.py:730 msgid "Connection problems" msgstr "连接问题" -#: guiminer.py:801 +#: guiminer.py:889 msgid "Running command: " msgstr "正在运行命令: " -#: guiminer.py:853 +#: guiminer.py:943 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "难度为 1 的 hash: %(nhashes)d %(update_time)s" -#: guiminer.py:857 +#: guiminer.py:947 #, python-format msgid "Blocks: %d, " msgstr "块: %d, " -#: guiminer.py:860 +#: guiminer.py:950 #, python-format msgid "Shares: %d accepted" msgstr "贡献: %d 已接受" -#: guiminer.py:862 +#: guiminer.py:952 #, python-format msgid ", %d stale/invalid" msgstr ", %d 过时/无效" -#: guiminer.py:884 +#: guiminer.py:974 #, python-format msgid "- last at %s" msgstr "- 更新于 %s" -#: guiminer.py:957 +#: guiminer.py:1047 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." @@ -274,23 +274,23 @@ msgstr "" "要连接到的服务器。不同的服务器有不同的费用与功能。\n" "完整信息请查看其网站。" -#: guiminer.py:958 +#: guiminer.py:1048 msgid "Website of the currently selected server. Click to visit." msgstr "当前所选服务器的网站。点击可访问。" -#: guiminer.py:959 +#: guiminer.py:1049 msgid "Available OpenCL devices on your system." msgstr "您系统中可用的 OpenCL 设备。" -#: guiminer.py:960 +#: guiminer.py:1050 msgid "Host address, without http:// prefix." msgstr "主机地址,无需 http:// 前缀。" -#: guiminer.py:961 +#: guiminer.py:1051 msgid "Server port. This is usually 8332." msgstr "服务器端口。通常为 8332。" -#: guiminer.py:962 +#: guiminer.py:1052 msgid "" "The miner's username.\n" "May be different than your account username.\n" @@ -300,7 +300,7 @@ msgstr "" "可以与账号用户名不同。\n" "示例: Kiv.GPU" -#: guiminer.py:963 +#: guiminer.py:1053 msgid "" "The miner's password.\n" "May be different than your account password." @@ -308,7 +308,7 @@ msgstr "" "采矿器的密码。\n" "可以与账号密码不同。" -#: guiminer.py:964 +#: guiminer.py:1054 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" @@ -318,40 +318,37 @@ msgstr "" "Radeon HD 5xxx 系列可使用 -v -w128 获取最佳效果。\n" "其他显卡的参数参见论坛。" -#: guiminer.py:1058 -#: guiminer.py:1148 -#: guiminer.py:1169 +#: guiminer.py:1148 guiminer.py:1242 guiminer.py:1263 msgid "Auth token rejected by server." msgstr "身份认证 token 被服务器拒绝。" -#: guiminer.py:1076 +#: guiminer.py:1166 #, python-format msgid "%s confirmed" msgstr "%s 已确认" -#: guiminer.py:1078 +#: guiminer.py:1168 #, python-format msgid ", %s unconfirmed" msgstr ", %s 未确认" -#: guiminer.py:1080 +#: guiminer.py:1170 msgid "Bad response from server." msgstr "服务器响应错误。" -#: guiminer.py:1152 -#: guiminer.py:1173 +#: guiminer.py:1246 guiminer.py:1267 msgid "Withdraw OK" msgstr "取款成功" -#: guiminer.py:1332 +#: guiminer.py:1426 msgid "No registration is required - just enter an address and press Start." msgstr "无需注册 - 只需输入地址并按“启动”。" -#: guiminer.py:1334 +#: guiminer.py:1428 msgid "Address:" msgstr "地址:" -#: guiminer.py:1336 +#: guiminer.py:1430 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" @@ -359,7 +356,7 @@ msgstr "" "您接收 Bitcoins 的地址。\n" "例如: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" -#: guiminer.py:1351 +#: guiminer.py:1445 msgid "" "Your miner username (not your account username).\n" "Example: Kiv.GPU" @@ -367,12 +364,11 @@ msgstr "" "您的采矿器用户名 (不是账号用户名)。\n" "示例: Kiv.GPU" -#: guiminer.py:1353 -#: guiminer.py:1373 +#: guiminer.py:1447 guiminer.py:1467 msgid "Your miner password (not your account password)." msgstr "您的采矿器密码 (不是账号密码)。" -#: guiminer.py:1371 +#: guiminer.py:1465 msgid "" "Your miner username. \n" "Example: kiv123@kiv123" @@ -380,181 +376,239 @@ msgstr "" "您的采矿器用户名。\n" "示例: kiv123@kiv123" -#: guiminer.py:1387 +#: guiminer.py:1481 msgid "The e-mail address you registered with." msgstr "您注册时使用的 e-mail 地址。" -#: guiminer.py:1388 +#: guiminer.py:1482 msgid "Email:" msgstr "Email:" -#: guiminer.py:1403 +#: guiminer.py:1497 msgid "&Rename..." msgstr "重命名(&R)..." -#: guiminer.py:1403 +#: guiminer.py:1497 msgid "Rename this miner" msgstr "重命名该采矿器" -#: guiminer.py:1427 +#: guiminer.py:1522 msgid "&New OpenCL miner..." msgstr "新建 OpenCL 采矿器(&N)..." -#: guiminer.py:1427 -msgid "Create a new miner profile" +#: guiminer.py:1522 +msgid "Create a new OpenCL miner (default for ATI cards)" +msgstr "" + +#: guiminer.py:1523 +#, fuzzy +msgid "Create a new Phoenix miner (for some ATI cards)" msgstr "创建新的采矿器配置文件" -#: guiminer.py:1428 -msgid "Create a CPU or CUDA miner (requires external program)" +#: guiminer.py:1523 +#, fuzzy +msgid "New Phoenix miner..." +msgstr "新建其他采矿器(&O)..." + +#: guiminer.py:1524 +msgid "Create a new CUDA miner (for NVIDIA cards)" +msgstr "" + +#: guiminer.py:1524 +#, fuzzy +msgid "New CUDA miner..." +msgstr "新建 OpenCL 采矿器(&N)..." + +#: guiminer.py:1525 +#, fuzzy +msgid "Create a new Ufasoft miner (for CPUs)" +msgstr "创建新的采矿器配置文件" + +#: guiminer.py:1525 +#, fuzzy +msgid "New Ufasoft CPU miner..." +msgstr "新建其他采矿器(&O)..." + +#: guiminer.py:1526 +#, fuzzy +msgid "Create a new custom miner (requires external program)" msgstr "创建 CPU 或 CUDA 采矿器 (需要外部程序)" -#: guiminer.py:1428 +#: guiminer.py:1526 msgid "New &other miner..." msgstr "新建其他采矿器(&O)..." -#: guiminer.py:1429 +#: guiminer.py:1528 msgid "&Save settings" msgstr "保存设置(&S)" -#: guiminer.py:1429 +#: guiminer.py:1528 msgid "Save your settings" msgstr "保存您的设置" -#: guiminer.py:1430 +#: guiminer.py:1529 msgid "&Load settings" msgstr "加载设置(&L)" -#: guiminer.py:1430 +#: guiminer.py:1529 msgid "Load stored settings" msgstr "加载已储存的设置" -#: guiminer.py:1431 +#: guiminer.py:1530 msgid "Quit" msgstr "退出" -#: guiminer.py:1432 +#: guiminer.py:1531 msgid "&File" msgstr "文件(&F)" -#: guiminer.py:1436 +#: guiminer.py:1535 msgid "Show summary" msgstr "显示概览" -#: guiminer.py:1436 +#: guiminer.py:1535 msgid "Show summary of all miners" msgstr "显示全部采矿器的概览" -#: guiminer.py:1437 +#: guiminer.py:1536 msgid "Show console" msgstr "显示终端" -#: guiminer.py:1437 +#: guiminer.py:1536 msgid "Show console logs" msgstr "显示终端日志" -#: guiminer.py:1438 +#: guiminer.py:1537 msgid "&View" msgstr "查看(&V)" -#: guiminer.py:1442 +#: guiminer.py:1541 msgid "&Create solo password..." msgstr "创建独自采矿密码(&C)..." -#: guiminer.py:1442 +#: guiminer.py:1541 msgid "Configure a user/pass for solo mining" msgstr "配置独自采矿的用户名/密码" -#: guiminer.py:1443 +#: guiminer.py:1542 msgid "&Set Bitcoin client path..." msgstr "设置 Bitcoin 客户端路径(&S)..." -#: guiminer.py:1443 +#: guiminer.py:1542 msgid "Set the location of the official Bitcoin client" msgstr "设置官方 Bitcoin 客户端的位置" -#: guiminer.py:1444 +#: guiminer.py:1543 msgid "&Launch Bitcoin client as server" msgstr "将 Bitcoin 客户端作为服务器启动(&L)" -#: guiminer.py:1444 +#: guiminer.py:1543 msgid "Launch the official Bitcoin client as a server for solo mining" msgstr "将官方 Bitcoin 客户端作为独自采矿的服务器启动" -#: guiminer.py:1445 +#: guiminer.py:1544 msgid "&Solo utilities" msgstr "独自采矿(&S)" -#: guiminer.py:1449 +#: guiminer.py:1548 +#, fuzzy +msgid "Start &minimized" +msgstr "开始采矿!" + +#: guiminer.py:1548 +msgid "Start the GUI minimized to the tray." +msgstr "" + +#: guiminer.py:1550 +msgid "&Options" +msgstr "" + +#: guiminer.py:1554 msgid "&Change language..." msgstr "更改语言(&C)..." -#: guiminer.py:1450 +#: guiminer.py:1555 msgid "Language" msgstr "语言" -#: guiminer.py:1453 -msgid "&About/Donate..." +#: guiminer.py:1559 +msgid "&Donate 99 cents..." +msgstr "" + +#: guiminer.py:1559 +msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" +msgstr "" + +#: guiminer.py:1560 +#, fuzzy +msgid "&Donate" msgstr "关于/捐助(&A)..." -#: guiminer.py:1455 +#: guiminer.py:1563 +#, fuzzy +msgid "&About..." +msgstr "关于/捐助(&A)..." + +#: guiminer.py:1565 msgid "&Help" msgstr "帮助(&H)" -#: guiminer.py:1467 +#: guiminer.py:1577 msgid "Failed to load taskbar icon; continuing." msgstr "无法加载任务栏图标; 正在继续。" -#: guiminer.py:1476 +#: guiminer.py:1586 msgid "OpenCL not found - can't add a OpenCL miner" msgstr "未找到 OpenCL - 无法添加 OpenCL 采矿器" -#: guiminer.py:1506 +#: guiminer.py:1623 #, python-format msgid "GUIMiner - v%s" msgstr "GUIMiner - v%s" -#: guiminer.py:1548 +#: guiminer.py:1665 msgid "Name this miner:" msgstr "为该采矿器命名:" -#: guiminer.py:1548 +#: guiminer.py:1665 msgid "New miner" msgstr "新建采矿器" -#: guiminer.py:1551 +#: guiminer.py:1668 msgid "Untitled" msgstr "无标题" -#: guiminer.py:1562 -msgid "External miner (*.exe)|*.exe" +#: guiminer.py:1679 +#, fuzzy +msgid "External miner (*.exe)|*.exe|(*.py)|*.py" msgstr "外部采矿器 (*.exe)|*.exe" -#: guiminer.py:1564 +#: guiminer.py:1681 msgid "Select external miner:" msgstr "选择外部采矿器:" -#: guiminer.py:1574 +#: guiminer.py:1691 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" msgstr "不支持的外部采矿器 %(filename)s。支持: %(supported)s" -#: guiminer.py:1576 +#: guiminer.py:1693 msgid "Miner not supported" msgstr "采矿器不支持" -#: guiminer.py:1602 +#: guiminer.py:1734 msgid "Do you want to save changes?" msgstr "是否希望保存变更?" -#: guiminer.py:1602 +#: guiminer.py:1734 msgid "Save" msgstr "保存" -#: guiminer.py:1631 +#: guiminer.py:1764 msgid "Saving: " msgstr "正在保存: " -#: guiminer.py:1637 +#: guiminer.py:1770 #, python-format msgid "" "Couldn't write save file %s.\n" @@ -563,111 +617,112 @@ msgstr "" "无法写入保存文件 %s。\n" "检查其位置是否可写。" -#: guiminer.py:1638 +#: guiminer.py:1771 msgid "Save unsuccessful" msgstr "保存失败" -#: guiminer.py:1640 +#: guiminer.py:1773 #, python-format msgid "Profiles saved OK to %s." msgstr "配置文件成功保存于 %s。" -#: guiminer.py:1641 +#: guiminer.py:1774 msgid "Save successful" msgstr "保存成功" -#: guiminer.py:1653 +#: guiminer.py:1786 #, python-format msgid "Loaded: %s" msgstr "已加载: %s" -#: guiminer.py:1667 +#: guiminer.py:1800 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "加载配置文件将停止当前正在运行的全部采矿器。是否继续?" -#: guiminer.py:1668 +#: guiminer.py:1801 msgid "Load profile" msgstr "加载配置文件" -#: guiminer.py:1697 +#: guiminer.py:1830 msgid "Select path to Bitcoin.exe" msgstr "选择 Bitcoin.exe 的路径" -#: guiminer.py:1709 +#: guiminer.py:1842 msgid "About" msgstr "关于" -#: guiminer.py:1735 +#: guiminer.py:1868 msgid "Closing this miner will stop it. Continue?" msgstr "关闭该采矿器将停止其采矿。是否继续?" -#: guiminer.py:1736 +#: guiminer.py:1869 msgid "Close miner" msgstr "关闭采矿器" -#: guiminer.py:1765 +#: guiminer.py:1898 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" msgstr "无法在 %s 找到 Bitcoin。您的路径设置是否正确?" -#: guiminer.py:1766 +#: guiminer.py:1899 msgid "Launch failed" msgstr "启动失败" -#: guiminer.py:1769 -msgid "Client launched ok. You can start a miner now with the server set to 'solo'." +#: guiminer.py:1902 +msgid "" +"Client launched ok. You can start a miner now with the server set to 'solo'." msgstr "客户端启动成功。您现在可以启动服务器设为 'solo' 的采矿器。" -#: guiminer.py:1770 +#: guiminer.py:1903 msgid "Launched ok." msgstr "启动成功。" -#: guiminer.py:1785 +#: guiminer.py:1918 #, python-format msgid "%s already exists. Overwrite?" msgstr "%s 已存在。是否覆写?" -#: guiminer.py:1786 +#: guiminer.py:1919 msgid "bitcoin.conf already exists." msgstr "bitcoin.conf 已存在。" -#: guiminer.py:1791 +#: guiminer.py:1924 msgid "Enter password" msgstr "输入密码" -#: guiminer.py:1801 +#: guiminer.py:1934 msgid "Success" msgstr "成功" -#: guiminer.py:1801 +#: guiminer.py:1934 msgid "Wrote bitcoin config ok." msgstr "写入 bitcoin 配置成功。" -#: guiminer.py:1812 +#: guiminer.py:1945 msgid "Console" msgstr "终端" -#: guiminer.py:1824 +#: guiminer.py:1957 msgid "Summary" msgstr "概览" -#: guiminer.py:1837 +#: guiminer.py:1970 msgid "Rename miner" msgstr "重命名采矿器" -#: guiminer.py:1837 +#: guiminer.py:1970 msgid "Rename to:" msgstr "重命名为:" -#: guiminer.py:1842 +#: guiminer.py:1975 msgid "Change language" msgstr "更改语言" -#: guiminer.py:1861 +#: guiminer.py:1995 msgid "Choose language (requires restart to take full effect)" msgstr "选择语言 (需要重新启动方可完全生效)" -#: guiminer.py:1906 +#: guiminer.py:2040 msgid "" "Click the link below to log in to the pool and get a special token. \n" "This token lets you securely check your balance.\n" @@ -677,23 +732,24 @@ msgstr "" "该 token 允许您安全地检查余额。\n" "要记住该 token 供日后使用,请保存采矿器设置。" -#: guiminer.py:1915 +#: guiminer.py:2049 msgid "(Paste token here)" msgstr "(在此粘贴 token)" -#: guiminer.py:1941 +#: guiminer.py:2075 msgid "Copy address to clipboard" msgstr "复制地址到剪贴板" -#: guiminer.py:1960 +#: guiminer.py:2094 msgid "No OpenCL devices found." msgstr "未找到 OpenCL 设备。" -#: guiminer.py:1963 +#: guiminer.py:2097 msgid "" "No OpenCL devices were found.\n" " If you only want to mine using CPU or CUDA, you can ignore this message.\n" -" If you want to mine on ATI graphics cards, you may need to install the ATI Stream\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI " +"Stream\n" " SDK, or your GPU may not support OpenCL." msgstr "" "未找到 OpenCL 设备。\n" @@ -701,7 +757,6 @@ msgstr "" " 如果您想用 ATI 显卡采矿,可能需要安装 ATI Stream SDK,\n" " 若已安装,可能您的 GPU 不支持 OpenCL。" -#: guiminer.py:1973 +#: guiminer.py:2107 msgid "Don't show this message again" msgstr "不要再次显示本信息" - diff --git a/messages.pot b/messages.pot index b8b81e7..017c14b 100644 --- a/messages.pot +++ b/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-20 23:09-0300\n" +"POT-Creation-Date: 2011-06-09 13:29-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: guiminer.py:75 +#: guiminer.py:84 #, python-format msgid "" "GUIMiner\n" @@ -39,618 +39,666 @@ msgid "" "further work on this software.\n" msgstr "" -#: guiminer.py:96 +#: guiminer.py:105 msgid "Not started" msgstr "" -#: guiminer.py:97 +#: guiminer.py:106 msgid "Starting..." msgstr "" -#: guiminer.py:98 +#: guiminer.py:107 msgid "Stopped" msgstr "" -#: guiminer.py:99 +#: guiminer.py:108 msgid "Paused" msgstr "" -#: guiminer.py:100 +#: guiminer.py:109 msgid "Start mining!" msgstr "" -#: guiminer.py:101 +#: guiminer.py:110 msgid "Stop mining" msgstr "" -#: guiminer.py:102 +#: guiminer.py:111 msgid "Refresh balance" msgstr "" -#: guiminer.py:103 +#: guiminer.py:112 msgid "Connection error" msgstr "" -#: guiminer.py:104 +#: guiminer.py:113 msgid "Username:" msgstr "" -#: guiminer.py:105 +#: guiminer.py:114 msgid "Password:" msgstr "" -#: guiminer.py:106 +#: guiminer.py:115 msgid "Quit this program" msgstr "" -#: guiminer.py:107 +#: guiminer.py:116 msgid "Show about dialog" msgstr "" -#: guiminer.py:182 +#: guiminer.py:197 #, python-format msgid "%.1f Ghash/s" msgstr "" -#: guiminer.py:184 +#: guiminer.py:199 #, python-format msgid "%.1f Mhash/s" msgstr "" -#: guiminer.py:186 +#: guiminer.py:201 msgid "Connecting..." msgstr "" -#: guiminer.py:188 +#: guiminer.py:203 #, python-format msgid "%d khash/s" msgstr "" -#: guiminer.py:212 +#: guiminer.py:227 #, python-format msgid "Requesting balance: %(request)s" msgstr "" -#: guiminer.py:216 +#: guiminer.py:231 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "" -#: guiminer.py:267 +#: guiminer.py:286 msgid "Miner" msgstr "" -#: guiminer.py:268 +#: guiminer.py:287 msgid "Speed" msgstr "" -#: guiminer.py:269 +#: guiminer.py:288 msgid "Accepted" msgstr "" -#: guiminer.py:270 +#: guiminer.py:289 msgid "Stale" msgstr "" -#: guiminer.py:271 +#: guiminer.py:290 msgid "Start/Stop" msgstr "" -#: guiminer.py:272 +#: guiminer.py:291 msgid "Autostart" msgstr "" -#: guiminer.py:356 +#: guiminer.py:375 msgid "Pause all" msgstr "" -#: guiminer.py:358 +#: guiminer.py:377 msgid "Restore" msgstr "" -#: guiminer.py:359 +#: guiminer.py:378 msgid "Close" msgstr "" -#: guiminer.py:413 +#: guiminer.py:434 #, python-format msgid "Listener for \"%s\" started" msgstr "" -#: guiminer.py:428 +#: guiminer.py:449 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "" -#: guiminer.py:431 +#: guiminer.py:452 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "" -#: guiminer.py:462 +#: guiminer.py:496 msgid "Server:" msgstr "" -#: guiminer.py:467 +#: guiminer.py:501 msgid "Website:" msgstr "" -#: guiminer.py:469 +#: guiminer.py:503 msgid "Ext. Path:" msgstr "" -#: guiminer.py:471 +#: guiminer.py:505 msgid "Host:" msgstr "" -#: guiminer.py:473 +#: guiminer.py:507 msgid "Port:" msgstr "" -#: guiminer.py:479 +#: guiminer.py:513 msgid "Device:" msgstr "" -#: guiminer.py:480 +#: guiminer.py:514 msgid "No OpenCL devices" msgstr "" -#: guiminer.py:481 +#: guiminer.py:515 msgid "Extra flags:" msgstr "" -#: guiminer.py:484 +#: guiminer.py:518 msgid "Balance:" msgstr "" -#: guiminer.py:488 +#: guiminer.py:522 msgid "Withdraw" msgstr "" -#: guiminer.py:603 +#: guiminer.py:667 msgid "Default" msgstr "" -#: guiminer.py:650 +#: guiminer.py:714 msgid "Start" msgstr "" -#: guiminer.py:650 +#: guiminer.py:714 msgid "Stop" msgstr "" -#: guiminer.py:666 +#: guiminer.py:730 msgid "Connection problems" msgstr "" -#: guiminer.py:801 +#: guiminer.py:889 msgid "Running command: " msgstr "" -#: guiminer.py:853 +#: guiminer.py:943 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "" -#: guiminer.py:857 +#: guiminer.py:947 #, python-format msgid "Blocks: %d, " msgstr "" -#: guiminer.py:860 +#: guiminer.py:950 #, python-format msgid "Shares: %d accepted" msgstr "" -#: guiminer.py:862 +#: guiminer.py:952 #, python-format msgid ", %d stale/invalid" msgstr "" -#: guiminer.py:884 +#: guiminer.py:974 #, python-format msgid "- last at %s" msgstr "" -#: guiminer.py:957 +#: guiminer.py:1047 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." msgstr "" -#: guiminer.py:958 +#: guiminer.py:1048 msgid "Website of the currently selected server. Click to visit." msgstr "" -#: guiminer.py:959 +#: guiminer.py:1049 msgid "Available OpenCL devices on your system." msgstr "" -#: guiminer.py:960 +#: guiminer.py:1050 msgid "Host address, without http:// prefix." msgstr "" -#: guiminer.py:961 +#: guiminer.py:1051 msgid "Server port. This is usually 8332." msgstr "" -#: guiminer.py:962 +#: guiminer.py:1052 msgid "" "The miner's username.\n" "May be different than your account username.\n" "Example: Kiv.GPU" msgstr "" -#: guiminer.py:963 +#: guiminer.py:1053 msgid "" "The miner's password.\n" "May be different than your account password." msgstr "" -#: guiminer.py:964 +#: guiminer.py:1054 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" "For other cards consult the forum." msgstr "" -#: guiminer.py:1058 guiminer.py:1148 guiminer.py:1169 +#: guiminer.py:1148 guiminer.py:1242 guiminer.py:1263 msgid "Auth token rejected by server." msgstr "" -#: guiminer.py:1076 +#: guiminer.py:1166 #, python-format msgid "%s confirmed" msgstr "" -#: guiminer.py:1078 +#: guiminer.py:1168 #, python-format msgid ", %s unconfirmed" msgstr "" -#: guiminer.py:1080 +#: guiminer.py:1170 msgid "Bad response from server." msgstr "" -#: guiminer.py:1152 guiminer.py:1173 +#: guiminer.py:1246 guiminer.py:1267 msgid "Withdraw OK" msgstr "" -#: guiminer.py:1332 +#: guiminer.py:1426 msgid "No registration is required - just enter an address and press Start." msgstr "" -#: guiminer.py:1334 +#: guiminer.py:1428 msgid "Address:" msgstr "" -#: guiminer.py:1336 +#: guiminer.py:1430 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" msgstr "" -#: guiminer.py:1351 +#: guiminer.py:1445 msgid "" "Your miner username (not your account username).\n" "Example: Kiv.GPU" msgstr "" -#: guiminer.py:1353 guiminer.py:1373 +#: guiminer.py:1447 guiminer.py:1467 msgid "Your miner password (not your account password)." msgstr "" -#: guiminer.py:1371 +#: guiminer.py:1465 msgid "" "Your miner username. \n" "Example: kiv123@kiv123" msgstr "" -#: guiminer.py:1387 +#: guiminer.py:1481 msgid "The e-mail address you registered with." msgstr "" -#: guiminer.py:1388 +#: guiminer.py:1482 msgid "Email:" msgstr "" -#: guiminer.py:1403 +#: guiminer.py:1497 msgid "&Rename..." msgstr "" -#: guiminer.py:1403 +#: guiminer.py:1497 msgid "Rename this miner" msgstr "" -#: guiminer.py:1427 +#: guiminer.py:1522 msgid "&New OpenCL miner..." msgstr "" -#: guiminer.py:1427 -msgid "Create a new miner profile" +#: guiminer.py:1522 +msgid "Create a new OpenCL miner (default for ATI cards)" msgstr "" -#: guiminer.py:1428 -msgid "Create a CPU or CUDA miner (requires external program)" +#: guiminer.py:1523 +msgid "Create a new Phoenix miner (for some ATI cards)" msgstr "" -#: guiminer.py:1428 +#: guiminer.py:1523 +msgid "New Phoenix miner..." +msgstr "" + +#: guiminer.py:1524 +msgid "Create a new CUDA miner (for NVIDIA cards)" +msgstr "" + +#: guiminer.py:1524 +msgid "New CUDA miner..." +msgstr "" + +#: guiminer.py:1525 +msgid "Create a new Ufasoft miner (for CPUs)" +msgstr "" + +#: guiminer.py:1525 +msgid "New Ufasoft CPU miner..." +msgstr "" + +#: guiminer.py:1526 +msgid "Create a new custom miner (requires external program)" +msgstr "" + +#: guiminer.py:1526 msgid "New &other miner..." msgstr "" -#: guiminer.py:1429 +#: guiminer.py:1528 msgid "&Save settings" msgstr "" -#: guiminer.py:1429 +#: guiminer.py:1528 msgid "Save your settings" msgstr "" -#: guiminer.py:1430 +#: guiminer.py:1529 msgid "&Load settings" msgstr "" -#: guiminer.py:1430 +#: guiminer.py:1529 msgid "Load stored settings" msgstr "" -#: guiminer.py:1431 +#: guiminer.py:1530 msgid "Quit" msgstr "" -#: guiminer.py:1432 +#: guiminer.py:1531 msgid "&File" msgstr "" -#: guiminer.py:1436 +#: guiminer.py:1535 msgid "Show summary" msgstr "" -#: guiminer.py:1436 +#: guiminer.py:1535 msgid "Show summary of all miners" msgstr "" -#: guiminer.py:1437 +#: guiminer.py:1536 msgid "Show console" msgstr "" -#: guiminer.py:1437 +#: guiminer.py:1536 msgid "Show console logs" msgstr "" -#: guiminer.py:1438 +#: guiminer.py:1537 msgid "&View" msgstr "" -#: guiminer.py:1442 +#: guiminer.py:1541 msgid "&Create solo password..." msgstr "" -#: guiminer.py:1442 +#: guiminer.py:1541 msgid "Configure a user/pass for solo mining" msgstr "" -#: guiminer.py:1443 +#: guiminer.py:1542 msgid "&Set Bitcoin client path..." msgstr "" -#: guiminer.py:1443 +#: guiminer.py:1542 msgid "Set the location of the official Bitcoin client" msgstr "" -#: guiminer.py:1444 +#: guiminer.py:1543 msgid "&Launch Bitcoin client as server" msgstr "" -#: guiminer.py:1444 +#: guiminer.py:1543 msgid "Launch the official Bitcoin client as a server for solo mining" msgstr "" -#: guiminer.py:1445 +#: guiminer.py:1544 msgid "&Solo utilities" msgstr "" -#: guiminer.py:1449 +#: guiminer.py:1548 +msgid "Start &minimized" +msgstr "" + +#: guiminer.py:1548 +msgid "Start the GUI minimized to the tray." +msgstr "" + +#: guiminer.py:1550 +msgid "&Options" +msgstr "" + +#: guiminer.py:1554 msgid "&Change language..." msgstr "" -#: guiminer.py:1450 +#: guiminer.py:1555 msgid "Language" msgstr "" -#: guiminer.py:1453 -msgid "&About/Donate..." +#: guiminer.py:1559 +msgid "&Donate 99 cents..." +msgstr "" + +#: guiminer.py:1559 +msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" +msgstr "" + +#: guiminer.py:1560 +msgid "&Donate" +msgstr "" + +#: guiminer.py:1563 +msgid "&About..." msgstr "" -#: guiminer.py:1455 +#: guiminer.py:1565 msgid "&Help" msgstr "" -#: guiminer.py:1467 +#: guiminer.py:1577 msgid "Failed to load taskbar icon; continuing." msgstr "" -#: guiminer.py:1476 +#: guiminer.py:1586 msgid "OpenCL not found - can't add a OpenCL miner" msgstr "" -#: guiminer.py:1506 +#: guiminer.py:1623 #, python-format msgid "GUIMiner - v%s" msgstr "" -#: guiminer.py:1548 +#: guiminer.py:1665 msgid "Name this miner:" msgstr "" -#: guiminer.py:1548 +#: guiminer.py:1665 msgid "New miner" msgstr "" -#: guiminer.py:1551 +#: guiminer.py:1668 msgid "Untitled" msgstr "" -#: guiminer.py:1562 -msgid "External miner (*.exe)|*.exe" +#: guiminer.py:1679 +msgid "External miner (*.exe)|*.exe|(*.py)|*.py" msgstr "" -#: guiminer.py:1564 +#: guiminer.py:1681 msgid "Select external miner:" msgstr "" -#: guiminer.py:1574 +#: guiminer.py:1691 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" msgstr "" -#: guiminer.py:1576 +#: guiminer.py:1693 msgid "Miner not supported" msgstr "" -#: guiminer.py:1602 +#: guiminer.py:1734 msgid "Do you want to save changes?" msgstr "" -#: guiminer.py:1602 +#: guiminer.py:1734 msgid "Save" msgstr "" -#: guiminer.py:1631 +#: guiminer.py:1764 msgid "Saving: " msgstr "" -#: guiminer.py:1637 +#: guiminer.py:1770 #, python-format msgid "" "Couldn't write save file %s.\n" "Check the location is writable." msgstr "" -#: guiminer.py:1638 +#: guiminer.py:1771 msgid "Save unsuccessful" msgstr "" -#: guiminer.py:1640 +#: guiminer.py:1773 #, python-format msgid "Profiles saved OK to %s." msgstr "" -#: guiminer.py:1641 +#: guiminer.py:1774 msgid "Save successful" msgstr "" -#: guiminer.py:1653 +#: guiminer.py:1786 #, python-format msgid "Loaded: %s" msgstr "" -#: guiminer.py:1667 +#: guiminer.py:1800 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "" -#: guiminer.py:1668 +#: guiminer.py:1801 msgid "Load profile" msgstr "" -#: guiminer.py:1697 +#: guiminer.py:1830 msgid "Select path to Bitcoin.exe" msgstr "" -#: guiminer.py:1709 +#: guiminer.py:1842 msgid "About" msgstr "" -#: guiminer.py:1735 +#: guiminer.py:1868 msgid "Closing this miner will stop it. Continue?" msgstr "" -#: guiminer.py:1736 +#: guiminer.py:1869 msgid "Close miner" msgstr "" -#: guiminer.py:1765 +#: guiminer.py:1898 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" msgstr "" -#: guiminer.py:1766 +#: guiminer.py:1899 msgid "Launch failed" msgstr "" -#: guiminer.py:1769 +#: guiminer.py:1902 msgid "Client launched ok. You can start a miner now with the server set to 'solo'." msgstr "" -#: guiminer.py:1770 +#: guiminer.py:1903 msgid "Launched ok." msgstr "" -#: guiminer.py:1785 +#: guiminer.py:1918 #, python-format msgid "%s already exists. Overwrite?" msgstr "" -#: guiminer.py:1786 +#: guiminer.py:1919 msgid "bitcoin.conf already exists." msgstr "" -#: guiminer.py:1791 +#: guiminer.py:1924 msgid "Enter password" msgstr "" -#: guiminer.py:1801 +#: guiminer.py:1934 msgid "Success" msgstr "" -#: guiminer.py:1801 +#: guiminer.py:1934 msgid "Wrote bitcoin config ok." msgstr "" -#: guiminer.py:1812 +#: guiminer.py:1945 msgid "Console" msgstr "" -#: guiminer.py:1824 +#: guiminer.py:1957 msgid "Summary" msgstr "" -#: guiminer.py:1837 +#: guiminer.py:1970 msgid "Rename miner" msgstr "" -#: guiminer.py:1837 +#: guiminer.py:1970 msgid "Rename to:" msgstr "" -#: guiminer.py:1842 +#: guiminer.py:1975 msgid "Change language" msgstr "" -#: guiminer.py:1861 +#: guiminer.py:1995 msgid "Choose language (requires restart to take full effect)" msgstr "" -#: guiminer.py:1906 +#: guiminer.py:2040 msgid "" "Click the link below to log in to the pool and get a special token. \n" "This token lets you securely check your balance.\n" "To remember this token for the future, save your miner settings." msgstr "" -#: guiminer.py:1915 +#: guiminer.py:2049 msgid "(Paste token here)" msgstr "" -#: guiminer.py:1941 +#: guiminer.py:2075 msgid "Copy address to clipboard" msgstr "" -#: guiminer.py:1960 +#: guiminer.py:2094 msgid "No OpenCL devices found." msgstr "" -#: guiminer.py:1963 +#: guiminer.py:2097 msgid "" "No OpenCL devices were found.\n" " If you only want to mine using CPU or CUDA, you can ignore this message.\n" @@ -658,6 +706,6 @@ msgid "" " SDK, or your GPU may not support OpenCL." msgstr "" -#: guiminer.py:1973 +#: guiminer.py:2107 msgid "Don't show this message again" msgstr "" From fbe2fe35b29d4fa4463762c0859045509a80f40f Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 10 Jun 2011 12:43:06 -0300 Subject: [PATCH 109/190] Update translations. --- guiminer.py | 2 +- guiminer_de.po | 7 +++- guiminer_es.po | 7 +++- guiminer_fr.po | 7 +++- guiminer_hu.po | 7 +++- guiminer_ru.po | 95 ++++++++++++++++++++++---------------------------- guiminer_zh.po | 7 +++- messages.pot | 6 +++- 8 files changed, 77 insertions(+), 61 deletions(-) diff --git a/guiminer.py b/guiminer.py index 3646412..e7edb16 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1524,7 +1524,7 @@ def __init__(self, *args, **kwds): new_menu.Append(ID_NEW_CUDA, _("New CUDA miner..."), _("Create a new CUDA miner (for NVIDIA cards)"), wx.ITEM_NORMAL) new_menu.Append(ID_NEW_UFASOFT, _("New Ufasoft CPU miner..."), _("Create a new Ufasoft miner (for CPUs)"), wx.ITEM_NORMAL) new_menu.Append(ID_NEW_EXTERNAL, _("New &other miner..."), _("Create a new custom miner (requires external program)"), wx.ITEM_NORMAL) - file_menu.AppendMenu(wx.NewId(), 'New miner', new_menu) + file_menu.AppendMenu(wx.NewId(), _('&New miner'), new_menu) file_menu.Append(wx.ID_SAVE, _("&Save settings"), _("Save your settings"), wx.ITEM_NORMAL) file_menu.Append(wx.ID_OPEN, _("&Load settings"), _("Load stored settings"), wx.ITEM_NORMAL) file_menu.Append(wx.ID_EXIT, _("Quit"), STR_QUIT, wx.ITEM_NORMAL) diff --git a/guiminer_de.po b/guiminer_de.po index bef9f58..3a7446f 100644 --- a/guiminer_de.po +++ b/guiminer_de.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-09 13:29-0300\n" +"POT-Creation-Date: 2011-06-10 12:41-0300\n" "PO-Revision-Date: 2011-06-05 16:30+0100\n" "Last-Translator: Liikaa \n" "Language-Team: German\n" @@ -446,6 +446,11 @@ msgstr "Neuen CPU- oder CUDA-Miner erstellen (erfordert externe Anwendung)" msgid "New &other miner..." msgstr "Neuen &externen Miner..." +#: guiminer.py:1527 +#, fuzzy +msgid "&New miner" +msgstr "Neuer Miner" + #: guiminer.py:1528 msgid "&Save settings" msgstr "Einstellungen &speichern" diff --git a/guiminer_es.po b/guiminer_es.po index 2abbd75..a17d0cc 100644 --- a/guiminer_es.po +++ b/guiminer_es.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-09 13:29-0300\n" +"POT-Creation-Date: 2011-06-10 12:41-0300\n" "PO-Revision-Date: 2011-05-20 00:00-0000\n" "Last-Translator: Bitcoins Wallet \n" "Language-Team: Español\n" @@ -434,6 +434,11 @@ msgstr "Crear un nuevo minero CPU o CUDA (requiere un programa externo)" msgid "New &other miner..." msgstr "Nuevo minero diferente..." +#: guiminer.py:1527 +#, fuzzy +msgid "&New miner" +msgstr "Nuevo minero" + #: guiminer.py:1528 msgid "&Save settings" msgstr "&Guardar opciones" diff --git a/guiminer_fr.po b/guiminer_fr.po index d66c8cb..f4ce120 100644 --- a/guiminer_fr.po +++ b/guiminer_fr.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-09 13:29-0300\n" +"POT-Creation-Date: 2011-06-10 12:41-0300\n" "PO-Revision-Date: 2011-05-24 18:37+0100\n" "Last-Translator: Cramoisan Florian \n" "Language-Team: Russian\n" @@ -450,6 +450,11 @@ msgstr "Créer un miner CPU ou CUDA (nécessite un programme externe)" msgid "New &other miner..." msgstr "N&ouveau miner..." +#: guiminer.py:1527 +#, fuzzy +msgid "&New miner" +msgstr "Nouveau miner" + #: guiminer.py:1528 msgid "&Save settings" msgstr "&Sauver les paramètres" diff --git a/guiminer_hu.po b/guiminer_hu.po index 17a47b5..c35fab5 100644 --- a/guiminer_hu.po +++ b/guiminer_hu.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-09 13:29-0300\n" +"POT-Creation-Date: 2011-06-10 12:41-0300\n" "PO-Revision-Date: 2011-06-04 18:34+0100\n" "Last-Translator: Underyx \n" "Language-Team: Español\n" @@ -434,6 +434,11 @@ msgstr "Új CPU, vagy CUDA bányász (külső bányászprogrammal)" msgid "New &other miner..." msgstr "Új külső bányász..." +#: guiminer.py:1527 +#, fuzzy +msgid "&New miner" +msgstr "Új bányász" + #: guiminer.py:1528 msgid "&Save settings" msgstr "&Beállítások mentése" diff --git a/guiminer_ru.po b/guiminer_ru.po index a13a5b0..12617b5 100644 --- a/guiminer_ru.po +++ b/guiminer_ru.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-09 13:29-0300\n" -"PO-Revision-Date: 2011-04-20 19:55-0400\n" +"POT-Creation-Date: 2011-06-10 12:41-0300\n" +"PO-Revision-Date: 2011-06-10 12:42-0400\n" "Last-Translator: Chris MacLeod \n" "Language-Team: Russian\n" "MIME-Version: 1.0\n" @@ -48,7 +48,7 @@ msgstr "" "\n" "%(address)s\n" "\n" -"Даже один Биткоин полезен и помогает мотивировать\n" +"Даже один битцент полезен, и помогает мотивировать\n" "дальнейшую работу над этой программой.\n" #: guiminer.py:105 @@ -269,8 +269,7 @@ msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." msgstr "" -"Сервер для подключения. Разные серверы имеют разные возможности и взимаемый " -"процент.\n" +"Сервер для подключения. Разные серверы имеют разные возможности и взимаемый процент.\n" "Подробней смотрите на их сайтах." #: guiminer.py:1048 @@ -314,10 +313,12 @@ msgid "" "For other cards consult the forum." msgstr "" "Доп. параметры передаваемые генератору.\n" -"Для лучших результатов на Радеонах HD 5xxx серий, используйте -v -w128.\n" +"Для лучших результатов на Радеонах HD 5xxx серий, под OpenCL, используйте -v -w128.\n" "По поводу других видеокарт - проверьте форум." -#: guiminer.py:1148 guiminer.py:1242 guiminer.py:1263 +#: guiminer.py:1148 +#: guiminer.py:1242 +#: guiminer.py:1263 msgid "Auth token rejected by server." msgstr "Код авторизации не принят сервером" @@ -335,7 +336,8 @@ msgstr ", %s не подтверждено" msgid "Bad response from server." msgstr "Неправильный ответ сервера." -#: guiminer.py:1246 guiminer.py:1267 +#: guiminer.py:1246 +#: guiminer.py:1267 msgid "Withdraw OK" msgstr "Выплата произведена" @@ -363,7 +365,8 @@ msgstr "" "Логин генератора (miner username), может отличаться от логина аккаунта.\n" "Пример: Kiv.GPU" -#: guiminer.py:1447 guiminer.py:1467 +#: guiminer.py:1447 +#: guiminer.py:1467 msgid "Your miner password (not your account password)." msgstr "Пароль генератора, может отличаться от пароля аккаунта ." @@ -397,46 +400,44 @@ msgstr "&Создать OpenCL генератор..." #: guiminer.py:1522 msgid "Create a new OpenCL miner (default for ATI cards)" -msgstr "" +msgstr "Создать новый OpenCL генератор (по умолчанию для карт ATI)" #: guiminer.py:1523 -#, fuzzy msgid "Create a new Phoenix miner (for some ATI cards)" -msgstr "Создать новый профиль генератора" +msgstr "Создать новый Phoenix генератор (для некоторых ATI карт)" #: guiminer.py:1523 -#, fuzzy msgid "New Phoenix miner..." -msgstr "Создать &другой генератор..." +msgstr "Создать Phoenix генератор..." #: guiminer.py:1524 msgid "Create a new CUDA miner (for NVIDIA cards)" -msgstr "" +msgstr "Создать CUDA генератор (для карт NVIDIA)" #: guiminer.py:1524 -#, fuzzy msgid "New CUDA miner..." -msgstr "&Создать OpenCL генератор..." +msgstr "Создать CUDA генератор..." #: guiminer.py:1525 -#, fuzzy msgid "Create a new Ufasoft miner (for CPUs)" -msgstr "Создать новый профиль генератора" +msgstr "Создать Ufasoft генератор (для CPU)" #: guiminer.py:1525 -#, fuzzy msgid "New Ufasoft CPU miner..." -msgstr "Создать &другой генератор..." +msgstr "Создать Ufasoft генератор..." #: guiminer.py:1526 -#, fuzzy msgid "Create a new custom miner (requires external program)" -msgstr "Создать CPU или CUDA генератор (требуется дополнительный софт)" +msgstr "Создать генератор использующий другой движок (требуется дополнительный софт)" #: guiminer.py:1526 msgid "New &other miner..." msgstr "Создать &другой генератор..." +#: guiminer.py:1527 +msgid "&New miner" +msgstr "&Новый генератор" + #: guiminer.py:1528 msgid "&Save settings" msgstr "&Сохранить настройки" @@ -503,30 +504,27 @@ msgstr "&Запустить Bitcoin клиент как сервер" #: guiminer.py:1543 msgid "Launch the official Bitcoin client as a server for solo mining" -msgstr "" -"Запустить официальный Bitcoin клиент в режиме сервера для одиночного " -"генерирования" +msgstr "Запустить официальный Bitcoin клиент в режиме сервера для одиночного генерирования" #: guiminer.py:1544 msgid "&Solo utilities" msgstr "&Соло режим" #: guiminer.py:1548 -#, fuzzy msgid "Start &minimized" -msgstr "Старт!" +msgstr "Запускать в трее" #: guiminer.py:1548 msgid "Start the GUI minimized to the tray." -msgstr "" +msgstr "Запускает GUI свернутым в трей" #: guiminer.py:1550 msgid "&Options" -msgstr "" +msgstr "&Настройки" #: guiminer.py:1554 msgid "&Change language..." -msgstr "Изменить язык..." +msgstr "&Изменить язык..." #: guiminer.py:1555 msgid "Language" @@ -534,21 +532,19 @@ msgstr "Язык" #: guiminer.py:1559 msgid "&Donate 99 cents..." -msgstr "" +msgstr "&99 центов автору" #: guiminer.py:1559 msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" -msgstr "" +msgstr "Пожертвовать автору сумму BTC, равную по курсу 0,99$, чтобы поддержать развитие GUIminer" #: guiminer.py:1560 -#, fuzzy msgid "&Donate" -msgstr "&О программе/Помочь..." +msgstr "&Помочь" #: guiminer.py:1563 -#, fuzzy msgid "&About..." -msgstr "&О программе/Помочь..." +msgstr "&О программе" #: guiminer.py:1565 msgid "&Help" @@ -573,16 +569,15 @@ msgstr "Назовите генератор:" #: guiminer.py:1665 msgid "New miner" -msgstr "Новый генератор" +msgstr "&Новый генератор" #: guiminer.py:1668 msgid "Untitled" msgstr "Без имени" #: guiminer.py:1679 -#, fuzzy msgid "External miner (*.exe)|*.exe|(*.py)|*.py" -msgstr "Внешний генератор (*.exe)|*.exe" +msgstr "Внешний генератор (*.exe)|*.exe|(*.py)|*.py" #: guiminer.py:1681 msgid "Select external miner:" @@ -591,9 +586,7 @@ msgstr "Выберите внешний генератор:" #: guiminer.py:1691 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" -msgstr "" -"Неподдерживаемый внешний генератор %(filename)s. Поддерживаемые: %(supported)" -"s" +msgstr "Неподдерживаемый внешний генератор %(filename)s. Поддерживаемые: %(supported)s" #: guiminer.py:1693 msgid "Miner not supported" @@ -672,11 +665,8 @@ msgid "Launch failed" msgstr "Сбой запуска" #: guiminer.py:1902 -msgid "" -"Client launched ok. You can start a miner now with the server set to 'solo'." -msgstr "" -"Клиент успешно запущен. Можно запустить генератор с указанием на \"Соло\" " -"сервер." +msgid "Client launched ok. You can start a miner now with the server set to 'solo'." +msgstr "Клиент успешно запущен. Можно запустить генератор с указанием на \"Соло\" сервер." #: guiminer.py:1903 msgid "Launched ok." @@ -733,8 +723,7 @@ msgid "" "This token lets you securely check your balance.\n" "To remember this token for the future, save your miner settings." msgstr "" -"Нажмите ссылку ниже, чтобы войти в пул и получить специальный код (API " -"token). \n" +"Нажмите ссылку ниже, чтобы войти в пул и получить специальный код (API token). \n" "Этот код позволяет проверять состояние баланса.\n" "При сохранении настроек, код сохраняется." @@ -754,13 +743,11 @@ msgstr "Не обнаружено OpenCL устройств." msgid "" "No OpenCL devices were found.\n" " If you only want to mine using CPU or CUDA, you can ignore this message.\n" -" If you want to mine on ATI graphics cards, you may need to install the ATI " -"Stream\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI Stream\n" " SDK, or your GPU may not support OpenCL." msgstr "" "Не обнаружено OpenCL устройств.\n" -"Если вы собирались генерировать используя CPU или CUDA, игнорируйте это " -"сообщение.\n" +"Если вы собирались генерировать используя CPU или CUDA, игнорируйте это сообщение.\n" "Если вы хотите генерировать на видеокартах ATI, нужно установить ATI Stream\n" "SDK. Или возможно, ваша карта не поддерживает OpenCL.\n" diff --git a/guiminer_zh.po b/guiminer_zh.po index 39eebd3..3d8fec9 100644 --- a/guiminer_zh.po +++ b/guiminer_zh.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-09 13:29-0300\n" +"POT-Creation-Date: 2011-06-10 12:41-0300\n" "PO-Revision-Date: \n" "Last-Translator: Dean Lee \n" "Language-Team: Chinese Simp \n" @@ -438,6 +438,11 @@ msgstr "创建 CPU 或 CUDA 采矿器 (需要外部程序)" msgid "New &other miner..." msgstr "新建其他采矿器(&O)..." +#: guiminer.py:1527 +#, fuzzy +msgid "&New miner" +msgstr "新建采矿器" + #: guiminer.py:1528 msgid "&Save settings" msgstr "保存设置(&S)" diff --git a/messages.pot b/messages.pot index 017c14b..ac0cba6 100644 --- a/messages.pot +++ b/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-09 13:29-0300\n" +"POT-Creation-Date: 2011-06-10 12:41-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -402,6 +402,10 @@ msgstr "" msgid "New &other miner..." msgstr "" +#: guiminer.py:1527 +msgid "&New miner" +msgstr "" + #: guiminer.py:1528 msgid "&Save settings" msgstr "" From f77f68315fb6c18c06b04c295f6bdb5876539c4c Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 10 Jun 2011 14:13:18 -0300 Subject: [PATCH 110/190] Add control of CPU affinity. --- guiminer.py | 89 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 76 insertions(+), 13 deletions(-) diff --git a/guiminer.py b/guiminer.py index e7edb16..9244802 100644 --- a/guiminer.py +++ b/guiminer.py @@ -16,6 +16,11 @@ import collections import webbrowser +try: + import win32api, win32con, win32process +except ImportError: + pass + from wx.lib.agw import flatnotebook as fnb from wx.lib.agw import hyperlink from wx.lib.newevent import NewEvent @@ -233,7 +238,19 @@ def http_request(hostname, *args): return response, data finally: conn.close() - + +def get_process_affinity(pid): + """Return the affinity mask for the specified process.""" + flags = win32con.PROCESS_QUERY_INFORMATION + handle = win32api.OpenProcess(flags, 0, pid) + return win32process.GetProcessAffinityMask(handle)[0] + +def set_process_affinity(pid, mask): + """Set the affinity for process to mask.""" + flags = win32con.PROCESS_QUERY_INFORMATION | win32con.PROCESS_SET_INFORMATION + handle = win32api.OpenProcess(flags, 0, pid) + win32process.SetProcessAffinityMask(handle, mask) + class ConsolePanel(wx.Panel): """Panel that displays logging events. @@ -493,6 +510,8 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): self.invalid_times = collections.deque() self.last_rate = 0 # units of khash/s self.autostart = False + self.num_processors = int(os.getenv('NUMBER_OF_PROCESSORS', 1)) + self.affinity_mask = 0 self.server_lbl = wx.StaticText(self, -1, _("Server:")) self.summary_panel = None # SummaryPanel instance if summary open self.server = wx.ComboBox(self, -1, @@ -514,7 +533,10 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): self.device_listbox = wx.ComboBox(self, -1, choices=devices or [_("No OpenCL devices")], style=wx.CB_READONLY) self.flags_lbl = wx.StaticText(self, -1, _("Extra flags:")) self.txt_flags = wx.TextCtrl(self, -1, "") - self.extra_info = wx.StaticText(self, -1, "") + self.extra_info = wx.StaticText(self, -1, "") + self.affinity_lbl = wx.StaticText(self, -1, _("CPU Affinity:")) + self.affinity_chks = [wx.CheckBox(self, label='%d ' % i) + for i in range(self.num_processors)] self.balance_lbl = wx.StaticText(self, -1, _("Balance:")) self.balance_amt = wx.StaticText(self, -1, "0") self.balance_refresh = wx.Button(self, -1, STR_REFRESH_BALANCE) @@ -536,7 +558,7 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): self.device_listbox, self.balance_amt, self.balance_refresh, - self.withdraw] + self.labels + self.txts + self.withdraw] + self.labels + self.txts + self.affinity_chks self.hidden_widgets = [self.extra_info, self.txt_external, self.external_lbl] @@ -557,6 +579,8 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): self.balance_refresh_timer.Bind(wx.EVT_TIMER, self.on_balance_cooldown_tick) self.balance_refresh.Bind(wx.EVT_BUTTON, self.on_balance_refresh) self.withdraw.Bind(wx.EVT_BUTTON, self.on_withdraw) + for chk in self.affinity_chks: + chk.Bind(EVT_CHECKBOX, self.on_affinity_check) self.Bind(EVT_UPDATE_HASHRATE, lambda event: self.update_khash(event.rate)) self.Bind(EVT_UPDATE_ACCEPTED, lambda event: self.update_shares(event.accepted)) self.Bind(EVT_UPDATE_STATUS, lambda event: self.update_status(event.text)) @@ -634,6 +658,18 @@ def is_device_visible(self): NO_DEVICE_SELECTION = ['rpcminer', 'bitcoin-miner'] return not any(d in self.external_path for d in NO_DEVICE_SELECTION) + def on_affinity_check(self, event): + """Set the affinity mask to the selected value.""" + self.affinity_mask = 0 + for i in range(self.num_processors): + is_checked = self.affinity_chks[i].GetValue() + self.affinity_mask += (is_checked << i) + if self.is_mining: + try: + set_process_affinity(self.miner.pid, self.affinity_mask) + except: + pass # TODO: test on Linux + def pause(self): """Pause the miner if we are mining, otherwise do nothing.""" if self.is_mining: @@ -656,6 +692,7 @@ def get_data(self): device=self.device_listbox.GetSelection(), flags=self.txt_flags.GetValue(), autostart=self.autostart, + affinity_mask=self.affinity_mask, balance_auth_token=self.balance_auth_token, external_path=self.external_path) @@ -689,6 +726,10 @@ def set_data(self, data): self.txt_flags.SetValue(data.get('flags', '')) self.autostart = data.get('autostart', False) + self.affinity_mask = data.get('affinity_mask', (1 << self.num_processors) - 1) + for i in range(self.num_processors): + self.affinity_chks[i].SetValue((self.affinity_mask >> i) & 1) + self.txt_external.SetValue(data.get('external_path', '')) # Handle case where they removed devices since last run. @@ -900,8 +941,13 @@ def start_mining(self): self.miner_listener.start() self.is_mining = True self.set_status(STR_STARTING, 1) - self.start.SetLabel(self.get_start_label()) - + self.start.SetLabel(self.get_start_label()) + + try: + set_process_affinity(self.miner.pid, self.affinity_mask) + except: + pass # TODO: test on Linux + def on_close(self): """Prepare to close gracefully.""" self.stop_mining() @@ -1052,6 +1098,8 @@ def set_tooltips(self): add_tooltip(self.txt_username, _("The miner's username.\nMay be different than your account username.\nExample: Kiv.GPU")) add_tooltip(self.txt_pass, _("The miner's password.\nMay be different than your account password.")) add_tooltip(self.txt_flags, _("Extra flags to pass to the miner.\nFor Radeon HD 5xxx series use -v -w128 for best results.\nFor other cards consult the forum.")) + for chk in self.affinity_chks: + add_tooltip(chk, _("CPU cores used for mining.\nUnchecking some cores can reduce high CPU usage in some systems.")) def reset_statistics(self): """Reset our share statistics to zero.""" @@ -1360,6 +1408,15 @@ def layout_device_and_flags(self, row): self.inner_sizer.Add(self.flags_lbl, (row,col), flag=LBL_STYLE) span = (1,1) if device_visible else (1,4) self.inner_sizer.Add(self.txt_flags, (row,col+1), span=span, flag=wx.EXPAND) + + def layout_affinity(self, row): + """Lay out the affinity checkboxes in the specified row.""" + self.inner_sizer.Add(self.affinity_lbl, (row,0)) + + affinity_sizer = wx.BoxSizer(wx.HORIZONTAL) + for chk in self.affinity_chks: + affinity_sizer.Add(chk) + self.inner_sizer.Add(affinity_sizer, (row,1)) def layout_balance(self, row): """Lay out the balance widgets in the specified row.""" @@ -1368,7 +1425,8 @@ def layout_balance(self, row): def layout_finish(self): """Lay out the buttons and fit the sizer to the window.""" - self.frame_sizer.Add(self.inner_sizer, 1, wx.EXPAND | wx.LEFT | wx.RIGHT, 10) + self.frame_sizer.Add(self.inner_sizer, 1, wx.EXPAND | wx.LEFT | wx.RIGHT, 10) + self.frame_sizer.Add(self.advanced_sizer, 0) self.frame_sizer.Add(self.button_sizer, 0, wx.ALIGN_CENTER_HORIZONTAL) self.inner_sizer.AddGrowableCol(1) self.inner_sizer.AddGrowableCol(3) @@ -1376,7 +1434,7 @@ def layout_finish(self): self.button_sizer.Add(btn, 0, BTN_STYLE, 5) self.set_widgets_visible([self.external_lbl, self.txt_external], - self.is_external_miner) + self.is_external_miner) self.SetSizerAndFit(self.frame_sizer) def layout_default(self): @@ -1400,6 +1458,7 @@ def layout_default(self): self.layout_user_and_pass(row=row + 1 + int(is_custom)) self.layout_device_and_flags(row=row + 2 + int(is_custom)) + self.layout_affinity(row=row + 3 + int(is_custom)) self.layout_finish() ############################ @@ -1418,9 +1477,10 @@ def layout_bitpenny(self): self.layout_server_and_website(row=row) self.inner_sizer.Add(self.user_lbl, (row+1,0), flag=LBL_STYLE) self.inner_sizer.Add(self.txt_username, (row+1,1), span=(1,3), flag=wx.EXPAND) - self.layout_device_and_flags(row=row+2) - self.layout_balance(row=row+3) - self.inner_sizer.Add(self.extra_info,(row+4,0), span=(1,4), flag=wx.ALIGN_CENTER_HORIZONTAL) + self.layout_device_and_flags(row=row+2) + self.layout_affinity(row=row+3) + self.layout_balance(row=row+4) + self.inner_sizer.Add(self.extra_info,(row+5,0), span=(1,4), flag=wx.ALIGN_CENTER_HORIZONTAL) self.layout_finish() self.extra_info.SetLabel(_("No registration is required - just enter an address and press Start.")) @@ -1438,7 +1498,8 @@ def layout_slush(self): self.layout_server_and_website(row=row) self.layout_user_and_pass(row=row+1) self.layout_device_and_flags(row=row+2) - self.layout_balance(row=row+3) + self.layout_affinity(row=row+3) + self.layout_balance(row=row+4) self.layout_finish() add_tooltip(self.txt_username, @@ -1458,7 +1519,8 @@ def layout_btcmine(self): self.layout_server_and_website(row=row) self.layout_user_and_pass(row=row+1) self.layout_device_and_flags(row=row+2) - self.layout_balance(row=row+3) + self.layout_affinity(row=row+3) + self.layout_balance(row=row+4) self.layout_finish() add_tooltip(self.txt_username, @@ -1475,7 +1537,8 @@ def layout_deepbit(self): self.layout_server_and_website(row=row) self.layout_user_and_pass(row=row+1) self.layout_device_and_flags(row=row+2) - self.layout_balance(row=row+3) + self.layout_affinity(row=row+3) + self.layout_balance(row=row+4) self.layout_finish() add_tooltip(self.txt_username, _("The e-mail address you registered with.")) From 9d64884b2dd97626ce713993f037abcedeaf1b67 Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 10 Jun 2011 15:19:26 -0300 Subject: [PATCH 111/190] Cleanup and clarify dialog on solo miner launch. --- guiminer.py | 771 ++++++++++++++++++++++++------------------------- guiminer_de.po | 341 +++++++++++----------- guiminer_es.po | 341 +++++++++++----------- guiminer_fr.po | 340 +++++++++++----------- guiminer_hu.po | 341 +++++++++++----------- guiminer_ru.po | 376 +++++++++++++----------- guiminer_zh.po | 339 +++++++++++----------- messages.pot | 332 +++++++++++---------- 8 files changed, 1653 insertions(+), 1528 deletions(-) diff --git a/guiminer.py b/guiminer.py index 9244802..f9e11ea 100644 --- a/guiminer.py +++ b/guiminer.py @@ -47,7 +47,7 @@ def get_module_path(): "German": wx.LANGUAGE_GERMAN, "Hungarian": wx.LANGUAGE_HUNGARIAN, "Spanish": wx.LANGUAGE_SPANISH, - "Russian": wx.LANGUAGE_RUSSIAN, + "Russian": wx.LANGUAGE_RUSSIAN, } LANGUAGES_REVERSE = dict((v,k) for (k,v) in LANGUAGES.items()) @@ -60,29 +60,29 @@ def update_language(new_language): language = new_language if locale: del locale - + locale = wx.Locale(language) if locale.IsOk(): locale.AddCatalogLookupPathPrefix(os.path.join(get_module_path(), "locale")) locale.AddCatalog("guiminer") else: locale = None - + def load_language(): language_config = os.path.join(get_module_path(), 'default_language.ini') - language_data = dict() + language_data = dict() if os.path.exists(language_config): with open(language_config) as f: language_data.update(json.load(f)) - language_str = language_data.get('language', "English") + language_str = language_data.get('language', "English") update_language(LANGUAGES.get(language_str, wx.LANGUAGE_ENGLISH)) def save_language(): language_config = os.path.join(get_module_path(), 'default_language.ini') - language_str = LANGUAGES_REVERSE.get(language) + language_str = LANGUAGES_REVERSE.get(language) with open(language_config, 'w') as f: json.dump(dict(language=language_str), f) - + load_language() ABOUT_TEXT = _( @@ -122,8 +122,8 @@ def save_language(): # Alternate backends that we know how to call SUPPORTED_BACKENDS = [ - "rpcminer-4way.exe", - "rpcminer-cpu.exe", + "rpcminer-4way.exe", + "rpcminer-cpu.exe", "rpcminer-cuda.exe", "rpcminer-opencl.exe", "phoenix.py", @@ -155,7 +155,7 @@ def merge_whitespace(s): def get_opencl_devices(): """Return a list of available OpenCL devices. - + Raises ImportError if OpenCL is not found. Raises IOError if no OpenCL devices are found. """ @@ -165,15 +165,15 @@ def get_opencl_devices(): for i, platform in enumerate(platforms): devices = platform.get_devices() for j, device in enumerate(devices): - device_strings.append('[%d-%d] %s' % + device_strings.append('[%d-%d] %s' % (i, j, merge_whitespace(device.name)[:25])) if len(device_strings) == 0: - raise IOError + raise IOError return device_strings def get_icon_bundle(): """Return the Bitcoin program icon bundle.""" - return wx.IconBundleFromFile("logo.ico", wx.BITMAP_TYPE_ICO) + return wx.IconBundleFromFile("logo.ico", wx.BITMAP_TYPE_ICO) def get_taskbar_icon(): """Return the taskbar icon. @@ -182,7 +182,7 @@ def get_taskbar_icon(): and using nearest neighbour downsampling on the 32x32 image instead.""" ib = get_icon_bundle() return ib.GetIcon((16,16)) - + def mkdir_p(path): """If the directory 'path' doesn't exist, create it. Same as mkdir -p.""" try: @@ -190,7 +190,7 @@ def mkdir_p(path): except OSError as exc: if exc.errno != errno.EEXIST: raise - + def add_tooltip(widget, text): """Add a tooltip to widget with the specified text.""" tooltip = wx.ToolTip(text) @@ -206,11 +206,11 @@ def format_khash(rate): return _("Connecting...") else: return _("%d khash/s") % rate - + def format_balance(amount): """Format a quantity of Bitcoins in BTC.""" return "%.3f BTC" % float(amount) - + def init_logger(): """Set up and return the logging object and custom formatter.""" logger = logging.getLogger("poclbm-gui") @@ -230,54 +230,54 @@ def http_request(hostname, *args): try: conn = httplib.HTTPConnection(hostname) logger.debug(_("Requesting balance: %(request)s"), dict(request=args)) - conn.request(*args) - response = conn.getresponse() + conn.request(*args) + response = conn.getresponse() data = response.read() - logger.debug(_("Server replied: %(status)s, %(data)s"), - dict(status=str(response.status), data=data)) + logger.debug(_("Server replied: %(status)s, %(data)s"), + dict(status=str(response.status), data=data)) return response, data finally: conn.close() - + def get_process_affinity(pid): """Return the affinity mask for the specified process.""" flags = win32con.PROCESS_QUERY_INFORMATION handle = win32api.OpenProcess(flags, 0, pid) return win32process.GetProcessAffinityMask(handle)[0] - + def set_process_affinity(pid, mask): - """Set the affinity for process to mask.""" + """Set the affinity for process to mask.""" flags = win32con.PROCESS_QUERY_INFORMATION | win32con.PROCESS_SET_INFORMATION handle = win32api.OpenProcess(flags, 0, pid) win32process.SetProcessAffinityMask(handle, mask) - + class ConsolePanel(wx.Panel): """Panel that displays logging events. - + Uses with a StreamHandler to log events to a TextCtrl. Thread-safe. """ def __init__(self, parent): wx.Panel.__init__(self, parent, -1) self.parent = parent - + vbox = wx.BoxSizer(wx.VERTICAL) style = wx.TE_MULTILINE | wx.TE_READONLY | wx.HSCROLL self.text = wx.TextCtrl(self, -1, "", style=style) - vbox.Add(self.text, 1, wx.EXPAND) + vbox.Add(self.text, 1, wx.EXPAND) self.SetSizer(vbox) - + self.handler = logging.StreamHandler(self) - + formatter = logging.Formatter("%(asctime)s: %(message)s", "%Y-%m-%d %H:%M:%S") - self.handler.setFormatter(formatter) + self.handler.setFormatter(formatter) logger.addHandler(self.handler) - + def on_focus(self): """On focus, clear the status bar.""" self.parent.statusbar.SetStatusText("", 0) self.parent.statusbar.SetStatusText("", 1) - + def on_close(self): """On closing, stop handling logging events.""" logger.removeHandler(self.handler) @@ -289,14 +289,14 @@ def write(self, text): class SummaryPanel(wx.Panel): """Panel that displays a summary of all miners.""" - + def __init__(self, parent): wx.Panel.__init__(self, parent, -1) self.parent = parent self.timer = wx.Timer(self) self.timer.Start(REFRESH_RATE_MILLIS) self.Bind(wx.EVT_TIMER, self.on_timer) - + flags = wx.ALIGN_CENTER_HORIZONTAL | wx.ALL border = 5 self.column_headers = [ @@ -305,57 +305,57 @@ def __init__(self, parent): (wx.StaticText(self, -1, _("Accepted")), 0, flags, border), (wx.StaticText(self, -1, _("Stale")), 0, flags, border), (wx.StaticText(self, -1, _("Start/Stop")), 0, flags, border), - (wx.StaticText(self, -1, _("Autostart")), 0, flags, border), + (wx.StaticText(self, -1, _("Autostart")), 0, flags, border), ] font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT) font.SetUnderlined(True) for st in self.column_headers: - st[0].SetFont(font) - + st[0].SetFont(font) + self.grid = wx.FlexGridSizer(0, len(self.column_headers), 2, 2) - self.grid.AddMany(self.column_headers) + self.grid.AddMany(self.column_headers) self.add_miners_to_grid() - + self.grid.AddGrowableCol(0) self.grid.AddGrowableCol(1) self.grid.AddGrowableCol(2) self.grid.AddGrowableCol(3) self.SetSizer(self.grid) - + def add_miners_to_grid(self): """Add a summary row for each miner to the summary grid.""" - + # Remove any existing widgets except the column headers. for i in reversed(range(len(self.column_headers), len(self.grid.GetChildren()))): self.grid.Hide(i) self.grid.Remove(i) - + for p in self.parent.profile_panels: - p.clear_summary_widgets() + p.clear_summary_widgets() self.grid.AddMany(p.get_summary_widgets(self)) - + self.grid.Layout() - + def on_close(self): self.timer.Stop() - + def on_timer(self, event=None): """Whenever the timer goes off, fefresh the summary data.""" if self.parent.nb.GetSelection() != self.parent.nb.GetPageIndex(self): - return - + return + for p in self.parent.profile_panels: p.update_summary() - + self.parent.statusbar.SetStatusText("", 0) # TODO: show something total_rate = sum(p.last_rate for p in self.parent.profile_panels - if p.is_mining) + if p.is_mining) if any(p.is_mining for p in self.parent.profile_panels): self.parent.statusbar.SetStatusText(format_khash(total_rate), 1) else: - self.parent.statusbar.SetStatusText("", 1) - + self.parent.statusbar.SetStatusText("", 1) + def on_focus(self): """On focus, show the statusbar text.""" self.on_timer() @@ -370,7 +370,7 @@ class GUIMinerTaskBarIcon(wx.TaskBarIcon): TBMENU_CLOSE = wx.NewId() TBMENU_CHANGE = wx.NewId() TBMENU_REMOVE = wx.NewId() - + def __init__(self, frame): wx.TaskBarIcon.__init__(self) self.frame = frame @@ -394,7 +394,7 @@ def CreatePopupMenu(self): menu.Append(self.TBMENU_RESTORE, _("Restore")) menu.Append(self.TBMENU_CLOSE, _("Close")) return menu - + def on_taskbar_activate(self, evt): if self.frame.IsIconized(): self.frame.Iconize(False) @@ -411,7 +411,7 @@ def on_timer(self, event): if objs: text = '\n'.join(p.get_taskbar_text() for p in objs) self.SetIcon(self.icon, text) - + def on_pause(self, event): """Pause or resume the currently running miners.""" self.is_paused = event.Checked() @@ -420,23 +420,23 @@ def on_pause(self, event): miner.pause() else: miner.resume() - - + + class MinerListenerThread(threading.Thread): LINES = [ - (r"Target =|average rate|Sending to server|found hash!", - lambda _: None), # Just ignore lines like these - (r"accepted|\"result\":\s*true", + (r"Target =|average rate|Sending to server|found hash!", + lambda _: None), # Just ignore lines like these + (r"accepted|\"result\":\s*true", lambda _: UpdateAcceptedEvent(accepted=True)), - (r"invalid|stale", lambda _: + (r"invalid|stale", lambda _: UpdateAcceptedEvent(accepted=False)), - (r"(\d+)\s*khash/s", lambda match: + (r"(\d+)\s*khash/s", lambda match: UpdateHashRateEvent(rate=int(match.group(1)))), (r"(\d+\.\d+)\s*Mhash/s", lambda match: UpdateHashRateEvent(rate=float(match.group(1)) * 1000)), - (r"(\d+)\s*Mhash/s", lambda match: - UpdateHashRateEvent(rate=int(match.group(1)) * 1000)), - (r"checking (\d+)", lambda _: + (r"(\d+)\s*Mhash/s", lambda match: + UpdateHashRateEvent(rate=int(match.group(1)) * 1000)), + (r"checking (\d+)", lambda _: UpdateSoloCheckEvent()), ] @@ -446,10 +446,10 @@ def __init__(self, parent, miner): self.parent = parent self.parent_name = parent.name self.miner = miner - + def run(self): logger.info(_('Listener for "%s" started') % self.parent_name) - while not self.shutdown_event.is_set(): + while not self.shutdown_event.is_set(): line = self.miner.stdout.readline().strip() #logger.debug("Line: %s", line) if not line: continue @@ -463,25 +463,25 @@ def run(self): else: # Possible error or new message, just pipe it through event = UpdateStatusEvent(text=line) - logger.info(_('Listener for "%(name)s": %(line)s'), + logger.info(_('Listener for "%(name)s": %(line)s'), dict(name=self.parent_name, line=line)) wx.PostEvent(self.parent, event) logger.info(_('Listener for "%s" shutting down'), self.parent_name) - + class PhoenixListenerThread(MinerListenerThread): LINES = [ - (r"Result: .* accepted", + (r"Result: .* accepted", lambda _: UpdateAcceptedEvent(accepted=True)), - (r"Result: .* rejected", lambda _: - UpdateAcceptedEvent(accepted=False)), + (r"Result: .* rejected", lambda _: + UpdateAcceptedEvent(accepted=False)), (r"(\d+)\.?(\d*) Khash/sec", lambda match: - UpdateHashRateEvent(rate=float(match.group(1)+'.'+match.group(2)))), + UpdateHashRateEvent(rate=float(match.group(1)+'.'+match.group(2)))), (r"(\d+)\.?(\d*) Mhash/sec", lambda match: UpdateHashRateEvent(rate=float(match.group(1)+'.'+match.group(2)) * 1000)), - (r"Currently on block", - lambda _: None), # Just ignore lines like these - ] - + (r"Currently on block", + lambda _: None), # Just ignore lines like these + ] + class MinerTab(wx.Panel): """A tab in the GUI representing a miner instance. @@ -496,13 +496,13 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): wx.Panel.__init__(self, parent, id) self.parent = parent self.servers = servers - self.defaults = defaults + self.defaults = defaults self.statusbar = statusbar self.is_mining = False self.is_paused = False self.is_possible_error = False self.miner = None # subprocess.Popen instance when mining - self.miner_listener = None # MinerListenerThread when mining + self.miner_listener = None # MinerListenerThread when mining self.solo_blocks_found = 0 self.accepted_shares = 0 # shares for pool, diff1 hashes for solo self.accepted_times = collections.deque() @@ -513,9 +513,9 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): self.num_processors = int(os.getenv('NUMBER_OF_PROCESSORS', 1)) self.affinity_mask = 0 self.server_lbl = wx.StaticText(self, -1, _("Server:")) - self.summary_panel = None # SummaryPanel instance if summary open - self.server = wx.ComboBox(self, -1, - choices=[s['name'] for s in servers], + self.summary_panel = None # SummaryPanel instance if summary open + self.server = wx.ComboBox(self, -1, + choices=[s['name'] for s in servers], style=wx.CB_READONLY) self.website_lbl = wx.StaticText(self, -1, _("Website:")) self.website = hyperlink.HyperLinkCtrl(self, -1, "") @@ -531,64 +531,64 @@ def __init__(self, parent, id, devices, servers, defaults, statusbar, data): self.txt_pass = wx.TextCtrl(self, -1, "", style=wx.TE_PASSWORD) self.device_lbl = wx.StaticText(self, -1, _("Device:")) self.device_listbox = wx.ComboBox(self, -1, choices=devices or [_("No OpenCL devices")], style=wx.CB_READONLY) - self.flags_lbl = wx.StaticText(self, -1, _("Extra flags:")) + self.flags_lbl = wx.StaticText(self, -1, _("Extra flags:")) self.txt_flags = wx.TextCtrl(self, -1, "") self.extra_info = wx.StaticText(self, -1, "") self.affinity_lbl = wx.StaticText(self, -1, _("CPU Affinity:")) - self.affinity_chks = [wx.CheckBox(self, label='%d ' % i) - for i in range(self.num_processors)] + self.affinity_chks = [wx.CheckBox(self, label='%d ' % i) + for i in range(self.num_processors)] self.balance_lbl = wx.StaticText(self, -1, _("Balance:")) self.balance_amt = wx.StaticText(self, -1, "0") self.balance_refresh = wx.Button(self, -1, STR_REFRESH_BALANCE) self.balance_refresh_timer = wx.Timer() - self.withdraw = wx.Button(self, -1, _("Withdraw")) + self.withdraw = wx.Button(self, -1, _("Withdraw")) self.balance_cooldown_seconds = 0 self.balance_auth_token = "" - + self.labels = [self.server_lbl, self.website_lbl, self.host_lbl, self.port_lbl, self.user_lbl, self.pass_lbl, - self.device_lbl, self.flags_lbl, + self.device_lbl, self.flags_lbl, self.balance_lbl] - self.txts = [self.txt_host, self.txt_port, + self.txts = [self.txt_host, self.txt_port, self.txt_username, self.txt_pass, self.txt_flags] self.all_widgets = [self.server, self.website, self.device_listbox, self.balance_amt, - self.balance_refresh, + self.balance_refresh, self.withdraw] + self.labels + self.txts + self.affinity_chks - self.hidden_widgets = [self.extra_info, - self.txt_external, + self.hidden_widgets = [self.extra_info, + self.txt_external, self.external_lbl] - - self.start = wx.Button(self, -1, STR_START_MINING) + + self.start = wx.Button(self, -1, STR_START_MINING) self.device_listbox.SetSelection(0) self.server.SetStringSelection(self.defaults.get('default_server')) - + self.set_data(data) for txt in self.txts: txt.Bind(wx.EVT_KEY_UP, self.check_if_modified) self.device_listbox.Bind(wx.EVT_COMBOBOX, self.check_if_modified) - + self.start.Bind(wx.EVT_BUTTON, self.toggle_mining) self.server.Bind(wx.EVT_COMBOBOX, self.on_select_server) self.balance_refresh_timer.Bind(wx.EVT_TIMER, self.on_balance_cooldown_tick) self.balance_refresh.Bind(wx.EVT_BUTTON, self.on_balance_refresh) self.withdraw.Bind(wx.EVT_BUTTON, self.on_withdraw) for chk in self.affinity_chks: - chk.Bind(EVT_CHECKBOX, self.on_affinity_check) + chk.Bind(wx.EVT_CHECKBOX, self.on_affinity_check) self.Bind(EVT_UPDATE_HASHRATE, lambda event: self.update_khash(event.rate)) self.Bind(EVT_UPDATE_ACCEPTED, lambda event: self.update_shares(event.accepted)) self.Bind(EVT_UPDATE_STATUS, lambda event: self.update_status(event.text)) self.Bind(EVT_UPDATE_SOLOCHECK, lambda event: self.update_solo()) - self.update_statusbar() + self.update_statusbar() self.clear_summary_widgets() - @property + @property def last_update_time(self): """Return the local time of the last accepted share.""" if self.accepted_times: @@ -599,7 +599,7 @@ def last_update_time(self): def server_config(self): hostname = self.txt_host.GetValue() return self.get_server_by_field(hostname, 'host') - + @property def is_solo(self): """Return True if this miner is configured for solo mining.""" @@ -614,7 +614,7 @@ def is_modified(self): def external_path(self): """Return the path to an external miner, or "" if none is present.""" return self.txt_external.GetValue() - + @property def is_external_miner(self): """Return True if this miner has an external path configured.""" @@ -624,10 +624,10 @@ def is_external_miner(self): def host_with_http_prefix(self): """Return the host address, with http:// prepended if needed.""" host = self.txt_host.GetValue() - if not host.startswith("http://"): + if not host.startswith("http://"): host = "http://" + host return host - + @property def host_without_http_prefix(self): """Return the host address, with http:// stripped off if needed.""" @@ -635,7 +635,7 @@ def host_without_http_prefix(self): if host.startswith("http://"): return host[len('http://'):] return host - + @property def device_index(self): """Return the index of the currently selected OpenCL device.""" @@ -643,7 +643,7 @@ def device_index(self): match = re.search(r'\[(\d+)-(\d+)\]', s) assert match is not None return int(match.group(2)) - + @property def platform_index(self): """Return the index of the currently selected OpenCL platform.""" @@ -651,12 +651,12 @@ def platform_index(self): match = re.search(r'\[(\d+)-(\d+)\]', s) assert match is not None return int(match.group(1)) - + @property def is_device_visible(self): """Return True if we are using a backend with device selection.""" NO_DEVICE_SELECTION = ['rpcminer', 'bitcoin-miner'] - return not any(d in self.external_path for d in NO_DEVICE_SELECTION) + return not any(d in self.external_path for d in NO_DEVICE_SELECTION) def on_affinity_check(self, event): """Set the affinity mask to the selected value.""" @@ -672,18 +672,18 @@ def on_affinity_check(self, event): def pause(self): """Pause the miner if we are mining, otherwise do nothing.""" - if self.is_mining: + if self.is_mining: self.stop_mining() self.is_paused = True - + def resume(self): """Resume the miner if we are paused, otherwise do nothing.""" - if self.is_paused: + if self.is_paused: self.start_mining() self.is_paused = False def get_data(self): - """Return a dict of our profile data.""" + """Return a dict of our profile data.""" return dict(name=self.name, hostname=self.txt_host.GetValue(), port=self.txt_port.GetValue(), @@ -702,45 +702,45 @@ def set_data(self, data): default_server_config = self.get_server_by_field( self.defaults['default_server'], 'name') self.name = (data.get('name') or _('Default')) - + # Backwards compatibility: hostname key used to be called server. # We only save out hostname now but accept server from old INI files. hostname = (data.get('hostname') or data.get('server') or default_server_config['host']) self.txt_host.SetValue(hostname) - + self.server.SetStringSelection(self.server_config.get('name', "Other")) - + self.txt_username.SetValue( - data.get('username') or + data.get('username') or self.defaults.get('default_username', '')) - + self.txt_pass.SetValue( data.get('password') or self.defaults.get('default_password', '')) - + self.txt_port.SetValue(str( data.get('port') or self.server_config.get('port', 8332))) - + self.txt_flags.SetValue(data.get('flags', '')) self.autostart = data.get('autostart', False) self.affinity_mask = data.get('affinity_mask', (1 << self.num_processors) - 1) for i in range(self.num_processors): self.affinity_chks[i].SetValue((self.affinity_mask >> i) & 1) - - self.txt_external.SetValue(data.get('external_path', '')) + + self.txt_external.SetValue(data.get('external_path', '')) # Handle case where they removed devices since last run. device_index = data.get('device', None) if device_index is not None and device_index < self.device_listbox.GetCount(): self.device_listbox.SetSelection(device_index) - + self.change_server(self.server_config) - - self.balance_auth_token = data.get('balance_auth_token', '') - + + self.balance_auth_token = data.get('balance_auth_token', '') + def clear_summary_widgets(self): """Release all our summary widgets.""" self.summary_name = None @@ -749,19 +749,19 @@ def clear_summary_widgets(self): self.summary_shares_stale = None self.summary_start = None self.summary_autostart = None - + def get_start_stop_state(self): """Return appropriate text for the start/stop button.""" return _("Stop") if self.is_mining else _("Start") - + def get_start_label(self): return STR_STOP_MINING if self.is_mining else STR_START_MINING - + def update_summary(self): """Update our summary fields if possible.""" if not self.summary_panel: return - + self.summary_name.SetLabel(self.name) if self.is_paused: text = STR_PAUSED @@ -770,28 +770,28 @@ def update_summary(self): elif self.is_possible_error: text = _("Connection problems") else: - text = format_khash(self.last_rate) + text = format_khash(self.last_rate) self.summary_status.SetLabel(text) - + self.summary_shares_accepted.SetLabel("%d (%d)" % (self.accepted_shares, len(self.accepted_times))) - - if self.is_solo: + + if self.is_solo: self.summary_shares_invalid.SetLabel("-") else: self.summary_shares_invalid.SetLabel("%d (%d)" % - (self.invalid_shares, len(self.invalid_times))) + (self.invalid_shares, len(self.invalid_times))) self.summary_start.SetLabel(self.get_start_stop_state()) self.summary_autostart.SetValue(self.autostart) - self.summary_panel.grid.Layout() - + self.summary_panel.grid.Layout() + def get_summary_widgets(self, summary_panel): """Return a list of summary widgets suitable for sizer.AddMany.""" self.summary_panel = summary_panel self.summary_name = wx.StaticText(summary_panel, -1, self.name) self.summary_name.Bind(wx.EVT_LEFT_UP, self.show_this_panel) - + self.summary_status = wx.StaticText(summary_panel, -1, STR_STOPPED) self.summary_shares_accepted = wx.StaticText(summary_panel, -1, "0") self.summary_shares_invalid = wx.StaticText(summary_panel, -1, "0") @@ -804,7 +804,7 @@ def get_summary_widgets(self, summary_panel): (self.summary_name, 0, wx.ALIGN_CENTER_HORIZONTAL), (self.summary_status, 0, wx.ALIGN_CENTER_HORIZONTAL, 0), (self.summary_shares_accepted, 0, wx.ALIGN_CENTER_HORIZONTAL, 0), - (self.summary_shares_invalid, 0, wx.ALIGN_CENTER_HORIZONTAL, 0), + (self.summary_shares_invalid, 0, wx.ALIGN_CENTER_HORIZONTAL, 0), (self.summary_start, 0, wx.ALIGN_CENTER, 0), (self.summary_autostart, 0, wx.ALIGN_CENTER, 0) ] @@ -819,17 +819,17 @@ def toggle_autostart(self, event): def toggle_mining(self, event): """Stop or start the miner.""" if self.is_mining: - self.stop_mining() + self.stop_mining() else: - self.start_mining() + self.start_mining() self.update_summary() ############################# # Begin backend specific code def configure_subprocess_poclbm(self): """Set up the command line for poclbm.""" - folder = get_module_path() - if USE_MOCK: + folder = get_module_path() + if USE_MOCK: executable = "python mockBitcoinMiner.py" else: if hasattr(sys, 'frozen'): @@ -850,9 +850,9 @@ def configure_subprocess_poclbm(self): def configure_subprocess_rpcminer(self): """Set up the command line for rpcminer. - + The hostname must start with http:// for these miners. - """ + """ cmd = "%s -user=%s -password=%s -url=%s:%s %s" % ( self.external_path, self.txt_username.GetValue(), @@ -862,10 +862,10 @@ def configure_subprocess_rpcminer(self): self.txt_flags.GetValue() ) return cmd, os.path.dirname(self.external_path) - + def configure_subprocess_ufasoft(self): """Set up the command line for ufasoft's SSE2 miner. - + The hostname must start with http:// for these miners. """ cmd = "%s -u %s -p %s -o %s:%s %s" % ( @@ -876,7 +876,7 @@ def configure_subprocess_ufasoft(self): self.txt_port.GetValue(), self.txt_flags.GetValue()) return cmd, os.path.dirname(self.external_path) - + def configure_subprocess_phoenix(self): """Set up the command line for phoenix miner.""" path = self.external_path @@ -893,21 +893,21 @@ def configure_subprocess_phoenix(self): self.device_index, self.txt_flags.GetValue()) return cmd, os.path.dirname(self.external_path) - + # End backend specific code ########################### - + def start_mining(self): """Launch a miner subprocess and attach a MinerListenerThread.""" self.is_paused = False - + # Avoid showing a console window when frozen try: import win32process except ImportError: flags = 0 else: flags = win32process.CREATE_NO_WINDOW # Determine what command line arguments to use - + listener_cls = MinerListenerThread if not self.is_external_miner: conf_func = self.configure_subprocess_poclbm @@ -918,17 +918,17 @@ def start_mining(self): elif "phoenix" in self.external_path: conf_func = self.configure_subprocess_phoenix listener_cls = PhoenixListenerThread - + else: - raise ValueError # TODO: handle unrecognized miner + raise ValueError # TODO: handle unrecognized miner cmd, cwd = conf_func() - + # for ufasoft: # redirect stderr to stdout # use universal_newlines to catch the \r output on Mhash/s lines try: logger.debug(_('Running command: ') + cmd) - self.miner = subprocess.Popen(cmd, cwd=cwd, + self.miner = subprocess.Popen(cmd, cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, @@ -942,17 +942,17 @@ def start_mining(self): self.is_mining = True self.set_status(STR_STARTING, 1) self.start.SetLabel(self.get_start_label()) - + try: set_process_affinity(self.miner.pid, self.affinity_mask) except: pass # TODO: test on Linux - + def on_close(self): """Prepare to close gracefully.""" self.stop_mining() self.balance_refresh_timer.Stop() - + def stop_mining(self): """Terminate the poclbm process if able and its associated listener.""" if self.miner is not None: @@ -965,12 +965,12 @@ def stop_mining(self): self.miner = None if self.miner_listener is not None: self.miner_listener.shutdown_event.set() - self.miner_listener = None + self.miner_listener = None self.is_mining = False self.is_paused = False - self.set_status(STR_STOPPED, 1) + self.set_status(STR_STOPPED, 1) self.start.SetLabel(self.get_start_label()) - + def update_khash(self, rate): """Update our rate according to a report from the listener thread. @@ -987,7 +987,7 @@ def update_statusbar(self): """Show the shares or equivalent on the statusbar.""" if self.is_solo: text = _("Difficulty 1 hashes: %(nhashes)d %(update_time)s") % \ - dict(nhashes=self.accepted_shares, + dict(nhashes=self.accepted_shares, update_time=self.format_last_update_time()) if self.solo_blocks_found > 0: block_text = _("Blocks: %d, ") % self.solo_blocks_found @@ -995,13 +995,13 @@ def update_statusbar(self): else: text = _("Shares: %d accepted") % self.accepted_shares if self.invalid_shares > 0: - text += _(", %d stale/invalid") % self.invalid_shares + text += _(", %d stale/invalid") % self.invalid_shares text += " %s" % self.format_last_update_time() - self.set_status(text, 0) + self.set_status(text, 0) def update_last_time(self, accepted): """Set the last update time to now (in local time).""" - + now = time.time() if accepted: self.accepted_times.append(now) @@ -1010,8 +1010,8 @@ def update_last_time(self, accepted): else: self.invalid_times.append(now) while now - self.invalid_times[0] > SAMPLE_TIME_SECS: - self.invalid_times.popleft() - + self.invalid_times.popleft() + def format_last_update_time(self): """Format last update time for display.""" time_fmt = '%I:%M:%S%p' @@ -1060,20 +1060,20 @@ def on_focus(self): def get_taskbar_text(self): """Return text for the hover state of the taskbar.""" rate = format_khash(self.last_rate) if self.is_mining else STR_STOPPED - return "%s: %s" % (self.name, rate) + return "%s: %s" % (self.name, rate) def update_solo(self): """Update our easy hashes with a report from the listener thread.""" self.accepted_shares += 1 self.update_last_time(True) self.update_statusbar() - + def on_select_server(self, event): """Update our info in response to a new server choice.""" new_server_name = self.server.GetValue() - new_server = self.get_server_by_field(new_server_name, 'name') + new_server = self.get_server_by_field(new_server_name, 'name') self.change_server(new_server) - + def get_server_by_field(self, target_val, field): """Return the first server dict with the specified val, or {}.""" for s in self.servers: @@ -1087,7 +1087,7 @@ def set_widgets_visible(self, widgets, show=False): if show: w.Show() else: - w.Hide() + w.Hide() def set_tooltips(self): add_tooltip(self.server, _("Server to connect to. Different servers have different fees and features.\nCheck their websites for full information.")) @@ -1100,7 +1100,7 @@ def set_tooltips(self): add_tooltip(self.txt_flags, _("Extra flags to pass to the miner.\nFor Radeon HD 5xxx series use -v -w128 for best results.\nFor other cards consult the forum.")) for chk in self.affinity_chks: add_tooltip(chk, _("CPU cores used for mining.\nUnchecking some cores can reduce high CPU usage in some systems.")) - + def reset_statistics(self): """Reset our share statistics to zero.""" self.solo_blocks_found = 0 @@ -1109,31 +1109,31 @@ def reset_statistics(self): self.invalid_shares = 0 self.invalid_times.clear() self.update_statusbar() - + def change_server(self, new_server): """Change the server to new_server, updating fields as needed.""" self.reset_statistics() - + # Set defaults before we do server specific code self.set_tooltips() self.set_widgets_visible(self.all_widgets, True) - self.withdraw.Disable() - + self.withdraw.Disable() + url = new_server.get('url', 'n/a') self.website.SetLabel(url) self.website.SetURL(url) - + # Invalidate any previous auth token since it won't be valid for the # new server. - self.balance_auth_token = "" + self.balance_auth_token = "" if 'host' in new_server: self.txt_host.SetValue(new_server['host']) if 'port' in new_server: self.txt_port.SetValue(str(new_server['port'])) - - - # Call server specific code. + + + # Call server specific code. host = new_server.get('host', "").lower() if host == "mining.bitcoin.cz": self.layout_slush() elif host == "bitpenny.dyndns.biz": self.layout_bitpenny() @@ -1141,13 +1141,13 @@ def change_server(self, new_server): elif host == "btcmine.com": self.layout_btcmine() elif host == "btcguild.com": self.layout_btcguild() else: self.layout_default() - + self.Layout() - + self.update_tab_name() - + def on_balance_cooldown_tick(self, event=None): - """Each second, decrement the cooldown for refreshing balance.""" + """Each second, decrement the cooldown for refreshing balance.""" self.balance_cooldown_seconds -= 1 self.balance_refresh.SetLabel("%d..." % self.balance_cooldown_seconds) if self.balance_cooldown_seconds <= 0: @@ -1157,7 +1157,7 @@ def on_balance_cooldown_tick(self, event=None): def require_auth_token(self): """Prompt the user for an auth token if they don't have one already. - + Set the result to self.balance_auth_token and return None. """ if self.balance_auth_token: @@ -1169,22 +1169,22 @@ def require_auth_token(self): if result == wx.ID_CANCEL: return self.balance_auth_token = dialog.get_value() # TODO: validate token? - + def is_auth_token_rejected(self, response): """If the server rejected our token, reset auth_token and return True. - + Otherwise, return False. """ if response.status in [401, 403]: # 401 Unauthorized or 403 Forbidden # Token rejected by the server - reset their token so they'll be - # prompted again - self.balance_auth_token = "" + # prompted again + self.balance_auth_token = "" return True return False - + def request_balance_get(self, balance_auth_token): """Request our balance from the server via HTTP GET and auth token. - + This method should be run in its own thread. """ response, data = http_request( @@ -1199,26 +1199,26 @@ def request_balance_get(self, balance_auth_token): else: try: info = json.loads(data) - confirmed = (info.get('confirmed_reward') or + confirmed = (info.get('confirmed_reward') or info.get('confirmed') or info.get('user', {}).get('confirmed_rewards') or 0) - unconfirmed = (info.get('unconfirmed_reward') or + unconfirmed = (info.get('unconfirmed_reward') or info.get('unconfirmed') or info.get('user', {}).get('unconfirmed_rewards') or 0) if self.server_config.get('host') == "pit.deepbit.net": - ipa = info.get('ipa', False) + ipa = info.get('ipa', False) self.withdraw.Enable(ipa) - + data = _("%s confirmed") % format_balance(confirmed) if unconfirmed > 0: data += _(", %s unconfirmed") % format_balance(unconfirmed) except: # TODO: what exception here? data = _("Bad response from server.") - - wx.CallAfter(self.balance_amt.SetLabel, data) - + + wx.CallAfter(self.balance_amt.SetLabel, data) + def on_withdraw(self, event): self.withdraw.Disable() host = self.server_config.get('host') @@ -1226,13 +1226,13 @@ def on_withdraw(self, event): self.withdraw_bitpenny() elif host == 'pit.deepbit.net': self.withdraw_deepbit() - + def on_balance_refresh(self, event=None): """Refresh the miner's balance from the server.""" host = self.server_config.get("host") - - HOSTS_REQUIRING_AUTH_TOKEN = ["mining.bitcoin.cz", - "btcmine.com", + + HOSTS_REQUIRING_AUTH_TOKEN = ["mining.bitcoin.cz", + "btcmine.com", "pit.deepbit.net", "btcguild.com"] if host in HOSTS_REQUIRING_AUTH_TOKEN: @@ -1242,42 +1242,42 @@ def on_balance_refresh(self, event=None): try: self.balance_auth_token.decode('ascii') except UnicodeDecodeError: - return # Invalid characters in auth token + return # Invalid characters in auth token self.http_thread = threading.Thread( - target=self.request_balance_get, + target=self.request_balance_get, args=(self.balance_auth_token,)) self.http_thread.start() elif host == 'bitpenny.dyndns.biz': self.http_thread = threading.Thread( target=self.request_payout_bitpenny, args=(False,)) - self.http_thread.start() - + self.http_thread.start() + self.balance_refresh.Disable() self.balance_cooldown_seconds = 10 self.balance_refresh_timer.Start(1000) - + ################################# # Begin server specific HTTP code - + def withdraw_deepbit(self): """Launch a thread to withdraw from deepbit.""" self.require_auth_token() if not self.balance_auth_token: # User refused to provide token return self.http_thread = threading.Thread( - target=self.request_payout_deepbit, + target=self.request_payout_deepbit, args=(self.balance_auth_token,)) self.http_thread.start() - + def withdraw_bitpenny(self): self.http_thread = threading.Thread( target=self.request_payout_bitpenny, args=(True,)) - self.http_thread.start() # TODO: look at aliasing of this variable - + self.http_thread.start() # TODO: look at aliasing of this variable + def request_payout_deepbit(self, balance_auth_token): """Request payout from deepbit's server via HTTP POST.""" post_params = dict(id=1, - method="request_payout") + method="request_payout") response, data = http_request( self.server_config['balance_host'], "POST", @@ -1291,15 +1291,15 @@ def request_payout_deepbit(self, balance_auth_token): elif not data: data = STR_CONNECTION_ERROR else: - data = _("Withdraw OK") + data = _("Withdraw OK") wx.CallAfter(self.on_balance_received, data) def request_payout_bitpenny(self, withdraw): """Request our balance from BitPenny via HTTP POST. - + If withdraw is True, also request a withdrawal. """ - post_params = dict(a=self.txt_username.GetValue(), w=int(withdraw)) + post_params = dict(a=self.txt_username.GetValue(), w=int(withdraw)) response, data = http_request( self.server_config['balance_host'], "POST", @@ -1312,9 +1312,9 @@ def request_payout_bitpenny(self, withdraw): elif not data: data = STR_CONNECTION_ERROR elif withdraw: - data = _("Withdraw OK") + data = _("Withdraw OK") wx.CallAfter(self.on_balance_received, data) - + def on_balance_received(self, balance): """Set the balance in the GUI.""" try: @@ -1327,40 +1327,40 @@ def on_balance_received(self, balance): amt_str = format_balance(amt) self.balance_amt.SetLabel(amt_str) self.Layout() - + # End server specific HTTP code - ############################### - + ############################### + def set_name(self, name): """Set the label on this miner's tab to name.""" self.name = name if self.summary_name: self.summary_name.SetLabel(self.name) self.update_tab_name() - + def update_tab_name(self): """Update the tab name to reflect modified status.""" name = self.name if self.is_modified: - name += "*" + name += "*" page = self.parent.GetPageIndex(self) if page != -1: self.parent.SetPageText(page, name) - + def check_if_modified(self, event): """Update the title of the tab to have an asterisk if we are modified.""" self.update_tab_name() event.Skip() - + def on_saved(self): """Update our last data after a save.""" self.last_data = self.get_data() self.update_tab_name() - + def layout_init(self): """Create the sizers for this frame and set up the external text. - - Return the lowest row that is available. + + Return the lowest row that is available. """ self.frame_sizer = wx.BoxSizer(wx.VERTICAL) self.frame_sizer.Add((20, 10), 0, wx.EXPAND, 0) @@ -1372,76 +1372,75 @@ def layout_init(self): self.inner_sizer.Add(self.txt_external, (row,1), span=(1,3), flag=wx.EXPAND) row += 1 return row - + def layout_server_and_website(self, row): """Lay out the server and website widgets in the specified row.""" self.inner_sizer.Add(self.server_lbl, (row,0), flag=LBL_STYLE) - self.inner_sizer.Add(self.server, (row,1), flag=wx.EXPAND) + self.inner_sizer.Add(self.server, (row,1), flag=wx.EXPAND) self.inner_sizer.Add(self.website_lbl, (row,2), flag=LBL_STYLE) - self.inner_sizer.Add(self.website, (row,3), flag=wx.ALIGN_CENTER_VERTICAL) - + self.inner_sizer.Add(self.website, (row,3), flag=wx.ALIGN_CENTER_VERTICAL) + def layout_host_and_port(self, row): """Lay out the host and port widgets in the specified row.""" self.inner_sizer.Add(self.host_lbl, (row,0), flag=LBL_STYLE) self.inner_sizer.Add(self.txt_host, (row,1), flag=wx.EXPAND) self.inner_sizer.Add(self.port_lbl, (row,2), flag=LBL_STYLE) self.inner_sizer.Add(self.txt_port, (row,3), flag=wx.EXPAND) - + def layout_user_and_pass(self, row): """Lay out the user and pass widgets in the specified row.""" self.inner_sizer.Add(self.user_lbl, (row,0), flag=LBL_STYLE) self.inner_sizer.Add(self.txt_username, (row,1), flag=wx.EXPAND) self.inner_sizer.Add(self.pass_lbl, (row,2), flag=LBL_STYLE) self.inner_sizer.Add(self.txt_pass, (row,3), flag=wx.EXPAND) - + def layout_device_and_flags(self, row): """Lay out the device and flags widgets in the specified row. - - Hide the device dropdown if RPCMiner is present since it doesn't use it. + + Hide the device dropdown if RPCMiner is present since it doesn't use it. """ - device_visible = self.is_device_visible - self.set_widgets_visible([self.device_lbl, self.device_listbox], device_visible) + device_visible = self.is_device_visible + self.set_widgets_visible([self.device_lbl, self.device_listbox], device_visible) if device_visible: self.inner_sizer.Add(self.device_lbl, (row,0), flag=LBL_STYLE) self.inner_sizer.Add(self.device_listbox, (row,1), flag=wx.EXPAND) col = 2 * (device_visible) self.inner_sizer.Add(self.flags_lbl, (row,col), flag=LBL_STYLE) - span = (1,1) if device_visible else (1,4) + span = (1,1) if device_visible else (1,4) self.inner_sizer.Add(self.txt_flags, (row,col+1), span=span, flag=wx.EXPAND) - + def layout_affinity(self, row): """Lay out the affinity checkboxes in the specified row.""" self.inner_sizer.Add(self.affinity_lbl, (row,0)) - + affinity_sizer = wx.BoxSizer(wx.HORIZONTAL) for chk in self.affinity_chks: affinity_sizer.Add(chk) - self.inner_sizer.Add(affinity_sizer, (row,1)) - + self.inner_sizer.Add(affinity_sizer, (row,1)) + def layout_balance(self, row): """Lay out the balance widgets in the specified row.""" self.inner_sizer.Add(self.balance_lbl, (row,0), flag=LBL_STYLE) - self.inner_sizer.Add(self.balance_amt, (row,1)) - + self.inner_sizer.Add(self.balance_amt, (row,1)) + def layout_finish(self): """Lay out the buttons and fit the sizer to the window.""" self.frame_sizer.Add(self.inner_sizer, 1, wx.EXPAND | wx.LEFT | wx.RIGHT, 10) - self.frame_sizer.Add(self.advanced_sizer, 0) - self.frame_sizer.Add(self.button_sizer, 0, wx.ALIGN_CENTER_HORIZONTAL) + self.frame_sizer.Add(self.button_sizer, 0, wx.ALIGN_CENTER_HORIZONTAL) self.inner_sizer.AddGrowableCol(1) - self.inner_sizer.AddGrowableCol(3) + self.inner_sizer.AddGrowableCol(3) for btn in [self.start, self.balance_refresh, self.withdraw]: self.button_sizer.Add(btn, 0, BTN_STYLE, 5) - + self.set_widgets_visible([self.external_lbl, self.txt_external], - self.is_external_miner) - self.SetSizerAndFit(self.frame_sizer) - + self.is_external_miner) + self.SetSizerAndFit(self.frame_sizer) + def layout_default(self): """Lay out a default miner with no custom changes.""" self.user_lbl.SetLabel(STR_USERNAME) - - self.set_widgets_visible(self.hidden_widgets, False) + + self.set_widgets_visible(self.hidden_widgets, False) self.set_widgets_visible([self.balance_lbl, self.balance_amt, self.balance_refresh, @@ -1453,47 +1452,47 @@ def layout_default(self): if is_custom: self.layout_host_and_port(row=row+1) else: - self.set_widgets_visible([self.host_lbl, self.txt_host, + self.set_widgets_visible([self.host_lbl, self.txt_host, self.port_lbl, self.txt_port], False) - + self.layout_user_and_pass(row=row + 1 + int(is_custom)) self.layout_device_and_flags(row=row + 2 + int(is_custom)) self.layout_affinity(row=row + 3 + int(is_custom)) self.layout_finish() - - ############################ + + ############################ # Begin server specific code def layout_bitpenny(self): """BitPenny doesn't require registration or a password. - + The username is just their receiving address. """ invisible = [self.txt_pass, self.txt_host, self.txt_port, self.pass_lbl, self.host_lbl, self.port_lbl] self.set_widgets_visible(invisible, False) self.set_widgets_visible([self.extra_info], True) - + row = self.layout_init() - self.layout_server_and_website(row=row) + self.layout_server_and_website(row=row) self.inner_sizer.Add(self.user_lbl, (row+1,0), flag=LBL_STYLE) - self.inner_sizer.Add(self.txt_username, (row+1,1), span=(1,3), flag=wx.EXPAND) + self.inner_sizer.Add(self.txt_username, (row+1,1), span=(1,3), flag=wx.EXPAND) self.layout_device_and_flags(row=row+2) - self.layout_affinity(row=row+3) + self.layout_affinity(row=row+3) self.layout_balance(row=row+4) self.inner_sizer.Add(self.extra_info,(row+5,0), span=(1,4), flag=wx.ALIGN_CENTER_HORIZONTAL) self.layout_finish() - + self.extra_info.SetLabel(_("No registration is required - just enter an address and press Start.")) self.txt_pass.SetValue('poclbm-gui') self.user_lbl.SetLabel(_("Address:")) add_tooltip(self.txt_username, - _("Your receiving address for Bitcoins.\nE.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc")) - + _("Your receiving address for Bitcoins.\nE.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc")) + def layout_slush(self): """Slush's pool uses a separate username for each miner.""" - self.set_widgets_visible([self.host_lbl, self.txt_host, + self.set_widgets_visible([self.host_lbl, self.txt_host, self.port_lbl, self.txt_port, - self.withdraw, self.extra_info], False) + self.withdraw, self.extra_info], False) row = self.layout_init() self.layout_server_and_website(row=row) self.layout_user_and_pass(row=row+1) @@ -1501,27 +1500,27 @@ def layout_slush(self): self.layout_affinity(row=row+3) self.layout_balance(row=row+4) self.layout_finish() - + add_tooltip(self.txt_username, _("Your miner username (not your account username).\nExample: Kiv.GPU")) add_tooltip(self.txt_pass, _("Your miner password (not your account password).")) - + def layout_btcguild(self): """BTC Guild has the same layout as slush for now.""" self.layout_slush() def layout_btcmine(self): - self.set_widgets_visible([self.host_lbl, self.txt_host, + self.set_widgets_visible([self.host_lbl, self.txt_host, self.port_lbl, self.txt_port, - self.withdraw, self.extra_info], False) + self.withdraw, self.extra_info], False) row = self.layout_init() self.layout_server_and_website(row=row) self.layout_user_and_pass(row=row+1) self.layout_device_and_flags(row=row+2) self.layout_affinity(row=row+3) self.layout_balance(row=row+4) - self.layout_finish() + self.layout_finish() add_tooltip(self.txt_username, _("Your miner username. \nExample: kiv123@kiv123")) @@ -1530,9 +1529,9 @@ def layout_btcmine(self): def layout_deepbit(self): """Deepbit uses an email address for a username.""" - self.set_widgets_visible([self.host_lbl, self.txt_host, + self.set_widgets_visible([self.host_lbl, self.txt_host, self.port_lbl, self.txt_port, - self.extra_info], False) + self.extra_info], False) row = self.layout_init() self.layout_server_and_website(row=row) self.layout_user_and_pass(row=row+1) @@ -1543,50 +1542,50 @@ def layout_deepbit(self): add_tooltip(self.txt_username, _("The e-mail address you registered with.")) self.user_lbl.SetLabel(_("Email:")) - + # End server specific code ########################## - + class GUIMiner(wx.Frame): def __init__(self, *args, **kwds): - wx.Frame.__init__(self, *args, **kwds) + wx.Frame.__init__(self, *args, **kwds) style = fnb.FNB_X_ON_TAB | fnb.FNB_FF2 | fnb.FNB_HIDE_ON_SINGLE_TAB self.nb = fnb.FlatNotebook(self, -1, style=style) - + # Set up notebook context menu notebook_menu = wx.Menu() ID_RENAME = wx.NewId() notebook_menu.Append(ID_RENAME, _("&Rename..."), _("Rename this miner")) self.nb.SetRightClickMenu(notebook_menu) self.Bind(wx.EVT_MENU, self.rename_miner, id=ID_RENAME) - + self.console_panel = None self.summary_panel = None - + # Servers and defaults are required, it's a fatal error not to have - # them. + # them. server_config_path = os.path.join(get_module_path(), 'servers.ini') with open(server_config_path) as f: data = json.load(f) self.servers = data.get('servers') - + defaults_config_path = os.path.join(get_module_path(), 'defaults.ini') with open(defaults_config_path) as f: self.defaults = json.load(f) - + self.parse_config() self.do_show_opencl_warning = self.config_data.get('show_opencl_warning', True) - + ID_NEW_EXTERNAL, ID_NEW_PHOENIX, ID_NEW_CUDA, ID_NEW_UFASOFT = wx.NewId(), wx.NewId(), wx.NewId(), wx.NewId() self.menubar = wx.MenuBar() - file_menu = wx.Menu() + file_menu = wx.Menu() new_menu = wx.Menu() new_menu.Append(wx.ID_NEW, _("&New OpenCL miner..."), _("Create a new OpenCL miner (default for ATI cards)"), wx.ITEM_NORMAL) new_menu.Append(ID_NEW_PHOENIX, _("New Phoenix miner..."), _("Create a new Phoenix miner (for some ATI cards)"), wx.ITEM_NORMAL) new_menu.Append(ID_NEW_CUDA, _("New CUDA miner..."), _("Create a new CUDA miner (for NVIDIA cards)"), wx.ITEM_NORMAL) new_menu.Append(ID_NEW_UFASOFT, _("New Ufasoft CPU miner..."), _("Create a new Ufasoft miner (for CPUs)"), wx.ITEM_NORMAL) - new_menu.Append(ID_NEW_EXTERNAL, _("New &other miner..."), _("Create a new custom miner (requires external program)"), wx.ITEM_NORMAL) + new_menu.Append(ID_NEW_EXTERNAL, _("New &other miner..."), _("Create a new custom miner (requires external program)"), wx.ITEM_NORMAL) file_menu.AppendMenu(wx.NewId(), _('&New miner'), new_menu) file_menu.Append(wx.ID_SAVE, _("&Save settings"), _("Save your settings"), wx.ITEM_NORMAL) file_menu.Append(wx.ID_OPEN, _("&Load settings"), _("Load stored settings"), wx.ITEM_NORMAL) @@ -1605,18 +1604,18 @@ def __init__(self, *args, **kwds): solo_menu.Append(ID_PATHS, _("&Set Bitcoin client path..."), _("Set the location of the official Bitcoin client"), wx.ITEM_NORMAL) solo_menu.Append(ID_LAUNCH, _("&Launch Bitcoin client as server"), _("Launch the official Bitcoin client as a server for solo mining"), wx.ITEM_NORMAL) self.menubar.Append(solo_menu, _("&Solo utilities")) - + ID_START_MINIMIZED = wx.NewId() self.options_menu = wx.Menu() self.start_minimized_chk = self.options_menu.Append(ID_START_MINIMIZED, _("Start &minimized"), _("Start the GUI minimized to the tray."), wx.ITEM_CHECK) self.options_menu.Check(ID_START_MINIMIZED, self.config_data.get('start_minimized', False)) - self.menubar.Append(self.options_menu, _("&Options")) - + self.menubar.Append(self.options_menu, _("&Options")) + ID_CHANGE_LANGUAGE = wx.NewId() lang_menu = wx.Menu() lang_menu.Append(ID_CHANGE_LANGUAGE, _("&Change language..."), "", wx.ITEM_NORMAL) self.menubar.Append(lang_menu, _("Language")) - + ID_DONATE_SMALL = wx.NewId() donate_menu = wx.Menu() donate_menu.Append(ID_DONATE_SMALL, _("&Donate 99 cents..."), _("Donate $0.99 USD worth of Bitcoins to support GUIMiner development")) @@ -1624,21 +1623,21 @@ def __init__(self, *args, **kwds): help_menu = wx.Menu() help_menu.Append(wx.ID_ABOUT, _("&About..."), STR_ABOUT, wx.ITEM_NORMAL) - + self.menubar.Append(help_menu, _("&Help")) - self.SetMenuBar(self.menubar) + self.SetMenuBar(self.menubar) self.statusbar = self.CreateStatusBar(2, 0) try: self.bitcoin_executable = os.path.join(os.getenv("PROGRAMFILES"), "Bitcoin", "bitcoin.exe") except: - self.bitcoin_executable = "" # TODO: where would Bitcoin probably be on Linux/Mac? + self.bitcoin_executable = "" # TODO: where would Bitcoin probably be on Linux/Mac? try: self.tbicon = GUIMinerTaskBarIcon(self) except: - logging.error(_("Failed to load taskbar icon; continuing.")) - + logging.error(_("Failed to load taskbar icon; continuing.")) + self.set_properties() try: @@ -1647,12 +1646,12 @@ def __init__(self, *args, **kwds): self.devices = [] file_menu.Enable(wx.ID_NEW, False) file_menu.SetHelpString(wx.ID_NEW, _("OpenCL not found - can't add a OpenCL miner")) - + if self.do_show_opencl_warning: dialog = OpenCLWarningDialog(self) dialog.ShowModal() self.do_show_opencl_warning = not dialog.is_box_checked() - + self.Bind(wx.EVT_MENU, self.name_new_profile, id=wx.ID_NEW) self.Bind(wx.EVT_MENU, self.new_phoenix_profile, id=ID_NEW_PHOENIX) self.Bind(wx.EVT_MENU, self.new_ufasoft_profile, id=ID_NEW_UFASOFT) @@ -1675,19 +1674,19 @@ def __init__(self, *args, **kwds): self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CLOSED, self.on_page_closed) self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CHANGED, self.on_page_changed) - self.load_config() + self.load_config() self.do_layout() - + if not self.start_minimized_chk.IsChecked(): self.Show() - + def set_properties(self): - self.SetIcons(get_icon_bundle()) + self.SetIcons(get_icon_bundle()) self.SetTitle(_("GUIMiner - v%s") % __version__) self.statusbar.SetStatusWidths([-1, 125]) statusbar_fields = ["", STR_NOT_STARTED] - for i in range(len(statusbar_fields)): - self.statusbar.SetStatusText(statusbar_fields[i], i) + for i in range(len(statusbar_fields)): + self.statusbar.SetStatusText(statusbar_fields[i], i) def do_layout(self): self.vertical_sizer = wx.BoxSizer(wx.VERTICAL) @@ -1701,19 +1700,19 @@ def do_layout(self): def profile_panels(self): """Return a list of currently available MinerTab.""" pages = [self.nb.GetPage(i) for i in range(self.nb.GetPageCount())] - return [p for p in pages if + return [p for p in pages if p != self.console_panel and p != self.summary_panel] - + def add_profile(self, data={}): """Add a new MinerTab to the list of tabs.""" - panel = MinerTab(self.nb, -1, self.devices, self.servers, + panel = MinerTab(self.nb, -1, self.devices, self.servers, self.defaults, self.statusbar, data) self.nb.AddPage(panel, panel.name) # The newly created profile should have focus. self.nb.EnsureVisible(self.nb.GetPageCount() - 1) - + if self.summary_panel is not None: - self.summary_panel.add_miners_to_grid() # Show new entry on summary + self.summary_panel.add_miners_to_grid() # Show new entry on summary return panel def message(self, *args, **kwargs): @@ -1739,7 +1738,7 @@ def new_external_profile(self, event): On Windows we validate against legal miners; on Linux they can pick whatever they want. """ - wildcard = _('External miner (*.exe)|*.exe|(*.py)|*.py') if sys.platform == 'win32' else '*.*' + wildcard = _('External miner (*.exe)|*.exe|(*.py)|*.py') if sys.platform == 'win32' else '*.*' dialog = wx.FileDialog(self, _("Select external miner:"), defaultDir=os.path.join(get_module_path(), 'miners'), @@ -1748,7 +1747,7 @@ def new_external_profile(self, event): style=wx.OPEN) if dialog.ShowModal() != wx.ID_OK: return - + if sys.platform == 'win32' and dialog.GetFilename() not in SUPPORTED_BACKENDS: self.message( _("Unsupported external miner %(filename)s. Supported are: %(supported)s") % \ @@ -1756,24 +1755,24 @@ def new_external_profile(self, event): _("Miner not supported"), wx.OK | wx.ICON_ERROR) return path = os.path.join(dialog.GetDirectory(), dialog.GetFilename()) - dialog.Destroy() - self.name_new_profile(extra_profile_data=dict(external_path=path)) + dialog.Destroy() + self.name_new_profile(extra_profile_data=dict(external_path=path)) def new_phoenix_profile(self, event): """Create a new miner using the Phoenix OpenCL miner backend.""" path = os.path.join(get_module_path(), 'phoenix.exe') self.name_new_profile(extra_profile_data=dict(external_path=path)) - + def new_ufasoft_profile(self, event): """Create a new miner using the Ufasoft CPU miner backend.""" path = os.path.join(get_module_path(), 'miners', 'ufasoft', 'bitcoin-miner.exe') self.name_new_profile(extra_profile_data=dict(external_path=path)) - + def new_cuda_profile(self, event): """Create a new miner using the CUDA GPU miner backend.""" path = os.path.join(get_module_path(), 'miners', 'puddinpop', 'rpcminer-cuda.exe') self.name_new_profile(extra_profile_data=dict(external_path=path)) - + def get_storage_location(self): """Get the folder and filename to store our JSON config.""" if sys.platform == 'win32': @@ -1786,7 +1785,7 @@ def get_storage_location(self): def on_close(self, event): """Minimize to tray if they click "close" but exit otherwise. - + On closing, stop any miners that are currently working. """ if event.CanVeto(): @@ -1794,13 +1793,13 @@ def on_close(self, event): event.Veto() else: if any(p.is_modified for p in self.profile_panels): - dialog = wx.MessageDialog(self, _('Do you want to save changes?'), _('Save'), + dialog = wx.MessageDialog(self, _('Do you want to save changes?'), _('Save'), wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION) retval = dialog.ShowModal() dialog.Destroy() if retval == wx.ID_YES: self.save_config() - + if self.console_panel is not None: self.console_panel.on_close() if self.summary_panel is not None: @@ -1825,7 +1824,7 @@ def save_config(self, event=None): show_opencl_warning=self.do_show_opencl_warning, start_minimized=self.start_minimized_chk.IsChecked()) logger.debug(_('Saving: ') + json.dumps(config_data)) - try: + try: with open(config_filename, 'w') as f: json.dump(config_data, f, indent=4) except IOError: @@ -1837,55 +1836,55 @@ def save_config(self, event=None): _("Save successful"), wx.OK | wx.ICON_INFORMATION) for p in self.profile_panels: p.on_saved() - + def parse_config(self): """Set self.config_data to a dictionary of config values.""" self.config_data = {} - - config_filename = self.get_storage_location()[1] + + config_filename = self.get_storage_location()[1] if os.path.exists(config_filename): with open(config_filename) as f: self.config_data.update(json.load(f)) logger.debug(_('Loaded: %s') % json.dumps(self.config_data)) - + def load_config(self, event=None): """Load JSON profile info from the config file.""" self.parse_config() - + config_data = self.config_data executable = config_data.get('bitcoin_executable', None) if executable is not None: self.bitcoin_executable = executable - + # Shut down any existing miners before they get clobbered if(any(p.is_mining for p in self.profile_panels)): result = self.message( _("Loading profiles will stop any currently running miners. Continue?"), _("Load profile"), wx.YES_NO | wx.NO_DEFAULT | wx.ICON_INFORMATION) if result == wx.ID_NO: - return - for p in reversed(self.profile_panels): + return + for p in reversed(self.profile_panels): p.on_close() self.nb.DeletePage(self.nb.GetPageIndex(p)) # If present, summary should be the leftmost tab on startup. if config_data.get('show_summary', False): - self.show_summary() - + self.show_summary() + profile_data = config_data.get('profiles', []) for d in profile_data: self.add_profile(d) - - if not any(profile_data): - self.add_profile() # Create a default one using defaults.ini - + + if not any(profile_data): + self.add_profile() # Create a default one using defaults.ini + if config_data.get('show_console', False): self.show_console() - + for p in self.profile_panels: if p.autostart: p.start_mining() - + def set_official_client_path(self, event): """Set the path to the official Bitcoin client.""" wildcard = "bitcoin.exe" if sys.platform == 'win32' else '*.*' @@ -1899,22 +1898,22 @@ def set_official_client_path(self, event): if os.path.exists(path): self.bitcoin_executable = path dialog.Destroy() - + def show_about_dialog(self, event): """Show the 'about' dialog.""" dialog = AboutGuiminer(self, -1, _('About')) dialog.ShowModal() dialog.Destroy() - + def on_page_closing(self, event): """Handle a tab closing event. - + If they are closing a special panel, we have to shut it down. If the tab has a miner running in it, we have to stop the miner before letting the tab be removed. """ p = self.nb.GetPage(event.GetSelection()) - + if p == self.console_panel: self.console_panel.on_close() self.console_panel = None @@ -1925,18 +1924,18 @@ def on_page_closing(self, event): self.summary_panel = None event.Skip() return - + if p.is_mining: result = self.message( - _("Closing this miner will stop it. Continue?"), + _("Closing this miner will stop it. Continue?"), _("Close miner"), wx.YES_NO | wx.NO_DEFAULT | wx.ICON_INFORMATION) if result == wx.ID_NO: event.Veto() - return + return p.on_close() event.Skip() # OK to close the tab now - + def on_page_closed(self, event): if self.summary_panel is not None: self.summary_panel.add_miners_to_grid() # Remove miner summary @@ -1962,10 +1961,10 @@ def launch_solo_server(self, event): _("Launch failed"), wx.ICON_ERROR | wx.OK) return self.message( - _("Client launched ok. You can start a miner now with the server set to 'solo'."), + _("The Bitcoin client will now launch in server mode.\nOnce it connects to the network and downloads the block chain, you can start a miner in 'solo' mode."), _("Launched ok."), wx.OK) - + def create_solo_password(self, event): """Prompt the user for login credentials to the bitcoin client. @@ -1989,9 +1988,9 @@ def create_solo_password(self, event): dialog.Destroy() if result == wx.ID_CANCEL: return - + with open(filename, "w") as f: - f.write('\nrpcuser=%s\nrpcpassword=%s' % dialog.get_value()) + f.write('\nrpcuser=%s\nrpcpassword=%s\nrpcallowip=*' % dialog.get_value()) f.close() self.message(_("Wrote bitcoin config ok."), _("Success"), wx.OK) @@ -1999,7 +1998,7 @@ def create_solo_password(self, event): def is_console_visible(self): """Return True if the console is visible.""" return self.nb.GetPageIndex(self.console_panel) != -1 - + def show_console(self, event=None): """Show the console log in its own tab.""" if self.is_console_visible(): @@ -2007,11 +2006,11 @@ def show_console(self, event=None): self.console_panel = ConsolePanel(self) self.nb.AddPage(self.console_panel, _("Console")) self.nb.EnsureVisible(self.nb.GetPageCount() - 1) - + def is_summary_visible(self): """Return True if the summary is visible.""" return self.nb.GetPageIndex(self.summary_panel) != -1 - + def show_summary(self, event=None): """Show the summary window in its own tab.""" if self.is_summary_visible(): @@ -2020,18 +2019,18 @@ def show_summary(self, event=None): self.nb.AddPage(self.summary_panel, _("Summary")) index = self.nb.GetPageIndex(self.summary_panel) self.nb.SetSelection(index) - + def on_menu_exit(self, event): self.Close(force=True) - + def rename_miner(self, event): """Change the name of a miner as displayed on the tab.""" p = self.nb.GetPage(self.nb.GetSelection()) if p not in self.profile_panels: return - + dialog = wx.TextEntryDialog(self, _("Rename to:"), _("Rename miner")) - if dialog.ShowModal() == wx.ID_OK: + if dialog.ShowModal() == wx.ID_OK: p.set_name(dialog.GetValue().strip()) def on_change_language(self, event): @@ -2040,11 +2039,11 @@ def on_change_language(self, event): dialog.Destroy() if result == wx.ID_CANCEL: return - + language_name = dialog.get_value() update_language(LANGUAGES[language_name]) - save_language() - + save_language() + def on_donate(self, event): webbrowser.open(DONATE_SMALL_URL) @@ -2054,23 +2053,23 @@ def __init__(self, parent, title, current_language): style = wx.DEFAULT_DIALOG_STYLE vbox = wx.BoxSizer(wx.VERTICAL) wx.Dialog.__init__(self, parent, -1, title, style=style) - self.lbl = wx.StaticText(self, -1, + self.lbl = wx.StaticText(self, -1, _("Choose language (requires restart to take full effect)")) - vbox.Add(self.lbl, 0, wx.ALL, 10) - self.language_choices = wx.ComboBox(self, -1, + vbox.Add(self.lbl, 0, wx.ALL, 10) + self.language_choices = wx.ComboBox(self, -1, choices=sorted(LANGUAGES.keys()), style=wx.CB_READONLY) - + self.language_choices.SetStringSelection(LANGUAGES_REVERSE[current_language]) - - vbox.Add(self.language_choices, 0, wx.ALL, 10) + + vbox.Add(self.language_choices, 0, wx.ALL, 10) buttons = self.CreateButtonSizer(wx.OK | wx.CANCEL) vbox.Add(buttons, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 10) self.SetSizerAndFit(vbox) - + def get_value(self): return self.language_choices.GetStringSelection() - + class SoloPasswordRequest(wx.Dialog): """Dialog prompting user for login credentials for solo mining.""" @@ -2100,7 +2099,7 @@ def get_value(self): class BalanceAuthRequest(wx.Dialog): """Dialog prompting user for an auth token to refresh their balance.""" instructions = \ -_("""Click the link below to log in to the pool and get a special token. +_("""Click the link below to log in to the pool and get a special token. This token lets you securely check your balance. To remember this token for the future, save your miner settings.""") def __init__(self, parent, url): @@ -2111,7 +2110,7 @@ def __init__(self, parent, url): self.website = hyperlink.HyperLinkCtrl(self, -1, url) self.txt_token = wx.TextCtrl(self, -1, _("(Paste token here)")) buttons = self.CreateButtonSizer(wx.OK | wx.CANCEL) - + vbox.AddMany([ (self.instructions, 0, wx.ALL, 10), (self.website, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 10), @@ -2119,11 +2118,11 @@ def __init__(self, parent, url): (buttons, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 10) ]) self.SetSizerAndFit(vbox) - + def get_value(self): """Return the auth token supplied by the user.""" return self.txt_token.GetValue() - + class AboutGuiminer(wx.Dialog): """About dialog for the app with a donation address.""" @@ -2135,12 +2134,12 @@ def __init__(self, parent, id, title): text = ABOUT_TEXT % dict(version=__version__, address=AboutGuiminer.donation_address) self.about_text = wx.StaticText(self, -1, text) - self.copy_btn = wx.Button(self, -1, _("Copy address to clipboard")) + self.copy_btn = wx.Button(self, -1, _("Copy address to clipboard")) vbox.Add(self.about_text) vbox.Add(self.copy_btn, 0, wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_HORIZONTAL, 0) self.SetSizerAndFit(vbox) - self.copy_btn.Bind(wx.EVT_BUTTON, self.on_copy) + self.copy_btn.Bind(wx.EVT_BUTTON, self.on_copy) def on_copy(self, event): """Copy the donation address to the clipboard.""" @@ -2156,38 +2155,38 @@ class OpenCLWarningDialog(wx.Dialog): def __init__(self, parent): wx.Dialog.__init__(self, parent, -1, _("No OpenCL devices found.")) vbox = wx.BoxSizer(wx.VERTICAL) - self.message = wx.StaticText(self, -1, + self.message = wx.StaticText(self, -1, _("""No OpenCL devices were found. If you only want to mine using CPU or CUDA, you can ignore this message. If you want to mine on ATI graphics cards, you may need to install the ATI Stream SDK, or your GPU may not support OpenCL.""")) - vbox.Add(self.message, 0, wx.ALL, 10) - + vbox.Add(self.message, 0, wx.ALL, 10) + hbox = wx.BoxSizer(wx.HORIZONTAL) self.no_show_chk = wx.CheckBox(self, -1) hbox.Add(self.no_show_chk) self.no_show_txt = wx.StaticText(self, -1, _("Don't show this message again")) - hbox.Add((5,0)) - hbox.Add(self.no_show_txt) + hbox.Add((5,0)) + hbox.Add(self.no_show_txt) vbox.Add(hbox, 0, wx.ALL, 10) buttons = self.CreateButtonSizer(wx.OK) vbox.Add(buttons, 0, wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_HORIZONTAL, 0) self.SetSizerAndFit(vbox) - + def is_box_checked(self): return self.no_show_chk.GetValue() - -def run(): - try: + +def run(): + try: frame_1 = GUIMiner(None, -1, "") - app.SetTopWindow(frame_1) + app.SetTopWindow(frame_1) app.MainLoop() except: logging.exception("Exception:") raise - - + + if __name__ == "__main__": run() diff --git a/guiminer_de.po b/guiminer_de.po index 3a7446f..5ea3815 100644 --- a/guiminer_de.po +++ b/guiminer_de.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 12:41-0300\n" +"POT-Creation-Date: 2011-06-10 15:18-0300\n" "PO-Revision-Date: 2011-06-05 16:30+0100\n" "Last-Translator: Liikaa \n" "Language-Team: German\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: guiminer.py:84 +#: guiminer.py:89 #, python-format msgid "" "GUIMiner\n" @@ -56,220 +56,224 @@ msgstr "" " Selbst ein einzelner Bitcoin motiviert,\n" " die Entwicklung fortzuführen. Have phun ;)\n" -#: guiminer.py:105 +#: guiminer.py:110 msgid "Not started" msgstr "Nicht gestartet" -#: guiminer.py:106 +#: guiminer.py:111 msgid "Starting..." msgstr "Starte..." -#: guiminer.py:107 +#: guiminer.py:112 msgid "Stopped" msgstr "Gestoppt" -#: guiminer.py:108 +#: guiminer.py:113 msgid "Paused" msgstr "Pausiert" -#: guiminer.py:109 +#: guiminer.py:114 msgid "Start mining!" msgstr "Start!" -#: guiminer.py:110 +#: guiminer.py:115 msgid "Stop mining" msgstr "Stop!" -#: guiminer.py:111 +#: guiminer.py:116 msgid "Refresh balance" msgstr "Guthaben aktualisieren" -#: guiminer.py:112 +#: guiminer.py:117 msgid "Connection error" msgstr "Verbindungsfehler" -#: guiminer.py:113 +#: guiminer.py:118 msgid "Username:" msgstr "Benutzername:" -#: guiminer.py:114 +#: guiminer.py:119 msgid "Password:" msgstr "Passwort:" -#: guiminer.py:115 +#: guiminer.py:120 msgid "Quit this program" msgstr "Programm beenden" -#: guiminer.py:116 +#: guiminer.py:121 msgid "Show about dialog" msgstr "Über" -#: guiminer.py:197 +#: guiminer.py:202 #, python-format msgid "%.1f Ghash/s" msgstr "%.1f Ghash/s" -#: guiminer.py:199 +#: guiminer.py:204 #, python-format msgid "%.1f Mhash/s" msgstr "%.1f Mhash/s" -#: guiminer.py:201 +#: guiminer.py:206 msgid "Connecting..." msgstr "Verbinde..." -#: guiminer.py:203 +#: guiminer.py:208 #, python-format msgid "%d khash/s" msgstr "%d khash/s" -#: guiminer.py:227 +#: guiminer.py:232 #, python-format msgid "Requesting balance: %(request)s" msgstr "Guthaben wird abgerufen: %(request)s" -#: guiminer.py:231 +#: guiminer.py:236 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "Serverantwort: %(status)s, %(data)s" -#: guiminer.py:286 +#: guiminer.py:303 msgid "Miner" msgstr "Miner" -#: guiminer.py:287 +#: guiminer.py:304 msgid "Speed" msgstr "Geschwindigkeit" -#: guiminer.py:288 +#: guiminer.py:305 msgid "Accepted" msgstr "Akzeptiert" -#: guiminer.py:289 +#: guiminer.py:306 msgid "Stale" msgstr "Ungültig" -#: guiminer.py:290 +#: guiminer.py:307 msgid "Start/Stop" msgstr "Start/Stop" -#: guiminer.py:291 +#: guiminer.py:308 msgid "Autostart" msgstr "Autostart" -#: guiminer.py:375 +#: guiminer.py:392 msgid "Pause all" msgstr "Alle pausieren" -#: guiminer.py:377 +#: guiminer.py:394 msgid "Restore" msgstr "Wiederherstellen" -#: guiminer.py:378 +#: guiminer.py:395 msgid "Close" msgstr "Schließen" -#: guiminer.py:434 +#: guiminer.py:451 #, python-format msgid "Listener for \"%s\" started" msgstr "Listener für \"%s\" gestartet" -#: guiminer.py:449 +#: guiminer.py:466 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "Listener für \"%(name)s\": %(line)s" -#: guiminer.py:452 +#: guiminer.py:469 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "Listener für \"%s\" wird angehalten" -#: guiminer.py:496 +#: guiminer.py:515 msgid "Server:" msgstr "Server:" -#: guiminer.py:501 +#: guiminer.py:520 msgid "Website:" msgstr "Website:" -#: guiminer.py:503 +#: guiminer.py:522 msgid "Ext. Path:" msgstr "Ext. Pfad:" -#: guiminer.py:505 +#: guiminer.py:524 msgid "Host:" msgstr "Host:" -#: guiminer.py:507 +#: guiminer.py:526 msgid "Port:" msgstr "Port:" -#: guiminer.py:513 +#: guiminer.py:532 msgid "Device:" msgstr "Gerät:" -#: guiminer.py:514 +#: guiminer.py:533 msgid "No OpenCL devices" msgstr "Keine OpenCL-Geräte" -#: guiminer.py:515 +#: guiminer.py:534 msgid "Extra flags:" msgstr "Extra Parameter:" -#: guiminer.py:518 +#: guiminer.py:537 +msgid "CPU Affinity:" +msgstr "" + +#: guiminer.py:540 msgid "Balance:" msgstr "Guthaben:" -#: guiminer.py:522 +#: guiminer.py:544 msgid "Withdraw" msgstr "Überweisung" -#: guiminer.py:667 +#: guiminer.py:704 msgid "Default" msgstr "Standard" -#: guiminer.py:714 +#: guiminer.py:755 msgid "Start" msgstr "Start" -#: guiminer.py:714 +#: guiminer.py:755 msgid "Stop" msgstr "Stop" -#: guiminer.py:730 +#: guiminer.py:771 msgid "Connection problems" msgstr "Verbindungsprobleme" -#: guiminer.py:889 +#: guiminer.py:930 msgid "Running command: " msgstr "Wird ausgeführt: " -#: guiminer.py:943 +#: guiminer.py:989 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "Schwierigkeit 1 hashes: %(nhashes)d %(update_time)s" -#: guiminer.py:947 +#: guiminer.py:993 #, python-format msgid "Blocks: %d, " msgstr "Blöcke: %d, " -#: guiminer.py:950 +#: guiminer.py:996 #, python-format msgid "Shares: %d accepted" msgstr "Shares: %d akzeptiert" -#: guiminer.py:952 +#: guiminer.py:998 #, python-format msgid ", %d stale/invalid" msgstr ", %d ungültig" -#: guiminer.py:974 +#: guiminer.py:1020 #, python-format msgid "- last at %s" msgstr "- zuletzt um %s" -#: guiminer.py:1047 +#: guiminer.py:1093 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." @@ -279,23 +283,23 @@ msgstr "" "und erheben abweichende Gebühren. (siehe Website für ausführliche " "Informationen)" -#: guiminer.py:1048 +#: guiminer.py:1094 msgid "Website of the currently selected server. Click to visit." msgstr "Website des momentan ausgewählten Servers. Hier klicken zum Aufrufen." -#: guiminer.py:1049 +#: guiminer.py:1095 msgid "Available OpenCL devices on your system." msgstr "Verfügbare OpenCL-Geräte" -#: guiminer.py:1050 +#: guiminer.py:1096 msgid "Host address, without http:// prefix." msgstr "Host-Adresse, ohne führendes 'http://'" -#: guiminer.py:1051 +#: guiminer.py:1097 msgid "Server port. This is usually 8332." msgstr "Server-Port. Standardmäßig 8332." -#: guiminer.py:1052 +#: guiminer.py:1098 msgid "" "The miner's username.\n" "May be different than your account username.\n" @@ -305,7 +309,7 @@ msgstr "" "Kann sich vom Account-Benutzernamen unterscheiden.\n" "Beispiel: Kiv.GPU" -#: guiminer.py:1053 +#: guiminer.py:1099 msgid "" "The miner's password.\n" "May be different than your account password." @@ -313,7 +317,7 @@ msgstr "" "Miner-Passwort.\n" "Kann sich vom Account-Passwort unterscheiden." -#: guiminer.py:1054 +#: guiminer.py:1100 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" @@ -325,37 +329,43 @@ msgstr "" "Die Priorität kann von 0 (hoch) bis 100 (niedrig) festgelegt\n" "werden. (Beispiel: -f60)" -#: guiminer.py:1148 guiminer.py:1242 guiminer.py:1263 +#: guiminer.py:1102 +msgid "" +"CPU cores used for mining.\n" +"Unchecking some cores can reduce high CPU usage in some systems." +msgstr "" + +#: guiminer.py:1196 guiminer.py:1290 guiminer.py:1311 msgid "Auth token rejected by server." msgstr "Authentifizierung fehlgeschlagen." -#: guiminer.py:1166 +#: guiminer.py:1214 #, python-format msgid "%s confirmed" msgstr "%s bestätigt" -#: guiminer.py:1168 +#: guiminer.py:1216 #, python-format msgid ", %s unconfirmed" msgstr ", %s unbestätigt" -#: guiminer.py:1170 +#: guiminer.py:1218 msgid "Bad response from server." msgstr "Fehlerhafte Serverantwort." -#: guiminer.py:1246 guiminer.py:1267 +#: guiminer.py:1294 guiminer.py:1315 msgid "Withdraw OK" msgstr "Überweisung getätigt" -#: guiminer.py:1426 +#: guiminer.py:1485 msgid "No registration is required - just enter an address and press Start." msgstr "Keine Registrierung erforderlich. Einfach Adresse eingeben und starten" -#: guiminer.py:1428 +#: guiminer.py:1487 msgid "Address:" msgstr "Adresse:" -#: guiminer.py:1430 +#: guiminer.py:1489 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" @@ -363,7 +373,7 @@ msgstr "" "Adresse für eingehende Transaktionen.\n" "Beispiel: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" -#: guiminer.py:1445 +#: guiminer.py:1505 msgid "" "Your miner username (not your account username).\n" "Example: Kiv.GPU" @@ -371,11 +381,11 @@ msgstr "" "Miner-Benutzername (nicht der Account-Benutzername)\n" "Beispiel: Kiv.GPU" -#: guiminer.py:1447 guiminer.py:1467 +#: guiminer.py:1507 guiminer.py:1528 msgid "Your miner password (not your account password)." msgstr "Miner-Passwort (nicht der Account-Passwort)" -#: guiminer.py:1465 +#: guiminer.py:1526 #, fuzzy msgid "" "Your miner username. \n" @@ -384,247 +394,247 @@ msgstr "" "Логин генератора. \n" "Beispiel: kiv123@kiv123" -#: guiminer.py:1481 +#: guiminer.py:1543 msgid "The e-mail address you registered with." msgstr "E-Mail-Adresse aus der Registrierung." -#: guiminer.py:1482 +#: guiminer.py:1544 msgid "Email:" msgstr "E-Mail:" -#: guiminer.py:1497 +#: guiminer.py:1559 msgid "&Rename..." msgstr "&Umbenennen..." -#: guiminer.py:1497 +#: guiminer.py:1559 msgid "Rename this miner" msgstr "Diesen Miner umbenennen" -#: guiminer.py:1522 +#: guiminer.py:1584 msgid "&New OpenCL miner..." msgstr "&Neuer OpenCL-Miner..." -#: guiminer.py:1522 +#: guiminer.py:1584 msgid "Create a new OpenCL miner (default for ATI cards)" msgstr "" -#: guiminer.py:1523 +#: guiminer.py:1585 #, fuzzy msgid "Create a new Phoenix miner (for some ATI cards)" msgstr "Neues Miner-&Profil erstellen" -#: guiminer.py:1523 +#: guiminer.py:1585 #, fuzzy msgid "New Phoenix miner..." msgstr "Neuen &externen Miner..." -#: guiminer.py:1524 +#: guiminer.py:1586 msgid "Create a new CUDA miner (for NVIDIA cards)" msgstr "" -#: guiminer.py:1524 +#: guiminer.py:1586 #, fuzzy msgid "New CUDA miner..." msgstr "&Neuer OpenCL-Miner..." -#: guiminer.py:1525 +#: guiminer.py:1587 #, fuzzy msgid "Create a new Ufasoft miner (for CPUs)" msgstr "Neues Miner-&Profil erstellen" -#: guiminer.py:1525 +#: guiminer.py:1587 #, fuzzy msgid "New Ufasoft CPU miner..." msgstr "Neuen &externen Miner..." -#: guiminer.py:1526 +#: guiminer.py:1588 #, fuzzy msgid "Create a new custom miner (requires external program)" msgstr "Neuen CPU- oder CUDA-Miner erstellen (erfordert externe Anwendung)" -#: guiminer.py:1526 +#: guiminer.py:1588 msgid "New &other miner..." msgstr "Neuen &externen Miner..." -#: guiminer.py:1527 +#: guiminer.py:1589 #, fuzzy msgid "&New miner" msgstr "Neuer Miner" -#: guiminer.py:1528 +#: guiminer.py:1590 msgid "&Save settings" msgstr "Einstellungen &speichern" -#: guiminer.py:1528 +#: guiminer.py:1590 msgid "Save your settings" msgstr "Einstellungen speichern" -#: guiminer.py:1529 +#: guiminer.py:1591 msgid "&Load settings" msgstr "&Einstellungen &laden" -#: guiminer.py:1529 +#: guiminer.py:1591 msgid "Load stored settings" msgstr "Einstellungen laden" -#: guiminer.py:1530 +#: guiminer.py:1592 msgid "Quit" msgstr "&Beenden" -#: guiminer.py:1531 +#: guiminer.py:1593 msgid "&File" msgstr "&Datei" -#: guiminer.py:1535 +#: guiminer.py:1597 msgid "Show summary" msgstr "&Zusammenfassung anzeigen" -#: guiminer.py:1535 +#: guiminer.py:1597 msgid "Show summary of all miners" msgstr "Zusammenfassung aller Miner anzeigen" -#: guiminer.py:1536 +#: guiminer.py:1598 msgid "Show console" msgstr "&Konsole anzeigen" -#: guiminer.py:1536 +#: guiminer.py:1598 msgid "Show console logs" msgstr "Konsolen-Logs anzeigen" -#: guiminer.py:1537 +#: guiminer.py:1599 msgid "&View" msgstr "&Ansicht" -#: guiminer.py:1541 +#: guiminer.py:1603 msgid "&Create solo password..." msgstr "&Solo-Passwort erstellen..." -#: guiminer.py:1541 +#: guiminer.py:1603 msgid "Configure a user/pass for solo mining" msgstr "Benutzername/Password für Solo-Mining festlegen" -#: guiminer.py:1542 +#: guiminer.py:1604 msgid "&Set Bitcoin client path..." msgstr "Bitcoin-Client-&Pfad..." -#: guiminer.py:1542 +#: guiminer.py:1604 msgid "Set the location of the official Bitcoin client" msgstr "Pfad zum offiziellen Bitcoin-Client festlegen." -#: guiminer.py:1543 +#: guiminer.py:1605 msgid "&Launch Bitcoin client as server" msgstr "&Bitcoin-Client als Server starten" -#: guiminer.py:1543 +#: guiminer.py:1605 msgid "Launch the official Bitcoin client as a server for solo mining" msgstr "Startet den offiziellen Bitcoin-CLient im Servermodus für Solo-Mining" -#: guiminer.py:1544 +#: guiminer.py:1606 msgid "&Solo utilities" msgstr "Solo-&Werkzeuge" -#: guiminer.py:1548 +#: guiminer.py:1610 #, fuzzy msgid "Start &minimized" msgstr "Start!" -#: guiminer.py:1548 +#: guiminer.py:1610 msgid "Start the GUI minimized to the tray." msgstr "" -#: guiminer.py:1550 +#: guiminer.py:1612 msgid "&Options" msgstr "" -#: guiminer.py:1554 +#: guiminer.py:1616 msgid "&Change language..." msgstr "&Sprache wechseln..." -#: guiminer.py:1555 +#: guiminer.py:1617 msgid "Language" msgstr "&Sprache" -#: guiminer.py:1559 +#: guiminer.py:1621 msgid "&Donate 99 cents..." msgstr "" -#: guiminer.py:1559 +#: guiminer.py:1621 msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" msgstr "" -#: guiminer.py:1560 +#: guiminer.py:1622 #, fuzzy msgid "&Donate" msgstr "&Über/Spenden..." -#: guiminer.py:1563 +#: guiminer.py:1625 #, fuzzy msgid "&About..." msgstr "&Über/Spenden..." -#: guiminer.py:1565 +#: guiminer.py:1627 msgid "&Help" msgstr "&Hilfe" -#: guiminer.py:1577 +#: guiminer.py:1639 msgid "Failed to load taskbar icon; continuing." msgstr "Fehler beim Laden des Icons; fahre fort...." -#: guiminer.py:1586 +#: guiminer.py:1648 msgid "OpenCL not found - can't add a OpenCL miner" msgstr "" "OpenCL wurde nicht gefunden - OpenCL-Miner kann nicht hinzugefügt werden" -#: guiminer.py:1623 +#: guiminer.py:1685 #, python-format msgid "GUIMiner - v%s" msgstr "GUIMiner - v%s" -#: guiminer.py:1665 +#: guiminer.py:1727 msgid "Name this miner:" msgstr "Name des Miners:" -#: guiminer.py:1665 +#: guiminer.py:1727 msgid "New miner" msgstr "Neuer Miner" -#: guiminer.py:1668 +#: guiminer.py:1730 msgid "Untitled" msgstr "Unbenannt" -#: guiminer.py:1679 +#: guiminer.py:1741 #, fuzzy msgid "External miner (*.exe)|*.exe|(*.py)|*.py" msgstr "Externer Miner (*.exe)|*.exe" -#: guiminer.py:1681 +#: guiminer.py:1743 msgid "Select external miner:" msgstr "Externen Miner auswählen:" -#: guiminer.py:1691 +#: guiminer.py:1753 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" msgstr "" "Nicht unterstützter externer Miner %(filename)s. Unterstützt werden: %" "(supported)s" -#: guiminer.py:1693 +#: guiminer.py:1755 msgid "Miner not supported" msgstr "Miner nicht unterstützt" -#: guiminer.py:1734 +#: guiminer.py:1796 msgid "Do you want to save changes?" msgstr "Einstellungen speichern?" -#: guiminer.py:1734 +#: guiminer.py:1796 msgid "Save" msgstr "Speichern" -#: guiminer.py:1764 +#: guiminer.py:1826 msgid "Saving: " msgstr "Speichern: " -#: guiminer.py:1770 +#: guiminer.py:1832 #, python-format msgid "" "Couldn't write save file %s.\n" @@ -633,114 +643,114 @@ msgstr "" "Konnte Konfigurationsdatei %s nicht schreiben.\n" "Überprüfe die Datei auf Beschreibbarkeit" -#: guiminer.py:1771 +#: guiminer.py:1833 msgid "Save unsuccessful" msgstr "Speichern nicht erfolgreich" -#: guiminer.py:1773 +#: guiminer.py:1835 #, python-format msgid "Profiles saved OK to %s." msgstr "Profile erfolgreich gespeichert unter %s." -#: guiminer.py:1774 +#: guiminer.py:1836 msgid "Save successful" msgstr "Erfolgreich gespeichert" -#: guiminer.py:1786 +#: guiminer.py:1848 #, python-format msgid "Loaded: %s" msgstr "Geladen: %s" -#: guiminer.py:1800 +#: guiminer.py:1862 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "Laden der Profile unterbricht alle Operationen. Fortfahren?" -#: guiminer.py:1801 +#: guiminer.py:1863 msgid "Load profile" msgstr "Profil laden" -#: guiminer.py:1830 +#: guiminer.py:1892 msgid "Select path to Bitcoin.exe" msgstr "Pfad zur Bitcoin.exe wählen" -#: guiminer.py:1842 +#: guiminer.py:1904 msgid "About" msgstr "Über" -#: guiminer.py:1868 +#: guiminer.py:1930 msgid "Closing this miner will stop it. Continue?" msgstr "Schließen des Miners beendet ihn. Fortfahren?" -#: guiminer.py:1869 +#: guiminer.py:1931 msgid "Close miner" msgstr "Miner schließen" -#: guiminer.py:1898 +#: guiminer.py:1960 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" msgstr "Konnte Bitcoin nicht unter %s finden. Pfad korrekt?" -#: guiminer.py:1899 +#: guiminer.py:1961 msgid "Launch failed" msgstr "Aufruf fehlgeschlagen" -#: guiminer.py:1902 +#: guiminer.py:1964 msgid "" -"Client launched ok. You can start a miner now with the server set to 'solo'." +"The Bitcoin client will now launch in server mode.\n" +"Once it connects to the network and downloads the block chain, you can start " +"a miner in 'solo' mode." msgstr "" -"Client erfolgreich gestartet. Neuer Miner mit Server \"solo\" kann gestartet " -"werden." -#: guiminer.py:1903 +#: guiminer.py:1965 msgid "Launched ok." msgstr "Aufruf erfolgreich." -#: guiminer.py:1918 +#: guiminer.py:1980 #, python-format msgid "%s already exists. Overwrite?" msgstr "%s existiert bereits. Fortfahren?" -#: guiminer.py:1919 +#: guiminer.py:1981 msgid "bitcoin.conf already exists." msgstr "bitcoin.conf existiert bereits." -#: guiminer.py:1924 +#: guiminer.py:1986 msgid "Enter password" msgstr "Passwort eingeben" -#: guiminer.py:1934 +#: guiminer.py:1996 msgid "Success" msgstr "Erfolgreich" -#: guiminer.py:1934 +#: guiminer.py:1996 msgid "Wrote bitcoin config ok." msgstr "bitcoin.conf geschrieben." -#: guiminer.py:1945 +#: guiminer.py:2007 msgid "Console" msgstr "Konsole" -#: guiminer.py:1957 +#: guiminer.py:2019 msgid "Summary" msgstr "Zusammenfassung" -#: guiminer.py:1970 +#: guiminer.py:2032 msgid "Rename miner" msgstr "Miner umbenennen" -#: guiminer.py:1970 +#: guiminer.py:2032 msgid "Rename to:" msgstr "Umbenennen zu:" -#: guiminer.py:1975 +#: guiminer.py:2037 msgid "Change language" msgstr "Sprache wechseln" -#: guiminer.py:1995 +#: guiminer.py:2057 msgid "Choose language (requires restart to take full effect)" msgstr "Sprache auswählen (Neustart erforderlich)" -#: guiminer.py:2040 +#: guiminer.py:2102 msgid "" "Click the link below to log in to the pool and get a special token. \n" "This token lets you securely check your balance.\n" @@ -751,19 +761,19 @@ msgstr "" "Um diesen Token für die Zukunft zu sichern, müssen die\n" "Einstellungen gespeichert werden." -#: guiminer.py:2049 +#: guiminer.py:2111 msgid "(Paste token here)" msgstr "(Token hier einfügen)" -#: guiminer.py:2075 +#: guiminer.py:2137 msgid "Copy address to clipboard" msgstr "Adresse in die Zwischenablage kopieren" -#: guiminer.py:2094 +#: guiminer.py:2156 msgid "No OpenCL devices found." msgstr "Keine OpenCL-Geräte gefunden." -#: guiminer.py:2097 +#: guiminer.py:2159 msgid "" "No OpenCL devices were found.\n" " If you only want to mine using CPU or CUDA, you can ignore this message.\n" @@ -778,9 +788,16 @@ msgstr "" "muss das AMD Stream SDK oder der aktuelle Catalyst-Treiber \n" "installiert werden." -#: guiminer.py:2107 +#: guiminer.py:2169 msgid "Don't show this message again" msgstr "Diese Nachrift nicht wieder anzeigen" +#~ msgid "" +#~ "Client launched ok. You can start a miner now with the server set to " +#~ "'solo'." +#~ msgstr "" +#~ "Client erfolgreich gestartet. Neuer Miner mit Server \"solo\" kann " +#~ "gestartet werden." + #~ msgid "%s mining!" #~ msgstr "%s" diff --git a/guiminer_es.po b/guiminer_es.po index a17d0cc..422bb9c 100644 --- a/guiminer_es.po +++ b/guiminer_es.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 12:41-0300\n" +"POT-Creation-Date: 2011-06-10 15:18-0300\n" "PO-Revision-Date: 2011-05-20 00:00-0000\n" "Last-Translator: Bitcoins Wallet \n" "Language-Team: Español\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: guiminer.py:84 +#: guiminer.py:89 #, python-format msgid "" "GUIMiner\n" @@ -47,220 +47,224 @@ msgstr "" "Incluso una sóla Bitcoin se aprecia y ayuda a motivar\n" "a los desarrolladores en el trabajo futuro.\n" -#: guiminer.py:105 +#: guiminer.py:110 msgid "Not started" msgstr "No iniciado" -#: guiminer.py:106 +#: guiminer.py:111 msgid "Starting..." msgstr "Empezando..." -#: guiminer.py:107 +#: guiminer.py:112 msgid "Stopped" msgstr "Detenido" -#: guiminer.py:108 +#: guiminer.py:113 msgid "Paused" msgstr "Pausado" -#: guiminer.py:109 +#: guiminer.py:114 msgid "Start mining!" msgstr "Iniciar la minería" -#: guiminer.py:110 +#: guiminer.py:115 msgid "Stop mining" msgstr "Parar la minería" -#: guiminer.py:111 +#: guiminer.py:116 msgid "Refresh balance" msgstr "Actualizar saldo" -#: guiminer.py:112 +#: guiminer.py:117 msgid "Connection error" msgstr "Error de conexión" -#: guiminer.py:113 +#: guiminer.py:118 msgid "Username:" msgstr "Usuario:" -#: guiminer.py:114 +#: guiminer.py:119 msgid "Password:" msgstr "Contraseña:" -#: guiminer.py:115 +#: guiminer.py:120 msgid "Quit this program" msgstr "Salir del programa" -#: guiminer.py:116 +#: guiminer.py:121 msgid "Show about dialog" msgstr "Acerca de..." -#: guiminer.py:197 +#: guiminer.py:202 #, python-format msgid "%.1f Ghash/s" msgstr "%.1f Ghash/s" -#: guiminer.py:199 +#: guiminer.py:204 #, python-format msgid "%.1f Mhash/s" msgstr "%.1f Mhash/s" -#: guiminer.py:201 +#: guiminer.py:206 msgid "Connecting..." msgstr "Conectando..." -#: guiminer.py:203 +#: guiminer.py:208 #, python-format msgid "%d khash/s" msgstr "%d khash/s" -#: guiminer.py:227 +#: guiminer.py:232 #, python-format msgid "Requesting balance: %(request)s" msgstr "Solicitando saldo: %(request)s" -#: guiminer.py:231 +#: guiminer.py:236 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "Contestación del Servidor: %(status)s, %(data)s" -#: guiminer.py:286 +#: guiminer.py:303 msgid "Miner" msgstr "Minero" -#: guiminer.py:287 +#: guiminer.py:304 msgid "Speed" msgstr "Velocidad" -#: guiminer.py:288 +#: guiminer.py:305 msgid "Accepted" msgstr "Aceptado" -#: guiminer.py:289 +#: guiminer.py:306 msgid "Stale" msgstr "Caducado" -#: guiminer.py:290 +#: guiminer.py:307 msgid "Start/Stop" msgstr "Iniciar/Parar" -#: guiminer.py:291 +#: guiminer.py:308 msgid "Autostart" msgstr "Inicio auto." -#: guiminer.py:375 +#: guiminer.py:392 msgid "Pause all" msgstr "Pausar todos" -#: guiminer.py:377 +#: guiminer.py:394 msgid "Restore" msgstr "Restaurar" -#: guiminer.py:378 +#: guiminer.py:395 msgid "Close" msgstr "Cerrar" -#: guiminer.py:434 +#: guiminer.py:451 #, python-format msgid "Listener for \"%s\" started" msgstr "Minero \"%s\" iniciado" -#: guiminer.py:449 +#: guiminer.py:466 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "Minero \"%(name)s\": %(line)s" -#: guiminer.py:452 +#: guiminer.py:469 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "Minero \"%s\" cerrando" -#: guiminer.py:496 +#: guiminer.py:515 msgid "Server:" msgstr "Grupo:" -#: guiminer.py:501 +#: guiminer.py:520 msgid "Website:" msgstr "Sitio web:" -#: guiminer.py:503 +#: guiminer.py:522 msgid "Ext. Path:" msgstr "Ruta externa" -#: guiminer.py:505 +#: guiminer.py:524 msgid "Host:" msgstr "Servidor:" -#: guiminer.py:507 +#: guiminer.py:526 msgid "Port:" msgstr "Puerto:" -#: guiminer.py:513 +#: guiminer.py:532 msgid "Device:" msgstr "Dispositivo:" -#: guiminer.py:514 +#: guiminer.py:533 msgid "No OpenCL devices" msgstr "No hay dispositivos OpenCL" -#: guiminer.py:515 +#: guiminer.py:534 msgid "Extra flags:" msgstr "Opciones extra:" -#: guiminer.py:518 +#: guiminer.py:537 +msgid "CPU Affinity:" +msgstr "" + +#: guiminer.py:540 msgid "Balance:" msgstr "Saldo:" -#: guiminer.py:522 +#: guiminer.py:544 msgid "Withdraw" msgstr "Retirar saldo" -#: guiminer.py:667 +#: guiminer.py:704 msgid "Default" msgstr "Por defecto" -#: guiminer.py:714 +#: guiminer.py:755 msgid "Start" msgstr "Iniciar" -#: guiminer.py:714 +#: guiminer.py:755 msgid "Stop" msgstr "Parar" -#: guiminer.py:730 +#: guiminer.py:771 msgid "Connection problems" msgstr "Problemas de conexión" -#: guiminer.py:889 +#: guiminer.py:930 msgid "Running command: " msgstr "Ejecutando comando: " -#: guiminer.py:943 +#: guiminer.py:989 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "Dificultad 1 hashes: %(nhashes)d %(update_time)s" -#: guiminer.py:947 +#: guiminer.py:993 #, python-format msgid "Blocks: %d, " msgstr "Bloques: %d, " -#: guiminer.py:950 +#: guiminer.py:996 #, python-format msgid "Shares: %d accepted" msgstr "Tareas: %d aceptadas" -#: guiminer.py:952 +#: guiminer.py:998 #, python-format msgid ", %d stale/invalid" msgstr ", %d caducada/inválida" -#: guiminer.py:974 +#: guiminer.py:1020 #, python-format msgid "- last at %s" msgstr "- última: %s" -#: guiminer.py:1047 +#: guiminer.py:1093 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." @@ -268,23 +272,23 @@ msgstr "" "Grupo donde conectar. Cada grupo tiene diferentes tasas y características.\n" "Ver sus páginas web para obtener toda la información." -#: guiminer.py:1048 +#: guiminer.py:1094 msgid "Website of the currently selected server. Click to visit." msgstr "Página web del grupo seleccionado actualmente. Clic para visitar" -#: guiminer.py:1049 +#: guiminer.py:1095 msgid "Available OpenCL devices on your system." msgstr "Dispositivos OpenCL disponibles en tu sistema" -#: guiminer.py:1050 +#: guiminer.py:1096 msgid "Host address, without http:// prefix." msgstr "Dirección del Servidor, sin el prefijo http://." -#: guiminer.py:1051 +#: guiminer.py:1097 msgid "Server port. This is usually 8332." msgstr "Puerto del servidor. Generalmente 8332." -#: guiminer.py:1052 +#: guiminer.py:1098 msgid "" "The miner's username.\n" "May be different than your account username.\n" @@ -294,7 +298,7 @@ msgstr "" "Puede ser diferente al usuario de la cuenta.\n" "Ejemplo: BitcoinsWallet.GPU" -#: guiminer.py:1053 +#: guiminer.py:1099 msgid "" "The miner's password.\n" "May be different than your account password." @@ -302,7 +306,7 @@ msgstr "" "Contraseña del minero.\n" "Puede ser diferente a la contraseña de la cuenta.\n" -#: guiminer.py:1054 +#: guiminer.py:1100 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" @@ -312,39 +316,45 @@ msgstr "" "Para obtener mejores resultados con las Radeon HD 5xxx utiliza -v -w128.\n" "Para otras tarjetas, consultar el foro: http://forum.bitcoin.org/." -#: guiminer.py:1148 guiminer.py:1242 guiminer.py:1263 +#: guiminer.py:1102 +msgid "" +"CPU cores used for mining.\n" +"Unchecking some cores can reduce high CPU usage in some systems." +msgstr "" + +#: guiminer.py:1196 guiminer.py:1290 guiminer.py:1311 msgid "Auth token rejected by server." msgstr "Código de autorización rechazado por el servidor" -#: guiminer.py:1166 +#: guiminer.py:1214 #, python-format msgid "%s confirmed" msgstr "%s confirmado" -#: guiminer.py:1168 +#: guiminer.py:1216 #, python-format msgid ", %s unconfirmed" msgstr ", %s sin confirmar" -#: guiminer.py:1170 +#: guiminer.py:1218 msgid "Bad response from server." msgstr "Respuesta incorrecta del servidor." -#: guiminer.py:1246 guiminer.py:1267 +#: guiminer.py:1294 guiminer.py:1315 msgid "Withdraw OK" msgstr "Retirada de saldo correcta" -#: guiminer.py:1426 +#: guiminer.py:1485 msgid "No registration is required - just enter an address and press Start." msgstr "" "No es necesario el registro - sólo introduce una dirección y presiona " "Iniciar." -#: guiminer.py:1428 +#: guiminer.py:1487 msgid "Address:" msgstr "Dirección:" -#: guiminer.py:1430 +#: guiminer.py:1489 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" @@ -352,7 +362,7 @@ msgstr "" "Tu cuenta para recibir Bitcoins.\n" "Ejemplo: 1LSEcWhBwvQ6r5wWC6ZfHRtDrTmybqXbLk" -#: guiminer.py:1445 +#: guiminer.py:1505 msgid "" "Your miner username (not your account username).\n" "Example: Kiv.GPU" @@ -360,11 +370,11 @@ msgstr "" "Tu usuario del minero, (no el usuario de la cuenta).\n" "Ejemplo: BitcoinsWallet.GPU" -#: guiminer.py:1447 guiminer.py:1467 +#: guiminer.py:1507 guiminer.py:1528 msgid "Your miner password (not your account password)." msgstr "Contraseña del minero (no la contraseña de la cuenta).\n" -#: guiminer.py:1465 +#: guiminer.py:1526 msgid "" "Your miner username. \n" "Example: kiv123@kiv123" @@ -372,246 +382,246 @@ msgstr "" "El usuario del minero. \n" "Ejemplo: BitcoinsWallet@kiv123" -#: guiminer.py:1481 +#: guiminer.py:1543 msgid "The e-mail address you registered with." msgstr "El correo electrónico con el que te registraste." -#: guiminer.py:1482 +#: guiminer.py:1544 msgid "Email:" msgstr "Correo electrónico:" -#: guiminer.py:1497 +#: guiminer.py:1559 msgid "&Rename..." msgstr "&Renombrar..." -#: guiminer.py:1497 +#: guiminer.py:1559 msgid "Rename this miner" msgstr "Renombrar este minero" -#: guiminer.py:1522 +#: guiminer.py:1584 msgid "&New OpenCL miner..." msgstr "&Nuevo minero OpenCL..." -#: guiminer.py:1522 +#: guiminer.py:1584 msgid "Create a new OpenCL miner (default for ATI cards)" msgstr "" -#: guiminer.py:1523 +#: guiminer.py:1585 #, fuzzy msgid "Create a new Phoenix miner (for some ATI cards)" msgstr "Crear un nuevo perfil de minero" -#: guiminer.py:1523 +#: guiminer.py:1585 #, fuzzy msgid "New Phoenix miner..." msgstr "Nuevo minero diferente..." -#: guiminer.py:1524 +#: guiminer.py:1586 msgid "Create a new CUDA miner (for NVIDIA cards)" msgstr "" -#: guiminer.py:1524 +#: guiminer.py:1586 #, fuzzy msgid "New CUDA miner..." msgstr "&Nuevo minero OpenCL..." -#: guiminer.py:1525 +#: guiminer.py:1587 #, fuzzy msgid "Create a new Ufasoft miner (for CPUs)" msgstr "Crear un nuevo perfil de minero" -#: guiminer.py:1525 +#: guiminer.py:1587 #, fuzzy msgid "New Ufasoft CPU miner..." msgstr "Nuevo minero diferente..." -#: guiminer.py:1526 +#: guiminer.py:1588 #, fuzzy msgid "Create a new custom miner (requires external program)" msgstr "Crear un nuevo minero CPU o CUDA (requiere un programa externo)" -#: guiminer.py:1526 +#: guiminer.py:1588 msgid "New &other miner..." msgstr "Nuevo minero diferente..." -#: guiminer.py:1527 +#: guiminer.py:1589 #, fuzzy msgid "&New miner" msgstr "Nuevo minero" -#: guiminer.py:1528 +#: guiminer.py:1590 msgid "&Save settings" msgstr "&Guardar opciones" -#: guiminer.py:1528 +#: guiminer.py:1590 msgid "Save your settings" msgstr "Guardar tus opciones" -#: guiminer.py:1529 +#: guiminer.py:1591 msgid "&Load settings" msgstr "&Cargar opciones" -#: guiminer.py:1529 +#: guiminer.py:1591 msgid "Load stored settings" msgstr "Cargar las opciones guardadas" -#: guiminer.py:1530 +#: guiminer.py:1592 msgid "Quit" msgstr "Salir" -#: guiminer.py:1531 +#: guiminer.py:1593 msgid "&File" msgstr "&Archivo" -#: guiminer.py:1535 +#: guiminer.py:1597 msgid "Show summary" msgstr "Mostrar sumario" -#: guiminer.py:1535 +#: guiminer.py:1597 msgid "Show summary of all miners" msgstr "Mostrar sumario de todos los mineros" -#: guiminer.py:1536 +#: guiminer.py:1598 msgid "Show console" msgstr "Mostrar consola" -#: guiminer.py:1536 +#: guiminer.py:1598 msgid "Show console logs" msgstr "Mostrar los registros de la consola" -#: guiminer.py:1537 +#: guiminer.py:1599 msgid "&View" msgstr "&Ver" -#: guiminer.py:1541 +#: guiminer.py:1603 msgid "&Create solo password..." msgstr "&Crear usuario/contraseña..." -#: guiminer.py:1541 +#: guiminer.py:1603 msgid "Configure a user/pass for solo mining" msgstr "Configurar un usuario/contraseña para la minería en modo 'solo'" -#: guiminer.py:1542 +#: guiminer.py:1604 msgid "&Set Bitcoin client path..." msgstr "&Configurar la ruta del cliente Bitcoin..." -#: guiminer.py:1542 +#: guiminer.py:1604 msgid "Set the location of the official Bitcoin client" msgstr "Configurar la ruta del cliente oficial Bitcoin." -#: guiminer.py:1543 +#: guiminer.py:1605 msgid "&Launch Bitcoin client as server" msgstr "&Ejecutar el cliente Bitcoin como servidor" -#: guiminer.py:1543 +#: guiminer.py:1605 msgid "Launch the official Bitcoin client as a server for solo mining" msgstr "" "Ejecutar el cliente Bitcoin como servidor para la minería en modo 'solo'" -#: guiminer.py:1544 +#: guiminer.py:1606 msgid "&Solo utilities" msgstr "&Minería en modo 'solo'" -#: guiminer.py:1548 +#: guiminer.py:1610 #, fuzzy msgid "Start &minimized" msgstr "Iniciar la minería" -#: guiminer.py:1548 +#: guiminer.py:1610 msgid "Start the GUI minimized to the tray." msgstr "" -#: guiminer.py:1550 +#: guiminer.py:1612 msgid "&Options" msgstr "" -#: guiminer.py:1554 +#: guiminer.py:1616 msgid "&Change language..." msgstr "&Cambiar idioma..." -#: guiminer.py:1555 +#: guiminer.py:1617 msgid "Language" msgstr "Idioma" -#: guiminer.py:1559 +#: guiminer.py:1621 msgid "&Donate 99 cents..." msgstr "" -#: guiminer.py:1559 +#: guiminer.py:1621 msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" msgstr "" -#: guiminer.py:1560 +#: guiminer.py:1622 #, fuzzy msgid "&Donate" msgstr "&Acerca de/Donaciones..." -#: guiminer.py:1563 +#: guiminer.py:1625 #, fuzzy msgid "&About..." msgstr "&Acerca de/Donaciones..." -#: guiminer.py:1565 +#: guiminer.py:1627 msgid "&Help" msgstr "&Ayuda" -#: guiminer.py:1577 +#: guiminer.py:1639 msgid "Failed to load taskbar icon; continuing." msgstr "Error al cargar el icono de bandeja del sistema; continunando...." -#: guiminer.py:1586 +#: guiminer.py:1648 msgid "OpenCL not found - can't add a OpenCL miner" msgstr "OpenCL no encontrado. No se puede añadir un minero OpenCL" -#: guiminer.py:1623 +#: guiminer.py:1685 #, python-format msgid "GUIMiner - v%s" msgstr "GUIMiner - v%s" -#: guiminer.py:1665 +#: guiminer.py:1727 msgid "Name this miner:" msgstr "Nombre para este minero:" -#: guiminer.py:1665 +#: guiminer.py:1727 msgid "New miner" msgstr "Nuevo minero" -#: guiminer.py:1668 +#: guiminer.py:1730 msgid "Untitled" msgstr "Sin nombre" -#: guiminer.py:1679 +#: guiminer.py:1741 #, fuzzy msgid "External miner (*.exe)|*.exe|(*.py)|*.py" msgstr "Minero externo (*.exe)|*.exe" -#: guiminer.py:1681 +#: guiminer.py:1743 msgid "Select external miner:" msgstr "Seleccionar un minero externo:" -#: guiminer.py:1691 +#: guiminer.py:1753 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" msgstr "" "Minero externo %(filename)s no compatible. Los compatibles son: %(supported)" -#: guiminer.py:1693 +#: guiminer.py:1755 msgid "Miner not supported" msgstr "Minero no compatible" -#: guiminer.py:1734 +#: guiminer.py:1796 msgid "Do you want to save changes?" msgstr "¿Quieres guardar los cambios?" -#: guiminer.py:1734 +#: guiminer.py:1796 msgid "Save" msgstr "Guardar" -#: guiminer.py:1764 +#: guiminer.py:1826 msgid "Saving: " msgstr "Guardando: " -#: guiminer.py:1770 +#: guiminer.py:1832 #, python-format msgid "" "Couldn't write save file %s.\n" @@ -620,114 +630,114 @@ msgstr "" "No se puede guardar el archivo %s.\n" "Comprueba que la ubicación permite la escritura" -#: guiminer.py:1771 +#: guiminer.py:1833 msgid "Save unsuccessful" msgstr "Error al guardar" -#: guiminer.py:1773 +#: guiminer.py:1835 #, python-format msgid "Profiles saved OK to %s." msgstr "Los perfiles se han guardado correctamente en %s." -#: guiminer.py:1774 +#: guiminer.py:1836 msgid "Save successful" msgstr "Guardado correcto" -#: guiminer.py:1786 +#: guiminer.py:1848 #, python-format msgid "Loaded: %s" msgstr "Cargado: %s" -#: guiminer.py:1800 +#: guiminer.py:1862 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "Cargar los perfiles parará los mineros que trabajen ahora. Продолжить?" -#: guiminer.py:1801 +#: guiminer.py:1863 msgid "Load profile" msgstr "Cargar perfil" -#: guiminer.py:1830 +#: guiminer.py:1892 msgid "Select path to Bitcoin.exe" msgstr "Seleccionar ruta para Bitcoin.exe" -#: guiminer.py:1842 +#: guiminer.py:1904 msgid "About" msgstr "Acerca de" -#: guiminer.py:1868 +#: guiminer.py:1930 msgid "Closing this miner will stop it. Continue?" msgstr "Cerrar este minero lo parará. ¿Continuar?" -#: guiminer.py:1869 +#: guiminer.py:1931 msgid "Close miner" msgstr "Cerrar minero" -#: guiminer.py:1898 +#: guiminer.py:1960 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" msgstr "No se puede encontrar Bitcoin en %s. ¿La ruta es correcta?" -#: guiminer.py:1899 +#: guiminer.py:1961 msgid "Launch failed" msgstr "Fallo al iniciar" -#: guiminer.py:1902 +#: guiminer.py:1964 msgid "" -"Client launched ok. You can start a miner now with the server set to 'solo'." +"The Bitcoin client will now launch in server mode.\n" +"Once it connects to the network and downloads the block chain, you can start " +"a miner in 'solo' mode." msgstr "" -"Cliente ejecutado correctamente. Ahora puedes iniciar\n" -"un minero con el servidor configurado en modo 'solo'" -#: guiminer.py:1903 +#: guiminer.py:1965 msgid "Launched ok." msgstr "Ejecutado correctamente." -#: guiminer.py:1918 +#: guiminer.py:1980 #, python-format msgid "%s already exists. Overwrite?" msgstr "%s ya existe. ¿Sobreescribir?" -#: guiminer.py:1919 +#: guiminer.py:1981 msgid "bitcoin.conf already exists." msgstr "bitcoin.conf ya existe." -#: guiminer.py:1924 +#: guiminer.py:1986 msgid "Enter password" msgstr "Introducir contraseña" -#: guiminer.py:1934 +#: guiminer.py:1996 msgid "Success" msgstr "Correcto" -#: guiminer.py:1934 +#: guiminer.py:1996 msgid "Wrote bitcoin config ok." msgstr "bitcoin.conf escrito correctamente." -#: guiminer.py:1945 +#: guiminer.py:2007 msgid "Console" msgstr "Consola" -#: guiminer.py:1957 +#: guiminer.py:2019 msgid "Summary" msgstr "Sumario" -#: guiminer.py:1970 +#: guiminer.py:2032 msgid "Rename miner" msgstr "Renombrar minero" -#: guiminer.py:1970 +#: guiminer.py:2032 msgid "Rename to:" msgstr "Renombrar a:" -#: guiminer.py:1975 +#: guiminer.py:2037 msgid "Change language" msgstr "Cambiar idioma" -#: guiminer.py:1995 +#: guiminer.py:2057 msgid "Choose language (requires restart to take full effect)" msgstr "Elegir idioma (se necesita reiniciar para completar)" -#: guiminer.py:2040 +#: guiminer.py:2102 msgid "" "Click the link below to log in to the pool and get a special token. \n" "This token lets you securely check your balance.\n" @@ -738,19 +748,19 @@ msgstr "" "segura.\n" "Para guardar este código, deberás guardar la configuración de tu minero." -#: guiminer.py:2049 +#: guiminer.py:2111 msgid "(Paste token here)" msgstr "(Pegar el código aquí)" -#: guiminer.py:2075 +#: guiminer.py:2137 msgid "Copy address to clipboard" msgstr "Copiar dirección al portapapeles" -#: guiminer.py:2094 +#: guiminer.py:2156 msgid "No OpenCL devices found." msgstr "No se han encontrado dispositivos OpenCL." -#: guiminer.py:2097 +#: guiminer.py:2159 msgid "" "No OpenCL devices were found.\n" " If you only want to mine using CPU or CUDA, you can ignore this message.\n" @@ -764,9 +774,16 @@ msgstr "" "SDK del ATI Stream\n" "o tu GPU podría no aceptar OpenCL.\n" -#: guiminer.py:2107 +#: guiminer.py:2169 msgid "Don't show this message again" msgstr "No volver a mostrar este mensaje" +#~ msgid "" +#~ "Client launched ok. You can start a miner now with the server set to " +#~ "'solo'." +#~ msgstr "" +#~ "Cliente ejecutado correctamente. Ahora puedes iniciar\n" +#~ "un minero con el servidor configurado en modo 'solo'" + #~ msgid "%s mining!" #~ msgstr "%s minería" diff --git a/guiminer_fr.po b/guiminer_fr.po index f4ce120..49426be 100644 --- a/guiminer_fr.po +++ b/guiminer_fr.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 12:41-0300\n" +"POT-Creation-Date: 2011-06-10 15:18-0300\n" "PO-Revision-Date: 2011-05-24 18:37+0100\n" "Last-Translator: Cramoisan Florian \n" "Language-Team: Russian\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: guiminer.py:84 +#: guiminer.py:89 #, python-format msgid "" "GUIMiner\n" @@ -58,223 +58,227 @@ msgstr "" "\n" "\n" -#: guiminer.py:105 +#: guiminer.py:110 msgid "Not started" msgstr "Non démarré" -#: guiminer.py:106 +#: guiminer.py:111 msgid "Starting..." msgstr "Démarrage..." -#: guiminer.py:107 +#: guiminer.py:112 msgid "Stopped" msgstr "Arrêté" -#: guiminer.py:108 +#: guiminer.py:113 msgid "Paused" msgstr "En pause" -#: guiminer.py:109 +#: guiminer.py:114 msgid "Start mining!" msgstr "Commencer le minage!" -#: guiminer.py:110 +#: guiminer.py:115 msgid "Stop mining" msgstr "Arrêter de miner!" -#: guiminer.py:111 +#: guiminer.py:116 msgid "Refresh balance" msgstr "Raffraîchir la répartition" -#: guiminer.py:112 +#: guiminer.py:117 msgid "Connection error" msgstr "Erreur de connection" -#: guiminer.py:113 +#: guiminer.py:118 msgid "Username:" msgstr "Nom d'utilisateur:" -#: guiminer.py:114 +#: guiminer.py:119 msgid "Password:" msgstr "Mot de passe:" -#: guiminer.py:115 +#: guiminer.py:120 msgid "Quit this program" msgstr "Quitter le programme" -#: guiminer.py:116 +#: guiminer.py:121 msgid "Show about dialog" msgstr "Afficher la boîte de dialogue À Propos" -#: guiminer.py:197 +#: guiminer.py:202 #, python-format msgid "%.1f Ghash/s" msgstr "%.1f Ghash/s" -#: guiminer.py:199 +#: guiminer.py:204 #, python-format msgid "%.1f Mhash/s" msgstr "%.1f Mhash/s" -#: guiminer.py:201 +#: guiminer.py:206 msgid "Connecting..." msgstr "Connexion en cours..." -#: guiminer.py:203 +#: guiminer.py:208 #, python-format msgid "%d khash/s" msgstr "%d khash/s" -#: guiminer.py:227 +#: guiminer.py:232 #, python-format msgid "Requesting balance: %(request)s" msgstr "Requête de répartition : %(request)s" -#: guiminer.py:231 +#: guiminer.py:236 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "Réponse du serveur: %(status)s, %(data)s" -#: guiminer.py:286 +#: guiminer.py:303 msgid "Miner" msgstr "Miner" -#: guiminer.py:287 +#: guiminer.py:304 msgid "Speed" msgstr "Vitesse" -#: guiminer.py:288 +#: guiminer.py:305 msgid "Accepted" msgstr "Accepté" # Pas totalement sur pour stale, donc si quelqu'un a une idée... # Je suis ouvert à toute correction vous pouvez me joindre à l'adresse florian.cramoisan@gmail.com # Cordialement Florian Cramoisan -#: guiminer.py:289 +#: guiminer.py:306 msgid "Stale" msgstr "Périmé (Stale)" -#: guiminer.py:290 +#: guiminer.py:307 msgid "Start/Stop" msgstr "Démarrer/Arrêter" -#: guiminer.py:291 +#: guiminer.py:308 msgid "Autostart" msgstr "Démarrage auto" -#: guiminer.py:375 +#: guiminer.py:392 msgid "Pause all" msgstr "Mettre tout en pause" -#: guiminer.py:377 +#: guiminer.py:394 msgid "Restore" msgstr "Restaurer" -#: guiminer.py:378 +#: guiminer.py:395 msgid "Close" msgstr "Fermer" -#: guiminer.py:434 +#: guiminer.py:451 #, python-format msgid "Listener for \"%s\" started" msgstr "Démarrage de l'écoute de \"%s\" " -#: guiminer.py:449 +#: guiminer.py:466 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "Écouteur pour \"%(name)s\": %(line)s" -#: guiminer.py:452 +#: guiminer.py:469 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "Arrêt de l'écoute de \"%s\" " -#: guiminer.py:496 +#: guiminer.py:515 msgid "Server:" msgstr "Serveur:" -#: guiminer.py:501 +#: guiminer.py:520 msgid "Website:" msgstr "Site Web:" -#: guiminer.py:503 +#: guiminer.py:522 msgid "Ext. Path:" msgstr "Chemin :" -#: guiminer.py:505 +#: guiminer.py:524 msgid "Host:" msgstr "Hôte:" -#: guiminer.py:507 +#: guiminer.py:526 msgid "Port:" msgstr "Port:" -#: guiminer.py:513 +#: guiminer.py:532 msgid "Device:" msgstr "Périphérique:" -#: guiminer.py:514 +#: guiminer.py:533 msgid "No OpenCL devices" msgstr "Aucun périphérique OpenCL" -#: guiminer.py:515 +#: guiminer.py:534 msgid "Extra flags:" msgstr "Paramètres supplémentaires:" -#: guiminer.py:518 +#: guiminer.py:537 +msgid "CPU Affinity:" +msgstr "" + +#: guiminer.py:540 msgid "Balance:" msgstr "Répartition: " -#: guiminer.py:522 +#: guiminer.py:544 msgid "Withdraw" msgstr "Se retirer" -#: guiminer.py:667 +#: guiminer.py:704 msgid "Default" msgstr "Défaut" -#: guiminer.py:714 +#: guiminer.py:755 msgid "Start" msgstr "Démarrer" -#: guiminer.py:714 +#: guiminer.py:755 msgid "Stop" msgstr "Arrêter" -#: guiminer.py:730 +#: guiminer.py:771 msgid "Connection problems" msgstr "Problème lors de la connexion" -#: guiminer.py:889 +#: guiminer.py:930 msgid "Running command: " msgstr "Execution de la commande: " -#: guiminer.py:943 +#: guiminer.py:989 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "Difficulté 1 hash: %(nhashes)d %(update_time)s" -#: guiminer.py:947 +#: guiminer.py:993 #, python-format msgid "Blocks: %d, " msgstr "Blocs: %d, " -#: guiminer.py:950 +#: guiminer.py:996 #, python-format msgid "Shares: %d accepted" msgstr "Partages: %d accepté" -#: guiminer.py:952 +#: guiminer.py:998 #, python-format msgid ", %d stale/invalid" msgstr ", %d est invalide" -#: guiminer.py:974 +#: guiminer.py:1020 #, python-format msgid "- last at %s" msgstr "Dernière modification le %s" -#: guiminer.py:1047 +#: guiminer.py:1093 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." @@ -283,23 +287,23 @@ msgstr "" "options.\n" "Regardez leur site pour plus d'informations." -#: guiminer.py:1048 +#: guiminer.py:1094 msgid "Website of the currently selected server. Click to visit." msgstr "Site web du serveur selectionné. Cliquez pour le visiter" -#: guiminer.py:1049 +#: guiminer.py:1095 msgid "Available OpenCL devices on your system." msgstr "Périphériques OpenCL Disponibles." -#: guiminer.py:1050 +#: guiminer.py:1096 msgid "Host address, without http:// prefix." msgstr "Adresse de l'hôte, sans le préfixe http://." -#: guiminer.py:1051 +#: guiminer.py:1097 msgid "Server port. This is usually 8332." msgstr "Port du serveur. Habituellement 8332." -#: guiminer.py:1052 +#: guiminer.py:1098 msgid "" "The miner's username.\n" "May be different than your account username.\n" @@ -309,7 +313,7 @@ msgstr "" "Peut différer du nom d'utilisateur de votre compte.\n" "Exemple: Kiv.GPU" -#: guiminer.py:1053 +#: guiminer.py:1099 msgid "" "The miner's password.\n" "May be different than your account password." @@ -317,7 +321,7 @@ msgstr "" "Mot de passe du miner.\n" "Peut différer du mot de passe de votre compte." -#: guiminer.py:1054 +#: guiminer.py:1100 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" @@ -328,39 +332,45 @@ msgstr "" "rendement.\n" "Pour les autres cartes, consultez le forum." -#: guiminer.py:1148 guiminer.py:1242 guiminer.py:1263 +#: guiminer.py:1102 +msgid "" +"CPU cores used for mining.\n" +"Unchecking some cores can reduce high CPU usage in some systems." +msgstr "" + +#: guiminer.py:1196 guiminer.py:1290 guiminer.py:1311 msgid "Auth token rejected by server." msgstr "" -#: guiminer.py:1166 +#: guiminer.py:1214 #, python-format msgid "%s confirmed" msgstr "%s confirmé" -#: guiminer.py:1168 +#: guiminer.py:1216 #, python-format msgid ", %s unconfirmed" msgstr ", %s n'a pas été confirmé" -#: guiminer.py:1170 +#: guiminer.py:1218 msgid "Bad response from server." msgstr "Mauvaise réponse du serveur." -#: guiminer.py:1246 guiminer.py:1267 +#: guiminer.py:1294 guiminer.py:1315 msgid "Withdraw OK" msgstr "Retiré" -#: guiminer.py:1426 +#: guiminer.py:1485 msgid "No registration is required - just enter an address and press Start." msgstr "" "Aucun enregistrement requis, entrez seulement une adresse et cliquez sur " "Démarrer" -#: guiminer.py:1428 +#: guiminer.py:1487 msgid "Address:" msgstr "&Adresse électronique :" -#: guiminer.py:1430 +#: guiminer.py:1489 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" @@ -368,7 +378,7 @@ msgstr "" "Votre adresse de réception des bitcoins.\n" "Example: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" -#: guiminer.py:1445 +#: guiminer.py:1505 msgid "" "Your miner username (not your account username).\n" "Example: Kiv.GPU" @@ -376,11 +386,11 @@ msgstr "" "Votre nom d'utilisateur de miner (pas celui de votre compte). \n" "Example:kiv.GPU" -#: guiminer.py:1447 guiminer.py:1467 +#: guiminer.py:1507 guiminer.py:1528 msgid "Your miner password (not your account password)." msgstr "Votre mot de passe de miner (pas celui de votre compte)." -#: guiminer.py:1465 +#: guiminer.py:1526 msgid "" "Your miner username. \n" "Example: kiv123@kiv123" @@ -388,246 +398,246 @@ msgstr "" "Votre nom d'utilisateur de miner. \n" "Example:kiv123@kiv123" -#: guiminer.py:1481 +#: guiminer.py:1543 msgid "The e-mail address you registered with." msgstr "L'adresse mail avec laquelle vous vous êtes enregistré." -#: guiminer.py:1482 +#: guiminer.py:1544 msgid "Email:" msgstr "Email:" -#: guiminer.py:1497 +#: guiminer.py:1559 msgid "&Rename..." msgstr "&Renommer..." -#: guiminer.py:1497 +#: guiminer.py:1559 msgid "Rename this miner" msgstr "Renommer le miner" -#: guiminer.py:1522 +#: guiminer.py:1584 msgid "&New OpenCL miner..." msgstr "&Nouveau miner OpenCL..." -#: guiminer.py:1522 +#: guiminer.py:1584 msgid "Create a new OpenCL miner (default for ATI cards)" msgstr "" -#: guiminer.py:1523 +#: guiminer.py:1585 #, fuzzy msgid "Create a new Phoenix miner (for some ATI cards)" msgstr "Créer un profil avec un nouveau miner" -#: guiminer.py:1523 +#: guiminer.py:1585 #, fuzzy msgid "New Phoenix miner..." msgstr "N&ouveau miner..." -#: guiminer.py:1524 +#: guiminer.py:1586 msgid "Create a new CUDA miner (for NVIDIA cards)" msgstr "" -#: guiminer.py:1524 +#: guiminer.py:1586 #, fuzzy msgid "New CUDA miner..." msgstr "&Nouveau miner OpenCL..." -#: guiminer.py:1525 +#: guiminer.py:1587 #, fuzzy msgid "Create a new Ufasoft miner (for CPUs)" msgstr "Créer un profil avec un nouveau miner" -#: guiminer.py:1525 +#: guiminer.py:1587 #, fuzzy msgid "New Ufasoft CPU miner..." msgstr "N&ouveau miner..." -#: guiminer.py:1526 +#: guiminer.py:1588 #, fuzzy msgid "Create a new custom miner (requires external program)" msgstr "Créer un miner CPU ou CUDA (nécessite un programme externe)" -#: guiminer.py:1526 +#: guiminer.py:1588 msgid "New &other miner..." msgstr "N&ouveau miner..." -#: guiminer.py:1527 +#: guiminer.py:1589 #, fuzzy msgid "&New miner" msgstr "Nouveau miner" -#: guiminer.py:1528 +#: guiminer.py:1590 msgid "&Save settings" msgstr "&Sauver les paramètres" -#: guiminer.py:1528 +#: guiminer.py:1590 msgid "Save your settings" msgstr "Sauver vos paramètres" -#: guiminer.py:1529 +#: guiminer.py:1591 msgid "&Load settings" msgstr "&Charger les paramètres" -#: guiminer.py:1529 +#: guiminer.py:1591 msgid "Load stored settings" msgstr "Charger des paramètres enregistrés" -#: guiminer.py:1530 +#: guiminer.py:1592 msgid "Quit" msgstr "Quitter" -#: guiminer.py:1531 +#: guiminer.py:1593 msgid "&File" msgstr "&Fichier" -#: guiminer.py:1535 +#: guiminer.py:1597 msgid "Show summary" msgstr "Afficher le résumé" -#: guiminer.py:1535 +#: guiminer.py:1597 msgid "Show summary of all miners" msgstr "Afficher le résumé pour tous les miners" -#: guiminer.py:1536 +#: guiminer.py:1598 msgid "Show console" msgstr "Afficher la console" -#: guiminer.py:1536 +#: guiminer.py:1598 msgid "Show console logs" msgstr "Afficher les logs de la console" -#: guiminer.py:1537 +#: guiminer.py:1599 msgid "&View" msgstr "&Affichage" -#: guiminer.py:1541 +#: guiminer.py:1603 msgid "&Create solo password..." msgstr "&Créer un mot de passe solo..." -#: guiminer.py:1541 +#: guiminer.py:1603 msgid "Configure a user/pass for solo mining" msgstr "Veuillez fournir un utilisateur/mot de passe pour le mining en solo" -#: guiminer.py:1542 +#: guiminer.py:1604 msgid "&Set Bitcoin client path..." msgstr "&Changer le chemin vers le client Bitcoin..." -#: guiminer.py:1542 +#: guiminer.py:1604 msgid "Set the location of the official Bitcoin client" msgstr "Chemin du Bitcoin officiel" -#: guiminer.py:1543 +#: guiminer.py:1605 msgid "&Launch Bitcoin client as server" msgstr "&Lancer le client bitcoin en tant que serveur" -#: guiminer.py:1543 +#: guiminer.py:1605 msgid "Launch the official Bitcoin client as a server for solo mining" msgstr "Lancer le client Bitcoin officiel pour un minage solo." -#: guiminer.py:1544 +#: guiminer.py:1606 msgid "&Solo utilities" msgstr "&Outils solo" -#: guiminer.py:1548 +#: guiminer.py:1610 #, fuzzy msgid "Start &minimized" msgstr "Commencer le minage!" -#: guiminer.py:1548 +#: guiminer.py:1610 msgid "Start the GUI minimized to the tray." msgstr "" -#: guiminer.py:1550 +#: guiminer.py:1612 msgid "&Options" msgstr "" -#: guiminer.py:1554 +#: guiminer.py:1616 msgid "&Change language..." msgstr "&Changer de langue..." -#: guiminer.py:1555 +#: guiminer.py:1617 msgid "Language" msgstr "Langue" -#: guiminer.py:1559 +#: guiminer.py:1621 msgid "&Donate 99 cents..." msgstr "" -#: guiminer.py:1559 +#: guiminer.py:1621 msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" msgstr "" -#: guiminer.py:1560 +#: guiminer.py:1622 #, fuzzy msgid "&Donate" msgstr "&A propos/Faire un Don ..." -#: guiminer.py:1563 +#: guiminer.py:1625 #, fuzzy msgid "&About..." msgstr "&A propos/Faire un Don ..." -#: guiminer.py:1565 +#: guiminer.py:1627 msgid "&Help" msgstr "&Aide" -#: guiminer.py:1577 +#: guiminer.py:1639 msgid "Failed to load taskbar icon; continuing." msgstr "Erreur du chargement de l'icone de notification. L'exécution continue." -#: guiminer.py:1586 +#: guiminer.py:1648 msgid "OpenCL not found - can't add a OpenCL miner" msgstr "Impossible de trouver OpenCL : impossible d'ajouter un miner OpenCL" -#: guiminer.py:1623 +#: guiminer.py:1685 #, python-format msgid "GUIMiner - v%s" msgstr "GUIMiner - v%s" -#: guiminer.py:1665 +#: guiminer.py:1727 msgid "Name this miner:" msgstr "Nom du miner:" -#: guiminer.py:1665 +#: guiminer.py:1727 msgid "New miner" msgstr "Nouveau miner" -#: guiminer.py:1668 +#: guiminer.py:1730 msgid "Untitled" msgstr "Sans titre" -#: guiminer.py:1679 +#: guiminer.py:1741 #, fuzzy msgid "External miner (*.exe)|*.exe|(*.py)|*.py" msgstr "Miner externe (*.exe)|*.exe" -#: guiminer.py:1681 +#: guiminer.py:1743 msgid "Select external miner:" msgstr "Choisissez un miner externe:" -#: guiminer.py:1691 +#: guiminer.py:1753 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" msgstr "" "Miner externe non supporté %(filename)s. Les miners actuellement supportés " "sont: %(supported)s" -#: guiminer.py:1693 +#: guiminer.py:1755 msgid "Miner not supported" msgstr "Miner non supporté" -#: guiminer.py:1734 +#: guiminer.py:1796 msgid "Do you want to save changes?" msgstr "Voulez-vous sauvegarder les modifications ?" -#: guiminer.py:1734 +#: guiminer.py:1796 msgid "Save" msgstr "Sauvegarder" -#: guiminer.py:1764 +#: guiminer.py:1826 msgid "Saving: " msgstr "Sauvegarde: " -#: guiminer.py:1770 +#: guiminer.py:1832 #, python-format msgid "" "Couldn't write save file %s.\n" @@ -636,115 +646,116 @@ msgstr "" "Impossible d'écrire la sauvegarde dans le fichier %s.\n" "Vérifiez l'emplacement." -#: guiminer.py:1771 +#: guiminer.py:1833 msgid "Save unsuccessful" msgstr "Echec de la sauvegarde" -#: guiminer.py:1773 +#: guiminer.py:1835 #, python-format msgid "Profiles saved OK to %s." msgstr "Profil sauvé vers %s." -#: guiminer.py:1774 +#: guiminer.py:1836 msgid "Save successful" msgstr "Sauvegarde effectuée" -#: guiminer.py:1786 +#: guiminer.py:1848 #, python-format msgid "Loaded: %s" msgstr "Chargé: %s" -#: guiminer.py:1800 +#: guiminer.py:1862 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "Charger des profils arrêtera les miners en cours. Continuer ?" -#: guiminer.py:1801 +#: guiminer.py:1863 msgid "Load profile" msgstr "Charger un profil" -#: guiminer.py:1830 +#: guiminer.py:1892 msgid "Select path to Bitcoin.exe" msgstr "Choisir le chemin vers Bitcoin.exe" -#: guiminer.py:1842 +#: guiminer.py:1904 msgid "About" msgstr "&A propos" -#: guiminer.py:1868 +#: guiminer.py:1930 msgid "Closing this miner will stop it. Continue?" msgstr "Fermer le miner l'arrêtera. Continuer ?" -#: guiminer.py:1869 +#: guiminer.py:1931 msgid "Close miner" msgstr "Fermer le miner" -#: guiminer.py:1898 +#: guiminer.py:1960 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" msgstr "" "Impossible de trouver bitcoin au chemin %s. Vérifiez que le chemin a bien " "été paramétré." -#: guiminer.py:1899 +#: guiminer.py:1961 msgid "Launch failed" msgstr "Erreur de lancement" -#: guiminer.py:1902 +#: guiminer.py:1964 msgid "" -"Client launched ok. You can start a miner now with the server set to 'solo'." +"The Bitcoin client will now launch in server mode.\n" +"Once it connects to the network and downloads the block chain, you can start " +"a miner in 'solo' mode." msgstr "" -"Client lancé. Vous pouvez maintenant lancer un miner sur le serveur 'solo'." -#: guiminer.py:1903 +#: guiminer.py:1965 msgid "Launched ok." msgstr "Lancement réussi." -#: guiminer.py:1918 +#: guiminer.py:1980 #, python-format msgid "%s already exists. Overwrite?" msgstr "%s Existe déjà. L'écraser ?" -#: guiminer.py:1919 +#: guiminer.py:1981 msgid "bitcoin.conf already exists." msgstr "bitcoin.conf existe déjà." -#: guiminer.py:1924 +#: guiminer.py:1986 msgid "Enter password" msgstr "Entrez le mot de passe" -#: guiminer.py:1934 +#: guiminer.py:1996 msgid "Success" msgstr "Succès" -#: guiminer.py:1934 +#: guiminer.py:1996 msgid "Wrote bitcoin config ok." msgstr "Écriture de la configuration bitcoin réussie." -#: guiminer.py:1945 +#: guiminer.py:2007 msgid "Console" msgstr "Console" -#: guiminer.py:1957 +#: guiminer.py:2019 msgid "Summary" msgstr "Résumé" -#: guiminer.py:1970 +#: guiminer.py:2032 msgid "Rename miner" msgstr "Renommer le miner" -#: guiminer.py:1970 +#: guiminer.py:2032 msgid "Rename to:" msgstr "Renommer :" -#: guiminer.py:1975 +#: guiminer.py:2037 msgid "Change language" msgstr "Changer de langue" -#: guiminer.py:1995 +#: guiminer.py:2057 msgid "Choose language (requires restart to take full effect)" msgstr "Choisissez une langue (Requiert un redémarrage)" -#: guiminer.py:2040 +#: guiminer.py:2102 msgid "" "Click the link below to log in to the pool and get a special token. \n" "This token lets you securely check your balance.\n" @@ -755,19 +766,19 @@ msgstr "" "Ce jeton vous permettra de vérifier votre répartition de manière sécurisée.\n" "Pour se souvenir de ce jeton, sauvegardez les paramètres." -#: guiminer.py:2049 +#: guiminer.py:2111 msgid "(Paste token here)" msgstr "(Coller le jeton ici)" -#: guiminer.py:2075 +#: guiminer.py:2137 msgid "Copy address to clipboard" msgstr "Copier l'adresse dans le presse-papier" -#: guiminer.py:2094 +#: guiminer.py:2156 msgid "No OpenCL devices found." msgstr "Aucun périphérique OpenCL touvé." -#: guiminer.py:2097 +#: guiminer.py:2159 #, fuzzy msgid "" "No OpenCL devices were found.\n" @@ -783,6 +794,13 @@ msgstr "" " SDK (2.1 de préférence), sinon il se peut que votre GPU ne supporte pas " "OpenCL.\n" -#: guiminer.py:2107 +#: guiminer.py:2169 msgid "Don't show this message again" msgstr "" + +#~ msgid "" +#~ "Client launched ok. You can start a miner now with the server set to " +#~ "'solo'." +#~ msgstr "" +#~ "Client lancé. Vous pouvez maintenant lancer un miner sur le serveur " +#~ "'solo'." diff --git a/guiminer_hu.po b/guiminer_hu.po index c35fab5..3bbeb9b 100644 --- a/guiminer_hu.po +++ b/guiminer_hu.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 12:41-0300\n" +"POT-Creation-Date: 2011-06-10 15:18-0300\n" "PO-Revision-Date: 2011-06-04 18:34+0100\n" "Last-Translator: Underyx \n" "Language-Team: Español\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: guiminer.py:84 +#: guiminer.py:89 #, python-format msgid "" "GUIMiner\n" @@ -47,220 +47,224 @@ msgstr "" "\n" "Egyetlen bitcoin is nagy motiváció a program továbbfejlesztésére.\n" -#: guiminer.py:105 +#: guiminer.py:110 msgid "Not started" msgstr "Nincs elindítva" -#: guiminer.py:106 +#: guiminer.py:111 msgid "Starting..." msgstr "Indítás..." -#: guiminer.py:107 +#: guiminer.py:112 msgid "Stopped" msgstr "Leállítva" -#: guiminer.py:108 +#: guiminer.py:113 msgid "Paused" msgstr "Leállítva" -#: guiminer.py:109 +#: guiminer.py:114 msgid "Start mining!" msgstr "Bányászat indítása" -#: guiminer.py:110 +#: guiminer.py:115 msgid "Stop mining" msgstr "Bányászat leállítása" -#: guiminer.py:111 +#: guiminer.py:116 msgid "Refresh balance" msgstr "Egyenleg frissítése" -#: guiminer.py:112 +#: guiminer.py:117 msgid "Connection error" msgstr "Kapcsolódási hiba" -#: guiminer.py:113 +#: guiminer.py:118 msgid "Username:" msgstr "Felhasználónév:" -#: guiminer.py:114 +#: guiminer.py:119 msgid "Password:" msgstr "Jelszó:" -#: guiminer.py:115 +#: guiminer.py:120 msgid "Quit this program" msgstr "Kilépés a programból" -#: guiminer.py:116 +#: guiminer.py:121 msgid "Show about dialog" msgstr "Névjegy megjelenítése..." -#: guiminer.py:197 +#: guiminer.py:202 #, python-format msgid "%.1f Ghash/s" msgstr "%.1f Ghash/s" -#: guiminer.py:199 +#: guiminer.py:204 #, python-format msgid "%.1f Mhash/s" msgstr "%.1f Mhash/s" -#: guiminer.py:201 +#: guiminer.py:206 msgid "Connecting..." msgstr "Kapcsolódás..." -#: guiminer.py:203 +#: guiminer.py:208 #, python-format msgid "%d khash/s" msgstr "%d khash/s" -#: guiminer.py:227 +#: guiminer.py:232 #, python-format msgid "Requesting balance: %(request)s" msgstr "Egyenleg lekérése: %(request)s" -#: guiminer.py:231 +#: guiminer.py:236 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "A szerver válasza: %(status)s, %(data)s" -#: guiminer.py:286 +#: guiminer.py:303 msgid "Miner" msgstr "Bányász" -#: guiminer.py:287 +#: guiminer.py:304 msgid "Speed" msgstr "Sebesség" -#: guiminer.py:288 +#: guiminer.py:305 msgid "Accepted" msgstr "Elfogadva" -#: guiminer.py:289 +#: guiminer.py:306 msgid "Stale" msgstr "Érvénytelen" -#: guiminer.py:290 +#: guiminer.py:307 msgid "Start/Stop" msgstr "Indítás/Leállítás" -#: guiminer.py:291 +#: guiminer.py:308 msgid "Autostart" msgstr "Automatikus indítás" -#: guiminer.py:375 +#: guiminer.py:392 msgid "Pause all" msgstr "Mind leállítása" -#: guiminer.py:377 +#: guiminer.py:394 msgid "Restore" msgstr "Visszaállítás" -#: guiminer.py:378 +#: guiminer.py:395 msgid "Close" msgstr "Bezárás" -#: guiminer.py:434 +#: guiminer.py:451 #, python-format msgid "Listener for \"%s\" started" msgstr "\"%s\" elindult" -#: guiminer.py:449 +#: guiminer.py:466 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "Üzenet - \"%(name)s\": %(line)s" -#: guiminer.py:452 +#: guiminer.py:469 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "\"%s\" leállt" -#: guiminer.py:496 +#: guiminer.py:515 msgid "Server:" msgstr "Szerver:" -#: guiminer.py:501 +#: guiminer.py:520 msgid "Website:" msgstr "Weboldal:" -#: guiminer.py:503 +#: guiminer.py:522 msgid "Ext. Path:" msgstr "Külső útvonal:" -#: guiminer.py:505 +#: guiminer.py:524 msgid "Host:" msgstr "Szerver:" -#: guiminer.py:507 +#: guiminer.py:526 msgid "Port:" msgstr "Port:" -#: guiminer.py:513 +#: guiminer.py:532 msgid "Device:" msgstr "Eszköz:" -#: guiminer.py:514 +#: guiminer.py:533 msgid "No OpenCL devices" msgstr "Nincs OpenCL eszközöd" -#: guiminer.py:515 +#: guiminer.py:534 msgid "Extra flags:" msgstr "Extra beállítások:" -#: guiminer.py:518 +#: guiminer.py:537 +msgid "CPU Affinity:" +msgstr "" + +#: guiminer.py:540 msgid "Balance:" msgstr "Egyenleg:" -#: guiminer.py:522 +#: guiminer.py:544 msgid "Withdraw" msgstr "Visszavonás" -#: guiminer.py:667 +#: guiminer.py:704 msgid "Default" msgstr "Alapértelmezett" -#: guiminer.py:714 +#: guiminer.py:755 msgid "Start" msgstr "Indítás" -#: guiminer.py:714 +#: guiminer.py:755 msgid "Stop" msgstr "Leállítás" -#: guiminer.py:730 +#: guiminer.py:771 msgid "Connection problems" msgstr "Kapcsolódási problémák" -#: guiminer.py:889 +#: guiminer.py:930 msgid "Running command: " msgstr "Futtatási parancs: " -#: guiminer.py:943 +#: guiminer.py:989 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "Nehézség 1 hash-ek: %(nhashes)d %(update_time)s" -#: guiminer.py:947 +#: guiminer.py:993 #, python-format msgid "Blocks: %d, " msgstr "Blokkok: %d, " -#: guiminer.py:950 +#: guiminer.py:996 #, python-format msgid "Shares: %d accepted" msgstr "Részblokkok: %d elfogadva" -#: guiminer.py:952 +#: guiminer.py:998 #, python-format msgid ", %d stale/invalid" msgstr ", %d érvénytelen" -#: guiminer.py:974 +#: guiminer.py:1020 #, python-format msgid "- last at %s" msgstr "- legutóbbi ekkor: %s" -#: guiminer.py:1047 +#: guiminer.py:1093 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." @@ -269,23 +273,23 @@ msgstr "" "vannak.\n" "További információért nézd meg a weboldalukat." -#: guiminer.py:1048 +#: guiminer.py:1094 msgid "Website of the currently selected server. Click to visit." msgstr "A kiválasztott szerver weboldala." -#: guiminer.py:1049 +#: guiminer.py:1095 msgid "Available OpenCL devices on your system." msgstr "A rendszered elérhető OpenCL eszközei." -#: guiminer.py:1050 +#: guiminer.py:1096 msgid "Host address, without http:// prefix." msgstr "Szerver címe, a http:// nélkül." -#: guiminer.py:1051 +#: guiminer.py:1097 msgid "Server port. This is usually 8332." msgstr "A szerver portja. Ez általában 8332." -#: guiminer.py:1052 +#: guiminer.py:1098 msgid "" "The miner's username.\n" "May be different than your account username.\n" @@ -295,7 +299,7 @@ msgstr "" "Lehet, hogy különbözik a fiókod felhasználónevétől.\n" "Például: Kiv.GPU" -#: guiminer.py:1053 +#: guiminer.py:1099 msgid "" "The miner's password.\n" "May be different than your account password." @@ -303,7 +307,7 @@ msgstr "" "A bányász jelszava.\n" "Lehet, hogy különbözik a fiókod jelszavától.\n" -#: guiminer.py:1054 +#: guiminer.py:1100 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" @@ -313,38 +317,44 @@ msgstr "" "Radeon HD 5xxx-es videokártyáknál használd azt, hogy -v -w128.\n" "Más videokártyáknál nézz utána a fórumban (forum.bitcoin.org)." -#: guiminer.py:1148 guiminer.py:1242 guiminer.py:1263 +#: guiminer.py:1102 +msgid "" +"CPU cores used for mining.\n" +"Unchecking some cores can reduce high CPU usage in some systems." +msgstr "" + +#: guiminer.py:1196 guiminer.py:1290 guiminer.py:1311 msgid "Auth token rejected by server." msgstr "Azonosítási kód visszautasítva a szerver által." -#: guiminer.py:1166 +#: guiminer.py:1214 #, python-format msgid "%s confirmed" msgstr "%s visszaigazolt" -#: guiminer.py:1168 +#: guiminer.py:1216 #, python-format msgid ", %s unconfirmed" msgstr ", %s nincs visszaigazolva" -#: guiminer.py:1170 +#: guiminer.py:1218 msgid "Bad response from server." msgstr "Hibás válasz a szervertől." -#: guiminer.py:1246 guiminer.py:1267 +#: guiminer.py:1294 guiminer.py:1315 msgid "Withdraw OK" msgstr "Sikeres visszavonás" -#: guiminer.py:1426 +#: guiminer.py:1485 msgid "No registration is required - just enter an address and press Start." msgstr "" "Nem kell regisztrálni - csak írd be a címed és nyomj az Indítás gombra." -#: guiminer.py:1428 +#: guiminer.py:1487 msgid "Address:" msgstr "Cím:" -#: guiminer.py:1430 +#: guiminer.py:1489 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" @@ -352,7 +362,7 @@ msgstr "" "A Bitcoin címed, amire a pénz érkezzen.\n" "Például: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" -#: guiminer.py:1445 +#: guiminer.py:1505 msgid "" "Your miner username (not your account username).\n" "Example: Kiv.GPU" @@ -360,11 +370,11 @@ msgstr "" "A bányász felhasználóneve (nem a fiók felhasználóneve).\n" "Például: Kiv.GPU" -#: guiminer.py:1447 guiminer.py:1467 +#: guiminer.py:1507 guiminer.py:1528 msgid "Your miner password (not your account password)." msgstr "A bányász jelszava (nem a fiók jelszava)." -#: guiminer.py:1465 +#: guiminer.py:1526 msgid "" "Your miner username. \n" "Example: kiv123@kiv123" @@ -372,248 +382,248 @@ msgstr "" "A bányász felhasználóneve. \n" "Például: kiv123@kiv123" -#: guiminer.py:1481 +#: guiminer.py:1543 msgid "The e-mail address you registered with." msgstr "Az e-mail cím, amivel regisztráltál" -#: guiminer.py:1482 +#: guiminer.py:1544 msgid "Email:" msgstr "E-mail cím:" -#: guiminer.py:1497 +#: guiminer.py:1559 msgid "&Rename..." msgstr "&Átnevezés..." -#: guiminer.py:1497 +#: guiminer.py:1559 msgid "Rename this miner" msgstr "Bányász átnevezése" -#: guiminer.py:1522 +#: guiminer.py:1584 msgid "&New OpenCL miner..." msgstr "&Új OpenCL bányász..." -#: guiminer.py:1522 +#: guiminer.py:1584 msgid "Create a new OpenCL miner (default for ATI cards)" msgstr "" -#: guiminer.py:1523 +#: guiminer.py:1585 #, fuzzy msgid "Create a new Phoenix miner (for some ATI cards)" msgstr "Új bányászprofil" -#: guiminer.py:1523 +#: guiminer.py:1585 #, fuzzy msgid "New Phoenix miner..." msgstr "Új külső bányász..." -#: guiminer.py:1524 +#: guiminer.py:1586 msgid "Create a new CUDA miner (for NVIDIA cards)" msgstr "" -#: guiminer.py:1524 +#: guiminer.py:1586 #, fuzzy msgid "New CUDA miner..." msgstr "&Új OpenCL bányász..." -#: guiminer.py:1525 +#: guiminer.py:1587 #, fuzzy msgid "Create a new Ufasoft miner (for CPUs)" msgstr "Új bányászprofil" -#: guiminer.py:1525 +#: guiminer.py:1587 #, fuzzy msgid "New Ufasoft CPU miner..." msgstr "Új külső bányász..." -#: guiminer.py:1526 +#: guiminer.py:1588 #, fuzzy msgid "Create a new custom miner (requires external program)" msgstr "Új CPU, vagy CUDA bányász (külső bányászprogrammal)" -#: guiminer.py:1526 +#: guiminer.py:1588 msgid "New &other miner..." msgstr "Új külső bányász..." -#: guiminer.py:1527 +#: guiminer.py:1589 #, fuzzy msgid "&New miner" msgstr "Új bányász" -#: guiminer.py:1528 +#: guiminer.py:1590 msgid "&Save settings" msgstr "&Beállítások mentése" -#: guiminer.py:1528 +#: guiminer.py:1590 msgid "Save your settings" msgstr "Beállítások mentése" -#: guiminer.py:1529 +#: guiminer.py:1591 msgid "&Load settings" msgstr "&Beállítások betöltése" -#: guiminer.py:1529 +#: guiminer.py:1591 msgid "Load stored settings" msgstr "Elmentett beállítások betöltése" -#: guiminer.py:1530 +#: guiminer.py:1592 msgid "Quit" msgstr "Kilépés" -#: guiminer.py:1531 +#: guiminer.py:1593 msgid "&File" msgstr "&Fájl" -#: guiminer.py:1535 +#: guiminer.py:1597 msgid "Show summary" msgstr "Összegzés megjelenítése" -#: guiminer.py:1535 +#: guiminer.py:1597 msgid "Show summary of all miners" msgstr "Minden bányász összegsésének megjelenítése" -#: guiminer.py:1536 +#: guiminer.py:1598 msgid "Show console" msgstr "Konzol megjelenítése..." -#: guiminer.py:1536 +#: guiminer.py:1598 msgid "Show console logs" msgstr "Konzolnaplók megjelenítése..." -#: guiminer.py:1537 +#: guiminer.py:1599 msgid "&View" msgstr "&Nézet" -#: guiminer.py:1541 +#: guiminer.py:1603 msgid "&Create solo password..." msgstr "&Szóló jelszó készítése..." -#: guiminer.py:1541 +#: guiminer.py:1603 msgid "Configure a user/pass for solo mining" msgstr "Felhasználónév és jelszó beállítása szóló bányászathoz" -#: guiminer.py:1542 +#: guiminer.py:1604 msgid "&Set Bitcoin client path..." msgstr "&Bitcoin kliens helyének megadása..." -#: guiminer.py:1542 +#: guiminer.py:1604 msgid "Set the location of the official Bitcoin client" msgstr "Add meg a hivatalos Bitcoin kliens helyét" -#: guiminer.py:1543 +#: guiminer.py:1605 msgid "&Launch Bitcoin client as server" msgstr "&Bitcoin kliens indítása szerverként" -#: guiminer.py:1543 +#: guiminer.py:1605 msgid "Launch the official Bitcoin client as a server for solo mining" msgstr "" "Szóló bányászathoz indítsd el a hivatalos Bitcoin bányászprogramot " "szerverként" -#: guiminer.py:1544 +#: guiminer.py:1606 msgid "&Solo utilities" msgstr "&Szóló eszközök" -#: guiminer.py:1548 +#: guiminer.py:1610 #, fuzzy msgid "Start &minimized" msgstr "Bányászat indítása" -#: guiminer.py:1548 +#: guiminer.py:1610 msgid "Start the GUI minimized to the tray." msgstr "" -#: guiminer.py:1550 +#: guiminer.py:1612 msgid "&Options" msgstr "" -#: guiminer.py:1554 +#: guiminer.py:1616 msgid "&Change language..." msgstr "&Nyelv változtatása..." -#: guiminer.py:1555 +#: guiminer.py:1617 msgid "Language" msgstr "Nyelv" -#: guiminer.py:1559 +#: guiminer.py:1621 msgid "&Donate 99 cents..." msgstr "" -#: guiminer.py:1559 +#: guiminer.py:1621 msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" msgstr "" -#: guiminer.py:1560 +#: guiminer.py:1622 #, fuzzy msgid "&Donate" msgstr "&Névjegy/Adományok..." -#: guiminer.py:1563 +#: guiminer.py:1625 #, fuzzy msgid "&About..." msgstr "&Névjegy/Adományok..." -#: guiminer.py:1565 +#: guiminer.py:1627 msgid "&Help" msgstr "&Segítség" -#: guiminer.py:1577 +#: guiminer.py:1639 msgid "Failed to load taskbar icon; continuing." msgstr "Tálcaikon betöltése sikertelen; folytatás..." -#: guiminer.py:1586 +#: guiminer.py:1648 msgid "OpenCL not found - can't add a OpenCL miner" msgstr "Az OpenCL nem található - nem lehet OpenCL bányászt indítani" -#: guiminer.py:1623 +#: guiminer.py:1685 #, python-format msgid "GUIMiner - v%s" msgstr "GUIMiner - v%s" -#: guiminer.py:1665 +#: guiminer.py:1727 msgid "Name this miner:" msgstr "Bányász neve:" -#: guiminer.py:1665 +#: guiminer.py:1727 msgid "New miner" msgstr "Új bányász" -#: guiminer.py:1668 +#: guiminer.py:1730 msgid "Untitled" msgstr "Névtelen" -#: guiminer.py:1679 +#: guiminer.py:1741 #, fuzzy msgid "External miner (*.exe)|*.exe|(*.py)|*.py" msgstr "Külső bányászprogram (*.exe)|*.exe" -#: guiminer.py:1681 +#: guiminer.py:1743 msgid "Select external miner:" msgstr "Válaszd ki a külső bányászprogramot:" -#: guiminer.py:1691 +#: guiminer.py:1753 #, fuzzy, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" msgstr "" "A külső bányászprogram (%(filename)s) nem támogatott. A következőket " "használhatod: %(supported)" -#: guiminer.py:1693 +#: guiminer.py:1755 msgid "Miner not supported" msgstr "A bányászprogram nem támogatott" -#: guiminer.py:1734 +#: guiminer.py:1796 msgid "Do you want to save changes?" msgstr "Elmented a változtatásokat?" -#: guiminer.py:1734 +#: guiminer.py:1796 msgid "Save" msgstr "Mentés" -#: guiminer.py:1764 +#: guiminer.py:1826 msgid "Saving: " msgstr "Mentés:" -#: guiminer.py:1770 +#: guiminer.py:1832 #, python-format msgid "" "Couldn't write save file %s.\n" @@ -622,116 +632,116 @@ msgstr "" "Nem sikerült ide menteni: %s.\n" "Ellenőrizd le hogy írható-e a mappa!" -#: guiminer.py:1771 +#: guiminer.py:1833 msgid "Save unsuccessful" msgstr "Sikertelen mentés" -#: guiminer.py:1773 +#: guiminer.py:1835 #, python-format msgid "Profiles saved OK to %s." msgstr "Profil sikeresen elmentve ide: %s." -#: guiminer.py:1774 +#: guiminer.py:1836 msgid "Save successful" msgstr "Sikeres mentés" -#: guiminer.py:1786 +#: guiminer.py:1848 #, python-format msgid "Loaded: %s" msgstr "Betöltve: %s" -#: guiminer.py:1800 +#: guiminer.py:1862 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "" "Egy profil betöltése le fogja állítani a jelenleg futó bányászokat. Biztos " "ezt akarod?" -#: guiminer.py:1801 +#: guiminer.py:1863 msgid "Load profile" msgstr "Profil betöltve" -#: guiminer.py:1830 +#: guiminer.py:1892 msgid "Select path to Bitcoin.exe" msgstr "Válaszd ki a Bitcoin.exe programfájlt" -#: guiminer.py:1842 +#: guiminer.py:1904 msgid "About" msgstr "Névjegy" -#: guiminer.py:1868 +#: guiminer.py:1930 msgid "Closing this miner will stop it. Continue?" msgstr "A bányász bezárásával leállítod azt. Biztos bezárod?" -#: guiminer.py:1869 +#: guiminer.py:1931 msgid "Close miner" msgstr "Bányász bezárása" -#: guiminer.py:1898 +#: guiminer.py:1960 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" msgstr "A Bitcoin nem található itt: %s. Biztos ez a helyes útvonal?" -#: guiminer.py:1899 +#: guiminer.py:1961 msgid "Launch failed" msgstr "Indítás sikertelen" -#: guiminer.py:1902 +#: guiminer.py:1964 msgid "" -"Client launched ok. You can start a miner now with the server set to 'solo'." +"The Bitcoin client will now launch in server mode.\n" +"Once it connects to the network and downloads the block chain, you can start " +"a miner in 'solo' mode." msgstr "" -"A kliens sikeresen elindult. Most már elkezdhetsz bányászni úgy, hogy a " -"szerver \"Szóló\"-ra van állítva." -#: guiminer.py:1903 +#: guiminer.py:1965 msgid "Launched ok." msgstr "Sikeres indítás" -#: guiminer.py:1918 +#: guiminer.py:1980 #, python-format msgid "%s already exists. Overwrite?" msgstr "%s már létezik. Felülírja?" -#: guiminer.py:1919 +#: guiminer.py:1981 msgid "bitcoin.conf already exists." msgstr "A bitcoin.conf fájl már létezik." -#: guiminer.py:1924 +#: guiminer.py:1986 msgid "Enter password" msgstr "Írd be a jelszavad" -#: guiminer.py:1934 +#: guiminer.py:1996 msgid "Success" msgstr "Sikerült" -#: guiminer.py:1934 +#: guiminer.py:1996 msgid "Wrote bitcoin config ok." msgstr "Bitcoin konfiguráció sikeresen megírva." -#: guiminer.py:1945 +#: guiminer.py:2007 msgid "Console" msgstr "Konzol" -#: guiminer.py:1957 +#: guiminer.py:2019 msgid "Summary" msgstr "Összegzés" -#: guiminer.py:1970 +#: guiminer.py:2032 msgid "Rename miner" msgstr "Bányász átnevezése" -#: guiminer.py:1970 +#: guiminer.py:2032 msgid "Rename to:" msgstr "Átnevezés erre:" -#: guiminer.py:1975 +#: guiminer.py:2037 msgid "Change language" msgstr "Nyelv változtatása" -#: guiminer.py:1995 +#: guiminer.py:2057 msgid "Choose language (requires restart to take full effect)" msgstr "Válassz nyelvet (a beállítás a program újraindításakor lép érvénybe)" -#: guiminer.py:2040 +#: guiminer.py:2102 msgid "" "Click the link below to log in to the pool and get a special token. \n" "This token lets you securely check your balance.\n" @@ -742,19 +752,19 @@ msgstr "" "Mentsd el a program beállításait majd, hogy ne kelljen később újra beírnod a " "kódot." -#: guiminer.py:2049 +#: guiminer.py:2111 msgid "(Paste token here)" msgstr "(Írd be ide a kódot)" -#: guiminer.py:2075 +#: guiminer.py:2137 msgid "Copy address to clipboard" msgstr "Cím másolása vágólapra" -#: guiminer.py:2094 +#: guiminer.py:2156 msgid "No OpenCL devices found." msgstr "Nem található OpenCL eszköz." -#: guiminer.py:2097 +#: guiminer.py:2159 msgid "" "No OpenCL devices were found.\n" " If you only want to mine using CPU or CUDA, you can ignore this message.\n" @@ -769,6 +779,13 @@ msgstr "" "ATI Stream SDK-t,\n" "vagy pedig a videokártyád nem támogatja az OpenCL-t.\n" -#: guiminer.py:2107 +#: guiminer.py:2169 msgid "Don't show this message again" msgstr "Ne mutasd ezt többször" + +#~ msgid "" +#~ "Client launched ok. You can start a miner now with the server set to " +#~ "'solo'." +#~ msgstr "" +#~ "A kliens sikeresen elindult. Most már elkezdhetsz bányászni úgy, hogy a " +#~ "szerver \"Szóló\"-ra van állítva." diff --git a/guiminer_ru.po b/guiminer_ru.po index 12617b5..d2347e9 100644 --- a/guiminer_ru.po +++ b/guiminer_ru.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 12:41-0300\n" +"POT-Creation-Date: 2011-06-10 15:18-0300\n" "PO-Revision-Date: 2011-06-10 12:42-0400\n" "Last-Translator: Chris MacLeod \n" "Language-Team: Russian\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: guiminer.py:84 +#: guiminer.py:89 #, python-format msgid "" "GUIMiner\n" @@ -51,244 +51,249 @@ msgstr "" "Даже один битцент полезен, и помогает мотивировать\n" "дальнейшую работу над этой программой.\n" -#: guiminer.py:105 +#: guiminer.py:110 msgid "Not started" msgstr "Не запущен" -#: guiminer.py:106 +#: guiminer.py:111 msgid "Starting..." msgstr "Запускается..." -#: guiminer.py:107 +#: guiminer.py:112 msgid "Stopped" msgstr "Остановлен" -#: guiminer.py:108 +#: guiminer.py:113 msgid "Paused" msgstr "Пауза" -#: guiminer.py:109 +#: guiminer.py:114 msgid "Start mining!" msgstr "Старт!" -#: guiminer.py:110 +#: guiminer.py:115 msgid "Stop mining" msgstr "Стоп!" -#: guiminer.py:111 +#: guiminer.py:116 msgid "Refresh balance" msgstr "Проверить баланс" -#: guiminer.py:112 +#: guiminer.py:117 msgid "Connection error" msgstr "Ошибка связи" -#: guiminer.py:113 +#: guiminer.py:118 msgid "Username:" msgstr "Логин:" -#: guiminer.py:114 +#: guiminer.py:119 msgid "Password:" msgstr "Пароль:" -#: guiminer.py:115 +#: guiminer.py:120 msgid "Quit this program" msgstr "Выход из программы" -#: guiminer.py:116 +#: guiminer.py:121 msgid "Show about dialog" msgstr "Показать информацию о программе" -#: guiminer.py:197 +#: guiminer.py:202 #, python-format msgid "%.1f Ghash/s" msgstr "%.1f Ghash/s" -#: guiminer.py:199 +#: guiminer.py:204 #, python-format msgid "%.1f Mhash/s" msgstr "%.1f Mhash/s" -#: guiminer.py:201 +#: guiminer.py:206 msgid "Connecting..." msgstr "Соединяемся..." -#: guiminer.py:203 +#: guiminer.py:208 #, python-format msgid "%d khash/s" msgstr "%d khash/s" -#: guiminer.py:227 +#: guiminer.py:232 #, python-format msgid "Requesting balance: %(request)s" msgstr "Запрашивается баланс: %(request)s" -#: guiminer.py:231 +#: guiminer.py:236 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "Ответ сервера: %(status)s, %(data)s" -#: guiminer.py:286 +#: guiminer.py:303 msgid "Miner" msgstr "Генератор" -#: guiminer.py:287 +#: guiminer.py:304 msgid "Speed" msgstr "Скорость" -#: guiminer.py:288 +#: guiminer.py:305 msgid "Accepted" msgstr "Принято" -#: guiminer.py:289 +#: guiminer.py:306 msgid "Stale" msgstr "Сбой" -#: guiminer.py:290 +#: guiminer.py:307 msgid "Start/Stop" msgstr "Старт/Стоп" -#: guiminer.py:291 +#: guiminer.py:308 msgid "Autostart" msgstr "Автостарт" -#: guiminer.py:375 +#: guiminer.py:392 msgid "Pause all" msgstr "Приостановить все" -#: guiminer.py:377 +#: guiminer.py:394 msgid "Restore" msgstr "Восстановить" -#: guiminer.py:378 +#: guiminer.py:395 msgid "Close" msgstr "Закрыть" -#: guiminer.py:434 +#: guiminer.py:451 #, python-format msgid "Listener for \"%s\" started" msgstr "Прослушивание \"%s\" начато" -#: guiminer.py:449 +#: guiminer.py:466 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "Прослушивание \"%(name)s\": %(line)s" -#: guiminer.py:452 +#: guiminer.py:469 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "Прослушивание \"%s\" завершается" -#: guiminer.py:496 +#: guiminer.py:515 msgid "Server:" msgstr "Сервер:" -#: guiminer.py:501 +#: guiminer.py:520 msgid "Website:" msgstr "Вэбсайт:" -#: guiminer.py:503 +#: guiminer.py:522 msgid "Ext. Path:" msgstr "Вншн. путь:" -#: guiminer.py:505 +#: guiminer.py:524 msgid "Host:" msgstr "Хост:" -#: guiminer.py:507 +#: guiminer.py:526 msgid "Port:" msgstr "Порт:" -#: guiminer.py:513 +#: guiminer.py:532 msgid "Device:" msgstr "Устройство:" -#: guiminer.py:514 +#: guiminer.py:533 msgid "No OpenCL devices" msgstr "Нет OpenCL устройств" -#: guiminer.py:515 +#: guiminer.py:534 msgid "Extra flags:" msgstr "Доп. параметры:" -#: guiminer.py:518 +#: guiminer.py:537 +msgid "CPU Affinity:" +msgstr "" + +#: guiminer.py:540 msgid "Balance:" msgstr "Баланс:" -#: guiminer.py:522 +#: guiminer.py:544 msgid "Withdraw" msgstr "Снять деньги" -#: guiminer.py:667 +#: guiminer.py:704 msgid "Default" msgstr "По умолчанию" -#: guiminer.py:714 +#: guiminer.py:755 msgid "Start" msgstr "Старт" -#: guiminer.py:714 +#: guiminer.py:755 msgid "Stop" msgstr "Стоп" -#: guiminer.py:730 +#: guiminer.py:771 msgid "Connection problems" msgstr "Сбой связи" -#: guiminer.py:889 +#: guiminer.py:930 msgid "Running command: " msgstr "Выполняется команда: " -#: guiminer.py:943 +#: guiminer.py:989 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "Хэши сложности 1: %(nhashes)d %(update_time)s" -#: guiminer.py:947 +#: guiminer.py:993 #, python-format msgid "Blocks: %d, " msgstr "Блоки: %d, " -#: guiminer.py:950 +#: guiminer.py:996 #, python-format msgid "Shares: %d accepted" msgstr "Доли: %d приняты" -#: guiminer.py:952 +#: guiminer.py:998 #, python-format msgid ", %d stale/invalid" msgstr ", %d дубли/сбойные" -#: guiminer.py:974 +#: guiminer.py:1020 #, python-format msgid "- last at %s" msgstr "- последняя в %s" -#: guiminer.py:1047 +#: guiminer.py:1093 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." msgstr "" -"Сервер для подключения. Разные серверы имеют разные возможности и взимаемый процент.\n" +"Сервер для подключения. Разные серверы имеют разные возможности и взимаемый " +"процент.\n" "Подробней смотрите на их сайтах." -#: guiminer.py:1048 +#: guiminer.py:1094 msgid "Website of the currently selected server. Click to visit." msgstr "Вэбсайт выбранного сервера. Нажмите чтобы открыть." -#: guiminer.py:1049 +#: guiminer.py:1095 msgid "Available OpenCL devices on your system." msgstr "OpenCL устройства, доступные на вашей системе." -#: guiminer.py:1050 +#: guiminer.py:1096 msgid "Host address, without http:// prefix." msgstr "Адрес Хоста, без http:// префикса." -#: guiminer.py:1051 +#: guiminer.py:1097 msgid "Server port. This is usually 8332." msgstr "Порт сервера. Обычно 8332." -#: guiminer.py:1052 +#: guiminer.py:1098 msgid "" "The miner's username.\n" "May be different than your account username.\n" @@ -298,7 +303,7 @@ msgstr "" "Может отличаться от логина вашего аккаунта.\n" "Пример: Kiv.GPU" -#: guiminer.py:1053 +#: guiminer.py:1099 msgid "" "The miner's password.\n" "May be different than your account password." @@ -306,50 +311,54 @@ msgstr "" "Пароль генератора (miner password).\n" "Может отличаться от пароля вашего аккаунта." -#: guiminer.py:1054 +#: guiminer.py:1100 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" "For other cards consult the forum." msgstr "" "Доп. параметры передаваемые генератору.\n" -"Для лучших результатов на Радеонах HD 5xxx серий, под OpenCL, используйте -v -w128.\n" +"Для лучших результатов на Радеонах HD 5xxx серий, под OpenCL, используйте -v " +"-w128.\n" "По поводу других видеокарт - проверьте форум." -#: guiminer.py:1148 -#: guiminer.py:1242 -#: guiminer.py:1263 +#: guiminer.py:1102 +msgid "" +"CPU cores used for mining.\n" +"Unchecking some cores can reduce high CPU usage in some systems." +msgstr "" + +#: guiminer.py:1196 guiminer.py:1290 guiminer.py:1311 msgid "Auth token rejected by server." msgstr "Код авторизации не принят сервером" -#: guiminer.py:1166 +#: guiminer.py:1214 #, python-format msgid "%s confirmed" msgstr "%s подтверждено" -#: guiminer.py:1168 +#: guiminer.py:1216 #, python-format msgid ", %s unconfirmed" msgstr ", %s не подтверждено" -#: guiminer.py:1170 +#: guiminer.py:1218 msgid "Bad response from server." msgstr "Неправильный ответ сервера." -#: guiminer.py:1246 -#: guiminer.py:1267 +#: guiminer.py:1294 guiminer.py:1315 msgid "Withdraw OK" msgstr "Выплата произведена" -#: guiminer.py:1426 +#: guiminer.py:1485 msgid "No registration is required - just enter an address and press Start." msgstr "Регистрации не требуется - введите ваш адрес и нажмите Старт." -#: guiminer.py:1428 +#: guiminer.py:1487 msgid "Address:" msgstr "Адрес:" -#: guiminer.py:1430 +#: guiminer.py:1489 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" @@ -357,7 +366,7 @@ msgstr "" "Ваш счет для получения Биткоинов.\n" "Пример: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" -#: guiminer.py:1445 +#: guiminer.py:1505 msgid "" "Your miner username (not your account username).\n" "Example: Kiv.GPU" @@ -365,12 +374,11 @@ msgstr "" "Логин генератора (miner username), может отличаться от логина аккаунта.\n" "Пример: Kiv.GPU" -#: guiminer.py:1447 -#: guiminer.py:1467 +#: guiminer.py:1507 guiminer.py:1528 msgid "Your miner password (not your account password)." msgstr "Пароль генератора, может отличаться от пароля аккаунта ." -#: guiminer.py:1465 +#: guiminer.py:1526 msgid "" "Your miner username. \n" "Example: kiv123@kiv123" @@ -378,233 +386,240 @@ msgstr "" "Логин генератора. \n" "Например: kiv123@kiv123" -#: guiminer.py:1481 +#: guiminer.py:1543 msgid "The e-mail address you registered with." msgstr "Эл. почта под которой вы зарегистрировались." -#: guiminer.py:1482 +#: guiminer.py:1544 msgid "Email:" msgstr "Эмэйл:" -#: guiminer.py:1497 +#: guiminer.py:1559 msgid "&Rename..." msgstr "&Переименовать..." -#: guiminer.py:1497 +#: guiminer.py:1559 msgid "Rename this miner" msgstr "Переименовать этот генератор" -#: guiminer.py:1522 +#: guiminer.py:1584 msgid "&New OpenCL miner..." msgstr "&Создать OpenCL генератор..." -#: guiminer.py:1522 +#: guiminer.py:1584 msgid "Create a new OpenCL miner (default for ATI cards)" msgstr "Создать новый OpenCL генератор (по умолчанию для карт ATI)" -#: guiminer.py:1523 +#: guiminer.py:1585 msgid "Create a new Phoenix miner (for some ATI cards)" msgstr "Создать новый Phoenix генератор (для некоторых ATI карт)" -#: guiminer.py:1523 +#: guiminer.py:1585 msgid "New Phoenix miner..." msgstr "Создать Phoenix генератор..." -#: guiminer.py:1524 +#: guiminer.py:1586 msgid "Create a new CUDA miner (for NVIDIA cards)" msgstr "Создать CUDA генератор (для карт NVIDIA)" -#: guiminer.py:1524 +#: guiminer.py:1586 msgid "New CUDA miner..." msgstr "Создать CUDA генератор..." -#: guiminer.py:1525 +#: guiminer.py:1587 msgid "Create a new Ufasoft miner (for CPUs)" msgstr "Создать Ufasoft генератор (для CPU)" -#: guiminer.py:1525 +#: guiminer.py:1587 msgid "New Ufasoft CPU miner..." msgstr "Создать Ufasoft генератор..." -#: guiminer.py:1526 +#: guiminer.py:1588 msgid "Create a new custom miner (requires external program)" -msgstr "Создать генератор использующий другой движок (требуется дополнительный софт)" +msgstr "" +"Создать генератор использующий другой движок (требуется дополнительный софт)" -#: guiminer.py:1526 +#: guiminer.py:1588 msgid "New &other miner..." msgstr "Создать &другой генератор..." -#: guiminer.py:1527 +#: guiminer.py:1589 msgid "&New miner" msgstr "&Новый генератор" -#: guiminer.py:1528 +#: guiminer.py:1590 msgid "&Save settings" msgstr "&Сохранить настройки" -#: guiminer.py:1528 +#: guiminer.py:1590 msgid "Save your settings" msgstr "Сохранить текущие настройки генераторов" -#: guiminer.py:1529 +#: guiminer.py:1591 msgid "&Load settings" msgstr "&Загрузить настройки" -#: guiminer.py:1529 +#: guiminer.py:1591 msgid "Load stored settings" msgstr "Загрузить сохраненные настройки генераторов" -#: guiminer.py:1530 +#: guiminer.py:1592 msgid "Quit" msgstr "Выход" -#: guiminer.py:1531 +#: guiminer.py:1593 msgid "&File" msgstr "&Файл" -#: guiminer.py:1535 +#: guiminer.py:1597 msgid "Show summary" msgstr "Показать итоги" -#: guiminer.py:1535 +#: guiminer.py:1597 msgid "Show summary of all miners" msgstr "Показать таблицу со всеми генераторами" -#: guiminer.py:1536 +#: guiminer.py:1598 msgid "Show console" msgstr "Показать консоль" -#: guiminer.py:1536 +#: guiminer.py:1598 msgid "Show console logs" msgstr "Показать лог консоли" -#: guiminer.py:1537 +#: guiminer.py:1599 msgid "&View" msgstr "&Вид" -#: guiminer.py:1541 +#: guiminer.py:1603 msgid "&Create solo password..." msgstr "&Создать соло пароль..." -#: guiminer.py:1541 +#: guiminer.py:1603 msgid "Configure a user/pass for solo mining" msgstr "Настроить логин/пароль для генерирования в одиночку (без пула)" -#: guiminer.py:1542 +#: guiminer.py:1604 msgid "&Set Bitcoin client path..." msgstr "&Путь к клиенту Bitcoin..." -#: guiminer.py:1542 +#: guiminer.py:1604 msgid "Set the location of the official Bitcoin client" msgstr "Указать путь к официальному клиенту Bitcoin." -#: guiminer.py:1543 +#: guiminer.py:1605 msgid "&Launch Bitcoin client as server" msgstr "&Запустить Bitcoin клиент как сервер" -#: guiminer.py:1543 +#: guiminer.py:1605 msgid "Launch the official Bitcoin client as a server for solo mining" -msgstr "Запустить официальный Bitcoin клиент в режиме сервера для одиночного генерирования" +msgstr "" +"Запустить официальный Bitcoin клиент в режиме сервера для одиночного " +"генерирования" -#: guiminer.py:1544 +#: guiminer.py:1606 msgid "&Solo utilities" msgstr "&Соло режим" -#: guiminer.py:1548 +#: guiminer.py:1610 msgid "Start &minimized" msgstr "Запускать в трее" -#: guiminer.py:1548 +#: guiminer.py:1610 msgid "Start the GUI minimized to the tray." msgstr "Запускает GUI свернутым в трей" -#: guiminer.py:1550 +#: guiminer.py:1612 msgid "&Options" msgstr "&Настройки" -#: guiminer.py:1554 +#: guiminer.py:1616 msgid "&Change language..." msgstr "&Изменить язык..." -#: guiminer.py:1555 +#: guiminer.py:1617 msgid "Language" msgstr "Язык" -#: guiminer.py:1559 +#: guiminer.py:1621 msgid "&Donate 99 cents..." msgstr "&99 центов автору" -#: guiminer.py:1559 +#: guiminer.py:1621 msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" -msgstr "Пожертвовать автору сумму BTC, равную по курсу 0,99$, чтобы поддержать развитие GUIminer" +msgstr "" +"Пожертвовать автору сумму BTC, равную по курсу 0,99$, чтобы поддержать " +"развитие GUIminer" -#: guiminer.py:1560 +#: guiminer.py:1622 msgid "&Donate" msgstr "&Помочь" -#: guiminer.py:1563 +#: guiminer.py:1625 msgid "&About..." msgstr "&О программе" -#: guiminer.py:1565 +#: guiminer.py:1627 msgid "&Help" msgstr "&Помощь" -#: guiminer.py:1577 +#: guiminer.py:1639 msgid "Failed to load taskbar icon; continuing." msgstr "Не удалось загрузить иконку таскбара; продолжаю...." -#: guiminer.py:1586 +#: guiminer.py:1648 msgid "OpenCL not found - can't add a OpenCL miner" msgstr "OpenCL не обнаружен - нельзя добавить OpenCL генератор" -#: guiminer.py:1623 +#: guiminer.py:1685 #, python-format msgid "GUIMiner - v%s" msgstr "GUIMiner - v%s" -#: guiminer.py:1665 +#: guiminer.py:1727 msgid "Name this miner:" msgstr "Назовите генератор:" -#: guiminer.py:1665 +#: guiminer.py:1727 msgid "New miner" msgstr "&Новый генератор" -#: guiminer.py:1668 +#: guiminer.py:1730 msgid "Untitled" msgstr "Без имени" -#: guiminer.py:1679 +#: guiminer.py:1741 msgid "External miner (*.exe)|*.exe|(*.py)|*.py" msgstr "Внешний генератор (*.exe)|*.exe|(*.py)|*.py" -#: guiminer.py:1681 +#: guiminer.py:1743 msgid "Select external miner:" msgstr "Выберите внешний генератор:" -#: guiminer.py:1691 +#: guiminer.py:1753 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" -msgstr "Неподдерживаемый внешний генератор %(filename)s. Поддерживаемые: %(supported)s" +msgstr "" +"Неподдерживаемый внешний генератор %(filename)s. Поддерживаемые: %(supported)" +"s" -#: guiminer.py:1693 +#: guiminer.py:1755 msgid "Miner not supported" msgstr "Генератор не поддерживается" -#: guiminer.py:1734 +#: guiminer.py:1796 msgid "Do you want to save changes?" msgstr "Сохранить настройки?" -#: guiminer.py:1734 +#: guiminer.py:1796 msgid "Save" msgstr "Сохранить" -#: guiminer.py:1764 +#: guiminer.py:1826 msgid "Saving: " msgstr "Сохранение: " -#: guiminer.py:1770 +#: guiminer.py:1832 #, python-format msgid "" "Couldn't write save file %s.\n" @@ -613,147 +628,160 @@ msgstr "" "Не могу записать файл %s.\n" "Проверьте, не указан ли для целевой папки параметр \"только для чтения" -#: guiminer.py:1771 +#: guiminer.py:1833 msgid "Save unsuccessful" msgstr "Сохранение не удалось" -#: guiminer.py:1773 +#: guiminer.py:1835 #, python-format msgid "Profiles saved OK to %s." msgstr "Профили успешно сохранены в %s." -#: guiminer.py:1774 +#: guiminer.py:1836 msgid "Save successful" msgstr "Сохранение успешно" -#: guiminer.py:1786 +#: guiminer.py:1848 #, python-format msgid "Loaded: %s" msgstr "Загружено: %s" -#: guiminer.py:1800 +#: guiminer.py:1862 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "Загрузка настроек остановит все текущие генераторы. Продолжить?" -#: guiminer.py:1801 +#: guiminer.py:1863 msgid "Load profile" msgstr "Загрузить настройки" -#: guiminer.py:1830 +#: guiminer.py:1892 msgid "Select path to Bitcoin.exe" msgstr "Указать расположение Bitcoin.exe" -#: guiminer.py:1842 +#: guiminer.py:1904 msgid "About" msgstr "О программе" -#: guiminer.py:1868 +#: guiminer.py:1930 msgid "Closing this miner will stop it. Continue?" msgstr "Закрытие генератора остановит его. Продолжить?" -#: guiminer.py:1869 +#: guiminer.py:1931 msgid "Close miner" msgstr "Закрыть генератор" -#: guiminer.py:1898 +#: guiminer.py:1960 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" msgstr "Не могу найти Bitcoin в %s. Путь указан правильно?" -#: guiminer.py:1899 +#: guiminer.py:1961 msgid "Launch failed" msgstr "Сбой запуска" -#: guiminer.py:1902 -msgid "Client launched ok. You can start a miner now with the server set to 'solo'." -msgstr "Клиент успешно запущен. Можно запустить генератор с указанием на \"Соло\" сервер." +#: guiminer.py:1964 +msgid "" +"The Bitcoin client will now launch in server mode.\n" +"Once it connects to the network and downloads the block chain, you can start " +"a miner in 'solo' mode." +msgstr "" -#: guiminer.py:1903 +#: guiminer.py:1965 msgid "Launched ok." msgstr "Успешно запущено." -#: guiminer.py:1918 +#: guiminer.py:1980 #, python-format msgid "%s already exists. Overwrite?" msgstr "%s Уже существует. Перезаписать?" -#: guiminer.py:1919 +#: guiminer.py:1981 msgid "bitcoin.conf already exists." msgstr "bitcoin.conf уже существует." -#: guiminer.py:1924 +#: guiminer.py:1986 msgid "Enter password" msgstr "Введите пароль" -#: guiminer.py:1934 +#: guiminer.py:1996 msgid "Success" msgstr "Успешно" -#: guiminer.py:1934 +#: guiminer.py:1996 msgid "Wrote bitcoin config ok." msgstr "bitcoin.conf успешно записан." -#: guiminer.py:1945 +#: guiminer.py:2007 msgid "Console" msgstr "Консоль" -#: guiminer.py:1957 +#: guiminer.py:2019 msgid "Summary" msgstr "Итог" -#: guiminer.py:1970 +#: guiminer.py:2032 msgid "Rename miner" msgstr "Переименовать генератор" -#: guiminer.py:1970 +#: guiminer.py:2032 msgid "Rename to:" msgstr "Переименовать в:" -#: guiminer.py:1975 +#: guiminer.py:2037 msgid "Change language" msgstr "Изменить язык" -#: guiminer.py:1995 +#: guiminer.py:2057 msgid "Choose language (requires restart to take full effect)" msgstr "Выбрать другой язык (требуется перезапуск программы)" -#: guiminer.py:2040 +#: guiminer.py:2102 msgid "" "Click the link below to log in to the pool and get a special token. \n" "This token lets you securely check your balance.\n" "To remember this token for the future, save your miner settings." msgstr "" -"Нажмите ссылку ниже, чтобы войти в пул и получить специальный код (API token). \n" +"Нажмите ссылку ниже, чтобы войти в пул и получить специальный код (API " +"token). \n" "Этот код позволяет проверять состояние баланса.\n" "При сохранении настроек, код сохраняется." -#: guiminer.py:2049 +#: guiminer.py:2111 msgid "(Paste token here)" msgstr "(Копируйте код сюда)" -#: guiminer.py:2075 +#: guiminer.py:2137 msgid "Copy address to clipboard" msgstr "Копировать адрес в буфер обмена" -#: guiminer.py:2094 +#: guiminer.py:2156 msgid "No OpenCL devices found." msgstr "Не обнаружено OpenCL устройств." -#: guiminer.py:2097 +#: guiminer.py:2159 msgid "" "No OpenCL devices were found.\n" " If you only want to mine using CPU or CUDA, you can ignore this message.\n" -" If you want to mine on ATI graphics cards, you may need to install the ATI Stream\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI " +"Stream\n" " SDK, or your GPU may not support OpenCL." msgstr "" "Не обнаружено OpenCL устройств.\n" -"Если вы собирались генерировать используя CPU или CUDA, игнорируйте это сообщение.\n" +"Если вы собирались генерировать используя CPU или CUDA, игнорируйте это " +"сообщение.\n" "Если вы хотите генерировать на видеокартах ATI, нужно установить ATI Stream\n" "SDK. Или возможно, ваша карта не поддерживает OpenCL.\n" -#: guiminer.py:2107 +#: guiminer.py:2169 msgid "Don't show this message again" msgstr "Больше не показывать это сообщение." +#~ msgid "" +#~ "Client launched ok. You can start a miner now with the server set to " +#~ "'solo'." +#~ msgstr "" +#~ "Клиент успешно запущен. Можно запустить генератор с указанием на \"Соло\" " +#~ "сервер." + #~ msgid "%s mining!" #~ msgstr "%s генерации" diff --git a/guiminer_zh.po b/guiminer_zh.po index 3d8fec9..5a88715 100644 --- a/guiminer_zh.po +++ b/guiminer_zh.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 12:41-0300\n" +"POT-Creation-Date: 2011-06-10 15:18-0300\n" "PO-Revision-Date: \n" "Last-Translator: Dean Lee \n" "Language-Team: Chinese Simp \n" @@ -12,7 +12,7 @@ msgstr "" "X-Poedit-Basepath: /\n" "X-Poedit-Language: Chinese\n" -#: guiminer.py:84 +#: guiminer.py:89 #, python-format msgid "" "GUIMiner\n" @@ -53,220 +53,224 @@ msgstr "" "每一分 Bitcoin 都欢迎,\n" "它们将推动本软件的进一步开发。\n" -#: guiminer.py:105 +#: guiminer.py:110 msgid "Not started" msgstr "未启动" -#: guiminer.py:106 +#: guiminer.py:111 msgid "Starting..." msgstr "正在启动..." -#: guiminer.py:107 +#: guiminer.py:112 msgid "Stopped" msgstr "已停止" -#: guiminer.py:108 +#: guiminer.py:113 msgid "Paused" msgstr "已暂停" -#: guiminer.py:109 +#: guiminer.py:114 msgid "Start mining!" msgstr "开始采矿!" -#: guiminer.py:110 +#: guiminer.py:115 msgid "Stop mining" msgstr "停止采矿" -#: guiminer.py:111 +#: guiminer.py:116 msgid "Refresh balance" msgstr "刷新余额" -#: guiminer.py:112 +#: guiminer.py:117 msgid "Connection error" msgstr "连接错误" -#: guiminer.py:113 +#: guiminer.py:118 msgid "Username:" msgstr "用户名:" -#: guiminer.py:114 +#: guiminer.py:119 msgid "Password:" msgstr "密码:" -#: guiminer.py:115 +#: guiminer.py:120 msgid "Quit this program" msgstr "退出本程序" -#: guiminer.py:116 +#: guiminer.py:121 msgid "Show about dialog" msgstr "显示关于窗口" -#: guiminer.py:197 +#: guiminer.py:202 #, python-format msgid "%.1f Ghash/s" msgstr "%.1f Ghash/s" -#: guiminer.py:199 +#: guiminer.py:204 #, python-format msgid "%.1f Mhash/s" msgstr "%.1f Mhash/s" -#: guiminer.py:201 +#: guiminer.py:206 msgid "Connecting..." msgstr "正在连接..." -#: guiminer.py:203 +#: guiminer.py:208 #, python-format msgid "%d khash/s" msgstr "%d khash/s" -#: guiminer.py:227 +#: guiminer.py:232 #, python-format msgid "Requesting balance: %(request)s" msgstr "正在请求余额: %(request)s" -#: guiminer.py:231 +#: guiminer.py:236 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "服务器回复: %(status)s, %(data)s" -#: guiminer.py:286 +#: guiminer.py:303 msgid "Miner" msgstr "采矿器" -#: guiminer.py:287 +#: guiminer.py:304 msgid "Speed" msgstr "速度" -#: guiminer.py:288 +#: guiminer.py:305 msgid "Accepted" msgstr "已接受" -#: guiminer.py:289 +#: guiminer.py:306 msgid "Stale" msgstr "过时" -#: guiminer.py:290 +#: guiminer.py:307 msgid "Start/Stop" msgstr "启动/停止" -#: guiminer.py:291 +#: guiminer.py:308 msgid "Autostart" msgstr "自动启动" -#: guiminer.py:375 +#: guiminer.py:392 msgid "Pause all" msgstr "全部暂停" -#: guiminer.py:377 +#: guiminer.py:394 msgid "Restore" msgstr "回复" -#: guiminer.py:378 +#: guiminer.py:395 msgid "Close" msgstr "关闭" -#: guiminer.py:434 +#: guiminer.py:451 #, python-format msgid "Listener for \"%s\" started" msgstr "\"%s\" 监听器已启动" -#: guiminer.py:449 +#: guiminer.py:466 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "\"%(name)s\" 监听器已启动: %(line)s" -#: guiminer.py:452 +#: guiminer.py:469 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "\"%s\" 监听器正在关闭" -#: guiminer.py:496 +#: guiminer.py:515 msgid "Server:" msgstr "服务器:" -#: guiminer.py:501 +#: guiminer.py:520 msgid "Website:" msgstr "网站:" -#: guiminer.py:503 +#: guiminer.py:522 msgid "Ext. Path:" msgstr "外部路径:" -#: guiminer.py:505 +#: guiminer.py:524 msgid "Host:" msgstr "主机:" -#: guiminer.py:507 +#: guiminer.py:526 msgid "Port:" msgstr "端口:" -#: guiminer.py:513 +#: guiminer.py:532 msgid "Device:" msgstr "设备:" -#: guiminer.py:514 +#: guiminer.py:533 msgid "No OpenCL devices" msgstr "无 OpenCL 设备" -#: guiminer.py:515 +#: guiminer.py:534 msgid "Extra flags:" msgstr "附加参数:" -#: guiminer.py:518 +#: guiminer.py:537 +msgid "CPU Affinity:" +msgstr "" + +#: guiminer.py:540 msgid "Balance:" msgstr "余额:" -#: guiminer.py:522 +#: guiminer.py:544 msgid "Withdraw" msgstr "取款" -#: guiminer.py:667 +#: guiminer.py:704 msgid "Default" msgstr "默认" -#: guiminer.py:714 +#: guiminer.py:755 msgid "Start" msgstr "启动" -#: guiminer.py:714 +#: guiminer.py:755 msgid "Stop" msgstr "停止" -#: guiminer.py:730 +#: guiminer.py:771 msgid "Connection problems" msgstr "连接问题" -#: guiminer.py:889 +#: guiminer.py:930 msgid "Running command: " msgstr "正在运行命令: " -#: guiminer.py:943 +#: guiminer.py:989 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "难度为 1 的 hash: %(nhashes)d %(update_time)s" -#: guiminer.py:947 +#: guiminer.py:993 #, python-format msgid "Blocks: %d, " msgstr "块: %d, " -#: guiminer.py:950 +#: guiminer.py:996 #, python-format msgid "Shares: %d accepted" msgstr "贡献: %d 已接受" -#: guiminer.py:952 +#: guiminer.py:998 #, python-format msgid ", %d stale/invalid" msgstr ", %d 过时/无效" -#: guiminer.py:974 +#: guiminer.py:1020 #, python-format msgid "- last at %s" msgstr "- 更新于 %s" -#: guiminer.py:1047 +#: guiminer.py:1093 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." @@ -274,23 +278,23 @@ msgstr "" "要连接到的服务器。不同的服务器有不同的费用与功能。\n" "完整信息请查看其网站。" -#: guiminer.py:1048 +#: guiminer.py:1094 msgid "Website of the currently selected server. Click to visit." msgstr "当前所选服务器的网站。点击可访问。" -#: guiminer.py:1049 +#: guiminer.py:1095 msgid "Available OpenCL devices on your system." msgstr "您系统中可用的 OpenCL 设备。" -#: guiminer.py:1050 +#: guiminer.py:1096 msgid "Host address, without http:// prefix." msgstr "主机地址,无需 http:// 前缀。" -#: guiminer.py:1051 +#: guiminer.py:1097 msgid "Server port. This is usually 8332." msgstr "服务器端口。通常为 8332。" -#: guiminer.py:1052 +#: guiminer.py:1098 msgid "" "The miner's username.\n" "May be different than your account username.\n" @@ -300,7 +304,7 @@ msgstr "" "可以与账号用户名不同。\n" "示例: Kiv.GPU" -#: guiminer.py:1053 +#: guiminer.py:1099 msgid "" "The miner's password.\n" "May be different than your account password." @@ -308,7 +312,7 @@ msgstr "" "采矿器的密码。\n" "可以与账号密码不同。" -#: guiminer.py:1054 +#: guiminer.py:1100 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" @@ -318,37 +322,43 @@ msgstr "" "Radeon HD 5xxx 系列可使用 -v -w128 获取最佳效果。\n" "其他显卡的参数参见论坛。" -#: guiminer.py:1148 guiminer.py:1242 guiminer.py:1263 +#: guiminer.py:1102 +msgid "" +"CPU cores used for mining.\n" +"Unchecking some cores can reduce high CPU usage in some systems." +msgstr "" + +#: guiminer.py:1196 guiminer.py:1290 guiminer.py:1311 msgid "Auth token rejected by server." msgstr "身份认证 token 被服务器拒绝。" -#: guiminer.py:1166 +#: guiminer.py:1214 #, python-format msgid "%s confirmed" msgstr "%s 已确认" -#: guiminer.py:1168 +#: guiminer.py:1216 #, python-format msgid ", %s unconfirmed" msgstr ", %s 未确认" -#: guiminer.py:1170 +#: guiminer.py:1218 msgid "Bad response from server." msgstr "服务器响应错误。" -#: guiminer.py:1246 guiminer.py:1267 +#: guiminer.py:1294 guiminer.py:1315 msgid "Withdraw OK" msgstr "取款成功" -#: guiminer.py:1426 +#: guiminer.py:1485 msgid "No registration is required - just enter an address and press Start." msgstr "无需注册 - 只需输入地址并按“启动”。" -#: guiminer.py:1428 +#: guiminer.py:1487 msgid "Address:" msgstr "地址:" -#: guiminer.py:1430 +#: guiminer.py:1489 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" @@ -356,7 +366,7 @@ msgstr "" "您接收 Bitcoins 的地址。\n" "例如: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" -#: guiminer.py:1445 +#: guiminer.py:1505 msgid "" "Your miner username (not your account username).\n" "Example: Kiv.GPU" @@ -364,11 +374,11 @@ msgstr "" "您的采矿器用户名 (不是账号用户名)。\n" "示例: Kiv.GPU" -#: guiminer.py:1447 guiminer.py:1467 +#: guiminer.py:1507 guiminer.py:1528 msgid "Your miner password (not your account password)." msgstr "您的采矿器密码 (不是账号密码)。" -#: guiminer.py:1465 +#: guiminer.py:1526 msgid "" "Your miner username. \n" "Example: kiv123@kiv123" @@ -376,244 +386,244 @@ msgstr "" "您的采矿器用户名。\n" "示例: kiv123@kiv123" -#: guiminer.py:1481 +#: guiminer.py:1543 msgid "The e-mail address you registered with." msgstr "您注册时使用的 e-mail 地址。" -#: guiminer.py:1482 +#: guiminer.py:1544 msgid "Email:" msgstr "Email:" -#: guiminer.py:1497 +#: guiminer.py:1559 msgid "&Rename..." msgstr "重命名(&R)..." -#: guiminer.py:1497 +#: guiminer.py:1559 msgid "Rename this miner" msgstr "重命名该采矿器" -#: guiminer.py:1522 +#: guiminer.py:1584 msgid "&New OpenCL miner..." msgstr "新建 OpenCL 采矿器(&N)..." -#: guiminer.py:1522 +#: guiminer.py:1584 msgid "Create a new OpenCL miner (default for ATI cards)" msgstr "" -#: guiminer.py:1523 +#: guiminer.py:1585 #, fuzzy msgid "Create a new Phoenix miner (for some ATI cards)" msgstr "创建新的采矿器配置文件" -#: guiminer.py:1523 +#: guiminer.py:1585 #, fuzzy msgid "New Phoenix miner..." msgstr "新建其他采矿器(&O)..." -#: guiminer.py:1524 +#: guiminer.py:1586 msgid "Create a new CUDA miner (for NVIDIA cards)" msgstr "" -#: guiminer.py:1524 +#: guiminer.py:1586 #, fuzzy msgid "New CUDA miner..." msgstr "新建 OpenCL 采矿器(&N)..." -#: guiminer.py:1525 +#: guiminer.py:1587 #, fuzzy msgid "Create a new Ufasoft miner (for CPUs)" msgstr "创建新的采矿器配置文件" -#: guiminer.py:1525 +#: guiminer.py:1587 #, fuzzy msgid "New Ufasoft CPU miner..." msgstr "新建其他采矿器(&O)..." -#: guiminer.py:1526 +#: guiminer.py:1588 #, fuzzy msgid "Create a new custom miner (requires external program)" msgstr "创建 CPU 或 CUDA 采矿器 (需要外部程序)" -#: guiminer.py:1526 +#: guiminer.py:1588 msgid "New &other miner..." msgstr "新建其他采矿器(&O)..." -#: guiminer.py:1527 +#: guiminer.py:1589 #, fuzzy msgid "&New miner" msgstr "新建采矿器" -#: guiminer.py:1528 +#: guiminer.py:1590 msgid "&Save settings" msgstr "保存设置(&S)" -#: guiminer.py:1528 +#: guiminer.py:1590 msgid "Save your settings" msgstr "保存您的设置" -#: guiminer.py:1529 +#: guiminer.py:1591 msgid "&Load settings" msgstr "加载设置(&L)" -#: guiminer.py:1529 +#: guiminer.py:1591 msgid "Load stored settings" msgstr "加载已储存的设置" -#: guiminer.py:1530 +#: guiminer.py:1592 msgid "Quit" msgstr "退出" -#: guiminer.py:1531 +#: guiminer.py:1593 msgid "&File" msgstr "文件(&F)" -#: guiminer.py:1535 +#: guiminer.py:1597 msgid "Show summary" msgstr "显示概览" -#: guiminer.py:1535 +#: guiminer.py:1597 msgid "Show summary of all miners" msgstr "显示全部采矿器的概览" -#: guiminer.py:1536 +#: guiminer.py:1598 msgid "Show console" msgstr "显示终端" -#: guiminer.py:1536 +#: guiminer.py:1598 msgid "Show console logs" msgstr "显示终端日志" -#: guiminer.py:1537 +#: guiminer.py:1599 msgid "&View" msgstr "查看(&V)" -#: guiminer.py:1541 +#: guiminer.py:1603 msgid "&Create solo password..." msgstr "创建独自采矿密码(&C)..." -#: guiminer.py:1541 +#: guiminer.py:1603 msgid "Configure a user/pass for solo mining" msgstr "配置独自采矿的用户名/密码" -#: guiminer.py:1542 +#: guiminer.py:1604 msgid "&Set Bitcoin client path..." msgstr "设置 Bitcoin 客户端路径(&S)..." -#: guiminer.py:1542 +#: guiminer.py:1604 msgid "Set the location of the official Bitcoin client" msgstr "设置官方 Bitcoin 客户端的位置" -#: guiminer.py:1543 +#: guiminer.py:1605 msgid "&Launch Bitcoin client as server" msgstr "将 Bitcoin 客户端作为服务器启动(&L)" -#: guiminer.py:1543 +#: guiminer.py:1605 msgid "Launch the official Bitcoin client as a server for solo mining" msgstr "将官方 Bitcoin 客户端作为独自采矿的服务器启动" -#: guiminer.py:1544 +#: guiminer.py:1606 msgid "&Solo utilities" msgstr "独自采矿(&S)" -#: guiminer.py:1548 +#: guiminer.py:1610 #, fuzzy msgid "Start &minimized" msgstr "开始采矿!" -#: guiminer.py:1548 +#: guiminer.py:1610 msgid "Start the GUI minimized to the tray." msgstr "" -#: guiminer.py:1550 +#: guiminer.py:1612 msgid "&Options" msgstr "" -#: guiminer.py:1554 +#: guiminer.py:1616 msgid "&Change language..." msgstr "更改语言(&C)..." -#: guiminer.py:1555 +#: guiminer.py:1617 msgid "Language" msgstr "语言" -#: guiminer.py:1559 +#: guiminer.py:1621 msgid "&Donate 99 cents..." msgstr "" -#: guiminer.py:1559 +#: guiminer.py:1621 msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" msgstr "" -#: guiminer.py:1560 +#: guiminer.py:1622 #, fuzzy msgid "&Donate" msgstr "关于/捐助(&A)..." -#: guiminer.py:1563 +#: guiminer.py:1625 #, fuzzy msgid "&About..." msgstr "关于/捐助(&A)..." -#: guiminer.py:1565 +#: guiminer.py:1627 msgid "&Help" msgstr "帮助(&H)" -#: guiminer.py:1577 +#: guiminer.py:1639 msgid "Failed to load taskbar icon; continuing." msgstr "无法加载任务栏图标; 正在继续。" -#: guiminer.py:1586 +#: guiminer.py:1648 msgid "OpenCL not found - can't add a OpenCL miner" msgstr "未找到 OpenCL - 无法添加 OpenCL 采矿器" -#: guiminer.py:1623 +#: guiminer.py:1685 #, python-format msgid "GUIMiner - v%s" msgstr "GUIMiner - v%s" -#: guiminer.py:1665 +#: guiminer.py:1727 msgid "Name this miner:" msgstr "为该采矿器命名:" -#: guiminer.py:1665 +#: guiminer.py:1727 msgid "New miner" msgstr "新建采矿器" -#: guiminer.py:1668 +#: guiminer.py:1730 msgid "Untitled" msgstr "无标题" -#: guiminer.py:1679 +#: guiminer.py:1741 #, fuzzy msgid "External miner (*.exe)|*.exe|(*.py)|*.py" msgstr "外部采矿器 (*.exe)|*.exe" -#: guiminer.py:1681 +#: guiminer.py:1743 msgid "Select external miner:" msgstr "选择外部采矿器:" -#: guiminer.py:1691 +#: guiminer.py:1753 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" msgstr "不支持的外部采矿器 %(filename)s。支持: %(supported)s" -#: guiminer.py:1693 +#: guiminer.py:1755 msgid "Miner not supported" msgstr "采矿器不支持" -#: guiminer.py:1734 +#: guiminer.py:1796 msgid "Do you want to save changes?" msgstr "是否希望保存变更?" -#: guiminer.py:1734 +#: guiminer.py:1796 msgid "Save" msgstr "保存" -#: guiminer.py:1764 +#: guiminer.py:1826 msgid "Saving: " msgstr "正在保存: " -#: guiminer.py:1770 +#: guiminer.py:1832 #, python-format msgid "" "Couldn't write save file %s.\n" @@ -622,112 +632,114 @@ msgstr "" "无法写入保存文件 %s。\n" "检查其位置是否可写。" -#: guiminer.py:1771 +#: guiminer.py:1833 msgid "Save unsuccessful" msgstr "保存失败" -#: guiminer.py:1773 +#: guiminer.py:1835 #, python-format msgid "Profiles saved OK to %s." msgstr "配置文件成功保存于 %s。" -#: guiminer.py:1774 +#: guiminer.py:1836 msgid "Save successful" msgstr "保存成功" -#: guiminer.py:1786 +#: guiminer.py:1848 #, python-format msgid "Loaded: %s" msgstr "已加载: %s" -#: guiminer.py:1800 +#: guiminer.py:1862 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "加载配置文件将停止当前正在运行的全部采矿器。是否继续?" -#: guiminer.py:1801 +#: guiminer.py:1863 msgid "Load profile" msgstr "加载配置文件" -#: guiminer.py:1830 +#: guiminer.py:1892 msgid "Select path to Bitcoin.exe" msgstr "选择 Bitcoin.exe 的路径" -#: guiminer.py:1842 +#: guiminer.py:1904 msgid "About" msgstr "关于" -#: guiminer.py:1868 +#: guiminer.py:1930 msgid "Closing this miner will stop it. Continue?" msgstr "关闭该采矿器将停止其采矿。是否继续?" -#: guiminer.py:1869 +#: guiminer.py:1931 msgid "Close miner" msgstr "关闭采矿器" -#: guiminer.py:1898 +#: guiminer.py:1960 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" msgstr "无法在 %s 找到 Bitcoin。您的路径设置是否正确?" -#: guiminer.py:1899 +#: guiminer.py:1961 msgid "Launch failed" msgstr "启动失败" -#: guiminer.py:1902 +#: guiminer.py:1964 msgid "" -"Client launched ok. You can start a miner now with the server set to 'solo'." -msgstr "客户端启动成功。您现在可以启动服务器设为 'solo' 的采矿器。" +"The Bitcoin client will now launch in server mode.\n" +"Once it connects to the network and downloads the block chain, you can start " +"a miner in 'solo' mode." +msgstr "" -#: guiminer.py:1903 +#: guiminer.py:1965 msgid "Launched ok." msgstr "启动成功。" -#: guiminer.py:1918 +#: guiminer.py:1980 #, python-format msgid "%s already exists. Overwrite?" msgstr "%s 已存在。是否覆写?" -#: guiminer.py:1919 +#: guiminer.py:1981 msgid "bitcoin.conf already exists." msgstr "bitcoin.conf 已存在。" -#: guiminer.py:1924 +#: guiminer.py:1986 msgid "Enter password" msgstr "输入密码" -#: guiminer.py:1934 +#: guiminer.py:1996 msgid "Success" msgstr "成功" -#: guiminer.py:1934 +#: guiminer.py:1996 msgid "Wrote bitcoin config ok." msgstr "写入 bitcoin 配置成功。" -#: guiminer.py:1945 +#: guiminer.py:2007 msgid "Console" msgstr "终端" -#: guiminer.py:1957 +#: guiminer.py:2019 msgid "Summary" msgstr "概览" -#: guiminer.py:1970 +#: guiminer.py:2032 msgid "Rename miner" msgstr "重命名采矿器" -#: guiminer.py:1970 +#: guiminer.py:2032 msgid "Rename to:" msgstr "重命名为:" -#: guiminer.py:1975 +#: guiminer.py:2037 msgid "Change language" msgstr "更改语言" -#: guiminer.py:1995 +#: guiminer.py:2057 msgid "Choose language (requires restart to take full effect)" msgstr "选择语言 (需要重新启动方可完全生效)" -#: guiminer.py:2040 +#: guiminer.py:2102 msgid "" "Click the link below to log in to the pool and get a special token. \n" "This token lets you securely check your balance.\n" @@ -737,19 +749,19 @@ msgstr "" "该 token 允许您安全地检查余额。\n" "要记住该 token 供日后使用,请保存采矿器设置。" -#: guiminer.py:2049 +#: guiminer.py:2111 msgid "(Paste token here)" msgstr "(在此粘贴 token)" -#: guiminer.py:2075 +#: guiminer.py:2137 msgid "Copy address to clipboard" msgstr "复制地址到剪贴板" -#: guiminer.py:2094 +#: guiminer.py:2156 msgid "No OpenCL devices found." msgstr "未找到 OpenCL 设备。" -#: guiminer.py:2097 +#: guiminer.py:2159 msgid "" "No OpenCL devices were found.\n" " If you only want to mine using CPU or CUDA, you can ignore this message.\n" @@ -762,6 +774,11 @@ msgstr "" " 如果您想用 ATI 显卡采矿,可能需要安装 ATI Stream SDK,\n" " 若已安装,可能您的 GPU 不支持 OpenCL。" -#: guiminer.py:2107 +#: guiminer.py:2169 msgid "Don't show this message again" msgstr "不要再次显示本信息" + +#~ msgid "" +#~ "Client launched ok. You can start a miner now with the server set to " +#~ "'solo'." +#~ msgstr "客户端启动成功。您现在可以启动服务器设为 'solo' 的采矿器。" diff --git a/messages.pot b/messages.pot index ac0cba6..3115fb6 100644 --- a/messages.pot +++ b/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 12:41-0300\n" +"POT-Creation-Date: 2011-06-10 15:18-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: guiminer.py:84 +#: guiminer.py:89 #, python-format msgid "" "GUIMiner\n" @@ -39,670 +39,682 @@ msgid "" "further work on this software.\n" msgstr "" -#: guiminer.py:105 +#: guiminer.py:110 msgid "Not started" msgstr "" -#: guiminer.py:106 +#: guiminer.py:111 msgid "Starting..." msgstr "" -#: guiminer.py:107 +#: guiminer.py:112 msgid "Stopped" msgstr "" -#: guiminer.py:108 +#: guiminer.py:113 msgid "Paused" msgstr "" -#: guiminer.py:109 +#: guiminer.py:114 msgid "Start mining!" msgstr "" -#: guiminer.py:110 +#: guiminer.py:115 msgid "Stop mining" msgstr "" -#: guiminer.py:111 +#: guiminer.py:116 msgid "Refresh balance" msgstr "" -#: guiminer.py:112 +#: guiminer.py:117 msgid "Connection error" msgstr "" -#: guiminer.py:113 +#: guiminer.py:118 msgid "Username:" msgstr "" -#: guiminer.py:114 +#: guiminer.py:119 msgid "Password:" msgstr "" -#: guiminer.py:115 +#: guiminer.py:120 msgid "Quit this program" msgstr "" -#: guiminer.py:116 +#: guiminer.py:121 msgid "Show about dialog" msgstr "" -#: guiminer.py:197 +#: guiminer.py:202 #, python-format msgid "%.1f Ghash/s" msgstr "" -#: guiminer.py:199 +#: guiminer.py:204 #, python-format msgid "%.1f Mhash/s" msgstr "" -#: guiminer.py:201 +#: guiminer.py:206 msgid "Connecting..." msgstr "" -#: guiminer.py:203 +#: guiminer.py:208 #, python-format msgid "%d khash/s" msgstr "" -#: guiminer.py:227 +#: guiminer.py:232 #, python-format msgid "Requesting balance: %(request)s" msgstr "" -#: guiminer.py:231 +#: guiminer.py:236 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "" -#: guiminer.py:286 +#: guiminer.py:303 msgid "Miner" msgstr "" -#: guiminer.py:287 +#: guiminer.py:304 msgid "Speed" msgstr "" -#: guiminer.py:288 +#: guiminer.py:305 msgid "Accepted" msgstr "" -#: guiminer.py:289 +#: guiminer.py:306 msgid "Stale" msgstr "" -#: guiminer.py:290 +#: guiminer.py:307 msgid "Start/Stop" msgstr "" -#: guiminer.py:291 +#: guiminer.py:308 msgid "Autostart" msgstr "" -#: guiminer.py:375 +#: guiminer.py:392 msgid "Pause all" msgstr "" -#: guiminer.py:377 +#: guiminer.py:394 msgid "Restore" msgstr "" -#: guiminer.py:378 +#: guiminer.py:395 msgid "Close" msgstr "" -#: guiminer.py:434 +#: guiminer.py:451 #, python-format msgid "Listener for \"%s\" started" msgstr "" -#: guiminer.py:449 +#: guiminer.py:466 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "" -#: guiminer.py:452 +#: guiminer.py:469 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "" -#: guiminer.py:496 +#: guiminer.py:515 msgid "Server:" msgstr "" -#: guiminer.py:501 +#: guiminer.py:520 msgid "Website:" msgstr "" -#: guiminer.py:503 +#: guiminer.py:522 msgid "Ext. Path:" msgstr "" -#: guiminer.py:505 +#: guiminer.py:524 msgid "Host:" msgstr "" -#: guiminer.py:507 +#: guiminer.py:526 msgid "Port:" msgstr "" -#: guiminer.py:513 +#: guiminer.py:532 msgid "Device:" msgstr "" -#: guiminer.py:514 +#: guiminer.py:533 msgid "No OpenCL devices" msgstr "" -#: guiminer.py:515 +#: guiminer.py:534 msgid "Extra flags:" msgstr "" -#: guiminer.py:518 +#: guiminer.py:537 +msgid "CPU Affinity:" +msgstr "" + +#: guiminer.py:540 msgid "Balance:" msgstr "" -#: guiminer.py:522 +#: guiminer.py:544 msgid "Withdraw" msgstr "" -#: guiminer.py:667 +#: guiminer.py:704 msgid "Default" msgstr "" -#: guiminer.py:714 +#: guiminer.py:755 msgid "Start" msgstr "" -#: guiminer.py:714 +#: guiminer.py:755 msgid "Stop" msgstr "" -#: guiminer.py:730 +#: guiminer.py:771 msgid "Connection problems" msgstr "" -#: guiminer.py:889 +#: guiminer.py:930 msgid "Running command: " msgstr "" -#: guiminer.py:943 +#: guiminer.py:989 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "" -#: guiminer.py:947 +#: guiminer.py:993 #, python-format msgid "Blocks: %d, " msgstr "" -#: guiminer.py:950 +#: guiminer.py:996 #, python-format msgid "Shares: %d accepted" msgstr "" -#: guiminer.py:952 +#: guiminer.py:998 #, python-format msgid ", %d stale/invalid" msgstr "" -#: guiminer.py:974 +#: guiminer.py:1020 #, python-format msgid "- last at %s" msgstr "" -#: guiminer.py:1047 +#: guiminer.py:1093 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." msgstr "" -#: guiminer.py:1048 +#: guiminer.py:1094 msgid "Website of the currently selected server. Click to visit." msgstr "" -#: guiminer.py:1049 +#: guiminer.py:1095 msgid "Available OpenCL devices on your system." msgstr "" -#: guiminer.py:1050 +#: guiminer.py:1096 msgid "Host address, without http:// prefix." msgstr "" -#: guiminer.py:1051 +#: guiminer.py:1097 msgid "Server port. This is usually 8332." msgstr "" -#: guiminer.py:1052 +#: guiminer.py:1098 msgid "" "The miner's username.\n" "May be different than your account username.\n" "Example: Kiv.GPU" msgstr "" -#: guiminer.py:1053 +#: guiminer.py:1099 msgid "" "The miner's password.\n" "May be different than your account password." msgstr "" -#: guiminer.py:1054 +#: guiminer.py:1100 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" "For other cards consult the forum." msgstr "" -#: guiminer.py:1148 guiminer.py:1242 guiminer.py:1263 +#: guiminer.py:1102 +msgid "" +"CPU cores used for mining.\n" +"Unchecking some cores can reduce high CPU usage in some systems." +msgstr "" + +#: guiminer.py:1196 guiminer.py:1290 guiminer.py:1311 msgid "Auth token rejected by server." msgstr "" -#: guiminer.py:1166 +#: guiminer.py:1214 #, python-format msgid "%s confirmed" msgstr "" -#: guiminer.py:1168 +#: guiminer.py:1216 #, python-format msgid ", %s unconfirmed" msgstr "" -#: guiminer.py:1170 +#: guiminer.py:1218 msgid "Bad response from server." msgstr "" -#: guiminer.py:1246 guiminer.py:1267 +#: guiminer.py:1294 guiminer.py:1315 msgid "Withdraw OK" msgstr "" -#: guiminer.py:1426 +#: guiminer.py:1485 msgid "No registration is required - just enter an address and press Start." msgstr "" -#: guiminer.py:1428 +#: guiminer.py:1487 msgid "Address:" msgstr "" -#: guiminer.py:1430 +#: guiminer.py:1489 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" msgstr "" -#: guiminer.py:1445 +#: guiminer.py:1505 msgid "" "Your miner username (not your account username).\n" "Example: Kiv.GPU" msgstr "" -#: guiminer.py:1447 guiminer.py:1467 +#: guiminer.py:1507 guiminer.py:1528 msgid "Your miner password (not your account password)." msgstr "" -#: guiminer.py:1465 +#: guiminer.py:1526 msgid "" "Your miner username. \n" "Example: kiv123@kiv123" msgstr "" -#: guiminer.py:1481 +#: guiminer.py:1543 msgid "The e-mail address you registered with." msgstr "" -#: guiminer.py:1482 +#: guiminer.py:1544 msgid "Email:" msgstr "" -#: guiminer.py:1497 +#: guiminer.py:1559 msgid "&Rename..." msgstr "" -#: guiminer.py:1497 +#: guiminer.py:1559 msgid "Rename this miner" msgstr "" -#: guiminer.py:1522 +#: guiminer.py:1584 msgid "&New OpenCL miner..." msgstr "" -#: guiminer.py:1522 +#: guiminer.py:1584 msgid "Create a new OpenCL miner (default for ATI cards)" msgstr "" -#: guiminer.py:1523 +#: guiminer.py:1585 msgid "Create a new Phoenix miner (for some ATI cards)" msgstr "" -#: guiminer.py:1523 +#: guiminer.py:1585 msgid "New Phoenix miner..." msgstr "" -#: guiminer.py:1524 +#: guiminer.py:1586 msgid "Create a new CUDA miner (for NVIDIA cards)" msgstr "" -#: guiminer.py:1524 +#: guiminer.py:1586 msgid "New CUDA miner..." msgstr "" -#: guiminer.py:1525 +#: guiminer.py:1587 msgid "Create a new Ufasoft miner (for CPUs)" msgstr "" -#: guiminer.py:1525 +#: guiminer.py:1587 msgid "New Ufasoft CPU miner..." msgstr "" -#: guiminer.py:1526 +#: guiminer.py:1588 msgid "Create a new custom miner (requires external program)" msgstr "" -#: guiminer.py:1526 +#: guiminer.py:1588 msgid "New &other miner..." msgstr "" -#: guiminer.py:1527 +#: guiminer.py:1589 msgid "&New miner" msgstr "" -#: guiminer.py:1528 +#: guiminer.py:1590 msgid "&Save settings" msgstr "" -#: guiminer.py:1528 +#: guiminer.py:1590 msgid "Save your settings" msgstr "" -#: guiminer.py:1529 +#: guiminer.py:1591 msgid "&Load settings" msgstr "" -#: guiminer.py:1529 +#: guiminer.py:1591 msgid "Load stored settings" msgstr "" -#: guiminer.py:1530 +#: guiminer.py:1592 msgid "Quit" msgstr "" -#: guiminer.py:1531 +#: guiminer.py:1593 msgid "&File" msgstr "" -#: guiminer.py:1535 +#: guiminer.py:1597 msgid "Show summary" msgstr "" -#: guiminer.py:1535 +#: guiminer.py:1597 msgid "Show summary of all miners" msgstr "" -#: guiminer.py:1536 +#: guiminer.py:1598 msgid "Show console" msgstr "" -#: guiminer.py:1536 +#: guiminer.py:1598 msgid "Show console logs" msgstr "" -#: guiminer.py:1537 +#: guiminer.py:1599 msgid "&View" msgstr "" -#: guiminer.py:1541 +#: guiminer.py:1603 msgid "&Create solo password..." msgstr "" -#: guiminer.py:1541 +#: guiminer.py:1603 msgid "Configure a user/pass for solo mining" msgstr "" -#: guiminer.py:1542 +#: guiminer.py:1604 msgid "&Set Bitcoin client path..." msgstr "" -#: guiminer.py:1542 +#: guiminer.py:1604 msgid "Set the location of the official Bitcoin client" msgstr "" -#: guiminer.py:1543 +#: guiminer.py:1605 msgid "&Launch Bitcoin client as server" msgstr "" -#: guiminer.py:1543 +#: guiminer.py:1605 msgid "Launch the official Bitcoin client as a server for solo mining" msgstr "" -#: guiminer.py:1544 +#: guiminer.py:1606 msgid "&Solo utilities" msgstr "" -#: guiminer.py:1548 +#: guiminer.py:1610 msgid "Start &minimized" msgstr "" -#: guiminer.py:1548 +#: guiminer.py:1610 msgid "Start the GUI minimized to the tray." msgstr "" -#: guiminer.py:1550 +#: guiminer.py:1612 msgid "&Options" msgstr "" -#: guiminer.py:1554 +#: guiminer.py:1616 msgid "&Change language..." msgstr "" -#: guiminer.py:1555 +#: guiminer.py:1617 msgid "Language" msgstr "" -#: guiminer.py:1559 +#: guiminer.py:1621 msgid "&Donate 99 cents..." msgstr "" -#: guiminer.py:1559 +#: guiminer.py:1621 msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" msgstr "" -#: guiminer.py:1560 +#: guiminer.py:1622 msgid "&Donate" msgstr "" -#: guiminer.py:1563 +#: guiminer.py:1625 msgid "&About..." msgstr "" -#: guiminer.py:1565 +#: guiminer.py:1627 msgid "&Help" msgstr "" -#: guiminer.py:1577 +#: guiminer.py:1639 msgid "Failed to load taskbar icon; continuing." msgstr "" -#: guiminer.py:1586 +#: guiminer.py:1648 msgid "OpenCL not found - can't add a OpenCL miner" msgstr "" -#: guiminer.py:1623 +#: guiminer.py:1685 #, python-format msgid "GUIMiner - v%s" msgstr "" -#: guiminer.py:1665 +#: guiminer.py:1727 msgid "Name this miner:" msgstr "" -#: guiminer.py:1665 +#: guiminer.py:1727 msgid "New miner" msgstr "" -#: guiminer.py:1668 +#: guiminer.py:1730 msgid "Untitled" msgstr "" -#: guiminer.py:1679 +#: guiminer.py:1741 msgid "External miner (*.exe)|*.exe|(*.py)|*.py" msgstr "" -#: guiminer.py:1681 +#: guiminer.py:1743 msgid "Select external miner:" msgstr "" -#: guiminer.py:1691 +#: guiminer.py:1753 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" msgstr "" -#: guiminer.py:1693 +#: guiminer.py:1755 msgid "Miner not supported" msgstr "" -#: guiminer.py:1734 +#: guiminer.py:1796 msgid "Do you want to save changes?" msgstr "" -#: guiminer.py:1734 +#: guiminer.py:1796 msgid "Save" msgstr "" -#: guiminer.py:1764 +#: guiminer.py:1826 msgid "Saving: " msgstr "" -#: guiminer.py:1770 +#: guiminer.py:1832 #, python-format msgid "" "Couldn't write save file %s.\n" "Check the location is writable." msgstr "" -#: guiminer.py:1771 +#: guiminer.py:1833 msgid "Save unsuccessful" msgstr "" -#: guiminer.py:1773 +#: guiminer.py:1835 #, python-format msgid "Profiles saved OK to %s." msgstr "" -#: guiminer.py:1774 +#: guiminer.py:1836 msgid "Save successful" msgstr "" -#: guiminer.py:1786 +#: guiminer.py:1848 #, python-format msgid "Loaded: %s" msgstr "" -#: guiminer.py:1800 +#: guiminer.py:1862 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "" -#: guiminer.py:1801 +#: guiminer.py:1863 msgid "Load profile" msgstr "" -#: guiminer.py:1830 +#: guiminer.py:1892 msgid "Select path to Bitcoin.exe" msgstr "" -#: guiminer.py:1842 +#: guiminer.py:1904 msgid "About" msgstr "" -#: guiminer.py:1868 +#: guiminer.py:1930 msgid "Closing this miner will stop it. Continue?" msgstr "" -#: guiminer.py:1869 +#: guiminer.py:1931 msgid "Close miner" msgstr "" -#: guiminer.py:1898 +#: guiminer.py:1960 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" msgstr "" -#: guiminer.py:1899 +#: guiminer.py:1961 msgid "Launch failed" msgstr "" -#: guiminer.py:1902 -msgid "Client launched ok. You can start a miner now with the server set to 'solo'." +#: guiminer.py:1964 +msgid "" +"The Bitcoin client will now launch in server mode.\n" +"Once it connects to the network and downloads the block chain, you can start a miner in 'solo' mode." msgstr "" -#: guiminer.py:1903 +#: guiminer.py:1965 msgid "Launched ok." msgstr "" -#: guiminer.py:1918 +#: guiminer.py:1980 #, python-format msgid "%s already exists. Overwrite?" msgstr "" -#: guiminer.py:1919 +#: guiminer.py:1981 msgid "bitcoin.conf already exists." msgstr "" -#: guiminer.py:1924 +#: guiminer.py:1986 msgid "Enter password" msgstr "" -#: guiminer.py:1934 +#: guiminer.py:1996 msgid "Success" msgstr "" -#: guiminer.py:1934 +#: guiminer.py:1996 msgid "Wrote bitcoin config ok." msgstr "" -#: guiminer.py:1945 +#: guiminer.py:2007 msgid "Console" msgstr "" -#: guiminer.py:1957 +#: guiminer.py:2019 msgid "Summary" msgstr "" -#: guiminer.py:1970 +#: guiminer.py:2032 msgid "Rename miner" msgstr "" -#: guiminer.py:1970 +#: guiminer.py:2032 msgid "Rename to:" msgstr "" -#: guiminer.py:1975 +#: guiminer.py:2037 msgid "Change language" msgstr "" -#: guiminer.py:1995 +#: guiminer.py:2057 msgid "Choose language (requires restart to take full effect)" msgstr "" -#: guiminer.py:2040 +#: guiminer.py:2102 msgid "" "Click the link below to log in to the pool and get a special token. \n" "This token lets you securely check your balance.\n" "To remember this token for the future, save your miner settings." msgstr "" -#: guiminer.py:2049 +#: guiminer.py:2111 msgid "(Paste token here)" msgstr "" -#: guiminer.py:2075 +#: guiminer.py:2137 msgid "Copy address to clipboard" msgstr "" -#: guiminer.py:2094 +#: guiminer.py:2156 msgid "No OpenCL devices found." msgstr "" -#: guiminer.py:2097 +#: guiminer.py:2159 msgid "" "No OpenCL devices were found.\n" " If you only want to mine using CPU or CUDA, you can ignore this message.\n" @@ -710,6 +722,6 @@ msgid "" " SDK, or your GPU may not support OpenCL." msgstr "" -#: guiminer.py:2107 +#: guiminer.py:2169 msgid "Don't show this message again" msgstr "" From d71016105ea5b11f0eaa661169dd74e937ca6ef9 Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 10 Jun 2011 15:34:00 -0300 Subject: [PATCH 112/190] Attempt to fix issue with logo.ico missing. --- guiminer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index f9e11ea..2945c57 100644 --- a/guiminer.py +++ b/guiminer.py @@ -173,7 +173,7 @@ def get_opencl_devices(): def get_icon_bundle(): """Return the Bitcoin program icon bundle.""" - return wx.IconBundleFromFile("logo.ico", wx.BITMAP_TYPE_ICO) + return wx.IconBundleFromFile(os.path.join(get_module_path(), "logo.ico"), wx.BITMAP_TYPE_ICO) def get_taskbar_icon(): """Return the taskbar icon. From 2a29b32d01c6048dea1d1ea3d02c2275054622d2 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Tue, 14 Jun 2011 19:31:05 +0800 Subject: [PATCH 113/190] Update to the Chinese Simp translation --- guiminer_zh.po | 61 ++++++++++++++++++++++---------------------------- 1 file changed, 27 insertions(+), 34 deletions(-) diff --git a/guiminer_zh.po b/guiminer_zh.po index 39eebd3..4a3f4f8 100644 --- a/guiminer_zh.po +++ b/guiminer_zh.po @@ -160,7 +160,7 @@ msgstr "全部暂停" #: guiminer.py:377 msgid "Restore" -msgstr "回复" +msgstr "恢复" #: guiminer.py:378 msgid "Close" @@ -318,7 +318,9 @@ msgstr "" "Radeon HD 5xxx 系列可使用 -v -w128 获取最佳效果。\n" "其他显卡的参数参见论坛。" -#: guiminer.py:1148 guiminer.py:1242 guiminer.py:1263 +#: guiminer.py:1148 +#: guiminer.py:1242 +#: guiminer.py:1263 msgid "Auth token rejected by server." msgstr "身份认证 token 被服务器拒绝。" @@ -336,7 +338,8 @@ msgstr ", %s 未确认" msgid "Bad response from server." msgstr "服务器响应错误。" -#: guiminer.py:1246 guiminer.py:1267 +#: guiminer.py:1246 +#: guiminer.py:1267 msgid "Withdraw OK" msgstr "取款成功" @@ -364,7 +367,8 @@ msgstr "" "您的采矿器用户名 (不是账号用户名)。\n" "示例: Kiv.GPU" -#: guiminer.py:1447 guiminer.py:1467 +#: guiminer.py:1447 +#: guiminer.py:1467 msgid "Your miner password (not your account password)." msgstr "您的采矿器密码 (不是账号密码)。" @@ -398,41 +402,35 @@ msgstr "新建 OpenCL 采矿器(&N)..." #: guiminer.py:1522 msgid "Create a new OpenCL miner (default for ATI cards)" -msgstr "" +msgstr "创建一个新的 OpenCL 采矿器 (默认为 ATI 显卡)" #: guiminer.py:1523 -#, fuzzy msgid "Create a new Phoenix miner (for some ATI cards)" -msgstr "创建新的采矿器配置文件" +msgstr "创建一个新的 Phoenix 采矿器(部分 ATI 显卡)" #: guiminer.py:1523 -#, fuzzy msgid "New Phoenix miner..." -msgstr "新建其他采矿器(&O)..." +msgstr "新建 Phoenix 采矿器..." #: guiminer.py:1524 msgid "Create a new CUDA miner (for NVIDIA cards)" -msgstr "" +msgstr "创建一个新的 CUDA 采矿器 (NVIDIA 显卡)" #: guiminer.py:1524 -#, fuzzy msgid "New CUDA miner..." -msgstr "新建 OpenCL 采矿器(&N)..." +msgstr "新建 CUDA 采矿器..." #: guiminer.py:1525 -#, fuzzy msgid "Create a new Ufasoft miner (for CPUs)" -msgstr "创建新的采矿器配置文件" +msgstr "创建一个新的 Ufasoft 采矿器 (CPU)" #: guiminer.py:1525 -#, fuzzy msgid "New Ufasoft CPU miner..." -msgstr "新建其他采矿器(&O)..." +msgstr "新建 Ufasoft CPU 采矿器..." #: guiminer.py:1526 -#, fuzzy msgid "Create a new custom miner (requires external program)" -msgstr "创建 CPU 或 CUDA 采矿器 (需要外部程序)" +msgstr "创建一个新的自定义采矿器 (需要外部程序)" #: guiminer.py:1526 msgid "New &other miner..." @@ -511,17 +509,16 @@ msgid "&Solo utilities" msgstr "独自采矿(&S)" #: guiminer.py:1548 -#, fuzzy msgid "Start &minimized" -msgstr "开始采矿!" +msgstr "启动时最小化(&M)" #: guiminer.py:1548 msgid "Start the GUI minimized to the tray." -msgstr "" +msgstr "启动 GUI 时最小化到托盘区。" #: guiminer.py:1550 msgid "&Options" -msgstr "" +msgstr "选项(&O)" #: guiminer.py:1554 msgid "&Change language..." @@ -533,21 +530,19 @@ msgstr "语言" #: guiminer.py:1559 msgid "&Donate 99 cents..." -msgstr "" +msgstr "捐助 99 美分(&D)..." #: guiminer.py:1559 msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" -msgstr "" +msgstr "捐助 $0.99 美元的 Bitcoins 以支持 GUIMiner 的开发" #: guiminer.py:1560 -#, fuzzy msgid "&Donate" -msgstr "关于/捐助(&A)..." +msgstr "捐助(&D)" #: guiminer.py:1563 -#, fuzzy msgid "&About..." -msgstr "关于/捐助(&A)..." +msgstr "关于(&A)..." #: guiminer.py:1565 msgid "&Help" @@ -579,9 +574,8 @@ msgid "Untitled" msgstr "无标题" #: guiminer.py:1679 -#, fuzzy msgid "External miner (*.exe)|*.exe|(*.py)|*.py" -msgstr "外部采矿器 (*.exe)|*.exe" +msgstr "外部采矿器 (*.exe)|*.exe|(*.py)|*.py" #: guiminer.py:1681 msgid "Select external miner:" @@ -669,8 +663,7 @@ msgid "Launch failed" msgstr "启动失败" #: guiminer.py:1902 -msgid "" -"Client launched ok. You can start a miner now with the server set to 'solo'." +msgid "Client launched ok. You can start a miner now with the server set to 'solo'." msgstr "客户端启动成功。您现在可以启动服务器设为 'solo' 的采矿器。" #: guiminer.py:1903 @@ -748,8 +741,7 @@ msgstr "未找到 OpenCL 设备。" msgid "" "No OpenCL devices were found.\n" " If you only want to mine using CPU or CUDA, you can ignore this message.\n" -" If you want to mine on ATI graphics cards, you may need to install the ATI " -"Stream\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI Stream\n" " SDK, or your GPU may not support OpenCL." msgstr "" "未找到 OpenCL 设备。\n" @@ -760,3 +752,4 @@ msgstr "" #: guiminer.py:2107 msgid "Don't show this message again" msgstr "不要再次显示本信息" + From c3435b5f04783ce12763195b1b4025d0da4e5621 Mon Sep 17 00:00:00 2001 From: Kiv Date: Tue, 14 Jun 2011 22:42:39 -0300 Subject: [PATCH 114/190] Update Chinese translation (remove fuzzy translations). --- guiminer_zh.po | 81 ++------------------------------------------------ 1 file changed, 3 insertions(+), 78 deletions(-) diff --git a/guiminer_zh.po b/guiminer_zh.po index dd2f311..b4148d1 100644 --- a/guiminer_zh.po +++ b/guiminer_zh.po @@ -322,7 +322,6 @@ msgstr "" "Radeon HD 5xxx 系列可使用 -v -w128 获取最佳效果。\n" "其他显卡的参数参见论坛。" -<<<<<<< HEAD #: guiminer.py:1102 msgid "" "CPU cores used for mining.\n" @@ -330,11 +329,6 @@ msgid "" msgstr "" #: guiminer.py:1196 guiminer.py:1290 guiminer.py:1311 -======= -#: guiminer.py:1148 -#: guiminer.py:1242 -#: guiminer.py:1263 ->>>>>>> e1ad76cc4a7ea7608e855727902b1c7297dff3f0 msgid "Auth token rejected by server." msgstr "身份认证 token 被服务器拒绝。" @@ -352,12 +346,7 @@ msgstr ", %s 未确认" msgid "Bad response from server." msgstr "服务器响应错误。" -<<<<<<< HEAD #: guiminer.py:1294 guiminer.py:1315 -======= -#: guiminer.py:1246 -#: guiminer.py:1267 ->>>>>>> e1ad76cc4a7ea7608e855727902b1c7297dff3f0 msgid "Withdraw OK" msgstr "取款成功" @@ -385,12 +374,7 @@ msgstr "" "您的采矿器用户名 (不是账号用户名)。\n" "示例: Kiv.GPU" -<<<<<<< HEAD #: guiminer.py:1507 guiminer.py:1528 -======= -#: guiminer.py:1447 -#: guiminer.py:1467 ->>>>>>> e1ad76cc4a7ea7608e855727902b1c7297dff3f0 msgid "Your miner password (not your account password)." msgstr "您的采矿器密码 (不是账号密码)。" @@ -426,21 +410,11 @@ msgstr "新建 OpenCL 采矿器(&N)..." msgid "Create a new OpenCL miner (default for ATI cards)" msgstr "创建一个新的 OpenCL 采矿器 (默认为 ATI 显卡)" -<<<<<<< HEAD #: guiminer.py:1585 -#, fuzzy -======= -#: guiminer.py:1523 ->>>>>>> e1ad76cc4a7ea7608e855727902b1c7297dff3f0 msgid "Create a new Phoenix miner (for some ATI cards)" msgstr "创建一个新的 Phoenix 采矿器(部分 ATI 显卡)" -<<<<<<< HEAD #: guiminer.py:1585 -#, fuzzy -======= -#: guiminer.py:1523 ->>>>>>> e1ad76cc4a7ea7608e855727902b1c7297dff3f0 msgid "New Phoenix miner..." msgstr "新建 Phoenix 采矿器..." @@ -448,39 +422,19 @@ msgstr "新建 Phoenix 采矿器..." msgid "Create a new CUDA miner (for NVIDIA cards)" msgstr "创建一个新的 CUDA 采矿器 (NVIDIA 显卡)" -<<<<<<< HEAD #: guiminer.py:1586 -#, fuzzy -======= -#: guiminer.py:1524 ->>>>>>> e1ad76cc4a7ea7608e855727902b1c7297dff3f0 msgid "New CUDA miner..." msgstr "新建 CUDA 采矿器..." -<<<<<<< HEAD #: guiminer.py:1587 -#, fuzzy -======= -#: guiminer.py:1525 ->>>>>>> e1ad76cc4a7ea7608e855727902b1c7297dff3f0 msgid "Create a new Ufasoft miner (for CPUs)" msgstr "创建一个新的 Ufasoft 采矿器 (CPU)" -<<<<<<< HEAD #: guiminer.py:1587 -#, fuzzy -======= -#: guiminer.py:1525 ->>>>>>> e1ad76cc4a7ea7608e855727902b1c7297dff3f0 msgid "New Ufasoft CPU miner..." msgstr "新建 Ufasoft CPU 采矿器..." -<<<<<<< HEAD #: guiminer.py:1588 -#, fuzzy -======= -#: guiminer.py:1526 ->>>>>>> e1ad76cc4a7ea7608e855727902b1c7297dff3f0 msgid "Create a new custom miner (requires external program)" msgstr "创建一个新的自定义采矿器 (需要外部程序)" @@ -489,9 +443,8 @@ msgid "New &other miner..." msgstr "新建其他采矿器(&O)..." #: guiminer.py:1589 -#, fuzzy msgid "&New miner" -msgstr "新建采矿器" +msgstr "" #: guiminer.py:1590 msgid "&Save settings" @@ -565,12 +518,7 @@ msgstr "将官方 Bitcoin 客户端作为独自采矿的服务器启动" msgid "&Solo utilities" msgstr "独自采矿(&S)" -<<<<<<< HEAD #: guiminer.py:1610 -#, fuzzy -======= -#: guiminer.py:1548 ->>>>>>> e1ad76cc4a7ea7608e855727902b1c7297dff3f0 msgid "Start &minimized" msgstr "启动时最小化(&M)" @@ -598,21 +546,11 @@ msgstr "捐助 99 美分(&D)..." msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" msgstr "捐助 $0.99 美元的 Bitcoins 以支持 GUIMiner 的开发" -<<<<<<< HEAD #: guiminer.py:1622 -#, fuzzy -======= -#: guiminer.py:1560 ->>>>>>> e1ad76cc4a7ea7608e855727902b1c7297dff3f0 msgid "&Donate" msgstr "捐助(&D)" -<<<<<<< HEAD #: guiminer.py:1625 -#, fuzzy -======= -#: guiminer.py:1563 ->>>>>>> e1ad76cc4a7ea7608e855727902b1c7297dff3f0 msgid "&About..." msgstr "关于(&A)..." @@ -645,12 +583,7 @@ msgstr "新建采矿器" msgid "Untitled" msgstr "无标题" -<<<<<<< HEAD #: guiminer.py:1741 -#, fuzzy -======= -#: guiminer.py:1679 ->>>>>>> e1ad76cc4a7ea7608e855727902b1c7297dff3f0 msgid "External miner (*.exe)|*.exe|(*.py)|*.py" msgstr "外部采矿器 (*.exe)|*.exe|(*.py)|*.py" @@ -739,18 +672,12 @@ msgstr "无法在 %s 找到 Bitcoin。您的路径设置是否正确?" msgid "Launch failed" msgstr "启动失败" -<<<<<<< HEAD #: guiminer.py:1964 msgid "" "The Bitcoin client will now launch in server mode.\n" "Once it connects to the network and downloads the block chain, you can start " "a miner in 'solo' mode." msgstr "" -======= -#: guiminer.py:1902 -msgid "Client launched ok. You can start a miner now with the server set to 'solo'." -msgstr "客户端启动成功。您现在可以启动服务器设为 'solo' 的采矿器。" ->>>>>>> e1ad76cc4a7ea7608e855727902b1c7297dff3f0 #: guiminer.py:1965 msgid "Launched ok." @@ -827,7 +754,8 @@ msgstr "未找到 OpenCL 设备。" msgid "" "No OpenCL devices were found.\n" " If you only want to mine using CPU or CUDA, you can ignore this message.\n" -" If you want to mine on ATI graphics cards, you may need to install the ATI Stream\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI " +"Stream\n" " SDK, or your GPU may not support OpenCL." msgstr "" "未找到 OpenCL 设备。\n" @@ -839,10 +767,7 @@ msgstr "" msgid "Don't show this message again" msgstr "不要再次显示本信息" -<<<<<<< HEAD #~ msgid "" #~ "Client launched ok. You can start a miner now with the server set to " #~ "'solo'." #~ msgstr "客户端启动成功。您现在可以启动服务器设为 'solo' 的采矿器。" -======= ->>>>>>> e1ad76cc4a7ea7608e855727902b1c7297dff3f0 From 14ea98fc1eb9514eab27f8b0a5faa691eab73b01 Mon Sep 17 00:00:00 2001 From: Kiv Date: Tue, 14 Jun 2011 22:54:16 -0300 Subject: [PATCH 115/190] Tidy up translations. --- guiminer_de.po | 397 ++++++++++++++++++++++++++------------------- guiminer_es.po | 371 ++++++++++++++++++++---------------------- guiminer_fr.po | 339 ++++++++++++++++++++------------------- guiminer_hu.po | 339 ++++++++++++++++++++------------------- guiminer_it.po | 427 +++++++++++++++++++++++++++---------------------- guiminer_ru.po | 338 +++++++++++++++++++------------------- guiminer_zh.po | 336 +++++++++++++++++++------------------- messages.pot | 324 ++++++++++++++++++------------------- 8 files changed, 1490 insertions(+), 1381 deletions(-) diff --git a/guiminer_de.po b/guiminer_de.po index be6d110..070d77c 100644 --- a/guiminer_de.po +++ b/guiminer_de.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-20 23:09-0300\n" +"POT-Creation-Date: 2011-06-14 22:43-0300\n" "PO-Revision-Date: 2011-05-20 00:00-0000\n" "Last-Translator: Dataminer \n" "Language-Team: Deutsch\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: guiminer.py:75 +#: guiminer.py:90 #, python-format msgid "" "GUIMiner\n" @@ -57,244 +57,249 @@ msgstr "" "1ErifSXRFPdzcPLEajnndt6VWqVcqspDvQ\n" "\n" -#: guiminer.py:96 +#: guiminer.py:111 msgid "Not started" msgstr "Nicht gestartet" -#: guiminer.py:97 +#: guiminer.py:112 msgid "Starting..." msgstr "Starte..." -#: guiminer.py:98 +#: guiminer.py:113 msgid "Stopped" msgstr "Angehalten" -#: guiminer.py:99 +#: guiminer.py:114 msgid "Paused" msgstr "Pausiert" -#: guiminer.py:100 +#: guiminer.py:115 msgid "Start mining!" msgstr "Start!" -#: guiminer.py:101 +#: guiminer.py:116 msgid "Stop mining" msgstr "Stopp" -#: guiminer.py:102 +#: guiminer.py:117 msgid "Refresh balance" msgstr "Kontostand" -#: guiminer.py:103 +#: guiminer.py:118 msgid "Connection error" msgstr "Verbindungsfehler" -#: guiminer.py:104 +#: guiminer.py:119 msgid "Username:" msgstr "Benutzer:" -#: guiminer.py:105 +#: guiminer.py:120 msgid "Password:" msgstr "Passwort:" -#: guiminer.py:106 +#: guiminer.py:121 msgid "Quit this program" msgstr "Beenden" -#: guiminer.py:107 +#: guiminer.py:122 msgid "Show about dialog" msgstr "Über..." -#: guiminer.py:182 +#: guiminer.py:203 #, python-format msgid "%.1f Ghash/s" msgstr "%.1f Ghash/s" -#: guiminer.py:184 +#: guiminer.py:205 #, python-format msgid "%.1f Mhash/s" msgstr "%.1f Mhash/s" -#: guiminer.py:186 +#: guiminer.py:207 msgid "Connecting..." msgstr "Verbinde..." -#: guiminer.py:188 +#: guiminer.py:209 #, python-format msgid "%d khash/s" msgstr "%d khash/s" -#: guiminer.py:212 +#: guiminer.py:233 #, python-format msgid "Requesting balance: %(request)s" msgstr "Fordere Kontostand: %(request)s" -#: guiminer.py:216 +#: guiminer.py:237 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "Server antwortet: %(status)s, %(data)s" -#: guiminer.py:267 +#: guiminer.py:304 msgid "Miner" msgstr "Miner" -#: guiminer.py:268 +#: guiminer.py:305 msgid "Speed" msgstr "Tempo" -#: guiminer.py:269 +#: guiminer.py:306 msgid "Accepted" msgstr "Akzeptiert" -#: guiminer.py:270 +#: guiminer.py:307 msgid "Stale" msgstr "Abgelaufen" -#: guiminer.py:271 +#: guiminer.py:308 msgid "Start/Stop" msgstr "Start/Stopp" -#: guiminer.py:272 +#: guiminer.py:309 msgid "Autostart" msgstr "Autostart" -#: guiminer.py:356 +#: guiminer.py:393 msgid "Pause all" msgstr "Alle anhalten" -#: guiminer.py:358 +#: guiminer.py:395 msgid "Restore" msgstr "Wiederherstellen" -#: guiminer.py:359 +#: guiminer.py:396 msgid "Close" msgstr "Schließen" -#: guiminer.py:413 +#: guiminer.py:452 #, python-format msgid "Listener for \"%s\" started" msgstr "Miner \"%s\" gestartet" -#: guiminer.py:428 +#: guiminer.py:467 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "Miner \"%(name)s\": %(line)s" -#: guiminer.py:431 +#: guiminer.py:470 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "Miner \"%s\" fährt herunter" -#: guiminer.py:462 +#: guiminer.py:516 msgid "Server:" msgstr "Server:" -#: guiminer.py:467 +#: guiminer.py:521 msgid "Website:" msgstr "Website:" -#: guiminer.py:469 +#: guiminer.py:523 msgid "Ext. Path:" msgstr "Ext. Pfad:" -#: guiminer.py:471 +#: guiminer.py:525 msgid "Host:" msgstr "Host:" -#: guiminer.py:473 +#: guiminer.py:527 msgid "Port:" msgstr "Port:" -#: guiminer.py:479 +#: guiminer.py:533 msgid "Device:" msgstr "Gerät:" -#: guiminer.py:480 +#: guiminer.py:534 msgid "No OpenCL devices" msgstr "Kein OpenCL-Gerät" -#: guiminer.py:481 +#: guiminer.py:535 msgid "Extra flags:" msgstr "Optionen:" -#: guiminer.py:484 +#: guiminer.py:538 +msgid "CPU Affinity:" +msgstr "" + +#: guiminer.py:541 msgid "Balance:" msgstr "Kontostand:" -#: guiminer.py:488 +#: guiminer.py:545 msgid "Withdraw" msgstr "Auszahlen" -#: guiminer.py:603 +#: guiminer.py:705 msgid "Default" msgstr "Standard" -#: guiminer.py:650 +#: guiminer.py:756 msgid "Start" msgstr "Start" -#: guiminer.py:650 +#: guiminer.py:756 msgid "Stop" msgstr "Stopp" -#: guiminer.py:666 +#: guiminer.py:772 msgid "Connection problems" msgstr "Verbindungfehler" -#: guiminer.py:801 +#: guiminer.py:931 msgid "Running command: " msgstr "Befehl: " -#: guiminer.py:853 +#: guiminer.py:990 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "Schwierigkeit 1 Hashes: %(nhashes)d %(update_time)s" -#: guiminer.py:857 +#: guiminer.py:994 #, python-format msgid "Blocks: %d, " msgstr "Blöcke: %d, " -#: guiminer.py:860 +#: guiminer.py:997 #, python-format msgid "Shares: %d accepted" msgstr "Shares: %d akzepiert" -#: guiminer.py:862 +#: guiminer.py:999 #, python-format msgid ", %d stale/invalid" msgstr ", %d abgelaufen/ungültig" -#: guiminer.py:884 +#: guiminer.py:1021 #, python-format msgid "- last at %s" msgstr "- letzte: %s" -#: guiminer.py:957 +#: guiminer.py:1094 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." msgstr "" -"Server zum Verbinden. Server haben unterschiedliche Konditionen und Features.\n" +"Server zum Verbinden. Server haben unterschiedliche Konditionen und " +"Features.\n" "Informiere dich auf der Anbieter-Website." -#: guiminer.py:958 +#: guiminer.py:1095 msgid "Website of the currently selected server. Click to visit." msgstr "Website des derzeit ausgewählen Servers. Klicken um Seite aufzurufen." -#: guiminer.py:959 +#: guiminer.py:1096 msgid "Available OpenCL devices on your system." msgstr "Erkannte OpenCL-Geräte." -#: guiminer.py:960 +#: guiminer.py:1097 msgid "Host address, without http:// prefix." msgstr "Host-Adresse, ohne http:// Angabe." -#: guiminer.py:961 +#: guiminer.py:1098 msgid "Server port. This is usually 8332." msgstr "Server-Port. Standard ist 8332." -#: guiminer.py:962 +#: guiminer.py:1099 msgid "" "The miner's username.\n" "May be different than your account username.\n" @@ -304,7 +309,7 @@ msgstr "" "Kann sich von deinem Accountnamen unterscheiden.\n" "Beispiel: BitcoinsWallet.GPU" -#: guiminer.py:963 +#: guiminer.py:1100 msgid "" "The miner's password.\n" "May be different than your account password." @@ -312,7 +317,7 @@ msgstr "" "Dein Passwort.\n" "Kann sich von deinem Accountpasswort unterscheiden.\n" -#: guiminer.py:964 +#: guiminer.py:1101 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" @@ -322,38 +327,44 @@ msgstr "" "Optimal für Radeon HD 5xxx: -v -w128.\n" "Einstellungen für andere Karten findest du unter http://forum.bitcoin.org/." -#: guiminer.py:1058 guiminer.py:1148 guiminer.py:1169 +#: guiminer.py:1103 +msgid "" +"CPU cores used for mining.\n" +"Unchecking some cores can reduce high CPU usage in some systems." +msgstr "" + +#: guiminer.py:1197 guiminer.py:1291 guiminer.py:1312 msgid "Auth token rejected by server." msgstr "Auth Token wurde vom Server abgelehnt." -#: guiminer.py:1076 +#: guiminer.py:1215 #, python-format msgid "%s confirmed" msgstr "%s Bestätigt" -#: guiminer.py:1078 +#: guiminer.py:1217 #, python-format msgid ", %s unconfirmed" msgstr ", %s Unbestätigt" -#: guiminer.py:1080 +#: guiminer.py:1219 msgid "Bad response from server." msgstr "Anfrage vom Server abgelehnt." -#: guiminer.py:1152 guiminer.py:1173 +#: guiminer.py:1295 guiminer.py:1316 msgid "Withdraw OK" msgstr "Auszahlung OK" -#: guiminer.py:1332 +#: guiminer.py:1486 msgid "No registration is required - just enter an address and press Start." msgstr "" "Keine Registrierung nötig - Einfach Adresse angeben und Start klicken." -#: guiminer.py:1334 +#: guiminer.py:1488 msgid "Address:" msgstr "Adresse:" -#: guiminer.py:1336 +#: guiminer.py:1490 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" @@ -361,7 +372,7 @@ msgstr "" "Deine Bitcoins Empfangsadresse.\n" "Beispiel: 1ErifSXRFPdzcPLEajnndt6VWqVcqspDvQ" -#: guiminer.py:1351 +#: guiminer.py:1506 msgid "" "Your miner username (not your account username).\n" "Example: Kiv.GPU" @@ -369,11 +380,11 @@ msgstr "" "Dein Miner-Benutzername (NICHT Account-Benutzername).\n" "Beispiel: BitcoinsWallet.GPU" -#: guiminer.py:1353 guiminer.py:1373 +#: guiminer.py:1508 guiminer.py:1529 msgid "Your miner password (not your account password)." msgstr "Dein Miner-Passwort (NICHT dein Account-Paswort).\n" -#: guiminer.py:1371 +#: guiminer.py:1527 msgid "" "Your miner username. \n" "Example: kiv123@kiv123" @@ -381,183 +392,234 @@ msgstr "" "Dein Benutzername. \n" "Beispiel: kiv123@kiv123" -#: guiminer.py:1387 +#: guiminer.py:1544 msgid "The e-mail address you registered with." msgstr "Deine E-Mailadresse mit der du dich registriert hast." -#: guiminer.py:1388 +#: guiminer.py:1545 msgid "Email:" msgstr "E-Mail:" -#: guiminer.py:1403 +#: guiminer.py:1560 msgid "&Rename..." msgstr "&Umbenennen..." -#: guiminer.py:1403 +#: guiminer.py:1560 msgid "Rename this miner" msgstr "Diesen Miner umbenennen..." -#: guiminer.py:1427 +#: guiminer.py:1585 msgid "&New OpenCL miner..." msgstr "&Neu (Standard OpenCL Miner)..." -#: guiminer.py:1427 -msgid "Create a new miner profile" -msgstr "Neues Miner-Profil erstellen" +#: guiminer.py:1585 +msgid "Create a new OpenCL miner (default for ATI cards)" +msgstr "" + +#: guiminer.py:1586 +msgid "Create a new Phoenix miner (for some ATI cards)" +msgstr "" + +#: guiminer.py:1586 +msgid "New Phoenix miner..." +msgstr "" + +#: guiminer.py:1587 +msgid "Create a new CUDA miner (for NVIDIA cards)" +msgstr "" + +#: guiminer.py:1587 +msgid "New CUDA miner..." +msgstr "" + +#: guiminer.py:1588 +msgid "Create a new Ufasoft miner (for CPUs)" +msgstr "" + +#: guiminer.py:1588 +msgid "New Ufasoft CPU miner..." +msgstr "" -#: guiminer.py:1428 -msgid "Create a CPU or CUDA miner (requires external program)" -msgstr "Erstelle eine CPU- oder CUDA-Miner (Benötigt externes Programm)" +#: guiminer.py:1589 +msgid "Create a new custom miner (requires external program)" +msgstr "" -#: guiminer.py:1428 +#: guiminer.py:1589 msgid "New &other miner..." msgstr "Neu (&Anderer miner)..." -#: guiminer.py:1429 +#: guiminer.py:1590 +msgid "&New miner" +msgstr "" + +#: guiminer.py:1591 msgid "&Save settings" msgstr "Einstellungen &speichern" -#: guiminer.py:1429 +#: guiminer.py:1591 msgid "Save your settings" msgstr "Deine Einstellungen speichern" -#: guiminer.py:1430 +#: guiminer.py:1592 msgid "&Load settings" msgstr "Einstallungen &laden" -#: guiminer.py:1430 +#: guiminer.py:1592 msgid "Load stored settings" msgstr "Gespeicherte Einstellungen laden" -#: guiminer.py:1431 +#: guiminer.py:1593 msgid "Quit" msgstr "Beenden" -#: guiminer.py:1432 +#: guiminer.py:1594 msgid "&File" msgstr "&Datei" -#: guiminer.py:1436 +#: guiminer.py:1598 msgid "Show summary" msgstr "Übersicht anzeigen" -#: guiminer.py:1436 +#: guiminer.py:1598 msgid "Show summary of all miners" msgstr "Übersicht aller Miner anzeigen" -#: guiminer.py:1437 +#: guiminer.py:1599 msgid "Show console" msgstr "Konsole anzeigen" -#: guiminer.py:1437 +#: guiminer.py:1599 msgid "Show console logs" msgstr "Konsolen-Logs anzeigen" -#: guiminer.py:1438 +#: guiminer.py:1600 msgid "&View" msgstr "&Ansicht" -#: guiminer.py:1442 +#: guiminer.py:1604 msgid "&Create solo password..." msgstr "&Erstelle Solo-Passwort..." -#: guiminer.py:1442 +#: guiminer.py:1604 msgid "Configure a user/pass for solo mining" msgstr "Erstellt einen Solo-Benutzernamen und -Passwort" -#: guiminer.py:1443 +#: guiminer.py:1605 msgid "&Set Bitcoin client path..." msgstr "&Pfad zu bitcoin.exe festlegen..." -#: guiminer.py:1443 +#: guiminer.py:1605 msgid "Set the location of the official Bitcoin client" msgstr "Dateipfad zum offiziellen Bitcoin Client festlegen." -#: guiminer.py:1444 +#: guiminer.py:1606 msgid "&Launch Bitcoin client as server" msgstr "Bitcoin-Client als &Server starten" -#: guiminer.py:1444 +#: guiminer.py:1606 msgid "Launch the official Bitcoin client as a server for solo mining" -msgstr "" -"Starte den offiziellen Bitcoin Client als Server um 'solo' zu minen" +msgstr "Starte den offiziellen Bitcoin Client als Server um 'solo' zu minen" -#: guiminer.py:1445 +#: guiminer.py:1607 msgid "&Solo utilities" msgstr "&Solo-Tools" -#: guiminer.py:1449 +#: guiminer.py:1611 +msgid "Start &minimized" +msgstr "" + +#: guiminer.py:1611 +msgid "Start the GUI minimized to the tray." +msgstr "" + +#: guiminer.py:1613 +msgid "&Options" +msgstr "" + +#: guiminer.py:1617 msgid "&Change language..." msgstr "&Sprache ändern..." -#: guiminer.py:1450 +#: guiminer.py:1618 msgid "Language" msgstr "Sprache" -#: guiminer.py:1453 -msgid "&About/Donate..." -msgstr "&Über/Spende..." +#: guiminer.py:1622 +msgid "&Donate 99 cents..." +msgstr "" + +#: guiminer.py:1622 +msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" +msgstr "" + +#: guiminer.py:1623 +msgid "&Donate" +msgstr "" -#: guiminer.py:1455 +#: guiminer.py:1626 +msgid "&About..." +msgstr "" + +#: guiminer.py:1628 msgid "&Help" msgstr "&Hilfe" -#: guiminer.py:1467 +#: guiminer.py:1640 msgid "Failed to load taskbar icon; continuing." msgstr "Taskbar-Icon konnte nicht geladen werden; Fahre fort." -#: guiminer.py:1476 +#: guiminer.py:1649 msgid "OpenCL not found - can't add a OpenCL miner" msgstr "OpenCL nicht gefunden. OpenCL kann nicht hinzugefügt werden" -#: guiminer.py:1506 +#: guiminer.py:1686 #, python-format msgid "GUIMiner - v%s" msgstr "GUIMiner - v%s" -#: guiminer.py:1548 +#: guiminer.py:1728 msgid "Name this miner:" msgstr "Name für diesen Miner:" -#: guiminer.py:1548 +#: guiminer.py:1728 msgid "New miner" msgstr "Neuer Miner" -#: guiminer.py:1551 +#: guiminer.py:1731 msgid "Untitled" msgstr "Unbenannt" -#: guiminer.py:1562 -msgid "External miner (*.exe)|*.exe" -msgstr "Externer Miner (*.exe)|*.exe" +#: guiminer.py:1742 +msgid "External miner (*.exe)|*.exe|(*.py)|*.py" +msgstr "" -#: guiminer.py:1564 +#: guiminer.py:1744 msgid "Select external miner:" msgstr "Wähle einen externen Miner:" -#: guiminer.py:1574 +#: guiminer.py:1754 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" msgstr "" "Nicht unterstützter Miner %(filename)s. Unterstützt werden: %(supported)" -#: guiminer.py:1576 +#: guiminer.py:1756 msgid "Miner not supported" msgstr "Miner wird nicht unterstützt" -#: guiminer.py:1602 +#: guiminer.py:1797 msgid "Do you want to save changes?" msgstr "Änderungen speichern?" -#: guiminer.py:1602 +#: guiminer.py:1797 msgid "Save" msgstr "Speichern" -#: guiminer.py:1631 +#: guiminer.py:1827 msgid "Saving: " msgstr "Speichere: " -#: guiminer.py:1637 +#: guiminer.py:1833 #, python-format msgid "" "Couldn't write save file %s.\n" @@ -566,135 +628,135 @@ msgstr "" "%s konnte nicht gespeichert werden.\n" "Bitte Schreibrechte überprüfen!" -#: guiminer.py:1638 +#: guiminer.py:1834 msgid "Save unsuccessful" msgstr "Speichern fehlgeschlagen" -#: guiminer.py:1640 +#: guiminer.py:1836 #, python-format msgid "Profiles saved OK to %s." msgstr "Profile erfolgreich gespeichert in %s." -#: guiminer.py:1641 +#: guiminer.py:1837 msgid "Save successful" msgstr "Sicherung erfolgreich" -#: guiminer.py:1653 +#: guiminer.py:1849 #, python-format msgid "Loaded: %s" msgstr "Geladen: %s" -#: guiminer.py:1667 +#: guiminer.py:1863 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "Das Laden von Profilen stoppt alle aktiven Miner. Weiter?" -#: guiminer.py:1668 +#: guiminer.py:1864 msgid "Load profile" msgstr "Profil laden..." -#: guiminer.py:1697 +#: guiminer.py:1893 msgid "Select path to Bitcoin.exe" msgstr "Pfad zu Bitcoin.exe wählen" -#: guiminer.py:1709 +#: guiminer.py:1905 msgid "About" msgstr "Über" -#: guiminer.py:1735 +#: guiminer.py:1931 msgid "Closing this miner will stop it. Continue?" msgstr "Schließen stoppt diesen Miner. Weiter?" -#: guiminer.py:1736 +#: guiminer.py:1932 msgid "Close miner" msgstr "Miner schließen" -#: guiminer.py:1765 +#: guiminer.py:1961 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" msgstr "Bitcoin konnte nicht gefunden werden. Pfad korrekt?" -#: guiminer.py:1766 +#: guiminer.py:1962 msgid "Launch failed" msgstr "Start fehlgeschlagen" -#: guiminer.py:1769 +#: guiminer.py:1965 msgid "" -"Client launched ok. You can start a miner now with the server set to 'solo'." +"The Bitcoin client will now launch in server mode.\n" +"Once it connects to the network and downloads the block chain, you can start " +"a miner in 'solo' mode." msgstr "" -"Client wurde gestartet. Als Server nun 'solo' wählen und Miner starten.\n" -#: guiminer.py:1770 +#: guiminer.py:1966 msgid "Launched ok." msgstr "Start erfolgreich." -#: guiminer.py:1785 +#: guiminer.py:1981 #, python-format msgid "%s already exists. Overwrite?" -msgstr "%s \n existiert bereits. Überschreiben?" +msgstr "" +"%s \n" +" existiert bereits. Überschreiben?" -#: guiminer.py:1786 +#: guiminer.py:1982 msgid "bitcoin.conf already exists." msgstr "bitcoin.conf existiert bereits." -#: guiminer.py:1791 +#: guiminer.py:1987 msgid "Enter password" msgstr "PAsswort eingeben" -#: guiminer.py:1801 +#: guiminer.py:1997 msgid "Success" msgstr "Erfolgreich" -#: guiminer.py:1801 +#: guiminer.py:1997 msgid "Wrote bitcoin config ok." msgstr "bitcoin.conf wurde erfolgreich geschrieben." -#: guiminer.py:1812 +#: guiminer.py:2008 msgid "Console" msgstr "Konsole" -#: guiminer.py:1824 +#: guiminer.py:2020 msgid "Summary" msgstr "Übersicht" -#: guiminer.py:1837 +#: guiminer.py:2033 msgid "Rename miner" msgstr "Miner umbenennen" -#: guiminer.py:1837 +#: guiminer.py:2033 msgid "Rename to:" msgstr "Umbenennen zu:" -#: guiminer.py:1842 +#: guiminer.py:2038 msgid "Change language" msgstr "Sprache wechseln" -#: guiminer.py:1861 +#: guiminer.py:2058 msgid "Choose language (requires restart to take full effect)" msgstr "Sprache wählen (Neustart erforderlich)" -#: guiminer.py:1906 +#: guiminer.py:2103 msgid "" -"Click the link below to log in to the pool and get a special token. \n" +"Click the link below to log in to the pool and get a special token.\n" "This token lets you securely check your balance.\n" "To remember this token for the future, save your miner settings." msgstr "" -"Klicke auf den untenstehenden Link um dich anzumelden und deinen Token abzurufen.\n" -"Dieser Token dient dazu deinen Kontostand sicher abzurufen.\n" -"Anschließend Einstellungen speichern um den Token zu sichern." -#: guiminer.py:1915 +#: guiminer.py:2112 msgid "(Paste token here)" msgstr "(Token einfügen)" -#: guiminer.py:1941 +#: guiminer.py:2138 msgid "Copy address to clipboard" msgstr "Adresse in Zwischenablage kopieren" -#: guiminer.py:1960 +#: guiminer.py:2157 msgid "No OpenCL devices found." msgstr "Kein OpenCL Gerät vorhanden." -#: guiminer.py:1963 +#: guiminer.py:2160 msgid "" "No OpenCL devices were found.\n" " If you only want to mine using CPU or CUDA, you can ignore this message.\n" @@ -704,13 +766,10 @@ msgid "" msgstr "" "Keine OpenCL-Geräte vorhanden.\n" "Wenn du nur durch CPU oder CUDA minen möchtest ignoriere diese Nachricht.\n" -"Wenn du eine ATI-Grafikkarte verwenden möchtest solltest du u.U. " -"die ATI Stream SDK installieren\n" +"Wenn du eine ATI-Grafikkarte verwenden möchtest solltest du u.U. die ATI " +"Stream SDK installieren\n" "oder deine GPU wird möglicherweise kein OpenCL unterstützen.\n" -#: guiminer.py:1973 +#: guiminer.py:2170 msgid "Don't show this message again" msgstr "Nachrichtnicht wieder anzeigen" - -#~ msgid "%s mining!" -#~ msgstr "%s arbeitet!" diff --git a/guiminer_es.po b/guiminer_es.po index 422bb9c..fe7c643 100644 --- a/guiminer_es.po +++ b/guiminer_es.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 15:18-0300\n" +"POT-Creation-Date: 2011-06-14 22:51-0300\n" "PO-Revision-Date: 2011-05-20 00:00-0000\n" "Last-Translator: Bitcoins Wallet \n" "Language-Team: Español\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: guiminer.py:89 +#: guiminer.py:90 #, python-format msgid "" "GUIMiner\n" @@ -47,224 +47,224 @@ msgstr "" "Incluso una sóla Bitcoin se aprecia y ayuda a motivar\n" "a los desarrolladores en el trabajo futuro.\n" -#: guiminer.py:110 +#: guiminer.py:111 msgid "Not started" msgstr "No iniciado" -#: guiminer.py:111 +#: guiminer.py:112 msgid "Starting..." msgstr "Empezando..." -#: guiminer.py:112 +#: guiminer.py:113 msgid "Stopped" msgstr "Detenido" -#: guiminer.py:113 +#: guiminer.py:114 msgid "Paused" msgstr "Pausado" -#: guiminer.py:114 +#: guiminer.py:115 msgid "Start mining!" msgstr "Iniciar la minería" -#: guiminer.py:115 +#: guiminer.py:116 msgid "Stop mining" msgstr "Parar la minería" -#: guiminer.py:116 +#: guiminer.py:117 msgid "Refresh balance" msgstr "Actualizar saldo" -#: guiminer.py:117 +#: guiminer.py:118 msgid "Connection error" msgstr "Error de conexión" -#: guiminer.py:118 +#: guiminer.py:119 msgid "Username:" msgstr "Usuario:" -#: guiminer.py:119 +#: guiminer.py:120 msgid "Password:" msgstr "Contraseña:" -#: guiminer.py:120 +#: guiminer.py:121 msgid "Quit this program" msgstr "Salir del programa" -#: guiminer.py:121 +#: guiminer.py:122 msgid "Show about dialog" msgstr "Acerca de..." -#: guiminer.py:202 +#: guiminer.py:203 #, python-format msgid "%.1f Ghash/s" msgstr "%.1f Ghash/s" -#: guiminer.py:204 +#: guiminer.py:205 #, python-format msgid "%.1f Mhash/s" msgstr "%.1f Mhash/s" -#: guiminer.py:206 +#: guiminer.py:207 msgid "Connecting..." msgstr "Conectando..." -#: guiminer.py:208 +#: guiminer.py:209 #, python-format msgid "%d khash/s" msgstr "%d khash/s" -#: guiminer.py:232 +#: guiminer.py:233 #, python-format msgid "Requesting balance: %(request)s" msgstr "Solicitando saldo: %(request)s" -#: guiminer.py:236 +#: guiminer.py:237 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "Contestación del Servidor: %(status)s, %(data)s" -#: guiminer.py:303 +#: guiminer.py:304 msgid "Miner" msgstr "Minero" -#: guiminer.py:304 +#: guiminer.py:305 msgid "Speed" msgstr "Velocidad" -#: guiminer.py:305 +#: guiminer.py:306 msgid "Accepted" msgstr "Aceptado" -#: guiminer.py:306 +#: guiminer.py:307 msgid "Stale" msgstr "Caducado" -#: guiminer.py:307 +#: guiminer.py:308 msgid "Start/Stop" msgstr "Iniciar/Parar" -#: guiminer.py:308 +#: guiminer.py:309 msgid "Autostart" msgstr "Inicio auto." -#: guiminer.py:392 +#: guiminer.py:393 msgid "Pause all" msgstr "Pausar todos" -#: guiminer.py:394 +#: guiminer.py:395 msgid "Restore" msgstr "Restaurar" -#: guiminer.py:395 +#: guiminer.py:396 msgid "Close" msgstr "Cerrar" -#: guiminer.py:451 +#: guiminer.py:452 #, python-format msgid "Listener for \"%s\" started" msgstr "Minero \"%s\" iniciado" -#: guiminer.py:466 +#: guiminer.py:467 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "Minero \"%(name)s\": %(line)s" -#: guiminer.py:469 +#: guiminer.py:470 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "Minero \"%s\" cerrando" -#: guiminer.py:515 +#: guiminer.py:516 msgid "Server:" msgstr "Grupo:" -#: guiminer.py:520 +#: guiminer.py:521 msgid "Website:" msgstr "Sitio web:" -#: guiminer.py:522 +#: guiminer.py:523 msgid "Ext. Path:" msgstr "Ruta externa" -#: guiminer.py:524 +#: guiminer.py:525 msgid "Host:" msgstr "Servidor:" -#: guiminer.py:526 +#: guiminer.py:527 msgid "Port:" msgstr "Puerto:" -#: guiminer.py:532 +#: guiminer.py:533 msgid "Device:" msgstr "Dispositivo:" -#: guiminer.py:533 +#: guiminer.py:534 msgid "No OpenCL devices" msgstr "No hay dispositivos OpenCL" -#: guiminer.py:534 +#: guiminer.py:535 msgid "Extra flags:" msgstr "Opciones extra:" -#: guiminer.py:537 +#: guiminer.py:538 msgid "CPU Affinity:" msgstr "" -#: guiminer.py:540 +#: guiminer.py:541 msgid "Balance:" msgstr "Saldo:" -#: guiminer.py:544 +#: guiminer.py:545 msgid "Withdraw" msgstr "Retirar saldo" -#: guiminer.py:704 +#: guiminer.py:705 msgid "Default" msgstr "Por defecto" -#: guiminer.py:755 +#: guiminer.py:756 msgid "Start" msgstr "Iniciar" -#: guiminer.py:755 +#: guiminer.py:756 msgid "Stop" msgstr "Parar" -#: guiminer.py:771 +#: guiminer.py:772 msgid "Connection problems" msgstr "Problemas de conexión" -#: guiminer.py:930 +#: guiminer.py:931 msgid "Running command: " msgstr "Ejecutando comando: " -#: guiminer.py:989 +#: guiminer.py:990 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "Dificultad 1 hashes: %(nhashes)d %(update_time)s" -#: guiminer.py:993 +#: guiminer.py:994 #, python-format msgid "Blocks: %d, " msgstr "Bloques: %d, " -#: guiminer.py:996 +#: guiminer.py:997 #, python-format msgid "Shares: %d accepted" msgstr "Tareas: %d aceptadas" -#: guiminer.py:998 +#: guiminer.py:999 #, python-format msgid ", %d stale/invalid" msgstr ", %d caducada/inválida" -#: guiminer.py:1020 +#: guiminer.py:1021 #, python-format msgid "- last at %s" msgstr "- última: %s" -#: guiminer.py:1093 +#: guiminer.py:1094 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." @@ -272,23 +272,23 @@ msgstr "" "Grupo donde conectar. Cada grupo tiene diferentes tasas y características.\n" "Ver sus páginas web para obtener toda la información." -#: guiminer.py:1094 +#: guiminer.py:1095 msgid "Website of the currently selected server. Click to visit." msgstr "Página web del grupo seleccionado actualmente. Clic para visitar" -#: guiminer.py:1095 +#: guiminer.py:1096 msgid "Available OpenCL devices on your system." msgstr "Dispositivos OpenCL disponibles en tu sistema" -#: guiminer.py:1096 +#: guiminer.py:1097 msgid "Host address, without http:// prefix." msgstr "Dirección del Servidor, sin el prefijo http://." -#: guiminer.py:1097 +#: guiminer.py:1098 msgid "Server port. This is usually 8332." msgstr "Puerto del servidor. Generalmente 8332." -#: guiminer.py:1098 +#: guiminer.py:1099 msgid "" "The miner's username.\n" "May be different than your account username.\n" @@ -298,7 +298,7 @@ msgstr "" "Puede ser diferente al usuario de la cuenta.\n" "Ejemplo: BitcoinsWallet.GPU" -#: guiminer.py:1099 +#: guiminer.py:1100 msgid "" "The miner's password.\n" "May be different than your account password." @@ -306,7 +306,7 @@ msgstr "" "Contraseña del minero.\n" "Puede ser diferente a la contraseña de la cuenta.\n" -#: guiminer.py:1100 +#: guiminer.py:1101 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" @@ -316,45 +316,45 @@ msgstr "" "Para obtener mejores resultados con las Radeon HD 5xxx utiliza -v -w128.\n" "Para otras tarjetas, consultar el foro: http://forum.bitcoin.org/." -#: guiminer.py:1102 +#: guiminer.py:1103 msgid "" "CPU cores used for mining.\n" "Unchecking some cores can reduce high CPU usage in some systems." msgstr "" -#: guiminer.py:1196 guiminer.py:1290 guiminer.py:1311 +#: guiminer.py:1197 guiminer.py:1291 guiminer.py:1312 msgid "Auth token rejected by server." msgstr "Código de autorización rechazado por el servidor" -#: guiminer.py:1214 +#: guiminer.py:1215 #, python-format msgid "%s confirmed" msgstr "%s confirmado" -#: guiminer.py:1216 +#: guiminer.py:1217 #, python-format msgid ", %s unconfirmed" msgstr ", %s sin confirmar" -#: guiminer.py:1218 +#: guiminer.py:1219 msgid "Bad response from server." msgstr "Respuesta incorrecta del servidor." -#: guiminer.py:1294 guiminer.py:1315 +#: guiminer.py:1295 guiminer.py:1316 msgid "Withdraw OK" msgstr "Retirada de saldo correcta" -#: guiminer.py:1485 +#: guiminer.py:1486 msgid "No registration is required - just enter an address and press Start." msgstr "" "No es necesario el registro - sólo introduce una dirección y presiona " "Iniciar." -#: guiminer.py:1487 +#: guiminer.py:1488 msgid "Address:" msgstr "Dirección:" -#: guiminer.py:1489 +#: guiminer.py:1490 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" @@ -362,7 +362,7 @@ msgstr "" "Tu cuenta para recibir Bitcoins.\n" "Ejemplo: 1LSEcWhBwvQ6r5wWC6ZfHRtDrTmybqXbLk" -#: guiminer.py:1505 +#: guiminer.py:1506 msgid "" "Your miner username (not your account username).\n" "Example: Kiv.GPU" @@ -370,11 +370,11 @@ msgstr "" "Tu usuario del minero, (no el usuario de la cuenta).\n" "Ejemplo: BitcoinsWallet.GPU" -#: guiminer.py:1507 guiminer.py:1528 +#: guiminer.py:1508 guiminer.py:1529 msgid "Your miner password (not your account password)." msgstr "Contraseña del minero (no la contraseña de la cuenta).\n" -#: guiminer.py:1526 +#: guiminer.py:1527 msgid "" "Your miner username. \n" "Example: kiv123@kiv123" @@ -382,246 +382,235 @@ msgstr "" "El usuario del minero. \n" "Ejemplo: BitcoinsWallet@kiv123" -#: guiminer.py:1543 +#: guiminer.py:1544 msgid "The e-mail address you registered with." msgstr "El correo electrónico con el que te registraste." -#: guiminer.py:1544 +#: guiminer.py:1545 msgid "Email:" msgstr "Correo electrónico:" -#: guiminer.py:1559 +#: guiminer.py:1560 msgid "&Rename..." msgstr "&Renombrar..." -#: guiminer.py:1559 +#: guiminer.py:1560 msgid "Rename this miner" msgstr "Renombrar este minero" -#: guiminer.py:1584 +#: guiminer.py:1585 msgid "&New OpenCL miner..." msgstr "&Nuevo minero OpenCL..." -#: guiminer.py:1584 +#: guiminer.py:1585 msgid "Create a new OpenCL miner (default for ATI cards)" msgstr "" -#: guiminer.py:1585 -#, fuzzy +#: guiminer.py:1586 msgid "Create a new Phoenix miner (for some ATI cards)" -msgstr "Crear un nuevo perfil de minero" +msgstr "" -#: guiminer.py:1585 -#, fuzzy +#: guiminer.py:1586 msgid "New Phoenix miner..." -msgstr "Nuevo minero diferente..." +msgstr "Nuevo minero Phoenix" -#: guiminer.py:1586 +#: guiminer.py:1587 msgid "Create a new CUDA miner (for NVIDIA cards)" msgstr "" -#: guiminer.py:1586 -#, fuzzy +#: guiminer.py:1587 msgid "New CUDA miner..." -msgstr "&Nuevo minero OpenCL..." +msgstr "Nuevo minero CUDA..." -#: guiminer.py:1587 -#, fuzzy +#: guiminer.py:1588 msgid "Create a new Ufasoft miner (for CPUs)" -msgstr "Crear un nuevo perfil de minero" +msgstr "" -#: guiminer.py:1587 -#, fuzzy +#: guiminer.py:1588 msgid "New Ufasoft CPU miner..." -msgstr "Nuevo minero diferente..." +msgstr "Nuevo minero Ufasoft CPU" -#: guiminer.py:1588 -#, fuzzy +#: guiminer.py:1589 msgid "Create a new custom miner (requires external program)" -msgstr "Crear un nuevo minero CPU o CUDA (requiere un programa externo)" +msgstr "" -#: guiminer.py:1588 +#: guiminer.py:1589 msgid "New &other miner..." msgstr "Nuevo minero diferente..." -#: guiminer.py:1589 -#, fuzzy +#: guiminer.py:1590 msgid "&New miner" -msgstr "Nuevo minero" +msgstr "" -#: guiminer.py:1590 +#: guiminer.py:1591 msgid "&Save settings" msgstr "&Guardar opciones" -#: guiminer.py:1590 +#: guiminer.py:1591 msgid "Save your settings" msgstr "Guardar tus opciones" -#: guiminer.py:1591 +#: guiminer.py:1592 msgid "&Load settings" msgstr "&Cargar opciones" -#: guiminer.py:1591 +#: guiminer.py:1592 msgid "Load stored settings" msgstr "Cargar las opciones guardadas" -#: guiminer.py:1592 +#: guiminer.py:1593 msgid "Quit" msgstr "Salir" -#: guiminer.py:1593 +#: guiminer.py:1594 msgid "&File" msgstr "&Archivo" -#: guiminer.py:1597 +#: guiminer.py:1598 msgid "Show summary" msgstr "Mostrar sumario" -#: guiminer.py:1597 +#: guiminer.py:1598 msgid "Show summary of all miners" msgstr "Mostrar sumario de todos los mineros" -#: guiminer.py:1598 +#: guiminer.py:1599 msgid "Show console" msgstr "Mostrar consola" -#: guiminer.py:1598 +#: guiminer.py:1599 msgid "Show console logs" msgstr "Mostrar los registros de la consola" -#: guiminer.py:1599 +#: guiminer.py:1600 msgid "&View" msgstr "&Ver" -#: guiminer.py:1603 +#: guiminer.py:1604 msgid "&Create solo password..." msgstr "&Crear usuario/contraseña..." -#: guiminer.py:1603 +#: guiminer.py:1604 msgid "Configure a user/pass for solo mining" msgstr "Configurar un usuario/contraseña para la minería en modo 'solo'" -#: guiminer.py:1604 +#: guiminer.py:1605 msgid "&Set Bitcoin client path..." msgstr "&Configurar la ruta del cliente Bitcoin..." -#: guiminer.py:1604 +#: guiminer.py:1605 msgid "Set the location of the official Bitcoin client" msgstr "Configurar la ruta del cliente oficial Bitcoin." -#: guiminer.py:1605 +#: guiminer.py:1606 msgid "&Launch Bitcoin client as server" msgstr "&Ejecutar el cliente Bitcoin como servidor" -#: guiminer.py:1605 +#: guiminer.py:1606 msgid "Launch the official Bitcoin client as a server for solo mining" msgstr "" "Ejecutar el cliente Bitcoin como servidor para la minería en modo 'solo'" -#: guiminer.py:1606 +#: guiminer.py:1607 msgid "&Solo utilities" msgstr "&Minería en modo 'solo'" -#: guiminer.py:1610 -#, fuzzy +#: guiminer.py:1611 msgid "Start &minimized" -msgstr "Iniciar la minería" +msgstr "" -#: guiminer.py:1610 +#: guiminer.py:1611 msgid "Start the GUI minimized to the tray." msgstr "" -#: guiminer.py:1612 +#: guiminer.py:1613 msgid "&Options" msgstr "" -#: guiminer.py:1616 +#: guiminer.py:1617 msgid "&Change language..." msgstr "&Cambiar idioma..." -#: guiminer.py:1617 +#: guiminer.py:1618 msgid "Language" msgstr "Idioma" -#: guiminer.py:1621 +#: guiminer.py:1622 msgid "&Donate 99 cents..." msgstr "" -#: guiminer.py:1621 +#: guiminer.py:1622 msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" msgstr "" -#: guiminer.py:1622 -#, fuzzy +#: guiminer.py:1623 msgid "&Donate" -msgstr "&Acerca de/Donaciones..." +msgstr "&Donaciones" -#: guiminer.py:1625 -#, fuzzy +#: guiminer.py:1626 msgid "&About..." -msgstr "&Acerca de/Donaciones..." +msgstr "&Acerca de" -#: guiminer.py:1627 +#: guiminer.py:1628 msgid "&Help" msgstr "&Ayuda" -#: guiminer.py:1639 +#: guiminer.py:1640 msgid "Failed to load taskbar icon; continuing." msgstr "Error al cargar el icono de bandeja del sistema; continunando...." -#: guiminer.py:1648 +#: guiminer.py:1649 msgid "OpenCL not found - can't add a OpenCL miner" msgstr "OpenCL no encontrado. No se puede añadir un minero OpenCL" -#: guiminer.py:1685 +#: guiminer.py:1686 #, python-format msgid "GUIMiner - v%s" msgstr "GUIMiner - v%s" -#: guiminer.py:1727 +#: guiminer.py:1728 msgid "Name this miner:" msgstr "Nombre para este minero:" -#: guiminer.py:1727 +#: guiminer.py:1728 msgid "New miner" msgstr "Nuevo minero" -#: guiminer.py:1730 +#: guiminer.py:1731 msgid "Untitled" msgstr "Sin nombre" -#: guiminer.py:1741 -#, fuzzy +#: guiminer.py:1742 msgid "External miner (*.exe)|*.exe|(*.py)|*.py" -msgstr "Minero externo (*.exe)|*.exe" +msgstr "Minero externo (*.exe)|*.exe|(*.py)|*.py" -#: guiminer.py:1743 +#: guiminer.py:1744 msgid "Select external miner:" msgstr "Seleccionar un minero externo:" -#: guiminer.py:1753 +#: guiminer.py:1754 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" msgstr "" "Minero externo %(filename)s no compatible. Los compatibles son: %(supported)" -#: guiminer.py:1755 +#: guiminer.py:1756 msgid "Miner not supported" msgstr "Minero no compatible" -#: guiminer.py:1796 +#: guiminer.py:1797 msgid "Do you want to save changes?" msgstr "¿Quieres guardar los cambios?" -#: guiminer.py:1796 +#: guiminer.py:1797 msgid "Save" msgstr "Guardar" -#: guiminer.py:1826 +#: guiminer.py:1827 msgid "Saving: " msgstr "Guardando: " -#: guiminer.py:1832 +#: guiminer.py:1833 #, python-format msgid "" "Couldn't write save file %s.\n" @@ -630,137 +619,133 @@ msgstr "" "No se puede guardar el archivo %s.\n" "Comprueba que la ubicación permite la escritura" -#: guiminer.py:1833 +#: guiminer.py:1834 msgid "Save unsuccessful" msgstr "Error al guardar" -#: guiminer.py:1835 +#: guiminer.py:1836 #, python-format msgid "Profiles saved OK to %s." msgstr "Los perfiles se han guardado correctamente en %s." -#: guiminer.py:1836 +#: guiminer.py:1837 msgid "Save successful" msgstr "Guardado correcto" -#: guiminer.py:1848 +#: guiminer.py:1849 #, python-format msgid "Loaded: %s" msgstr "Cargado: %s" -#: guiminer.py:1862 +#: guiminer.py:1863 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "Cargar los perfiles parará los mineros que trabajen ahora. Продолжить?" -#: guiminer.py:1863 +#: guiminer.py:1864 msgid "Load profile" msgstr "Cargar perfil" -#: guiminer.py:1892 +#: guiminer.py:1893 msgid "Select path to Bitcoin.exe" msgstr "Seleccionar ruta para Bitcoin.exe" -#: guiminer.py:1904 +#: guiminer.py:1905 msgid "About" msgstr "Acerca de" -#: guiminer.py:1930 +#: guiminer.py:1931 msgid "Closing this miner will stop it. Continue?" msgstr "Cerrar este minero lo parará. ¿Continuar?" -#: guiminer.py:1931 +#: guiminer.py:1932 msgid "Close miner" msgstr "Cerrar minero" -#: guiminer.py:1960 +#: guiminer.py:1961 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" msgstr "No se puede encontrar Bitcoin en %s. ¿La ruta es correcta?" -#: guiminer.py:1961 +#: guiminer.py:1962 msgid "Launch failed" msgstr "Fallo al iniciar" -#: guiminer.py:1964 +#: guiminer.py:1965 msgid "" "The Bitcoin client will now launch in server mode.\n" "Once it connects to the network and downloads the block chain, you can start " "a miner in 'solo' mode." msgstr "" -#: guiminer.py:1965 +#: guiminer.py:1966 msgid "Launched ok." msgstr "Ejecutado correctamente." -#: guiminer.py:1980 +#: guiminer.py:1981 #, python-format msgid "%s already exists. Overwrite?" msgstr "%s ya existe. ¿Sobreescribir?" -#: guiminer.py:1981 +#: guiminer.py:1982 msgid "bitcoin.conf already exists." msgstr "bitcoin.conf ya existe." -#: guiminer.py:1986 +#: guiminer.py:1987 msgid "Enter password" msgstr "Introducir contraseña" -#: guiminer.py:1996 +#: guiminer.py:1997 msgid "Success" msgstr "Correcto" -#: guiminer.py:1996 +#: guiminer.py:1997 msgid "Wrote bitcoin config ok." msgstr "bitcoin.conf escrito correctamente." -#: guiminer.py:2007 +#: guiminer.py:2008 msgid "Console" msgstr "Consola" -#: guiminer.py:2019 +#: guiminer.py:2020 msgid "Summary" msgstr "Sumario" -#: guiminer.py:2032 +#: guiminer.py:2033 msgid "Rename miner" msgstr "Renombrar minero" -#: guiminer.py:2032 +#: guiminer.py:2033 msgid "Rename to:" msgstr "Renombrar a:" -#: guiminer.py:2037 +#: guiminer.py:2038 msgid "Change language" msgstr "Cambiar idioma" -#: guiminer.py:2057 +#: guiminer.py:2058 msgid "Choose language (requires restart to take full effect)" msgstr "Elegir idioma (se necesita reiniciar para completar)" -#: guiminer.py:2102 +#: guiminer.py:2103 msgid "" -"Click the link below to log in to the pool and get a special token. \n" +"Click the link below to log in to the pool and get a special token.\n" "This token lets you securely check your balance.\n" "To remember this token for the future, save your miner settings." msgstr "" -"Hacer clic en el enlace de abajo para entrar en el grupo y conseguir el\n" -"código de la API. Este código te permitirá comprobar tu saldo de forma " -"segura.\n" -"Para guardar este código, deberás guardar la configuración de tu minero." -#: guiminer.py:2111 +#: guiminer.py:2112 msgid "(Paste token here)" msgstr "(Pegar el código aquí)" -#: guiminer.py:2137 +#: guiminer.py:2138 msgid "Copy address to clipboard" msgstr "Copiar dirección al portapapeles" -#: guiminer.py:2156 +#: guiminer.py:2157 msgid "No OpenCL devices found." msgstr "No se han encontrado dispositivos OpenCL." -#: guiminer.py:2159 +#: guiminer.py:2160 msgid "" "No OpenCL devices were found.\n" " If you only want to mine using CPU or CUDA, you can ignore this message.\n" @@ -774,16 +759,6 @@ msgstr "" "SDK del ATI Stream\n" "o tu GPU podría no aceptar OpenCL.\n" -#: guiminer.py:2169 +#: guiminer.py:2170 msgid "Don't show this message again" msgstr "No volver a mostrar este mensaje" - -#~ msgid "" -#~ "Client launched ok. You can start a miner now with the server set to " -#~ "'solo'." -#~ msgstr "" -#~ "Cliente ejecutado correctamente. Ahora puedes iniciar\n" -#~ "un minero con el servidor configurado en modo 'solo'" - -#~ msgid "%s mining!" -#~ msgstr "%s minería" diff --git a/guiminer_fr.po b/guiminer_fr.po index 49426be..2b271a6 100644 --- a/guiminer_fr.po +++ b/guiminer_fr.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 15:18-0300\n" +"POT-Creation-Date: 2011-06-14 22:43-0300\n" "PO-Revision-Date: 2011-05-24 18:37+0100\n" "Last-Translator: Cramoisan Florian \n" "Language-Team: Russian\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: guiminer.py:89 +#: guiminer.py:90 #, python-format msgid "" "GUIMiner\n" @@ -58,227 +58,227 @@ msgstr "" "\n" "\n" -#: guiminer.py:110 +#: guiminer.py:111 msgid "Not started" msgstr "Non démarré" -#: guiminer.py:111 +#: guiminer.py:112 msgid "Starting..." msgstr "Démarrage..." -#: guiminer.py:112 +#: guiminer.py:113 msgid "Stopped" msgstr "Arrêté" -#: guiminer.py:113 +#: guiminer.py:114 msgid "Paused" msgstr "En pause" -#: guiminer.py:114 +#: guiminer.py:115 msgid "Start mining!" msgstr "Commencer le minage!" -#: guiminer.py:115 +#: guiminer.py:116 msgid "Stop mining" msgstr "Arrêter de miner!" -#: guiminer.py:116 +#: guiminer.py:117 msgid "Refresh balance" msgstr "Raffraîchir la répartition" -#: guiminer.py:117 +#: guiminer.py:118 msgid "Connection error" msgstr "Erreur de connection" -#: guiminer.py:118 +#: guiminer.py:119 msgid "Username:" msgstr "Nom d'utilisateur:" -#: guiminer.py:119 +#: guiminer.py:120 msgid "Password:" msgstr "Mot de passe:" -#: guiminer.py:120 +#: guiminer.py:121 msgid "Quit this program" msgstr "Quitter le programme" -#: guiminer.py:121 +#: guiminer.py:122 msgid "Show about dialog" msgstr "Afficher la boîte de dialogue À Propos" -#: guiminer.py:202 +#: guiminer.py:203 #, python-format msgid "%.1f Ghash/s" msgstr "%.1f Ghash/s" -#: guiminer.py:204 +#: guiminer.py:205 #, python-format msgid "%.1f Mhash/s" msgstr "%.1f Mhash/s" -#: guiminer.py:206 +#: guiminer.py:207 msgid "Connecting..." msgstr "Connexion en cours..." -#: guiminer.py:208 +#: guiminer.py:209 #, python-format msgid "%d khash/s" msgstr "%d khash/s" -#: guiminer.py:232 +#: guiminer.py:233 #, python-format msgid "Requesting balance: %(request)s" msgstr "Requête de répartition : %(request)s" -#: guiminer.py:236 +#: guiminer.py:237 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "Réponse du serveur: %(status)s, %(data)s" -#: guiminer.py:303 +#: guiminer.py:304 msgid "Miner" msgstr "Miner" -#: guiminer.py:304 +#: guiminer.py:305 msgid "Speed" msgstr "Vitesse" -#: guiminer.py:305 +#: guiminer.py:306 msgid "Accepted" msgstr "Accepté" # Pas totalement sur pour stale, donc si quelqu'un a une idée... # Je suis ouvert à toute correction vous pouvez me joindre à l'adresse florian.cramoisan@gmail.com # Cordialement Florian Cramoisan -#: guiminer.py:306 +#: guiminer.py:307 msgid "Stale" msgstr "Périmé (Stale)" -#: guiminer.py:307 +#: guiminer.py:308 msgid "Start/Stop" msgstr "Démarrer/Arrêter" -#: guiminer.py:308 +#: guiminer.py:309 msgid "Autostart" msgstr "Démarrage auto" -#: guiminer.py:392 +#: guiminer.py:393 msgid "Pause all" msgstr "Mettre tout en pause" -#: guiminer.py:394 +#: guiminer.py:395 msgid "Restore" msgstr "Restaurer" -#: guiminer.py:395 +#: guiminer.py:396 msgid "Close" msgstr "Fermer" -#: guiminer.py:451 +#: guiminer.py:452 #, python-format msgid "Listener for \"%s\" started" msgstr "Démarrage de l'écoute de \"%s\" " -#: guiminer.py:466 +#: guiminer.py:467 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "Écouteur pour \"%(name)s\": %(line)s" -#: guiminer.py:469 +#: guiminer.py:470 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "Arrêt de l'écoute de \"%s\" " -#: guiminer.py:515 +#: guiminer.py:516 msgid "Server:" msgstr "Serveur:" -#: guiminer.py:520 +#: guiminer.py:521 msgid "Website:" msgstr "Site Web:" -#: guiminer.py:522 +#: guiminer.py:523 msgid "Ext. Path:" msgstr "Chemin :" -#: guiminer.py:524 +#: guiminer.py:525 msgid "Host:" msgstr "Hôte:" -#: guiminer.py:526 +#: guiminer.py:527 msgid "Port:" msgstr "Port:" -#: guiminer.py:532 +#: guiminer.py:533 msgid "Device:" msgstr "Périphérique:" -#: guiminer.py:533 +#: guiminer.py:534 msgid "No OpenCL devices" msgstr "Aucun périphérique OpenCL" -#: guiminer.py:534 +#: guiminer.py:535 msgid "Extra flags:" msgstr "Paramètres supplémentaires:" -#: guiminer.py:537 +#: guiminer.py:538 msgid "CPU Affinity:" msgstr "" -#: guiminer.py:540 +#: guiminer.py:541 msgid "Balance:" msgstr "Répartition: " -#: guiminer.py:544 +#: guiminer.py:545 msgid "Withdraw" msgstr "Se retirer" -#: guiminer.py:704 +#: guiminer.py:705 msgid "Default" msgstr "Défaut" -#: guiminer.py:755 +#: guiminer.py:756 msgid "Start" msgstr "Démarrer" -#: guiminer.py:755 +#: guiminer.py:756 msgid "Stop" msgstr "Arrêter" -#: guiminer.py:771 +#: guiminer.py:772 msgid "Connection problems" msgstr "Problème lors de la connexion" -#: guiminer.py:930 +#: guiminer.py:931 msgid "Running command: " msgstr "Execution de la commande: " -#: guiminer.py:989 +#: guiminer.py:990 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "Difficulté 1 hash: %(nhashes)d %(update_time)s" -#: guiminer.py:993 +#: guiminer.py:994 #, python-format msgid "Blocks: %d, " msgstr "Blocs: %d, " -#: guiminer.py:996 +#: guiminer.py:997 #, python-format msgid "Shares: %d accepted" msgstr "Partages: %d accepté" -#: guiminer.py:998 +#: guiminer.py:999 #, python-format msgid ", %d stale/invalid" msgstr ", %d est invalide" -#: guiminer.py:1020 +#: guiminer.py:1021 #, python-format msgid "- last at %s" msgstr "Dernière modification le %s" -#: guiminer.py:1093 +#: guiminer.py:1094 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." @@ -287,23 +287,23 @@ msgstr "" "options.\n" "Regardez leur site pour plus d'informations." -#: guiminer.py:1094 +#: guiminer.py:1095 msgid "Website of the currently selected server. Click to visit." msgstr "Site web du serveur selectionné. Cliquez pour le visiter" -#: guiminer.py:1095 +#: guiminer.py:1096 msgid "Available OpenCL devices on your system." msgstr "Périphériques OpenCL Disponibles." -#: guiminer.py:1096 +#: guiminer.py:1097 msgid "Host address, without http:// prefix." msgstr "Adresse de l'hôte, sans le préfixe http://." -#: guiminer.py:1097 +#: guiminer.py:1098 msgid "Server port. This is usually 8332." msgstr "Port du serveur. Habituellement 8332." -#: guiminer.py:1098 +#: guiminer.py:1099 msgid "" "The miner's username.\n" "May be different than your account username.\n" @@ -313,7 +313,7 @@ msgstr "" "Peut différer du nom d'utilisateur de votre compte.\n" "Exemple: Kiv.GPU" -#: guiminer.py:1099 +#: guiminer.py:1100 msgid "" "The miner's password.\n" "May be different than your account password." @@ -321,7 +321,7 @@ msgstr "" "Mot de passe du miner.\n" "Peut différer du mot de passe de votre compte." -#: guiminer.py:1100 +#: guiminer.py:1101 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" @@ -332,45 +332,45 @@ msgstr "" "rendement.\n" "Pour les autres cartes, consultez le forum." -#: guiminer.py:1102 +#: guiminer.py:1103 msgid "" "CPU cores used for mining.\n" "Unchecking some cores can reduce high CPU usage in some systems." msgstr "" -#: guiminer.py:1196 guiminer.py:1290 guiminer.py:1311 +#: guiminer.py:1197 guiminer.py:1291 guiminer.py:1312 msgid "Auth token rejected by server." msgstr "" -#: guiminer.py:1214 +#: guiminer.py:1215 #, python-format msgid "%s confirmed" msgstr "%s confirmé" -#: guiminer.py:1216 +#: guiminer.py:1217 #, python-format msgid ", %s unconfirmed" msgstr ", %s n'a pas été confirmé" -#: guiminer.py:1218 +#: guiminer.py:1219 msgid "Bad response from server." msgstr "Mauvaise réponse du serveur." -#: guiminer.py:1294 guiminer.py:1315 +#: guiminer.py:1295 guiminer.py:1316 msgid "Withdraw OK" msgstr "Retiré" -#: guiminer.py:1485 +#: guiminer.py:1486 msgid "No registration is required - just enter an address and press Start." msgstr "" "Aucun enregistrement requis, entrez seulement une adresse et cliquez sur " "Démarrer" -#: guiminer.py:1487 +#: guiminer.py:1488 msgid "Address:" msgstr "&Adresse électronique :" -#: guiminer.py:1489 +#: guiminer.py:1490 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" @@ -378,7 +378,7 @@ msgstr "" "Votre adresse de réception des bitcoins.\n" "Example: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" -#: guiminer.py:1505 +#: guiminer.py:1506 msgid "" "Your miner username (not your account username).\n" "Example: Kiv.GPU" @@ -386,11 +386,11 @@ msgstr "" "Votre nom d'utilisateur de miner (pas celui de votre compte). \n" "Example:kiv.GPU" -#: guiminer.py:1507 guiminer.py:1528 +#: guiminer.py:1508 guiminer.py:1529 msgid "Your miner password (not your account password)." msgstr "Votre mot de passe de miner (pas celui de votre compte)." -#: guiminer.py:1526 +#: guiminer.py:1527 msgid "" "Your miner username. \n" "Example: kiv123@kiv123" @@ -398,246 +398,246 @@ msgstr "" "Votre nom d'utilisateur de miner. \n" "Example:kiv123@kiv123" -#: guiminer.py:1543 +#: guiminer.py:1544 msgid "The e-mail address you registered with." msgstr "L'adresse mail avec laquelle vous vous êtes enregistré." -#: guiminer.py:1544 +#: guiminer.py:1545 msgid "Email:" msgstr "Email:" -#: guiminer.py:1559 +#: guiminer.py:1560 msgid "&Rename..." msgstr "&Renommer..." -#: guiminer.py:1559 +#: guiminer.py:1560 msgid "Rename this miner" msgstr "Renommer le miner" -#: guiminer.py:1584 +#: guiminer.py:1585 msgid "&New OpenCL miner..." msgstr "&Nouveau miner OpenCL..." -#: guiminer.py:1584 +#: guiminer.py:1585 msgid "Create a new OpenCL miner (default for ATI cards)" msgstr "" -#: guiminer.py:1585 +#: guiminer.py:1586 #, fuzzy msgid "Create a new Phoenix miner (for some ATI cards)" msgstr "Créer un profil avec un nouveau miner" -#: guiminer.py:1585 +#: guiminer.py:1586 #, fuzzy msgid "New Phoenix miner..." msgstr "N&ouveau miner..." -#: guiminer.py:1586 +#: guiminer.py:1587 msgid "Create a new CUDA miner (for NVIDIA cards)" msgstr "" -#: guiminer.py:1586 +#: guiminer.py:1587 #, fuzzy msgid "New CUDA miner..." msgstr "&Nouveau miner OpenCL..." -#: guiminer.py:1587 +#: guiminer.py:1588 #, fuzzy msgid "Create a new Ufasoft miner (for CPUs)" msgstr "Créer un profil avec un nouveau miner" -#: guiminer.py:1587 +#: guiminer.py:1588 #, fuzzy msgid "New Ufasoft CPU miner..." msgstr "N&ouveau miner..." -#: guiminer.py:1588 +#: guiminer.py:1589 #, fuzzy msgid "Create a new custom miner (requires external program)" msgstr "Créer un miner CPU ou CUDA (nécessite un programme externe)" -#: guiminer.py:1588 +#: guiminer.py:1589 msgid "New &other miner..." msgstr "N&ouveau miner..." -#: guiminer.py:1589 +#: guiminer.py:1590 #, fuzzy msgid "&New miner" msgstr "Nouveau miner" -#: guiminer.py:1590 +#: guiminer.py:1591 msgid "&Save settings" msgstr "&Sauver les paramètres" -#: guiminer.py:1590 +#: guiminer.py:1591 msgid "Save your settings" msgstr "Sauver vos paramètres" -#: guiminer.py:1591 +#: guiminer.py:1592 msgid "&Load settings" msgstr "&Charger les paramètres" -#: guiminer.py:1591 +#: guiminer.py:1592 msgid "Load stored settings" msgstr "Charger des paramètres enregistrés" -#: guiminer.py:1592 +#: guiminer.py:1593 msgid "Quit" msgstr "Quitter" -#: guiminer.py:1593 +#: guiminer.py:1594 msgid "&File" msgstr "&Fichier" -#: guiminer.py:1597 +#: guiminer.py:1598 msgid "Show summary" msgstr "Afficher le résumé" -#: guiminer.py:1597 +#: guiminer.py:1598 msgid "Show summary of all miners" msgstr "Afficher le résumé pour tous les miners" -#: guiminer.py:1598 +#: guiminer.py:1599 msgid "Show console" msgstr "Afficher la console" -#: guiminer.py:1598 +#: guiminer.py:1599 msgid "Show console logs" msgstr "Afficher les logs de la console" -#: guiminer.py:1599 +#: guiminer.py:1600 msgid "&View" msgstr "&Affichage" -#: guiminer.py:1603 +#: guiminer.py:1604 msgid "&Create solo password..." msgstr "&Créer un mot de passe solo..." -#: guiminer.py:1603 +#: guiminer.py:1604 msgid "Configure a user/pass for solo mining" msgstr "Veuillez fournir un utilisateur/mot de passe pour le mining en solo" -#: guiminer.py:1604 +#: guiminer.py:1605 msgid "&Set Bitcoin client path..." msgstr "&Changer le chemin vers le client Bitcoin..." -#: guiminer.py:1604 +#: guiminer.py:1605 msgid "Set the location of the official Bitcoin client" msgstr "Chemin du Bitcoin officiel" -#: guiminer.py:1605 +#: guiminer.py:1606 msgid "&Launch Bitcoin client as server" msgstr "&Lancer le client bitcoin en tant que serveur" -#: guiminer.py:1605 +#: guiminer.py:1606 msgid "Launch the official Bitcoin client as a server for solo mining" msgstr "Lancer le client Bitcoin officiel pour un minage solo." -#: guiminer.py:1606 +#: guiminer.py:1607 msgid "&Solo utilities" msgstr "&Outils solo" -#: guiminer.py:1610 +#: guiminer.py:1611 #, fuzzy msgid "Start &minimized" msgstr "Commencer le minage!" -#: guiminer.py:1610 +#: guiminer.py:1611 msgid "Start the GUI minimized to the tray." msgstr "" -#: guiminer.py:1612 +#: guiminer.py:1613 msgid "&Options" msgstr "" -#: guiminer.py:1616 +#: guiminer.py:1617 msgid "&Change language..." msgstr "&Changer de langue..." -#: guiminer.py:1617 +#: guiminer.py:1618 msgid "Language" msgstr "Langue" -#: guiminer.py:1621 +#: guiminer.py:1622 msgid "&Donate 99 cents..." msgstr "" -#: guiminer.py:1621 +#: guiminer.py:1622 msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" msgstr "" -#: guiminer.py:1622 +#: guiminer.py:1623 #, fuzzy msgid "&Donate" msgstr "&A propos/Faire un Don ..." -#: guiminer.py:1625 +#: guiminer.py:1626 #, fuzzy msgid "&About..." msgstr "&A propos/Faire un Don ..." -#: guiminer.py:1627 +#: guiminer.py:1628 msgid "&Help" msgstr "&Aide" -#: guiminer.py:1639 +#: guiminer.py:1640 msgid "Failed to load taskbar icon; continuing." msgstr "Erreur du chargement de l'icone de notification. L'exécution continue." -#: guiminer.py:1648 +#: guiminer.py:1649 msgid "OpenCL not found - can't add a OpenCL miner" msgstr "Impossible de trouver OpenCL : impossible d'ajouter un miner OpenCL" -#: guiminer.py:1685 +#: guiminer.py:1686 #, python-format msgid "GUIMiner - v%s" msgstr "GUIMiner - v%s" -#: guiminer.py:1727 +#: guiminer.py:1728 msgid "Name this miner:" msgstr "Nom du miner:" -#: guiminer.py:1727 +#: guiminer.py:1728 msgid "New miner" msgstr "Nouveau miner" -#: guiminer.py:1730 +#: guiminer.py:1731 msgid "Untitled" msgstr "Sans titre" -#: guiminer.py:1741 +#: guiminer.py:1742 #, fuzzy msgid "External miner (*.exe)|*.exe|(*.py)|*.py" msgstr "Miner externe (*.exe)|*.exe" -#: guiminer.py:1743 +#: guiminer.py:1744 msgid "Select external miner:" msgstr "Choisissez un miner externe:" -#: guiminer.py:1753 +#: guiminer.py:1754 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" msgstr "" "Miner externe non supporté %(filename)s. Les miners actuellement supportés " "sont: %(supported)s" -#: guiminer.py:1755 +#: guiminer.py:1756 msgid "Miner not supported" msgstr "Miner non supporté" -#: guiminer.py:1796 +#: guiminer.py:1797 msgid "Do you want to save changes?" msgstr "Voulez-vous sauvegarder les modifications ?" -#: guiminer.py:1796 +#: guiminer.py:1797 msgid "Save" msgstr "Sauvegarder" -#: guiminer.py:1826 +#: guiminer.py:1827 msgid "Saving: " msgstr "Sauvegarde: " -#: guiminer.py:1832 +#: guiminer.py:1833 #, python-format msgid "" "Couldn't write save file %s.\n" @@ -646,139 +646,135 @@ msgstr "" "Impossible d'écrire la sauvegarde dans le fichier %s.\n" "Vérifiez l'emplacement." -#: guiminer.py:1833 +#: guiminer.py:1834 msgid "Save unsuccessful" msgstr "Echec de la sauvegarde" -#: guiminer.py:1835 +#: guiminer.py:1836 #, python-format msgid "Profiles saved OK to %s." msgstr "Profil sauvé vers %s." -#: guiminer.py:1836 +#: guiminer.py:1837 msgid "Save successful" msgstr "Sauvegarde effectuée" -#: guiminer.py:1848 +#: guiminer.py:1849 #, python-format msgid "Loaded: %s" msgstr "Chargé: %s" -#: guiminer.py:1862 +#: guiminer.py:1863 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "Charger des profils arrêtera les miners en cours. Continuer ?" -#: guiminer.py:1863 +#: guiminer.py:1864 msgid "Load profile" msgstr "Charger un profil" -#: guiminer.py:1892 +#: guiminer.py:1893 msgid "Select path to Bitcoin.exe" msgstr "Choisir le chemin vers Bitcoin.exe" -#: guiminer.py:1904 +#: guiminer.py:1905 msgid "About" msgstr "&A propos" -#: guiminer.py:1930 +#: guiminer.py:1931 msgid "Closing this miner will stop it. Continue?" msgstr "Fermer le miner l'arrêtera. Continuer ?" -#: guiminer.py:1931 +#: guiminer.py:1932 msgid "Close miner" msgstr "Fermer le miner" -#: guiminer.py:1960 +#: guiminer.py:1961 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" msgstr "" "Impossible de trouver bitcoin au chemin %s. Vérifiez que le chemin a bien " "été paramétré." -#: guiminer.py:1961 +#: guiminer.py:1962 msgid "Launch failed" msgstr "Erreur de lancement" -#: guiminer.py:1964 +#: guiminer.py:1965 msgid "" "The Bitcoin client will now launch in server mode.\n" "Once it connects to the network and downloads the block chain, you can start " "a miner in 'solo' mode." msgstr "" -#: guiminer.py:1965 +#: guiminer.py:1966 msgid "Launched ok." msgstr "Lancement réussi." -#: guiminer.py:1980 +#: guiminer.py:1981 #, python-format msgid "%s already exists. Overwrite?" msgstr "%s Existe déjà. L'écraser ?" -#: guiminer.py:1981 +#: guiminer.py:1982 msgid "bitcoin.conf already exists." msgstr "bitcoin.conf existe déjà." -#: guiminer.py:1986 +#: guiminer.py:1987 msgid "Enter password" msgstr "Entrez le mot de passe" -#: guiminer.py:1996 +#: guiminer.py:1997 msgid "Success" msgstr "Succès" -#: guiminer.py:1996 +#: guiminer.py:1997 msgid "Wrote bitcoin config ok." msgstr "Écriture de la configuration bitcoin réussie." -#: guiminer.py:2007 +#: guiminer.py:2008 msgid "Console" msgstr "Console" -#: guiminer.py:2019 +#: guiminer.py:2020 msgid "Summary" msgstr "Résumé" -#: guiminer.py:2032 +#: guiminer.py:2033 msgid "Rename miner" msgstr "Renommer le miner" -#: guiminer.py:2032 +#: guiminer.py:2033 msgid "Rename to:" msgstr "Renommer :" -#: guiminer.py:2037 +#: guiminer.py:2038 msgid "Change language" msgstr "Changer de langue" -#: guiminer.py:2057 +#: guiminer.py:2058 msgid "Choose language (requires restart to take full effect)" msgstr "Choisissez une langue (Requiert un redémarrage)" -#: guiminer.py:2102 +#: guiminer.py:2103 msgid "" -"Click the link below to log in to the pool and get a special token. \n" +"Click the link below to log in to the pool and get a special token.\n" "This token lets you securely check your balance.\n" "To remember this token for the future, save your miner settings." msgstr "" -"Cliquez sur le lien ci-dessous pour vous connecter et obtenir un jeton (API " -"token). \n" -"Ce jeton vous permettra de vérifier votre répartition de manière sécurisée.\n" -"Pour se souvenir de ce jeton, sauvegardez les paramètres." -#: guiminer.py:2111 +#: guiminer.py:2112 msgid "(Paste token here)" msgstr "(Coller le jeton ici)" -#: guiminer.py:2137 +#: guiminer.py:2138 msgid "Copy address to clipboard" msgstr "Copier l'adresse dans le presse-papier" -#: guiminer.py:2156 +#: guiminer.py:2157 msgid "No OpenCL devices found." msgstr "Aucun périphérique OpenCL touvé." -#: guiminer.py:2159 +#: guiminer.py:2160 #, fuzzy msgid "" "No OpenCL devices were found.\n" @@ -794,10 +790,21 @@ msgstr "" " SDK (2.1 de préférence), sinon il se peut que votre GPU ne supporte pas " "OpenCL.\n" -#: guiminer.py:2169 +#: guiminer.py:2170 msgid "Don't show this message again" msgstr "" +#~ msgid "" +#~ "Click the link below to log in to the pool and get a special token. \n" +#~ "This token lets you securely check your balance.\n" +#~ "To remember this token for the future, save your miner settings." +#~ msgstr "" +#~ "Cliquez sur le lien ci-dessous pour vous connecter et obtenir un jeton " +#~ "(API token). \n" +#~ "Ce jeton vous permettra de vérifier votre répartition de manière " +#~ "sécurisée.\n" +#~ "Pour se souvenir de ce jeton, sauvegardez les paramètres." + #~ msgid "" #~ "Client launched ok. You can start a miner now with the server set to " #~ "'solo'." diff --git a/guiminer_hu.po b/guiminer_hu.po index 3bbeb9b..b736548 100644 --- a/guiminer_hu.po +++ b/guiminer_hu.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 15:18-0300\n" +"POT-Creation-Date: 2011-06-14 22:43-0300\n" "PO-Revision-Date: 2011-06-04 18:34+0100\n" "Last-Translator: Underyx \n" "Language-Team: Español\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: guiminer.py:89 +#: guiminer.py:90 #, python-format msgid "" "GUIMiner\n" @@ -47,224 +47,224 @@ msgstr "" "\n" "Egyetlen bitcoin is nagy motiváció a program továbbfejlesztésére.\n" -#: guiminer.py:110 +#: guiminer.py:111 msgid "Not started" msgstr "Nincs elindítva" -#: guiminer.py:111 +#: guiminer.py:112 msgid "Starting..." msgstr "Indítás..." -#: guiminer.py:112 +#: guiminer.py:113 msgid "Stopped" msgstr "Leállítva" -#: guiminer.py:113 +#: guiminer.py:114 msgid "Paused" msgstr "Leállítva" -#: guiminer.py:114 +#: guiminer.py:115 msgid "Start mining!" msgstr "Bányászat indítása" -#: guiminer.py:115 +#: guiminer.py:116 msgid "Stop mining" msgstr "Bányászat leállítása" -#: guiminer.py:116 +#: guiminer.py:117 msgid "Refresh balance" msgstr "Egyenleg frissítése" -#: guiminer.py:117 +#: guiminer.py:118 msgid "Connection error" msgstr "Kapcsolódási hiba" -#: guiminer.py:118 +#: guiminer.py:119 msgid "Username:" msgstr "Felhasználónév:" -#: guiminer.py:119 +#: guiminer.py:120 msgid "Password:" msgstr "Jelszó:" -#: guiminer.py:120 +#: guiminer.py:121 msgid "Quit this program" msgstr "Kilépés a programból" -#: guiminer.py:121 +#: guiminer.py:122 msgid "Show about dialog" msgstr "Névjegy megjelenítése..." -#: guiminer.py:202 +#: guiminer.py:203 #, python-format msgid "%.1f Ghash/s" msgstr "%.1f Ghash/s" -#: guiminer.py:204 +#: guiminer.py:205 #, python-format msgid "%.1f Mhash/s" msgstr "%.1f Mhash/s" -#: guiminer.py:206 +#: guiminer.py:207 msgid "Connecting..." msgstr "Kapcsolódás..." -#: guiminer.py:208 +#: guiminer.py:209 #, python-format msgid "%d khash/s" msgstr "%d khash/s" -#: guiminer.py:232 +#: guiminer.py:233 #, python-format msgid "Requesting balance: %(request)s" msgstr "Egyenleg lekérése: %(request)s" -#: guiminer.py:236 +#: guiminer.py:237 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "A szerver válasza: %(status)s, %(data)s" -#: guiminer.py:303 +#: guiminer.py:304 msgid "Miner" msgstr "Bányász" -#: guiminer.py:304 +#: guiminer.py:305 msgid "Speed" msgstr "Sebesség" -#: guiminer.py:305 +#: guiminer.py:306 msgid "Accepted" msgstr "Elfogadva" -#: guiminer.py:306 +#: guiminer.py:307 msgid "Stale" msgstr "Érvénytelen" -#: guiminer.py:307 +#: guiminer.py:308 msgid "Start/Stop" msgstr "Indítás/Leállítás" -#: guiminer.py:308 +#: guiminer.py:309 msgid "Autostart" msgstr "Automatikus indítás" -#: guiminer.py:392 +#: guiminer.py:393 msgid "Pause all" msgstr "Mind leállítása" -#: guiminer.py:394 +#: guiminer.py:395 msgid "Restore" msgstr "Visszaállítás" -#: guiminer.py:395 +#: guiminer.py:396 msgid "Close" msgstr "Bezárás" -#: guiminer.py:451 +#: guiminer.py:452 #, python-format msgid "Listener for \"%s\" started" msgstr "\"%s\" elindult" -#: guiminer.py:466 +#: guiminer.py:467 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "Üzenet - \"%(name)s\": %(line)s" -#: guiminer.py:469 +#: guiminer.py:470 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "\"%s\" leállt" -#: guiminer.py:515 +#: guiminer.py:516 msgid "Server:" msgstr "Szerver:" -#: guiminer.py:520 +#: guiminer.py:521 msgid "Website:" msgstr "Weboldal:" -#: guiminer.py:522 +#: guiminer.py:523 msgid "Ext. Path:" msgstr "Külső útvonal:" -#: guiminer.py:524 +#: guiminer.py:525 msgid "Host:" msgstr "Szerver:" -#: guiminer.py:526 +#: guiminer.py:527 msgid "Port:" msgstr "Port:" -#: guiminer.py:532 +#: guiminer.py:533 msgid "Device:" msgstr "Eszköz:" -#: guiminer.py:533 +#: guiminer.py:534 msgid "No OpenCL devices" msgstr "Nincs OpenCL eszközöd" -#: guiminer.py:534 +#: guiminer.py:535 msgid "Extra flags:" msgstr "Extra beállítások:" -#: guiminer.py:537 +#: guiminer.py:538 msgid "CPU Affinity:" msgstr "" -#: guiminer.py:540 +#: guiminer.py:541 msgid "Balance:" msgstr "Egyenleg:" -#: guiminer.py:544 +#: guiminer.py:545 msgid "Withdraw" msgstr "Visszavonás" -#: guiminer.py:704 +#: guiminer.py:705 msgid "Default" msgstr "Alapértelmezett" -#: guiminer.py:755 +#: guiminer.py:756 msgid "Start" msgstr "Indítás" -#: guiminer.py:755 +#: guiminer.py:756 msgid "Stop" msgstr "Leállítás" -#: guiminer.py:771 +#: guiminer.py:772 msgid "Connection problems" msgstr "Kapcsolódási problémák" -#: guiminer.py:930 +#: guiminer.py:931 msgid "Running command: " msgstr "Futtatási parancs: " -#: guiminer.py:989 +#: guiminer.py:990 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "Nehézség 1 hash-ek: %(nhashes)d %(update_time)s" -#: guiminer.py:993 +#: guiminer.py:994 #, python-format msgid "Blocks: %d, " msgstr "Blokkok: %d, " -#: guiminer.py:996 +#: guiminer.py:997 #, python-format msgid "Shares: %d accepted" msgstr "Részblokkok: %d elfogadva" -#: guiminer.py:998 +#: guiminer.py:999 #, python-format msgid ", %d stale/invalid" msgstr ", %d érvénytelen" -#: guiminer.py:1020 +#: guiminer.py:1021 #, python-format msgid "- last at %s" msgstr "- legutóbbi ekkor: %s" -#: guiminer.py:1093 +#: guiminer.py:1094 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." @@ -273,23 +273,23 @@ msgstr "" "vannak.\n" "További információért nézd meg a weboldalukat." -#: guiminer.py:1094 +#: guiminer.py:1095 msgid "Website of the currently selected server. Click to visit." msgstr "A kiválasztott szerver weboldala." -#: guiminer.py:1095 +#: guiminer.py:1096 msgid "Available OpenCL devices on your system." msgstr "A rendszered elérhető OpenCL eszközei." -#: guiminer.py:1096 +#: guiminer.py:1097 msgid "Host address, without http:// prefix." msgstr "Szerver címe, a http:// nélkül." -#: guiminer.py:1097 +#: guiminer.py:1098 msgid "Server port. This is usually 8332." msgstr "A szerver portja. Ez általában 8332." -#: guiminer.py:1098 +#: guiminer.py:1099 msgid "" "The miner's username.\n" "May be different than your account username.\n" @@ -299,7 +299,7 @@ msgstr "" "Lehet, hogy különbözik a fiókod felhasználónevétől.\n" "Például: Kiv.GPU" -#: guiminer.py:1099 +#: guiminer.py:1100 msgid "" "The miner's password.\n" "May be different than your account password." @@ -307,7 +307,7 @@ msgstr "" "A bányász jelszava.\n" "Lehet, hogy különbözik a fiókod jelszavától.\n" -#: guiminer.py:1100 +#: guiminer.py:1101 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" @@ -317,44 +317,44 @@ msgstr "" "Radeon HD 5xxx-es videokártyáknál használd azt, hogy -v -w128.\n" "Más videokártyáknál nézz utána a fórumban (forum.bitcoin.org)." -#: guiminer.py:1102 +#: guiminer.py:1103 msgid "" "CPU cores used for mining.\n" "Unchecking some cores can reduce high CPU usage in some systems." msgstr "" -#: guiminer.py:1196 guiminer.py:1290 guiminer.py:1311 +#: guiminer.py:1197 guiminer.py:1291 guiminer.py:1312 msgid "Auth token rejected by server." msgstr "Azonosítási kód visszautasítva a szerver által." -#: guiminer.py:1214 +#: guiminer.py:1215 #, python-format msgid "%s confirmed" msgstr "%s visszaigazolt" -#: guiminer.py:1216 +#: guiminer.py:1217 #, python-format msgid ", %s unconfirmed" msgstr ", %s nincs visszaigazolva" -#: guiminer.py:1218 +#: guiminer.py:1219 msgid "Bad response from server." msgstr "Hibás válasz a szervertől." -#: guiminer.py:1294 guiminer.py:1315 +#: guiminer.py:1295 guiminer.py:1316 msgid "Withdraw OK" msgstr "Sikeres visszavonás" -#: guiminer.py:1485 +#: guiminer.py:1486 msgid "No registration is required - just enter an address and press Start." msgstr "" "Nem kell regisztrálni - csak írd be a címed és nyomj az Indítás gombra." -#: guiminer.py:1487 +#: guiminer.py:1488 msgid "Address:" msgstr "Cím:" -#: guiminer.py:1489 +#: guiminer.py:1490 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" @@ -362,7 +362,7 @@ msgstr "" "A Bitcoin címed, amire a pénz érkezzen.\n" "Például: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" -#: guiminer.py:1505 +#: guiminer.py:1506 msgid "" "Your miner username (not your account username).\n" "Example: Kiv.GPU" @@ -370,11 +370,11 @@ msgstr "" "A bányász felhasználóneve (nem a fiók felhasználóneve).\n" "Például: Kiv.GPU" -#: guiminer.py:1507 guiminer.py:1528 +#: guiminer.py:1508 guiminer.py:1529 msgid "Your miner password (not your account password)." msgstr "A bányász jelszava (nem a fiók jelszava)." -#: guiminer.py:1526 +#: guiminer.py:1527 msgid "" "Your miner username. \n" "Example: kiv123@kiv123" @@ -382,248 +382,248 @@ msgstr "" "A bányász felhasználóneve. \n" "Például: kiv123@kiv123" -#: guiminer.py:1543 +#: guiminer.py:1544 msgid "The e-mail address you registered with." msgstr "Az e-mail cím, amivel regisztráltál" -#: guiminer.py:1544 +#: guiminer.py:1545 msgid "Email:" msgstr "E-mail cím:" -#: guiminer.py:1559 +#: guiminer.py:1560 msgid "&Rename..." msgstr "&Átnevezés..." -#: guiminer.py:1559 +#: guiminer.py:1560 msgid "Rename this miner" msgstr "Bányász átnevezése" -#: guiminer.py:1584 +#: guiminer.py:1585 msgid "&New OpenCL miner..." msgstr "&Új OpenCL bányász..." -#: guiminer.py:1584 +#: guiminer.py:1585 msgid "Create a new OpenCL miner (default for ATI cards)" msgstr "" -#: guiminer.py:1585 +#: guiminer.py:1586 #, fuzzy msgid "Create a new Phoenix miner (for some ATI cards)" msgstr "Új bányászprofil" -#: guiminer.py:1585 +#: guiminer.py:1586 #, fuzzy msgid "New Phoenix miner..." msgstr "Új külső bányász..." -#: guiminer.py:1586 +#: guiminer.py:1587 msgid "Create a new CUDA miner (for NVIDIA cards)" msgstr "" -#: guiminer.py:1586 +#: guiminer.py:1587 #, fuzzy msgid "New CUDA miner..." msgstr "&Új OpenCL bányász..." -#: guiminer.py:1587 +#: guiminer.py:1588 #, fuzzy msgid "Create a new Ufasoft miner (for CPUs)" msgstr "Új bányászprofil" -#: guiminer.py:1587 +#: guiminer.py:1588 #, fuzzy msgid "New Ufasoft CPU miner..." msgstr "Új külső bányász..." -#: guiminer.py:1588 +#: guiminer.py:1589 #, fuzzy msgid "Create a new custom miner (requires external program)" msgstr "Új CPU, vagy CUDA bányász (külső bányászprogrammal)" -#: guiminer.py:1588 +#: guiminer.py:1589 msgid "New &other miner..." msgstr "Új külső bányász..." -#: guiminer.py:1589 +#: guiminer.py:1590 #, fuzzy msgid "&New miner" msgstr "Új bányász" -#: guiminer.py:1590 +#: guiminer.py:1591 msgid "&Save settings" msgstr "&Beállítások mentése" -#: guiminer.py:1590 +#: guiminer.py:1591 msgid "Save your settings" msgstr "Beállítások mentése" -#: guiminer.py:1591 +#: guiminer.py:1592 msgid "&Load settings" msgstr "&Beállítások betöltése" -#: guiminer.py:1591 +#: guiminer.py:1592 msgid "Load stored settings" msgstr "Elmentett beállítások betöltése" -#: guiminer.py:1592 +#: guiminer.py:1593 msgid "Quit" msgstr "Kilépés" -#: guiminer.py:1593 +#: guiminer.py:1594 msgid "&File" msgstr "&Fájl" -#: guiminer.py:1597 +#: guiminer.py:1598 msgid "Show summary" msgstr "Összegzés megjelenítése" -#: guiminer.py:1597 +#: guiminer.py:1598 msgid "Show summary of all miners" msgstr "Minden bányász összegsésének megjelenítése" -#: guiminer.py:1598 +#: guiminer.py:1599 msgid "Show console" msgstr "Konzol megjelenítése..." -#: guiminer.py:1598 +#: guiminer.py:1599 msgid "Show console logs" msgstr "Konzolnaplók megjelenítése..." -#: guiminer.py:1599 +#: guiminer.py:1600 msgid "&View" msgstr "&Nézet" -#: guiminer.py:1603 +#: guiminer.py:1604 msgid "&Create solo password..." msgstr "&Szóló jelszó készítése..." -#: guiminer.py:1603 +#: guiminer.py:1604 msgid "Configure a user/pass for solo mining" msgstr "Felhasználónév és jelszó beállítása szóló bányászathoz" -#: guiminer.py:1604 +#: guiminer.py:1605 msgid "&Set Bitcoin client path..." msgstr "&Bitcoin kliens helyének megadása..." -#: guiminer.py:1604 +#: guiminer.py:1605 msgid "Set the location of the official Bitcoin client" msgstr "Add meg a hivatalos Bitcoin kliens helyét" -#: guiminer.py:1605 +#: guiminer.py:1606 msgid "&Launch Bitcoin client as server" msgstr "&Bitcoin kliens indítása szerverként" -#: guiminer.py:1605 +#: guiminer.py:1606 msgid "Launch the official Bitcoin client as a server for solo mining" msgstr "" "Szóló bányászathoz indítsd el a hivatalos Bitcoin bányászprogramot " "szerverként" -#: guiminer.py:1606 +#: guiminer.py:1607 msgid "&Solo utilities" msgstr "&Szóló eszközök" -#: guiminer.py:1610 +#: guiminer.py:1611 #, fuzzy msgid "Start &minimized" msgstr "Bányászat indítása" -#: guiminer.py:1610 +#: guiminer.py:1611 msgid "Start the GUI minimized to the tray." msgstr "" -#: guiminer.py:1612 +#: guiminer.py:1613 msgid "&Options" msgstr "" -#: guiminer.py:1616 +#: guiminer.py:1617 msgid "&Change language..." msgstr "&Nyelv változtatása..." -#: guiminer.py:1617 +#: guiminer.py:1618 msgid "Language" msgstr "Nyelv" -#: guiminer.py:1621 +#: guiminer.py:1622 msgid "&Donate 99 cents..." msgstr "" -#: guiminer.py:1621 +#: guiminer.py:1622 msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" msgstr "" -#: guiminer.py:1622 +#: guiminer.py:1623 #, fuzzy msgid "&Donate" msgstr "&Névjegy/Adományok..." -#: guiminer.py:1625 +#: guiminer.py:1626 #, fuzzy msgid "&About..." msgstr "&Névjegy/Adományok..." -#: guiminer.py:1627 +#: guiminer.py:1628 msgid "&Help" msgstr "&Segítség" -#: guiminer.py:1639 +#: guiminer.py:1640 msgid "Failed to load taskbar icon; continuing." msgstr "Tálcaikon betöltése sikertelen; folytatás..." -#: guiminer.py:1648 +#: guiminer.py:1649 msgid "OpenCL not found - can't add a OpenCL miner" msgstr "Az OpenCL nem található - nem lehet OpenCL bányászt indítani" -#: guiminer.py:1685 +#: guiminer.py:1686 #, python-format msgid "GUIMiner - v%s" msgstr "GUIMiner - v%s" -#: guiminer.py:1727 +#: guiminer.py:1728 msgid "Name this miner:" msgstr "Bányász neve:" -#: guiminer.py:1727 +#: guiminer.py:1728 msgid "New miner" msgstr "Új bányász" -#: guiminer.py:1730 +#: guiminer.py:1731 msgid "Untitled" msgstr "Névtelen" -#: guiminer.py:1741 +#: guiminer.py:1742 #, fuzzy msgid "External miner (*.exe)|*.exe|(*.py)|*.py" msgstr "Külső bányászprogram (*.exe)|*.exe" -#: guiminer.py:1743 +#: guiminer.py:1744 msgid "Select external miner:" msgstr "Válaszd ki a külső bányászprogramot:" -#: guiminer.py:1753 +#: guiminer.py:1754 #, fuzzy, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" msgstr "" "A külső bányászprogram (%(filename)s) nem támogatott. A következőket " "használhatod: %(supported)" -#: guiminer.py:1755 +#: guiminer.py:1756 msgid "Miner not supported" msgstr "A bányászprogram nem támogatott" -#: guiminer.py:1796 +#: guiminer.py:1797 msgid "Do you want to save changes?" msgstr "Elmented a változtatásokat?" -#: guiminer.py:1796 +#: guiminer.py:1797 msgid "Save" msgstr "Mentés" -#: guiminer.py:1826 +#: guiminer.py:1827 msgid "Saving: " msgstr "Mentés:" -#: guiminer.py:1832 +#: guiminer.py:1833 #, python-format msgid "" "Couldn't write save file %s.\n" @@ -632,139 +632,135 @@ msgstr "" "Nem sikerült ide menteni: %s.\n" "Ellenőrizd le hogy írható-e a mappa!" -#: guiminer.py:1833 +#: guiminer.py:1834 msgid "Save unsuccessful" msgstr "Sikertelen mentés" -#: guiminer.py:1835 +#: guiminer.py:1836 #, python-format msgid "Profiles saved OK to %s." msgstr "Profil sikeresen elmentve ide: %s." -#: guiminer.py:1836 +#: guiminer.py:1837 msgid "Save successful" msgstr "Sikeres mentés" -#: guiminer.py:1848 +#: guiminer.py:1849 #, python-format msgid "Loaded: %s" msgstr "Betöltve: %s" -#: guiminer.py:1862 +#: guiminer.py:1863 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "" "Egy profil betöltése le fogja állítani a jelenleg futó bányászokat. Biztos " "ezt akarod?" -#: guiminer.py:1863 +#: guiminer.py:1864 msgid "Load profile" msgstr "Profil betöltve" -#: guiminer.py:1892 +#: guiminer.py:1893 msgid "Select path to Bitcoin.exe" msgstr "Válaszd ki a Bitcoin.exe programfájlt" -#: guiminer.py:1904 +#: guiminer.py:1905 msgid "About" msgstr "Névjegy" -#: guiminer.py:1930 +#: guiminer.py:1931 msgid "Closing this miner will stop it. Continue?" msgstr "A bányász bezárásával leállítod azt. Biztos bezárod?" -#: guiminer.py:1931 +#: guiminer.py:1932 msgid "Close miner" msgstr "Bányász bezárása" -#: guiminer.py:1960 +#: guiminer.py:1961 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" msgstr "A Bitcoin nem található itt: %s. Biztos ez a helyes útvonal?" -#: guiminer.py:1961 +#: guiminer.py:1962 msgid "Launch failed" msgstr "Indítás sikertelen" -#: guiminer.py:1964 +#: guiminer.py:1965 msgid "" "The Bitcoin client will now launch in server mode.\n" "Once it connects to the network and downloads the block chain, you can start " "a miner in 'solo' mode." msgstr "" -#: guiminer.py:1965 +#: guiminer.py:1966 msgid "Launched ok." msgstr "Sikeres indítás" -#: guiminer.py:1980 +#: guiminer.py:1981 #, python-format msgid "%s already exists. Overwrite?" msgstr "%s már létezik. Felülírja?" -#: guiminer.py:1981 +#: guiminer.py:1982 msgid "bitcoin.conf already exists." msgstr "A bitcoin.conf fájl már létezik." -#: guiminer.py:1986 +#: guiminer.py:1987 msgid "Enter password" msgstr "Írd be a jelszavad" -#: guiminer.py:1996 +#: guiminer.py:1997 msgid "Success" msgstr "Sikerült" -#: guiminer.py:1996 +#: guiminer.py:1997 msgid "Wrote bitcoin config ok." msgstr "Bitcoin konfiguráció sikeresen megírva." -#: guiminer.py:2007 +#: guiminer.py:2008 msgid "Console" msgstr "Konzol" -#: guiminer.py:2019 +#: guiminer.py:2020 msgid "Summary" msgstr "Összegzés" -#: guiminer.py:2032 +#: guiminer.py:2033 msgid "Rename miner" msgstr "Bányász átnevezése" -#: guiminer.py:2032 +#: guiminer.py:2033 msgid "Rename to:" msgstr "Átnevezés erre:" -#: guiminer.py:2037 +#: guiminer.py:2038 msgid "Change language" msgstr "Nyelv változtatása" -#: guiminer.py:2057 +#: guiminer.py:2058 msgid "Choose language (requires restart to take full effect)" msgstr "Válassz nyelvet (a beállítás a program újraindításakor lép érvénybe)" -#: guiminer.py:2102 +#: guiminer.py:2103 msgid "" -"Click the link below to log in to the pool and get a special token. \n" +"Click the link below to log in to the pool and get a special token.\n" "This token lets you securely check your balance.\n" "To remember this token for the future, save your miner settings." msgstr "" -"Kattints a lenti linkre hogy a bányászcsapat oldalán kapj egy kódot.\n" -"Ez a kód fogja lehetővé tenni, hogy a program lekérdezhesse az egyenleged.\n" -"Mentsd el a program beállításait majd, hogy ne kelljen később újra beírnod a " -"kódot." -#: guiminer.py:2111 +#: guiminer.py:2112 msgid "(Paste token here)" msgstr "(Írd be ide a kódot)" -#: guiminer.py:2137 +#: guiminer.py:2138 msgid "Copy address to clipboard" msgstr "Cím másolása vágólapra" -#: guiminer.py:2156 +#: guiminer.py:2157 msgid "No OpenCL devices found." msgstr "Nem található OpenCL eszköz." -#: guiminer.py:2159 +#: guiminer.py:2160 msgid "" "No OpenCL devices were found.\n" " If you only want to mine using CPU or CUDA, you can ignore this message.\n" @@ -779,10 +775,21 @@ msgstr "" "ATI Stream SDK-t,\n" "vagy pedig a videokártyád nem támogatja az OpenCL-t.\n" -#: guiminer.py:2169 +#: guiminer.py:2170 msgid "Don't show this message again" msgstr "Ne mutasd ezt többször" +#~ msgid "" +#~ "Click the link below to log in to the pool and get a special token. \n" +#~ "This token lets you securely check your balance.\n" +#~ "To remember this token for the future, save your miner settings." +#~ msgstr "" +#~ "Kattints a lenti linkre hogy a bányászcsapat oldalán kapj egy kódot.\n" +#~ "Ez a kód fogja lehetővé tenni, hogy a program lekérdezhesse az " +#~ "egyenleged.\n" +#~ "Mentsd el a program beállításait majd, hogy ne kelljen később újra " +#~ "beírnod a kódot." + #~ msgid "" #~ "Client launched ok. You can start a miner now with the server set to " #~ "'solo'." diff --git a/guiminer_it.po b/guiminer_it.po index 520844a..3862a00 100644 --- a/guiminer_it.po +++ b/guiminer_it.po @@ -1,8 +1,8 @@ -msgid "" +msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-09 13:29-0300\n" +"POT-Creation-Date: 2011-06-14 22:51-0300\n" "PO-Revision-Date: 2011-05-20 00:00-0000\n" "Last-Translator: MasterHunterHD \n" "Language-Team: Italian\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: guiminer.py:84 +#: guiminer.py:90 #, python-format msgid "" "GUIMiner\n" @@ -37,254 +37,262 @@ msgstr "" "GUI fatto da: Chris 'Kiv' MacLeod\n" "Minatore poclbm originale fatto da: m0mchil\n" "Minatore rpcminer originale fatto da: puddinpop\n" -"Traduzione In italiano fatta da: MasterHunterHD - Dovessero esserci errori di traduzione, per favore inviatemi un PM. \n" -"\n -"Codice originale & problemi disponibili su GitHub: https://github.com/Kiv/poclbm\n" +"Traduzione In italiano fatta da: MasterHunterHD - Dovessero esserci " +"errori di traduzione, per favore inviatemi un PM. \n" +"\n" +"Codice originale & problemi disponibili su GitHub: https://github.com/Kiv/" +"poclbm\n" "\n" -"Se ti è piacuto questo programma, per favore, aiuta lo sviluppo di questo programma effetuando una donazione:\n" +"Se ti è piacuto questo programma, per favore, aiuta lo sviluppo di questo " +"programma effetuando una donazione:\n" "%(address)s\n" "\n" "Anche un solo BitCoin è apprezzato, e aiuta la motivazione\n" "al lavoro e a lo sviluppo di nuove funzionalità.\n" -#: guiminer.py:105 +#: guiminer.py:111 msgid "Not started" msgstr "Non in funzione" -#: guiminer.py:106 +#: guiminer.py:112 msgid "Starting..." msgstr "Inizializzando" -#: guiminer.py:107 +#: guiminer.py:113 msgid "Stopped" msgstr "Fermo" -#: guiminer.py:108 +#: guiminer.py:114 msgid "Paused" msgstr "In Pausa" -#: guiminer.py:109 +#: guiminer.py:115 msgid "Start mining!" msgstr "Inizia lo scavo!" -#: guiminer.py:110 +#: guiminer.py:116 msgid "Stop mining" msgstr "Ferma lo scavo" -#: guiminer.py:111 +#: guiminer.py:117 msgid "Refresh balance" msgstr "Aggiorna il saldo" -#: guiminer.py:112 +#: guiminer.py:118 msgid "Connection error" msgstr "Errore di connessione" -#: guiminer.py:113 +#: guiminer.py:119 msgid "Username:" msgstr "Username:" -#: guiminer.py:114 +#: guiminer.py:120 msgid "Password:" msgstr "Password:" -#: guiminer.py:115 +#: guiminer.py:121 msgid "Quit this program" msgstr "Chiudi il programma" -#: guiminer.py:116 +#: guiminer.py:122 msgid "Show about dialog" msgstr "Informazioni" -#: guiminer.py:197 +#: guiminer.py:203 #, python-format msgid "%.1f Ghash/s" msgstr "%.1f Ghash/s" -#: guiminer.py:199 +#: guiminer.py:205 #, python-format msgid "%.1f Mhash/s" msgstr "%.1f Mhash/s" -#: guiminer.py:201 +#: guiminer.py:207 msgid "Connecting..." msgstr "Connettendo..." -#: guiminer.py:203 +#: guiminer.py:209 #, python-format msgid "%d khash/s" msgstr "%d khash/s" -#: guiminer.py:227 +#: guiminer.py:233 #, python-format msgid "Requesting balance: %(request)s" msgstr "Aggiornando il saldo: %(request)s" -#: guiminer.py:231 +#: guiminer.py:237 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "Il server ha risposto: %(status)s, %(data)s" -#: guiminer.py:286 +#: guiminer.py:304 msgid "Miner" msgstr "Minatore" -#: guiminer.py:287 +#: guiminer.py:305 msgid "Speed" msgstr "Velocità" -#: guiminer.py:288 +#: guiminer.py:306 msgid "Accepted" msgstr "Accettato" -#: guiminer.py:289 +#: guiminer.py:307 msgid "Stale" msgstr "Inutilizzabile" -#: guiminer.py:290 +#: guiminer.py:308 msgid "Start/Stop" msgstr "Inizia/Ferma" -#: guiminer.py:291 +#: guiminer.py:309 msgid "Autostart" msgstr "Autoinizializzazione" -#: guiminer.py:375 +#: guiminer.py:393 msgid "Pause all" msgstr "Pausa tutto" -#: guiminer.py:377 +#: guiminer.py:395 msgid "Restore" msgstr "Ripristina" -#: guiminer.py:378 +#: guiminer.py:396 msgid "Close" msgstr "Chiudi" -#: guiminer.py:434 +#: guiminer.py:452 #, python-format msgid "Listener for \"%s\" started" msgstr "Ascolto per \"%s\" iniziato" -#: guiminer.py:449 +#: guiminer.py:467 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "Ascolto per \"%(name)s\": %(line)s" -#: guiminer.py:452 +#: guiminer.py:470 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "Fermando ascolto per \"%s\" " -#: guiminer.py:496 +#: guiminer.py:516 msgid "Server:" msgstr "Server:" -#: guiminer.py:501 +#: guiminer.py:521 msgid "Website:" msgstr "Sito Internet:" -#: guiminer.py:503 +#: guiminer.py:523 msgid "Ext. Path:" msgstr "Localizzazone est. :" -#: guiminer.py:505 +#: guiminer.py:525 msgid "Host:" msgstr "Host:" -#: guiminer.py:507 +#: guiminer.py:527 msgid "Port:" msgstr "Porta:" -#: guiminer.py:513 +#: guiminer.py:533 msgid "Device:" msgstr "Dispositivo:" -#: guiminer.py:514 +#: guiminer.py:534 msgid "No OpenCL devices" msgstr "Nessun dispositivo OpenCL" -#: guiminer.py:515 +#: guiminer.py:535 msgid "Extra flags:" msgstr "Opzioni (facoltativo):" -#: guiminer.py:518 +#: guiminer.py:538 +msgid "CPU Affinity:" +msgstr "" + +#: guiminer.py:541 msgid "Balance:" msgstr "Saldo:" -#: guiminer.py:522 +#: guiminer.py:545 msgid "Withdraw" msgstr "Ritirare dal saldo" -#: guiminer.py:667 +#: guiminer.py:705 msgid "Default" msgstr "Opzione Standard" -#: guiminer.py:714 +#: guiminer.py:756 msgid "Start" msgstr "Inizia" -#: guiminer.py:714 +#: guiminer.py:756 msgid "Stop" msgstr "Ferma" -#: guiminer.py:730 +#: guiminer.py:772 msgid "Connection problems" msgstr "Problemi di Connessione" -#: guiminer.py:889 +#: guiminer.py:931 msgid "Running command: " msgstr "Iniziando il commando: " -#: guiminer.py:943 +#: guiminer.py:990 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "Difficoltà 1 parte: %(nhashes)d %(update_time)s" -#: guiminer.py:947 +#: guiminer.py:994 #, python-format msgid "Blocks: %d, " msgstr "Blocchi: %d, " -#: guiminer.py:950 +#: guiminer.py:997 #, python-format msgid "Shares: %d accepted" msgstr "Scambi: %d aceptadas" -#: guiminer.py:952 +#: guiminer.py:999 #, python-format msgid ", %d stale/invalid" msgstr ", %d inutilizzabile/invalidi" -#: guiminer.py:974 +#: guiminer.py:1021 #, python-format msgid "- last at %s" msgstr "- ultimo: %s" -#: guiminer.py:1047 +#: guiminer.py:1094 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." msgstr "" -"Il server a la quale connettersi. Le rate ed i vantaggi variano a secondo dei server .\n" +"Il server a la quale connettersi. Le rate ed i vantaggi variano a secondo " +"dei server .\n" "Verifica il loro sito internet per più informazioni." -#: guiminer.py:1048 +#: guiminer.py:1095 msgid "Website of the currently selected server. Click to visit." msgstr "Sito internet del server in cui sei connesso. Clicca per visitarlo." -#: guiminer.py:1049 +#: guiminer.py:1096 msgid "Available OpenCL devices on your system." msgstr "Dispositivi OpenCL disponibili sul sistema." -#: guiminer.py:1050 +#: guiminer.py:1097 msgid "Host address, without http:// prefix." msgstr "Sito internet del server, senza il prefisso http://" -#: guiminer.py:1051 +#: guiminer.py:1098 msgid "Server port. This is usually 8332." msgstr "La porta del Server. Normalmente 8332." -#: guiminer.py:1052 +#: guiminer.py:1099 msgid "" "The miner's username.\n" "May be different than your account username.\n" @@ -294,7 +302,7 @@ msgstr "" "Puo essere diverso dal username del conto.\n" "Esempio: Kiv.GPU" -#: guiminer.py:1053 +#: guiminer.py:1100 msgid "" "The miner's password.\n" "May be different than your account password." @@ -302,7 +310,7 @@ msgstr "" "La password dell'lavoratore\n" "Puo essere diverso dalla password del conto." -#: guiminer.py:1054 +#: guiminer.py:1101 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" @@ -312,38 +320,45 @@ msgstr "" "Per le Radeon HD 5xxx series usa: -v -w128 per migliori risultati.\n" "Per altre cartine grafiche, consultare il forum. (forum.bicoin.org)" -#: guiminer.py:1148 guiminer.py:1242 guiminer.py:1263 +#: guiminer.py:1103 +msgid "" +"CPU cores used for mining.\n" +"Unchecking some cores can reduce high CPU usage in some systems." +msgstr "" + +#: guiminer.py:1197 guiminer.py:1291 guiminer.py:1312 msgid "Auth token rejected by server." msgstr "Codice di autenticazione rifiutato dal server." -#: guiminer.py:1166 +#: guiminer.py:1215 #, python-format msgid "%s confirmed" msgstr "%s confermato" -#: guiminer.py:1168 +#: guiminer.py:1217 #, python-format msgid ", %s unconfirmed" msgstr ", %s non confermato" -#: guiminer.py:1170 -msgid "Bad response from servon confeer." -msgstr "Risposta invalida dall'server." +#: guiminer.py:1219 +msgid "Bad response from server." +msgstr "" -#: guiminer.py:1246 guiminer.py:1267 +#: guiminer.py:1295 guiminer.py:1316 msgid "Withdraw OK" msgstr "Retirada de saldo correcta" -#: guiminer.py:1426 +#: guiminer.py:1486 msgid "No registration is required - just enter an address and press Start." msgstr "" -"Nessuna registratione necessaria - Inserire solo un indirizzo BitCoin e cliccare su Inizia." +"Nessuna registratione necessaria - Inserire solo un indirizzo BitCoin e " +"cliccare su Inizia." -#: guiminer.py:1428 +#: guiminer.py:1488 msgid "Address:" msgstr "Indirizzo:" -#: guiminer.py:1430 +#: guiminer.py:1490 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" @@ -351,19 +366,17 @@ msgstr "" "L'indirizzo per ricevere i BitCoin.\n" "Esempio: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" -#: guiminer.py:1445 +#: guiminer.py:1506 msgid "" -"Your miner username (not your account username).c" +"Your miner username (not your account username).\n" "Example: Kiv.GPU" msgstr "" -"Il username dell'lavoratore (non il username dell'conto).\n" -"Esempio: Kiv.GPU" -#: guiminer.py:1447 guiminer.py:1467 +#: guiminer.py:1508 guiminer.py:1529 msgid "Your miner password (not your account password)." msgstr "la password dell'lavoratore (non la password dell'conto).\n" -#: guiminer.py:1465 +#: guiminer.py:1527 msgid "" "Your miner username. \n" "Example: kiv123@kiv123" @@ -371,231 +384,241 @@ msgstr "" "Il username dell'lavoratore. \n" "Esempio: kiv123@kiv123" -#: guiminer.py:1481 +#: guiminer.py:1544 msgid "The e-mail address you registered with." msgstr "L'indirizzo e-mail con la quale ti sei registrato" -#: guiminer.py:1482 +#: guiminer.py:1545 msgid "Email:" msgstr "E-mail:" -#: guiminer.py:1497 +#: guiminer.py:1560 msgid "&Rename..." msgstr "&Rinomina" -#: guiminer.py:1497 +#: guiminer.py:1560 msgid "Rename this miner" msgstr "Rinomina questo minatore" -#: guiminer.py:1522 +#: guiminer.py:1585 msgid "&New OpenCL miner..." msgstr "&Nuovo minatore OpenCL" -#: guiminer.py:1522 +#: guiminer.py:1585 msgid "Create a new OpenCL miner (default for ATI cards)" msgstr "Creare un nuovo minatore OpenCL (Opzione Standard per cartine ATI)" -#: guiminer.py:1523 +#: guiminer.py:1586 msgid "Create a new Phoenix miner (for some ATI cards)" msgstr "Creare un nuovo minatore Phoenix (per qualche cartine ATI)" -#: guiminer.py:1523 +#: guiminer.py:1586 msgid "New Phoenix miner..." msgstr "Nuovo minatore Phoenix..." -#: guiminer.py:1524 +#: guiminer.py:1587 msgid "Create a new CUDA miner (for NVIDIA cards)" msgstr "Creare un nuovo minatore CUDA (per cartine NVIDIA)" -#: guiminer.py:1524 +#: guiminer.py:1587 msgid "New CUDA miner..." msgstr "Nuovo minatore CUDA..." -#: guiminer.py:1525 +#: guiminer.py:1588 msgid "Create a new Ufasoft miner (for CPUs)" msgstr "Creare un nuovo minatore Ufasoft (per processori)" -#: guiminer.py:1525 +#: guiminer.py:1588 msgid "New Ufasoft CPU miner..." msgstr "Nuovo minatore Ufasoft CPU..." -#: guiminer.py:1526 +#: guiminer.py:1589 msgid "Create a new custom miner (requires external program)" -msgstr "Creare un nuovo minatore personalizzato (richiede un programma esterno)" +msgstr "" +"Creare un nuovo minatore personalizzato (richiede un programma esterno)" -#: guiminer.py:1526 +#: guiminer.py:1589 msgid "New &other miner..." msgstr "Nuovo minatore di altro &tipo" -#: guiminer.py:1528 +#: guiminer.py:1590 +msgid "&New miner" +msgstr "" + +#: guiminer.py:1591 msgid "&Save settings" msgstr "&Salva impostazioni" -#: guiminer.py:1528 +#: guiminer.py:1591 msgid "Save your settings" msgstr "Save le tue impostazioni" -#: guiminer.py:1529 +#: guiminer.py:1592 msgid "&Load settings" msgstr "&Carica impostazioni" -#: guiminer.py:1529 +#: guiminer.py:1592 msgid "Load stored settings" msgstr "Carica impostazioni salvate" -#: guiminer.py:1530 +#: guiminer.py:1593 msgid "Quit" msgstr "Chiudi" -#: guiminer.py:1531 +#: guiminer.py:1594 msgid "&File" msgstr "&File" -#: guiminer.py:1535 +#: guiminer.py:1598 msgid "Show summary" msgstr "Mostra Riassunto" -#: guiminer.py:1535 +#: guiminer.py:1598 msgid "Show summary of all miners" msgstr "Mostra riassunto di tutti i minatori" -#: guiminer.py:1536 +#: guiminer.py:1599 msgid "Show console" msgstr "Mostra console" -#: guiminer.py:1536 +#: guiminer.py:1599 msgid "Show console logs" msgstr "Mostra il registro della console" -#: guiminer.py:1537 +#: guiminer.py:1600 msgid "&View" msgstr "&Visualizzazione" -#: guiminer.py:1541 +#: guiminer.py:1604 msgid "&Create solo password..." msgstr "&Creare password per minare in solo" -#: guiminer.py:1541 +#: guiminer.py:1604 msgid "Configure a user/pass for solo mining" -msgstr "Configurare una username/password per minare in solo" +msgstr "Configurare una username/password per minare in solo" -#: guiminer.py:1542 +#: guiminer.py:1605 msgid "&Set Bitcoin client path..." -msgstr ""&Imposta localizzazione dell'cliente BitCoinÉ" +msgstr "&Imposta localizzazione dell'cliente BitCoinÉ" -#: guiminer.py:1542 +#: guiminer.py:1605 msgid "Set the location of the official Bitcoin client" msgstr "Imposta la localizzazione dell'cliente ufficiale BitCoin" -#: guiminer.py:1543 +#: guiminer.py:1606 msgid "&Launch Bitcoin client as server" msgstr "&Inizializza il cliente BitCoin in modo server" -#: guiminer.py:1543 +#: guiminer.py:1606 msgid "Launch the official Bitcoin client as a server for solo mining" msgstr "" -"Inizializza il cliente BitCoin official in modo server, per permettere di minare in modo solo" +"Inizializza il cliente BitCoin official in modo server, per permettere di " +"minare in modo solo" -#: guiminer.py:1544 +#: guiminer.py:1607 msgid "&Solo utilities" msgstr "&Utilità Solo" -#: guiminer.py:1548 +#: guiminer.py:1611 msgid "Start &minimized" msgstr "Inizia &minimizzato" -#: guiminer.py:1548 +#: guiminer.py:1611 msgid "Start the GUI minimized to the tray." msgstr "Esegui il programma minimizzato." -#: guiminer.py:1550 +#: guiminer.py:1613 msgid "&Options" msgstr "&Opzioni" -#: guiminer.py:1554 +#: guiminer.py:1617 msgid "&Change language..." msgstr "&Cambia la lingua" -#: guiminer.py:1555 +#: guiminer.py:1618 msgid "Language" msgstr "Linguaggio" -#: guiminer.py:1559 +#: guiminer.py:1622 msgid "&Donate 99 cents..." msgstr "&Dona 99 centesimi" -#: guiminer.py:1559 +#: guiminer.py:1622 msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" -msgstr "Dona l'equivalente di $0.99 USD in BitCoins per aiutare lo sviluppo di GUIMiner." +msgstr "" +"Dona l'equivalente di $0.99 USD in BitCoins per aiutare lo sviluppo di " +"GUIMiner." -#: guiminer.py:1560 +#: guiminer.py:1623 msgid "&Donate" msgstr "&Dona" -#: guiminer.py:1563 +#: guiminer.py:1626 msgid "&About..." msgstr "&Informazioni" -#: guiminer.py:1565 +#: guiminer.py:1628 msgid "&Help" msgstr "&Aiuto" -#: guiminer.py:1577 +#: guiminer.py:1640 msgid "Failed to load taskbar icon; continuing." msgstr "Impossibile caricare l'icona della taskbar; continuando." -#: guiminer.py:1586 +#: guiminer.py:1649 msgid "OpenCL not found - can't add a OpenCL miner" -msgstr "OpenCL non  stato trovato - Impossibile aggiungere un minatore di tio OpenCL" +msgstr "" +"OpenCL non  stato trovato - Impossibile aggiungere un minatore di tio OpenCL" -#: guiminer.py:1623 +#: guiminer.py:1686 #, python-format msgid "GUIMiner - v%s" msgstr "GUIMiner - v%s" -#: guiminer.py:1665 +#: guiminer.py:1728 msgid "Name this miner:" msgstr "Nomina questo minatore:" -#: guiminer.py:1665 +#: guiminer.py:1728 msgid "New miner" msgstr "Nuovo minatore" -#: guiminer.py:1668 +#: guiminer.py:1731 msgid "Untitled" msgstr "Senza nome" -#: guiminer.py:1679 +#: guiminer.py:1742 msgid "External miner (*.exe)|*.exe|(*.py)|*.py" msgstr "Minatore Esterno (*.exe)|*.exe|(*.py)|*.py" -#: guiminer.py:1681 +#: guiminer.py:1744 msgid "Select external miner:" msgstr "Seleziona minatore esterno:" -#: guiminer.py:1691 +#: guiminer.py:1754 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" msgstr "" -"Minatore esterno non supportato %(filename)s. Quelli supportati sono: %(supported)s" +"Minatore esterno non supportato %(filename)s. Quelli supportati sono: %" +"(supported)s" -#: guiminer.py:1693 +#: guiminer.py:1756 msgid "Miner not supported" msgstr "Minatore non supportato" -#: guiminer.py:1734 +#: guiminer.py:1797 msgid "Do you want to save changes?" msgstr "Salvare i cambiamenti?" -#: guiminer.py:1734 +#: guiminer.py:1797 msgid "Save" msgstr "Salva" -#: guiminer.py:1764 +#: guiminer.py:1827 msgid "Saving: " msgstr "Salvando: " -#: guiminer.py:1770 +#: guiminer.py:1833 #, python-format msgid "" "Couldn't write save file %s.\n" @@ -604,135 +627,136 @@ msgstr "" "Impossibile modificare il file %s.\n" "Verificare che il file pu˜ essere modificato." -#: guiminer.py:1771 +#: guiminer.py:1834 msgid "Save unsuccessful" msgstr "Impossibile Salvare" -#: guiminer.py:1773 +#: guiminer.py:1836 #, python-format msgid "Profiles saved OK to %s." msgstr "I Profili sono stati salvati con successo a %s." -#: guiminer.py:1774 +#: guiminer.py:1837 msgid "Save successful" msgstr "Salvato con successo" -#: guiminer.py:1786 +#: guiminer.py:1849 #, python-format msgid "Loaded: %s" msgstr "Caricato: %s" -#: guiminer.py:1800 +#: guiminer.py:1863 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "Caricare un profilo, non fermerˆ nessun minatore. Continuare?" -#: guiminer.py:1801 +#: guiminer.py:1864 msgid "Load profile" msgstr "Carica profilo" -#: guiminer.py:1830 +#: guiminer.py:1893 msgid "Select path to Bitcoin.exe" msgstr "Imposta la locazione di Bitcoin.exe" -#: guiminer.py:1842 +#: guiminer.py:1905 msgid "About" msgstr "Informazioni" -#: guiminer.py:1868 +#: guiminer.py:1931 msgid "Closing this miner will stop it. Continue?" msgstr "Chiudendo questo minatore, il suo scavo sarà fermato. Continuare?" -#: guiminer.py:1869 +#: guiminer.py:1932 msgid "Close miner" msgstr "Chiudi minatore" -#: guiminer.py:1898 +#: guiminer.py:1961 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" -msgstr "Impossibile trovare Bitcoin aa %s. La localizzazione del file è coretta ?" +msgstr "" +"Impossibile trovare Bitcoin aa %s. La localizzazione del file è coretta ?" -#: guiminer.py:1899 +#: guiminer.py:1962 msgid "Launch failed" msgstr "Inizializzazione fallita" -#: guiminer.py:1902 +#: guiminer.py:1965 msgid "" -"Client launched ok. You can start a miner now with the server set to 'solo'." +"The Bitcoin client will now launch in server mode.\n" +"Once it connects to the network and downloads the block chain, you can start " +"a miner in 'solo' mode." msgstr "" -"Il client BitCoin  stato iniziato con successo. è possibile adesso, inizializzare un minatore 'solo'." -#: guiminer.py:1903 +#: guiminer.py:1966 msgid "Launched ok." msgstr "Inizializzato con successo." -#: guiminer.py:1918 +#: guiminer.py:1981 #, python-format msgid "%s already exists. Overwrite?" msgstr "%s esiste di già. Rimpiazzare?" -#: guiminer.py:1919 +#: guiminer.py:1982 msgid "bitcoin.conf already exists." msgstr "bitcoin.conf esiste di già." -#: guiminer.py:1924 +#: guiminer.py:1987 msgid "Enter password" msgstr "Inserire password" -#: guiminer.py:1934 +#: guiminer.py:1997 msgid "Success" msgstr "Successo" -#: guiminer.py:1934 +#: guiminer.py:1997 msgid "Wrote bitcoin config ok." msgstr "BitCoin.conf impostato con successo." -#: guiminer.py:1945 +#: guiminer.py:2008 msgid "Console" msgstr "Console" -#: guiminer.py:1957 +#: guiminer.py:2020 msgid "Summary" msgstr "Riassunto" -#: guiminer.py:1970 +#: guiminer.py:2033 msgid "Rename miner" msgstr "Rinomina minatore" -#: guiminer.py:1970 +#: guiminer.py:2033 msgid "Rename to:" msgstr "Rinomina a:" -#: guiminer.py:1975 +#: guiminer.py:2038 msgid "Change language" msgstr "Cambia lingua" -#: guiminer.py:1995 +#: guiminer.py:2058 msgid "Choose language (requires restart to take full effect)" -msgstr "Impostare la lingua (un riavvio dell'programma è necessario per potere fare effetto.)" +msgstr "" +"Impostare la lingua (un riavvio dell'programma è necessario per potere fare " +"effetto.)" -#: guiminer.py:2040 +#: guiminer.py:2103 msgid "" -"Click the link below to log in to the pool and get a special token. \n" +"Click the link below to log in to the pool and get a special token.\n" "This token lets you securely check your balance.\n" "To remember this token for the future, save your miner settings." msgstr "" -"Clicca sul link qui sotto, per potere effettuare un login sulla miniera Bitcoin e poi ottenere un codice speicale. \n" -"Questo codice API permette di vedere il saldo, in completa sicurezza.\n" -"Per salvare questo codice API,  necessario salvare le impostazioni del minatore." -#: guiminer.py:2049 +#: guiminer.py:2112 msgid "(Paste token here)" msgstr "(Inserici il codice API qui)" -#: guiminer.py:2075 +#: guiminer.py:2138 msgid "Copy address to clipboard" msgstr "Copiare l'indirizzo" -#: guiminer.py:2094 +#: guiminer.py:2157 msgid "No OpenCL devices found." msgstr "Nessun dispositivo OpenCL trovato." -#: guiminer.py:2097 +#: guiminer.py:2160 msgid "" "No OpenCL devices were found.\n" " If you only want to mine using CPU or CUDA, you can ignore this message.\n" @@ -741,14 +765,39 @@ msgid "" " SDK, or your GPU may not support OpenCL." msgstr "" "Nessun dispositivo OpenCL trovato.\n" -" Per minare solo con CUDA o con il processore, ignorare questo messagio. -" Per minare con una cartina grafica AT,  necessario installare il ATI " -"Stream\n" +" Per minare solo con CUDA o con il processore, ignorare questo messagio. Per " +"minare con una cartina grafica AT,  necessario installare il ATI Stream\n" " SDK, o la cartina forse non supporta OpenCL." -#: guiminer.py:2107 +#: guiminer.py:2170 msgid "Don't show this message again" msgstr "Non fare più vedere questo messagio" +#~ msgid "Bad response from servon confeer." +#~ msgstr "Risposta invalida dall'server." + +#~ msgid "Your miner username (not your account username).cExample: Kiv.GPU" +#~ msgstr "" +#~ "Il username dell'lavoratore (non il username dell'conto).\n" +#~ "Esempio: Kiv.GPU" + +#~ msgid "" +#~ "Client launched ok. You can start a miner now with the server set to " +#~ "'solo'." +#~ msgstr "" +#~ "Il client BitCoin  stato iniziato con successo. è possibile adesso, " +#~ "inizializzare un minatore 'solo'." + +#~ msgid "" +#~ "Click the link below to log in to the pool and get a special token. \n" +#~ "This token lets you securely check your balance.\n" +#~ "To remember this token for the future, save your miner settings." +#~ msgstr "" +#~ "Clicca sul link qui sotto, per potere effettuare un login sulla miniera " +#~ "Bitcoin e poi ottenere un codice speicale. \n" +#~ "Questo codice API permette di vedere il saldo, in completa sicurezza.\n" +#~ "Per salvare questo codice API,  necessario salvare le impostazioni del " +#~ "minatore." + #~ msgid "%s mining!" -#~ msgstr "%s scavando!" \ No newline at end of file +#~ msgstr "%s scavando!" diff --git a/guiminer_ru.po b/guiminer_ru.po index d2347e9..a8514d1 100644 --- a/guiminer_ru.po +++ b/guiminer_ru.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 15:18-0300\n" +"POT-Creation-Date: 2011-06-14 22:43-0300\n" "PO-Revision-Date: 2011-06-10 12:42-0400\n" "Last-Translator: Chris MacLeod \n" "Language-Team: Russian\n" @@ -10,7 +10,7 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: guiminer.py:89 +#: guiminer.py:90 #, python-format msgid "" "GUIMiner\n" @@ -51,224 +51,224 @@ msgstr "" "Даже один битцент полезен, и помогает мотивировать\n" "дальнейшую работу над этой программой.\n" -#: guiminer.py:110 +#: guiminer.py:111 msgid "Not started" msgstr "Не запущен" -#: guiminer.py:111 +#: guiminer.py:112 msgid "Starting..." msgstr "Запускается..." -#: guiminer.py:112 +#: guiminer.py:113 msgid "Stopped" msgstr "Остановлен" -#: guiminer.py:113 +#: guiminer.py:114 msgid "Paused" msgstr "Пауза" -#: guiminer.py:114 +#: guiminer.py:115 msgid "Start mining!" msgstr "Старт!" -#: guiminer.py:115 +#: guiminer.py:116 msgid "Stop mining" msgstr "Стоп!" -#: guiminer.py:116 +#: guiminer.py:117 msgid "Refresh balance" msgstr "Проверить баланс" -#: guiminer.py:117 +#: guiminer.py:118 msgid "Connection error" msgstr "Ошибка связи" -#: guiminer.py:118 +#: guiminer.py:119 msgid "Username:" msgstr "Логин:" -#: guiminer.py:119 +#: guiminer.py:120 msgid "Password:" msgstr "Пароль:" -#: guiminer.py:120 +#: guiminer.py:121 msgid "Quit this program" msgstr "Выход из программы" -#: guiminer.py:121 +#: guiminer.py:122 msgid "Show about dialog" msgstr "Показать информацию о программе" -#: guiminer.py:202 +#: guiminer.py:203 #, python-format msgid "%.1f Ghash/s" msgstr "%.1f Ghash/s" -#: guiminer.py:204 +#: guiminer.py:205 #, python-format msgid "%.1f Mhash/s" msgstr "%.1f Mhash/s" -#: guiminer.py:206 +#: guiminer.py:207 msgid "Connecting..." msgstr "Соединяемся..." -#: guiminer.py:208 +#: guiminer.py:209 #, python-format msgid "%d khash/s" msgstr "%d khash/s" -#: guiminer.py:232 +#: guiminer.py:233 #, python-format msgid "Requesting balance: %(request)s" msgstr "Запрашивается баланс: %(request)s" -#: guiminer.py:236 +#: guiminer.py:237 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "Ответ сервера: %(status)s, %(data)s" -#: guiminer.py:303 +#: guiminer.py:304 msgid "Miner" msgstr "Генератор" -#: guiminer.py:304 +#: guiminer.py:305 msgid "Speed" msgstr "Скорость" -#: guiminer.py:305 +#: guiminer.py:306 msgid "Accepted" msgstr "Принято" -#: guiminer.py:306 +#: guiminer.py:307 msgid "Stale" msgstr "Сбой" -#: guiminer.py:307 +#: guiminer.py:308 msgid "Start/Stop" msgstr "Старт/Стоп" -#: guiminer.py:308 +#: guiminer.py:309 msgid "Autostart" msgstr "Автостарт" -#: guiminer.py:392 +#: guiminer.py:393 msgid "Pause all" msgstr "Приостановить все" -#: guiminer.py:394 +#: guiminer.py:395 msgid "Restore" msgstr "Восстановить" -#: guiminer.py:395 +#: guiminer.py:396 msgid "Close" msgstr "Закрыть" -#: guiminer.py:451 +#: guiminer.py:452 #, python-format msgid "Listener for \"%s\" started" msgstr "Прослушивание \"%s\" начато" -#: guiminer.py:466 +#: guiminer.py:467 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "Прослушивание \"%(name)s\": %(line)s" -#: guiminer.py:469 +#: guiminer.py:470 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "Прослушивание \"%s\" завершается" -#: guiminer.py:515 +#: guiminer.py:516 msgid "Server:" msgstr "Сервер:" -#: guiminer.py:520 +#: guiminer.py:521 msgid "Website:" msgstr "Вэбсайт:" -#: guiminer.py:522 +#: guiminer.py:523 msgid "Ext. Path:" msgstr "Вншн. путь:" -#: guiminer.py:524 +#: guiminer.py:525 msgid "Host:" msgstr "Хост:" -#: guiminer.py:526 +#: guiminer.py:527 msgid "Port:" msgstr "Порт:" -#: guiminer.py:532 +#: guiminer.py:533 msgid "Device:" msgstr "Устройство:" -#: guiminer.py:533 +#: guiminer.py:534 msgid "No OpenCL devices" msgstr "Нет OpenCL устройств" -#: guiminer.py:534 +#: guiminer.py:535 msgid "Extra flags:" msgstr "Доп. параметры:" -#: guiminer.py:537 +#: guiminer.py:538 msgid "CPU Affinity:" msgstr "" -#: guiminer.py:540 +#: guiminer.py:541 msgid "Balance:" msgstr "Баланс:" -#: guiminer.py:544 +#: guiminer.py:545 msgid "Withdraw" msgstr "Снять деньги" -#: guiminer.py:704 +#: guiminer.py:705 msgid "Default" msgstr "По умолчанию" -#: guiminer.py:755 +#: guiminer.py:756 msgid "Start" msgstr "Старт" -#: guiminer.py:755 +#: guiminer.py:756 msgid "Stop" msgstr "Стоп" -#: guiminer.py:771 +#: guiminer.py:772 msgid "Connection problems" msgstr "Сбой связи" -#: guiminer.py:930 +#: guiminer.py:931 msgid "Running command: " msgstr "Выполняется команда: " -#: guiminer.py:989 +#: guiminer.py:990 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "Хэши сложности 1: %(nhashes)d %(update_time)s" -#: guiminer.py:993 +#: guiminer.py:994 #, python-format msgid "Blocks: %d, " msgstr "Блоки: %d, " -#: guiminer.py:996 +#: guiminer.py:997 #, python-format msgid "Shares: %d accepted" msgstr "Доли: %d приняты" -#: guiminer.py:998 +#: guiminer.py:999 #, python-format msgid ", %d stale/invalid" msgstr ", %d дубли/сбойные" -#: guiminer.py:1020 +#: guiminer.py:1021 #, python-format msgid "- last at %s" msgstr "- последняя в %s" -#: guiminer.py:1093 +#: guiminer.py:1094 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." @@ -277,23 +277,23 @@ msgstr "" "процент.\n" "Подробней смотрите на их сайтах." -#: guiminer.py:1094 +#: guiminer.py:1095 msgid "Website of the currently selected server. Click to visit." msgstr "Вэбсайт выбранного сервера. Нажмите чтобы открыть." -#: guiminer.py:1095 +#: guiminer.py:1096 msgid "Available OpenCL devices on your system." msgstr "OpenCL устройства, доступные на вашей системе." -#: guiminer.py:1096 +#: guiminer.py:1097 msgid "Host address, without http:// prefix." msgstr "Адрес Хоста, без http:// префикса." -#: guiminer.py:1097 +#: guiminer.py:1098 msgid "Server port. This is usually 8332." msgstr "Порт сервера. Обычно 8332." -#: guiminer.py:1098 +#: guiminer.py:1099 msgid "" "The miner's username.\n" "May be different than your account username.\n" @@ -303,7 +303,7 @@ msgstr "" "Может отличаться от логина вашего аккаунта.\n" "Пример: Kiv.GPU" -#: guiminer.py:1099 +#: guiminer.py:1100 msgid "" "The miner's password.\n" "May be different than your account password." @@ -311,7 +311,7 @@ msgstr "" "Пароль генератора (miner password).\n" "Может отличаться от пароля вашего аккаунта." -#: guiminer.py:1100 +#: guiminer.py:1101 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" @@ -322,43 +322,43 @@ msgstr "" "-w128.\n" "По поводу других видеокарт - проверьте форум." -#: guiminer.py:1102 +#: guiminer.py:1103 msgid "" "CPU cores used for mining.\n" "Unchecking some cores can reduce high CPU usage in some systems." msgstr "" -#: guiminer.py:1196 guiminer.py:1290 guiminer.py:1311 +#: guiminer.py:1197 guiminer.py:1291 guiminer.py:1312 msgid "Auth token rejected by server." msgstr "Код авторизации не принят сервером" -#: guiminer.py:1214 +#: guiminer.py:1215 #, python-format msgid "%s confirmed" msgstr "%s подтверждено" -#: guiminer.py:1216 +#: guiminer.py:1217 #, python-format msgid ", %s unconfirmed" msgstr ", %s не подтверждено" -#: guiminer.py:1218 +#: guiminer.py:1219 msgid "Bad response from server." msgstr "Неправильный ответ сервера." -#: guiminer.py:1294 guiminer.py:1315 +#: guiminer.py:1295 guiminer.py:1316 msgid "Withdraw OK" msgstr "Выплата произведена" -#: guiminer.py:1485 +#: guiminer.py:1486 msgid "No registration is required - just enter an address and press Start." msgstr "Регистрации не требуется - введите ваш адрес и нажмите Старт." -#: guiminer.py:1487 +#: guiminer.py:1488 msgid "Address:" msgstr "Адрес:" -#: guiminer.py:1489 +#: guiminer.py:1490 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" @@ -366,7 +366,7 @@ msgstr "" "Ваш счет для получения Биткоинов.\n" "Пример: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" -#: guiminer.py:1505 +#: guiminer.py:1506 msgid "" "Your miner username (not your account username).\n" "Example: Kiv.GPU" @@ -374,11 +374,11 @@ msgstr "" "Логин генератора (miner username), может отличаться от логина аккаунта.\n" "Пример: Kiv.GPU" -#: guiminer.py:1507 guiminer.py:1528 +#: guiminer.py:1508 guiminer.py:1529 msgid "Your miner password (not your account password)." msgstr "Пароль генератора, может отличаться от пароля аккаунта ." -#: guiminer.py:1526 +#: guiminer.py:1527 msgid "" "Your miner username. \n" "Example: kiv123@kiv123" @@ -386,240 +386,240 @@ msgstr "" "Логин генератора. \n" "Например: kiv123@kiv123" -#: guiminer.py:1543 +#: guiminer.py:1544 msgid "The e-mail address you registered with." msgstr "Эл. почта под которой вы зарегистрировались." -#: guiminer.py:1544 +#: guiminer.py:1545 msgid "Email:" msgstr "Эмэйл:" -#: guiminer.py:1559 +#: guiminer.py:1560 msgid "&Rename..." msgstr "&Переименовать..." -#: guiminer.py:1559 +#: guiminer.py:1560 msgid "Rename this miner" msgstr "Переименовать этот генератор" -#: guiminer.py:1584 +#: guiminer.py:1585 msgid "&New OpenCL miner..." msgstr "&Создать OpenCL генератор..." -#: guiminer.py:1584 +#: guiminer.py:1585 msgid "Create a new OpenCL miner (default for ATI cards)" msgstr "Создать новый OpenCL генератор (по умолчанию для карт ATI)" -#: guiminer.py:1585 +#: guiminer.py:1586 msgid "Create a new Phoenix miner (for some ATI cards)" msgstr "Создать новый Phoenix генератор (для некоторых ATI карт)" -#: guiminer.py:1585 +#: guiminer.py:1586 msgid "New Phoenix miner..." msgstr "Создать Phoenix генератор..." -#: guiminer.py:1586 +#: guiminer.py:1587 msgid "Create a new CUDA miner (for NVIDIA cards)" msgstr "Создать CUDA генератор (для карт NVIDIA)" -#: guiminer.py:1586 +#: guiminer.py:1587 msgid "New CUDA miner..." msgstr "Создать CUDA генератор..." -#: guiminer.py:1587 +#: guiminer.py:1588 msgid "Create a new Ufasoft miner (for CPUs)" msgstr "Создать Ufasoft генератор (для CPU)" -#: guiminer.py:1587 +#: guiminer.py:1588 msgid "New Ufasoft CPU miner..." msgstr "Создать Ufasoft генератор..." -#: guiminer.py:1588 +#: guiminer.py:1589 msgid "Create a new custom miner (requires external program)" msgstr "" "Создать генератор использующий другой движок (требуется дополнительный софт)" -#: guiminer.py:1588 +#: guiminer.py:1589 msgid "New &other miner..." msgstr "Создать &другой генератор..." -#: guiminer.py:1589 +#: guiminer.py:1590 msgid "&New miner" msgstr "&Новый генератор" -#: guiminer.py:1590 +#: guiminer.py:1591 msgid "&Save settings" msgstr "&Сохранить настройки" -#: guiminer.py:1590 +#: guiminer.py:1591 msgid "Save your settings" msgstr "Сохранить текущие настройки генераторов" -#: guiminer.py:1591 +#: guiminer.py:1592 msgid "&Load settings" msgstr "&Загрузить настройки" -#: guiminer.py:1591 +#: guiminer.py:1592 msgid "Load stored settings" msgstr "Загрузить сохраненные настройки генераторов" -#: guiminer.py:1592 +#: guiminer.py:1593 msgid "Quit" msgstr "Выход" -#: guiminer.py:1593 +#: guiminer.py:1594 msgid "&File" msgstr "&Файл" -#: guiminer.py:1597 +#: guiminer.py:1598 msgid "Show summary" msgstr "Показать итоги" -#: guiminer.py:1597 +#: guiminer.py:1598 msgid "Show summary of all miners" msgstr "Показать таблицу со всеми генераторами" -#: guiminer.py:1598 +#: guiminer.py:1599 msgid "Show console" msgstr "Показать консоль" -#: guiminer.py:1598 +#: guiminer.py:1599 msgid "Show console logs" msgstr "Показать лог консоли" -#: guiminer.py:1599 +#: guiminer.py:1600 msgid "&View" msgstr "&Вид" -#: guiminer.py:1603 +#: guiminer.py:1604 msgid "&Create solo password..." msgstr "&Создать соло пароль..." -#: guiminer.py:1603 +#: guiminer.py:1604 msgid "Configure a user/pass for solo mining" msgstr "Настроить логин/пароль для генерирования в одиночку (без пула)" -#: guiminer.py:1604 +#: guiminer.py:1605 msgid "&Set Bitcoin client path..." msgstr "&Путь к клиенту Bitcoin..." -#: guiminer.py:1604 +#: guiminer.py:1605 msgid "Set the location of the official Bitcoin client" msgstr "Указать путь к официальному клиенту Bitcoin." -#: guiminer.py:1605 +#: guiminer.py:1606 msgid "&Launch Bitcoin client as server" msgstr "&Запустить Bitcoin клиент как сервер" -#: guiminer.py:1605 +#: guiminer.py:1606 msgid "Launch the official Bitcoin client as a server for solo mining" msgstr "" "Запустить официальный Bitcoin клиент в режиме сервера для одиночного " "генерирования" -#: guiminer.py:1606 +#: guiminer.py:1607 msgid "&Solo utilities" msgstr "&Соло режим" -#: guiminer.py:1610 +#: guiminer.py:1611 msgid "Start &minimized" msgstr "Запускать в трее" -#: guiminer.py:1610 +#: guiminer.py:1611 msgid "Start the GUI minimized to the tray." msgstr "Запускает GUI свернутым в трей" -#: guiminer.py:1612 +#: guiminer.py:1613 msgid "&Options" msgstr "&Настройки" -#: guiminer.py:1616 +#: guiminer.py:1617 msgid "&Change language..." msgstr "&Изменить язык..." -#: guiminer.py:1617 +#: guiminer.py:1618 msgid "Language" msgstr "Язык" -#: guiminer.py:1621 +#: guiminer.py:1622 msgid "&Donate 99 cents..." msgstr "&99 центов автору" -#: guiminer.py:1621 +#: guiminer.py:1622 msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" msgstr "" "Пожертвовать автору сумму BTC, равную по курсу 0,99$, чтобы поддержать " "развитие GUIminer" -#: guiminer.py:1622 +#: guiminer.py:1623 msgid "&Donate" msgstr "&Помочь" -#: guiminer.py:1625 +#: guiminer.py:1626 msgid "&About..." msgstr "&О программе" -#: guiminer.py:1627 +#: guiminer.py:1628 msgid "&Help" msgstr "&Помощь" -#: guiminer.py:1639 +#: guiminer.py:1640 msgid "Failed to load taskbar icon; continuing." msgstr "Не удалось загрузить иконку таскбара; продолжаю...." -#: guiminer.py:1648 +#: guiminer.py:1649 msgid "OpenCL not found - can't add a OpenCL miner" msgstr "OpenCL не обнаружен - нельзя добавить OpenCL генератор" -#: guiminer.py:1685 +#: guiminer.py:1686 #, python-format msgid "GUIMiner - v%s" msgstr "GUIMiner - v%s" -#: guiminer.py:1727 +#: guiminer.py:1728 msgid "Name this miner:" msgstr "Назовите генератор:" -#: guiminer.py:1727 +#: guiminer.py:1728 msgid "New miner" msgstr "&Новый генератор" -#: guiminer.py:1730 +#: guiminer.py:1731 msgid "Untitled" msgstr "Без имени" -#: guiminer.py:1741 +#: guiminer.py:1742 msgid "External miner (*.exe)|*.exe|(*.py)|*.py" msgstr "Внешний генератор (*.exe)|*.exe|(*.py)|*.py" -#: guiminer.py:1743 +#: guiminer.py:1744 msgid "Select external miner:" msgstr "Выберите внешний генератор:" -#: guiminer.py:1753 +#: guiminer.py:1754 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" msgstr "" "Неподдерживаемый внешний генератор %(filename)s. Поддерживаемые: %(supported)" "s" -#: guiminer.py:1755 +#: guiminer.py:1756 msgid "Miner not supported" msgstr "Генератор не поддерживается" -#: guiminer.py:1796 +#: guiminer.py:1797 msgid "Do you want to save changes?" msgstr "Сохранить настройки?" -#: guiminer.py:1796 +#: guiminer.py:1797 msgid "Save" msgstr "Сохранить" -#: guiminer.py:1826 +#: guiminer.py:1827 msgid "Saving: " msgstr "Сохранение: " -#: guiminer.py:1832 +#: guiminer.py:1833 #, python-format msgid "" "Couldn't write save file %s.\n" @@ -628,137 +628,133 @@ msgstr "" "Не могу записать файл %s.\n" "Проверьте, не указан ли для целевой папки параметр \"только для чтения" -#: guiminer.py:1833 +#: guiminer.py:1834 msgid "Save unsuccessful" msgstr "Сохранение не удалось" -#: guiminer.py:1835 +#: guiminer.py:1836 #, python-format msgid "Profiles saved OK to %s." msgstr "Профили успешно сохранены в %s." -#: guiminer.py:1836 +#: guiminer.py:1837 msgid "Save successful" msgstr "Сохранение успешно" -#: guiminer.py:1848 +#: guiminer.py:1849 #, python-format msgid "Loaded: %s" msgstr "Загружено: %s" -#: guiminer.py:1862 +#: guiminer.py:1863 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "Загрузка настроек остановит все текущие генераторы. Продолжить?" -#: guiminer.py:1863 +#: guiminer.py:1864 msgid "Load profile" msgstr "Загрузить настройки" -#: guiminer.py:1892 +#: guiminer.py:1893 msgid "Select path to Bitcoin.exe" msgstr "Указать расположение Bitcoin.exe" -#: guiminer.py:1904 +#: guiminer.py:1905 msgid "About" msgstr "О программе" -#: guiminer.py:1930 +#: guiminer.py:1931 msgid "Closing this miner will stop it. Continue?" msgstr "Закрытие генератора остановит его. Продолжить?" -#: guiminer.py:1931 +#: guiminer.py:1932 msgid "Close miner" msgstr "Закрыть генератор" -#: guiminer.py:1960 +#: guiminer.py:1961 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" msgstr "Не могу найти Bitcoin в %s. Путь указан правильно?" -#: guiminer.py:1961 +#: guiminer.py:1962 msgid "Launch failed" msgstr "Сбой запуска" -#: guiminer.py:1964 +#: guiminer.py:1965 msgid "" "The Bitcoin client will now launch in server mode.\n" "Once it connects to the network and downloads the block chain, you can start " "a miner in 'solo' mode." msgstr "" -#: guiminer.py:1965 +#: guiminer.py:1966 msgid "Launched ok." msgstr "Успешно запущено." -#: guiminer.py:1980 +#: guiminer.py:1981 #, python-format msgid "%s already exists. Overwrite?" msgstr "%s Уже существует. Перезаписать?" -#: guiminer.py:1981 +#: guiminer.py:1982 msgid "bitcoin.conf already exists." msgstr "bitcoin.conf уже существует." -#: guiminer.py:1986 +#: guiminer.py:1987 msgid "Enter password" msgstr "Введите пароль" -#: guiminer.py:1996 +#: guiminer.py:1997 msgid "Success" msgstr "Успешно" -#: guiminer.py:1996 +#: guiminer.py:1997 msgid "Wrote bitcoin config ok." msgstr "bitcoin.conf успешно записан." -#: guiminer.py:2007 +#: guiminer.py:2008 msgid "Console" msgstr "Консоль" -#: guiminer.py:2019 +#: guiminer.py:2020 msgid "Summary" msgstr "Итог" -#: guiminer.py:2032 +#: guiminer.py:2033 msgid "Rename miner" msgstr "Переименовать генератор" -#: guiminer.py:2032 +#: guiminer.py:2033 msgid "Rename to:" msgstr "Переименовать в:" -#: guiminer.py:2037 +#: guiminer.py:2038 msgid "Change language" msgstr "Изменить язык" -#: guiminer.py:2057 +#: guiminer.py:2058 msgid "Choose language (requires restart to take full effect)" msgstr "Выбрать другой язык (требуется перезапуск программы)" -#: guiminer.py:2102 +#: guiminer.py:2103 msgid "" -"Click the link below to log in to the pool and get a special token. \n" +"Click the link below to log in to the pool and get a special token.\n" "This token lets you securely check your balance.\n" "To remember this token for the future, save your miner settings." msgstr "" -"Нажмите ссылку ниже, чтобы войти в пул и получить специальный код (API " -"token). \n" -"Этот код позволяет проверять состояние баланса.\n" -"При сохранении настроек, код сохраняется." -#: guiminer.py:2111 +#: guiminer.py:2112 msgid "(Paste token here)" msgstr "(Копируйте код сюда)" -#: guiminer.py:2137 +#: guiminer.py:2138 msgid "Copy address to clipboard" msgstr "Копировать адрес в буфер обмена" -#: guiminer.py:2156 +#: guiminer.py:2157 msgid "No OpenCL devices found." msgstr "Не обнаружено OpenCL устройств." -#: guiminer.py:2159 +#: guiminer.py:2160 msgid "" "No OpenCL devices were found.\n" " If you only want to mine using CPU or CUDA, you can ignore this message.\n" @@ -772,10 +768,20 @@ msgstr "" "Если вы хотите генерировать на видеокартах ATI, нужно установить ATI Stream\n" "SDK. Или возможно, ваша карта не поддерживает OpenCL.\n" -#: guiminer.py:2169 +#: guiminer.py:2170 msgid "Don't show this message again" msgstr "Больше не показывать это сообщение." +#~ msgid "" +#~ "Click the link below to log in to the pool and get a special token. \n" +#~ "This token lets you securely check your balance.\n" +#~ "To remember this token for the future, save your miner settings." +#~ msgstr "" +#~ "Нажмите ссылку ниже, чтобы войти в пул и получить специальный код (API " +#~ "token). \n" +#~ "Этот код позволяет проверять состояние баланса.\n" +#~ "При сохранении настроек, код сохраняется." + #~ msgid "" #~ "Client launched ok. You can start a miner now with the server set to " #~ "'solo'." diff --git a/guiminer_zh.po b/guiminer_zh.po index b4148d1..0790ff5 100644 --- a/guiminer_zh.po +++ b/guiminer_zh.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 15:18-0300\n" +"POT-Creation-Date: 2011-06-14 22:43-0300\n" "PO-Revision-Date: \n" "Last-Translator: Dean Lee \n" "Language-Team: Chinese Simp \n" @@ -12,7 +12,7 @@ msgstr "" "X-Poedit-Basepath: /\n" "X-Poedit-Language: Chinese\n" -#: guiminer.py:89 +#: guiminer.py:90 #, python-format msgid "" "GUIMiner\n" @@ -53,224 +53,224 @@ msgstr "" "每一分 Bitcoin 都欢迎,\n" "它们将推动本软件的进一步开发。\n" -#: guiminer.py:110 +#: guiminer.py:111 msgid "Not started" msgstr "未启动" -#: guiminer.py:111 +#: guiminer.py:112 msgid "Starting..." msgstr "正在启动..." -#: guiminer.py:112 +#: guiminer.py:113 msgid "Stopped" msgstr "已停止" -#: guiminer.py:113 +#: guiminer.py:114 msgid "Paused" msgstr "已暂停" -#: guiminer.py:114 +#: guiminer.py:115 msgid "Start mining!" msgstr "开始采矿!" -#: guiminer.py:115 +#: guiminer.py:116 msgid "Stop mining" msgstr "停止采矿" -#: guiminer.py:116 +#: guiminer.py:117 msgid "Refresh balance" msgstr "刷新余额" -#: guiminer.py:117 +#: guiminer.py:118 msgid "Connection error" msgstr "连接错误" -#: guiminer.py:118 +#: guiminer.py:119 msgid "Username:" msgstr "用户名:" -#: guiminer.py:119 +#: guiminer.py:120 msgid "Password:" msgstr "密码:" -#: guiminer.py:120 +#: guiminer.py:121 msgid "Quit this program" msgstr "退出本程序" -#: guiminer.py:121 +#: guiminer.py:122 msgid "Show about dialog" msgstr "显示关于窗口" -#: guiminer.py:202 +#: guiminer.py:203 #, python-format msgid "%.1f Ghash/s" msgstr "%.1f Ghash/s" -#: guiminer.py:204 +#: guiminer.py:205 #, python-format msgid "%.1f Mhash/s" msgstr "%.1f Mhash/s" -#: guiminer.py:206 +#: guiminer.py:207 msgid "Connecting..." msgstr "正在连接..." -#: guiminer.py:208 +#: guiminer.py:209 #, python-format msgid "%d khash/s" msgstr "%d khash/s" -#: guiminer.py:232 +#: guiminer.py:233 #, python-format msgid "Requesting balance: %(request)s" msgstr "正在请求余额: %(request)s" -#: guiminer.py:236 +#: guiminer.py:237 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "服务器回复: %(status)s, %(data)s" -#: guiminer.py:303 +#: guiminer.py:304 msgid "Miner" msgstr "采矿器" -#: guiminer.py:304 +#: guiminer.py:305 msgid "Speed" msgstr "速度" -#: guiminer.py:305 +#: guiminer.py:306 msgid "Accepted" msgstr "已接受" -#: guiminer.py:306 +#: guiminer.py:307 msgid "Stale" msgstr "过时" -#: guiminer.py:307 +#: guiminer.py:308 msgid "Start/Stop" msgstr "启动/停止" -#: guiminer.py:308 +#: guiminer.py:309 msgid "Autostart" msgstr "自动启动" -#: guiminer.py:392 +#: guiminer.py:393 msgid "Pause all" msgstr "全部暂停" -#: guiminer.py:394 +#: guiminer.py:395 msgid "Restore" msgstr "恢复" -#: guiminer.py:395 +#: guiminer.py:396 msgid "Close" msgstr "关闭" -#: guiminer.py:451 +#: guiminer.py:452 #, python-format msgid "Listener for \"%s\" started" msgstr "\"%s\" 监听器已启动" -#: guiminer.py:466 +#: guiminer.py:467 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "\"%(name)s\" 监听器已启动: %(line)s" -#: guiminer.py:469 +#: guiminer.py:470 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "\"%s\" 监听器正在关闭" -#: guiminer.py:515 +#: guiminer.py:516 msgid "Server:" msgstr "服务器:" -#: guiminer.py:520 +#: guiminer.py:521 msgid "Website:" msgstr "网站:" -#: guiminer.py:522 +#: guiminer.py:523 msgid "Ext. Path:" msgstr "外部路径:" -#: guiminer.py:524 +#: guiminer.py:525 msgid "Host:" msgstr "主机:" -#: guiminer.py:526 +#: guiminer.py:527 msgid "Port:" msgstr "端口:" -#: guiminer.py:532 +#: guiminer.py:533 msgid "Device:" msgstr "设备:" -#: guiminer.py:533 +#: guiminer.py:534 msgid "No OpenCL devices" msgstr "无 OpenCL 设备" -#: guiminer.py:534 +#: guiminer.py:535 msgid "Extra flags:" msgstr "附加参数:" -#: guiminer.py:537 +#: guiminer.py:538 msgid "CPU Affinity:" msgstr "" -#: guiminer.py:540 +#: guiminer.py:541 msgid "Balance:" msgstr "余额:" -#: guiminer.py:544 +#: guiminer.py:545 msgid "Withdraw" msgstr "取款" -#: guiminer.py:704 +#: guiminer.py:705 msgid "Default" msgstr "默认" -#: guiminer.py:755 +#: guiminer.py:756 msgid "Start" msgstr "启动" -#: guiminer.py:755 +#: guiminer.py:756 msgid "Stop" msgstr "停止" -#: guiminer.py:771 +#: guiminer.py:772 msgid "Connection problems" msgstr "连接问题" -#: guiminer.py:930 +#: guiminer.py:931 msgid "Running command: " msgstr "正在运行命令: " -#: guiminer.py:989 +#: guiminer.py:990 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "难度为 1 的 hash: %(nhashes)d %(update_time)s" -#: guiminer.py:993 +#: guiminer.py:994 #, python-format msgid "Blocks: %d, " msgstr "块: %d, " -#: guiminer.py:996 +#: guiminer.py:997 #, python-format msgid "Shares: %d accepted" msgstr "贡献: %d 已接受" -#: guiminer.py:998 +#: guiminer.py:999 #, python-format msgid ", %d stale/invalid" msgstr ", %d 过时/无效" -#: guiminer.py:1020 +#: guiminer.py:1021 #, python-format msgid "- last at %s" msgstr "- 更新于 %s" -#: guiminer.py:1093 +#: guiminer.py:1094 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." @@ -278,23 +278,23 @@ msgstr "" "要连接到的服务器。不同的服务器有不同的费用与功能。\n" "完整信息请查看其网站。" -#: guiminer.py:1094 +#: guiminer.py:1095 msgid "Website of the currently selected server. Click to visit." msgstr "当前所选服务器的网站。点击可访问。" -#: guiminer.py:1095 +#: guiminer.py:1096 msgid "Available OpenCL devices on your system." msgstr "您系统中可用的 OpenCL 设备。" -#: guiminer.py:1096 +#: guiminer.py:1097 msgid "Host address, without http:// prefix." msgstr "主机地址,无需 http:// 前缀。" -#: guiminer.py:1097 +#: guiminer.py:1098 msgid "Server port. This is usually 8332." msgstr "服务器端口。通常为 8332。" -#: guiminer.py:1098 +#: guiminer.py:1099 msgid "" "The miner's username.\n" "May be different than your account username.\n" @@ -304,7 +304,7 @@ msgstr "" "可以与账号用户名不同。\n" "示例: Kiv.GPU" -#: guiminer.py:1099 +#: guiminer.py:1100 msgid "" "The miner's password.\n" "May be different than your account password." @@ -312,7 +312,7 @@ msgstr "" "采矿器的密码。\n" "可以与账号密码不同。" -#: guiminer.py:1100 +#: guiminer.py:1101 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" @@ -322,43 +322,43 @@ msgstr "" "Radeon HD 5xxx 系列可使用 -v -w128 获取最佳效果。\n" "其他显卡的参数参见论坛。" -#: guiminer.py:1102 +#: guiminer.py:1103 msgid "" "CPU cores used for mining.\n" "Unchecking some cores can reduce high CPU usage in some systems." msgstr "" -#: guiminer.py:1196 guiminer.py:1290 guiminer.py:1311 +#: guiminer.py:1197 guiminer.py:1291 guiminer.py:1312 msgid "Auth token rejected by server." msgstr "身份认证 token 被服务器拒绝。" -#: guiminer.py:1214 +#: guiminer.py:1215 #, python-format msgid "%s confirmed" msgstr "%s 已确认" -#: guiminer.py:1216 +#: guiminer.py:1217 #, python-format msgid ", %s unconfirmed" msgstr ", %s 未确认" -#: guiminer.py:1218 +#: guiminer.py:1219 msgid "Bad response from server." msgstr "服务器响应错误。" -#: guiminer.py:1294 guiminer.py:1315 +#: guiminer.py:1295 guiminer.py:1316 msgid "Withdraw OK" msgstr "取款成功" -#: guiminer.py:1485 +#: guiminer.py:1486 msgid "No registration is required - just enter an address and press Start." msgstr "无需注册 - 只需输入地址并按“启动”。" -#: guiminer.py:1487 +#: guiminer.py:1488 msgid "Address:" msgstr "地址:" -#: guiminer.py:1489 +#: guiminer.py:1490 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" @@ -366,7 +366,7 @@ msgstr "" "您接收 Bitcoins 的地址。\n" "例如: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" -#: guiminer.py:1505 +#: guiminer.py:1506 msgid "" "Your miner username (not your account username).\n" "Example: Kiv.GPU" @@ -374,11 +374,11 @@ msgstr "" "您的采矿器用户名 (不是账号用户名)。\n" "示例: Kiv.GPU" -#: guiminer.py:1507 guiminer.py:1528 +#: guiminer.py:1508 guiminer.py:1529 msgid "Your miner password (not your account password)." msgstr "您的采矿器密码 (不是账号密码)。" -#: guiminer.py:1526 +#: guiminer.py:1527 msgid "" "Your miner username. \n" "Example: kiv123@kiv123" @@ -386,233 +386,233 @@ msgstr "" "您的采矿器用户名。\n" "示例: kiv123@kiv123" -#: guiminer.py:1543 +#: guiminer.py:1544 msgid "The e-mail address you registered with." msgstr "您注册时使用的 e-mail 地址。" -#: guiminer.py:1544 +#: guiminer.py:1545 msgid "Email:" msgstr "Email:" -#: guiminer.py:1559 +#: guiminer.py:1560 msgid "&Rename..." msgstr "重命名(&R)..." -#: guiminer.py:1559 +#: guiminer.py:1560 msgid "Rename this miner" msgstr "重命名该采矿器" -#: guiminer.py:1584 +#: guiminer.py:1585 msgid "&New OpenCL miner..." msgstr "新建 OpenCL 采矿器(&N)..." -#: guiminer.py:1584 +#: guiminer.py:1585 msgid "Create a new OpenCL miner (default for ATI cards)" msgstr "创建一个新的 OpenCL 采矿器 (默认为 ATI 显卡)" -#: guiminer.py:1585 +#: guiminer.py:1586 msgid "Create a new Phoenix miner (for some ATI cards)" msgstr "创建一个新的 Phoenix 采矿器(部分 ATI 显卡)" -#: guiminer.py:1585 +#: guiminer.py:1586 msgid "New Phoenix miner..." msgstr "新建 Phoenix 采矿器..." -#: guiminer.py:1586 +#: guiminer.py:1587 msgid "Create a new CUDA miner (for NVIDIA cards)" msgstr "创建一个新的 CUDA 采矿器 (NVIDIA 显卡)" -#: guiminer.py:1586 +#: guiminer.py:1587 msgid "New CUDA miner..." msgstr "新建 CUDA 采矿器..." -#: guiminer.py:1587 +#: guiminer.py:1588 msgid "Create a new Ufasoft miner (for CPUs)" msgstr "创建一个新的 Ufasoft 采矿器 (CPU)" -#: guiminer.py:1587 +#: guiminer.py:1588 msgid "New Ufasoft CPU miner..." msgstr "新建 Ufasoft CPU 采矿器..." -#: guiminer.py:1588 +#: guiminer.py:1589 msgid "Create a new custom miner (requires external program)" msgstr "创建一个新的自定义采矿器 (需要外部程序)" -#: guiminer.py:1588 +#: guiminer.py:1589 msgid "New &other miner..." msgstr "新建其他采矿器(&O)..." -#: guiminer.py:1589 +#: guiminer.py:1590 msgid "&New miner" msgstr "" -#: guiminer.py:1590 +#: guiminer.py:1591 msgid "&Save settings" msgstr "保存设置(&S)" -#: guiminer.py:1590 +#: guiminer.py:1591 msgid "Save your settings" msgstr "保存您的设置" -#: guiminer.py:1591 +#: guiminer.py:1592 msgid "&Load settings" msgstr "加载设置(&L)" -#: guiminer.py:1591 +#: guiminer.py:1592 msgid "Load stored settings" msgstr "加载已储存的设置" -#: guiminer.py:1592 +#: guiminer.py:1593 msgid "Quit" msgstr "退出" -#: guiminer.py:1593 +#: guiminer.py:1594 msgid "&File" msgstr "文件(&F)" -#: guiminer.py:1597 +#: guiminer.py:1598 msgid "Show summary" msgstr "显示概览" -#: guiminer.py:1597 +#: guiminer.py:1598 msgid "Show summary of all miners" msgstr "显示全部采矿器的概览" -#: guiminer.py:1598 +#: guiminer.py:1599 msgid "Show console" msgstr "显示终端" -#: guiminer.py:1598 +#: guiminer.py:1599 msgid "Show console logs" msgstr "显示终端日志" -#: guiminer.py:1599 +#: guiminer.py:1600 msgid "&View" msgstr "查看(&V)" -#: guiminer.py:1603 +#: guiminer.py:1604 msgid "&Create solo password..." msgstr "创建独自采矿密码(&C)..." -#: guiminer.py:1603 +#: guiminer.py:1604 msgid "Configure a user/pass for solo mining" msgstr "配置独自采矿的用户名/密码" -#: guiminer.py:1604 +#: guiminer.py:1605 msgid "&Set Bitcoin client path..." msgstr "设置 Bitcoin 客户端路径(&S)..." -#: guiminer.py:1604 +#: guiminer.py:1605 msgid "Set the location of the official Bitcoin client" msgstr "设置官方 Bitcoin 客户端的位置" -#: guiminer.py:1605 +#: guiminer.py:1606 msgid "&Launch Bitcoin client as server" msgstr "将 Bitcoin 客户端作为服务器启动(&L)" -#: guiminer.py:1605 +#: guiminer.py:1606 msgid "Launch the official Bitcoin client as a server for solo mining" msgstr "将官方 Bitcoin 客户端作为独自采矿的服务器启动" -#: guiminer.py:1606 +#: guiminer.py:1607 msgid "&Solo utilities" msgstr "独自采矿(&S)" -#: guiminer.py:1610 +#: guiminer.py:1611 msgid "Start &minimized" msgstr "启动时最小化(&M)" -#: guiminer.py:1610 +#: guiminer.py:1611 msgid "Start the GUI minimized to the tray." msgstr "启动 GUI 时最小化到托盘区。" -#: guiminer.py:1612 +#: guiminer.py:1613 msgid "&Options" msgstr "选项(&O)" -#: guiminer.py:1616 +#: guiminer.py:1617 msgid "&Change language..." msgstr "更改语言(&C)..." -#: guiminer.py:1617 +#: guiminer.py:1618 msgid "Language" msgstr "语言" -#: guiminer.py:1621 +#: guiminer.py:1622 msgid "&Donate 99 cents..." msgstr "捐助 99 美分(&D)..." -#: guiminer.py:1621 +#: guiminer.py:1622 msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" msgstr "捐助 $0.99 美元的 Bitcoins 以支持 GUIMiner 的开发" -#: guiminer.py:1622 +#: guiminer.py:1623 msgid "&Donate" msgstr "捐助(&D)" -#: guiminer.py:1625 +#: guiminer.py:1626 msgid "&About..." msgstr "关于(&A)..." -#: guiminer.py:1627 +#: guiminer.py:1628 msgid "&Help" msgstr "帮助(&H)" -#: guiminer.py:1639 +#: guiminer.py:1640 msgid "Failed to load taskbar icon; continuing." msgstr "无法加载任务栏图标; 正在继续。" -#: guiminer.py:1648 +#: guiminer.py:1649 msgid "OpenCL not found - can't add a OpenCL miner" msgstr "未找到 OpenCL - 无法添加 OpenCL 采矿器" -#: guiminer.py:1685 +#: guiminer.py:1686 #, python-format msgid "GUIMiner - v%s" msgstr "GUIMiner - v%s" -#: guiminer.py:1727 +#: guiminer.py:1728 msgid "Name this miner:" msgstr "为该采矿器命名:" -#: guiminer.py:1727 +#: guiminer.py:1728 msgid "New miner" msgstr "新建采矿器" -#: guiminer.py:1730 +#: guiminer.py:1731 msgid "Untitled" msgstr "无标题" -#: guiminer.py:1741 +#: guiminer.py:1742 msgid "External miner (*.exe)|*.exe|(*.py)|*.py" msgstr "外部采矿器 (*.exe)|*.exe|(*.py)|*.py" -#: guiminer.py:1743 +#: guiminer.py:1744 msgid "Select external miner:" msgstr "选择外部采矿器:" -#: guiminer.py:1753 +#: guiminer.py:1754 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" msgstr "不支持的外部采矿器 %(filename)s。支持: %(supported)s" -#: guiminer.py:1755 +#: guiminer.py:1756 msgid "Miner not supported" msgstr "采矿器不支持" -#: guiminer.py:1796 +#: guiminer.py:1797 msgid "Do you want to save changes?" msgstr "是否希望保存变更?" -#: guiminer.py:1796 +#: guiminer.py:1797 msgid "Save" msgstr "保存" -#: guiminer.py:1826 +#: guiminer.py:1827 msgid "Saving: " msgstr "正在保存: " -#: guiminer.py:1832 +#: guiminer.py:1833 #, python-format msgid "" "Couldn't write save file %s.\n" @@ -621,136 +621,133 @@ msgstr "" "无法写入保存文件 %s。\n" "检查其位置是否可写。" -#: guiminer.py:1833 +#: guiminer.py:1834 msgid "Save unsuccessful" msgstr "保存失败" -#: guiminer.py:1835 +#: guiminer.py:1836 #, python-format msgid "Profiles saved OK to %s." msgstr "配置文件成功保存于 %s。" -#: guiminer.py:1836 +#: guiminer.py:1837 msgid "Save successful" msgstr "保存成功" -#: guiminer.py:1848 +#: guiminer.py:1849 #, python-format msgid "Loaded: %s" msgstr "已加载: %s" -#: guiminer.py:1862 +#: guiminer.py:1863 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "加载配置文件将停止当前正在运行的全部采矿器。是否继续?" -#: guiminer.py:1863 +#: guiminer.py:1864 msgid "Load profile" msgstr "加载配置文件" -#: guiminer.py:1892 +#: guiminer.py:1893 msgid "Select path to Bitcoin.exe" msgstr "选择 Bitcoin.exe 的路径" -#: guiminer.py:1904 +#: guiminer.py:1905 msgid "About" msgstr "关于" -#: guiminer.py:1930 +#: guiminer.py:1931 msgid "Closing this miner will stop it. Continue?" msgstr "关闭该采矿器将停止其采矿。是否继续?" -#: guiminer.py:1931 +#: guiminer.py:1932 msgid "Close miner" msgstr "关闭采矿器" -#: guiminer.py:1960 +#: guiminer.py:1961 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" msgstr "无法在 %s 找到 Bitcoin。您的路径设置是否正确?" -#: guiminer.py:1961 +#: guiminer.py:1962 msgid "Launch failed" msgstr "启动失败" -#: guiminer.py:1964 +#: guiminer.py:1965 msgid "" "The Bitcoin client will now launch in server mode.\n" "Once it connects to the network and downloads the block chain, you can start " "a miner in 'solo' mode." msgstr "" -#: guiminer.py:1965 +#: guiminer.py:1966 msgid "Launched ok." msgstr "启动成功。" -#: guiminer.py:1980 +#: guiminer.py:1981 #, python-format msgid "%s already exists. Overwrite?" msgstr "%s 已存在。是否覆写?" -#: guiminer.py:1981 +#: guiminer.py:1982 msgid "bitcoin.conf already exists." msgstr "bitcoin.conf 已存在。" -#: guiminer.py:1986 +#: guiminer.py:1987 msgid "Enter password" msgstr "输入密码" -#: guiminer.py:1996 +#: guiminer.py:1997 msgid "Success" msgstr "成功" -#: guiminer.py:1996 +#: guiminer.py:1997 msgid "Wrote bitcoin config ok." msgstr "写入 bitcoin 配置成功。" -#: guiminer.py:2007 +#: guiminer.py:2008 msgid "Console" msgstr "终端" -#: guiminer.py:2019 +#: guiminer.py:2020 msgid "Summary" msgstr "概览" -#: guiminer.py:2032 +#: guiminer.py:2033 msgid "Rename miner" msgstr "重命名采矿器" -#: guiminer.py:2032 +#: guiminer.py:2033 msgid "Rename to:" msgstr "重命名为:" -#: guiminer.py:2037 +#: guiminer.py:2038 msgid "Change language" msgstr "更改语言" -#: guiminer.py:2057 +#: guiminer.py:2058 msgid "Choose language (requires restart to take full effect)" msgstr "选择语言 (需要重新启动方可完全生效)" -#: guiminer.py:2102 +#: guiminer.py:2103 msgid "" -"Click the link below to log in to the pool and get a special token. \n" +"Click the link below to log in to the pool and get a special token.\n" "This token lets you securely check your balance.\n" "To remember this token for the future, save your miner settings." msgstr "" -"点击下面的连接并登录矿场获取特别的 token。\n" -"该 token 允许您安全地检查余额。\n" -"要记住该 token 供日后使用,请保存采矿器设置。" -#: guiminer.py:2111 +#: guiminer.py:2112 msgid "(Paste token here)" msgstr "(在此粘贴 token)" -#: guiminer.py:2137 +#: guiminer.py:2138 msgid "Copy address to clipboard" msgstr "复制地址到剪贴板" -#: guiminer.py:2156 +#: guiminer.py:2157 msgid "No OpenCL devices found." msgstr "未找到 OpenCL 设备。" -#: guiminer.py:2159 +#: guiminer.py:2160 msgid "" "No OpenCL devices were found.\n" " If you only want to mine using CPU or CUDA, you can ignore this message.\n" @@ -763,10 +760,19 @@ msgstr "" " 如果您想用 ATI 显卡采矿,可能需要安装 ATI Stream SDK,\n" " 若已安装,可能您的 GPU 不支持 OpenCL。" -#: guiminer.py:2169 +#: guiminer.py:2170 msgid "Don't show this message again" msgstr "不要再次显示本信息" +#~ msgid "" +#~ "Click the link below to log in to the pool and get a special token. \n" +#~ "This token lets you securely check your balance.\n" +#~ "To remember this token for the future, save your miner settings." +#~ msgstr "" +#~ "点击下面的连接并登录矿场获取特别的 token。\n" +#~ "该 token 允许您安全地检查余额。\n" +#~ "要记住该 token 供日后使用,请保存采矿器设置。" + #~ msgid "" #~ "Client launched ok. You can start a miner now with the server set to " #~ "'solo'." diff --git a/messages.pot b/messages.pot index 3115fb6..3ceb408 100644 --- a/messages.pot +++ b/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-10 15:18-0300\n" +"POT-Creation-Date: 2011-06-14 22:52-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: guiminer.py:89 +#: guiminer.py:90 #, python-format msgid "" "GUIMiner\n" @@ -39,682 +39,682 @@ msgid "" "further work on this software.\n" msgstr "" -#: guiminer.py:110 +#: guiminer.py:111 msgid "Not started" msgstr "" -#: guiminer.py:111 +#: guiminer.py:112 msgid "Starting..." msgstr "" -#: guiminer.py:112 +#: guiminer.py:113 msgid "Stopped" msgstr "" -#: guiminer.py:113 +#: guiminer.py:114 msgid "Paused" msgstr "" -#: guiminer.py:114 +#: guiminer.py:115 msgid "Start mining!" msgstr "" -#: guiminer.py:115 +#: guiminer.py:116 msgid "Stop mining" msgstr "" -#: guiminer.py:116 +#: guiminer.py:117 msgid "Refresh balance" msgstr "" -#: guiminer.py:117 +#: guiminer.py:118 msgid "Connection error" msgstr "" -#: guiminer.py:118 +#: guiminer.py:119 msgid "Username:" msgstr "" -#: guiminer.py:119 +#: guiminer.py:120 msgid "Password:" msgstr "" -#: guiminer.py:120 +#: guiminer.py:121 msgid "Quit this program" msgstr "" -#: guiminer.py:121 +#: guiminer.py:122 msgid "Show about dialog" msgstr "" -#: guiminer.py:202 +#: guiminer.py:203 #, python-format msgid "%.1f Ghash/s" msgstr "" -#: guiminer.py:204 +#: guiminer.py:205 #, python-format msgid "%.1f Mhash/s" msgstr "" -#: guiminer.py:206 +#: guiminer.py:207 msgid "Connecting..." msgstr "" -#: guiminer.py:208 +#: guiminer.py:209 #, python-format msgid "%d khash/s" msgstr "" -#: guiminer.py:232 +#: guiminer.py:233 #, python-format msgid "Requesting balance: %(request)s" msgstr "" -#: guiminer.py:236 +#: guiminer.py:237 #, python-format msgid "Server replied: %(status)s, %(data)s" msgstr "" -#: guiminer.py:303 +#: guiminer.py:304 msgid "Miner" msgstr "" -#: guiminer.py:304 +#: guiminer.py:305 msgid "Speed" msgstr "" -#: guiminer.py:305 +#: guiminer.py:306 msgid "Accepted" msgstr "" -#: guiminer.py:306 +#: guiminer.py:307 msgid "Stale" msgstr "" -#: guiminer.py:307 +#: guiminer.py:308 msgid "Start/Stop" msgstr "" -#: guiminer.py:308 +#: guiminer.py:309 msgid "Autostart" msgstr "" -#: guiminer.py:392 +#: guiminer.py:393 msgid "Pause all" msgstr "" -#: guiminer.py:394 +#: guiminer.py:395 msgid "Restore" msgstr "" -#: guiminer.py:395 +#: guiminer.py:396 msgid "Close" msgstr "" -#: guiminer.py:451 +#: guiminer.py:452 #, python-format msgid "Listener for \"%s\" started" msgstr "" -#: guiminer.py:466 +#: guiminer.py:467 #, python-format msgid "Listener for \"%(name)s\": %(line)s" msgstr "" -#: guiminer.py:469 +#: guiminer.py:470 #, python-format msgid "Listener for \"%s\" shutting down" msgstr "" -#: guiminer.py:515 +#: guiminer.py:516 msgid "Server:" msgstr "" -#: guiminer.py:520 +#: guiminer.py:521 msgid "Website:" msgstr "" -#: guiminer.py:522 +#: guiminer.py:523 msgid "Ext. Path:" msgstr "" -#: guiminer.py:524 +#: guiminer.py:525 msgid "Host:" msgstr "" -#: guiminer.py:526 +#: guiminer.py:527 msgid "Port:" msgstr "" -#: guiminer.py:532 +#: guiminer.py:533 msgid "Device:" msgstr "" -#: guiminer.py:533 +#: guiminer.py:534 msgid "No OpenCL devices" msgstr "" -#: guiminer.py:534 +#: guiminer.py:535 msgid "Extra flags:" msgstr "" -#: guiminer.py:537 +#: guiminer.py:538 msgid "CPU Affinity:" msgstr "" -#: guiminer.py:540 +#: guiminer.py:541 msgid "Balance:" msgstr "" -#: guiminer.py:544 +#: guiminer.py:545 msgid "Withdraw" msgstr "" -#: guiminer.py:704 +#: guiminer.py:705 msgid "Default" msgstr "" -#: guiminer.py:755 +#: guiminer.py:756 msgid "Start" msgstr "" -#: guiminer.py:755 +#: guiminer.py:756 msgid "Stop" msgstr "" -#: guiminer.py:771 +#: guiminer.py:772 msgid "Connection problems" msgstr "" -#: guiminer.py:930 +#: guiminer.py:931 msgid "Running command: " msgstr "" -#: guiminer.py:989 +#: guiminer.py:990 #, python-format msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" msgstr "" -#: guiminer.py:993 +#: guiminer.py:994 #, python-format msgid "Blocks: %d, " msgstr "" -#: guiminer.py:996 +#: guiminer.py:997 #, python-format msgid "Shares: %d accepted" msgstr "" -#: guiminer.py:998 +#: guiminer.py:999 #, python-format msgid ", %d stale/invalid" msgstr "" -#: guiminer.py:1020 +#: guiminer.py:1021 #, python-format msgid "- last at %s" msgstr "" -#: guiminer.py:1093 +#: guiminer.py:1094 msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." msgstr "" -#: guiminer.py:1094 +#: guiminer.py:1095 msgid "Website of the currently selected server. Click to visit." msgstr "" -#: guiminer.py:1095 +#: guiminer.py:1096 msgid "Available OpenCL devices on your system." msgstr "" -#: guiminer.py:1096 +#: guiminer.py:1097 msgid "Host address, without http:// prefix." msgstr "" -#: guiminer.py:1097 +#: guiminer.py:1098 msgid "Server port. This is usually 8332." msgstr "" -#: guiminer.py:1098 +#: guiminer.py:1099 msgid "" "The miner's username.\n" "May be different than your account username.\n" "Example: Kiv.GPU" msgstr "" -#: guiminer.py:1099 +#: guiminer.py:1100 msgid "" "The miner's password.\n" "May be different than your account password." msgstr "" -#: guiminer.py:1100 +#: guiminer.py:1101 msgid "" "Extra flags to pass to the miner.\n" "For Radeon HD 5xxx series use -v -w128 for best results.\n" "For other cards consult the forum." msgstr "" -#: guiminer.py:1102 +#: guiminer.py:1103 msgid "" "CPU cores used for mining.\n" "Unchecking some cores can reduce high CPU usage in some systems." msgstr "" -#: guiminer.py:1196 guiminer.py:1290 guiminer.py:1311 +#: guiminer.py:1197 guiminer.py:1291 guiminer.py:1312 msgid "Auth token rejected by server." msgstr "" -#: guiminer.py:1214 +#: guiminer.py:1215 #, python-format msgid "%s confirmed" msgstr "" -#: guiminer.py:1216 +#: guiminer.py:1217 #, python-format msgid ", %s unconfirmed" msgstr "" -#: guiminer.py:1218 +#: guiminer.py:1219 msgid "Bad response from server." msgstr "" -#: guiminer.py:1294 guiminer.py:1315 +#: guiminer.py:1295 guiminer.py:1316 msgid "Withdraw OK" msgstr "" -#: guiminer.py:1485 +#: guiminer.py:1486 msgid "No registration is required - just enter an address and press Start." msgstr "" -#: guiminer.py:1487 +#: guiminer.py:1488 msgid "Address:" msgstr "" -#: guiminer.py:1489 +#: guiminer.py:1490 msgid "" "Your receiving address for Bitcoins.\n" "E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" msgstr "" -#: guiminer.py:1505 +#: guiminer.py:1506 msgid "" "Your miner username (not your account username).\n" "Example: Kiv.GPU" msgstr "" -#: guiminer.py:1507 guiminer.py:1528 +#: guiminer.py:1508 guiminer.py:1529 msgid "Your miner password (not your account password)." msgstr "" -#: guiminer.py:1526 +#: guiminer.py:1527 msgid "" "Your miner username. \n" "Example: kiv123@kiv123" msgstr "" -#: guiminer.py:1543 +#: guiminer.py:1544 msgid "The e-mail address you registered with." msgstr "" -#: guiminer.py:1544 +#: guiminer.py:1545 msgid "Email:" msgstr "" -#: guiminer.py:1559 +#: guiminer.py:1560 msgid "&Rename..." msgstr "" -#: guiminer.py:1559 +#: guiminer.py:1560 msgid "Rename this miner" msgstr "" -#: guiminer.py:1584 +#: guiminer.py:1585 msgid "&New OpenCL miner..." msgstr "" -#: guiminer.py:1584 +#: guiminer.py:1585 msgid "Create a new OpenCL miner (default for ATI cards)" msgstr "" -#: guiminer.py:1585 +#: guiminer.py:1586 msgid "Create a new Phoenix miner (for some ATI cards)" msgstr "" -#: guiminer.py:1585 +#: guiminer.py:1586 msgid "New Phoenix miner..." msgstr "" -#: guiminer.py:1586 +#: guiminer.py:1587 msgid "Create a new CUDA miner (for NVIDIA cards)" msgstr "" -#: guiminer.py:1586 +#: guiminer.py:1587 msgid "New CUDA miner..." msgstr "" -#: guiminer.py:1587 +#: guiminer.py:1588 msgid "Create a new Ufasoft miner (for CPUs)" msgstr "" -#: guiminer.py:1587 +#: guiminer.py:1588 msgid "New Ufasoft CPU miner..." msgstr "" -#: guiminer.py:1588 +#: guiminer.py:1589 msgid "Create a new custom miner (requires external program)" msgstr "" -#: guiminer.py:1588 +#: guiminer.py:1589 msgid "New &other miner..." msgstr "" -#: guiminer.py:1589 +#: guiminer.py:1590 msgid "&New miner" msgstr "" -#: guiminer.py:1590 +#: guiminer.py:1591 msgid "&Save settings" msgstr "" -#: guiminer.py:1590 +#: guiminer.py:1591 msgid "Save your settings" msgstr "" -#: guiminer.py:1591 +#: guiminer.py:1592 msgid "&Load settings" msgstr "" -#: guiminer.py:1591 +#: guiminer.py:1592 msgid "Load stored settings" msgstr "" -#: guiminer.py:1592 +#: guiminer.py:1593 msgid "Quit" msgstr "" -#: guiminer.py:1593 +#: guiminer.py:1594 msgid "&File" msgstr "" -#: guiminer.py:1597 +#: guiminer.py:1598 msgid "Show summary" msgstr "" -#: guiminer.py:1597 +#: guiminer.py:1598 msgid "Show summary of all miners" msgstr "" -#: guiminer.py:1598 +#: guiminer.py:1599 msgid "Show console" msgstr "" -#: guiminer.py:1598 +#: guiminer.py:1599 msgid "Show console logs" msgstr "" -#: guiminer.py:1599 +#: guiminer.py:1600 msgid "&View" msgstr "" -#: guiminer.py:1603 +#: guiminer.py:1604 msgid "&Create solo password..." msgstr "" -#: guiminer.py:1603 +#: guiminer.py:1604 msgid "Configure a user/pass for solo mining" msgstr "" -#: guiminer.py:1604 +#: guiminer.py:1605 msgid "&Set Bitcoin client path..." msgstr "" -#: guiminer.py:1604 +#: guiminer.py:1605 msgid "Set the location of the official Bitcoin client" msgstr "" -#: guiminer.py:1605 +#: guiminer.py:1606 msgid "&Launch Bitcoin client as server" msgstr "" -#: guiminer.py:1605 +#: guiminer.py:1606 msgid "Launch the official Bitcoin client as a server for solo mining" msgstr "" -#: guiminer.py:1606 +#: guiminer.py:1607 msgid "&Solo utilities" msgstr "" -#: guiminer.py:1610 +#: guiminer.py:1611 msgid "Start &minimized" msgstr "" -#: guiminer.py:1610 +#: guiminer.py:1611 msgid "Start the GUI minimized to the tray." msgstr "" -#: guiminer.py:1612 +#: guiminer.py:1613 msgid "&Options" msgstr "" -#: guiminer.py:1616 +#: guiminer.py:1617 msgid "&Change language..." msgstr "" -#: guiminer.py:1617 +#: guiminer.py:1618 msgid "Language" msgstr "" -#: guiminer.py:1621 +#: guiminer.py:1622 msgid "&Donate 99 cents..." msgstr "" -#: guiminer.py:1621 +#: guiminer.py:1622 msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" msgstr "" -#: guiminer.py:1622 +#: guiminer.py:1623 msgid "&Donate" msgstr "" -#: guiminer.py:1625 +#: guiminer.py:1626 msgid "&About..." msgstr "" -#: guiminer.py:1627 +#: guiminer.py:1628 msgid "&Help" msgstr "" -#: guiminer.py:1639 +#: guiminer.py:1640 msgid "Failed to load taskbar icon; continuing." msgstr "" -#: guiminer.py:1648 +#: guiminer.py:1649 msgid "OpenCL not found - can't add a OpenCL miner" msgstr "" -#: guiminer.py:1685 +#: guiminer.py:1686 #, python-format msgid "GUIMiner - v%s" msgstr "" -#: guiminer.py:1727 +#: guiminer.py:1728 msgid "Name this miner:" msgstr "" -#: guiminer.py:1727 +#: guiminer.py:1728 msgid "New miner" msgstr "" -#: guiminer.py:1730 +#: guiminer.py:1731 msgid "Untitled" msgstr "" -#: guiminer.py:1741 +#: guiminer.py:1742 msgid "External miner (*.exe)|*.exe|(*.py)|*.py" msgstr "" -#: guiminer.py:1743 +#: guiminer.py:1744 msgid "Select external miner:" msgstr "" -#: guiminer.py:1753 +#: guiminer.py:1754 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" msgstr "" -#: guiminer.py:1755 +#: guiminer.py:1756 msgid "Miner not supported" msgstr "" -#: guiminer.py:1796 +#: guiminer.py:1797 msgid "Do you want to save changes?" msgstr "" -#: guiminer.py:1796 +#: guiminer.py:1797 msgid "Save" msgstr "" -#: guiminer.py:1826 +#: guiminer.py:1827 msgid "Saving: " msgstr "" -#: guiminer.py:1832 +#: guiminer.py:1833 #, python-format msgid "" "Couldn't write save file %s.\n" "Check the location is writable." msgstr "" -#: guiminer.py:1833 +#: guiminer.py:1834 msgid "Save unsuccessful" msgstr "" -#: guiminer.py:1835 +#: guiminer.py:1836 #, python-format msgid "Profiles saved OK to %s." msgstr "" -#: guiminer.py:1836 +#: guiminer.py:1837 msgid "Save successful" msgstr "" -#: guiminer.py:1848 +#: guiminer.py:1849 #, python-format msgid "Loaded: %s" msgstr "" -#: guiminer.py:1862 +#: guiminer.py:1863 msgid "Loading profiles will stop any currently running miners. Continue?" msgstr "" -#: guiminer.py:1863 +#: guiminer.py:1864 msgid "Load profile" msgstr "" -#: guiminer.py:1892 +#: guiminer.py:1893 msgid "Select path to Bitcoin.exe" msgstr "" -#: guiminer.py:1904 +#: guiminer.py:1905 msgid "About" msgstr "" -#: guiminer.py:1930 +#: guiminer.py:1931 msgid "Closing this miner will stop it. Continue?" msgstr "" -#: guiminer.py:1931 +#: guiminer.py:1932 msgid "Close miner" msgstr "" -#: guiminer.py:1960 +#: guiminer.py:1961 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" msgstr "" -#: guiminer.py:1961 +#: guiminer.py:1962 msgid "Launch failed" msgstr "" -#: guiminer.py:1964 +#: guiminer.py:1965 msgid "" "The Bitcoin client will now launch in server mode.\n" "Once it connects to the network and downloads the block chain, you can start a miner in 'solo' mode." msgstr "" -#: guiminer.py:1965 +#: guiminer.py:1966 msgid "Launched ok." msgstr "" -#: guiminer.py:1980 +#: guiminer.py:1981 #, python-format msgid "%s already exists. Overwrite?" msgstr "" -#: guiminer.py:1981 +#: guiminer.py:1982 msgid "bitcoin.conf already exists." msgstr "" -#: guiminer.py:1986 +#: guiminer.py:1987 msgid "Enter password" msgstr "" -#: guiminer.py:1996 +#: guiminer.py:1997 msgid "Success" msgstr "" -#: guiminer.py:1996 +#: guiminer.py:1997 msgid "Wrote bitcoin config ok." msgstr "" -#: guiminer.py:2007 +#: guiminer.py:2008 msgid "Console" msgstr "" -#: guiminer.py:2019 +#: guiminer.py:2020 msgid "Summary" msgstr "" -#: guiminer.py:2032 +#: guiminer.py:2033 msgid "Rename miner" msgstr "" -#: guiminer.py:2032 +#: guiminer.py:2033 msgid "Rename to:" msgstr "" -#: guiminer.py:2037 +#: guiminer.py:2038 msgid "Change language" msgstr "" -#: guiminer.py:2057 +#: guiminer.py:2058 msgid "Choose language (requires restart to take full effect)" msgstr "" -#: guiminer.py:2102 +#: guiminer.py:2103 msgid "" -"Click the link below to log in to the pool and get a special token. \n" +"Click the link below to log in to the pool and get a special token.\n" "This token lets you securely check your balance.\n" "To remember this token for the future, save your miner settings." msgstr "" -#: guiminer.py:2111 +#: guiminer.py:2112 msgid "(Paste token here)" msgstr "" -#: guiminer.py:2137 +#: guiminer.py:2138 msgid "Copy address to clipboard" msgstr "" -#: guiminer.py:2156 +#: guiminer.py:2157 msgid "No OpenCL devices found." msgstr "" -#: guiminer.py:2159 +#: guiminer.py:2160 msgid "" "No OpenCL devices were found.\n" " If you only want to mine using CPU or CUDA, you can ignore this message.\n" @@ -722,6 +722,6 @@ msgid "" " SDK, or your GPU may not support OpenCL." msgstr "" -#: guiminer.py:2169 +#: guiminer.py:2170 msgid "Don't show this message again" msgstr "" From 3b5ddd9f45096d87ae0d5f2848211206f00d1f99 Mon Sep 17 00:00:00 2001 From: Kiv Date: Tue, 14 Jun 2011 23:00:55 -0300 Subject: [PATCH 116/190] Tidy up translations more. --- guiminer_fr.po | 76 +++++++++++++++++++------------------------------- guiminer_hu.po | 37 ++++++++---------------- 2 files changed, 40 insertions(+), 73 deletions(-) diff --git a/guiminer_fr.po b/guiminer_fr.po index 2b271a6..e8948fa 100644 --- a/guiminer_fr.po +++ b/guiminer_fr.po @@ -3,8 +3,8 @@ msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-06-14 22:43-0300\n" -"PO-Revision-Date: 2011-05-24 18:37+0100\n" -"Last-Translator: Cramoisan Florian \n" +"PO-Revision-Date: 2011-06-14 23:00-0400\n" +"Last-Translator: Chris MacLeod \n" "Language-Team: Russian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" @@ -283,8 +283,7 @@ msgid "" "Server to connect to. Different servers have different fees and features.\n" "Check their websites for full information." msgstr "" -"Serveur auquel se connecter. Chaque serveur à des différentes taxes et " -"options.\n" +"Serveur auquel se connecter. Chaque serveur à des différentes taxes et options.\n" "Regardez leur site pour plus d'informations." #: guiminer.py:1095 @@ -328,8 +327,7 @@ msgid "" "For other cards consult the forum." msgstr "" "Paramètres supplémentaires à passer au miner.\n" -"Pour les ATI Radéon HD série 5xxx utiliser -v -w128 afin d'optimiser le " -"rendement.\n" +"Pour les ATI Radéon HD série 5xxx utiliser -v -w128 afin d'optimiser le rendement.\n" "Pour les autres cartes, consultez le forum." #: guiminer.py:1103 @@ -338,7 +336,9 @@ msgid "" "Unchecking some cores can reduce high CPU usage in some systems." msgstr "" -#: guiminer.py:1197 guiminer.py:1291 guiminer.py:1312 +#: guiminer.py:1197 +#: guiminer.py:1291 +#: guiminer.py:1312 msgid "Auth token rejected by server." msgstr "" @@ -356,15 +356,14 @@ msgstr ", %s n'a pas été confirmé" msgid "Bad response from server." msgstr "Mauvaise réponse du serveur." -#: guiminer.py:1295 guiminer.py:1316 +#: guiminer.py:1295 +#: guiminer.py:1316 msgid "Withdraw OK" msgstr "Retiré" #: guiminer.py:1486 msgid "No registration is required - just enter an address and press Start." -msgstr "" -"Aucun enregistrement requis, entrez seulement une adresse et cliquez sur " -"Démarrer" +msgstr "Aucun enregistrement requis, entrez seulement une adresse et cliquez sur Démarrer" #: guiminer.py:1488 msgid "Address:" @@ -386,7 +385,8 @@ msgstr "" "Votre nom d'utilisateur de miner (pas celui de votre compte). \n" "Example:kiv.GPU" -#: guiminer.py:1508 guiminer.py:1529 +#: guiminer.py:1508 +#: guiminer.py:1529 msgid "Your miner password (not your account password)." msgstr "Votre mot de passe de miner (pas celui de votre compte)." @@ -423,45 +423,38 @@ msgid "Create a new OpenCL miner (default for ATI cards)" msgstr "" #: guiminer.py:1586 -#, fuzzy msgid "Create a new Phoenix miner (for some ATI cards)" -msgstr "Créer un profil avec un nouveau miner" +msgstr "" #: guiminer.py:1586 -#, fuzzy msgid "New Phoenix miner..." -msgstr "N&ouveau miner..." +msgstr "" #: guiminer.py:1587 msgid "Create a new CUDA miner (for NVIDIA cards)" msgstr "" #: guiminer.py:1587 -#, fuzzy msgid "New CUDA miner..." -msgstr "&Nouveau miner OpenCL..." +msgstr "" #: guiminer.py:1588 -#, fuzzy msgid "Create a new Ufasoft miner (for CPUs)" -msgstr "Créer un profil avec un nouveau miner" +msgstr "" #: guiminer.py:1588 -#, fuzzy msgid "New Ufasoft CPU miner..." -msgstr "N&ouveau miner..." +msgstr "" #: guiminer.py:1589 -#, fuzzy msgid "Create a new custom miner (requires external program)" -msgstr "Créer un miner CPU ou CUDA (nécessite un programme externe)" +msgstr "" #: guiminer.py:1589 msgid "New &other miner..." msgstr "N&ouveau miner..." #: guiminer.py:1590 -#, fuzzy msgid "&New miner" msgstr "Nouveau miner" @@ -538,9 +531,8 @@ msgid "&Solo utilities" msgstr "&Outils solo" #: guiminer.py:1611 -#, fuzzy msgid "Start &minimized" -msgstr "Commencer le minage!" +msgstr "" #: guiminer.py:1611 msgid "Start the GUI minimized to the tray." @@ -567,14 +559,12 @@ msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" msgstr "" #: guiminer.py:1623 -#, fuzzy msgid "&Donate" -msgstr "&A propos/Faire un Don ..." +msgstr "Faire un Don" #: guiminer.py:1626 -#, fuzzy msgid "&About..." -msgstr "&A propos/Faire un Don ..." +msgstr "A propos" #: guiminer.py:1628 msgid "&Help" @@ -606,9 +596,8 @@ msgid "Untitled" msgstr "Sans titre" #: guiminer.py:1742 -#, fuzzy msgid "External miner (*.exe)|*.exe|(*.py)|*.py" -msgstr "Miner externe (*.exe)|*.exe" +msgstr "Miner externe (*.exe)|*.exe|(*.py)|*.py" #: guiminer.py:1744 msgid "Select external miner:" @@ -617,9 +606,7 @@ msgstr "Choisissez un miner externe:" #: guiminer.py:1754 #, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" -msgstr "" -"Miner externe non supporté %(filename)s. Les miners actuellement supportés " -"sont: %(supported)s" +msgstr "Miner externe non supporté %(filename)s. Les miners actuellement supportés sont: %(supported)s" #: guiminer.py:1756 msgid "Miner not supported" @@ -691,9 +678,7 @@ msgstr "Fermer le miner" #: guiminer.py:1961 #, python-format msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" -msgstr "" -"Impossible de trouver bitcoin au chemin %s. Vérifiez que le chemin a bien " -"été paramétré." +msgstr "Impossible de trouver bitcoin au chemin %s. Vérifiez que le chemin a bien été paramétré." #: guiminer.py:1962 msgid "Launch failed" @@ -702,8 +687,7 @@ msgstr "Erreur de lancement" #: guiminer.py:1965 msgid "" "The Bitcoin client will now launch in server mode.\n" -"Once it connects to the network and downloads the block chain, you can start " -"a miner in 'solo' mode." +"Once it connects to the network and downloads the block chain, you can start a miner in 'solo' mode." msgstr "" #: guiminer.py:1966 @@ -775,20 +759,16 @@ msgid "No OpenCL devices found." msgstr "Aucun périphérique OpenCL touvé." #: guiminer.py:2160 -#, fuzzy msgid "" "No OpenCL devices were found.\n" " If you only want to mine using CPU or CUDA, you can ignore this message.\n" -" If you want to mine on ATI graphics cards, you may need to install the ATI " -"Stream\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI Stream\n" " SDK, or your GPU may not support OpenCL." msgstr "" "Aucun périphérique OpenCL n'a été trouvé.\n" " Si vous souhaitez seulement miner avec CPU ou CUDA, ignorez ce message.\n" -" Si vous souhaitez miner avec une carte ATI, vous devez installer ATI " -"Stream\n" -" SDK (2.1 de préférence), sinon il se peut que votre GPU ne supporte pas " -"OpenCL.\n" +" Si vous souhaitez miner avec une carte ATI, vous devez installer ATI Stream\n" +" SDK (2.1 de préférence), sinon il se peut que votre GPU ne supporte pas OpenCL." #: guiminer.py:2170 msgid "Don't show this message again" diff --git a/guiminer_hu.po b/guiminer_hu.po index b736548..451b16f 100644 --- a/guiminer_hu.po +++ b/guiminer_hu.po @@ -407,46 +407,39 @@ msgid "Create a new OpenCL miner (default for ATI cards)" msgstr "" #: guiminer.py:1586 -#, fuzzy msgid "Create a new Phoenix miner (for some ATI cards)" -msgstr "Új bányászprofil" +msgstr "" #: guiminer.py:1586 -#, fuzzy msgid "New Phoenix miner..." -msgstr "Új külső bányász..." +msgstr "" #: guiminer.py:1587 msgid "Create a new CUDA miner (for NVIDIA cards)" msgstr "" #: guiminer.py:1587 -#, fuzzy msgid "New CUDA miner..." -msgstr "&Új OpenCL bányász..." +msgstr "" #: guiminer.py:1588 -#, fuzzy msgid "Create a new Ufasoft miner (for CPUs)" -msgstr "Új bányászprofil" +msgstr "" #: guiminer.py:1588 -#, fuzzy msgid "New Ufasoft CPU miner..." -msgstr "Új külső bányász..." +msgstr "" #: guiminer.py:1589 -#, fuzzy msgid "Create a new custom miner (requires external program)" -msgstr "Új CPU, vagy CUDA bányász (külső bányászprogrammal)" +msgstr "" #: guiminer.py:1589 msgid "New &other miner..." msgstr "Új külső bányász..." #: guiminer.py:1590 -#, fuzzy -msgid "&New miner" +msgid "New miner" msgstr "Új bányász" #: guiminer.py:1591 @@ -524,9 +517,8 @@ msgid "&Solo utilities" msgstr "&Szóló eszközök" #: guiminer.py:1611 -#, fuzzy msgid "Start &minimized" -msgstr "Bányászat indítása" +msgstr "" #: guiminer.py:1611 msgid "Start the GUI minimized to the tray." @@ -553,14 +545,12 @@ msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" msgstr "" #: guiminer.py:1623 -#, fuzzy msgid "&Donate" -msgstr "&Névjegy/Adományok..." +msgstr "Adományok" #: guiminer.py:1626 -#, fuzzy msgid "&About..." -msgstr "&Névjegy/Adományok..." +msgstr "&Névjegy" #: guiminer.py:1628 msgid "&Help" @@ -592,20 +582,17 @@ msgid "Untitled" msgstr "Névtelen" #: guiminer.py:1742 -#, fuzzy msgid "External miner (*.exe)|*.exe|(*.py)|*.py" -msgstr "Külső bányászprogram (*.exe)|*.exe" +msgstr "Külső bányászprogram (*.exe)|*.exe|(*.py)|*.py" #: guiminer.py:1744 msgid "Select external miner:" msgstr "Válaszd ki a külső bányászprogramot:" #: guiminer.py:1754 -#, fuzzy, python-format +#, python-format msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" msgstr "" -"A külső bányászprogram (%(filename)s) nem támogatott. A következőket " -"használhatod: %(supported)" #: guiminer.py:1756 msgid "Miner not supported" From 4f4a44c27a8eb2d8d45c1045090cd7e849ec3ef2 Mon Sep 17 00:00:00 2001 From: Kiv Date: Tue, 14 Jun 2011 23:09:21 -0300 Subject: [PATCH 117/190] Change slush host to api.bitcoin.cz --- guiminer.py | 6 +++--- guiminer_hu.po | 4 ---- messages.pot | 2 +- servers.ini | 2 +- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/guiminer.py b/guiminer.py index 97e6b51..a6fe61c 100644 --- a/guiminer.py +++ b/guiminer.py @@ -25,7 +25,7 @@ from wx.lib.agw import hyperlink from wx.lib.newevent import NewEvent -__version__ = '2011-06-09' +__version__ = '2011-06-14' def get_module_path(): """Return the folder containing this script (or its .exe).""" @@ -1136,7 +1136,7 @@ def change_server(self, new_server): # Call server specific code. host = new_server.get('host', "").lower() - if host == "mining.bitcoin.cz": self.layout_slush() + if host == "api.bitcoin.cz": self.layout_slush() elif host == "bitpenny.dyndns.biz": self.layout_bitpenny() elif host == "pit.deepbit.net": self.layout_deepbit() elif host == "btcmine.com": self.layout_btcmine() @@ -1232,7 +1232,7 @@ def on_balance_refresh(self, event=None): """Refresh the miner's balance from the server.""" host = self.server_config.get("host") - HOSTS_REQUIRING_AUTH_TOKEN = ["mining.bitcoin.cz", + HOSTS_REQUIRING_AUTH_TOKEN = ["api.bitcoin.cz", "btcmine.com", "pit.deepbit.net", "btcguild.com"] diff --git a/guiminer_hu.po b/guiminer_hu.po index 451b16f..9df15db 100644 --- a/guiminer_hu.po +++ b/guiminer_hu.po @@ -573,10 +573,6 @@ msgstr "GUIMiner - v%s" msgid "Name this miner:" msgstr "Bányász neve:" -#: guiminer.py:1728 -msgid "New miner" -msgstr "Új bányász" - #: guiminer.py:1731 msgid "Untitled" msgstr "Névtelen" diff --git a/messages.pot b/messages.pot index 3ceb408..2611741 100644 --- a/messages.pot +++ b/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-14 22:52-0300\n" +"POT-Creation-Date: 2011-06-14 23:03-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/servers.ini b/servers.ini index df1b12b..e1d72d1 100644 --- a/servers.ini +++ b/servers.ini @@ -2,7 +2,7 @@ "servers": [ { "name": "slush's pool", - "host": "mining.bitcoin.cz", + "host": "api.bitcoin.cz", "url": "http://mining.bitcoin.cz", "port": 8332, "balance_token_url": "http://mining.bitcoin.cz/accounts/token-manage/", From 030f3e2f90be3ce608b85e6327b44b179d1d29b7 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Wed, 15 Jun 2011 14:14:28 +0800 Subject: [PATCH 118/190] Update to the Chinese Simp translation --- guiminer_zh.po | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/guiminer_zh.po b/guiminer_zh.po index 0790ff5..9a60f73 100644 --- a/guiminer_zh.po +++ b/guiminer_zh.po @@ -215,7 +215,7 @@ msgstr "附加参数:" #: guiminer.py:538 msgid "CPU Affinity:" -msgstr "" +msgstr "CPU 关联:" #: guiminer.py:541 msgid "Balance:" @@ -327,10 +327,14 @@ msgid "" "CPU cores used for mining.\n" "Unchecking some cores can reduce high CPU usage in some systems." msgstr "" +"用于采矿的 CPU 核心。\n" +"取消选中部分核心可降低部分系统的高额 CPU 使用。" -#: guiminer.py:1197 guiminer.py:1291 guiminer.py:1312 +#: guiminer.py:1197 +#: guiminer.py:1291 +#: guiminer.py:1312 msgid "Auth token rejected by server." -msgstr "身份认证 token 被服务器拒绝。" +msgstr "身份认证令牌被服务器拒绝。" #: guiminer.py:1215 #, python-format @@ -346,7 +350,8 @@ msgstr ", %s 未确认" msgid "Bad response from server." msgstr "服务器响应错误。" -#: guiminer.py:1295 guiminer.py:1316 +#: guiminer.py:1295 +#: guiminer.py:1316 msgid "Withdraw OK" msgstr "取款成功" @@ -374,7 +379,8 @@ msgstr "" "您的采矿器用户名 (不是账号用户名)。\n" "示例: Kiv.GPU" -#: guiminer.py:1508 guiminer.py:1529 +#: guiminer.py:1508 +#: guiminer.py:1529 msgid "Your miner password (not your account password)." msgstr "您的采矿器密码 (不是账号密码)。" @@ -412,7 +418,7 @@ msgstr "创建一个新的 OpenCL 采矿器 (默认为 ATI 显卡)" #: guiminer.py:1586 msgid "Create a new Phoenix miner (for some ATI cards)" -msgstr "创建一个新的 Phoenix 采矿器(部分 ATI 显卡)" +msgstr "创建一个新的 Phoenix 采矿器 (部分 ATI 显卡)" #: guiminer.py:1586 msgid "New Phoenix miner..." @@ -444,7 +450,7 @@ msgstr "新建其他采矿器(&O)..." #: guiminer.py:1590 msgid "&New miner" -msgstr "" +msgstr "新建采矿器(&N)" #: guiminer.py:1591 msgid "&Save settings" @@ -675,9 +681,10 @@ msgstr "启动失败" #: guiminer.py:1965 msgid "" "The Bitcoin client will now launch in server mode.\n" -"Once it connects to the network and downloads the block chain, you can start " -"a miner in 'solo' mode." +"Once it connects to the network and downloads the block chain, you can start a miner in 'solo' mode." msgstr "" +"Bitcoin 客户端将以服务器模式启动。\n" +"让它连接到网络并下载块链,您就可以以“独自采矿”模式启动采矿器了。" #: guiminer.py:1966 msgid "Launched ok." @@ -734,10 +741,13 @@ msgid "" "This token lets you securely check your balance.\n" "To remember this token for the future, save your miner settings." msgstr "" +"点击下面的链接登录矿场获取特别的令牌。\n" +"该令牌允许您获取检测余额。\n" +"要记住该令牌供日后使用,请保存您的采矿器设置。" #: guiminer.py:2112 msgid "(Paste token here)" -msgstr "(在此粘贴 token)" +msgstr "(在此粘贴令牌)" #: guiminer.py:2138 msgid "Copy address to clipboard" @@ -751,8 +761,7 @@ msgstr "未找到 OpenCL 设备。" msgid "" "No OpenCL devices were found.\n" " If you only want to mine using CPU or CUDA, you can ignore this message.\n" -" If you want to mine on ATI graphics cards, you may need to install the ATI " -"Stream\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI Stream\n" " SDK, or your GPU may not support OpenCL." msgstr "" "未找到 OpenCL 设备。\n" From fd624f36d8df53096dc9fc42d69b64124d439597 Mon Sep 17 00:00:00 2001 From: Redhatzero Date: Thu, 16 Jun 2011 01:54:48 +0200 Subject: [PATCH 119/190] added code + servers.ini for x8s pool --- guiminer.py | 6 ++++++ servers.ini | 14 ++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/guiminer.py b/guiminer.py index a6fe61c..55c0ae2 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1141,6 +1141,7 @@ def change_server(self, new_server): elif host == "pit.deepbit.net": self.layout_deepbit() elif host == "btcmine.com": self.layout_btcmine() elif host == "btcguild.com": self.layout_btcguild() + elif host == "pit.x8s.de": self.layout_x8s() else: self.layout_default() self.Layout() @@ -1235,6 +1236,7 @@ def on_balance_refresh(self, event=None): HOSTS_REQUIRING_AUTH_TOKEN = ["api.bitcoin.cz", "btcmine.com", "pit.deepbit.net", + "pit.x8s.de", "btcguild.com"] if host in HOSTS_REQUIRING_AUTH_TOKEN: self.require_auth_token() @@ -1544,6 +1546,10 @@ def layout_deepbit(self): _("The e-mail address you registered with.")) self.user_lbl.SetLabel(_("Email:")) + def layout_x8s(self): + """x8s has the same layout as slush for now.""" + self.layout_slush() + # End server specific code ########################## diff --git a/servers.ini b/servers.ini index e1d72d1..2bd1ab6 100644 --- a/servers.ini +++ b/servers.ini @@ -19,7 +19,7 @@ "balance_host": "deepbit.net", "balance_url": "/api/%s" }, - + { "name": "BTC Guild", "host": "btcguild.com", "url": "http://www.btcguild.com", @@ -54,7 +54,7 @@ "balance_url": "/api/getbalance/%s/", "balance_token_url": "http://btcmine.com/user/profile/" }, - + { "name": "BitClockers", "host": "pool.bitclockers.com", @@ -65,6 +65,16 @@ "balance_token_url": "http://bitclockers.com/dashboard/" }, + { + "name": "x8s", + "host": "pit.x8s.de", + "url": "http://btc.x8s.de", + "port": 8337, + "balance_host": "btc.x8s.de", + "balance_url": "/api/getbalance/%s/", + "balance_token_url": "http://btc.x8s.de/account/profile" + }, + { "name": "solo", "host": "localhost", From 3b930f0648694a5a0678287b84641ef6a9a07113 Mon Sep 17 00:00:00 2001 From: Greg Buehler Date: Mon, 20 Jun 2011 21:51:05 -0500 Subject: [PATCH 120/190] Added bitcoin.lc to available pools --- guiminer.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/guiminer.py b/guiminer.py index a6fe61c..0f8d64c 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1141,6 +1141,7 @@ def change_server(self, new_server): elif host == "pit.deepbit.net": self.layout_deepbit() elif host == "btcmine.com": self.layout_btcmine() elif host == "btcguild.com": self.layout_btcguild() + elif host == "bitcoin.lc": self.layout_bitcoinlc() else: self.layout_default() self.Layout() @@ -1544,6 +1545,25 @@ def layout_deepbit(self): _("The e-mail address you registered with.")) self.user_lbl.SetLabel(_("Email:")) + def layout_bitcoinclc(self): + """ bitcoin.lc has a non-standard port.""" + self.set_widgets_visible([self.host_lbl, self.txt_host, + self.port_lbl, self.txt_port, + self.withdraw, self.extra_info], False) + self.txt_port.SetValue('8080') + row = self.layout_init() + self.layout_server_and_website(row=row) + self.layout_user_and_pass(row=row+1) + self.layout_device_and_flags(row=row+2) + self.layout_affinity(row=row+3) + self.layout_balance(row=row+4) + self.layout_finish() + + add_tooltip(self.txt_username, + _("Your miner username (not your account username).\nExample: Kiv.GPU")) + add_tooltip(self.txt_pass, + _("Your miner password (not your account password).")) + # End server specific code ########################## From 759ca42ac158e9fbc20cb79741b1b8233aaab323 Mon Sep 17 00:00:00 2001 From: Greg Buehler Date: Mon, 20 Jun 2011 20:00:10 -0700 Subject: [PATCH 121/190] fixed whitespace error --- guiminer.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/guiminer.py b/guiminer.py index 0f8d64c..0e456c0 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1141,7 +1141,7 @@ def change_server(self, new_server): elif host == "pit.deepbit.net": self.layout_deepbit() elif host == "btcmine.com": self.layout_btcmine() elif host == "btcguild.com": self.layout_btcguild() - elif host == "bitcoin.lc": self.layout_bitcoinlc() + elif host == "bitcoin.lc": self.layout_bitcoinlc() else: self.layout_default() self.Layout() @@ -1545,12 +1545,12 @@ def layout_deepbit(self): _("The e-mail address you registered with.")) self.user_lbl.SetLabel(_("Email:")) - def layout_bitcoinclc(self): - """ bitcoin.lc has a non-standard port.""" - self.set_widgets_visible([self.host_lbl, self.txt_host, - self.port_lbl, self.txt_port, - self.withdraw, self.extra_info], False) - self.txt_port.SetValue('8080') + def layout_bitcoinclc(self): + """ bitcoin.lc has a non-standard port.""" + self.set_widgets_visible([self.host_lbl, self.txt_host, + self.port_lbl, self.txt_port, + self.withdraw, self.extra_info], False) + self.txt_port.SetValue('8080') row = self.layout_init() self.layout_server_and_website(row=row) self.layout_user_and_pass(row=row+1) From 1d7f3a56fc1edf3e496a6368328b346a0e391b17 Mon Sep 17 00:00:00 2001 From: Greg Buehler Date: Mon, 20 Jun 2011 20:07:58 -0700 Subject: [PATCH 122/190] Added 'bitcoin.lc' --- servers.ini | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/servers.ini b/servers.ini index e1d72d1..1cd90b7 100644 --- a/servers.ini +++ b/servers.ini @@ -64,7 +64,12 @@ "balance_url": "/api/%s/", "balance_token_url": "http://bitclockers.com/dashboard/" }, - + { + "name": "Bitcoin.lc", + "host": "bitcoin.lc", + "url": "http://www.bitcoins.lc", + "port": 8080, + }, { "name": "solo", "host": "localhost", From 92e8de3d70c1bbd221ad200521dc1435010ae1df Mon Sep 17 00:00:00 2001 From: silsha Date: Wed, 29 Jun 2011 21:51:03 +0200 Subject: [PATCH 123/190] Added www.btcmp.com --- servers.ini | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/servers.ini b/servers.ini index e1d72d1..9dfe97c 100644 --- a/servers.ini +++ b/servers.ini @@ -64,6 +64,13 @@ "balance_url": "/api/%s/", "balance_token_url": "http://bitclockers.com/dashboard/" }, + + { + "name": "BTCMP", + "host": "rr.btcmp.com", + "url": "http://www.btcmp.com", + "port": 8332 + }, { "name": "solo", @@ -79,4 +86,4 @@ "port": 8332 } ] -} \ No newline at end of file +} From f7424ba05006d1f46276274004283f87a6736d1f Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 1 Jul 2011 07:45:32 -0300 Subject: [PATCH 124/190] Language changes. --- guiminer_hu.po | 10 +++++++--- messages.pot | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/guiminer_hu.po b/guiminer_hu.po index 9df15db..5c3f61f 100644 --- a/guiminer_hu.po +++ b/guiminer_hu.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: guiminer\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-14 22:43-0300\n" +"POT-Creation-Date: 2011-06-14 23:10-0300\n" "PO-Revision-Date: 2011-06-04 18:34+0100\n" "Last-Translator: Underyx \n" "Language-Team: Español\n" @@ -439,8 +439,8 @@ msgid "New &other miner..." msgstr "Új külső bányász..." #: guiminer.py:1590 -msgid "New miner" -msgstr "Új bányász" +msgid "&New miner" +msgstr "" #: guiminer.py:1591 msgid "&Save settings" @@ -573,6 +573,10 @@ msgstr "GUIMiner - v%s" msgid "Name this miner:" msgstr "Bányász neve:" +#: guiminer.py:1728 +msgid "New miner" +msgstr "Új bányász" + #: guiminer.py:1731 msgid "Untitled" msgstr "Névtelen" diff --git a/messages.pot b/messages.pot index 2611741..6441ffb 100644 --- a/messages.pot +++ b/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-06-14 23:03-0300\n" +"POT-Creation-Date: 2011-06-14 23:10-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" From be3db4949953d3a6cc045f4e0326eb037cf75398 Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 1 Jul 2011 08:16:36 -0300 Subject: [PATCH 125/190] Get bitcoin.lc support working. --- guiminer.py | 21 --------------------- servers.ini | 2 +- 2 files changed, 1 insertion(+), 22 deletions(-) diff --git a/guiminer.py b/guiminer.py index 0e456c0..287360c 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1141,7 +1141,6 @@ def change_server(self, new_server): elif host == "pit.deepbit.net": self.layout_deepbit() elif host == "btcmine.com": self.layout_btcmine() elif host == "btcguild.com": self.layout_btcguild() - elif host == "bitcoin.lc": self.layout_bitcoinlc() else: self.layout_default() self.Layout() @@ -1544,26 +1543,6 @@ def layout_deepbit(self): add_tooltip(self.txt_username, _("The e-mail address you registered with.")) self.user_lbl.SetLabel(_("Email:")) - - def layout_bitcoinclc(self): - """ bitcoin.lc has a non-standard port.""" - self.set_widgets_visible([self.host_lbl, self.txt_host, - self.port_lbl, self.txt_port, - self.withdraw, self.extra_info], False) - self.txt_port.SetValue('8080') - row = self.layout_init() - self.layout_server_and_website(row=row) - self.layout_user_and_pass(row=row+1) - self.layout_device_and_flags(row=row+2) - self.layout_affinity(row=row+3) - self.layout_balance(row=row+4) - self.layout_finish() - - add_tooltip(self.txt_username, - _("Your miner username (not your account username).\nExample: Kiv.GPU")) - add_tooltip(self.txt_pass, - _("Your miner password (not your account password).")) - # End server specific code ########################## diff --git a/servers.ini b/servers.ini index 1cd90b7..e6411a6 100644 --- a/servers.ini +++ b/servers.ini @@ -68,7 +68,7 @@ "name": "Bitcoin.lc", "host": "bitcoin.lc", "url": "http://www.bitcoins.lc", - "port": 8080, + "port": 8080 }, { "name": "solo", From 87ae31ef37f491246c07fd3b49a435c567700885 Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 1 Jul 2011 08:42:32 -0300 Subject: [PATCH 126/190] Set default affinity to CPU #0 only. --- guiminer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index 3c5f8da..c81520d 100644 --- a/guiminer.py +++ b/guiminer.py @@ -727,7 +727,7 @@ def set_data(self, data): self.txt_flags.SetValue(data.get('flags', '')) self.autostart = data.get('autostart', False) - self.affinity_mask = data.get('affinity_mask', (1 << self.num_processors) - 1) + self.affinity_mask = data.get('affinity_mask', 1) for i in range(self.num_processors): self.affinity_chks[i].SetValue((self.affinity_mask >> i) & 1) From fb55812dfd0b3030552f616525db9fe5e2d57196 Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 1 Jul 2011 09:01:43 -0300 Subject: [PATCH 127/190] Recover gracefully from failure to read settings file. --- guiminer.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/guiminer.py b/guiminer.py index c81520d..543ef35 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1847,11 +1847,16 @@ def parse_config(self): """Set self.config_data to a dictionary of config values.""" self.config_data = {} - config_filename = self.get_storage_location()[1] - if os.path.exists(config_filename): - with open(config_filename) as f: - self.config_data.update(json.load(f)) - logger.debug(_('Loaded: %s') % json.dumps(self.config_data)) + try: + config_filename = self.get_storage_location()[1] + if os.path.exists(config_filename): + with open(config_filename) as f: + self.config_data.update(json.load(f)) + logger.debug(_('Loaded: %s') % json.dumps(self.config_data)) + except ValueError: + self.message( + _("Your settings saved at:\n %s\nare corrupt or could not be read.\nDeleting this file or saving over it may solve the problem." % config_filename), + _("Error"), wx.ICON_ERROR) def load_config(self, event=None): """Load JSON profile info from the config file.""" From 23c267f3c729e944ae03d64ff92dffe3a6281dac Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 1 Jul 2011 09:12:38 -0300 Subject: [PATCH 128/190] setup.py should copy phak.cl. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 815f02d..61df61b 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ excludes = ["Tkconstants", "Tkinter", "tcl"], )), data_files = ['msvcp90.dll', - 'BitcoinMiner.cl', + 'phatk.cl', 'logo.ico', 'LICENSE.txt', 'servers.ini', From cd853a5e00fca617319d3f95545f6b3db4192cfe Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 1 Jul 2011 09:13:48 -0300 Subject: [PATCH 129/190] More decimal places on GHash. --- guiminer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index 543ef35..dabd38c 100644 --- a/guiminer.py +++ b/guiminer.py @@ -200,7 +200,7 @@ def add_tooltip(widget, text): def format_khash(rate): """Format rate for display. A rate of 0 means just connected.""" if rate > 10**6: - return _("%.1f Ghash/s") % (rate / 1000000.) + return _("%.3f Ghash/s") % (rate / 1000000.) if rate > 10**3: return _("%.1f Mhash/s") % (rate / 1000.) elif rate == 0: From ac81f1457b8066b00b0af601114970672bea1a35 Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 1 Jul 2011 09:23:22 -0300 Subject: [PATCH 130/190] Remember window size and position between sessions. --- guiminer.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index dabd38c..a3e9aee 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1828,7 +1828,8 @@ def save_config(self, event=None): profiles=profile_data, bitcoin_executable=self.bitcoin_executable, show_opencl_warning=self.do_show_opencl_warning, - start_minimized=self.start_minimized_chk.IsChecked()) + start_minimized=self.start_minimized_chk.IsChecked(), + window_position=list(self.GetRect())) logger.debug(_('Saving: ') + json.dumps(config_data)) try: with open(config_filename, 'w') as f: @@ -1891,6 +1892,10 @@ def load_config(self, event=None): if config_data.get('show_console', False): self.show_console() + + window_position = config_data.get('window_position') + if window_position: + self.SetRect(window_position) for p in self.profile_panels: if p.autostart: From aeeb690fb89e0123bbdbc49088a546c4073eb7d0 Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 1 Jul 2011 09:55:56 -0300 Subject: [PATCH 131/190] Add multiple BTC Guild servers. --- guiminer.py | 20 ++++++++++++-------- servers.ini | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 9 deletions(-) diff --git a/guiminer.py b/guiminer.py index a3e9aee..b61fe44 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1140,7 +1140,7 @@ def change_server(self, new_server): elif host == "bitpenny.dyndns.biz": self.layout_bitpenny() elif host == "pit.deepbit.net": self.layout_deepbit() elif host == "btcmine.com": self.layout_btcmine() - elif host == "btcguild.com": self.layout_btcguild() + elif "btcguild.com" in host: self.layout_btcguild() elif host == "pit.x8s.de": self.layout_x8s() else: self.layout_default() @@ -1229,16 +1229,20 @@ def on_withdraw(self, event): elif host == 'pit.deepbit.net': self.withdraw_deepbit() - def on_balance_refresh(self, event=None): - """Refresh the miner's balance from the server.""" - host = self.server_config.get("host") - + def requires_auth_token(self, host): + """Return True if the specified host name requires an auth token.""" HOSTS_REQUIRING_AUTH_TOKEN = ["api.bitcoin.cz", "btcmine.com", "pit.deepbit.net", - "pit.x8s.de", - "btcguild.com"] - if host in HOSTS_REQUIRING_AUTH_TOKEN: + "pit.x8s.de"] + if host in HOSTS_REQUIRING_AUTH_TOKEN: return True + if "btcguild" in host: return True + return False + + def on_balance_refresh(self, event=None): + """Refresh the miner's balance from the server.""" + host = self.server_config.get("host") + if self.requires_auth_token(host): self.require_auth_token() if not self.balance_auth_token: # They cancelled the dialog return diff --git a/servers.ini b/servers.ini index ceac396..c20322f 100644 --- a/servers.ini +++ b/servers.ini @@ -20,7 +20,8 @@ "balance_url": "/api/%s" }, - { "name": "BTC Guild", + { + "name": "BTC Guild (any)", "host": "btcguild.com", "url": "http://www.btcguild.com", "port": 8332, @@ -28,6 +29,51 @@ "balance_host": "www.btcguild.com", "balance_url": "/api.php?api_key=%s" }, + + { "name": "BTC Guild (Florida, USA)", + "host": "useast.btcguild.com", + "url": "http://www.btcguild.com", + "port": 8332, + "balance_token_url": "http://www.btcguild.com/my_api.php", + "balance_host": "www.btcguild.com", + "balance_url": "/api.php?api_key=%s" + }, + + { "name": "BTC Guild (Texas, USA)", + "host": "uscentral.btcguild.com", + "url": "http://www.btcguild.com", + "port": 8332, + "balance_token_url": "http://www.btcguild.com/my_api.php", + "balance_host": "www.btcguild.com", + "balance_url": "/api.php?api_key=%s" + }, + + { "name": "BTC Guild (California, USA)", + "host": "uswest.btcguild.com", + "url": "http://www.btcguild.com", + "port": 8332, + "balance_token_url": "http://www.btcguild.com/my_api.php", + "balance_host": "www.btcguild.com", + "balance_url": "/api.php?api_key=%s" + }, + + { "name": "BTC Guild (Germany)", + "host": "de.btcguild.com", + "url": "http://www.btcguild.com", + "port": 8332, + "balance_token_url": "http://www.btcguild.com/my_api.php", + "balance_host": "www.btcguild.com", + "balance_url": "/api.php?api_key=%s" + }, + + { "name": "BTC Guild (The Netherlands)", + "host": "nl.btcguild.com", + "url": "http://www.btcguild.com", + "port": 8332, + "balance_token_url": "http://www.btcguild.com/my_api.php", + "balance_host": "www.btcguild.com", + "balance_url": "/api.php?api_key=%s" + }, { "name": "BitPenny", From a8a727431a4c2c6233d76032fd27c56009d00c70 Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 1 Jul 2011 10:06:50 -0300 Subject: [PATCH 132/190] Add MTRed pool. --- guiminer.py | 4 +++- servers.ini | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index b61fe44..ec5233d 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1203,6 +1203,7 @@ def request_balance_get(self, balance_auth_token): info = json.loads(data) confirmed = (info.get('confirmed_reward') or info.get('confirmed') or + info.get('balance') or info.get('user', {}).get('confirmed_rewards') or 0) unconfirmed = (info.get('unconfirmed_reward') or @@ -1234,7 +1235,8 @@ def requires_auth_token(self, host): HOSTS_REQUIRING_AUTH_TOKEN = ["api.bitcoin.cz", "btcmine.com", "pit.deepbit.net", - "pit.x8s.de"] + "pit.x8s.de", + "mtred.com"] if host in HOSTS_REQUIRING_AUTH_TOKEN: return True if "btcguild" in host: return True return False diff --git a/servers.ini b/servers.ini index c20322f..7bed4a8 100644 --- a/servers.ini +++ b/servers.ini @@ -134,6 +134,16 @@ "balance_url": "/api/getbalance/%s/", "balance_token_url": "http://btc.x8s.de/account/profile" }, + + { + "name": "MTRed", + "host": "mtred.com", + "url": "https://mtred.com/", + "port": 8337, + "balance_host": "https://mtred.com", + "balance_url": "/api/user/key/%s/", + "balance_token_url": "https://mtred.com/user/profile/edit.html" + }, { "name": "solo", From d8a811473443818c81c130f44e4c13a41cddd1b8 Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 1 Jul 2011 10:28:54 -0300 Subject: [PATCH 133/190] Return 0 instead of raising exception if no OpenCL devices available. --- guiminer.py | 8 ++++---- servers.ini | 7 +++++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/guiminer.py b/guiminer.py index ec5233d..a4272b5 100644 --- a/guiminer.py +++ b/guiminer.py @@ -642,16 +642,16 @@ def device_index(self): """Return the index of the currently selected OpenCL device.""" s = self.device_listbox.GetStringSelection() match = re.search(r'\[(\d+)-(\d+)\]', s) - assert match is not None - return int(match.group(2)) + try: return int(match.group(2)) + except: return 0 @property def platform_index(self): """Return the index of the currently selected OpenCL platform.""" s = self.device_listbox.GetStringSelection() match = re.search(r'\[(\d+)-(\d+)\]', s) - assert match is not None - return int(match.group(1)) + try: return int(match.group(2)) + except: return 0 @property def is_device_visible(self): diff --git a/servers.ini b/servers.ini index 7bed4a8..c320df0 100644 --- a/servers.ini +++ b/servers.ini @@ -151,6 +151,13 @@ "url": "n/a", "port": 8332 }, + + { + "name": "Triplemining", + "host": "eu.triplemining.com", + "url": "https://www.triplemining.com", + "port": 8344 + }, { "name": "Other", From 8ec6b8594c57b876a9d48961409e00377d0d090f Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 1 Jul 2011 13:07:00 -0300 Subject: [PATCH 134/190] Support HTTPS balance request. Fix regression in reading platform dropdown. --- guiminer.py | 25 ++++++++++++++++--------- servers.ini | 2 +- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/guiminer.py b/guiminer.py index a4272b5..5628fd6 100644 --- a/guiminer.py +++ b/guiminer.py @@ -226,10 +226,11 @@ def init_logger(): logger, formatter = init_logger() -def http_request(hostname, *args): +def http_request(hostname, *args, **kwargs): """Do a HTTP request and return the response data.""" - try: - conn = httplib.HTTPConnection(hostname) + conn_cls = httplib.HTTPSConnection if kwargs.get('use_https') else httplib.HTTPConnection + conn = conn_cls(hostname) + try: logger.debug(_("Requesting balance: %(request)s"), dict(request=args)) conn.request(*args) response = conn.getresponse() @@ -650,7 +651,7 @@ def platform_index(self): """Return the index of the currently selected OpenCL platform.""" s = self.device_listbox.GetStringSelection() match = re.search(r'\[(\d+)-(\d+)\]', s) - try: return int(match.group(2)) + try: return int(match.group(1)) except: return 0 @property @@ -1136,7 +1137,7 @@ def change_server(self, new_server): # Call server specific code. host = new_server.get('host', "").lower() - if host == "api.bitcoin.cz": self.layout_slush() + if host == "api.bitcoin.cz" or host == "mtred.com": self.layout_slush() elif host == "bitpenny.dyndns.biz": self.layout_bitpenny() elif host == "pit.deepbit.net": self.layout_deepbit() elif host == "btcmine.com": self.layout_btcmine() @@ -1184,7 +1185,7 @@ def is_auth_token_rejected(self, response): return True return False - def request_balance_get(self, balance_auth_token): + def request_balance_get(self, balance_auth_token, use_https=False): """Request our balance from the server via HTTP GET and auth token. This method should be run in its own thread. @@ -1192,7 +1193,8 @@ def request_balance_get(self, balance_auth_token): response, data = http_request( self.server_config['balance_host'], "GET", - self.server_config["balance_url"] % balance_auth_token + self.server_config["balance_url"] % balance_auth_token, + use_https=use_https ) if self.is_auth_token_rejected(response): data = _("Auth token rejected by server.") @@ -1231,7 +1233,7 @@ def on_withdraw(self, event): self.withdraw_deepbit() def requires_auth_token(self, host): - """Return True if the specified host name requires an auth token.""" + """Return True if the specified host requires an auth token for balance update.""" HOSTS_REQUIRING_AUTH_TOKEN = ["api.bitcoin.cz", "btcmine.com", "pit.deepbit.net", @@ -1241,6 +1243,10 @@ def requires_auth_token(self, host): if "btcguild" in host: return True return False + def requires_https(self, host): + """Return True if the specified host requires HTTPs for balance update.""" + return host == "mtred.com" + def on_balance_refresh(self, event=None): """Refresh the miner's balance from the server.""" host = self.server_config.get("host") @@ -1254,7 +1260,8 @@ def on_balance_refresh(self, event=None): return # Invalid characters in auth token self.http_thread = threading.Thread( target=self.request_balance_get, - args=(self.balance_auth_token,)) + args=(self.balance_auth_token,), + kwargs=dict(use_https=self.requires_https(host))) self.http_thread.start() elif host == 'bitpenny.dyndns.biz': self.http_thread = threading.Thread( diff --git a/servers.ini b/servers.ini index c320df0..19adcbc 100644 --- a/servers.ini +++ b/servers.ini @@ -140,7 +140,7 @@ "host": "mtred.com", "url": "https://mtred.com/", "port": 8337, - "balance_host": "https://mtred.com", + "balance_host": "mtred.com", "balance_url": "/api/user/key/%s/", "balance_token_url": "https://mtred.com/user/profile/edit.html" }, From 4330cd5b9cab97412ed9c321a7e38ee9e76ad882 Mon Sep 17 00:00:00 2001 From: Kiv Date: Fri, 1 Jul 2011 13:14:30 -0300 Subject: [PATCH 135/190] Version bump. --- guiminer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index 5628fd6..aa2f822 100644 --- a/guiminer.py +++ b/guiminer.py @@ -25,7 +25,7 @@ from wx.lib.agw import hyperlink from wx.lib.newevent import NewEvent -__version__ = '2011-06-14' +__version__ = '2011-07-01' def get_module_path(): """Return the folder containing this script (or its .exe).""" From 55497852819c0c989514400f5758cb53f27aaed2 Mon Sep 17 00:00:00 2001 From: kpfile Date: Thu, 7 Jul 2011 11:10:53 -0700 Subject: [PATCH 136/190] Added ArsBitcoin to servers.ini --- servers.ini | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/servers.ini b/servers.ini index c320df0..28f452a 100644 --- a/servers.ini +++ b/servers.ini @@ -144,6 +144,13 @@ "balance_url": "/api/user/key/%s/", "balance_token_url": "https://mtred.com/user/profile/edit.html" }, + + { + "name": "ArsBitcoin", + "host": "arsbitcoin.com", + "url": "http://arsbitcoin.com/", + "port": 8344 + }, { "name": "solo", From ae89c650a479c9ba8ed1ba390b290cfcc8644363 Mon Sep 17 00:00:00 2001 From: Simplecoin Date: Mon, 18 Jul 2011 14:06:02 -0700 Subject: [PATCH 137/190] Added simplecoin.us server --- servers.ini | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/servers.ini b/servers.ini index 28f452a..dfe5b77 100644 --- a/servers.ini +++ b/servers.ini @@ -151,6 +151,16 @@ "url": "http://arsbitcoin.com/", "port": 8344 }, + + { + "name": "Simplecoin.us", + "host": "simplecoin.us", + "url": "https://simplecoin.us/", + "port": 8337, + "balance_token_url": "simplecoin.us/accountdetails.php", + "balance_host": "simplecoin.us", + "balance_url": "/api.php?api_key=%s" + }, { "name": "solo", From 4434ba5463842f874ca5998519a6e0de41a12163 Mon Sep 17 00:00:00 2001 From: Ketzer2002 Date: Thu, 4 Aug 2011 17:40:02 +0300 Subject: [PATCH 138/190] Changed the Guiminer, that www.bitcoin-server.de is used for balance token URLs. --- guiminer.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/guiminer.py b/guiminer.py index a4272b5..1baf5d6 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1141,6 +1141,7 @@ def change_server(self, new_server): elif host == "pit.deepbit.net": self.layout_deepbit() elif host == "btcmine.com": self.layout_btcmine() elif "btcguild.com" in host: self.layout_btcguild() + elif "www.bitcoin-server.de" in host: self.layout_bitcoinserver elif host == "pit.x8s.de": self.layout_x8s() else: self.layout_default() @@ -1239,6 +1240,7 @@ def requires_auth_token(self, host): "mtred.com"] if host in HOSTS_REQUIRING_AUTH_TOKEN: return True if "btcguild" in host: return True + if "www.bitcoin-server.de" in host: return True return False def on_balance_refresh(self, event=None): @@ -1519,6 +1521,10 @@ def layout_btcguild(self): """BTC Guild has the same layout as slush for now.""" self.layout_slush() + def layout_bitcoinserver(self): + """Bitcoin-Server.de has the same layout as slush for now.""" + self.layout_slush() + def layout_btcmine(self): self.set_widgets_visible([self.host_lbl, self.txt_host, self.port_lbl, self.txt_port, From 1ba4a9ffcd247bf9a7d44b0ad3d721b617980341 Mon Sep 17 00:00:00 2001 From: Simplecoin Date: Mon, 15 Aug 2011 19:26:00 -0500 Subject: [PATCH 139/190] Edited for new simplecoin pool information --- servers.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers.ini b/servers.ini index dfe5b77..b8b8980 100644 --- a/servers.ini +++ b/servers.ini @@ -154,7 +154,7 @@ { "name": "Simplecoin.us", - "host": "simplecoin.us", + "host": "pool.simplecoin.us", "url": "https://simplecoin.us/", "port": 8337, "balance_token_url": "simplecoin.us/accountdetails.php", From a65dd4664faf957713275aff786084cd80c22de9 Mon Sep 17 00:00:00 2001 From: Kiv Date: Tue, 23 Aug 2011 09:51:35 -0300 Subject: [PATCH 140/190] Update to newest poclbm. --- guiminer.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/guiminer.py b/guiminer.py index aa2f822..2fe99a3 100644 --- a/guiminer.py +++ b/guiminer.py @@ -426,7 +426,7 @@ def on_pause(self, event): class MinerListenerThread(threading.Thread): LINES = [ - (r"Target =|average rate|Sending to server|found hash!", + (r"Target =|average rate|Sending to server|found hash|connected to|Setting server", lambda _: None), # Just ignore lines like these (r"accepted|\"result\":\s*true", lambda _: UpdateAcceptedEvent(accepted=True)), @@ -434,6 +434,8 @@ class MinerListenerThread(threading.Thread): UpdateAcceptedEvent(accepted=False)), (r"(\d+)\s*khash/s", lambda match: UpdateHashRateEvent(rate=int(match.group(1)))), + (r"(\d+\.\d+)\s*MH/s", lambda match: + UpdateHashRateEvent(rate=float(match.group(1)) * 1000)), (r"(\d+\.\d+)\s*Mhash/s", lambda match: UpdateHashRateEvent(rate=float(match.group(1)) * 1000)), (r"(\d+)\s*Mhash/s", lambda match: @@ -838,7 +840,7 @@ def configure_subprocess_poclbm(self): executable = "poclbm.exe" else: executable = "python poclbm.py" - cmd = "%s --user=%s --pass=%s -o %s -p %s --device=%d --platform=%d --verbose %s" % ( + cmd = "%s %s:%s@%s:%s --device=%d --platform=%d %s" % ( executable, self.txt_username.GetValue(), self.txt_pass.GetValue(), From e0e3bf236ea54ea43de1c1b5c8e67291e25d0197 Mon Sep 17 00:00:00 2001 From: Kiv Date: Tue, 23 Aug 2011 10:29:15 -0300 Subject: [PATCH 141/190] Limit console scrollback to 500 lines by default, configurable in settings file. --- guiminer.py | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/guiminer.py b/guiminer.py index 2fe99a3..7c083cb 100644 --- a/guiminer.py +++ b/guiminer.py @@ -253,14 +253,23 @@ def set_process_affinity(pid, mask): handle = win32api.OpenProcess(flags, 0, pid) win32process.SetProcessAffinityMask(handle, mask) +def find_nth(haystack, needle, n): + """Return the index of the nth occurrence of needle in haystack.""" + start = haystack.find(needle) + while start >= 0 and n > 1: + start = haystack.find(needle, start+len(needle)) + n -= 1 + return start + class ConsolePanel(wx.Panel): """Panel that displays logging events. Uses with a StreamHandler to log events to a TextCtrl. Thread-safe. """ - def __init__(self, parent): + def __init__(self, parent, n_max_lines): wx.Panel.__init__(self, parent, -1) self.parent = parent + self.n_max_lines = n_max_lines vbox = wx.BoxSizer(wx.VERTICAL) style = wx.TE_MULTILINE | wx.TE_READONLY | wx.HSCROLL @@ -284,9 +293,17 @@ def on_close(self): """On closing, stop handling logging events.""" logger.removeHandler(self.handler) + def append_text(self, text): + self.text.AppendText(text) + lines_to_cut = self.text.GetNumberOfLines() - self.n_max_lines + if lines_to_cut > 0: + contents = self.text.GetValue() + position = find_nth(contents, '\n', lines_to_cut) + self.text.ChangeValue(contents[position+1:]) + def write(self, text): """Forward logging events to our TextCtrl.""" - wx.CallAfter(self.text.AppendText, text) + wx.CallAfter(self.append_text, text) class SummaryPanel(wx.Panel): @@ -1597,6 +1614,7 @@ def __init__(self, *args, **kwds): self.parse_config() self.do_show_opencl_warning = self.config_data.get('show_opencl_warning', True) + self.console_max_lines = self.config_data.get('console_max_lines', 500) ID_NEW_EXTERNAL, ID_NEW_PHOENIX, ID_NEW_CUDA, ID_NEW_UFASOFT = wx.NewId(), wx.NewId(), wx.NewId(), wx.NewId() self.menubar = wx.MenuBar() @@ -2034,7 +2052,7 @@ def show_console(self, event=None): """Show the console log in its own tab.""" if self.is_console_visible(): return # Console already shown - self.console_panel = ConsolePanel(self) + self.console_panel = ConsolePanel(self, self.console_max_lines) self.nb.AddPage(self.console_panel, _("Console")) self.nb.EnsureVisible(self.nb.GetPageCount() - 1) From 6ea1ae90cf7635be87562408a07c2ae47494645e Mon Sep 17 00:00:00 2001 From: Kiv Date: Tue, 23 Aug 2011 10:32:29 -0300 Subject: [PATCH 142/190] Set focus on auth token dialog box to make pasting easier. --- guiminer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/guiminer.py b/guiminer.py index 7c083cb..156d864 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1186,6 +1186,7 @@ def require_auth_token(self): return url = self.server_config.get('balance_token_url') dialog = BalanceAuthRequest(self, url) + dialog.txt_token.SetFocus() result = dialog.ShowModal() dialog.Destroy() if result == wx.ID_CANCEL: From ebd82e1d84882e0061ab1d78c8916ff8af29622b Mon Sep 17 00:00:00 2001 From: Kiv Date: Tue, 23 Aug 2011 10:39:33 -0300 Subject: [PATCH 143/190] Change default maximum lines to 5000. --- guiminer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index 156d864..f51b883 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1615,7 +1615,7 @@ def __init__(self, *args, **kwds): self.parse_config() self.do_show_opencl_warning = self.config_data.get('show_opencl_warning', True) - self.console_max_lines = self.config_data.get('console_max_lines', 500) + self.console_max_lines = self.config_data.get('console_max_lines', 5000) ID_NEW_EXTERNAL, ID_NEW_PHOENIX, ID_NEW_CUDA, ID_NEW_UFASOFT = wx.NewId(), wx.NewId(), wx.NewId(), wx.NewId() self.menubar = wx.MenuBar() From a64a05df9a0f23bb54614f567e00f64670fda8f1 Mon Sep 17 00:00:00 2001 From: Kiv Date: Tue, 23 Aug 2011 11:03:51 -0300 Subject: [PATCH 144/190] Remove MyBitcoin donation link and use regular address instead. --- guiminer.py | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/guiminer.py b/guiminer.py index f51b883..74f320a 100644 --- a/guiminer.py +++ b/guiminer.py @@ -52,8 +52,7 @@ def get_module_path(): } LANGUAGES_REVERSE = dict((v,k) for (k,v) in LANGUAGES.items()) -DONATE_SMALL_URL = 'https://www.mybitcoin.com/sci/paypage.php?t=XFxBkKwtjVYHmQmHzVP1jE_euOoSpMZcXJ5XDtQ1EhISH6nuDWExVwvVYXHQjDC-ApO9Zlwww7tqJnCVP4kBSoaaOdLpyFYSKI9LbTjwnKi-tZEMYKmmfhSqGLWNS_BoVHN0RJFwsQlxKleftmfKG7dpRfQ9or2uX1RE1aWesJA9AsU%2C' - +DONATION_ADDRESS = "1MDDh2h4cAZDafgc94mr9q95dhRYcJbNQo" locale = None language = None def update_language(new_language): @@ -1658,7 +1657,7 @@ def __init__(self, *args, **kwds): ID_DONATE_SMALL = wx.NewId() donate_menu = wx.Menu() - donate_menu.Append(ID_DONATE_SMALL, _("&Donate 99 cents..."), _("Donate $0.99 USD worth of Bitcoins to support GUIMiner development")) + donate_menu.Append(ID_DONATE_SMALL, _("&Donate..."), _("Donate Bitcoins to support GUIMiner development")) self.menubar.Append(donate_menu, _("&Donate")) help_menu = wx.Menu() @@ -2095,7 +2094,35 @@ def on_change_language(self, event): save_language() def on_donate(self, event): - webbrowser.open(DONATE_SMALL_URL) + dialog = DonateDialog(self, -1, _('Donate')) + dialog.ShowModal() + dialog.Destroy() + +class DonateDialog(wx.Dialog): + """About dialog for the app with a donation address.""" + DONATE_TEXT = "If this software helped you, please consider contributing to its development." \ + "\nSend donations to: %(address)s" + def __init__(self, parent, id, title): + wx.Dialog.__init__(self, parent, id, title) + vbox = wx.BoxSizer(wx.VERTICAL) + + text = DonateDialog.DONATE_TEXT % dict(address=DONATION_ADDRESS) + self.about_text = wx.StaticText(self, -1, text) + self.copy_btn = wx.Button(self, -1, _("Copy address to clipboard")) + vbox.Add(self.about_text, 0, wx.ALL, 10) + vbox.Add(self.copy_btn, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 10) + self.SetSizerAndFit(vbox) + + self.copy_btn.Bind(wx.EVT_BUTTON, self.on_copy) + + def on_copy(self, event): + """Copy the donation address to the clipboard.""" + if wx.TheClipboard.Open(): + data = wx.TextDataObject() + data.SetText(DONATION_ADDRESS) + wx.TheClipboard.SetData(data) + wx.TheClipboard.Close() + class ChangeLanguageDialog(wx.Dialog): """Dialog prompting the user to change languages.""" @@ -2176,13 +2203,13 @@ def get_value(self): class AboutGuiminer(wx.Dialog): """About dialog for the app with a donation address.""" - donation_address = "1MDDh2h4cAZDafgc94mr9q95dhRYcJbNQo" + def __init__(self, parent, id, title): wx.Dialog.__init__(self, parent, id, title) vbox = wx.BoxSizer(wx.VERTICAL) text = ABOUT_TEXT % dict(version=__version__, - address=AboutGuiminer.donation_address) + address=DONATION_ADDRESS) self.about_text = wx.StaticText(self, -1, text) self.copy_btn = wx.Button(self, -1, _("Copy address to clipboard")) vbox.Add(self.about_text) @@ -2195,7 +2222,7 @@ def on_copy(self, event): """Copy the donation address to the clipboard.""" if wx.TheClipboard.Open(): data = wx.TextDataObject() - data.SetText(AboutGuiminer.donation_address) + data.SetText(DONATION_ADDRESS) wx.TheClipboard.SetData(data) wx.TheClipboard.Close() From 6c08088dac108bb189a785bc301b74022880b49e Mon Sep 17 00:00:00 2001 From: Kiv Date: Tue, 23 Aug 2011 11:51:01 -0300 Subject: [PATCH 145/190] Update servers --- servers.ini | 94 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 85 insertions(+), 9 deletions(-) diff --git a/servers.ini b/servers.ini index 64515e1..61e60a4 100644 --- a/servers.ini +++ b/servers.ini @@ -152,15 +152,15 @@ "port": 8344 }, - { - "name": "Simplecoin.us", - "host": "simplecoin.us", - "url": "https://simplecoin.us/", - "port": 8337, - "balance_token_url": "simplecoin.us/accountdetails.php", - "balance_host": "simplecoin.us", - "balance_url": "/api.php?api_key=%s" - }, + { + "name": "Simplecoin.us", + "host": "simplecoin.us", + "url": "https://simplecoin.us/", + "port": 8337, + "balance_token_url": "simplecoin.us/accountdetails.php", + "balance_host": "simplecoin.us", + "balance_url": "/api.php?api_key=%s" + }, { "name": "solo", @@ -175,12 +175,88 @@ "url": "https://www.triplemining.com", "port": 8344 }, + + { "name": "Eclipse US", + "host": "us.eclipsemc.com", + "url": "https://eclipsemc.com", + "port": 8337, + "balance_token_url": "https://eclipsemc.com/my_account.php", + "balance_host": "eclipsemc.com", + "balance_url": "/api.key?key=%s&action=getbalance" + }, + + { + "name": "Eclipse EU", + "host": "eu.eclipsemc.com", + "url": "https://eclipsemc.com", + "port": 8337, + "balance_token_url": "https://eclipsemc.com/my_account.php", + "balance_host": "eclipsemc.com", + "balance_url": "/api.key?key=%s&action=getbalance" + }, + + { + "name": "Eclipse AU / Asia", + "host": "pacrim.eclipsemc.com", + "url": "https://eclipsemc.com", + "port": 8337, + "balance_token_url": "https://eclipsemc.com/my_account.php", + "balance_host": "eclipsemc.com", + "balance_url": "/api.key?key=%s&action=getbalance" + }, + + { + "name": "Bithasher", + "host": "bithasher.com", + "url": "http://www.bithasher.com", + "port": 8332 + }, + { + "name": "rfcpool", + "host": "pool.rfcpool.com", + "url": "https://www.rfcpool.com", + "port": 8332 + }, + + { + "name": "NinjaCoin", + "host": "mine.ninjacoin.com", + "url": "https://www.ninjacoin.com", + "port": 8332 + }, + + { + "name": "DigBtc", + "host": "btc.digbtc.net", + "url": "http://digbtc.net", + "port": 8332 + }, + + { + "name": "BitcoinMonkey", + "host": "bitcoinmonkey.com", + "url": "https://www.bitcoinmonkey.com", + "port": 8332 + }, + + { + "name": "United Miners", + "host": "pool.unitedminers.com", + "url": "http://www.unitedminers.com", + "port": 8332, + "balance_token_url": "http://www.unitedminers.com/?action=myapi", + "balance_host": "www.unitedminers.com", + "balance_url": "/?action=api&cmd=%s" + }, + { "name": "Other", "host": "", "url": "n/a", "port": 8332 } + + ] } From 02d144187d1dc9e2ee8a596d212332ee18cbce68 Mon Sep 17 00:00:00 2001 From: Kiv Date: Tue, 23 Aug 2011 14:33:45 -0300 Subject: [PATCH 146/190] Update servers.ini. --- servers.ini | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/servers.ini b/servers.ini index 5b6b9f0..995e3a0 100644 --- a/servers.ini +++ b/servers.ini @@ -2,7 +2,7 @@ "servers": [ { "name": "slush's pool", - "host": "api.bitcoin.cz", + "host": "api2.bitcoin.cz", "url": "http://mining.bitcoin.cz", "port": 8332, "balance_token_url": "http://mining.bitcoin.cz/accounts/token-manage/", @@ -136,8 +136,8 @@ }, { - "name": "MTRed", - "host": "mtred.com", + "name": "MTRed (US)", + "host": "us.mtred.com", "url": "https://mtred.com/", "port": 8337, "balance_host": "mtred.com", @@ -161,6 +161,20 @@ "balance_host": "simplecoin.us", "balance_url": "/api.php?api_key=%s" }, + + { + "name": "ABCPool", + "host": "pool.ABCPool.co", + "url": "http://abcpool.co/", + "port": 8332 + }, + + { + "name": "Betcoin.co", + "host": "pool.betcoin.co", + "url": "http://pool.betcoin.co/", + "port": 8337 + }, { "name": "solo", From 00081e13fcf626d4a0a1ff70b24fe4dad43cc77d Mon Sep 17 00:00:00 2001 From: Kiv Date: Tue, 23 Aug 2011 14:36:15 -0300 Subject: [PATCH 147/190] Format servers.ini --- servers.ini | 509 +++++++++++++++++++++++++--------------------------- 1 file changed, 241 insertions(+), 268 deletions(-) diff --git a/servers.ini b/servers.ini index 995e3a0..1ea1b1a 100644 --- a/servers.ini +++ b/servers.ini @@ -1,276 +1,249 @@ { - "servers": [ + "servers": [ { + "balance_host": "mining.bitcoin.cz", + "balance_token_url": "http://mining.bitcoin.cz/accounts/token-manage/", + "balance_url": "/accounts/profile/json/%s", + "host": "api2.bitcoin.cz", "name": "slush's pool", - "host": "api2.bitcoin.cz", - "url": "http://mining.bitcoin.cz", - "port": 8332, - "balance_token_url": "http://mining.bitcoin.cz/accounts/token-manage/", - "balance_host": "mining.bitcoin.cz", - "balance_url": "/accounts/profile/json/%s" - }, - - { - "name": "deepbit", - "host": "pit.deepbit.net", - "url": "http://deepbit.net", - "port": 8332, - "balance_token_url": "http://deepbit.net/settings/", - "balance_host": "deepbit.net", - "balance_url": "/api/%s" - }, - - { - "name": "BTC Guild (any)", - "host": "btcguild.com", - "url": "http://www.btcguild.com", - "port": 8332, - "balance_token_url": "http://www.btcguild.com/my_api.php", - "balance_host": "www.btcguild.com", - "balance_url": "/api.php?api_key=%s" - }, - - { "name": "BTC Guild (Florida, USA)", - "host": "useast.btcguild.com", - "url": "http://www.btcguild.com", - "port": 8332, - "balance_token_url": "http://www.btcguild.com/my_api.php", - "balance_host": "www.btcguild.com", - "balance_url": "/api.php?api_key=%s" - }, - - { "name": "BTC Guild (Texas, USA)", - "host": "uscentral.btcguild.com", - "url": "http://www.btcguild.com", - "port": 8332, - "balance_token_url": "http://www.btcguild.com/my_api.php", - "balance_host": "www.btcguild.com", - "balance_url": "/api.php?api_key=%s" - }, - - { "name": "BTC Guild (California, USA)", - "host": "uswest.btcguild.com", - "url": "http://www.btcguild.com", - "port": 8332, - "balance_token_url": "http://www.btcguild.com/my_api.php", - "balance_host": "www.btcguild.com", - "balance_url": "/api.php?api_key=%s" - }, - - { "name": "BTC Guild (Germany)", - "host": "de.btcguild.com", - "url": "http://www.btcguild.com", - "port": 8332, - "balance_token_url": "http://www.btcguild.com/my_api.php", - "balance_host": "www.btcguild.com", - "balance_url": "/api.php?api_key=%s" - }, - - { "name": "BTC Guild (The Netherlands)", - "host": "nl.btcguild.com", - "url": "http://www.btcguild.com", - "port": 8332, - "balance_token_url": "http://www.btcguild.com/my_api.php", - "balance_host": "www.btcguild.com", - "balance_url": "/api.php?api_key=%s" - }, - - { - "name": "BitPenny", - "host": "bitpenny.dyndns.biz", - "url": "http://bitpenny.com", - "port": 8332, - "balance_host": "bitpenny.com", - "balance_url": "/gui.php" - }, - - { - "name": "bitcoinpool", - "host": "bitcoinpool.com", - "url": "http://bitcoinpool.com", - "port": 8334 - }, - - { - "name": "BTCMine", - "host": "btcmine.com", - "url": "http://btcmine.com", - "port": 8332, - "balance_host": "btcmine.com", - "balance_url": "/api/getbalance/%s/", - "balance_token_url": "http://btcmine.com/user/profile/" - }, - - { - "name": "BitClockers", - "host": "pool.bitclockers.com", - "url": "http://bitclockers.com", - "port": 8332, - "balance_host": "bitclockers.com", - "balance_url": "/api/%s/", - "balance_token_url": "http://bitclockers.com/dashboard/" - }, - + "port": 8332, + "url": "http://mining.bitcoin.cz" + }, { + "balance_host": "deepbit.net", + "balance_token_url": "http://deepbit.net/settings/", + "balance_url": "/api/%s", + "host": "pit.deepbit.net", + "name": "deepbit", + "port": 8332, + "url": "http://deepbit.net" + }, + { + "balance_host": "www.btcguild.com", + "balance_token_url": "http://www.btcguild.com/my_api.php", + "balance_url": "/api.php?api_key=%s", + "host": "btcguild.com", + "name": "BTC Guild (any)", + "port": 8332, + "url": "http://www.btcguild.com" + }, + { + "balance_host": "www.btcguild.com", + "balance_token_url": "http://www.btcguild.com/my_api.php", + "balance_url": "/api.php?api_key=%s", + "host": "useast.btcguild.com", + "name": "BTC Guild (Florida, USA)", + "port": 8332, + "url": "http://www.btcguild.com" + }, + { + "balance_host": "www.btcguild.com", + "balance_token_url": "http://www.btcguild.com/my_api.php", + "balance_url": "/api.php?api_key=%s", + "host": "uscentral.btcguild.com", + "name": "BTC Guild (Texas, USA)", + "port": 8332, + "url": "http://www.btcguild.com" + }, + { + "balance_host": "www.btcguild.com", + "balance_token_url": "http://www.btcguild.com/my_api.php", + "balance_url": "/api.php?api_key=%s", + "host": "uswest.btcguild.com", + "name": "BTC Guild (California, USA)", + "port": 8332, + "url": "http://www.btcguild.com" + }, + { + "balance_host": "www.btcguild.com", + "balance_token_url": "http://www.btcguild.com/my_api.php", + "balance_url": "/api.php?api_key=%s", + "host": "de.btcguild.com", + "name": "BTC Guild (Germany)", + "port": 8332, + "url": "http://www.btcguild.com" + }, + { + "balance_host": "www.btcguild.com", + "balance_token_url": "http://www.btcguild.com/my_api.php", + "balance_url": "/api.php?api_key=%s", + "host": "nl.btcguild.com", + "name": "BTC Guild (The Netherlands)", + "port": 8332, + "url": "http://www.btcguild.com" + }, + { + "balance_host": "bitpenny.com", + "balance_url": "/gui.php", + "host": "bitpenny.dyndns.biz", + "name": "BitPenny", + "port": 8332, + "url": "http://bitpenny.com" + }, + { + "host": "bitcoinpool.com", + "name": "bitcoinpool", + "port": 8334, + "url": "http://bitcoinpool.com" + }, + { + "balance_host": "btcmine.com", + "balance_token_url": "http://btcmine.com/user/profile/", + "balance_url": "/api/getbalance/%s/", + "host": "btcmine.com", + "name": "BTCMine", + "port": 8332, + "url": "http://btcmine.com" + }, + { + "balance_host": "bitclockers.com", + "balance_token_url": "http://bitclockers.com/dashboard/", + "balance_url": "/api/%s/", + "host": "pool.bitclockers.com", + "name": "BitClockers", + "port": 8332, + "url": "http://bitclockers.com" + }, + { + "host": "bitcoin.lc", "name": "Bitcoin.lc", - "host": "bitcoin.lc", - "url": "http://www.bitcoins.lc", - "port": 8080 - }, - - { - "name": "BTCMP", - "host": "rr.btcmp.com", - "url": "http://www.btcmp.com", - "port": 8332 - }, - - { - "name": "x8s", - "host": "pit.x8s.de", - "url": "http://btc.x8s.de", - "port": 8337, - "balance_host": "btc.x8s.de", - "balance_url": "/api/getbalance/%s/", - "balance_token_url": "http://btc.x8s.de/account/profile" - }, - - { - "name": "MTRed (US)", - "host": "us.mtred.com", - "url": "https://mtred.com/", - "port": 8337, - "balance_host": "mtred.com", - "balance_url": "/api/user/key/%s/", - "balance_token_url": "https://mtred.com/user/profile/edit.html" - }, - - { - "name": "ArsBitcoin", - "host": "arsbitcoin.com", - "url": "http://arsbitcoin.com/", - "port": 8344 - }, - - { - "name": "Simplecoin.us", - "host": "pool.simplecoin.us", - "url": "https://simplecoin.us/", - "port": 8337, - "balance_token_url": "simplecoin.us/accountdetails.php", - "balance_host": "simplecoin.us", - "balance_url": "/api.php?api_key=%s" - }, - - { - "name": "ABCPool", - "host": "pool.ABCPool.co", - "url": "http://abcpool.co/", - "port": 8332 - }, - - { - "name": "Betcoin.co", - "host": "pool.betcoin.co", - "url": "http://pool.betcoin.co/", - "port": 8337 - }, - - { - "name": "solo", - "host": "localhost", - "url": "n/a", - "port": 8332 - }, - - { - "name": "Triplemining", - "host": "eu.triplemining.com", - "url": "https://www.triplemining.com", - "port": 8344 - }, - - { "name": "Eclipse US", - "host": "us.eclipsemc.com", - "url": "https://eclipsemc.com", - "port": 8337, - "balance_token_url": "https://eclipsemc.com/my_account.php", - "balance_host": "eclipsemc.com", - "balance_url": "/api.key?key=%s&action=getbalance" - }, - - { - "name": "Eclipse EU", - "host": "eu.eclipsemc.com", - "url": "https://eclipsemc.com", - "port": 8337, - "balance_token_url": "https://eclipsemc.com/my_account.php", - "balance_host": "eclipsemc.com", - "balance_url": "/api.key?key=%s&action=getbalance" - }, - - { - "name": "Eclipse AU / Asia", - "host": "pacrim.eclipsemc.com", - "url": "https://eclipsemc.com", - "port": 8337, - "balance_token_url": "https://eclipsemc.com/my_account.php", - "balance_host": "eclipsemc.com", - "balance_url": "/api.key?key=%s&action=getbalance" - }, - - { - "name": "Bithasher", - "host": "bithasher.com", - "url": "http://www.bithasher.com", - "port": 8332 - }, - - { - "name": "rfcpool", - "host": "pool.rfcpool.com", - "url": "https://www.rfcpool.com", - "port": 8332 - }, - - { - "name": "NinjaCoin", - "host": "mine.ninjacoin.com", - "url": "https://www.ninjacoin.com", - "port": 8332 - }, - - { - "name": "DigBtc", - "host": "btc.digbtc.net", - "url": "http://digbtc.net", - "port": 8332 - }, - - { - "name": "BitcoinMonkey", - "host": "bitcoinmonkey.com", - "url": "https://www.bitcoinmonkey.com", - "port": 8332 - }, - - { - "name": "United Miners", - "host": "pool.unitedminers.com", - "url": "http://www.unitedminers.com", - "port": 8332, - "balance_token_url": "http://www.unitedminers.com/?action=myapi", - "balance_host": "www.unitedminers.com", - "balance_url": "/?action=api&cmd=%s" - }, - - { - "name": "Other", - "host": "", - "url": "n/a", - "port": 8332 + "port": 8080, + "url": "http://www.bitcoins.lc" + }, + { + "host": "rr.btcmp.com", + "name": "BTCMP", + "port": 8332, + "url": "http://www.btcmp.com" + }, + { + "balance_host": "btc.x8s.de", + "balance_token_url": "http://btc.x8s.de/account/profile", + "balance_url": "/api/getbalance/%s/", + "host": "pit.x8s.de", + "name": "x8s", + "port": 8337, + "url": "http://btc.x8s.de" + }, + { + "balance_host": "mtred.com", + "balance_token_url": "https://mtred.com/user/profile/edit.html", + "balance_url": "/api/user/key/%s/", + "host": "us.mtred.com", + "name": "MTRed (US)", + "port": 8337, + "url": "https://mtred.com/" + }, + { + "host": "arsbitcoin.com", + "name": "ArsBitcoin", + "port": 8344, + "url": "http://arsbitcoin.com/" + }, + { + "balance_host": "simplecoin.us", + "balance_token_url": "simplecoin.us/accountdetails.php", + "balance_url": "/api.php?api_key=%s", + "host": "pool.simplecoin.us", + "name": "Simplecoin.us", + "port": 8337, + "url": "https://simplecoin.us/" + }, + { + "host": "pool.ABCPool.co", + "name": "ABCPool", + "port": 8332, + "url": "http://abcpool.co/" + }, + { + "host": "pool.betcoin.co", + "name": "Betcoin.co", + "port": 8337, + "url": "http://pool.betcoin.co/" + }, + { + "host": "localhost", + "name": "solo", + "port": 8332, + "url": "n/a" + }, + { + "host": "eu.triplemining.com", + "name": "Triplemining", + "port": 8344, + "url": "https://www.triplemining.com" + }, + { + "balance_host": "eclipsemc.com", + "balance_token_url": "https://eclipsemc.com/my_account.php", + "balance_url": "/api.key?key=%s&action=getbalance", + "host": "us.eclipsemc.com", + "name": "Eclipse US", + "port": 8337, + "url": "https://eclipsemc.com" + }, + { + "balance_host": "eclipsemc.com", + "balance_token_url": "https://eclipsemc.com/my_account.php", + "balance_url": "/api.key?key=%s&action=getbalance", + "host": "eu.eclipsemc.com", + "name": "Eclipse EU", + "port": 8337, + "url": "https://eclipsemc.com" + }, + { + "balance_host": "eclipsemc.com", + "balance_token_url": "https://eclipsemc.com/my_account.php", + "balance_url": "/api.key?key=%s&action=getbalance", + "host": "pacrim.eclipsemc.com", + "name": "Eclipse AU / Asia", + "port": 8337, + "url": "https://eclipsemc.com" + }, + { + "host": "bithasher.com", + "name": "Bithasher", + "port": 8332, + "url": "http://www.bithasher.com" + }, + { + "host": "pool.rfcpool.com", + "name": "rfcpool", + "port": 8332, + "url": "https://www.rfcpool.com" + }, + { + "host": "mine.ninjacoin.com", + "name": "NinjaCoin", + "port": 8332, + "url": "https://www.ninjacoin.com" + }, + { + "host": "btc.digbtc.net", + "name": "DigBtc", + "port": 8332, + "url": "http://digbtc.net" + }, + { + "host": "bitcoinmonkey.com", + "name": "BitcoinMonkey", + "port": 8332, + "url": "https://www.bitcoinmonkey.com" + }, + { + "balance_host": "www.unitedminers.com", + "balance_token_url": "http://www.unitedminers.com/?action=myapi", + "balance_url": "/?action=api&cmd=%s", + "host": "pool.unitedminers.com", + "name": "United Miners", + "port": 8332, + "url": "http://www.unitedminers.com" + }, + { + "host": "", + "name": "Other", + "port": 8332, + "url": "n/a" } - - ] } From 6f7eb096aba3d7135a11c3cd2431f4d90147c8bd Mon Sep 17 00:00:00 2001 From: Kiv Date: Tue, 23 Aug 2011 14:55:58 -0300 Subject: [PATCH 148/190] Fix issue #1 where window wouldn't restore on Linux --- guiminer.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/guiminer.py b/guiminer.py index 74f320a..e4046d4 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1707,8 +1707,8 @@ def __init__(self, *args, **kwds): self.Bind(wx.EVT_MENU, self.launch_solo_server, id=ID_LAUNCH) self.Bind(wx.EVT_MENU, self.on_change_language, id=ID_CHANGE_LANGUAGE) self.Bind(wx.EVT_MENU, self.on_donate, id=ID_DONATE_SMALL) - self.Bind(wx.EVT_CLOSE, self.on_close) - self.Bind(wx.EVT_ICONIZE, lambda event: self.Hide()) + self.Bind(wx.EVT_CLOSE, self.on_close) + self.Bind(wx.EVT_ICONIZE, self.on_iconize) self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CLOSING, self.on_page_closing) self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CLOSED, self.on_page_closed) self.Bind(fnb.EVT_FLATNOTEBOOK_PAGE_CHANGED, self.on_page_changed) @@ -1718,6 +1718,12 @@ def __init__(self, *args, **kwds): if not self.start_minimized_chk.IsChecked(): self.Show() + + def on_iconize(self, event): + if event.Iconized() and sys.platform == 'win32': + self.Hide() # On minimize, hide from taskbar. + else: + self.Show() def set_properties(self): self.SetIcons(get_icon_bundle()) From 6f7099886c0eaadd4f8bac3b29cc342daba7c5eb Mon Sep 17 00:00:00 2001 From: Kiv Date: Tue, 23 Aug 2011 15:05:44 -0300 Subject: [PATCH 149/190] Update README to indicate that solo mining requires block chain to be finished. --- README.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.txt b/README.txt index 953e570..bc8993b 100644 --- a/README.txt +++ b/README.txt @@ -125,6 +125,14 @@ Then make sure bitcoin.exe is not running already and choose "Solo utilities -> Launch Bitcoin client". This should bring up the official Bitcoin client. You will need to leave this open while you are solo mining. +You will need to be connected to the Bitcoin network before you can mine; +in the official client this is shown in the status bar as "6 connections" +or similar. + +If this is the first time you've launched the official Bitcoin client, you +will also need to wait while the block chain is downloaded. This can take +a long time on slower computers. + Now you can enter your information in the text boxes. Make sure the "Host" option reads "localhost" since the server is on your own machine. Put your username and password that you chose earlier. Then press "Start mining!" to From f3c0ec93ffeed8df85834d4636b14a6f45e68108 Mon Sep 17 00:00:00 2001 From: Kiv Date: Tue, 23 Aug 2011 15:24:57 -0300 Subject: [PATCH 150/190] Add ability to duplicate miner tab to easily set up multiple miners. --- guiminer.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index e4046d4..24b27a0 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1593,10 +1593,12 @@ def __init__(self, *args, **kwds): # Set up notebook context menu notebook_menu = wx.Menu() - ID_RENAME = wx.NewId() + ID_RENAME, ID_DUPLICATE = wx.NewId(), wx.NewId() notebook_menu.Append(ID_RENAME, _("&Rename..."), _("Rename this miner")) + notebook_menu.Append(ID_DUPLICATE, _("&Duplicate...", _("Duplicate this miner"))) self.nb.SetRightClickMenu(notebook_menu) self.Bind(wx.EVT_MENU, self.rename_miner, id=ID_RENAME) + self.Bind(wx.EVT_MENU, self.duplicate_miner, id=ID_DUPLICATE) self.console_panel = None self.summary_panel = None @@ -2088,6 +2090,13 @@ def rename_miner(self, event): if dialog.ShowModal() == wx.ID_OK: p.set_name(dialog.GetValue().strip()) + def duplicate_miner(self, event): + """Duplicate the current miner to another miner.""" + p = self.nb.GetPage(self.nb.GetSelection()) + if p not in self.profile_panels: + return + self.name_new_profile(event=None, extra_profile_data=p.get_data()) + def on_change_language(self, event): dialog = ChangeLanguageDialog(self, _('Change language'), language) result = dialog.ShowModal() From 908ec5320314209e870c6f7cfc4c106666219703 Mon Sep 17 00:00:00 2001 From: Kiv Date: Tue, 23 Aug 2011 15:25:54 -0300 Subject: [PATCH 151/190] Version bump --- guiminer.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/guiminer.py b/guiminer.py index 24b27a0..201fb32 100644 --- a/guiminer.py +++ b/guiminer.py @@ -14,7 +14,6 @@ import wx import json import collections -import webbrowser try: import win32api, win32con, win32process @@ -25,7 +24,7 @@ from wx.lib.agw import hyperlink from wx.lib.newevent import NewEvent -__version__ = '2011-07-01' +__version__ = '2011-08-23' def get_module_path(): """Return the folder containing this script (or its .exe).""" From e458bfa01a09de0bfa912c37fb38f2b9bfbc84f9 Mon Sep 17 00:00:00 2001 From: Ketzer2002 Date: Wed, 24 Aug 2011 23:50:11 +0300 Subject: [PATCH 152/190] Edited guiminer.py via GitHub --- guiminer.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/guiminer.py b/guiminer.py index 1baf5d6..3a57f8e 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1141,7 +1141,7 @@ def change_server(self, new_server): elif host == "pit.deepbit.net": self.layout_deepbit() elif host == "btcmine.com": self.layout_btcmine() elif "btcguild.com" in host: self.layout_btcguild() - elif "www.bitcoin-server.de" in host: self.layout_bitcoinserver + elif host == "bitcoin-server.de": self.layout_bitcoinserver elif host == "pit.x8s.de": self.layout_x8s() else: self.layout_default() @@ -1237,10 +1237,10 @@ def requires_auth_token(self, host): "btcmine.com", "pit.deepbit.net", "pit.x8s.de", - "mtred.com"] + "mtred.com", + "bitcoin-server.de"] if host in HOSTS_REQUIRING_AUTH_TOKEN: return True - if "btcguild" in host: return True - if "www.bitcoin-server.de" in host: return True + if "btcguild" in host: return True return False def on_balance_refresh(self, event=None): From 256d469c0a25c61fe0ff9fbcfad1cccb425f9008 Mon Sep 17 00:00:00 2001 From: Ketzer2002 Date: Wed, 24 Aug 2011 23:54:44 +0300 Subject: [PATCH 153/190] Edited servers.ini via GitHub --- servers.ini | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/servers.ini b/servers.ini index dfe5b77..0f68f37 100644 --- a/servers.ini +++ b/servers.ini @@ -20,6 +20,16 @@ "balance_url": "/api/%s" }, + { + "name": "Bitcoin-Server.de", + "host": "bitcoin-server.de", + "url": "http://www.bitcoin-server.de", + "port": 8347, + "balance_token_url": "http://www.bitcoin-server.de/my_api.php", + "balance_host": "www.bitcoin-server.de", + "balance_url": "/api.php?api_key=%s" + }, + { "name": "BTC Guild (any)", "host": "btcguild.com", From f18e9fbf4438d45d6fa93715a63c231a3dd6b130 Mon Sep 17 00:00:00 2001 From: Kiv Date: Wed, 24 Aug 2011 18:20:37 -0300 Subject: [PATCH 154/190] Switch code to api2.bitcoin.cz --- guiminer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guiminer.py b/guiminer.py index 201fb32..b73768a 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1154,7 +1154,7 @@ def change_server(self, new_server): # Call server specific code. host = new_server.get('host', "").lower() - if host == "api.bitcoin.cz" or host == "mtred.com": self.layout_slush() + if host == "api2.bitcoin.cz" or host == "mtred.com": self.layout_slush() elif host == "bitpenny.dyndns.biz": self.layout_bitpenny() elif host == "pit.deepbit.net": self.layout_deepbit() elif host == "btcmine.com": self.layout_btcmine() @@ -1252,7 +1252,7 @@ def on_withdraw(self, event): def requires_auth_token(self, host): """Return True if the specified host requires an auth token for balance update.""" - HOSTS_REQUIRING_AUTH_TOKEN = ["api.bitcoin.cz", + HOSTS_REQUIRING_AUTH_TOKEN = ["api2.bitcoin.cz", "btcmine.com", "pit.deepbit.net", "pit.x8s.de", From 2e1ae33917101cb77085a0dc9dd5b23f610794ed Mon Sep 17 00:00:00 2001 From: Kiv Date: Wed, 24 Aug 2011 18:24:51 -0300 Subject: [PATCH 155/190] Fix reporting under new poclbm version. Use rate of 1 Hz even when in verbose mode. --- BitcoinMiner.py | 4 +++- guiminer.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/BitcoinMiner.py b/BitcoinMiner.py index 1e0a413..55d09d7 100644 --- a/BitcoinMiner.py +++ b/BitcoinMiner.py @@ -21,7 +21,9 @@ def __init__(self, device, options, version, transport): self.defines += (' -DOUTPUT_MASK=' + str(self.output_size - 1)) self.device = device - self.options.rate = if_else(self.options.verbose, max(self.options.rate, 60), max(self.options.rate, 0.1)) + + # GUIMiner: need to report at 1 Hz even in verbose mode. + #self.options.rate = if_else(self.options.verbose, max(self.options.rate, 60), max(self.options.rate, 0.1)) self.options.askrate = max(self.options.askrate, 1) self.options.askrate = min(self.options.askrate, 10) self.options.frames = max(self.options.frames, 3) diff --git a/guiminer.py b/guiminer.py index b73768a..94f10e0 100644 --- a/guiminer.py +++ b/guiminer.py @@ -855,7 +855,7 @@ def configure_subprocess_poclbm(self): executable = "poclbm.exe" else: executable = "python poclbm.py" - cmd = "%s %s:%s@%s:%s --device=%d --platform=%d %s" % ( + cmd = "%s %s:%s@%s:%s --device=%d --platform=%d --verbose %s" % ( executable, self.txt_username.GetValue(), self.txt_pass.GetValue(), From 008a1bf60d60689b5e80fccbf0e48864440726d1 Mon Sep 17 00:00:00 2001 From: Kiv Date: Wed, 24 Aug 2011 20:06:34 -0300 Subject: [PATCH 156/190] Persist console max lines to config file. --- guiminer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/guiminer.py b/guiminer.py index 94f10e0..c3343e3 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1869,6 +1869,7 @@ def save_config(self, event=None): bitcoin_executable=self.bitcoin_executable, show_opencl_warning=self.do_show_opencl_warning, start_minimized=self.start_minimized_chk.IsChecked(), + console_max_lines=self.console_max_lines, window_position=list(self.GetRect())) logger.debug(_('Saving: ') + json.dumps(config_data)) try: From 4b8b91cf2c07f9f1950799d7de07f733c1b5ae83 Mon Sep 17 00:00:00 2001 From: Kiv Date: Wed, 24 Aug 2011 20:14:43 -0300 Subject: [PATCH 157/190] Version bump --- guiminer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index c3343e3..c4ae5a7 100644 --- a/guiminer.py +++ b/guiminer.py @@ -24,7 +24,7 @@ from wx.lib.agw import hyperlink from wx.lib.newevent import NewEvent -__version__ = '2011-08-23' +__version__ = '2011-08-24' def get_module_path(): """Return the folder containing this script (or its .exe).""" From 30aa7fc83974ad25ff60b5ccf1d6be16af2e8568 Mon Sep 17 00:00:00 2001 From: Jim Nelin Date: Thu, 1 Sep 2011 23:37:24 +0200 Subject: [PATCH 158/190] Changed typo of bitcoins.lc --- servers.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/servers.ini b/servers.ini index 95184e5..0021327 100644 --- a/servers.ini +++ b/servers.ini @@ -116,8 +116,8 @@ "url": "http://bitclockers.com" }, { - "host": "bitcoin.lc", - "name": "Bitcoin.lc", + "host": "bitcoins.lc", + "name": "Bitcoins.lc", "port": 8080, "url": "http://www.bitcoins.lc" }, From 6b0bc349b0d65cd4dd9f7ee290881e17497a538d Mon Sep 17 00:00:00 2001 From: Federico Date: Mon, 5 Sep 2011 20:14:54 +0300 Subject: [PATCH 159/190] Edited servers.ini via GitHub --- servers.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/servers.ini b/servers.ini index 0021327..a63ec6b 100644 --- a/servers.ini +++ b/servers.ini @@ -13,11 +13,11 @@ { "balance_host": "www.bitcoin-server.de", "balance_token_url": "http://www.bitcoin-server.de/my_api.php", - "balance_url": "/api.php?api_key=%s" + "balance_url": "/api.php?api_key=%s", "host": "bitcoin-server.de", "name": "Bitcoin-Server.de", "url": "http://www.bitcoin-server.de", - "port": 8347, + "port": 8347 }, { From dfcd118c5de48a09ab692b7f8dad2afb7c0f72b5 Mon Sep 17 00:00:00 2001 From: Blauwbek Date: Tue, 1 Nov 2011 21:56:36 +0100 Subject: [PATCH 160/190] typo --- guiminer_de.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guiminer_de.po b/guiminer_de.po index 070d77c..8e762ab 100644 --- a/guiminer_de.po +++ b/guiminer_de.po @@ -703,7 +703,7 @@ msgstr "bitcoin.conf existiert bereits." #: guiminer.py:1987 msgid "Enter password" -msgstr "PAsswort eingeben" +msgstr "Passwort eingeben" #: guiminer.py:1997 msgid "Success" From 82f3af36882900b3b224d69a091be7e7e008ec11 Mon Sep 17 00:00:00 2001 From: Blauwbek Date: Tue, 1 Nov 2011 22:46:32 +0100 Subject: [PATCH 161/190] Dutch translation for GUIMiner --- guiminer.py | 1 + guiminer_nl.po | 779 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 780 insertions(+) create mode 100644 guiminer_nl.po diff --git a/guiminer.py b/guiminer.py index b7c23dc..cbe90c5 100644 --- a/guiminer.py +++ b/guiminer.py @@ -48,6 +48,7 @@ def get_module_path(): "Italian": wx.LANGUAGE_ITALIAN, "Spanish": wx.LANGUAGE_SPANISH, "Russian": wx.LANGUAGE_RUSSIAN, + "Dutch": wx.LANGUAGE_DUTCH, } LANGUAGES_REVERSE = dict((v,k) for (k,v) in LANGUAGES.items()) diff --git a/guiminer_nl.po b/guiminer_nl.po new file mode 100644 index 0000000..0904411 --- /dev/null +++ b/guiminer_nl.po @@ -0,0 +1,779 @@ +msgid "" +msgstr "" +"Project-Id-Version: guiminer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-11-01\n" +"PO-Revision-Date: 2011-13-13 00:00-0000\n" +"Last-Translator: Blauwbek \n" +"Language-Team: Nederlands\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: guiminer.py:90 +#, python-format +msgid "" +"GUIMiner\n" +"\n" +"Version: %(version)s\n" +"\n" +"GUI by Chris 'Kiv' MacLeod\n" +"Original poclbm miner by m0mchil\n" +"Original rpcminer by puddinpop\n" +"\n" +"Get the source code or file issues at GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"If you enjoyed this software, support its development\n" +"by donating to:\n" +"\n" +"%(address)s\n" +"\n" +"Even a single Bitcoin is appreciated and helps motivate\n" +"further work on this software.\n" +msgstr "" +"GUIMiner\n" +"\n" +"Versie: %(version)s\n" +"\n" +"GUI gemaakt door Chris 'Kiv' MacLeod\n" +"Oorspronkelijke poclbm Miner door m0mchil\n" +"Oorspronkelijke rpcminer door puddinpop\n" +"\n" +"Voor de broncode en verdere hulp, zie GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"Overweeg een donatie als dit programma je geholpen heeft\n" +"Deze kan je naar volgend adres sturen:\n" +"\n" +"%(address)s\n" +"\n" +"Elke bitcoin wordt gewaardeerd en motiveert\n" +"tot verdere ontwikkeling.\n" +"\n" +"\n" +"Nederlandse vertaling door:\n" +"Blauwbek (nl-guiminer@hotmail.com)\n" +"\n" +"Steun Blauwbek:\n" +"1KtyDeGanGyH6ze5FUxxAevNWhGKqsmxoS\n" +"\n" + +#: guiminer.py:111 +msgid "Not started" +msgstr "Niet gestart" + +#: guiminer.py:112 +msgid "Starting..." +msgstr "Wordt gestart..." + +#: guiminer.py:113 +msgid "Stopped" +msgstr "Gestopt" + +#: guiminer.py:114 +msgid "Paused" +msgstr "Gepauzeerd" + +#: guiminer.py:115 +msgid "Start mining!" +msgstr "Start minen!" + +#: guiminer.py:116 +msgid "Stop mining" +msgstr "Stop met minen" + +#: guiminer.py:117 +msgid "Refresh balance" +msgstr "Vraag saldo op" + +#: guiminer.py:118 +msgid "Connection error" +msgstr "Verbindingsprobleem" + +#: guiminer.py:119 +msgid "Username:" +msgstr "Gebruikersnaam:" + +#: guiminer.py:120 +msgid "Password:" +msgstr "Wachtwoord:" + +#: guiminer.py:121 +msgid "Quit this program" +msgstr "Programma afsluiten" + +#: guiminer.py:122 +msgid "Show about dialog" +msgstr "Over..." + +#: guiminer.py:203 +#, python-format +msgid "%.1f Ghash/s" +msgstr "%.1f Ghash/s" + +#: guiminer.py:205 +#, python-format +msgid "%.1f Mhash/s" +msgstr "%.1f Mhash/s" + +#: guiminer.py:207 +msgid "Connecting..." +msgstr "Aan het verbinden..." + +#: guiminer.py:209 +#, python-format +msgid "%d khash/s" +msgstr "%d khash/s" + +#: guiminer.py:233 +#, python-format +msgid "Requesting balance: %(request)s" +msgstr "Opvraagt saldo op: %(request)s" + +#: guiminer.py:237 +#, python-format +msgid "Server replied: %(status)s, %(data)s" +msgstr "Server reageerde met: %(status)s, %(data)s" + +#: guiminer.py:304 +msgid "Miner" +msgstr "Miner" + +#: guiminer.py:305 +msgid "Speed" +msgstr "Snelheid" + +#: guiminer.py:306 +msgid "Accepted" +msgstr "Geaccepteerd" + +#: guiminer.py:307 +msgid "Stale" +msgstr "Verlopen" + +#: guiminer.py:308 +msgid "Start/Stop" +msgstr "Start/Stop" + +#: guiminer.py:309 +msgid "Autostart" +msgstr "Autostart" + +#: guiminer.py:393 +msgid "Pause all" +msgstr "Alles pauzeren" + +#: guiminer.py:395 +msgid "Restore" +msgstr "Herstel" + +#: guiminer.py:396 +msgid "Close" +msgstr "Sluiten" + +#: guiminer.py:452 +#, python-format +msgid "Listener for \"%s\" started" +msgstr "Miner \"%s\" gestart" + +#: guiminer.py:467 +#, python-format +msgid "Listener for \"%(name)s\": %(line)s" +msgstr "Miner \"%(name)s\": %(line)s" + +#: guiminer.py:470 +#, python-format +msgid "Listener for \"%s\" shutting down" +msgstr "Miner \"%s\" sluit af" + +#: guiminer.py:516 +msgid "Server:" +msgstr "Server:" + +#: guiminer.py:521 +msgid "Website:" +msgstr "Website:" + +#: guiminer.py:523 +msgid "Ext. Path:" +msgstr "Ext. Pad:" + +#: guiminer.py:525 +msgid "Host:" +msgstr "Host:" + +#: guiminer.py:527 +msgid "Port:" +msgstr "Port:" + +#: guiminer.py:533 +msgid "Device:" +msgstr "Apparaat:" + +#: guiminer.py:534 +msgid "No OpenCL devices" +msgstr "Geen OpenCL onderdelen" + +#: guiminer.py:535 +msgid "Extra flags:" +msgstr "Extra commando's:" + +#: guiminer.py:538 +msgid "CPU Affinity:" +msgstr "CPU's In gebruik" + +#: guiminer.py:541 +msgid "Balance:" +msgstr "Saldo:" + +#: guiminer.py:545 +msgid "Withdraw" +msgstr "Intrekken" + +#: guiminer.py:705 +msgid "Default" +msgstr "Standaard" + +#: guiminer.py:756 +msgid "Start" +msgstr "Start" + +#: guiminer.py:756 +msgid "Stop" +msgstr "Stop" + +#: guiminer.py:772 +msgid "Connection problems" +msgstr "Verbindingsproblemen" + +#: guiminer.py:931 +msgid "Running command: " +msgstr "Voert uit: " + +#: guiminer.py:990 +#, python-format +msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" +msgstr "Moeilijkheid 1 hashes: %(nhashes)d %(update_time)s" + +#: guiminer.py:994 +#, python-format +msgid "Blocks: %d, " +msgstr "Blokken: %d, " + +#: guiminer.py:997 +#, python-format +msgid "Shares: %d accepted" +msgstr "Shares: %d geaccepteerd" + +#: guiminer.py:999 +#, python-format +msgid ", %d stale/invalid" +msgstr ", %d verlopen/ongeldig" + +#: guiminer.py:1021 +#, python-format +msgid "- last at %s" +msgstr "- recentste: %s" + +#: guiminer.py:1094 +msgid "" +"Server to connect to. Different servers have different fees and features.\n" +"Check their websites for full information." +msgstr "" +"Server om mee te verbinden. Kosten en mogelijkheden verschillen per server.\n" +"Kijk op de bijbehorende website voor de volledige informatie" + +#: guiminer.py:1095 +msgid "Website of the currently selected server. Click to visit." +msgstr "Website van de geselecteerde server. Klik om er naar toe te gaan" + +#: guiminer.py:1096 +msgid "Available OpenCL devices on your system." +msgstr "Beschikbare OpenCL apparaten." + +#: guiminer.py:1097 +msgid "Host address, without http:// prefix." +msgstr "Host adres, zonder het http:// voorvoegsel" + +#: guiminer.py:1098 +msgid "Server port. This is usually 8332." +msgstr "Serverport. Dit is normaal gesproken 8332." + +#: guiminer.py:1099 +msgid "" +"The miner's username.\n" +"May be different than your account username.\n" +"Example: Kiv.GPU" +msgstr "" +"Miner's gebruikersnaam.\n" +"Kan verschillen van uw accountnaam.\n" +"Bijvoorbeeld: Blauwbek.GPU" + +#: guiminer.py:1100 +msgid "" +"The miner's password.\n" +"May be different than your account password." +msgstr "" +"Miner's wachtwoord.\n" +"Kan verschillen van uw account's wachtwoord.\n" + +#: guiminer.py:1101 +msgid "" +"Extra flags to pass to the miner.\n" +"For Radeon HD 5xxx series use -v -w128 for best results.\n" +"For other cards consult the forum." +msgstr "" +"Extra commando's voor de miner:\n" +"Radeon HD 5xxx gebruikers gebruik: -v -w128. voor optimale resultaten\n" +"Kijk voor andere videokaarten op het forum" + +#: guiminer.py:1103 +msgid "" +"CPU cores used for mining.\n" +"Unchecking some cores can reduce high CPU usage in some systems." +msgstr "" +"Aantal cores gebruikt voor minen. \n" +"Het uitvinken van enkele cores kan het processorgebruik verminderen." + +#: guiminer.py:1197 guiminer.py:1291 guiminer.py:1312 +msgid "Auth token rejected by server." +msgstr "Authenticatie afgewezen door de server." + +#: guiminer.py:1215 +#, python-format +msgid "%s confirmed" +msgstr "%s bevestigd" + +#: guiminer.py:1217 +#, python-format +msgid ", %s unconfirmed" +msgstr ", %s onbevestigd" + +#: guiminer.py:1219 +msgid "Bad response from server." +msgstr "Onverwachte reactie van de server." + +#: guiminer.py:1295 guiminer.py:1316 +msgid "Withdraw OK" +msgstr "Intrekken OK" + +#: guiminer.py:1486 +msgid "No registration is required - just enter an address and press Start." +msgstr "" +"Geen registratie nodig - typ een adres en klik op start." + +#: guiminer.py:1488 +msgid "Address:" +msgstr "Adres:" + +#: guiminer.py:1490 +msgid "" +"Your receiving address for Bitcoins.\n" +"E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" +msgstr "" +"Je ontvangadres voor Bitcoins\n" +"Bijvoorbeeld: 1FVYXH5xuP9w4656hMVdXJvZBSLsQtbxKT" + +#: guiminer.py:1506 +msgid "" +"Your miner username (not your account username).\n" +"Example: Kiv.GPU" +msgstr "" +"Je miner's gebruikersnaam (niet je accountnaam).\n" +"Bijvoorbeeld: Blauwbek.GPU" + +#: guiminer.py:1508 guiminer.py:1529 +msgid "Your miner password (not your account password)." +msgstr "Je miner's wachtwoord (niet je account's wachtwoord).\n" + +#: guiminer.py:1527 +msgid "" +"Your miner username. \n" +"Example: kiv123@kiv123" +msgstr "" +"Je miner's gebruikersnaam. \n" +"Bijvoorbeeld: kiv123@kiv123" + +#: guiminer.py:1544 +msgid "The e-mail address you registered with." +msgstr "Het emailadres waarmee je geregistreerd bent." + +#: guiminer.py:1545 +msgid "Email:" +msgstr "Email:" + +#: guiminer.py:1560 +msgid "&Rename..." +msgstr "&Hernoemen..." + +#: guiminer.py:1560 +msgid "Rename this miner" +msgstr "Hernoem deze miner..." + +#: guiminer.py:1585 +msgid "&New OpenCL miner..." +msgstr "&Nieuwe OpenCL miner..." + +#: guiminer.py:1585 +msgid "Create a new OpenCL miner (default for ATI cards)" +msgstr "Creer een nieuwe OpenCL miner (standaard voor ATI/AMD kaarten)" + +#: guiminer.py:1586 +msgid "Create a new Phoenix miner (for some ATI cards)" +msgstr "Creer een nieuwe Phonix miner (voor sommige ATI/AMD kaarten)" + +#: guiminer.py:1586 +msgid "New Phoenix miner..." +msgstr "Nieuwe Phoenix miner..." + +#: guiminer.py:1587 +msgid "Create a new CUDA miner (for NVIDIA cards)" +msgstr "Creer een nieuwe CUDA miner (voor nVidia kaarten)" + +#: guiminer.py:1587 +msgid "New CUDA miner..." +msgstr "Nieuwe CUDA miner..." + +#: guiminer.py:1588 +msgid "Create a new Ufasoft miner (for CPUs)" +msgstr "Creer een nieuwe Ufasoft miner (voor CPUs)" + +#: guiminer.py:1588 +msgid "New Ufasoft CPU miner..." +msgstr "Nieuwe Ufasoft CPU miner..." + +#: guiminer.py:1589 +msgid "Create a new custom miner (requires external program)" +msgstr "Creer een nieuwe eigen miner (extern programma nodig)" + +#: guiminer.py:1589 +msgid "New &other miner..." +msgstr "Nieuwe andere miner..." + +#: guiminer.py:1590 +msgid "&New miner" +msgstr "&Nieuwe miner" + +#: guiminer.py:1591 +msgid "&Save settings" +msgstr "&Sla instellingen op" + +#: guiminer.py:1591 +msgid "Save your settings" +msgstr "Instellingen opslaan" + +#: guiminer.py:1592 +msgid "&Load settings" +msgstr "&Laad instellingen" + +#: guiminer.py:1592 +msgid "Load stored settings" +msgstr "Laad opgeslagen instellingen" + +#: guiminer.py:1593 +msgid "Quit" +msgstr "Sluiten" + +#: guiminer.py:1594 +msgid "&File" +msgstr "&Bestand" + +#: guiminer.py:1598 +msgid "Show summary" +msgstr "Weergeef overzicht" + +#: guiminer.py:1598 +msgid "Show summary of all miners" +msgstr "Weergeef overzicht van alle miners" + +#: guiminer.py:1599 +msgid "Show console" +msgstr "Console weergeven" + +#: guiminer.py:1599 +msgid "Show console logs" +msgstr "Console log's weergeven" + +#: guiminer.py:1600 +msgid "&View" +msgstr "&Weergeef" + +#: guiminer.py:1604 +msgid "&Create solo password..." +msgstr "&Creer een solo wachtwoord..." + +#: guiminer.py:1604 +msgid "Configure a user/pass for solo mining" +msgstr "Creer een gebruiker/wachtwoord voor solo minen" + +#: guiminer.py:1605 +msgid "&Set Bitcoin client path..." +msgstr "&Stel Bitcoin client locatie in..." + +#: guiminer.py:1605 +msgid "Set the location of the official Bitcoin client" +msgstr "Stel locatie officile Bitcoin client in" + +#: guiminer.py:1606 +msgid "&Launch Bitcoin client as server" +msgstr "&Start Bitcoin client als server" + +#: guiminer.py:1606 +msgid "Launch the official Bitcoin client as a server for solo mining" +msgstr "Start de officiele Bitcoin client als een server voor solo mining" + +#: guiminer.py:1607 +msgid "&Solo utilities" +msgstr "&Solo functies" + +#: guiminer.py:1611 +msgid "Start &minimized" +msgstr "Start &geminimaliseerd" + +#: guiminer.py:1611 +msgid "Start the GUI minimized to the tray." +msgstr "Start de GUI geminimaliseerd in de startbalk" + +#: guiminer.py:1613 +msgid "&Options" +msgstr "&Opties" + +#: guiminer.py:1617 +msgid "&Change language..." +msgstr "&Verander taal..." + +#: guiminer.py:1618 +msgid "Language" +msgstr "Taal" + +#: guiminer.py:1622 +msgid "&Donate 99 cents..." +msgstr "&Doneer 99cent..." + +#: guiminer.py:1622 +msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" +msgstr "Doneer $0.99 USD aan Bitcoins om de ontwikkeling van GUIMiner te ondersteunen" + +#: guiminer.py:1623 +msgid "&Donate" +msgstr "&Doneer" + +#: guiminer.py:1626 +msgid "&About..." +msgstr "&Over..." + +#: guiminer.py:1628 +msgid "&Help" +msgstr "&Help" + +#: guiminer.py:1640 +msgid "Failed to load taskbar icon; continuing." +msgstr "Taakbalk pictogram laden mislukt; gaat door" + +#: guiminer.py:1649 +msgid "OpenCL not found - can't add a OpenCL miner" +msgstr "OpenCL niet gevonden, kan geen OpenCL miner toevoegen" + +#: guiminer.py:1686 +#, python-format +msgid "GUIMiner - v%s" +msgstr "GUIMiner - v%s" + +#: guiminer.py:1728 +msgid "Name this miner:" +msgstr "Naam voor deze miner:" + +#: guiminer.py:1728 +msgid "New miner" +msgstr "Nieuwe Miner" + +#: guiminer.py:1731 +msgid "Untitled" +msgstr "Naamloos" + +#: guiminer.py:1742 +msgid "External miner (*.exe)|*.exe|(*.py)|*.py" +msgstr "Externe miner (*.exe)|*.exe|(*.py)|*.py" + +#: guiminer.py:1744 +msgid "Select external miner:" +msgstr "Selecteer externe miner:" + +#: guiminer.py:1754 +#, python-format +msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" +msgstr "Niet ondersteunde miner %(filename)s. Ondersteund zijn: %(supported)s" + +#: guiminer.py:1756 +msgid "Miner not supported" +msgstr "Miner is niet ondersteund" + +#: guiminer.py:1797 +msgid "Do you want to save changes?" +msgstr "Veranderingen opslaan?" + +#: guiminer.py:1797 +msgid "Save" +msgstr "Opslaan" + +#: guiminer.py:1827 +msgid "Saving: " +msgstr "Slaat op: " + +#: guiminer.py:1833 +#, python-format +msgid "" +"Couldn't write save file %s.\n" +"Check the location is writable." +msgstr "" +"%s kon niet worden opgeslagen.\n" +"Controleer of de lokatie niet op alleen lezen staat!" + +#: guiminer.py:1834 +msgid "Save unsuccessful" +msgstr "Opslaan mislukt" + +#: guiminer.py:1836 +#, python-format +msgid "Profiles saved OK to %s." +msgstr "Profielen opgeslagen in %s." + +#: guiminer.py:1837 +msgid "Save successful" +msgstr "Opslaan gelukt" + +#: guiminer.py:1849 +#, python-format +msgid "Loaded: %s" +msgstr "Geladen: %s" + +#: guiminer.py:1863 +msgid "Loading profiles will stop any currently running miners. Continue?" +msgstr "Das Laden von Profilen stoppt alle aktiven Miner. Weiter?" + +#: guiminer.py:1864 +msgid "Load profile" +msgstr "Laad profiel" + +#: guiminer.py:1893 +msgid "Select path to Bitcoin.exe" +msgstr "Pad naar Bitcoin.exe selecteren" + +#: guiminer.py:1905 +msgid "About" +msgstr "Over" + +#: guiminer.py:1931 +msgid "Closing this miner will stop it. Continue?" +msgstr "De miner stopt bij het sluiten. Doorgaan?" + +#: guiminer.py:1932 +msgid "Close miner" +msgstr "Sluit miner" + +#: guiminer.py:1961 +#, python-format +msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" +msgstr "Kon Bitcoin niet vinden in %s. Klopt deze locatie?" + +#: guiminer.py:1962 +msgid "Launch failed" +msgstr "Opstarten mislukt" + +#: guiminer.py:1965 +msgid "" +"The Bitcoin client will now launch in server mode.\n" +"Once it connects to the network and downloads the block chain, you can start " +"a miner in 'solo' mode." +msgstr "Bitcoin zal nu starten als server.\n" +"Als deze alle voorbereidingen heeft gedaan zal je kunnen starten in solo modus" + +#: guiminer.py:1966 +msgid "Launched ok." +msgstr "Opstarten gelukt" + +#: guiminer.py:1981 +#, python-format +msgid "%s already exists. Overwrite?" +msgstr "" +"%s bestaat al. Overschrijven?" + +#: guiminer.py:1982 +msgid "bitcoin.conf already exists." +msgstr "bitcoin.conf bestaat al." + +#: guiminer.py:1987 +msgid "Enter password" +msgstr "Wachtwoord invoeren" + +#: guiminer.py:1997 +msgid "Success" +msgstr "Succes" + +#: guiminer.py:1997 +msgid "Wrote bitcoin config ok." +msgstr "Bitcoin instellingen succesvol opgeslagen" + +#: guiminer.py:2008 +msgid "Console" +msgstr "Console" + +#: guiminer.py:2020 +msgid "Summary" +msgstr "Overzicht" + +#: guiminer.py:2033 +msgid "Rename miner" +msgstr "Miner hernoemen" + +#: guiminer.py:2033 +msgid "Rename to:" +msgstr "Hernoem naar:" + +#: guiminer.py:2038 +msgid "Change language" +msgstr "Verander taal" + +#: guiminer.py:2058 +msgid "Choose language (requires restart to take full effect)" +msgstr "Verander taal (herstart nodig voor volledig effect)" + +#: guiminer.py:2103 +msgid "" +"Click the link below to log in to the pool and get a special token.\n" +"This token lets you securely check your balance.\n" +"To remember this token for the future, save your miner settings." +msgstr "Klik op onderstaande link om in te loggen in de pool en je code te krijgen.\n" +"Deze code laat je veilig je saldo controleren.\n" +"Sla deze code op in je minerinstellingen om hem in het vervolg te onthouden" + +#: guiminer.py:2112 +msgid "(Paste token here)" +msgstr "(Plak code hier)" + +#: guiminer.py:2138 +msgid "Copy address to clipboard" +msgstr "Kopier adres naar het plakbord" + +#: guiminer.py:2157 +msgid "No OpenCL devices found." +msgstr "Geen OpenCL onderdelen gevonden" + +#: guiminer.py:2160 +msgid "" +"No OpenCL devices were found.\n" +" If you only want to mine using CPU or CUDA, you can ignore this message.\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI " +"Stream\n" +" SDK, or your GPU may not support OpenCL." +msgstr "" +"Geen OpenCL onderdelen gevonden.\n" +"Als je wilt minen met je CPU of met CUDA kan je dit bericht nergeren.\n" +"Als je wilt minen met ATI/AMD kaarten kan het zijn dat je de ATI Stream\n" +" SDK moet installeren.\n" +"anders zal je kaart OpenCL niet ondersteunen.\n" + +#: guiminer.py:2170 +msgid "Don't show this message again" +msgstr "Laat dit bericht niet nog een keer zien" \ No newline at end of file From 49ea99895200edb7a31d8e72e1c17231824945b1 Mon Sep 17 00:00:00 2001 From: Leonard Huang Date: Tue, 22 Nov 2011 14:04:02 +0800 Subject: [PATCH 162/190] Added cgminer 2.0.8 listener. --- guiminer.py | 168 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 105 insertions(+), 63 deletions(-) diff --git a/guiminer.py b/guiminer.py index cbe90c5..0313eff 100644 --- a/guiminer.py +++ b/guiminer.py @@ -24,7 +24,7 @@ from wx.lib.agw import hyperlink from wx.lib.newevent import NewEvent -__version__ = '2011-08-24' +__version__ = '2011-11-22' def get_module_path(): """Return the folder containing this script (or its .exe).""" @@ -50,7 +50,7 @@ def get_module_path(): "Russian": wx.LANGUAGE_RUSSIAN, "Dutch": wx.LANGUAGE_DUTCH, } -LANGUAGES_REVERSE = dict((v,k) for (k,v) in LANGUAGES.items()) +LANGUAGES_REVERSE = dict((v, k) for (k, v) in LANGUAGES.items()) DONATION_ADDRESS = "1MDDh2h4cAZDafgc94mr9q95dhRYcJbNQo" locale = None @@ -165,7 +165,7 @@ def get_opencl_devices(): for i, platform in enumerate(platforms): devices = platform.get_devices() for j, device in enumerate(devices): - device_strings.append('[%d-%d] %s' % + device_strings.append('[%d-%d] %s' % (i, j, merge_whitespace(device.name)[:25])) if len(device_strings) == 0: raise IOError @@ -181,7 +181,7 @@ def get_taskbar_icon(): This works around Window's annoying behavior of ignoring the 16x16 image and using nearest neighbour downsampling on the 32x32 image instead.""" ib = get_icon_bundle() - return ib.GetIcon((16,16)) + return ib.GetIcon((16, 16)) def mkdir_p(path): """If the directory 'path' doesn't exist, create it. Same as mkdir -p.""" @@ -198,9 +198,9 @@ def add_tooltip(widget, text): def format_khash(rate): """Format rate for display. A rate of 0 means just connected.""" - if rate > 10**6: + if rate > 10 ** 6: return _("%.3f Ghash/s") % (rate / 1000000.) - if rate > 10**3: + if rate > 10 ** 3: return _("%.1f Mhash/s") % (rate / 1000.) elif rate == 0: return _("Connecting...") @@ -256,7 +256,7 @@ def find_nth(haystack, needle, n): """Return the index of the nth occurrence of needle in haystack.""" start = haystack.find(needle) while start >= 0 and n > 1: - start = haystack.find(needle, start+len(needle)) + start = haystack.find(needle, start + len(needle)) n -= 1 return start @@ -298,7 +298,7 @@ def append_text(self, text): if lines_to_cut > 0: contents = self.text.GetValue() position = find_nth(contents, '\n', lines_to_cut) - self.text.ChangeValue(contents[position+1:]) + self.text.ChangeValue(contents[position + 1:]) def write(self, text): """Forward logging events to our TextCtrl.""" @@ -451,7 +451,7 @@ class MinerListenerThread(threading.Thread): (r"(\d+)\s*khash/s", lambda match: UpdateHashRateEvent(rate=int(match.group(1)))), (r"(\d+\.\d+)\s*MH/s", lambda match: - UpdateHashRateEvent(rate=float(match.group(1)) * 1000)), + UpdateHashRateEvent(rate=float(match.group(1)) * 1000)), (r"(\d+\.\d+)\s*Mhash/s", lambda match: UpdateHashRateEvent(rate=float(match.group(1)) * 1000)), (r"(\d+)\s*Mhash/s", lambda match: @@ -495,12 +495,25 @@ class PhoenixListenerThread(MinerListenerThread): (r"Result: .* rejected", lambda _: UpdateAcceptedEvent(accepted=False)), (r"(\d+)\.?(\d*) Khash/sec", lambda match: - UpdateHashRateEvent(rate=float(match.group(1)+'.'+match.group(2)))), + UpdateHashRateEvent(rate=float(match.group(1) + '.' + match.group(2)))), (r"(\d+)\.?(\d*) Mhash/sec", lambda match: - UpdateHashRateEvent(rate=float(match.group(1)+'.'+match.group(2)) * 1000)), + UpdateHashRateEvent(rate=float(match.group(1) + '.' + match.group(2)) * 1000)), (r"Currently on block", lambda _: None), # Just ignore lines like these ] + +class CgListenerThread(MinerListenerThread): + LINES = [ + (r"Accepted .* GPU \d+ thread \d+", + lambda _: UpdateAcceptedEvent(accepted=True)), + (r"Rejected .* GPU \d+ thread \d+", + lambda _: UpdateAcceptedEvent(accepted=False)), + (r"\(\d+s\):(\d+)\.?(\d*) .* Mh/s", lambda match: + UpdateHashRateEvent(rate=float(match.group(1) + '.' + match.group(2)) * 1000)), + (r"GPU \d+", + lambda _: None), # Just ignore lines like these + ] + class MinerTab(wx.Panel): """A tab in the GUI representing a miner instance. @@ -793,13 +806,13 @@ def update_summary(self): text = format_khash(self.last_rate) self.summary_status.SetLabel(text) - self.summary_shares_accepted.SetLabel("%d (%d)" % + self.summary_shares_accepted.SetLabel("%d (%d)" % (self.accepted_shares, len(self.accepted_times))) if self.is_solo: self.summary_shares_invalid.SetLabel("-") else: - self.summary_shares_invalid.SetLabel("%d (%d)" % + self.summary_shares_invalid.SetLabel("%d (%d)" % (self.invalid_shares, len(self.invalid_times))) self.summary_start.SetLabel(self.get_start_stop_state()) @@ -815,7 +828,7 @@ def get_summary_widgets(self, summary_panel): self.summary_status = wx.StaticText(summary_panel, -1, STR_STOPPED) self.summary_shares_accepted = wx.StaticText(summary_panel, -1, "0") self.summary_shares_invalid = wx.StaticText(summary_panel, -1, "0") - self.summary_start = wx.Button(summary_panel, -1, self.get_start_stop_state(), style=wx.BU_EXACTFIT) + self.summary_start = wx.Button(summary_panel, -1, self.get_start_stop_state(), style=wx.BU_EXACTFIT) self.summary_start.Bind(wx.EVT_BUTTON, self.toggle_mining) self.summary_autostart = wx.CheckBox(summary_panel, -1) self.summary_autostart.Bind(wx.EVT_CHECKBOX, self.toggle_autostart) @@ -914,6 +927,23 @@ def configure_subprocess_phoenix(self): self.txt_flags.GetValue()) return cmd, os.path.dirname(self.external_path) + def configure_subprocess_cgminer(self): + """Set up the command line for cgminer.""" + path = self.external_path + if path.endswith('.py'): + path = "python " + path + + cmd = "%s -u %s -p %s -o http://@%s:%s -d %s -l 3 -T %s" % ( + path, + self.txt_username.GetValue(), + self.txt_pass.GetValue(), + self.host_without_http_prefix, + self.txt_port.GetValue(), + #self.platform_index, + self.device_index, + self.txt_flags.GetValue()) + return cmd, os.path.dirname(self.external_path) + # End backend specific code ########################### @@ -938,6 +968,9 @@ def start_mining(self): elif "phoenix" in self.external_path: conf_func = self.configure_subprocess_phoenix listener_cls = PhoenixListenerThread + elif "cgminer" in self.external_path: + conf_func = self.configure_subprocess_cgminer + listener_cls = CgListenerThread else: raise ValueError # TODO: handle unrecognized miner @@ -1117,7 +1150,9 @@ def set_tooltips(self): add_tooltip(self.txt_port, _("Server port. This is usually 8332.")) add_tooltip(self.txt_username, _("The miner's username.\nMay be different than your account username.\nExample: Kiv.GPU")) add_tooltip(self.txt_pass, _("The miner's password.\nMay be different than your account password.")) - add_tooltip(self.txt_flags, _("Extra flags to pass to the miner.\nFor Radeon HD 5xxx series use -v -w128 for best results.\nFor other cards consult the forum.")) + add_tooltip(self.txt_flags, _("""Extra flags to pass to the miner. +For poclbm use -v -w 128 for dedicated mining, append -f 60 for desktop usage. +For cgminer use -I 8 or -I 9. Without any params for desktop usage.""")) for chk in self.affinity_chks: add_tooltip(chk, _("CPU cores used for mining.\nUnchecking some cores can reduce high CPU usage in some systems.")) @@ -1405,31 +1440,31 @@ def layout_init(self): self.button_sizer = wx.BoxSizer(wx.HORIZONTAL) row = 0 if self.is_external_miner: - self.inner_sizer.Add(self.external_lbl, (row,0), flag=LBL_STYLE) - self.inner_sizer.Add(self.txt_external, (row,1), span=(1,3), flag=wx.EXPAND) + self.inner_sizer.Add(self.external_lbl, (row, 0), flag=LBL_STYLE) + self.inner_sizer.Add(self.txt_external, (row, 1), span=(1, 3), flag=wx.EXPAND) row += 1 return row def layout_server_and_website(self, row): """Lay out the server and website widgets in the specified row.""" - self.inner_sizer.Add(self.server_lbl, (row,0), flag=LBL_STYLE) - self.inner_sizer.Add(self.server, (row,1), flag=wx.EXPAND) - self.inner_sizer.Add(self.website_lbl, (row,2), flag=LBL_STYLE) - self.inner_sizer.Add(self.website, (row,3), flag=wx.ALIGN_CENTER_VERTICAL) + self.inner_sizer.Add(self.server_lbl, (row, 0), flag=LBL_STYLE) + self.inner_sizer.Add(self.server, (row, 1), flag=wx.EXPAND) + self.inner_sizer.Add(self.website_lbl, (row, 2), flag=LBL_STYLE) + self.inner_sizer.Add(self.website, (row, 3), flag=wx.ALIGN_CENTER_VERTICAL) def layout_host_and_port(self, row): """Lay out the host and port widgets in the specified row.""" - self.inner_sizer.Add(self.host_lbl, (row,0), flag=LBL_STYLE) - self.inner_sizer.Add(self.txt_host, (row,1), flag=wx.EXPAND) - self.inner_sizer.Add(self.port_lbl, (row,2), flag=LBL_STYLE) - self.inner_sizer.Add(self.txt_port, (row,3), flag=wx.EXPAND) + self.inner_sizer.Add(self.host_lbl, (row, 0), flag=LBL_STYLE) + self.inner_sizer.Add(self.txt_host, (row, 1), flag=wx.EXPAND) + self.inner_sizer.Add(self.port_lbl, (row, 2), flag=LBL_STYLE) + self.inner_sizer.Add(self.txt_port, (row, 3), flag=wx.EXPAND) def layout_user_and_pass(self, row): """Lay out the user and pass widgets in the specified row.""" - self.inner_sizer.Add(self.user_lbl, (row,0), flag=LBL_STYLE) - self.inner_sizer.Add(self.txt_username, (row,1), flag=wx.EXPAND) - self.inner_sizer.Add(self.pass_lbl, (row,2), flag=LBL_STYLE) - self.inner_sizer.Add(self.txt_pass, (row,3), flag=wx.EXPAND) + self.inner_sizer.Add(self.user_lbl, (row, 0), flag=LBL_STYLE) + self.inner_sizer.Add(self.txt_username, (row, 1), flag=wx.EXPAND) + self.inner_sizer.Add(self.pass_lbl, (row, 2), flag=LBL_STYLE) + self.inner_sizer.Add(self.txt_pass, (row, 3), flag=wx.EXPAND) def layout_device_and_flags(self, row): """Lay out the device and flags widgets in the specified row. @@ -1439,26 +1474,26 @@ def layout_device_and_flags(self, row): device_visible = self.is_device_visible self.set_widgets_visible([self.device_lbl, self.device_listbox], device_visible) if device_visible: - self.inner_sizer.Add(self.device_lbl, (row,0), flag=LBL_STYLE) - self.inner_sizer.Add(self.device_listbox, (row,1), flag=wx.EXPAND) + self.inner_sizer.Add(self.device_lbl, (row, 0), flag=LBL_STYLE) + self.inner_sizer.Add(self.device_listbox, (row, 1), flag=wx.EXPAND) col = 2 * (device_visible) - self.inner_sizer.Add(self.flags_lbl, (row,col), flag=LBL_STYLE) - span = (1,1) if device_visible else (1,4) - self.inner_sizer.Add(self.txt_flags, (row,col+1), span=span, flag=wx.EXPAND) + self.inner_sizer.Add(self.flags_lbl, (row, col), flag=LBL_STYLE) + span = (1, 1) if device_visible else (1, 4) + self.inner_sizer.Add(self.txt_flags, (row, col + 1), span=span, flag=wx.EXPAND) def layout_affinity(self, row): """Lay out the affinity checkboxes in the specified row.""" - self.inner_sizer.Add(self.affinity_lbl, (row,0)) + self.inner_sizer.Add(self.affinity_lbl, (row, 0)) affinity_sizer = wx.BoxSizer(wx.HORIZONTAL) for chk in self.affinity_chks: affinity_sizer.Add(chk) - self.inner_sizer.Add(affinity_sizer, (row,1)) + self.inner_sizer.Add(affinity_sizer, (row, 1)) def layout_balance(self, row): """Lay out the balance widgets in the specified row.""" - self.inner_sizer.Add(self.balance_lbl, (row,0), flag=LBL_STYLE) - self.inner_sizer.Add(self.balance_amt, (row,1)) + self.inner_sizer.Add(self.balance_lbl, (row, 0), flag=LBL_STYLE) + self.inner_sizer.Add(self.balance_amt, (row, 1)) def layout_finish(self): """Lay out the buttons and fit the sizer to the window.""" @@ -1487,7 +1522,7 @@ def layout_default(self): customs = ["other", "solo"] is_custom = self.server.GetStringSelection().lower() in customs if is_custom: - self.layout_host_and_port(row=row+1) + self.layout_host_and_port(row=row + 1) else: self.set_widgets_visible([self.host_lbl, self.txt_host, self.port_lbl, self.txt_port], False) @@ -1511,12 +1546,12 @@ def layout_bitpenny(self): row = self.layout_init() self.layout_server_and_website(row=row) - self.inner_sizer.Add(self.user_lbl, (row+1,0), flag=LBL_STYLE) - self.inner_sizer.Add(self.txt_username, (row+1,1), span=(1,3), flag=wx.EXPAND) - self.layout_device_and_flags(row=row+2) - self.layout_affinity(row=row+3) - self.layout_balance(row=row+4) - self.inner_sizer.Add(self.extra_info,(row+5,0), span=(1,4), flag=wx.ALIGN_CENTER_HORIZONTAL) + self.inner_sizer.Add(self.user_lbl, (row + 1, 0), flag=LBL_STYLE) + self.inner_sizer.Add(self.txt_username, (row + 1, 1), span=(1, 3), flag=wx.EXPAND) + self.layout_device_and_flags(row=row + 2) + self.layout_affinity(row=row + 3) + self.layout_balance(row=row + 4) + self.inner_sizer.Add(self.extra_info, (row + 5, 0), span=(1, 4), flag=wx.ALIGN_CENTER_HORIZONTAL) self.layout_finish() self.extra_info.SetLabel(_("No registration is required - just enter an address and press Start.")) @@ -1532,10 +1567,10 @@ def layout_slush(self): self.withdraw, self.extra_info], False) row = self.layout_init() self.layout_server_and_website(row=row) - self.layout_user_and_pass(row=row+1) - self.layout_device_and_flags(row=row+2) - self.layout_affinity(row=row+3) - self.layout_balance(row=row+4) + self.layout_user_and_pass(row=row + 1) + self.layout_device_and_flags(row=row + 2) + self.layout_affinity(row=row + 3) + self.layout_balance(row=row + 4) self.layout_finish() add_tooltip(self.txt_username, @@ -1557,10 +1592,10 @@ def layout_btcmine(self): self.withdraw, self.extra_info], False) row = self.layout_init() self.layout_server_and_website(row=row) - self.layout_user_and_pass(row=row+1) - self.layout_device_and_flags(row=row+2) - self.layout_affinity(row=row+3) - self.layout_balance(row=row+4) + self.layout_user_and_pass(row=row + 1) + self.layout_device_and_flags(row=row + 2) + self.layout_affinity(row=row + 3) + self.layout_balance(row=row + 4) self.layout_finish() add_tooltip(self.txt_username, @@ -1575,10 +1610,10 @@ def layout_deepbit(self): self.extra_info], False) row = self.layout_init() self.layout_server_and_website(row=row) - self.layout_user_and_pass(row=row+1) - self.layout_device_and_flags(row=row+2) - self.layout_affinity(row=row+3) - self.layout_balance(row=row+4) + self.layout_user_and_pass(row=row + 1) + self.layout_device_and_flags(row=row + 2) + self.layout_affinity(row=row + 3) + self.layout_balance(row=row + 4) self.layout_finish() add_tooltip(self.txt_username, _("The e-mail address you registered with.")) @@ -1624,12 +1659,13 @@ def __init__(self, *args, **kwds): self.do_show_opencl_warning = self.config_data.get('show_opencl_warning', True) self.console_max_lines = self.config_data.get('console_max_lines', 5000) - ID_NEW_EXTERNAL, ID_NEW_PHOENIX, ID_NEW_CUDA, ID_NEW_UFASOFT = wx.NewId(), wx.NewId(), wx.NewId(), wx.NewId() + ID_NEW_EXTERNAL, ID_NEW_PHOENIX, ID_NEW_CGMINER, ID_NEW_CUDA, ID_NEW_UFASOFT = wx.NewId(), wx.NewId(), wx.NewId(), wx.NewId(), wx.NewId() self.menubar = wx.MenuBar() file_menu = wx.Menu() new_menu = wx.Menu() new_menu.Append(wx.ID_NEW, _("&New OpenCL miner..."), _("Create a new OpenCL miner (default for ATI cards)"), wx.ITEM_NORMAL) new_menu.Append(ID_NEW_PHOENIX, _("New Phoenix miner..."), _("Create a new Phoenix miner (for some ATI cards)"), wx.ITEM_NORMAL) + new_menu.Append(ID_NEW_CGMINER, _("New CG miner..."), _("Create a new CGMiner (for some ATI cards)"), wx.ITEM_NORMAL) new_menu.Append(ID_NEW_CUDA, _("New CUDA miner..."), _("Create a new CUDA miner (for NVIDIA cards)"), wx.ITEM_NORMAL) new_menu.Append(ID_NEW_UFASOFT, _("New Ufasoft CPU miner..."), _("Create a new Ufasoft miner (for CPUs)"), wx.ITEM_NORMAL) new_menu.Append(ID_NEW_EXTERNAL, _("New &other miner..."), _("Create a new custom miner (requires external program)"), wx.ITEM_NORMAL) @@ -1701,6 +1737,7 @@ def __init__(self, *args, **kwds): self.Bind(wx.EVT_MENU, self.name_new_profile, id=wx.ID_NEW) self.Bind(wx.EVT_MENU, self.new_phoenix_profile, id=ID_NEW_PHOENIX) + self.Bind(wx.EVT_MENU, self.new_cgminer_profile, id=ID_NEW_CGMINER) self.Bind(wx.EVT_MENU, self.new_ufasoft_profile, id=ID_NEW_UFASOFT) self.Bind(wx.EVT_MENU, self.new_cuda_profile, id=ID_NEW_CUDA) self.Bind(wx.EVT_MENU, self.new_external_profile, id=ID_NEW_EXTERNAL) @@ -1816,6 +1853,11 @@ def new_phoenix_profile(self, event): path = os.path.join(get_module_path(), 'phoenix.exe') self.name_new_profile(extra_profile_data=dict(external_path=path)) + def new_cgminer_profile(self, event): + """Create a new miner using the Cgminer OpenCL miner backend.""" + path = os.path.join(get_module_path(), 'cgminer.exe') + self.name_new_profile(extra_profile_data=dict(external_path=path)) + def new_ufasoft_profile(self, event): """Create a new miner using the Ufasoft CPU miner backend.""" path = os.path.join(get_module_path(), 'miners', 'ufasoft', 'bitcoin-miner.exe') @@ -2163,7 +2205,7 @@ def __init__(self, parent, title, current_language): vbox.Add(self.language_choices, 0, wx.ALL, 10) buttons = self.CreateButtonSizer(wx.OK | wx.CANCEL) - vbox.Add(buttons, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 10) + vbox.Add(buttons, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 10) self.SetSizerAndFit(vbox) def get_value(self): @@ -2212,9 +2254,9 @@ def __init__(self, parent, url): vbox.AddMany([ (self.instructions, 0, wx.ALL, 10), - (self.website, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 10), - (self.txt_token, 0, wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL, 10), - (buttons, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 10) + (self.website, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 10), + (self.txt_token, 0, wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL, 10), + (buttons, 0, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL, 10) ]) self.SetSizerAndFit(vbox) @@ -2266,7 +2308,7 @@ def __init__(self, parent): self.no_show_chk = wx.CheckBox(self, -1) hbox.Add(self.no_show_chk) self.no_show_txt = wx.StaticText(self, -1, _("Don't show this message again")) - hbox.Add((5,0)) + hbox.Add((5, 0)) hbox.Add(self.no_show_txt) vbox.Add(hbox, 0, wx.ALL, 10) buttons = self.CreateButtonSizer(wx.OK) From 26540922ea168e5886bc5639de847e35fc24142a Mon Sep 17 00:00:00 2001 From: Leonard Huang Date: Tue, 22 Nov 2011 15:07:57 +0800 Subject: [PATCH 163/190] Fix duplicated console messages for cgminer. --- guiminer.py | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/guiminer.py b/guiminer.py index 0313eff..16cadfb 100644 --- a/guiminer.py +++ b/guiminer.py @@ -510,7 +510,7 @@ class CgListenerThread(MinerListenerThread): lambda _: UpdateAcceptedEvent(accepted=False)), (r"\(\d+s\):(\d+)\.?(\d*) .* Mh/s", lambda match: UpdateHashRateEvent(rate=float(match.group(1) + '.' + match.group(2)) * 1000)), - (r"GPU \d+", + (r"^GPU\s*\d+", lambda _: None), # Just ignore lines like these ] @@ -933,13 +933,19 @@ def configure_subprocess_cgminer(self): if path.endswith('.py'): path = "python " + path - cmd = "%s -u %s -p %s -o http://@%s:%s -d %s -l 3 -T %s" % ( + # Command line arguments for cgminer here: + # -u + # -p + # -o + # -d + # -l + # -T + cmd = "%s -u %s -p %s -o http://%s:%s -d %s -l 1 -T %s" % ( path, self.txt_username.GetValue(), self.txt_pass.GetValue(), self.host_without_http_prefix, self.txt_port.GetValue(), - #self.platform_index, self.device_index, self.txt_flags.GetValue()) return cmd, os.path.dirname(self.external_path) @@ -981,12 +987,23 @@ def start_mining(self): # use universal_newlines to catch the \r output on Mhash/s lines try: logger.debug(_('Running command: ') + cmd) - self.miner = subprocess.Popen(cmd, cwd=cwd, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - universal_newlines=True, - creationflags=flags, - shell=(sys.platform != 'win32')) + # for cgminer: + # We need only the STDOUT for meaningful messages. + if conf_func == self.configure_subprocess_cgminer: + self.miner = subprocess.Popen(cmd, cwd=cwd, + stdout=subprocess.PIPE, + stderr=None, + universal_newlines=True, + creationflags=flags, + shell=(sys.platform != 'win32')) + else: + self.miner = subprocess.Popen(cmd, cwd=cwd, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + universal_newlines=True, + creationflags=flags, + shell=(sys.platform != 'win32')) + except OSError: raise #TODO: the folder or exe could not exist self.miner_listener = listener_cls(self, self.miner) From 15ffe4a428710b4961bc6836fd5eb1cbe63689a3 Mon Sep 17 00:00:00 2001 From: MtRed Date: Mon, 16 Jan 2012 15:09:20 -0500 Subject: [PATCH 164/190] update MtRed config data --- servers.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/servers.ini b/servers.ini index a63ec6b..b6fdad3 100644 --- a/servers.ini +++ b/servers.ini @@ -140,8 +140,8 @@ "balance_host": "mtred.com", "balance_token_url": "https://mtred.com/user/profile/edit.html", "balance_url": "/api/user/key/%s/", - "host": "us.mtred.com", - "name": "MTRed (US)", + "host": "mine.mtred.com", + "name": "MTRed", "port": 8337, "url": "https://mtred.com/" }, From df3b45269acdf0f771c6e767519e1ed7677f5d9f Mon Sep 17 00:00:00 2001 From: Jim Nelin Date: Tue, 17 Jan 2012 19:31:32 +0100 Subject: [PATCH 165/190] Change host bitcoins.lc to pool.bitlc.net. --- servers.ini | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/servers.ini b/servers.ini index a63ec6b..c18c408 100644 --- a/servers.ini +++ b/servers.ini @@ -116,10 +116,10 @@ "url": "http://bitclockers.com" }, { - "host": "bitcoins.lc", - "name": "Bitcoins.lc", - "port": 8080, - "url": "http://www.bitcoins.lc" + "host": "pool.bitlc.net", + "name": "Bitlc.net", + "port": 80, + "url": "http://www.bitlc.net" }, { "host": "rr.btcmp.com", From 848ef4389ad5eb995fca3aa8d1547e86ec715516 Mon Sep 17 00:00:00 2001 From: karsten Date: Sun, 22 Jan 2012 01:59:10 +0100 Subject: [PATCH 166/190] added btcmp api support for payout and balance --- guiminer.py | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ servers.ini | 4 ++++ 2 files changed, 55 insertions(+) diff --git a/guiminer.py b/guiminer.py index 16cadfb..4e204a4 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1211,6 +1211,7 @@ def change_server(self, new_server): elif host == "bitpenny.dyndns.biz": self.layout_bitpenny() elif host == "pit.deepbit.net": self.layout_deepbit() elif host == "btcmine.com": self.layout_btcmine() + elif host == "rr.btcmp.com": self.layout_btcmp() elif "btcguild.com" in host: self.layout_btcguild() elif host == "bitcoin-server.de": self.layout_bitcoinserver elif host == "pit.x8s.de": self.layout_x8s() @@ -1288,6 +1289,10 @@ def request_balance_get(self, balance_auth_token, use_https=False): ipa = info.get('ipa', False) self.withdraw.Enable(ipa) + if self.server_config.get('host') == "rr.btcmp.com": + ipa = info.get('can_payout', False) + self.withdraw.Enable(ipa) + data = _("%s confirmed") % format_balance(confirmed) if unconfirmed > 0: data += _(", %s unconfirmed") % format_balance(unconfirmed) @@ -1303,6 +1308,8 @@ def on_withdraw(self, event): self.withdraw_bitpenny() elif host == 'pit.deepbit.net': self.withdraw_deepbit() + elif host == 'rr.btcmp.com': + self.withdraw_btcmp() def requires_auth_token(self, host): """Return True if the specified host requires an auth token for balance update.""" @@ -1311,6 +1318,7 @@ def requires_auth_token(self, host): "pit.deepbit.net", "pit.x8s.de", "mtred.com", + "rr.btcmp.com", "bitcoin-server.de"] if host in HOSTS_REQUIRING_AUTH_TOKEN: return True if "btcguild" in host: return True @@ -1348,6 +1356,16 @@ def on_balance_refresh(self, event=None): ################################# # Begin server specific HTTP code + def withdraw_btcmp(self): + """Launch a thread to withdraw from deepbit.""" + self.require_auth_token() + if not self.balance_auth_token: # User refused to provide token + return + self.http_thread = threading.Thread( + target=self.request_payout_btcmp, + args=(self.balance_auth_token,)) + self.http_thread.start() + def withdraw_deepbit(self): """Launch a thread to withdraw from deepbit.""" self.require_auth_token() @@ -1363,6 +1381,23 @@ def withdraw_bitpenny(self): target=self.request_payout_bitpenny, args=(True,)) self.http_thread.start() # TODO: look at aliasing of this variable + def request_payout_btcmp(self, balance_auth_token): + """Request payout from btcmp's server via HTTP POST.""" + response, data = http_request( + self.server_config['balance_host'], + "GET", + self.server_config["payout_url"] % balance_auth_token, + use_https=False + ) + + if self.is_auth_token_rejected(response): + data = _("Auth token rejected by server.") + elif not data: + data = STR_CONNECTION_ERROR + else: + data = _("Withdraw OK") + wx.CallAfter(self.on_balance_received, data) + def request_payout_deepbit(self, balance_auth_token): """Request payout from deepbit's server via HTTP POST.""" post_params = dict(id=1, @@ -1636,6 +1671,22 @@ def layout_deepbit(self): _("The e-mail address you registered with.")) self.user_lbl.SetLabel(_("Email:")) + def layout_btcmp(self): + """Deepbit uses an email address for a username.""" + self.set_widgets_visible([self.host_lbl, self.txt_host, + self.port_lbl, self.txt_port, + self.extra_info], False) + row = self.layout_init() + self.layout_server_and_website(row=row) + self.layout_user_and_pass(row=row + 1) + self.layout_device_and_flags(row=row + 2) + self.layout_affinity(row=row + 3) + self.layout_balance(row=row + 4) + self.layout_finish() + add_tooltip(self.txt_username, + _("Your worker name. Is something in the form of username.workername")) + self.user_lbl.SetLabel(_("Workername:")) + def layout_x8s(self): """x8s has the same layout as slush for now.""" self.layout_slush() diff --git a/servers.ini b/servers.ini index 36e48d5..5b9338a 100644 --- a/servers.ini +++ b/servers.ini @@ -122,6 +122,10 @@ "url": "http://www.bitlc.net" }, { + "balance_host": "www.btcmp.com", + "balance_token_url": "http://www.btcmp.com/", + "balance_url": "/api_get_stats?key=%s", + "payout_url": "/api_payout?key=%s", "host": "rr.btcmp.com", "name": "BTCMP", "port": 8332, From 3739c2297f659ec12488e8e471cc93d802b02890 Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Fri, 3 Feb 2012 21:29:36 -0500 Subject: [PATCH 167/190] Eligius support --- guiminer.py | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ servers.ini | 9 +++++++++ 2 files changed, 59 insertions(+) diff --git a/guiminer.py b/guiminer.py index 16cadfb..c832a4b 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1208,6 +1208,7 @@ def change_server(self, new_server): # Call server specific code. host = new_server.get('host', "").lower() if host == "api2.bitcoin.cz" or host == "mtred.com": self.layout_slush() + if "eligius.st" in host: self.layout_eligius() elif host == "bitpenny.dyndns.biz": self.layout_bitpenny() elif host == "pit.deepbit.net": self.layout_deepbit() elif host == "btcmine.com": self.layout_btcmine() @@ -1340,6 +1341,11 @@ def on_balance_refresh(self, event=None): self.http_thread = threading.Thread( target=self.request_payout_bitpenny, args=(False,)) self.http_thread.start() + elif 'eligius.st' in host: + self.http_thread = threading.Thread( + target=self.request_balance_eligius + ) + self.http_thread.start() self.balance_refresh.Disable() self.balance_cooldown_seconds = 10 @@ -1404,6 +1410,23 @@ def request_payout_bitpenny(self, withdraw): data = _("Withdraw OK") wx.CallAfter(self.on_balance_received, data) + def request_balance_eligius(self): + """Request our balance from Eligius + """ + response, data = http_request( + self.server_config['balance_host'], + "POST", + self.server_config['balance_url'] % (self.txt_username.GetValue(),), + ) + if not data: + data = STR_CONNECTION_ERROR + try: + data = json.loads(data) + data = data['expected'] / 1e8 + except BaseException as e: + data = str(e) + wx.CallAfter(self.on_balance_received, data) + def on_balance_received(self, balance): """Set the balance in the GUI.""" try: @@ -1595,6 +1618,33 @@ def layout_slush(self): add_tooltip(self.txt_pass, _("Your miner password (not your account password).")) + def layout_eligius(self): + """Eligius doesn't require registration or a password. + + The username is just their receiving address. + """ + invisible = [self.txt_pass, self.txt_host, self.txt_port, + self.withdraw, + self.pass_lbl, self.host_lbl, self.port_lbl] + self.set_widgets_visible(invisible, False) + self.set_widgets_visible([self.extra_info], True) + + row = self.layout_init() + self.layout_server_and_website(row=row) + self.inner_sizer.Add(self.user_lbl, (row + 1, 0), flag=LBL_STYLE) + self.inner_sizer.Add(self.txt_username, (row + 1, 1), span=(1, 3), flag=wx.EXPAND) + self.layout_device_and_flags(row=row + 2) + self.layout_affinity(row=row + 3) + self.layout_balance(row=row + 4) + self.inner_sizer.Add(self.extra_info, (row + 5, 0), span=(1, 4), flag=wx.ALIGN_CENTER_HORIZONTAL) + self.layout_finish() + + self.extra_info.SetLabel(_("No registration is required - just enter an address and press Start.")) + self.txt_pass.SetValue('x') + self.user_lbl.SetLabel(_("Address:")) + add_tooltip(self.txt_username, + _("Your receiving address for Bitcoins.\nE.g.: 1JMfKKJqtkDPbRRsFSLjX1Cs2dqmjKiwj8")) + def layout_btcguild(self): """BTC Guild has the same layout as slush for now.""" self.layout_slush() diff --git a/servers.ini b/servers.ini index 36e48d5..e5ad114 100644 --- a/servers.ini +++ b/servers.ini @@ -1,5 +1,14 @@ { "servers": [ + { + "balance_host": "eligius.st", + "balance_url": "/~luke-jr/balance.php?addr=%s", + "host": "mining.eligius.st", + "name": "Eligius", + "port": 8337, + "url": "http://eligius.st" + }, + { "balance_host": "mining.bitcoin.cz", "balance_token_url": "http://mining.bitcoin.cz/accounts/token-manage/", From 54ea33961724a066b2782ecb2efb70003bd68887 Mon Sep 17 00:00:00 2001 From: Blauwbek Date: Thu, 9 Feb 2012 17:14:16 +0100 Subject: [PATCH 168/190] ordered languages alphabetically --- guiminer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guiminer.py b/guiminer.py index 16cadfb..1b82baa 100644 --- a/guiminer.py +++ b/guiminer.py @@ -41,14 +41,14 @@ def get_module_path(): LANGUAGES = { "Chinese Simplified": wx.LANGUAGE_CHINESE_SIMPLIFIED, + "Dutch": wx.LANGUAGE_DUTCH, "English": wx.LANGUAGE_ENGLISH, "French": wx.LANGUAGE_FRENCH, "German": wx.LANGUAGE_GERMAN, "Hungarian": wx.LANGUAGE_HUNGARIAN, "Italian": wx.LANGUAGE_ITALIAN, - "Spanish": wx.LANGUAGE_SPANISH, "Russian": wx.LANGUAGE_RUSSIAN, - "Dutch": wx.LANGUAGE_DUTCH, + "Spanish": wx.LANGUAGE_SPANISH, } LANGUAGES_REVERSE = dict((v, k) for (k, v) in LANGUAGES.items()) From 54886dd43cf61c8c754ca27cd064f10e9a7c0c99 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 19 Feb 2012 11:18:07 -0400 Subject: [PATCH 169/190] Version bump for release with fixed poclbm code. --- guiminer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guiminer.py b/guiminer.py index 225c3a2..e8c9499 100644 --- a/guiminer.py +++ b/guiminer.py @@ -6,7 +6,7 @@ - jedi95's "Phoenix" - ufasoft's "bitcoin-miner" -Copyright 2011 Chris MacLeod +Copyright 2011-2012 Chris MacLeod This program is released under the GNU GPL. See LICENSE.txt for details. """ @@ -24,7 +24,7 @@ from wx.lib.agw import hyperlink from wx.lib.newevent import NewEvent -__version__ = '2011-11-22' +__version__ = '2012-02-19' def get_module_path(): """Return the folder containing this script (or its .exe).""" From 36dc82a537858cf7e489d593a5efb949a6472e62 Mon Sep 17 00:00:00 2001 From: Colin Dean Date: Tue, 4 Sep 2012 10:49:50 -0400 Subject: [PATCH 170/190] esperanto translation / traduko --- guiminer_eo.po | 766 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 766 insertions(+) create mode 100644 guiminer_eo.po diff --git a/guiminer_eo.po b/guiminer_eo.po new file mode 100644 index 0000000..60cd33d --- /dev/null +++ b/guiminer_eo.po @@ -0,0 +1,766 @@ +# Esperanto translation for GUIMiner +# Copyright (C) 2012 Colin Dean +# This file is distributed under the same license as the GUIMiner package. +# Colin Dean (Kaŭlen DIN) , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: GUIMiner\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-06-14 23:10-0300\n" +"PO-Revision-Date: 2012-09-04 10:36-0500\n" +"Last-Translator: Colin Dean \n" +"Language-Team: Esperanto \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Esperanto\n" + +#: guiminer.py:90 +#, python-format +msgid "" +"GUIMiner\n" +"\n" +"Version: %(version)s\n" +"\n" +"GUI by Chris 'Kiv' MacLeod\n" +"Original poclbm miner by m0mchil\n" +"Original rpcminer by puddinpop\n" +"\n" +"Get the source code or file issues at GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"If you enjoyed this software, support its development\n" +"by donating to:\n" +"\n" +"%(address)s\n" +"\n" +"Even a single Bitcoin is appreciated and helps motivate\n" +"further work on this software.\n" +msgstr "" +"GUIMinder\n" +"\n" +"Versio: %(version)s\n" +"\n" +"Grafika interfaco de Chris 'Kiv' MACLEOD\n" +"Originala poclbm minilo de m0mchil\n" +"Originalo rpcminer de puddinpop\b\bAkiru la fontkodo aŭ enarkivigi atentindaĵojn ĉe Github:\n" +" https://github.com/Kib/poclbm\n" +"\n" + +#: guiminer.py:111 +msgid "Not started" +msgstr "Ne komencita" + +#: guiminer.py:112 +msgid "Starting..." +msgstr "Komencanta..." + +#: guiminer.py:113 +msgid "Stopped" +msgstr "Haltita" + +#: guiminer.py:114 +msgid "Paused" +msgstr "Paŭzigita" + +#: guiminer.py:115 +msgid "Start mining!" +msgstr "Komenci minadon!" + +#: guiminer.py:116 +msgid "Stop mining" +msgstr "Halti minadon" + +#: guiminer.py:117 +msgid "Refresh balance" +msgstr "Aktualigi bilancon" + +#: guiminer.py:118 +msgid "Connection error" +msgstr "Konekta eraro" + +#: guiminer.py:119 +msgid "Username:" +msgstr "Uzantnomo:" + +#: guiminer.py:120 +msgid "Password:" +msgstr "Pasvorto:" + +#: guiminer.py:121 +msgid "Quit this program" +msgstr "Forlasi" + +#: guiminer.py:122 +msgid "Show about dialog" +msgstr "Montri pridialogujon" + +#: guiminer.py:203 +#, python-format +msgid "%.1f Ghash/s" +msgstr "%.1f Ghak/s" + +#: guiminer.py:205 +#, python-format +msgid "%.1f Mhash/s" +msgstr " %.1f Mhak/s" + +#: guiminer.py:207 +msgid "Connecting..." +msgstr "Konekanta..." + +#: guiminer.py:209 +#, python-format +msgid "%d khash/s" +msgstr "%d khak/s" + +#: guiminer.py:233 +#, python-format +msgid "Requesting balance: %(request)s" +msgstr "Petanta bilancon: %(request)s" + +#: guiminer.py:237 +#, python-format +msgid "Server replied: %(status)s, %(data)s" +msgstr "Servilo respondita: %(status)s, %(data)s" + +#: guiminer.py:304 +msgid "Miner" +msgstr "Minilo" + +#: guiminer.py:305 +msgid "Speed" +msgstr "Rapido" + +#: guiminer.py:306 +msgid "Accepted" +msgstr "Akceptita" + +#: guiminer.py:307 +msgid "Stale" +msgstr "Malfreŝa" + +#: guiminer.py:308 +msgid "Start/Stop" +msgstr "Eki/Halti" + +#: guiminer.py:309 +msgid "Autostart" +msgstr "Memlanĉo" + +#: guiminer.py:393 +msgid "Pause all" +msgstr "Paŭzigi ĉia" + +#: guiminer.py:395 +msgid "Restore" +msgstr "Restaŭri" + +#: guiminer.py:396 +msgid "Close" +msgstr "Fermi" + +#: guiminer.py:452 +#, python-format +msgid "Listener for \"%s\" started" +msgstr "Aŭskultanto por \"%s\" komencita" + +#: guiminer.py:467 +#, python-format +msgid "Listener for \"%(name)s\": %(line)s" +msgstr "Aŭskultanto por \"%(name)s\": %(line)s" + +#: guiminer.py:470 +#, python-format +msgid "Listener for \"%s\" shutting down" +msgstr "Aŭskultanto por \"%s\" malŝaltanta" + +#: guiminer.py:516 +msgid "Server:" +msgstr "Servil" + +#: guiminer.py:521 +msgid "Website:" +msgstr "TTT-ejo:" + +#: guiminer.py:523 +msgid "Ext. Path:" +msgstr "Ekst. vojo:" + +#: guiminer.py:525 +msgid "Host:" +msgstr "Gastiga komputilo:" + +#: guiminer.py:527 +msgid "Port:" +msgstr "Pordo:" + +#: guiminer.py:533 +msgid "Device:" +msgstr "Aparato:" + +#: guiminer.py:534 +msgid "No OpenCL devices" +msgstr "Ne OpenCL-aj aparatoj" + +#: guiminer.py:535 +msgid "Extra flags:" +msgstr "Kroma flagoj:" + +#: guiminer.py:538 +msgid "CPU Affinity:" +msgstr "CPU-a afineco:" + +#: guiminer.py:541 +msgid "Balance:" +msgstr "Bilanco:" + +#: guiminer.py:545 +msgid "Withdraw" +msgstr "Repreni" + +#: guiminer.py:705 +msgid "Default" +msgstr "Defaŭlta" + +#: guiminer.py:756 +msgid "Start" +msgstr "Komenci" + +#: guiminer.py:756 +msgid "Stop" +msgstr "Halti" + +#: guiminer.py:772 +msgid "Connection problems" +msgstr "Konektaj problemoj" + +#: guiminer.py:931 +msgid "Running command: " +msgstr "Plenumanta komando:" + +#: guiminer.py:990 +#, python-format +msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" +msgstr "Malfacileco 1 haketoj: %(nhashes)d %(update_time)s" + +#: guiminer.py:994 +#, python-format +msgid "Blocks: %d, " +msgstr "Blokoj: %d," + +#: guiminer.py:997 +#, python-format +msgid "Shares: %d accepted" +msgstr "Partoj: %d akceptita" + +#: guiminer.py:999 +#, python-format +msgid ", %d stale/invalid" +msgstr ", %d malfreŝa/malvalida" + +#: guiminer.py:1021 +#, python-format +msgid "- last at %s" +msgstr "- lasta ĉe %s" + +#: guiminer.py:1094 +msgid "" +"Server to connect to. Different servers have different fees and features.\n" +"Check their websites for full information." +msgstr "" +"Servilo konektiĝi. Diferencaj serviloj havas diferencaj honorarioj kaj trajtoj.\n" +"Konsilu ilin TTT-ejojn por plu informo." + +#: guiminer.py:1095 +msgid "Website of the currently selected server. Click to visit." +msgstr "TTT-ejo de la nuna elektita servilo. Klaku viziti." + +#: guiminer.py:1096 +msgid "Available OpenCL devices on your system." +msgstr "Disponeblaj OpenCL-aj aparatoj en via sistemo." + +#: guiminer.py:1097 +msgid "Host address, without http:// prefix." +msgstr "Gastiga adreso, sen \"http://\" prefikso." + +#: guiminer.py:1098 +msgid "Server port. This is usually 8332." +msgstr "Servpordo. Estas kutime 8332." + +#: guiminer.py:1099 +msgid "" +"The miner's username.\n" +"May be different than your account username.\n" +"Example: Kiv.GPU" +msgstr "" +"La uzantnomo de la minilo.\n" +"Povas esti diferenca ol via konta uzantnomo.\n" +"Ekz.: Kiv.GPU" + +#: guiminer.py:1100 +msgid "" +"The miner's password.\n" +"May be different than your account password." +msgstr "" +"La pasvorto de la minilo.\n" +"Povas esti diferenca ol via kontpasvorto." + +#: guiminer.py:1101 +msgid "" +"Extra flags to pass to the miner.\n" +"For Radeon HD 5xxx series use -v -w128 for best results.\n" +"For other cards consult the forum." +msgstr "" +"Eksteraj flagoj transdoni al la minilo.\bPor Radeon HD 5xxx serio, uzu '-v -w 128' por plej bonaj rezultoj.\n" +"Por aliaj kartaj, konsilu la forumon." + +#: guiminer.py:1103 +msgid "" +"CPU cores used for mining.\n" +"Unchecking some cores can reduce high CPU usage in some systems." +msgstr "" +"Ĉefprocesoraj kernoj uzita por minado.\n" +"Malselektado de iuj kernoj povas redukti alta ĉefprocesora uzado en iuj sistemoj." + +#: guiminer.py:1197 +#: guiminer.py:1291 +#: guiminer.py:1312 +msgid "Auth token rejected by server." +msgstr "Servilo rifuzis aŭtentokontrolan ĵetonon." + +#: guiminer.py:1215 +#, python-format +msgid "%s confirmed" +msgstr "%s konfirmita" + +#: guiminer.py:1217 +#, python-format +msgid ", %s unconfirmed" +msgstr ", %s nekonfirmira" + +#: guiminer.py:1219 +msgid "Bad response from server." +msgstr "Servilo sendis malbonan respondon." + +#: guiminer.py:1295 +#: guiminer.py:1316 +msgid "Withdraw OK" +msgstr "Repreni okej" + +#: guiminer.py:1486 +msgid "No registration is required - just enter an address and press Start." +msgstr "Registrado ne estas postulata - enigu adreson kaj klaku \"Komenci\"." + +#: guiminer.py:1488 +msgid "Address:" +msgstr "Adreso:" + +#: guiminer.py:1490 +msgid "" +"Your receiving address for Bitcoins.\n" +"E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" +msgstr "" +"Via ricevanta adreso por bitmonoj.\n" +"E.g.: 1Q9nXGeq1y1Xfc4JMdPJKGikLY44UGC9LU" + +#: guiminer.py:1506 +msgid "" +"Your miner username (not your account username).\n" +"Example: Kiv.GPU" +msgstr "" +"Uzantnomo por la minilo (ne via konta uzantnomo).\n" +"Ekz.: Kiv.GPU" + +#: guiminer.py:1508 +#: guiminer.py:1529 +msgid "Your miner password (not your account password)." +msgstr "Pasvorto por la minilo (ne via konta pasvorto)." + +#: guiminer.py:1527 +msgid "" +"Your miner username. \n" +"Example: kiv123@kiv123" +msgstr "" +"Via uzantnomo por la minilo. \n" +"Ekz. kiv123@kiv123" + +#: guiminer.py:1544 +msgid "The e-mail address you registered with." +msgstr "La retadreso uzita registri." + +#: guiminer.py:1545 +msgid "Email:" +msgstr "Retpoŝtadreso:" + +#: guiminer.py:1560 +msgid "&Rename..." +msgstr "&Renomi..." + +#: guiminer.py:1560 +msgid "Rename this miner" +msgstr "Renomi tiun minilon" + +#: guiminer.py:1585 +msgid "&New OpenCL miner..." +msgstr "&Nova OpenCL-an minilo..." + +#: guiminer.py:1585 +msgid "Create a new OpenCL miner (default for ATI cards)" +msgstr "Krei novan OpenCL-an minilon (defaŭlta por ATI-aj vidkartoj)" + +#: guiminer.py:1586 +msgid "Create a new Phoenix miner (for some ATI cards)" +msgstr "Krei novan Phoenix-an minilon (por iuj ATI-aj vidkartoj)" + +#: guiminer.py:1586 +msgid "New Phoenix miner..." +msgstr "Nova Phoenix minilo..." + +#: guiminer.py:1587 +msgid "Create a new CUDA miner (for NVIDIA cards)" +msgstr "Krei novan CUDA-an minilon (por NVIDIA-aj vidkartoj)" + +#: guiminer.py:1587 +msgid "New CUDA miner..." +msgstr "Nova CUDA minilo..." + +#: guiminer.py:1588 +msgid "Create a new Ufasoft miner (for CPUs)" +msgstr "Krei novan Ufasoft-an minilon (por ĉefprocesoroj)" + +#: guiminer.py:1588 +msgid "New Ufasoft CPU miner..." +msgstr "Nova Ufasoft-a ĉefprocesora minilo..." + +#: guiminer.py:1589 +msgid "Create a new custom miner (requires external program)" +msgstr "Krei novan tajloritan minilon (postulas eksteran programon)" + +#: guiminer.py:1589 +msgid "New &other miner..." +msgstr "N&ova alia minilo..." + +#: guiminer.py:1590 +msgid "&New miner" +msgstr "&Nova minilo" + +#: guiminer.py:1591 +msgid "&Save settings" +msgstr "&Savi agorgojn" + +#: guiminer.py:1591 +msgid "Save your settings" +msgstr "&Savi viajn agorgojn" + +#: guiminer.py:1592 +msgid "&Load settings" +msgstr "&Ŝargi agordojn" + +#: guiminer.py:1592 +msgid "Load stored settings" +msgstr "Ŝargi savitajn agordojn" + +#: guiminer.py:1593 +msgid "Quit" +msgstr "Forlasi" + +#: guiminer.py:1594 +msgid "&File" +msgstr "&Dosiero" + +#: guiminer.py:1598 +msgid "Show summary" +msgstr "Montri resumon" + +#: guiminer.py:1598 +msgid "Show summary of all miners" +msgstr "Montri resumon de ĉiaj miniloj" + +#: guiminer.py:1599 +msgid "Show console" +msgstr "Montri konzolon" + +#: guiminer.py:1599 +msgid "Show console logs" +msgstr "Montri konzolajn protokolajn dosierojn" + +#: guiminer.py:1600 +msgid "&View" +msgstr "&Vido" + +#: guiminer.py:1604 +msgid "&Create solo password..." +msgstr "&Krei pasvorton por solaminado..." + +#: guiminer.py:1604 +msgid "Configure a user/pass for solo mining" +msgstr "Konfiguri uzantnomon/pasvorton por solaminado" + +#: guiminer.py:1605 +msgid "&Set Bitcoin client path..." +msgstr "&Agordi vojon al bitmona kliento..." + +#: guiminer.py:1605 +msgid "Set the location of the official Bitcoin client" +msgstr "&Agordi lokon de la oficiala bitmona kliento..." + +#: guiminer.py:1606 +msgid "&Launch Bitcoin client as server" +msgstr "&Lanĉi bitmonan klienton kiel servilo" + +#: guiminer.py:1606 +msgid "Launch the official Bitcoin client as a server for solo mining" +msgstr "&Lanĉi oficiala bitmonan klienton kiel servilo por sola minado" + +#: guiminer.py:1607 +msgid "&Solo utilities" +msgstr "&Solaminada utilaĵo" + +#: guiminer.py:1611 +msgid "Start &minimized" +msgstr "Startigi plej&etigita" + +#: guiminer.py:1611 +msgid "Start the GUI minimized to the tray." +msgstr "Startigi grafikan interfacon plej&etigite al la taskopleto" + +#: guiminer.py:1613 +msgid "&Options" +msgstr "&Agordoj..." + +#: guiminer.py:1617 +msgid "&Change language..." +msgstr "&Ŝanĝi lingvon..." + +#: guiminer.py:1618 +msgid "Language" +msgstr "Lingvo" + +#: guiminer.py:1622 +msgid "&Donate 99 cents..." +msgstr "&Doni 99-aj cendoj..." + +#: guiminer.py:1622 +msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" +msgstr "Doni $0.99 USD en Bitmono subteni programado de GUIMiner" + +#: guiminer.py:1623 +msgid "&Donate" +msgstr "&Doni" + +#: guiminer.py:1626 +msgid "&About..." +msgstr "&Pri..." + +#: guiminer.py:1628 +msgid "&Help" +msgstr "&Helpi" + +#: guiminer.py:1640 +msgid "Failed to load taskbar icon; continuing." +msgstr "Fiaskis ŝargi taskopleta bildsimbolo; kontinuanta." + +#: guiminer.py:1649 +msgid "OpenCL not found - can't add a OpenCL miner" +msgstr "OpenCL-a ne trovita - malpovas aldoni OpenCL-an minilon" + +#: guiminer.py:1686 +#, python-format +msgid "GUIMiner - v%s" +msgstr "GUIMiner - v%s" + +#: guiminer.py:1728 +msgid "Name this miner:" +msgstr "Nomu tiun minilon:" + +#: guiminer.py:1728 +msgid "New miner" +msgstr "Nova minilo" + +#: guiminer.py:1731 +msgid "Untitled" +msgstr "Sentitola" + +#: guiminer.py:1742 +msgid "External miner (*.exe)|*.exe|(*.py)|*.py" +msgstr "Ekstera minilo (*.exe)|*.exe|(*.py)|*.py" + +#: guiminer.py:1744 +msgid "Select external miner:" +msgstr "Elektu eksteran minilon:" + +#: guiminer.py:1754 +#, python-format +msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" +msgstr "Malsubtenata ekstera minilo %(filename)s. Subtenata estas: %(supported)s" + +#: guiminer.py:1756 +msgid "Miner not supported" +msgstr "Minilo malsubtenata" + +#: guiminer.py:1797 +msgid "Do you want to save changes?" +msgstr "Ĉu vi volas savi ŝanĝojn?" + +#: guiminer.py:1797 +msgid "Save" +msgstr "Savi" + +#: guiminer.py:1827 +msgid "Saving: " +msgstr "Savanta:" + +#: guiminer.py:1833 +#, python-format +msgid "" +"Couldn't write save file %s.\n" +"Check the location is writable." +msgstr "" +"Nepovas skribi savdosiero %s.\n" +"Certigu ke, loko estas skribebla." + +#: guiminer.py:1834 +msgid "Save unsuccessful" +msgstr "Savita malsukcese" + +#: guiminer.py:1836 +#, python-format +msgid "Profiles saved OK to %s." +msgstr "Profiloj savis sukcese al %s." + +#: guiminer.py:1837 +msgid "Save successful" +msgstr "Savita sukcese" + +#: guiminer.py:1849 +#, python-format +msgid "Loaded: %s" +msgstr "Ŝargita: %s" + +#: guiminer.py:1863 +msgid "Loading profiles will stop any currently running miners. Continue?" +msgstr "Ŝargado de profiloj haltos ajnaj nunaj funkciantaj miniloj. Daŭrigi?" + +#: guiminer.py:1864 +msgid "Load profile" +msgstr "Ŝargi profilon" + +#: guiminer.py:1893 +msgid "Select path to Bitcoin.exe" +msgstr "Elekti vojon al Bitcoin.exe" + +#: guiminer.py:1905 +msgid "About" +msgstr "Pri" + +#: guiminer.py:1931 +msgid "Closing this miner will stop it. Continue?" +msgstr "Fermi tiun minilo ĉesos ĝin. Kontinuu?" + +#: guiminer.py:1932 +msgid "Close miner" +msgstr "Malfermi minilon" + +#: guiminer.py:1961 +#, python-format +msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" +msgstr "Ne povas trovi Bitcoin.exe ĉe %s. Certigu ke, ĝia vojo estas ĝusta." + +#: guiminer.py:1962 +msgid "Launch failed" +msgstr "Lanĉo fiaskita" + +#: guiminer.py:1965 +msgid "" +"The Bitcoin client will now launch in server mode.\n" +"Once it connects to the network and downloads the block chain, you can start a miner in 'solo' mode." +msgstr "" +"La bitmona kliento lanĉos nun en servila reĝimo.\n" +"Unufoje ĝi konektas al via reto kaj elŝutas via blokĉeno, vi povas startigi minilon in 'sola' reĝimo." + +#: guiminer.py:1966 +msgid "Launched ok." +msgstr "Lanĉo sukcese" + +#: guiminer.py:1981 +#, python-format +msgid "%s already exists. Overwrite?" +msgstr "%s ekzistas jam. Anstataŭigu?" + +#: guiminer.py:1982 +msgid "bitcoin.conf already exists." +msgstr "bitcoin.conf ekzistas jam." + +#: guiminer.py:1987 +msgid "Enter password" +msgstr "Tajpu pasvorton" + +#: guiminer.py:1997 +msgid "Success" +msgstr "Sukcesa" + +#: guiminer.py:1997 +msgid "Wrote bitcoin config ok." +msgstr "Skribis bitmona agordo sukcese." + +#: guiminer.py:2008 +msgid "Console" +msgstr "Konzolo" + +#: guiminer.py:2020 +msgid "Summary" +msgstr "Resumo" + +#: guiminer.py:2033 +msgid "Rename miner" +msgstr "Renomi minolon" + +#: guiminer.py:2033 +msgid "Rename to:" +msgstr "Renomu kiel:" + +#: guiminer.py:2038 +msgid "Change language" +msgstr "Ŝanĝi lingvon" + +#: guiminer.py:2058 +msgid "Choose language (requires restart to take full effect)" +msgstr "Agordi lingvon (postulas restarton efektiviĝi)" + +#: guiminer.py:2103 +msgid "" +"Click the link below to log in to the pool and get a special token.\n" +"This token lets you securely check your balance.\n" +"To remember this token for the future, save your miner settings." +msgstr "Klaku ligilon malsupre ensaluti la grupon kaj akiri apartan ĵetonon." + +#: guiminer.py:2112 +msgid "(Paste token here)" +msgstr "(Algluu ĵetono ĉi)" + +#: guiminer.py:2138 +msgid "Copy address to clipboard" +msgstr "Kopii adreso al tondejo" + +#: guiminer.py:2157 +msgid "No OpenCL devices found." +msgstr "Ne OpenCL-aj aparatoj trovitaj." + +#: guiminer.py:2160 +msgid "" +"No OpenCL devices were found.\n" +" If you only want to mine using CPU or CUDA, you can ignore this message.\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI Stream\n" +" SDK, or your GPU may not support OpenCL." +msgstr "" +"Ne OpenCL-aj aparatoj trovitaj.\n" +"Se vi deziras sole mini de uzado ĉefprocezoro aŭ CUDA, ignoru tiun mesaĝon.\n" +"Se vi deziras mini de uzado ATI-aj vidkartoj, vi eblas ke, vi bezonos instali la \n" +"\"ATI Stream SDK\", aŭ eblas ke, via vidkarto ne subtenas OpenCL-on." + +#: guiminer.py:2170 +msgid "Don't show this message again" +msgstr "Ne remontru tiun mesaĝon. " + From 371f89dd88acd0db77a24ec36a804f66760b5f76 Mon Sep 17 00:00:00 2001 From: Colin Dean Date: Tue, 4 Sep 2012 21:56:13 -0400 Subject: [PATCH 171/190] add Esperanto to language list --- guiminer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/guiminer.py b/guiminer.py index e8c9499..ef504f7 100644 --- a/guiminer.py +++ b/guiminer.py @@ -43,6 +43,7 @@ def get_module_path(): "Chinese Simplified": wx.LANGUAGE_CHINESE_SIMPLIFIED, "Dutch": wx.LANGUAGE_DUTCH, "English": wx.LANGUAGE_ENGLISH, + "Esperanto": wx.LANGUAGE_ESPERANTO, "French": wx.LANGUAGE_FRENCH, "German": wx.LANGUAGE_GERMAN, "Hungarian": wx.LANGUAGE_HUNGARIAN, From 02213f5126fa3689a0460d3bb8af93dd019b20b7 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 18 Nov 2012 12:59:17 -0400 Subject: [PATCH 172/190] Add option for blockchain directory. Accept bitcoin-qt.exe. --- .gitignore | 1 + guiminer.py | 42 ++++++++++++++++++++++++++++++++++++------ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 7170a01..af561f2 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ *.bat *.bak *.dll +*.cmd \ No newline at end of file diff --git a/guiminer.py b/guiminer.py index e8c9499..7adce38 100644 --- a/guiminer.py +++ b/guiminer.py @@ -9,8 +9,8 @@ Copyright 2011-2012 Chris MacLeod This program is released under the GNU GPL. See LICENSE.txt for details. """ - import sys, os, subprocess, errno, re, threading, logging, time, httplib, urllib +print sys.path import wx import json import collections @@ -1799,10 +1799,11 @@ def __init__(self, *args, **kwds): view_menu.Append(ID_CONSOLE, _("Show console"), _("Show console logs"), wx.ITEM_NORMAL) self.menubar.Append(view_menu, _("&View")) - ID_SOLO, ID_PATHS, ID_LAUNCH = wx.NewId(), wx.NewId(), wx.NewId() + ID_SOLO, ID_PATHS, ID_BLOCKCHAIN_PATH, ID_LAUNCH = wx.NewId(), wx.NewId(), wx.NewId(), wx.NewId() solo_menu = wx.Menu() solo_menu.Append(ID_SOLO, _("&Create solo password..."), _("Configure a user/pass for solo mining"), wx.ITEM_NORMAL) solo_menu.Append(ID_PATHS, _("&Set Bitcoin client path..."), _("Set the location of the official Bitcoin client"), wx.ITEM_NORMAL) + solo_menu.Append(ID_BLOCKCHAIN_PATH, _("&Set Bitcoin data directory..."), _("Set the location of the bitcoin data directory containing the blockchain and wallet"), wx.ITEM_NORMAL) solo_menu.Append(ID_LAUNCH, _("&Launch Bitcoin client as server"), _("Launch the official Bitcoin client as a server for solo mining"), wx.ITEM_NORMAL) self.menubar.Append(solo_menu, _("&Solo utilities")) @@ -1830,10 +1831,16 @@ def __init__(self, *args, **kwds): self.statusbar = self.CreateStatusBar(2, 0) try: - self.bitcoin_executable = os.path.join(os.getenv("PROGRAMFILES"), "Bitcoin", "bitcoin.exe") + self.bitcoin_executable = os.path.join(os.getenv("PROGRAMFILES"), "Bitcoin", "bitcoin-qt.exe") except: self.bitcoin_executable = "" # TODO: where would Bitcoin probably be on Linux/Mac? + try: + self.blockchain_directory = os.path.join(os.getenv("APPDATA"), "Bitcoin") + except: + self.blockchain_directory = "" + + try: self.tbicon = GUIMinerTaskBarIcon(self) except: @@ -1863,6 +1870,7 @@ def __init__(self, *args, **kwds): self.Bind(wx.EVT_MENU, self.load_config, id=wx.ID_OPEN) self.Bind(wx.EVT_MENU, self.on_menu_exit, id=wx.ID_EXIT) self.Bind(wx.EVT_MENU, self.set_official_client_path, id=ID_PATHS) + self.Bind(wx.EVT_MENU, self.set_blockchain_directory, id=ID_BLOCKCHAIN_PATH) self.Bind(wx.EVT_MENU, self.show_console, id=ID_CONSOLE) self.Bind(wx.EVT_MENU, self.show_summary, id=ID_SUMMARY) self.Bind(wx.EVT_MENU, self.show_about_dialog, id=wx.ID_ABOUT) @@ -2034,6 +2042,7 @@ def save_config(self, event=None): show_summary=self.is_summary_visible(), profiles=profile_data, bitcoin_executable=self.bitcoin_executable, + blockchain_directory=self.blockchain_directory, show_opencl_warning=self.do_show_opencl_warning, start_minimized=self.start_minimized_chk.IsChecked(), console_max_lines=self.console_max_lines, @@ -2075,6 +2084,10 @@ def load_config(self, event=None): executable = config_data.get('bitcoin_executable', None) if executable is not None: self.bitcoin_executable = executable + + blockchain_directory = config_data.get('blockchain_directory', None) + if blockchain_directory is not None: + self.blockchain_directory = blockchain_directory # Shut down any existing miners before they get clobbered if(any(p.is_mining for p in self.profile_panels)): @@ -2111,10 +2124,10 @@ def load_config(self, event=None): def set_official_client_path(self, event): """Set the path to the official Bitcoin client.""" - wildcard = "bitcoin.exe" if sys.platform == 'win32' else '*.*' + wildcard = "*.exe" if sys.platform == 'win32' else '*.*' dialog = wx.FileDialog(self, _("Select path to Bitcoin.exe"), - defaultFile="bitcoin.exe", + defaultFile="bitcoin-qt.exe", wildcard=wildcard, style=wx.OPEN) if dialog.ShowModal() == wx.ID_OK: @@ -2122,6 +2135,19 @@ def set_official_client_path(self, event): if os.path.exists(path): self.bitcoin_executable = path dialog.Destroy() + + def set_blockchain_directory(self, event): + """Set the path to the blockchain data directory.""" + defaultPath = os.path.join(os.getenv("APPDATA"), "Bitcoin") + dialog = wx.DirDialog(self, + _("Select path to blockchain"), + defaultPath=defaultPath, + style=wx.DD_DIR_MUST_EXIST) + if dialog.ShowModal() == wx.ID_OK: + path = os.path.join(dialog.GetDirectory(), dialog.GetFilename()) + if os.path.exists(path): + self.blockchain_directory = path + dialog.Destroy() def show_about_dialog(self, event): """Show the 'about' dialog.""" @@ -2177,8 +2203,12 @@ def launch_solo_server(self, event): This allows poclbm to connect to it for mining solo. """ + if self.blockchain_directory and os.path.exists(self.blockchain_directory): + datadir = " -datadir=%s" % self.blockchain_directory + else: + datadir = "" try: - subprocess.Popen(self.bitcoin_executable + " -server") + subprocess.Popen(self.bitcoin_executable + " -server" + datadir) except OSError: self.message( _("Couldn't find Bitcoin at %s. Is your path set correctly?") % self.bitcoin_executable, From 6deac3ca65178139b88ec4a82bcd9922abfb9350 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 18 Nov 2012 17:58:55 -0400 Subject: [PATCH 173/190] Correctly set Bitcoin data directory. --- guiminer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index 7adce38..6bcc5cf 100644 --- a/guiminer.py +++ b/guiminer.py @@ -2144,7 +2144,7 @@ def set_blockchain_directory(self, event): defaultPath=defaultPath, style=wx.DD_DIR_MUST_EXIST) if dialog.ShowModal() == wx.ID_OK: - path = os.path.join(dialog.GetDirectory(), dialog.GetFilename()) + path = dialog.GetPath() if os.path.exists(path): self.blockchain_directory = path dialog.Destroy() From d82a11b69582158f64349afe0c88cce2df1c198b Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 18 Nov 2012 20:41:25 -0400 Subject: [PATCH 174/190] Remove Phoenix 1 support. --- README.txt | 4 +--- guiminer.py | 8 ++++---- setup.py | 2 +- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/README.txt b/README.txt index bc8993b..5d16c43 100644 --- a/README.txt +++ b/README.txt @@ -5,7 +5,6 @@ by Chris 'Kiv' MacLeod based on: - "poclbm" by m0mchil - 'rpcminer' by puddinpop -- "phoenix" by jedi95 - bitcoin-miner by ufasoft What is it? @@ -55,8 +54,7 @@ supports OpenCL, try the GPU Caps Viewer: For AMD/ATI cards, to get a version of OpenCL you need the Stream SDK which is available here: - - http://developer.amd.com/gpu/AMDAPPSDK/downloads/pages/AMDAPPSDKDownloadArchive.aspx + http://developer.amd.com/tools/heterogeneous-computing/amd-accelerated-parallel-processing-app-sdk/ For NVIDIA cards, you can also install OpenCL and mine that way, or you can install CUDA and use rpcminer-CUDA which may provide slightly higher performance diff --git a/guiminer.py b/guiminer.py index 6bcc5cf..6add3fb 100644 --- a/guiminer.py +++ b/guiminer.py @@ -126,8 +126,8 @@ def save_language(): "rpcminer-cpu.exe", "rpcminer-cuda.exe", "rpcminer-opencl.exe", - "phoenix.py", - "phoenix.exe", +# "phoenix.py", +# "phoenix.exe", "bitcoin-miner.exe" ] @@ -1782,7 +1782,7 @@ def __init__(self, *args, **kwds): file_menu = wx.Menu() new_menu = wx.Menu() new_menu.Append(wx.ID_NEW, _("&New OpenCL miner..."), _("Create a new OpenCL miner (default for ATI cards)"), wx.ITEM_NORMAL) - new_menu.Append(ID_NEW_PHOENIX, _("New Phoenix miner..."), _("Create a new Phoenix miner (for some ATI cards)"), wx.ITEM_NORMAL) + #new_menu.Append(ID_NEW_PHOENIX, _("New Phoenix miner..."), _("Create a new Phoenix miner (for some ATI cards)"), wx.ITEM_NORMAL) new_menu.Append(ID_NEW_CGMINER, _("New CG miner..."), _("Create a new CGMiner (for some ATI cards)"), wx.ITEM_NORMAL) new_menu.Append(ID_NEW_CUDA, _("New CUDA miner..."), _("Create a new CUDA miner (for NVIDIA cards)"), wx.ITEM_NORMAL) new_menu.Append(ID_NEW_UFASOFT, _("New Ufasoft CPU miner..."), _("Create a new Ufasoft miner (for CPUs)"), wx.ITEM_NORMAL) @@ -1861,7 +1861,7 @@ def __init__(self, *args, **kwds): self.do_show_opencl_warning = not dialog.is_box_checked() self.Bind(wx.EVT_MENU, self.name_new_profile, id=wx.ID_NEW) - self.Bind(wx.EVT_MENU, self.new_phoenix_profile, id=ID_NEW_PHOENIX) + #self.Bind(wx.EVT_MENU, self.new_phoenix_profile, id=ID_NEW_PHOENIX) self.Bind(wx.EVT_MENU, self.new_cgminer_profile, id=ID_NEW_CGMINER) self.Bind(wx.EVT_MENU, self.new_ufasoft_profile, id=ID_NEW_UFASOFT) self.Bind(wx.EVT_MENU, self.new_cuda_profile, id=ID_NEW_CUDA) diff --git a/setup.py b/setup.py index b6b4303..0833380 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ 'icon_resources': [(0, "logo.ico")] } ], - console=['phoenix.py', 'poclbm.py', 'po_to_mo.py'], + console=['poclbm.py', 'po_to_mo.py'], # OpenCL.dll is vendor specific options=dict(py2exe=dict( includes="minerutil, twisted.web.resource, QueueReader", From dbcf514e73b1e9aa5cedde29c0785828ec15a413 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 18 Nov 2012 20:43:31 -0400 Subject: [PATCH 175/190] Version bump --- guiminer.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/guiminer.py b/guiminer.py index 27c232c..bc9d640 100644 --- a/guiminer.py +++ b/guiminer.py @@ -3,7 +3,6 @@ Currently supports: - m0mchil's "poclbm" - puddinpop's "rpcminer" -- jedi95's "Phoenix" - ufasoft's "bitcoin-miner" Copyright 2011-2012 Chris MacLeod @@ -24,7 +23,7 @@ from wx.lib.agw import hyperlink from wx.lib.newevent import NewEvent -__version__ = '2012-02-19' +__version__ = '2012-11-18' def get_module_path(): """Return the folder containing this script (or its .exe).""" From 29349a1ebbd94f6d26839588c586c262b488629c Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 18 Nov 2012 20:45:24 -0400 Subject: [PATCH 176/190] Add hash bang. --- guiminer.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/guiminer.py b/guiminer.py index bc9d640..93d91bc 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1,3 +1,5 @@ +#!/usr/bin/python + """GUIMiner - graphical frontend to Bitcoin miners. Currently supports: From a9b1f1fa42e8f2c1ddb17b245093bae8de73d918 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 18 Nov 2012 20:57:02 -0400 Subject: [PATCH 177/190] Update HTTPS hosts. --- guiminer.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index 93d91bc..d923f22 100644 --- a/guiminer.py +++ b/guiminer.py @@ -1329,7 +1329,10 @@ def requires_auth_token(self, host): def requires_https(self, host): """Return True if the specified host requires HTTPs for balance update.""" - return host == "mtred.com" + HOSTS = ["mtred.com", "api2.bitcoin.cz"] + if host in HOSTS: return True + if "btcguild" in host: return True + return False def on_balance_refresh(self, event=None): """Refresh the miner's balance from the server.""" From 2cb352571f15e7b472136653df4eb3c6effc31a3 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 18 Nov 2012 21:52:57 -0400 Subject: [PATCH 178/190] Fix setup.py for latest version. --- setup.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 0833380..bad7d4d 100644 --- a/setup.py +++ b/setup.py @@ -9,9 +9,7 @@ console=['poclbm.py', 'po_to_mo.py'], # OpenCL.dll is vendor specific options=dict(py2exe=dict( - includes="minerutil, twisted.web.resource, QueueReader", - dll_excludes=['OpenCL.dll', 'w9xpopen.exe', 'boost_python-vc90-mt-1_39.dll'], - #bundle_files=1, + dll_excludes=['OpenCL.dll', 'w9xpopen.exe'], compressed=True, optimize=2, excludes = ["Tkconstants", "Tkinter", "tcl", "curses", "_ssl", "pyexpat", "unicodedata", "bz2"], From 45ad0331b8fb80b95d204a932a155ae672b246b7 Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 18 Nov 2012 21:53:29 -0400 Subject: [PATCH 179/190] Disable minimum rate timing so we can get regular status updates. --- poclbm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/poclbm.py b/poclbm.py index 4ea4fbf..507dd55 100755 --- a/poclbm.py +++ b/poclbm.py @@ -58,7 +58,7 @@ def socketwrap(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0): log.verbose = options.verbose log.quiet = options.quiet -options.rate = if_else(options.verbose, max(options.rate, 60), max(options.rate, 0.1)) +options.rate = if_else(options.verbose, options.rate, max(options.rate, 0.1)) options.version = VERSION From d107d092adbc0422d06a1870d1077e0234ef86af Mon Sep 17 00:00:00 2001 From: Kiv Date: Sun, 18 Nov 2012 21:55:15 -0400 Subject: [PATCH 180/190] Update stale shares meter for latest poclbm. --- guiminer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guiminer.py b/guiminer.py index d923f22..d2eefd4 100644 --- a/guiminer.py +++ b/guiminer.py @@ -448,7 +448,7 @@ class MinerListenerThread(threading.Thread): lambda _: None), # Just ignore lines like these (r"accepted|\"result\":\s*true", lambda _: UpdateAcceptedEvent(accepted=True)), - (r"invalid|stale", lambda _: + (r"invalid|stale|rejected", lambda _: UpdateAcceptedEvent(accepted=False)), (r"(\d+)\s*khash/s", lambda match: UpdateHashRateEvent(rate=int(match.group(1)))), @@ -871,7 +871,7 @@ def configure_subprocess_poclbm(self): executable = "poclbm.exe" else: executable = "python poclbm.py" - cmd = "%s %s:%s@%s:%s --device=%d --platform=%d --verbose %s" % ( + cmd = "%s %s:%s@%s:%s --device=%d --platform=%d --verbose -r1 %s" % ( executable, self.txt_username.GetValue(), self.txt_pass.GetValue(), From 87d95236a3933a1d037a60b5e138c69aa066b080 Mon Sep 17 00:00:00 2001 From: Matheus Macabu Date: Wed, 28 Nov 2012 20:31:25 -0200 Subject: [PATCH 181/190] Added Portuguese translation. Signed-off-by: Matheus Macabu --- guiminer.py | 1 + guiminer_pt.po | 773 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 774 insertions(+) create mode 100644 guiminer_pt.po diff --git a/guiminer.py b/guiminer.py index d2eefd4..a59342a 100644 --- a/guiminer.py +++ b/guiminer.py @@ -49,6 +49,7 @@ def get_module_path(): "German": wx.LANGUAGE_GERMAN, "Hungarian": wx.LANGUAGE_HUNGARIAN, "Italian": wx.LANGUAGE_ITALIAN, + "Portuguese": wx.LANGUAGE_PORTUGUESE, "Russian": wx.LANGUAGE_RUSSIAN, "Spanish": wx.LANGUAGE_SPANISH, } diff --git a/guiminer_pt.po b/guiminer_pt.po new file mode 100644 index 0000000..6112646 --- /dev/null +++ b/guiminer_pt.po @@ -0,0 +1,773 @@ +msgid "" +msgstr "" +"Project-Id-Version: guiminer\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-06-14 22:51-0300\n" +"PO-Revision-Date: 2012-11-28 19:35-0300\n" +"Last-Translator: Matheus Macabu \n" +"Language-Team: Portuguese\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: guiminer.py:90 +#, python-format +msgid "" +"GUIMiner\n" +"\n" +"Version: %(version)s\n" +"\n" +"GUI by Chris 'Kiv' MacLeod\n" +"Original poclbm miner by m0mchil\n" +"Original rpcminer by puddinpop\n" +"\n" +"Get the source code or file issues at GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"If you enjoyed this software, support its development\n" +"by donating to:\n" +"\n" +"%(address)s\n" +"\n" +"Even a single Bitcoin is appreciated and helps motivate\n" +"further work on this software.\n" +msgstr "" +"GUIMiner\n" +"\n" +"Versão: %(version)s\n" +"\n" +"GUI por Chris 'Kiv' MacLeod\n" +"Minerador poclbm original por m0mchil\n" +"Minerador rpcminer original por puddinpop\n" +"\n" +"Obtenha o código-fonte ou reporte erros em GitHub:\n" +" https://github.com/Kiv/poclbm\n" +"\n" +"Se tiveres apreciado este software, suporte seu desenvolvimento\n" +"através de doações para:\n" +"\n" +"%(address)s\n" +"\n" +"Até mesmo um único Bitcoin é apreciado e ajuda a motivar\n" +"em trabalhos futuros neste software.\n" + +#: guiminer.py:111 +msgid "Not started" +msgstr "Não iniciado" + +#: guiminer.py:112 +msgid "Starting..." +msgstr "Iniciando..." + +#: guiminer.py:113 +msgid "Stopped" +msgstr "Parado" + +#: guiminer.py:114 +msgid "Paused" +msgstr "Pausado" + +#: guiminer.py:115 +msgid "Start mining!" +msgstr "Iniciar mineração!" + +#: guiminer.py:116 +msgid "Stop mining" +msgstr "Parar mineração" + +#: guiminer.py:117 +msgid "Refresh balance" +msgstr "Atualizar saldo" + +#: guiminer.py:118 +msgid "Connection error" +msgstr "Erro de conexão" + +#: guiminer.py:119 +msgid "Username:" +msgstr "Usuário:" + +#: guiminer.py:120 +msgid "Password:" +msgstr "Senha:" + +#: guiminer.py:121 +msgid "Quit this program" +msgstr "Sair do programa" + +#: guiminer.py:122 +msgid "Show about dialog" +msgstr "Sobre..." + +#: guiminer.py:203 +#, python-format +msgid "%.1f Ghash/s" +msgstr "%.1f Ghash/s" + +#: guiminer.py:205 +#, python-format +msgid "%.1f Mhash/s" +msgstr "%.1f Mhash/s" + +#: guiminer.py:207 +msgid "Connecting..." +msgstr "Conectando..." + +#: guiminer.py:209 +#, python-format +msgid "%d khash/s" +msgstr "%d khash/s" + +#: guiminer.py:233 +#, python-format +msgid "Requesting balance: %(request)s" +msgstr "Solicitando saldo: %(request)s" + +#: guiminer.py:237 +#, python-format +msgid "Server replied: %(status)s, %(data)s" +msgstr "Servidor respondeu: %(status)s, %(data)s" + +#: guiminer.py:304 +msgid "Miner" +msgstr "Minerador" + +#: guiminer.py:305 +msgid "Speed" +msgstr "Velocidade" + +#: guiminer.py:306 +msgid "Accepted" +msgstr "Aceptado" + +#: guiminer.py:307 +msgid "Stale" +msgstr "Expirado" + +#: guiminer.py:308 +msgid "Start/Stop" +msgstr "Iniciar/Parar" + +#: guiminer.py:309 +msgid "Autostart" +msgstr "Início auto." + +#: guiminer.py:393 +msgid "Pause all" +msgstr "Pausar todos" + +#: guiminer.py:395 +msgid "Restore" +msgstr "Restaurar" + +#: guiminer.py:396 +msgid "Close" +msgstr "Fechar" + +#: guiminer.py:452 +#, python-format +msgid "Listener for \"%s\" started" +msgstr "Minerador para \"%s\" iniciado" + +#: guiminer.py:467 +#, python-format +msgid "Listener for \"%(name)s\": %(line)s" +msgstr "Minerador para \"%(name)s\": %(line)s" + +#: guiminer.py:470 +#, python-format +msgid "Listener for \"%s\" shutting down" +msgstr "Minerador para \"%s\" encerrando" + +#: guiminer.py:516 +msgid "Server:" +msgstr "Servidor:" + +#: guiminer.py:521 +msgid "Website:" +msgstr "Sítio web:" + +#: guiminer.py:523 +msgid "Ext. Path:" +msgstr "Caminho Externo:" + +#: guiminer.py:525 +msgid "Host:" +msgstr "Servidor:" + +#: guiminer.py:527 +msgid "Port:" +msgstr "Porta:" + +#: guiminer.py:533 +msgid "Device:" +msgstr "Dispositivo:" + +#: guiminer.py:534 +msgid "No OpenCL devices" +msgstr "No há dispositivos OpenCL" + +#: guiminer.py:535 +msgid "Extra flags:" +msgstr "Opções extras:" + +#: guiminer.py:538 +msgid "CPU Affinity:" +msgstr "Afinidade da CPU:" + +#: guiminer.py:541 +msgid "Balance:" +msgstr "Saldo:" + +#: guiminer.py:545 +msgid "Withdraw" +msgstr "Retirar saldo" + +#: guiminer.py:705 +msgid "Default" +msgstr "Padrão" + +#: guiminer.py:756 +msgid "Start" +msgstr "Iniciar" + +#: guiminer.py:756 +msgid "Stop" +msgstr "Parar" + +#: guiminer.py:772 +msgid "Connection problems" +msgstr "Problemas de conexão" + +#: guiminer.py:931 +msgid "Running command: " +msgstr "Executando comando: " + +#: guiminer.py:990 +#, python-format +msgid "Difficulty 1 hashes: %(nhashes)d %(update_time)s" +msgstr "Dificuldade 1 hashes: %(nhashes)d %(update_time)s" + +#: guiminer.py:994 +#, python-format +msgid "Blocks: %d, " +msgstr "Blocos: %d, " + +#: guiminer.py:997 +#, python-format +msgid "Shares: %d accepted" +msgstr "Tarefas: %d aceitadas" + +#: guiminer.py:999 +#, python-format +msgid ", %d stale/invalid" +msgstr ", %d expirada/inválida" + +#: guiminer.py:1021 +#, python-format +msgid "- last at %s" +msgstr "- última: %s" + +#: guiminer.py:1094 +msgid "" +"Server to connect to. Different servers have different fees and features.\n" +"Check their websites for full information." +msgstr "" +"Servidor a se conectar. Diferentes servidores possuem diferentes taxas e funcionalidades.\n" +"Visite seus sítios para mais informações." + +#: guiminer.py:1095 +msgid "Website of the currently selected server. Click to visit." +msgstr "Sítio do servidor selecionado atualmente. Clique para visitar." + +#: guiminer.py:1096 +msgid "Available OpenCL devices on your system." +msgstr "Dispositivos OpenCL disponíveis em seu sistema." + +#: guiminer.py:1097 +msgid "Host address, without http:// prefix." +msgstr "Endereço do servidor, sem o prefixo http://" + +#: guiminer.py:1098 +msgid "Server port. This is usually 8332." +msgstr "Porta do servidor. Geralmente 8332." + +#: guiminer.py:1099 +msgid "" +"The miner's username.\n" +"May be different than your account username.\n" +"Example: Kiv.GPU" +msgstr "" +"O nome do minerador.\n" +"Pode ser diferente do nome de sua conta.\n" +"Exemplo: MeuMineradorBitCoin.GPU" + +#: guiminer.py:1100 +msgid "" +"The miner's password.\n" +"May be different than your account password." +msgstr "" +"A senha do minerador.\n" +"Pode ser diferente da senha de sua conta.\n" + +#: guiminer.py:1101 +msgid "" +"Extra flags to pass to the miner.\n" +"For Radeon HD 5xxx series use -v -w128 for best results.\n" +"For other cards consult the forum." +msgstr "" +"Opções extras a serem passadas ao minerador.\n" +"Para a série Radeon HD 5xxx utilize -v -w128 para melhores resultados.\n" +"Para outras placas de vídeo consulte o fórum." + +#: guiminer.py:1103 +msgid "" +"CPU cores used for mining.\n" +"Unchecking some cores can reduce high CPU usage in some systems." +msgstr "" +"Núcleos da CPU usados para mineração.\n" +"Desmarcar alguns núcleos pode reduzir alto uso de CPU em alguns sistemas." + +#: guiminer.py:1197 guiminer.py:1291 guiminer.py:1312 +msgid "Auth token rejected by server." +msgstr "Código de autenticação rejeitado pelo servidor." + +#: guiminer.py:1215 +#, python-format +msgid "%s confirmed" +msgstr "%s confirmado" + +#: guiminer.py:1217 +#, python-format +msgid ", %s unconfirmed" +msgstr ", %s não confirmado" + +#: guiminer.py:1219 +msgid "Bad response from server." +msgstr "Resposta incorreta do servidor." + +#: guiminer.py:1295 guiminer.py:1316 +msgid "Withdraw OK" +msgstr "Retirada de Saldo OK" + +#: guiminer.py:1486 +msgid "No registration is required - just enter an address and press Start." +msgstr "" +msgid "Registrar-se não é obrigatório - apenas entre com um endereço e pressione Iniciar." + +#: guiminer.py:1488 +msgid "Address:" +msgstr "Endereço:" + +#: guiminer.py:1490 +msgid "" +"Your receiving address for Bitcoins.\n" +"E.g.: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" +msgstr "" +"Sua conta para recebimento de Bitcoins.\n" +"Exemplo: 1A94cjRpaPBMV9ZNWFihB5rTFEeihBALgc" + +#: guiminer.py:1506 +msgid "" +"Your miner username (not your account username).\n" +"Example: Kiv.GPU" +msgstr "" +"Usuário do minerador, (não é o usuário da sua conta).\n" +"Exemplo: CarteiraBitCoins.GPU" + +#: guiminer.py:1508 guiminer.py:1529 +msgid "Your miner password (not your account password)." +msgstr "Senha do minerador (não é a senha da sua conta).\n" + +#: guiminer.py:1527 +msgid "" +"Your miner username. \n" +"Example: kiv123@kiv123" +msgstr "" +"O usuário do minerador. \n" +"Exemplo: CarteiraBitcoins@kiv123" + +#: guiminer.py:1544 +msgid "The e-mail address you registered with." +msgstr "O e-mail no qual você registrou-se." + +#: guiminer.py:1545 +msgid "Email:" +msgstr "E-mail:" + +#: guiminer.py:1560 +msgid "&Rename..." +msgstr "&Renomear..." + +#: guiminer.py:1560 +msgid "Rename this miner" +msgstr "Renomear este minerador" + +#: guiminer.py:1585 +msgid "&New OpenCL miner..." +msgstr "&Novo minerador OpenCL..." + +#: guiminer.py:1585 +msgid "Create a new OpenCL miner (default for ATI cards)" +msgstr "Criar um novo minerador OpenCL (placas gráficas AMD)" + +#: guiminer.py:1586 +msgid "Create a new Phoenix miner (for some ATI cards)" +msgstr "Criar um novo minerador Phoenix (algumas placas gráficas AMD)" + +#: guiminer.py:1586 +msgid "New Phoenix miner..." +msgstr "Novo minerador Phoenix" + +#: guiminer.py:1587 +msgid "Create a new CUDA miner (for NVIDIA cards)" +msgstr "Criar um novo minerador CUDA (placas gráficas NVIDIA)" + +#: guiminer.py:1587 +msgid "New CUDA miner..." +msgstr "Novo minerador CUDA..." + +#: guiminer.py:1588 +msgid "Create a new Ufasoft miner (for CPUs)" +msgstr "Criar um novo minerador Ufasoft (para CPUs)" + +#: guiminer.py:1588 +msgid "New Ufasoft CPU miner..." +msgstr "Novo minerador Ufasoft CPU" + +#: guiminer.py:1589 +msgid "Create a new custom miner (requires external program)" +msgstr "Criar um novo minerador personalizado (para programas externos)" + +#: guiminer.py:1589 +msgid "New &other miner..." +msgstr "Novo minerad&or diferente..." + +#: guiminer.py:1590 +msgid "&New miner" +msgstr "&Novo minerador" + +#: guiminer.py:1591 +msgid "&Save settings" +msgstr "&Salvar configurações" + +#: guiminer.py:1591 +msgid "Save your settings" +msgstr "Salve suas configurações" + +#: guiminer.py:1592 +msgid "&Load settings" +msgstr "&Carregar configurações" + +#: guiminer.py:1592 +msgid "Load stored settings" +msgstr "Carregar configurações salvas" + +#: guiminer.py:1593 +msgid "Quit" +msgstr "Sair" + +#: guiminer.py:1594 +msgid "&File" +msgstr "&Arquivo" + +#: guiminer.py:1598 +msgid "Show summary" +msgstr "Exibir sumário" + +#: guiminer.py:1598 +msgid "Show summary of all miners" +msgstr "Exibir sumário de todos os mineradores" + +#: guiminer.py:1599 +msgid "Show console" +msgstr "Exibir console" + +#: guiminer.py:1599 +msgid "Show console logs" +msgstr "Exibir registros do console" + +#: guiminer.py:1600 +msgid "&View" +msgstr "&Visualizar" + +#: guiminer.py:1604 +msgid "&Create solo password..." +msgstr "&Criar usuário/senha..." + +#: guiminer.py:1604 +msgid "Configure a user/pass for solo mining" +msgstr "Configurar um usuário/senha para mineração em modo 'solo'" + +#: guiminer.py:1605 +msgid "&Set Bitcoin client path..." +msgstr "&Configurar diretório do cliente Bitcoin..." + +#: guiminer.py:1605 +msgid "Set the location of the official Bitcoin client" +msgstr "Configurar o local do cliente official de Bitcoin." + +#: guiminer.py:1606 +msgid "&Launch Bitcoin client as server" +msgstr "&Executar o client Bitcoin como servidor" + +#: guiminer.py:1606 +msgid "Launch the official Bitcoin client as a server for solo mining" +msgstr "Executar o client Bitcoin como servidor para mineração em modo 'solo'" + +#: guiminer.py:1607 +msgid "&Solo utilities" +msgstr "&Utilidades do Modo Solo" + +#: guiminer.py:1611 +msgid "Start &minimized" +msgstr "Iniciar &minimizado" + +#: guiminer.py:1611 +msgid "Start the GUI minimized to the tray." +msgstr "Iniciar a interface minimizada na bandeja." + +#: guiminer.py:1613 +msgid "&Options" +msgstr "&Opções" + +#: guiminer.py:1617 +msgid "&Change language..." +msgstr "Modifi&car idioma..." + +#: guiminer.py:1618 +msgid "Language" +msgstr "Idioma" + +#: guiminer.py:1622 +msgid "&Donate 99 cents..." +msgstr "&Doar 99 centavos..." + +#: guiminer.py:1622 +msgid "Donate $0.99 USD worth of Bitcoins to support GUIMiner development" +msgstr "Doar $0.99 USD de Bitcoins para apoiar o desenvolvimento do GUIMiner" + +#: guiminer.py:1623 +msgid "&Donate" +msgstr "&Doações" + +#: guiminer.py:1626 +msgid "&About..." +msgstr "&Sobre" + +#: guiminer.py:1628 +msgid "&Help" +msgstr "&Ajuda" + +#: guiminer.py:1640 +msgid "Failed to load taskbar icon; continuing." +msgstr "Erro ao carregar o ícone na barra de ferramentas; continuando." + +#: guiminer.py:1649 +msgid "OpenCL not found - can't add a OpenCL miner" +msgstr "OpenCL não encontrado - não é possível adicionar um minerador OpenCL" + +#: guiminer.py:1686 +#, python-format +msgid "GUIMiner - v%s" +msgstr "GUIMiner - v%s" + +#: guiminer.py:1728 +msgid "Name this miner:" +msgstr "Nome deste minerador:" + +#: guiminer.py:1728 +msgid "New miner" +msgstr "Novo minerador" + +#: guiminer.py:1731 +msgid "Untitled" +msgstr "Sem nome" + +#: guiminer.py:1742 +msgid "External miner (*.exe)|*.exe|(*.py)|*.py" +msgstr "Minerador externo (*.exe)|*.exe|(*.py)|*.py" + +#: guiminer.py:1744 +msgid "Select external miner:" +msgstr "Selecionar um minerador externo:" + +#: guiminer.py:1754 +#, python-format +msgid "Unsupported external miner %(filename)s. Supported are: %(supported)s" +msgstr "Minerador externo %(filename)s não é compatível. Modelos compatíveis: %(supported)" + +#: guiminer.py:1756 +msgid "Miner not supported" +msgstr "Mineirador não compatível" + +#: guiminer.py:1797 +msgid "Do you want to save changes?" +msgstr "Salvar todas as mudanças?" + +#: guiminer.py:1797 +msgid "Save" +msgstr "Salvar" + +#: guiminer.py:1827 +msgid "Saving: " +msgstr "Salvando: " + +#: guiminer.py:1833 +#, python-format +msgid "" +"Couldn't write save file %s.\n" +"Check the location is writable." +msgstr "" +"Não foi possível salvar o arquivo %s.\n" +"Verifique se a localização permite escritura no arquivo." + +#: guiminer.py:1834 +msgid "Save unsuccessful" +msgstr "Erro ao salvar" + +#: guiminer.py:1836 +#, python-format +msgid "Profiles saved OK to %s." +msgstr "Perfis salvos em %s." + +#: guiminer.py:1837 +msgid "Save successful" +msgstr "Salvo com sucesso" + +#: guiminer.py:1849 +#, python-format +msgid "Loaded: %s" +msgstr "Carregado: %s" + +#: guiminer.py:1863 +msgid "Loading profiles will stop any currently running miners. Continue?" +msgstr "Carregar os perfis parará todos os mineradores. Prosseguir?" + +#: guiminer.py:1864 +msgid "Load profile" +msgstr "Carregar perfil" + +#: guiminer.py:1893 +msgid "Select path to Bitcoin.exe" +msgstr "Selecionar caminho para Bitcoin.exe" + +#: guiminer.py:1905 +msgid "About" +msgstr "Sobre" + +#: guiminer.py:1931 +msgid "Closing this miner will stop it. Continue?" +msgstr "Fechar este minerador fará pará-lo. Prosseguir?" + +#: guiminer.py:1932 +msgid "Close miner" +msgstr "Fechar minerador" + +#: guiminer.py:1961 +#, python-format +msgid "Couldn't find Bitcoin at %s. Is your path set correctly?" +msgstr "Não foi possível encontrar Bitcoin em %s. O caminho está correto?" + +#: guiminer.py:1962 +msgid "Launch failed" +msgstr "Falha ao iniciar" + +#: guiminer.py:1965 +msgid "" +"The Bitcoin client will now launch in server mode.\n" +"Once it connects to the network and downloads the block chain, you can start " +"a miner in 'solo' mode." +msgstr "" +"O client Bitcoin irá agora inicar em modo servidor.\n" +"Uma vez que conectada a rede e descarregada a cadeia de blocos, você pode iniciar " +"um minerado no modo 'solo'." + +#: guiminer.py:1966 +msgid "Launched ok." +msgstr "Executado com sucesso." + +#: guiminer.py:1981 +#, python-format +msgid "%s already exists. Overwrite?" +msgstr "%s já existe. Sobrescrever?" + +#: guiminer.py:1982 +msgid "bitcoin.conf already exists." +msgstr "bitcoin.conf já existe." + +#: guiminer.py:1987 +msgid "Enter password" +msgstr "Introduza a senha" + +#: guiminer.py:1997 +msgid "Success" +msgstr "Sucesso" + +#: guiminer.py:1997 +msgid "Wrote bitcoin config ok." +msgstr "bitcoin.conf escrito corretamente." + +#: guiminer.py:2008 +msgid "Console" +msgstr "Console" + +#: guiminer.py:2020 +msgid "Summary" +msgstr "Sumário" + +#: guiminer.py:2033 +msgid "Rename miner" +msgstr "Renomear minerador" + +#: guiminer.py:2033 +msgid "Rename to:" +msgstr "Renomear para:" + +#: guiminer.py:2038 +msgid "Change language" +msgstr "Moidificar idioma" + +#: guiminer.py:2058 +msgid "Choose language (requires restart to take full effect)" +msgstr "Escolher idioma (é necessário reiniciar para que as ações tomem efeito)" + +#: guiminer.py:2103 +msgid "" +"Click the link below to log in to the pool and get a special token.\n" +"This token lets you securely check your balance.\n" +"To remember this token for the future, save your miner settings." +msgstr "" +"Clique no link abaixo para logar no pool e receber seu token especial.\n" +"Este token permite checar seu saldo de maneira segura.\n" +"Para lembrar este token para depois, salve as configurações de seu minerador." + +#: guiminer.py:2112 +msgid "(Paste token here)" +msgstr "(Colar autenticação/token aqui)" + +#: guiminer.py:2138 +msgid "Copy address to clipboard" +msgstr "Copiar endereço para área de transferência" + +#: guiminer.py:2157 +msgid "No OpenCL devices found." +msgstr "Não foram encontrados dispositivos OpenCL." + +#: guiminer.py:2160 +msgid "" +"No OpenCL devices were found.\n" +" If you only want to mine using CPU or CUDA, you can ignore this message.\n" +" If you want to mine on ATI graphics cards, you may need to install the ATI " +"Stream\n" +" SDK, or your GPU may not support OpenCL." +msgstr "" +"Não foram encontrados dispositivos OpenCL.\n" +" Se você deseja minerar usando CPU ou CUDA, você pode ignorar esta mensagem.\n" +" Se você deseja minerar usando placa gráfica AMD, você deve instalar o ATI " +"Stream\n" +" SDK, ou sua GPU provavelmente não irá suportar OpenCL." + +#: guiminer.py:2170 +msgid "Don't show this message again" +msgstr "Não mostrar esta mensagem novamente" \ No newline at end of file From 0b0c3447ef5556ebebe211f50e1b9a546032ff50 Mon Sep 17 00:00:00 2001 From: Chris MacLeod Date: Mon, 3 Dec 2012 18:39:50 -0400 Subject: [PATCH 182/190] Version bump. Tweak PT translation. --- guiminer.py | 2 +- guiminer_pt.po | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/guiminer.py b/guiminer.py index a59342a..d06c8a0 100644 --- a/guiminer.py +++ b/guiminer.py @@ -25,7 +25,7 @@ from wx.lib.agw import hyperlink from wx.lib.newevent import NewEvent -__version__ = '2012-11-18' +__version__ = '2012-12-03' def get_module_path(): """Return the folder containing this script (or its .exe).""" diff --git a/guiminer_pt.po b/guiminer_pt.po index 6112646..37ad410 100644 --- a/guiminer_pt.po +++ b/guiminer_pt.po @@ -352,8 +352,7 @@ msgstr "Retirada de Saldo OK" #: guiminer.py:1486 msgid "No registration is required - just enter an address and press Start." -msgstr "" -msgid "Registrar-se não é obrigatório - apenas entre com um endereço e pressione Iniciar." +msgstr "Registrar-se não é obrigatório - apenas entre com um endereço e pressione Iniciar." #: guiminer.py:1488 msgid "Address:" From e9dea49d8fa6bb23100ceb11b453b60adbbcfb61 Mon Sep 17 00:00:00 2001 From: Andrej Date: Fri, 4 Jan 2013 02:29:11 +0100 Subject: [PATCH 183/190] add 50btc.com server --- servers.ini | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/servers.ini b/servers.ini index ec188e2..ee72a95 100644 --- a/servers.ini +++ b/servers.ini @@ -38,6 +38,16 @@ "port": 8332, "url": "http://deepbit.net" }, + + { + "balance_host": "50btc.com", + "balance_token_url": "https://50btc.com/account/api", + "balance_url": "/api/%s", + "host": "pool.50btc.com", + "name": "50btc.com", + "port": 8332, + "url": "https://50btc.com" + }, { "balance_host": "www.btcguild.com", "balance_token_url": "http://www.btcguild.com/my_api.php", From 5f9479e77722b412b635a5207eb2e00514239ed3 Mon Sep 17 00:00:00 2001 From: backburn Date: Fri, 15 Mar 2013 19:45:04 -0700 Subject: [PATCH 184/190] Replaced errant tabs, updated BitClockers servers. --- servers.ini | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/servers.ini b/servers.ini index ee72a95..74d83ce 100644 --- a/servers.ini +++ b/servers.ini @@ -20,10 +20,10 @@ }, { - "balance_host": "www.bitcoin-server.de", - "balance_token_url": "http://www.bitcoin-server.de/my_api.php", - "balance_url": "/api.php?api_key=%s", - "host": "bitcoin-server.de", + "balance_host": "www.bitcoin-server.de", + "balance_token_url": "http://www.bitcoin-server.de/my_api.php", + "balance_url": "/api.php?api_key=%s", + "host": "bitcoin-server.de", "name": "Bitcoin-Server.de", "url": "http://www.bitcoin-server.de", "port": 8347 @@ -130,8 +130,26 @@ "balance_token_url": "http://bitclockers.com/dashboard/", "balance_url": "/api/%s/", "host": "pool.bitclockers.com", - "name": "BitClockers", - "port": 8332, + "name": "BitClockers (Denver, US)", + "port": 2082, + "url": "http://bitclockers.com" + }, + { + "balance_host": "bitclockers.com", + "balance_token_url": "https://bitclockers.com/dashboard/", + "balance_url": "/api/%s/", + "host": "pool2.bitclockers.com", + "name": "BitClockers (Chicago, US)", + "port": 2082, + "url": "http://bitclockers.com" + }, + { + "balance_host": "bitclockers.com", + "balance_token_url": "https://bitclockers.com/dashboard/", + "balance_url": "/api/%s/", + "host": "pool3.bitclockers.com", + "name": "BitClockers (Zlin, EU)", + "port": 2082, "url": "http://bitclockers.com" }, { @@ -141,10 +159,10 @@ "url": "http://www.bitlc.net" }, { - "balance_host": "www.btcmp.com", - "balance_token_url": "http://www.btcmp.com/", - "balance_url": "/api_get_stats?key=%s", - "payout_url": "/api_payout?key=%s", + "balance_host": "www.btcmp.com", + "balance_token_url": "http://www.btcmp.com/", + "balance_url": "/api_get_stats?key=%s", + "payout_url": "/api_payout?key=%s", "host": "rr.btcmp.com", "name": "BTCMP", "port": 8332, From 970ac880d7497353f6ab12e9a1c05b0d655ca320 Mon Sep 17 00:00:00 2001 From: ABrambleNinja Date: Wed, 3 Apr 2013 18:08:13 -0700 Subject: [PATCH 185/190] Rename README.txt to README.md --- README.txt => README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename README.txt => README.md (99%) diff --git a/README.txt b/README.md similarity index 99% rename from README.txt rename to README.md index 5d16c43..d2c23f2 100644 --- a/README.txt +++ b/README.md @@ -173,4 +173,4 @@ Bug Reporting This is very early software, so any bug reports are appreciated. Issues and forks can be created at: - https://github.com/Kiv/poclbm \ No newline at end of file + https://github.com/Kiv/poclbm From 2c700e131aeaa1ceec5e7ecd82a755536c621b98 Mon Sep 17 00:00:00 2001 From: Benedikt Bauer Date: Fri, 5 Apr 2013 06:40:21 +0300 Subject: [PATCH 186/190] Fix Regexp for cgminer Was (2 spaces REQUIRED after the number of Mh/s, really?) (r"\(\d+s\):(\d+)\.?(\d*) .* Mh/s", lambda match: Is now (surplus spaces removed, extra text between number and unit might be an error that should be mentioned in the Console): (r"\(avg\):(\d+)\.?(\d*)Mh/s", lambda match: --- guiminer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index a59342a..f10debf 100644 --- a/guiminer.py +++ b/guiminer.py @@ -511,7 +511,7 @@ class CgListenerThread(MinerListenerThread): lambda _: UpdateAcceptedEvent(accepted=True)), (r"Rejected .* GPU \d+ thread \d+", lambda _: UpdateAcceptedEvent(accepted=False)), - (r"\(\d+s\):(\d+)\.?(\d*) .* Mh/s", lambda match: + (r"\(avg\):(\d+)\.?(\d*)Mh/s", lambda match: UpdateHashRateEvent(rate=float(match.group(1) + '.' + match.group(2)) * 1000)), (r"^GPU\s*\d+", lambda _: None), # Just ignore lines like these From 1760653e1462b4fa3a1d4185bc09b6068275b345 Mon Sep 17 00:00:00 2001 From: jasonic8 Date: Thu, 11 Apr 2013 01:22:13 +0200 Subject: [PATCH 187/190] Update guiminer.py launch_solo_server - changed datadir to wrap quotes around the path so that user names with spaces will still launch the executable with a valid data directory --- guiminer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guiminer.py b/guiminer.py index f10debf..b4a5879 100644 --- a/guiminer.py +++ b/guiminer.py @@ -2210,7 +2210,7 @@ def launch_solo_server(self, event): This allows poclbm to connect to it for mining solo. """ if self.blockchain_directory and os.path.exists(self.blockchain_directory): - datadir = " -datadir=%s" % self.blockchain_directory + datadir = " -datadir=\"%s\"" % self.blockchain_directory else: datadir = "" try: From 33145db4c60be6498b2bf05327e830e7bb898809 Mon Sep 17 00:00:00 2001 From: Kiv Date: Mon, 15 Apr 2013 17:23:10 -0300 Subject: [PATCH 188/190] Update servers.ini --- servers.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/servers.ini b/servers.ini index 74d83ce..16e5544 100644 --- a/servers.ini +++ b/servers.ini @@ -231,7 +231,7 @@ "balance_url": "/api.key?key=%s&action=getbalance", "host": "us.eclipsemc.com", "name": "Eclipse US", - "port": 8337, + "port": 3333, "url": "https://eclipsemc.com" }, { @@ -240,7 +240,7 @@ "balance_url": "/api.key?key=%s&action=getbalance", "host": "eu.eclipsemc.com", "name": "Eclipse EU", - "port": 8337, + "port": 3333, "url": "https://eclipsemc.com" }, { @@ -249,7 +249,7 @@ "balance_url": "/api.key?key=%s&action=getbalance", "host": "pacrim.eclipsemc.com", "name": "Eclipse AU / Asia", - "port": 8337, + "port": 3333, "url": "https://eclipsemc.com" }, { From ac417c9c8f53a61f300990aeee2a0c350514f2a4 Mon Sep 17 00:00:00 2001 From: mroswald Date: Sun, 24 Nov 2013 14:32:12 +0100 Subject: [PATCH 189/190] fix typo typo --- guiminer_de.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guiminer_de.po b/guiminer_de.po index 8e762ab..c4db417 100644 --- a/guiminer_de.po +++ b/guiminer_de.po @@ -42,7 +42,7 @@ msgstr "" " https://github.com/Kiv/poclbm\n" "\n" "Sollte dir die Software gefallen, unterstütze die\n" -"Weiternticklung durch eine freiwillige Spende an:\n" +"Weiterentwicklung durch eine freiwillige Spende an:\n" "\n" "%(address)s\n" "\n" @@ -462,7 +462,7 @@ msgstr "Deine Einstellungen speichern" #: guiminer.py:1592 msgid "&Load settings" -msgstr "Einstallungen &laden" +msgstr "Einstellungen &laden" #: guiminer.py:1592 msgid "Load stored settings" From a6f6eb43a4fdc48dedce92bee21f4c33cc3f29d8 Mon Sep 17 00:00:00 2001 From: Sandro Amaral Date: Sun, 19 Jan 2014 01:16:21 +0000 Subject: [PATCH 190/190] Minor change to entry on guiminer_pt.po file --- guiminer_pt.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/guiminer_pt.po b/guiminer_pt.po index 37ad410..2ec3a55 100644 --- a/guiminer_pt.po +++ b/guiminer_pt.po @@ -138,7 +138,7 @@ msgstr "Velocidade" #: guiminer.py:306 msgid "Accepted" -msgstr "Aceptado" +msgstr "Aceite" #: guiminer.py:307 msgid "Stale" @@ -205,7 +205,7 @@ msgstr "Dispositivo:" #: guiminer.py:534 msgid "No OpenCL devices" -msgstr "No há dispositivos OpenCL" +msgstr "Não há dispositivos OpenCL" #: guiminer.py:535 msgid "Extra flags:" @@ -769,4 +769,4 @@ msgstr "" #: guiminer.py:2170 msgid "Don't show this message again" -msgstr "Não mostrar esta mensagem novamente" \ No newline at end of file +msgstr "Não mostrar esta mensagem novamente"