Codebase list sugar-log-activity / 2599ab4
New upstream version 39 Jonas Smedegaard 5 years ago
14 changed file(s) with 639 addition(s) and 262 deletion(s). Raw diff Collapse all Expand all
0 [flake8]
1
2 # E402 module level import not at top of file
3 # gi.require_version() is required before later imports
4
5 ignore = E402
0 39
1
2 * New translations (Yaron, Božidar Putanec, nabil509, Mariana, Berend
3 and Paulo Francisco),
4
5 * Fix several flake8 errors and warnings (James Cameron),
6 * Add README (Rudra Sadhu),
7 * Add .gitignore (Vipul Gupta)
8 * Update metadata (Vipul Gupta)
9 * Port from GObject to GLib (James Cameron),
10 * Update POT file - line numbers only (James Cameron),
11
012 38
113
214 * New translations (Chris Leonard et al),
0 What is this?
1 =============
2
3 The Log Activity allows you to troubleshoot problems with your computer. You can view the log files of Sugar and your Activities.
4
5 How to use?
6 ===========
7
8 Log is part of the Sugar desktop. Please refer to;
9
10 * [How to Get Sugar on sugarlabs.org](https://sugarlabs.org/),
11 * [How to use Sugar](https://help.sugarlabs.org/),
12 * [How to use Log](https://help.sugarlabs.org/log.html)
00 [Activity]
11 name = Log
2 activity_version = 38
2 activity_version = 39
33 bundle_id = org.laptop.Log
44 exec = sugar-activity logviewer.LogActivity -s
55 icon = activity-log
6 license = GPLv2+
6 license = MIT;GPLv2+
77 summary = This is an activity designed for anyone who wants to troubleshoot a complicated program on the computer.
8 categories = system programming
8 tags = System;Programming
9 url = https://help.sugarlabs.org/en/log.html
10 github = https://github.com/sugarlabs/log-activity
0 # Copyright (C) 2007, Pascal Scheffers <pascal@scheffers.net>
0 # Copyright (C) 2007, Pascal Scheffers <pascal@scheffers.net>
11 #
22 # Permission is hereby granted, free of charge, to any person
33 # obtaining a copy of this software and associated documentation
3232 # ** ...
3333 # * Installed packages list
3434 # * All relevant log files (all of them, at first)
35 #
35 #
3636 # The report is output as a tarfile
3737 #
3838 # This file has two modes:
7777 return '#/etc/issue not found'
7878
7979 # Needed, because we want to default to the first non blank line:
80 first_line = ''
80 first_line = ''
8181
8282 for line in self.__read_file('/etc/issue').splitlines():
8383 if line.lower().find('olpc build') > -1:
84 return line
84 return line
8585 if first_line == '':
86 first_line=line
86 first_line = line
8787
8888 return first_line
8989
9090 def uptime(self):
9191 for line in self.__read_file('/proc/uptime').splitlines():
9292 if line != '':
93 return line
93 return line
9494 return ''
9595
9696 def loadavg(self):
9797 for line in self.__read_file('/proc/loadavg').splitlines():
9898 if line != '':
99 return line
99 return line
100100 return ''
101101
102102 def kernel_version(self):
103103 for line in self.__read_file('/proc/version').splitlines():
104104 if line != '':
105 return line
105 return line
106106 return ''
107107
108108 def memfree(self):
113113 return line[8:].strip()
114114
115115 def _trim_null(self, v):
116 if v != '' and ord(v[len(v)-1]) == 0:
117 v = v[:len(v)-1]
116 if v != '' and ord(v[len(v) - 1]) == 0:
117 v = v[:len(v) - 1]
118118 return v
119119
120120 def _mfg_data(self, item):
125125 if os.path.exists(test_path + item):
126126 mfg_path = test_path + item
127127 break
128 if mfg_path == None:
128 if mfg_path is None:
129129 return ''
130130
131131 v = self._trim_null(self.__read_file(mfg_path))
141141 s = self._mfg_data('SG')[0:1]
142142 if s == '':
143143 return ''
144
144
145145 return '%02X' % ord(self._mfg_data('SG')[0:1])
146
147146
148147 def laptop_uuid(self):
149148 return self._mfg_data('U#')
186185
187186 def laptop_localization(self):
188187 return self._mfg_data('LO')
189
188
190189 def _battery_info(self, item):
191 """ from /sys/class/power-supply/olpc-battery/ """
192190 root = '/sys/class/power_supply/olpc-battery/'
193 if not os.path.exists(root+item):
191 if not os.path.exists(root + item):
194192 return ''
195
196 return self.__read_file(root+item).strip()
193
194 return self.__read_file(root + item).strip()
197195
198196 def battery_serial_number(self):
199197 return self._battery_info('serial_number')
200
198
201199 def battery_capacity(self):
202200 return self._battery_info('capacity') + ' ' + \
203 self._battery_info('capacity_level')
201 self._battery_info('capacity_level')
204202
205203 def battery_info(self):
206 #Should be just:
207 #return self._battery_info('uevent')
208
209 #But because of a bug in the kernel, that has trash, lets filter:
210 bi = ''
204 # Should be just:
205 # return self._battery_info('uevent')
206 # But because of a bug in the kernel, that has trash, lets filter:
207 bi = ''
211208 for line in self._battery_info('uevent').splitlines():
212209 if line.startswith('POWER_'):
213210 bi += line + '\n'
214
211
215212 return bi
216
213
217214 def disksize(self, path):
218215 return os.statvfs(path).f_bsize * os.statvfs(path).f_blocks
219
216
220217 def diskfree(self, path):
221218 return os.statvfs(path).f_bsize * os.statvfs(path).f_bavail
222
219
223220 def _read_popen(self, cmd):
224221 p = os.popen(cmd)
225222 s = ''
226223 try:
227224 for line in p:
228 s += line
225 s += line
229226 finally:
230 p.close()
231
227 p.close()
228
232229 return s
233
234 def ifconfig(self):
230
231 def ifconfig(self):
235232 return self._read_popen('/sbin/ifconfig')
236
237 def route_n(self):
233
234 def route_n(self):
238235 return self._read_popen('/sbin/route -n')
239
236
240237 def df_a(self):
241238 return self._read_popen('/bin/df -a')
242
239
243240 def ps_auxfwww(self):
244241 return self._read_popen('/bin/ps auxfwww')
245
242
246243 def usr_bin_free(self):
247244 return self._read_popen('/usr/bin/free')
248245
249246 def top(self):
250247 return self._read_popen('/usr/bin/top -bn2')
251
252 def installed_activities(self):
253 s = ''
248
249 def installed_activities(self):
250 s = ''
254251 for path in glob.glob('/usr/share/sugar/activities/*.activity'):
255252 s += os.path.basename(path) + '\n'
256253
257254 home = os.path.expanduser('~')
258255 for path in glob.glob(os.path.join(home, 'Activities', '*')):
259256 s += '~' + os.path.basename(path) + '\n'
260
257
261258 return s
262
263
259
264260
265261 class LogCollect:
266262 """Collect XO logfiles and machine metadata for reporting to OLPC
270266 self._mp = MachineProperties()
271267
272268 def write_logs(self, archive='', logbytes=15360):
273 """Write a zipfile containing the tails of the logfiles and machine info of the XO
274
269 """Write a zipfile containing the tails of the logfiles and
270 machine info of the XO
271
275272 Arguments:
276273 archive - Specifies the location where to store the data
277274 defaults to /dev/shm/logs-<xo-serial>.zip
278
275
279276 logbytes - Maximum number of bytes to read from each log file.
280277 0 means complete logfiles, not just the tail
281278 -1 means only save machine info, no logs
282279 """
283 #This function is crammed with try...except to make sure we get as much
284 #data as possible, if anything fails.
285
286 if archive=='':
280 # This function is crammed with try...except to make sure we
281 # get as much data as possible, if anything fails.
282
283 if archive == '':
287284 archive = '/dev/shm/logs.zip'
288285 try:
289 #With serial number is more convenient, but might fail for some
290 #Unknown reason...
291 archive = '/dev/shm/logs-%s.zip' % self._mp.laptop_serial_number()
286 # With serial number is more convenient, but might
287 # fail for some reason...
288 archive = '/dev/shm/logs-%s.zip' % \
289 self._mp.laptop_serial_number()
292290 except Exception:
293291 pass
294
292
295293 z = zipfile.ZipFile(archive, 'w', zipfile.ZIP_DEFLATED)
296
297 try:
298 try:
294
295 try:
296 try:
299297 z.writestr('info.txt', self.laptop_info())
300298 except Exception, e:
301299 z.writestr('info.txt',
302300 "logcollect: could not add info.txt: %s" % e)
303
304 if logbytes > -1:
301
302 if logbytes > -1:
305303 # Include some log files from /var/log.
306 for fn in ['dmesg', 'messages', 'cron', 'maillog','rpmpkgs',
304 for fn in ['dmesg', 'messages', 'cron', 'maillog', 'rpmpkgs',
307305 'Xorg.0.log', 'spooler']:
308306 try:
309 if os.access('/var/log/'+fn, os.F_OK):
307 if os.access('/var/log/' + fn, os.F_OK):
310308 if logbytes == 0:
311 z.write('/var/log/'+fn, 'var-log/'+fn)
309 z.write('/var/log/' + fn, 'var-log/' + fn)
312310 else:
313 z.writestr('var-log/'+fn,
314 self.file_tail('/var/log/'+fn, logbytes))
311 z.writestr('var-log/' + fn,
312 self.file_tail('/var/log/' + fn,
313 logbytes))
315314 except Exception, e:
316 z.writestr('var-log/'+fn,
317 "logcollect: could not add %s: %s" % (fn, e))
315 z.writestr('var-log/' + fn,
316 "logcollect: could not add %s: %s" %
317 (fn, e))
318318
319319 home = os.path.expanduser('~')
320320 here = os.path.join(home, '.sugar/default/logs/*.log')
330330 self.file_tail(path, logbytes))
331331 except Exception, e:
332332 z.writestr(name,
333 "logcollect: could not add %s: %s" % (name, e))
333 "logcollect: could not add %s: %s" %
334 (name, e))
334335 here = os.path.join(home, '.sugar/default/logs/*/*.log')
335336 for path in glob.glob(here):
336337 if os.access(path, os.F_OK):
345346 self.file_tail(path, logbytes))
346347 except Exception, e:
347348 z.writestr(name,
348 "logcollect: could not add %s: %s" % (name, e))
349 try:
349 "logcollect: could not add %s: %s" %
350 (name, e))
351 try:
350352 z.write('/etc/resolv.conf')
351353 except Exception, e:
352354 z.writestr('/etc/resolv.conf',
353355 "logcollect: could not add resolv.conf: %s" % e)
354
356
355357 except Exception, e:
356 print 'While creating zip archive: %s' % e
357
358 z.close()
359
358 print 'While creating zip archive: %s' % e
359
360 z.close()
361
360362 return archive
361363
362364 def file_tail(self, filename, tailbytes):
363365 """Read the tail (end) of the file
364
366
365367 Arguments:
366368 filename The name of the file to read
367369 tailbytes Number of bytes to include or 0 for entire file
372374 f = open(filename)
373375 try:
374376 fsize = os.stat(filename).st_size
375
377
376378 if tailbytes > 0 and fsize > tailbytes:
377379 f.seek(-tailbytes, 2)
378
380
379381 data = f.read()
380382 finally:
381383 f.close()
382384
383 return data
384
385 return data
385386
386387 def make_report(self, target='stdout'):
387388 """Create the report
388389
389390 Arguments:
390 target - where to save the logs, a path or stdout
391 target - where to save the logs, a path or stdout
391392
392393 """
393394
394395 li = self.laptop_info()
395396 for k, v in li.iteritems():
396 print k + ': ' +v
397
397 print k + ': ' + v
398
398399 print self._mp.battery_info()
399400
400401 def laptop_info(self):
401 """Return a string with laptop serial, battery type, build, memory info, etc."""
402
403 s = ''
402 """Return a string with laptop serial, battery type, build,
403 memory info, etc."""
404
405 s = ''
404406 try:
405407 # Do not include UUID!
406408 s += 'laptop-info-version: 1.0\n'
407409 s += 'clock: %f\n' % time.clock()
408410 s += 'date: %s\n' % time.strftime("%a, %d %b %Y %H:%M:%S +0000",
409 time.gmtime())
411 time.gmtime())
410412 s += 'memfree: %s\n' % self._mp.memfree()
411 s += 'disksize: %s MB\n' % ( self._mp.disksize('/') / (1024*1024) )
412 s += 'diskfree: %s MB\n' % ( self._mp.diskfree('/') / (1024*1024) )
413 s += 'disksize: %s MB\n' % (self._mp.disksize('/') / (1024 * 1024))
414 s += 'diskfree: %s MB\n' % (self._mp.diskfree('/') / (1024 * 1024))
413415 s += 'olpc_build: %s\n' % self._mp.olpc_build()
414416 s += 'kernel_version: %s\n' % self._mp.kernel_version()
415417 s += 'uptime: %s\n' % self._mp.uptime()
416 s += 'loadavg: %s\n' % self._mp.loadavg()
418 s += 'loadavg: %s\n' % self._mp.loadavg()
417419 s += 'serial-number: %s\n' % self._mp.laptop_serial_number()
418 s += 'motherboard-number: %s\n' % self._mp.laptop_motherboard_number()
419 s += 'board-revision: %s\n' % self._mp.laptop_board_revision()
420 s += 'keyboard: %s\n' % self._mp.laptop_keyboard()
421 s += 'wireless_mac: %s\n' % self._mp.laptop_wireless_mac()
422 s += 'firmware: %s\n' % self._mp.laptop_bios_version()
420 s += 'motherboard-number: %s\n' % \
421 self._mp.laptop_motherboard_number()
422 s += 'board-revision: %s\n' % self._mp.laptop_board_revision()
423 s += 'keyboard: %s\n' % self._mp.laptop_keyboard()
424 s += 'wireless_mac: %s\n' % self._mp.laptop_wireless_mac()
425 s += 'firmware: %s\n' % self._mp.laptop_bios_version()
423426 s += 'country: %s\n' % self._mp.laptop_country()
424427 s += 'localization: %s\n' % self._mp.laptop_localization()
425
428
426429 s += self._mp.battery_info()
427
430
428431 s += "\n[/sbin/ifconfig]\n%s\n" % self._mp.ifconfig()
429432 s += "\n[/sbin/route -n]\n%s\n" % self._mp.route_n()
430
431 s += '\n[Installed Activities]\n%s\n' % self._mp.installed_activities()
432
433
434 s += '\n[Installed Activities]\n%s\n' % \
435 self._mp.installed_activities()
436
433437 s += '\n[df -a]\n%s\n' % self._mp.df_a()
434438 s += '\n[ps auxwww]\n%s\n' % self._mp.ps_auxfwww()
435439 s += '\n[free]\n%s\n' % self._mp.usr_bin_free()
436440 s += '\n[top -bn2]\n%s\n' % self._mp.top()
437441 except Exception, e:
438442 s += '\nException while building info:\n%s\n' % e
439
443
440444 return s
441445
446
442447 class LogSend:
443
448
444449 # post_multipart and encode_multipart_formdata have been taken from
445450 # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/146306
446451 def post_multipart(self, host, selector, fields, files):
447452 """
448453 Post fields and files to an http host as multipart/form-data.
449 fields is a sequence of (name, value) elements for regular form fields.
450 files is a sequence of (name, filename, value) elements for data to be uploaded as files
451 Return the server's response page.
454 fields is a sequence of (name, value) elements for regular
455 form fields. files is a sequence of (name, filename, value)
456 elements for data to be uploaded as files Return the server's
457 response page.
452458 """
453459 content_type, body = self.encode_multipart_formdata(fields, files)
454460 h = httplib.HTTP(host)
460466 h.send(body)
461467 errcode, errmsg, headers = h.getreply()
462468 return h.file.read()
463
469
464470 def encode_multipart_formdata(self, fields, files):
465471 """
466 fields is a sequence of (name, value) elements for regular form fields.
467 files is a sequence of (name, filename, value) elements for data to be uploaded as files
468 Return (content_type, body) ready for httplib.HTTP instance
472 fields is a sequence of (name, value) elements for regular
473 form fields. files is a sequence of (name, filename, value)
474 elements for data to be uploaded as files Return
475 (content_type, body) ready for httplib.HTTP instance
469476 """
470477 BOUNDARY = '----------ThIs_Is_tHe_bouNdaRY_$'
471478 CRLF = '\r\n'
477484 L.append(value)
478485 for (key, filename, value) in files:
479486 L.append('--' + BOUNDARY)
480 L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, filename))
487 L.append('Content-Disposition: form-data; '
488 'name="%s"; filename="%s"' % (key, filename))
481489 L.append('Content-Type: %s' % self.get_content_type(filename))
482490 L.append('')
483491 L.append(value)
486494 body = CRLF.join(L)
487495 content_type = 'multipart/form-data; boundary=%s' % BOUNDARY
488496 return content_type, body
489
497
490498 def read_file(self, filename):
491499 """Read the entire contents of a file and return it as a string"""
492500
502510
503511 def get_content_type(self, filename):
504512 return mimetypes.guess_type(filename)[0] or 'application/octet-stream'
505
513
506514 def http_post_logs(self, url, archive):
507 #host, selector, fields, files
515 # host, selector, fields, files
508516 files = ('logs', os.path.basename(archive), self.read_file(archive)),
509
517
510518 # Client= olpc will make the server return just "OK" or "FAIL"
511519 fields = ('client', 'xo'),
512520 urlparts = urlparse.urlsplit(url)
517525
518526
519527 # This script is dual-mode, it can be used as a command line tool and as
520 # a library.
528 # a library.
521529 if sys.argv[0].endswith('logcollect.py') or \
522530 sys.argv[0].endswith('logcollect'):
523531 print 'log-collect utility 1.0'
524
532
525533 lc = LogCollect()
526534 ls = LogSend()
527535
528536 logs = ''
529537 mode = 'http'
530
531 if len(sys.argv)==1:
538
539 if len(sys.argv) == 1:
532540 print """logcollect.py - send your XO logs to OLPC
533
541
534542 Usage:
535543 logcollect.py http://server.name/submit.php
536544 - submit logs to a server
537
545
538546 logcollect.py file:/media/xxxx-yyyy/mylog.zip
539547 - save the zip file on a USB device or SD card
540
548
541549 logcollect.py all file:/media/xxxx-yyyy/mylog.zip
542550 - Save to zip file and include ALL logs
543551
550558 If you specify 'all' or 'none' you must specify http or file as well.
551559 """
552560 sys.exit()
553
554
555 logbytes = 15360
556 if len(sys.argv)>1:
557 mode = sys.argv[len(sys.argv)-1]
561
562 logbytes = 15360
563 if len(sys.argv) > 1:
564 mode = sys.argv[len(sys.argv) - 1]
558565 if sys.argv[1] == 'all':
559566 logbytes = 0
560567 if sys.argv[1] == 'none':
561568 logbytes = -1
562
563569
564570 if mode.startswith('file'):
565571 # file://
566572 logs = mode[5:]
567
568 #if mode.lower().startswith('http'):
569 # pass
570 #else if mode.lower().startswith('usb'):
571 # pass
572 #else if mode.lower().startswith('sd'):
573 # pass
574
573
575574 logs = lc.write_logs(logs, logbytes)
576575 print 'Logs saved in %s' % logs
577
576
578577 sent_ok = False
579 if len(sys.argv)>1:
580 mode = sys.argv[len(sys.argv)-1]
581
578 if len(sys.argv) > 1:
579 mode = sys.argv[len(sys.argv) - 1]
580
582581 if mode.startswith('http'):
583582 print "Trying to send the logs using HTTP (web)"
584583 if len(mode) == 4:
586585 sys.exit(1)
587586 else:
588587 url = mode
589
588
590589 if ls.http_post_logs(url, logs):
591590 print "Logs were sent."
592 sent_ok = True
591 sent_ok = True
593592 else:
594593 print "FAILED to send logs."
595
596594
597595 if sent_ok:
598596 os.remove(logs)
599597 print "Logs were sent, tempfile deleted."
600
601
2323
2424 import gi
2525 gi.require_version('Gtk', '3.0')
26 from gi.repository import Gtk
27 from gi.repository import Gdk
28 from gi.repository import Pango
26 from gi.repository import GLib
2927 from gi.repository import GObject
3028 from gi.repository import Gio
29 from gi.repository import Gdk
30 from gi.repository import Gtk
31 from gi.repository import Pango
3132
3233 from sugar3.activity import activity
3334 from sugar3.activity.widgets import ActivityToolbarButton
109110 self.extra_iter = self._treemodel.append(None, [_('Other'), ''])
110111
111112 self.list_scroll = Gtk.ScrolledWindow()
112 self.list_scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
113 self.list_scroll.set_policy(Gtk.PolicyType.AUTOMATIC,
114 Gtk.PolicyType.AUTOMATIC)
113115 self.list_scroll.add(self._treeview)
114116 self.list_scroll.set_size_request(Gdk.Screen.width() * 30 / 100, -1)
115117
136138 def _sort_logfile(self, treemodel, itera, iterb, user_data=None):
137139 a = treemodel.get_value(itera, 0)
138140 b = treemodel.get_value(iterb, 0)
139 if a == None or b == None:
141 if a is None or b is None:
140142 return 0
141143 a = a.lower()
142144 b = b.lower()
224226 files = os.listdir(path)
225227 except:
226228 logging.debug(
227 _("ERROR: Failed to look for files in '%(path)s'.") %
228 {'path': path})
229 _("ERROR: Failed to look for files in '%(path)s'.") %
230 {'path': path})
229231 else:
230232 for logfile in files:
231233 self._add_log_file(os.path.join(path, logfile))
245247
246248 if not os.path.exists(path):
247249 logging.debug(_("ERROR: File '%(file)s' does not exist.") %
248 {'file': path})
250 {'file': path})
249251 return False
250252
251253 if not os.access(path, os.R_OK):
252254 logging.debug(_("ERROR: Unable to read file '%(file)s'.") %
253 {'file': path})
255 {'file': path})
254256 return False
255257
256258 directory, logfile = os.path.split(path)
259261 if _dir:
260262 logfile = '%s/%s' % (_dir, logfile)
261263
262 if not logfile in self.logs or _dir:
264 if logfile not in self.logs or _dir:
263265 if not parent:
264266 parent = self.extra_iter
265267 if directory in self.path_iter:
274276 log.update()
275277 written = log._written
276278
277 if self.active_log == None:
279 if self.active_log is None:
278280 self.active_log = log
279281 self._show_log(logfile)
280282 success, log_iter = \
397399 self._written = (self._pos - init_pos)
398400 except:
399401 self.insert(self.get_end_iter(),
400 _("Error: Can't open file '%s'\n") % self.logfile)
402 _("Error: Can't open file '%s'\n") % self.logfile)
401403 self._written = 0
402404
403405
468470 self.search_entry = iconentry.IconEntry()
469471 self.search_entry.set_size_request(Gdk.Screen.width() / 3, -1)
470472 self.search_entry.set_icon_from_name(
471 iconentry.ICON_ENTRY_PRIMARY, 'entry-search')
473 iconentry.ICON_ENTRY_PRIMARY, 'entry-search')
472474 self.search_entry.add_clear_button()
473475 self.search_entry.connect('activate', self._search_entry_activate_cb)
474476 self.search_entry.connect('changed', self._search_entry_changed_cb)
528530 self._add_controls(self._toolbar)
529531
530532 for control in [self._delete_btn, self._separator, self._stop_btn]:
531 if not control in self._toolbar:
533 if control not in self._toolbar:
532534 self._toolbar.insert(control, -1)
533535
534536 def _remove_controls(self, toolbar):
540542 def _add_controls(self, toolbar):
541543 for control in [self._search_item, self._search_prev,
542544 self._search_next]:
543 if not control in toolbar:
545 if control not in toolbar:
544546 toolbar.insert(control, -1)
545547 control.show()
546548
562564
563565 def _search_entry_activate_cb(self, entry):
564566 if self._autosearch_timer:
565 GObject.source_remove(self._autosearch_timer)
567 GLib.source_remove(self._autosearch_timer)
566568 self.viewer.set_search_text(entry.props.text)
567569 self._update_search_buttons()
568570
569571 def _search_entry_changed_cb(self, entry):
570572 if self._autosearch_timer:
571 GObject.source_remove(self._autosearch_timer)
572 self._autosearch_timer = GObject.timeout_add(_AUTOSEARCH_TIMEOUT,
573 self.__autosearch_timer_cb)
574
575 def __autosearch_timer_cb(self):
573 GLib.source_remove(self._autosearch_timer)
574 self._autosearch_timer = GLib.timeout_add(_AUTOSEARCH_TIMEOUT,
575 self.__autosearch_cb)
576
577 def __autosearch_cb(self):
576578 self._autosearch_timer = None
577579 self.search_entry.activate()
578580 return False
592594 else:
593595 prev_result = self.viewer.get_next_result('backward')
594596 next_result = self.viewer.get_next_result('forward')
595 self._search_prev.props.sensitive = prev_result != None
596 self._search_next.props.sensitive = next_result != None
597 self._search_prev.props.sensitive = prev_result is not None
598 self._search_next.props.sensitive = next_result is not None
597599
598600 def _delete_log_cb(self, widget):
599601 if self.viewer.active_log:
620622
621623 self._collector = LogCollect()
622624
623 label = Gtk.Label(label=
624 _('This captures information about the system\n'\
625 'and running processes to a journal entry.\n'\
626 'Use this to improve a problem report.'))
625 trans = _('This captures information about the system\n'
626 'and running processes to a journal entry.\n'
627 'Use this to improve a problem report.')
628 label = Gtk.Label(label=trans)
627629
628630 send_button = Gtk.Button(_('Capture information'))
629631 send_button.connect('clicked', self._on_send_button_clicked_cb)
669671 'title_set_by_user': '0',
670672 'suggested_filename': filename,
671673 'mime_type': 'application/zip',
672 }
674 }
673675 for k, v in metadata.items():
674676 jobject.metadata[k] = v
675677 jobject.file_path = filepath
77 msgstr ""
88 "Project-Id-Version: PACKAGE VERSION\n"
99 "Report-Msgid-Bugs-To: \n"
10 "POT-Creation-Date: 2017-05-31 16:27+1000\n"
10 "POT-Creation-Date: 2018-09-18 18:56+1000\n"
1111 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1212 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313 "Language-Team: LANGUAGE <LL@li.org>\n"
2626 "complicated program on the computer."
2727 msgstr ""
2828
29 #: logviewer.py:95
29 #: logviewer.py:98
3030 msgid "Log Files"
3131 msgstr ""
3232
33 #: logviewer.py:108
33 #: logviewer.py:111
3434 msgid "Other"
3535 msgstr ""
3636
37 #: logviewer.py:226
37 #: logviewer.py:230
3838 #, python-format
3939 msgid "ERROR: Failed to look for files in '%(path)s'."
4040 msgstr ""
4141
42 #: logviewer.py:246
42 #: logviewer.py:250
4343 #, python-format
4444 msgid "ERROR: File '%(file)s' does not exist."
4545 msgstr ""
4646
47 #: logviewer.py:251
47 #: logviewer.py:255
4848 #, python-format
4949 msgid "ERROR: Unable to read file '%(file)s'."
5050 msgstr ""
5151
52 #: logviewer.py:399
52 #: logviewer.py:403
5353 #, python-format
5454 msgid "Error: Can't open file '%s'\n"
5555 msgstr ""
5656
57 #: logviewer.py:453
57 #: logviewer.py:457
5858 msgid "Show list of files"
5959 msgstr ""
6060
61 #: logviewer.py:463
61 #: logviewer.py:467
6262 msgid "Word Wrap"
6363 msgstr ""
6464
65 #: logviewer.py:479
65 #: logviewer.py:483
6666 msgid "Previous"
6767 msgstr ""
6868
69 #: logviewer.py:484
69 #: logviewer.py:488
7070 msgid "Next"
7171 msgstr ""
7272
73 #: logviewer.py:498
73 #: logviewer.py:502
7474 msgid "Delete Log File"
7575 msgstr ""
7676
77 #: logviewer.py:604
77 #: logviewer.py:608
7878 msgid "Error"
7979 msgstr ""
8080
81 #: logviewer.py:605
81 #: logviewer.py:609
8282 #, python-format
8383 msgid "%(error)s when deleting %(file)s"
8484 msgstr ""
8585
86 #: logviewer.py:616
86 #: logviewer.py:620
8787 msgid "Log Collector: Capture information"
8888 msgstr ""
8989
90 #: logviewer.py:623
90 #: logviewer.py:626
9191 msgid ""
9292 "This captures information about the system\n"
9393 "and running processes to a journal entry.\n"
9494 "Use this to improve a problem report."
9595 msgstr ""
9696
97 #: logviewer.py:627
97 #: logviewer.py:631
9898 msgid "Capture information"
9999 msgstr ""
100100
101 #: logviewer.py:650
101 #: logviewer.py:660
102102 msgid "Logs not captured"
103103 msgstr ""
104104
105 #: logviewer.py:651
105 #: logviewer.py:661
106106 msgid "The logs could not be captured."
107107 msgstr ""
108108
109 #: logviewer.py:661
109 #: logviewer.py:671
110110 #, python-format
111111 msgid "log-%s"
112112 msgstr ""
0 # SOME DESCRIPTIVE TITLE.
1 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
2 # This file is distributed under the same license as the PACKAGE package.
3 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
4 msgid ""
5 msgstr ""
6 "Project-Id-Version: PACKAGE VERSION\n"
7 "Report-Msgid-Bugs-To: \n"
8 "POT-Creation-Date: 2017-03-24 17:39+1100\n"
9 "PO-Revision-Date: 2018-01-06 09:33+0000\n"
10 "Last-Translator: Berend <berendy@gmail.com>\n"
11 "Language-Team: LANGUAGE <LL@li.org>\n"
12 "Language: fy\n"
13 "MIME-Version: 1.0\n"
14 "Content-Type: text/plain; charset=UTF-8\n"
15 "Content-Transfer-Encoding: 8bit\n"
16 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
17 "X-Generator: Pootle 2.5.1.1\n"
18 "X-POOTLE-MTIME: 1515231215.000000\n"
19
20 #: activity/activity.info:2
21 msgid "Log"
22 msgstr "Lochboek"
23
24 #: activity/activity.info:3
25 msgid ""
26 "This is an activity designed for anyone who wants to troubleshoot a "
27 "complicated program on the computer."
28 msgstr ""
29 "Dit is in aktiviteit foar elkenien dy flater opspoare wol yn in kompleks "
30 "programma op de kompjûter."
31
32 #: logviewer.py:95
33 msgid "Log Files"
34 msgstr "Lochboek triemmen"
35
36 #: logviewer.py:108
37 msgid "Other"
38 msgstr "Oare"
39
40 #: logviewer.py:226
41 #, python-format
42 msgid "ERROR: Failed to look for files in '%(path)s'."
43 msgstr "FLATER: Koe net sjen nei triemmen yn '%(path)s'."
44
45 #: logviewer.py:246
46 #, python-format
47 msgid "ERROR: File '%(file)s' does not exist."
48 msgstr "FLATER: Triem '%(file)s' bestiet net."
49
50 #: logviewer.py:251
51 #, python-format
52 msgid "ERROR: Unable to read file '%(file)s'."
53 msgstr "FLATER: Kin triem '%(file)s' net lêze."
54
55 #: logviewer.py:399
56 #, python-format
57 msgid "Error: Can't open file '%s'\n"
58 msgstr "FLATER: Kin triem '%s' net iepenje\n"
59
60 #: logviewer.py:453
61 msgid "Show list of files"
62 msgstr "Triemmen list sjen litte"
63
64 #: logviewer.py:463
65 msgid "Word Wrap"
66 msgstr "Wurd omslach"
67
68 #: logviewer.py:479
69 msgid "Previous"
70 msgstr "Foarige"
71
72 #: logviewer.py:484
73 msgid "Next"
74 msgstr "Folgjende"
75
76 #: logviewer.py:498
77 msgid "Delete Log File"
78 msgstr "Lochboek triem wiskje"
79
80 #: logviewer.py:604
81 msgid "Error"
82 msgstr "Flater"
83
84 #: logviewer.py:605
85 #, python-format
86 msgid "%(error)s when deleting %(file)s"
87 msgstr "%(error)s by it wiskjen fan %(files)s"
88
89 #: logviewer.py:616
90 msgid "Log Collector: Capture information"
91 msgstr "Lochboek samler: sammelet ynformaasje"
92
93 #: logviewer.py:623
94 msgid ""
95 "This captures information about the system\n"
96 "and running processes to a journal entry.\n"
97 "Use this to improve a problem report."
98 msgstr ""
99 "Dit set ynformaasje oer it systeem\n"
100 "en rinnende prosessen yn in deiboek ynfier.\n"
101 "Brûk dit om in swierrigens rapport te ferbetterjen."
102
103 #: logviewer.py:627
104 msgid "Capture information"
105 msgstr "Ynformaasje ynsette"
106
107 #: logviewer.py:650
108 msgid "Logs not captured"
109 msgstr "Ynformaasje net krigen"
110
111 #: logviewer.py:651
112 msgid "The logs could not be captured."
113 msgstr "De ynformaasje wie net te krijen."
114
115 #: logviewer.py:661
116 #, python-format
117 msgid "log-%s"
118 msgstr "Loch-%s"
66 "Project-Id-Version: PACKAGE VERSION\n"
77 "Report-Msgid-Bugs-To: \n"
88 "POT-Creation-Date: 2017-03-24 17:39+1100\n"
9 "PO-Revision-Date: 2011-12-29 00:41+0200\n"
10 "Last-Translator: 623633 <623633@gmx.com>\n"
9 "PO-Revision-Date: 2017-04-23 19:22+0000\n"
10 "Last-Translator: Yaron <sh.yaron@gmail.com>\n"
1111 "Language-Team: LANGUAGE <LL@li.org>\n"
1212 "Language: he\n"
1313 "MIME-Version: 1.0\n"
1414 "Content-Type: text/plain; charset=UTF-8\n"
1515 "Content-Transfer-Encoding: 8bit\n"
1616 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
17 "X-Generator: Pootle 2.0.5\n"
17 "X-Generator: Pootle 2.5.1.1\n"
18 "X-POOTLE-MTIME: 1492975349.000000\n"
1819
1920 #: activity/activity.info:2
20 #, fuzzy
2121 msgid "Log"
2222 msgstr "רישום"
2323
2525 msgid ""
2626 "This is an activity designed for anyone who wants to troubleshoot a "
2727 "complicated program on the computer."
28 msgstr ""
28 msgstr "זו פעילות שתוכננה כדי לאפשר, לכל מי שרוצה, לטפל בתכניות סוררות במחשב."
2929
3030 #: logviewer.py:95
31 #, fuzzy
3231 msgid "Log Files"
33 msgstr "קבצי רישום"
32 msgstr "קובצי רישום"
3433
3534 #: logviewer.py:108
36 #, fuzzy
3735 msgid "Other"
3836 msgstr "אחר"
3937
4038 #: logviewer.py:226
4139 #, python-format
4240 msgid "ERROR: Failed to look for files in '%(path)s'."
43 msgstr ""
41 msgstr "שגיאה: לא ניתן לחפש קבצים תחת „%(path)s“."
4442
4543 #: logviewer.py:246
4644 #, python-format
4745 msgid "ERROR: File '%(file)s' does not exist."
48 msgstr ""
46 msgstr "שגיאה: הקובץ „%(file)s“ לא קיים."
4947
5048 #: logviewer.py:251
5149 #, python-format
5250 msgid "ERROR: Unable to read file '%(file)s'."
53 msgstr ""
51 msgstr "שגיאה: לא ניתן לקרוא את הקובץ „%(file)s“."
5452
5553 #: logviewer.py:399
5654 #, python-format
5957
6058 #: logviewer.py:453
6159 msgid "Show list of files"
62 msgstr ""
60 msgstr "הצגת רשימת קבצים"
6361
6462 #: logviewer.py:463
65 #, fuzzy
6663 msgid "Word Wrap"
67 msgstr "מעטפת מילים"
64 msgstr "גלישת מילים"
6865
6966 #: logviewer.py:479
70 #, fuzzy
7167 msgid "Previous"
7268 msgstr "הקודם"
7369
7470 #: logviewer.py:484
75 #, fuzzy
7671 msgid "Next"
7772 msgstr "הבא"
7873
7974 #: logviewer.py:498
80 #, fuzzy
8175 msgid "Delete Log File"
8276 msgstr "מחיקת קובץ רישום"
8377
8478 #: logviewer.py:604
85 #, fuzzy
8679 msgid "Error"
8780 msgstr "שגיאה"
8881
8982 #: logviewer.py:605
9083 #, python-format
9184 msgid "%(error)s when deleting %(file)s"
92 msgstr ""
85 msgstr "%(error)s בעת מחיקת %(file)s"
9386
9487 #: logviewer.py:616
95 #, fuzzy
9688 msgid "Log Collector: Capture information"
97 msgstr "איסוף רישומים: שלחו מידע אודות ה-XO"
89 msgstr "איסוף רישומים: לכידת מידע"
9890
9991 #: logviewer.py:623
10092 msgid ""
10294 "and running processes to a journal entry.\n"
10395 "Use this to improve a problem report."
10496 msgstr ""
97 "פעולה זו לוכדת מידע על המערכת\n"
98 "ותהליכים פעילים לרשומת יומן.\n"
99 "ניתן להשתמש בתהליך זה כדי לשפר דיווח על תקלות."
105100
106101 #: logviewer.py:627
107102 msgid "Capture information"
108 msgstr ""
103 msgstr "פרטי הלכידה"
109104
110105 #: logviewer.py:650
111106 msgid "Logs not captured"
112 msgstr ""
107 msgstr "רישומים לא נלכדו"
113108
114109 #: logviewer.py:651
115110 msgid "The logs could not be captured."
116 msgstr ""
111 msgstr "לא ניתן ללכוד את הרישומים."
117112
118113 #: logviewer.py:661
119114 #, python-format
120115 msgid "log-%s"
121 msgstr ""
116 msgstr "רישום-%s"
0 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
1 # This file is distributed under the same license as the Log package.
2 #
3 # Božidar Putanec <bozidarp@yahoo.com>, 2017.
4 msgid ""
5 msgstr ""
6 "Project-Id-Version: Log\n"
7 "Report-Msgid-Bugs-To: \n"
8 "POT-Creation-Date: 2017-03-24 17:39+1100\n"
9 "PO-Revision-Date: 2017-05-16 14:12-0700\n"
10 "Last-Translator: Božidar Putanec <bozidarp@yahoo.com>\n"
11 "Language-Team: Croatian <LL@li.org>\n"
12 "Language: hr\n"
13 "MIME-Version: 1.0\n"
14 "Content-Type: text/plain; charset=UTF-8\n"
15 "Content-Transfer-Encoding: 8bit\n"
16 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
17 "X-Generator: Poedit 2.0.1\n"
18
19 #: activity/activity.info:2
20 msgid "Log"
21 msgstr "Zapisnik"
22
23 #: activity/activity.info:3
24 msgid "This is an activity designed for anyone who wants to troubleshoot a complicated program on the computer."
25 msgstr "Ova aktivnost je osmišljena za one koji žele rješavati greške u složenim programima na računalu."
26
27 #: logviewer.py:95
28 msgid "Log Files"
29 msgstr "Zapisničke datoteke"
30
31 #: logviewer.py:108
32 msgid "Other"
33 msgstr "Ostalo"
34
35 #: logviewer.py:226
36 #, python-format
37 msgid "ERROR: Failed to look for files in '%(path)s'."
38 msgstr "GREŠKA: Nije uspjelo pronaći datoteke u '%(path)s'."
39
40 #: logviewer.py:246
41 #, python-format
42 msgid "ERROR: File '%(file)s' does not exist."
43 msgstr "GREŠKA: Datoteka ‘%(file)s’ ne postoji."
44
45 #: logviewer.py:251
46 #, python-format
47 msgid "ERROR: Unable to read file '%(file)s'."
48 msgstr "GREŠKA: Datoteku '%(file)s' nije moguće učitati."
49
50 #: logviewer.py:399
51 #, python-format
52 msgid "Error: Can't open file '%s'\n"
53 msgstr "Greška: Datoteku ‘%s’ nije moguće otvoriti\n"
54
55 #: logviewer.py:453
56 msgid "Show list of files"
57 msgstr "Popis datoteka"
58
59 #: logviewer.py:463
60 msgid "Word Wrap"
61 msgstr "Prelamanje redaka"
62
63 #: logviewer.py:479
64 msgid "Previous"
65 msgstr "Natrag"
66
67 #: logviewer.py:484
68 msgid "Next"
69 msgstr "Naprijed"
70
71 #: logviewer.py:498
72 msgid "Delete Log File"
73 msgstr "Brisanje zapisnika"
74
75 #: logviewer.py:604
76 msgid "Error"
77 msgstr "Greška"
78
79 #: logviewer.py:605
80 #, python-format
81 msgid "%(error)s when deleting %(file)s"
82 msgstr "%(error)s pri brisanju %(file)s"
83
84 #: logviewer.py:616
85 msgid "Log Collector: Capture information"
86 msgstr "Prikupljač podataka: Zapisivanje sustavnih informacija"
87
88 #: logviewer.py:623
89 msgid ""
90 "This captures information about the system\n"
91 "and running processes to a journal entry.\n"
92 "Use this to improve a problem report."
93 msgstr ""
94 "Zapisuje u dnevnik informacije o sustavu i\n"
95 "procesima koji se izvode u sustavu.\n"
96 "Koristi se za poboljšanje izvještaja o problemima."
97
98 #: logviewer.py:627
99 msgid "Capture information"
100 msgstr "Pohvataj/zapiši informacije"
101
102 #: logviewer.py:650
103 msgid "Logs not captured"
104 msgstr "Unosi za zapisnik nisu pohvatani"
105
106 #: logviewer.py:651
107 msgid "The logs could not be captured."
108 msgstr "Unose za zapisnik nije uspjelo pohvatati."
109
110 #: logviewer.py:661
111 #, python-format
112 msgid "log-%s"
113 msgstr "log-%s"
99 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
1010 # This file is distributed under the same license as the PACKAGE package.
1111 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
12 #, fuzzy
1312 msgid ""
1413 msgstr ""
1514 "Project-Id-Version: PACKAGE VERSION\n"
1615 "Report-Msgid-Bugs-To: \n"
17 "POT-Creation-Date: 2013-04-11 00:31-0400\n"
16 "POT-Creation-Date: 2017-03-24 17:39+1100\n"
1817 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1918 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
2019 "Language-Team: LANGUAGE <LL@li.org>\n"
21 "Language: \n"
20 "Language: is\n"
2221 "MIME-Version: 1.0\n"
2322 "Content-Type: text/plain; charset=UTF-8\n"
2423 "Content-Transfer-Encoding: 8bit\n"
2524 "X-Generator: Translate Toolkit 1.1.1rc4\n"
2625
27 #. TRANS: "name" option from activity.info file
26 #: activity/activity.info:2
2827 msgid "Log"
2928 msgstr ""
3029
31 #. TRANS: "summary" option from activity.info file
32 #. TRANS: "description" option from activity.info file
30 #: activity/activity.info:3
3331 msgid ""
3432 "This is an activity designed for anyone who wants to troubleshoot a "
3533 "complicated program on the computer."
3634 msgstr ""
3735
38 #: logviewer.py:93
36 #: logviewer.py:95
3937 msgid "Log Files"
4038 msgstr ""
4139
42 #: logviewer.py:101
40 #: logviewer.py:108
4341 msgid "Other"
4442 msgstr ""
4543
46 #: logviewer.py:211
44 #: logviewer.py:226
4745 #, python-format
4846 msgid "ERROR: Failed to look for files in '%(path)s'."
4947 msgstr ""
5048
51 #: logviewer.py:227
49 #: logviewer.py:246
5250 #, python-format
5351 msgid "ERROR: File '%(file)s' does not exist."
5452 msgstr ""
5553
56 #: logviewer.py:232
54 #: logviewer.py:251
5755 #, python-format
5856 msgid "ERROR: Unable to read file '%(file)s'."
5957 msgstr ""
6058
61 #: logviewer.py:364
59 #: logviewer.py:399
6260 #, python-format
6361 msgid "Error: Can't open file '%s'\n"
6462 msgstr ""
6563
66 #: logviewer.py:405
64 #: logviewer.py:453
6765 msgid "Show list of files"
6866 msgstr ""
6967
70 #: logviewer.py:415
68 #: logviewer.py:463
7169 msgid "Word Wrap"
7270 msgstr ""
7371
74 #: logviewer.py:431
72 #: logviewer.py:479
7573 msgid "Previous"
7674 msgstr ""
7775
78 #: logviewer.py:436
76 #: logviewer.py:484
7977 msgid "Next"
8078 msgstr ""
8179
82 #: logviewer.py:450
80 #: logviewer.py:498
8381 msgid "Delete Log File"
8482 msgstr ""
8583
86 #: logviewer.py:522
84 #: logviewer.py:604
8785 msgid "Error"
8886 msgstr ""
8987
90 #: logviewer.py:523
88 #: logviewer.py:605
9189 #, python-format
9290 msgid "%(error)s when deleting %(file)s"
9391 msgstr ""
9492
95 #: logviewer.py:534
93 #: logviewer.py:616
9694 msgid "Log Collector: Capture information"
9795 msgstr ""
9896
99 #: logviewer.py:541
97 #: logviewer.py:623
10098 msgid ""
10199 "This captures information about the system\n"
102100 "and running processes to a journal entry.\n"
103101 "Use this to improve a problem report."
104102 msgstr ""
105103
106 #: logviewer.py:545
104 #: logviewer.py:627
107105 msgid "Capture information"
108106 msgstr ""
109107
110 #: logviewer.py:567
108 #: logviewer.py:650
111109 msgid "Logs not captured"
112110 msgstr ""
113111
114 #: logviewer.py:568
112 #: logviewer.py:651
115113 msgid "The logs could not be captured."
116114 msgstr ""
117115
118 #: logviewer.py:578
116 #: logviewer.py:661
119117 #, python-format
120118 msgid "log-%s"
121119 msgstr ""
0 # SOME DESCRIPTIVE TITLE.
1 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
2 # This file is distributed under the same license as the PACKAGE package.
3 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
4 msgid ""
5 msgstr ""
6 "Project-Id-Version: PACKAGE VERSION\n"
7 "Report-Msgid-Bugs-To: \n"
8 "POT-Creation-Date: 2017-03-24 17:39+1100\n"
9 "PO-Revision-Date: 2017-12-19 22:17+0000\n"
10 "Last-Translator: nabil509 <nabil509@gmail.com>\n"
11 "Language-Team: LANGUAGE <LL@li.org>\n"
12 "Language: kab\n"
13 "MIME-Version: 1.0\n"
14 "Content-Type: text/plain; charset=UTF-8\n"
15 "Content-Transfer-Encoding: 8bit\n"
16 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
17 "X-Generator: Pootle 2.5.1.1\n"
18 "X-POOTLE-MTIME: 1513721820.000000\n"
19
20 #: activity/activity.info:2
21 #, fuzzy
22 msgid "Log"
23 msgstr "Aɣmis"
24
25 #: activity/activity.info:3
26 msgid ""
27 "This is an activity designed for anyone who wants to troubleshoot a "
28 "complicated program on the computer."
29 msgstr ""
30
31 #: logviewer.py:95
32 msgid "Log Files"
33 msgstr "Ifuyla n weɣmis"
34
35 #: logviewer.py:108
36 msgid "Other"
37 msgstr ""
38
39 #: logviewer.py:226
40 #, python-format
41 msgid "ERROR: Failed to look for files in '%(path)s'."
42 msgstr ""
43
44 #: logviewer.py:246
45 #, python-format
46 msgid "ERROR: File '%(file)s' does not exist."
47 msgstr ""
48
49 #: logviewer.py:251
50 #, python-format
51 msgid "ERROR: Unable to read file '%(file)s'."
52 msgstr ""
53
54 #: logviewer.py:399
55 #, python-format
56 msgid "Error: Can't open file '%s'\n"
57 msgstr ""
58
59 #: logviewer.py:453
60 msgid "Show list of files"
61 msgstr ""
62
63 #: logviewer.py:463
64 msgid "Word Wrap"
65 msgstr ""
66
67 #: logviewer.py:479
68 msgid "Previous"
69 msgstr ""
70
71 #: logviewer.py:484
72 msgid "Next"
73 msgstr ""
74
75 #: logviewer.py:498
76 msgid "Delete Log File"
77 msgstr ""
78
79 #: logviewer.py:604
80 msgid "Error"
81 msgstr ""
82
83 #: logviewer.py:605
84 #, python-format
85 msgid "%(error)s when deleting %(file)s"
86 msgstr ""
87
88 #: logviewer.py:616
89 msgid "Log Collector: Capture information"
90 msgstr ""
91
92 #: logviewer.py:623
93 msgid ""
94 "This captures information about the system\n"
95 "and running processes to a journal entry.\n"
96 "Use this to improve a problem report."
97 msgstr ""
98
99 #: logviewer.py:627
100 msgid "Capture information"
101 msgstr ""
102
103 #: logviewer.py:650
104 msgid "Logs not captured"
105 msgstr ""
106
107 #: logviewer.py:651
108 msgid "The logs could not be captured."
109 msgstr ""
110
111 #: logviewer.py:661
112 #, python-format
113 msgid "log-%s"
114 msgstr ""
66 "Project-Id-Version: PACKAGE VERSION\n"
77 "Report-Msgid-Bugs-To: \n"
88 "POT-Creation-Date: 2017-03-24 17:39+1100\n"
9 "PO-Revision-Date: 2010-03-01 06:35+0200\n"
10 "Last-Translator: Chris <cjl@laptop.org>\n"
9 "PO-Revision-Date: 2018-09-05 19:15+0000\n"
10 "Last-Translator: Paulo Francisco <slomp@ufrgs.br>\n"
1111 "Language-Team: LANGUAGE <LL@li.org>\n"
1212 "Language: pt_BR\n"
1313 "MIME-Version: 1.0\n"
1414 "Content-Type: text/plain; charset=UTF-8\n"
1515 "Content-Transfer-Encoding: 8bit\n"
16 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
17 "X-Generator: Pootle 2.0.1\n"
16 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
17 "X-Generator: Pootle 2.5.1.1\n"
18 "X-POOTLE-MTIME: 1536174952.000000\n"
1819
1920 #: activity/activity.info:2
2021 msgid "Log"
2526 "This is an activity designed for anyone who wants to troubleshoot a "
2627 "complicated program on the computer."
2728 msgstr ""
29 "Esta atividade foi projetada para pessoas interessadas em solucionar "
30 "programas complicados no computador."
2831
2932 #: logviewer.py:95
3033 msgid "Log Files"
4245 #: logviewer.py:246
4346 #, python-format
4447 msgid "ERROR: File '%(file)s' does not exist."
45 msgstr "ERRO: Arquivo '%(file)s' não existe(m)."
48 msgstr "ERRO: O arquivo '%(file)s' não existe."
4649
4750 #: logviewer.py:251
4851 #, python-format
5255 #: logviewer.py:399
5356 #, python-format
5457 msgid "Error: Can't open file '%s'\n"
55 msgstr "Erro: Impossível abrir o arquivo '%s'\n"
58 msgstr "Erro: Não foi possível abrir o arquivo '%s'\n"
5659
5760 #: logviewer.py:453
5861 msgid "Show list of files"
59 msgstr ""
62 msgstr "Mostrar a lista de arquivos"
6063
6164 # 1-geralmente ocorre quando a linha não cabe na tela e então escolhemos se queremos que a continuação apareça na próxima linha ou simplesmente haja truncamento visual;
6265 #
6366 #: logviewer.py:463
6467 msgid "Word Wrap"
65 msgstr "Quebra de Palavras"
68 msgstr "Quebra de linha"
6669
6770 #: logviewer.py:479
6871 msgid "Previous"
8386 #: logviewer.py:605
8487 #, python-format
8588 msgid "%(error)s when deleting %(file)s"
86 msgstr "%(error)s enquanto apagando %(file)s"
89 msgstr "%(error)s enquanto excluindo %(file)s"
8790
8891 #: logviewer.py:616
89 #, fuzzy
9092 msgid "Log Collector: Capture information"
91 msgstr "Coletor de Histórico (log): Envia informação XO"
93 msgstr "Coletor de Histórico (Log): Captura informações"
9294
9395 #: logviewer.py:623
9496 msgid ""
9698 "and running processes to a journal entry.\n"
9799 "Use this to improve a problem report."
98100 msgstr ""
101 "Este captura e envia informações sobre o sistema,\n"
102 "assim como os de processos sendo executados\n"
103 "para o Diário. Use o mesmo para melhorar\n"
104 "o relatório do problema."
99105
100106 #: logviewer.py:627
101107 msgid "Capture information"
102 msgstr ""
108 msgstr "Capturar informação"
103109
104110 #: logviewer.py:650
105111 msgid "Logs not captured"
106 msgstr ""
112 msgstr "Registros não capturados"
107113
108114 #: logviewer.py:651
109115 msgid "The logs could not be captured."
110 msgstr ""
116 msgstr "Não foi possível capturar estes registros."
111117
112118 #: logviewer.py:661
113119 #, python-format
114120 msgid "log-%s"
115 msgstr ""
121 msgstr "log-%s"
1818 from sugar3.activity import bundlebuilder
1919
2020 bundlebuilder.start()
21