mugshot-0.2.5/0000775000175000017500000000000012401206322013074 5ustar seansean00000000000000mugshot-0.2.5/setup.py0000664000175000017500000001715612401206244014623 0ustar seansean00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Mugshot - Lightweight user configuration utility # Copyright (C) 2013-2014 Sean Davis # # 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 warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . import os import sys import subprocess try: import DistUtilsExtra.auto except ImportError: sys.stderr.write("To build mugshot you need " "https://launchpad.net/python-distutils-extra\n") sys.exit(1) assert DistUtilsExtra.auto.__version__ >= '2.18', \ 'needs DistUtilsExtra.auto >= 2.18' def update_config(libdir, values={}): """Update the configuration file at installation time.""" filename = os.path.join(libdir, 'mugshot_lib', 'mugshotconfig.py') oldvalues = {} try: fin = open(filename, 'r') fout = open(filename + '.new', 'w') for line in fin: fields = line.split(' = ') # Separate variable from value if fields[0] in values: oldvalues[fields[0]] = fields[1].strip() line = "%s = %s\n" % (fields[0], values[fields[0]]) fout.write(line) fout.flush() fout.close() fin.close() os.rename(fout.name, fin.name) except (OSError, IOError): print(("ERROR: Can't find %s" % filename)) sys.exit(1) return oldvalues def move_icon_file(root, target_data, prefix): """Move the icon files to their installation prefix.""" old_icon_path = os.path.normpath(os.path.join(root, target_data, 'share', 'mugshot', 'media')) for icon_size in ['16x16', '22x22', '24x24', '48x48', '64x64', 'scalable']: if icon_size == 'scalable': old_icon_file = os.path.join(old_icon_path, 'mugshot.svg') else: old_icon_file = os.path.join(old_icon_path, 'mugshot_%s.svg' % icon_size.split('x')[0]) icon_path = os.path.normpath(os.path.join(root, target_data, 'share', 'icons', 'hicolor', icon_size, 'apps')) icon_file = os.path.join(icon_path, 'mugshot.svg') old_icon_file = os.path.realpath(old_icon_file) icon_file = os.path.realpath(icon_file) if not os.path.exists(old_icon_file): print(("ERROR: Can't find", old_icon_file)) sys.exit(1) if not os.path.exists(icon_path): os.makedirs(icon_path) if old_icon_file != icon_file: print(("Moving icon file: %s -> %s" % (old_icon_file, icon_file))) os.rename(old_icon_file, icon_file) # Media is now empty if len(os.listdir(old_icon_path)) == 0: print(("Removing empty directory: %s" % old_icon_path)) os.rmdir(old_icon_path) return icon_file def get_desktop_file(root, target_data, prefix): """Move the desktop file to its installation prefix.""" desktop_path = os.path.realpath(os.path.join(root, target_data, 'share', 'applications')) desktop_file = os.path.join(desktop_path, 'mugshot.desktop') return desktop_file def update_desktop_file(filename, script_path): """Update the desktop file with prefixed paths.""" try: fin = open(filename, 'r') fout = open(filename + '.new', 'w') for line in fin: if 'Exec=' in line: cmd = line.split("=")[1].split(None, 1) line = "Exec=%s" % os.path.join(script_path, 'mugshot') if len(cmd) > 1: line += " %s" % cmd[1].strip() # Add script arguments back line += "\n" fout.write(line) fout.flush() fout.close() fin.close() os.rename(fout.name, fin.name) except (OSError, IOError): print(("ERROR: Can't find %s" % filename)) sys.exit(1) def write_appdata_file(filename_in): filename_out = filename_in.rstrip('.in') cmd = ["intltool-merge", "-x", "-d", "po", filename_in, filename_out] print(" ".join(cmd)) subprocess.call(cmd, shell=False) # Update AppData with latest translations first. write_appdata_file("data/appdata/mugshot.appdata.xml.in") class InstallAndUpdateDataDirectory(DistUtilsExtra.auto.install_auto): """Command Class to install and update the directory.""" def run(self): """Run the setup commands.""" DistUtilsExtra.auto.install_auto.run(self) print(("=== Installing %s, version %s ===" % (self.distribution.get_name(), self.distribution.get_version()))) if not self.prefix: self.prefix = '' if self.root: target_data = os.path.relpath(self.install_data, self.root) + \ os.sep target_pkgdata = os.path.join(target_data, 'share', 'mugshot', '') target_scripts = os.path.join(self.install_scripts, '') data_dir = os.path.join(self.prefix, 'share', 'mugshot', '') script_path = os.path.join(self.prefix, 'bin') else: # --user install self.root = '' target_data = os.path.relpath(self.install_data) + os.sep target_pkgdata = os.path.join(target_data, 'share', 'mugshot', '') target_scripts = os.path.join(self.install_scripts, '') # Use absolute paths target_data = os.path.realpath(target_data) target_pkgdata = os.path.realpath(target_pkgdata) target_scripts = os.path.realpath(target_scripts) data_dir = target_pkgdata script_path = target_scripts print(("Root: %s" % self.root)) print(("Prefix: %s\n" % self.prefix)) print(("Target Data: %s" % target_data)) print(("Target PkgData: %s" % target_pkgdata)) print(("Target Scripts: %s\n" % target_scripts)) print(("Mugshot Data Directory: %s" % data_dir)) values = {'__mugshot_data_directory__': "'%s'" % (data_dir), '__version__': "'%s'" % self.distribution.get_version()} update_config(self.install_lib, values) desktop_file = get_desktop_file(self.root, target_data, self.prefix) print(("Desktop File: %s\n" % desktop_file)) move_icon_file(self.root, target_data, self.prefix) update_desktop_file(desktop_file, script_path) DistUtilsExtra.auto.setup( name='mugshot', version='0.2.5', license='GPL-3+', author='Sean Davis', author_email='smd.seandavis@gmail.com', description='lightweight user configuration utility', long_description='A lightweight user configuration utility. It allows you ' 'to easily set profile image and user details for your ' 'user profile and any supported applications.', url='https://launchpad.net/mugshot', data_files=[('share/man/man1', ['mugshot.1']), ('share/appdata', ['data/appdata/mugshot.appdata.xml'])], cmdclass={'install': InstallAndUpdateDataDirectory} ) mugshot-0.2.5/NEWS0000664000175000017500000000433212401206244013600 0ustar seansean00000000000000Mugshot NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| 01 Sep 2014, Mugshot 0.2.5 - General . Fixes startup and improves usability for LDAP users and other users where user details are not properly parsed (LP: #1353530) . Include latest SudoDialog 02 Aug 2014, Mugshot 0.2.4 - General . Add AppData files . Upgrade license from GPL3 to GPL3+ - Bugs fixed: . Mugshot does not correctly expand user details (LP: #1310634) . Remove hard dependency on AccountsService (LP: #1311938) . Fix timeout by using non-interactive chfn (LP: #1315709) 04 Apr 2014, Mugshot 0.2.3 - General: . Check if user has sudo rights, disable first/last name change if not . Populate the Initials field based on first/last name fields . Hide "Remove" when there is no profile image set . Cleanup temporary files when closed . Package is now 100% PEP8-compliant - AccountsService: . Scale images on save to accomodate AccountsService max size . Use AccountsService profile image if ~/.face does not exist . Sync AccountsService profile image to ~/.face - Bugs fixed: . mugshot is unable to store profile picture (LP: #1298665) 09 Mar 2014, Mugshot 0.2.2 - General: . Fixed crash when saving user details with a non-English locale . Fixed apparently untranslated dialog . Updated translations - Bugs fixed: . Fix crash with IndexError in init_user_details (LP: #1287468) 02 Mar 2014, Mugshot 0.2.1 - General: . Fixed typo that incorrectly hid the manual photo browser instead of stock . Use GLib for better environment and user settings detection . Use the SudoDialog developed for Catfish to better receive password . Correctly stop processing updates if password was incorrectly entered - Bugs fixed: . Add option to remove current profile picture (LP: #1286897) . Add AccountsService support to set profile picture (LP: #1273896) . mugshot fails at attempt to change avatar (LP: #1284720) 25 Jan 2014, Mugshot 0.2 - General: . Mugshot is now designed for use with only Python 3. . Dependency on yelp/ghelp has been removed. . Packaging has been simplified. 27 Jul 2013, Mugshot 0.1 - Initial release. mugshot-0.2.5/bin/0000775000175000017500000000000012401206322013644 5ustar seansean00000000000000mugshot-0.2.5/bin/mugshot0000775000175000017500000000243112401206244015263 0ustar seansean00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Mugshot - Lightweight user configuration utility # Copyright (C) 2013-2014 Sean Davis # # 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 warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . import locale locale.textdomain('mugshot') import sys import os import gi gi.require_version('Gtk', '3.0') # Get project root directory (enable symlink and trunk execution) PROJECT_ROOT_DIRECTORY = os.path.abspath( os.path.dirname(os.path.dirname(os.path.realpath(sys.argv[0])))) # Add project root directory to python search path sys.path.append(PROJECT_ROOT_DIRECTORY) import mugshot mugshot.main() mugshot-0.2.5/README0000664000175000017500000000173712401206244013767 0ustar seansean00000000000000Mugshot is a lightweight user configuration utility that allows you to easily update personal user details. This includes: - Linux profile image: ~/.face - User details stored in /etc/passwd (used by finger) - Pidgin buddy icon - LibreOffice user details Dependencies: chfn, python3-gi, python3-pexpect, python3-dbus, python3-cairo Optional: gstreamer1.0-plugins-good and gstreamer1.0-tools (for webcam support), gnome-control-center-data (provides a healthy list of stock user profile images) Please report comments, suggestions and bugs to: Sean Davis Check for new versions at: https://launchpad.net/mugshot NOTE: If you get the following error: (mugshot:22748): GLib-GIO-ERROR **: Settings schema 'apps.mugshot' is not installed be sure to copy data/glib-2.0/schemas/apps.mugshot.gschema.xml to either: /usr/share/glib-2.0/schemas, or /usr/local/share/glib-2.0/schemas and run glib-compile-schemas on that directory before running.mugshot-0.2.5/mugshot/0000775000175000017500000000000012401206322014562 5ustar seansean00000000000000mugshot-0.2.5/mugshot/__init__.py0000664000175000017500000000324212401206244016677 0ustar seansean00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Mugshot - Lightweight user configuration utility # Copyright (C) 2013-2014 Sean Davis # # 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 warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . import optparse from locale import gettext as _ from gi.repository import Gtk # pylint: disable=E0611 from mugshot import MugshotWindow from mugshot_lib import set_up_logging, get_version, helpers def parse_options(): """Support for command line options""" parser = optparse.OptionParser(version="%%prog %s" % get_version()) parser.add_option( "-v", "--verbose", action="count", dest="verbose", help=_("Show debug messages (-vv debugs mugshot_lib also)")) (options, args) = parser.parse_args() set_up_logging(options) def main(): 'constructor for your class instances' parse_options() # Run the application. window = MugshotWindow.MugshotWindow() window.show() Gtk.main() # Cleanup temporary files helpers.clear_tempfiles() mugshot-0.2.5/mugshot/CameraMugshotDialog.py0000664000175000017500000003320612401206244021022 0ustar seansean00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Mugshot - Lightweight user configuration utility # Copyright (C) 2013-2014 Sean Davis # # Portions of this file are adapted from web_cam_box, # Copyright (C) 2010 Rick Spencer # # 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 warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . from locale import gettext as _ import logging logger = logging.getLogger('mugshot') from gi.repository import Gtk, GObject, Gst, GdkPixbuf from gi.repository import GdkX11, GstVideo # lint:ok import cairo import os from mugshot_lib import helpers from mugshot_lib.CameraDialog import CameraDialog def draw_message(widget, message, ctx): """Draw a message (including newlines) vertically centered on a cairo context.""" split_msg = message.split('\n') # Get the height and width of the drawing area. alloc = widget.get_allocation() height = alloc.height # Make the background black. ctx.set_source_rgb(0, 0, 0) ctx.paint() # Set the font details. font_size = 20 font_color = (255, 255, 255) font_name = "Sans" row_spacing = 6 left_spacing = 10 # Get start position message_height = (len(split_msg) * font_size) + len(split_msg) - 15 current_pos = (height - message_height) / 2 # Draw the message to the drawing area. ctx.set_source_rgb(*font_color) ctx.select_font_face(font_name, cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL) ctx.set_font_size(font_size) for line in split_msg: ctx.move_to(left_spacing, current_pos) ctx.show_text(line) current_pos = current_pos + font_size + row_spacing class CameraMugshotDialog(CameraDialog): """Camera Capturing Dialog""" __gtype_name__ = "CameraMugshotDialog" def finish_initializing(self, builder): # pylint: disable=E1002 """Set up the camera dialog""" super(CameraMugshotDialog, self).finish_initializing(builder) # Initialize Gst or nothing will work. Gst.init(None) # Pack the video widget into the dialog. vbox = builder.get_object('camera_box') self.video_window = Gtk.DrawingArea() self.video_window.connect("realize", self.__on_video_window_realized) vbox.pack_start(self.video_window, True, True, 0) self.video_window.show() # Prepare the camerabin element. self.camerabin = Gst.ElementFactory.make("camerabin", "camera-source") if self.camerabin: bus = self.camerabin.get_bus() bus.add_signal_watch() bus.enable_sync_message_emission() bus.connect("message", self._on_message) bus.connect("sync-message::element", self._on_sync_message) self.realized = False self.draw_handler = self.video_window.connect('draw', self.on_draw) # If the camera fails to load, show an error on the screen. else: devices = [] for device in os.listdir('/dev/'): if device.startswith('video'): devices.append(device) logger.error(_('Camera failed to load. Devices: %s') % '; '.join(devices)) self.draw_handler = self.video_window.connect('draw', self.on_failed_draw) self.realized = True # Essential widgets self.record_button = builder.get_object('camera_record') self.apply_button = builder.get_object('camera_apply') # Store the temporary filename to be used. self.filename = None self.show_all() def on_failed_draw(self, widget, ctx): """Display a message that the camera failed to load.""" # Translators: Please include newlines, as required to fit the message. message = _("Sorry, but your camera\nfailed to initialize.") draw_message(widget, message, ctx) def on_draw(self, widget, ctx): """Display a message that the camera is initializing on first draw. Afterwards, blank the drawing area to clear the message.""" # Translators: Please include newlines, as required to fit the message. message = _("Please wait while your\ncamera is initialized.") draw_message(widget, message, ctx) # Redefine on_draw to blank the drawing area next time. def on_draw(self, widget, ctx): """Redefinition of on_draw to blank the drawing area next time.""" ctx.set_source_rgb(0, 0, 0) ctx.paint() # Redefine on_draw once more to do nothing else. def on_draw(self, widget, ctx): """Redefinition of on_draw no longer do anything.""" pass def play(self): """Start the camera streaming and display the output. It is necessary to start the camera playing before using most other functions.""" if not self.realized: self._set_video_window_id() if not self.realized: logger.error(_("Cannot display camera output. " "Ignoring play command")) else: if self.camerabin: self.camerabin.set_state(Gst.State.PLAYING) def pause(self): """Pause the camera output. It will cause the image to "freeze". Use play() to start the camera playing again. Note that calling pause before play may cause errors on certain camera.""" if self.camerabin: self.camerabin.set_state(Gst.State.PAUSED) def take_picture(self, filename): """take_picture - grab a frame from the webcam and save it to 'filename. If play is not called before take_picture, an error may occur. If take_picture is called immediately after play, the camera may not be fully initialized, and an error may occur. Connect to the signal "image-captured" to be alerted when the picture is saved.""" self.camerabin.set_property("location", filename) self.camerabin.emit("start-capture") def stop(self): """Stop the camera streaming and display the output.""" self.camerabin.set_state(Gst.State.NULL) def _on_message(self, bus, message): """Internal signal handler for bus messages. May be useful to extend in a base class to handle messages produced from custom behaviors. arguments - bus: the bus from which the message was sent, typically self.bux message: the message sent""" # Ignore if there is no message. if message is None: return # Get the message type. t = message.type # Initial load, wait until camera is ready before enabling capture. if t == Gst.MessageType.ASYNC_DONE: self.record_button.set_sensitive(True) if t == Gst.MessageType.ELEMENT: # Keep the camera working after several pictures are taken. if message.get_structure().get_name() == "image-captured": self.camerabin.set_state(Gst.Sate.NULL) self.camerabin.set_state(Gst.State.PLAYING) self.emit("image-captured", self.filename) # Enable interface elements once the images are finished saving. elif message.get_structure().get_name() == "image-done": self.apply_button.set_sensitive(True) self.record_button.set_sensitive(True) self.pause() # Stop the stream if the EOS (end of stream) message is received. if t == Gst.MessageType.EOS: self.camerabin.set_state(Gst.State.NULL) # Capture and report any error received. elif t == Gst.MessageType.ERROR: err, debug = message.parse_error() logger.error("%s" % err, debug) def _on_sync_message(self, bus, message): """ _on_sync_message - internal signal handler for bus messages. May be useful to extend in a base class to handle messages produced from custom behaviors. arguments - bus: the bus from which the message was sent, typically self.bux message: the message sent """ # Ignore empty messages. if message.get_structure() is None: return message_name = message.get_structure().get_name() # Embed the gstreamer element into our window. if message_name == "prepare-window-handle": imagesink = message.src imagesink.set_property("force-aspect-ratio", True) imagesink.set_window_handle(self.video_window.get_window() .get_xid()) def __on_video_window_realized(self, widget, data=None): """Internal signal handler, used to set up the xid for the drawing area in a thread safe manner. Do not call directly.""" self._set_video_window_id() def _set_video_window_id(self): """Set the window ID only if not previously configured.""" if not self.realized and self.video_window.get_window() is not None: self.video_window.get_window().get_xid() self.realized = True def on_camera_record_clicked(self, widget): """When the camera record/retry button is clicked: Record: Pause the video, start the capture, enable apply and retry. Retry: Restart the video stream.""" # Remove any previous temporary file. if self.filename and os.path.isfile(self.filename): os.remove(self.filename) # Retry action. if self.apply_button.get_sensitive(): self.record_button.set_label(Gtk.STOCK_MEDIA_RECORD) self.apply_button.set_sensitive(False) self.play() # Record (Capture) action. else: # Create a new temporary file. self.filename = helpers.new_tempfile('camera') # Capture the current image. self.take_picture(self.filename) # Set the record button to retry, and disable it until the capture # finishes. self.record_button.set_label(_("Retry")) self.record_button.set_sensitive(False) def on_camera_apply_clicked(self, widget): """When the camera Apply button is clicked, crop the current photo and emit a signal to let the main application know there is a new file available. Then close the camera dialog.""" self.center_crop(self.filename) self.emit("apply", self.filename) self.hide() def on_camera_cancel_clicked(self, widget): """When the Cancel button is clicked, just hide the dialog.""" self.hide() def on_camera_mugshot_dialog_destroy(self, widget, data=None): """When the application exits, remove the current temporary file and stop the gstreamer element.""" # Clear away the temp file. if self.filename and os.path.isfile(self.filename): os.remove(self.filename) # Clean up the camera before exiting self.camerabin.set_state(Gst.State.NULL) def on_camera_mugshot_dialog_hide(self, widget, data=None): """When the dialog is hidden, pause the camera recording.""" self.pause() def on_camera_mugshot_dialog_show(self, widget, data=None): """When the dialog is shown, set the record button to record, disable the apply button, and start the camera.""" self.record_button.set_label(Gtk.STOCK_MEDIA_RECORD) self.apply_button.set_sensitive(False) self.show_all() self.play() def center_crop(self, filename): """Crop the specified file to square dimensions.""" # Load the image into a Pixbuf. pixbuf = GdkPixbuf.Pixbuf.new_from_file(filename) # Get the image dimensions. height = pixbuf.get_height() width = pixbuf.get_width() start_x = 0 start_y = 0 # Calculate a balanced center. if width > height: start_x = (width - height) / 2 width = height else: start_y = (height - width) / 2 height = width # Create a new cropped pixbuf. new_pixbuf = pixbuf.new_subpixbuf(start_x, start_y, width, height) # Overwrite the temporary file with our new cropped image. new_pixbuf.savev(filename, "png", [], []) def on_camera_mugshot_dialog_delete_event(self, widget, data=None): """Override the dialog delete event to just hide the window.""" self.hide() return True # Signals used by CameraMugshotDialog: # image-captured: emitted when the camera is done capturing an image. # apply: emitted when the apply button has been pressed and there is a # new file saved for use. __gsignals__ = {'image-captured': (GObject.SIGNAL_RUN_LAST, GObject.TYPE_NONE, (GObject.TYPE_PYOBJECT,)), 'apply': (GObject.SIGNAL_RUN_LAST, GObject.TYPE_NONE, (GObject.TYPE_STRING,)) } mugshot-0.2.5/mugshot/MugshotWindow.py0000664000175000017500000012657712401206244017777 0ustar seansean00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Mugshot - Lightweight user configuration utility # Copyright (C) 2013-2014 Sean Davis # # 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 warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . from locale import gettext as _ import os # Used for automating chfn import pexpect # Used for copying files to ~/.face import shutil # Used for which command and checking for running processes. import subprocess # DBUS interface is used to update pidgin buddyicon when pidgin is running. import dbus from gi.repository import Gtk, GdkPixbuf, GLib, Gio # pylint: disable=E0611 import logging logger = logging.getLogger('mugshot') from mugshot_lib import Window, SudoDialog, helpers from mugshot.CameraMugshotDialog import CameraMugshotDialog username = GLib.get_user_name() home = GLib.get_home_dir() libreoffice_prefs = os.path.join(GLib.get_user_config_dir(), 'libreoffice', '4', 'user', 'registrymodifications.xcu') pidgin_prefs = os.path.join(home, '.purple', 'prefs.xml') faces_dir = '/usr/share/pixmaps/faces/' def which(command): '''Use the system command which to get the absolute path for the given command.''' command = subprocess.Popen(['which', command], stdout=subprocess.PIPE).stdout.read().strip() command = command.decode('utf-8') if command == '': logger.debug('Command "%s" could not be found.' % command) return None return command def has_running_process(name): """Check for a running process, return True if any listings are found.""" command = 'ps -ef | grep " %s" | grep -v "grep" | wc -l' % name n = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True).stdout.read().strip() return int(n) > 0 def has_gstreamer_camerabin_support(): """Return True if gstreamer1.0 camerabin element is available.""" process = subprocess.Popen(["gst-inspect-1.0", "camerabin"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) process.communicate() has_support = process.returncode == 0 if not has_support: element = 'camerabin' plugin = 'gstreamer1.0-plugins-good' logger.debug('%s element unavailable. ' 'Do you have %s installed?' % (element, plugin)) return has_support def has_gstreamer_camerasrc_support(): """Return True if gstreamer1.0 v4l2src element is available.""" process = subprocess.Popen(["gst-inspect-1.0", "v4l2src"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) process.communicate() has_support = process.returncode == 0 if not has_support: element = 'v4l2src' plugin = 'gstreamer1.0-plugins-good' logger.debug('%s element unavailable. ' 'Do you have %s installed?' % (element, plugin)) return has_support def get_camera_installed(): """Return True if /dev/video0 exists.""" if not os.path.exists('/dev/video0'): logger.debug('Camera not detected at /dev/video0') return False return True def get_has_camera_support(): """Return True if cameras are fully supported by this application.""" if not get_camera_installed(): return False if not which('gst-inspect-1.0'): return False if not has_gstreamer_camerabin_support(): return False if not has_gstreamer_camerasrc_support(): return False return True def detach_cb(menu, widget): '''Detach a widget from its attached widget.''' menu.detach() def get_entry_value(entry_widget): """Get the value from one of the Mugshot entries.""" # Get the text from an entry, changing none to '' value = entry_widget.get_text().strip() if value.lower() == 'none': value = '' return value def get_confirmation_dialog(parent, primary_message, secondary_message, icon_name=None): """Display a confirmation (yes/no) dialog configured with primary and secondary messages, as well as a custom icon if requested.""" dialog = Gtk.MessageDialog(transient_for=parent, flags=0, message_type=Gtk.MessageType.QUESTION, buttons=Gtk.ButtonsType.YES_NO, text=primary_message) dialog.format_secondary_text(secondary_message) if icon_name: image = Gtk.Image.new_from_icon_name(icon_name, Gtk.IconSize.DIALOG) dialog.set_image(image) dialog.show_all() response = dialog.run() dialog.destroy() return response == Gtk.ResponseType.YES def menu_position(self, menu, data=None, something_else=None): '''Position a menu at the bottom of its attached widget''' widget = menu.get_attach_widget() allocation = widget.get_allocation() window_pos = widget.get_window().get_position() # Align the left side of the menu with the left side of the button. x = window_pos[0] + allocation.x # Align the top of the menu with the bottom of the button. y = window_pos[1] + allocation.y + allocation.height return (x, y, True) # See mugshot_lib.Window.py for more details about how this class works class MugshotWindow(Window): """Mugshot GtkWindow""" __gtype_name__ = "MugshotWindow" def finish_initializing(self, builder): # pylint: disable=E1002 """Set up the main window""" super(MugshotWindow, self).finish_initializing(builder) self.set_wmclass("Mugshot", "Mugshot") self.CameraDialog = CameraMugshotDialog # User Image widgets self.image_button = builder.get_object('image_button') self.user_image = builder.get_object('user_image') self.image_menu = builder.get_object('image_menu') self.image_menu.attach_to_widget(self.image_button, detach_cb) self.image_from_camera = builder.get_object('image_from_camera') self.image_from_stock = builder.get_object('image_from_stock') self.image_from_stock.set_visible(os.path.exists(faces_dir) and len(os.listdir(faces_dir)) > 0) self.menuitem1 = builder.get_object('menuitem1') self.image_remove = builder.get_object('image_remove') # Entry widgets (chfn) self.first_name_entry = builder.get_object('first_name') self.last_name_entry = builder.get_object('last_name') self.initials_entry = builder.get_object('initials') self.office_phone_entry = builder.get_object('office_phone') self.home_phone_entry = builder.get_object('home_phone') self.email_entry = builder.get_object('email') self.fax_entry = builder.get_object('fax') # Users without sudo rights cannot change their name. self.set_name_editable(SudoDialog.check_dependencies(['chfn'])) # Stock photo browser self.stock_browser = builder.get_object('stock_browser') self.iconview = builder.get_object('stock_iconview') # File Chooser Dialog self.chooser = builder.get_object('filechooserdialog') self.crop_center = builder.get_object('crop_center') self.crop_left = builder.get_object('crop_left') self.crop_right = builder.get_object('crop_right') self.file_chooser_preview = builder.get_object('file_chooser_preview') # Add a filter for only image files. image_filter = Gtk.FileFilter() image_filter.set_name('Images') image_filter.add_mime_type('image/*') self.chooser.add_filter(image_filter) self.tmpfile = None # Populate all of the widgets. self.init_user_details() def set_name_editable(self, editable): """Set name fields editable.""" self.first_name_entry.set_sensitive(editable) self.last_name_entry.set_sensitive(editable) self.initials_entry.set_sensitive(editable) def init_user_details(self): """Initialize the user details entries and variables.""" # Check for .face and set profile image. logger.debug('Checking for ~/.face profile image') face = os.path.join(home, '.face') logger.debug('Checking AccountsService for profile image') image = self.accounts_service_get_user_image() # AccountsService may not be supported or desired. if image is None: logger.debug("AccountsService is not supported.") self.updated_image = face self.set_user_image(face) # If it is supported, process and compare to ~/.face else: logger.debug('Found profile image: %s' % str(image)) if os.path.isfile(face): if os.path.samefile(image, face): self.updated_image = face else: self.updated_image = None self.set_user_image(face) elif os.path.isfile(image): self.updated_image = image self.set_user_image(image) else: self.updated_image = None self.set_user_image(None) user_details = self.get_user_details() # Set the class variables self.first_name = user_details['first_name'] self.last_name = user_details['last_name'] self.initials = user_details['initials'] self.home_phone = user_details['home_phone'] self.office_phone = user_details['office_phone'] email = user_details['email'] fax = user_details['fax'] # Populate the GtkEntries. logger.debug('Populating entries') self.first_name_entry.set_text(self.first_name) self.last_name_entry.set_text(self.last_name) self.initials_entry.set_text(self.initials) self.office_phone_entry.set_text(self.office_phone) self.home_phone_entry.set_text(self.home_phone) self.email_entry.set_text(email) self.fax_entry.set_text(fax) # = Mugshot Window ====================================================== # def set_user_image(self, filename=None): """Scale and set the user profile image.""" logger.debug("Setting user profile image to %s" % str(filename)) if filename: pixbuf = GdkPixbuf.Pixbuf.new_from_file(filename) scaled = pixbuf.scale_simple(128, 128, GdkPixbuf.InterpType.HYPER) self.user_image.set_from_pixbuf(scaled) # Show "Remove" menu item. self.menuitem1.set_visible(True) self.image_remove.set_visible(True) else: self.user_image.set_from_icon_name('avatar-default', 128) # Hide "Remove" menu item. self.menuitem1.set_visible(False) self.image_remove.set_visible(False) def suggest_initials(self, first_name, last_name): """Generate initials from first and last name.""" try: initials = first_name[0] + last_name[0] except: if first_name: initials = first_name[0] else: initials = '' return initials def filter_numbers(self, entry, *args): """Allow only numbers and + in phone entry fields.""" text = entry.get_text().strip() entry.set_text(''.join([i for i in text if i in '+0123456789'])) def on_apply_button_clicked(self, widget): """When the window Apply button is clicked, commit any relevant changes.""" logger.debug('Applying changes...') if self.get_chfn_details_updated(): success, response = self.save_chfn_details() if not success: # Password was incorrect, complain. if response in [Gtk.ResponseType.NONE, Gtk.ResponseType.CANCEL, Gtk.ResponseType.DELETE_EVENT]: msg_type = Gtk.MessageType.WARNING primary = _("Authentication cancelled.") elif response == Gtk.ResponseType.REJECT: msg_type = Gtk.MessageType.WARNING primary = _("Authentication failed.") else: msg_type = Gtk.MessageType.ERROR primary = _("An error occurred when saving changes.") secondary = _("User details were not updated.") dialog = Gtk.MessageDialog(transient_for=self, flags=0, message_type=msg_type, buttons=Gtk.ButtonsType.OK, text=primary) dialog.format_secondary_text(secondary) dialog.run() dialog.destroy() return if self.get_libreoffice_details_updated(): self.set_libreoffice_data() if self.updated_image is not None: self.save_image() self.save_gsettings() self.destroy() def save_gsettings(self): """Save details to dconf (the ones not tracked by /etc/passwd)""" logger.debug('Saving details to dconf: /apps/mugshot') self.settings.set_string('initials', get_entry_value(self.initials_entry)) self.settings.set_string('email', get_entry_value(self.email_entry)) self.settings.set_string('fax', get_entry_value(self.fax_entry)) def entry_focus_next(self, widget): """Focus the next available entry when pressing Enter.""" logger.debug('Entry activated, focusing next widget.') vbox = widget.get_parent().get_parent().get_parent().get_parent() vbox.child_focus(Gtk.DirectionType.TAB_FORWARD) def initials_entry_focused(self, widget): """Paste initials into empty field.""" logger.debug('Initials field focused.') first_name = get_entry_value(self.first_name_entry) last_name = get_entry_value(self.last_name_entry) if get_entry_value(self.initials_entry) == '': self.initials_entry.set_text(self.suggest_initials(first_name, last_name)) def on_cancel_button_clicked(self, widget): """When the window cancel button is clicked, close the program.""" logger.debug('Cancel clicked, goodbye.') self.destroy() # = Image Button and Menu =============================================== # def on_image_button_clicked(self, widget): """When the menu button is clicked, display the photo menu.""" if widget.get_active(): logger.debug('Show photo menu') self.image_from_camera.set_visible(get_has_camera_support()) self.image_menu.popup(None, None, menu_position, self.image_menu, 3, Gtk.get_current_event_time()) def on_image_menu_hide(self, widget): """Untoggle the image button when the menu is hidden.""" self.image_button.set_active(False) def on_image_remove_activate(self, widget): """Remove the user's profile image.""" self.updated_image = "" self.set_user_image(None) def on_camera_dialog_apply(self, widget, data=None): """Commit changes when apply is clicked.""" self.updated_image = data self.set_user_image(data) def save_image(self): """Copy the updated image filename to ~/.face""" # Check if the image has been updated. if self.updated_image is None: logger.debug('Photo not updated, not saving changes.') return False if not os.path.isfile(self.updated_image): self.updated_image = "" face = os.path.join(home, '.face') if os.path.normpath(face) != os.path.normpath(self.updated_image): # If the .face file already exists, remove it first. logger.debug('Photo updated, saving ~/.face profile image.') if os.path.isfile(face): os.remove(face) # Copy the new file to ~/.face if os.path.isfile(self.updated_image): shutil.copyfile(self.updated_image, face) # Update AccountsService profile image logger.debug('Photo updated, saving AccountsService profile image.') self.accounts_service_set_user_image(self.updated_image) # Update Pidgin buddy icon self.set_pidgin_buddyicon(self.updated_image) self.updated_image = None return True def accounts_service_get_user_image(self): """Get user profile image using AccountsService.""" try: bus = Gio.bus_get_sync(Gio.BusType.SYSTEM, None) result = bus.call_sync('org.freedesktop.Accounts', '/org/freedesktop/Accounts', 'org.freedesktop.Accounts', 'FindUserByName', GLib.Variant('(s)', (username,)), GLib.VariantType.new('(o)'), Gio.DBusCallFlags.NONE, -1, None) (path,) = result.unpack() variant = GLib.Variant('(s)', ('org.freedesktop.Accounts.User',)) result = bus.call_sync('org.freedesktop.Accounts', path, 'org.freedesktop.DBus.Properties', 'GetAll', variant, GLib.VariantType.new('(a{sv})'), Gio.DBusCallFlags.NONE, -1, None) (props,) = result.unpack() return props['IconFile'] except GLib.GError: return None def accounts_service_set_user_image(self, filename): """Set user profile image using AccountsService.""" try: bus = Gio.bus_get_sync(Gio.BusType.SYSTEM, None) result = bus.call_sync('org.freedesktop.Accounts', '/org/freedesktop/Accounts', 'org.freedesktop.Accounts', 'FindUserByName', GLib.Variant('(s)', (username,)), GLib.VariantType.new('(o)'), Gio.DBusCallFlags.NONE, -1, None) (path,) = result.unpack() bus.call_sync('org.freedesktop.Accounts', path, 'org.freedesktop.Accounts.User', 'SetIconFile', GLib.Variant('(s)', (filename,)), GLib.VariantType.new('()'), Gio.DBusCallFlags.NONE, -1, None) except GLib.GError: pass def set_pidgin_buddyicon(self, filename=None): """Sets the pidgin buddyicon to filename (usually ~/.face). If pidgin is running, use the dbus interface, otherwise directly modify the XML file.""" if not os.path.exists(pidgin_prefs): logger.debug('Pidgin not installed or never opened, not updating.') return logger.debug('Prompting user to update pidgin buddy icon') primary = _("Update Pidgin buddy icon?") secondary = _("Would you also like to update your Pidgin buddy icon?") update_pidgin = get_confirmation_dialog(self, primary, secondary, 'pidgin') if update_pidgin: if has_running_process('pidgin'): self.set_pidgin_buddyicon_dbus(filename) else: self.set_pidgin_buddyicon_xml(filename) else: logger.debug('Reject: Not updating pidgin buddy icon') def set_pidgin_buddyicon_dbus(self, filename=None): """Set the pidgin buddy icon via dbus.""" logger.debug('Updating pidgin buddy icon via dbus') bus = dbus.SessionBus() obj = bus.get_object("im.pidgin.purple.PurpleService", "/im/pidgin/purple/PurpleObject") purple = dbus.Interface(obj, "im.pidgin.purple.PurpleInterface") # To make the change instantly visible, set the icon to none first. purple.PurplePrefsSetPath('/pidgin/accounts/buddyicon', '') if filename: purple.PurplePrefsSetPath('/pidgin/accounts/buddyicon', filename) def set_pidgin_buddyicon_xml(self, filename=None): """Set the buddyicon used by pidgin to filename (via the xml file).""" # This is hacky, but a working implementation for now... logger.debug('Updating pidgin buddy icon via xml') prefs_file = pidgin_prefs tmp_buffer = [] if os.path.isfile(prefs_file): for line in open(prefs_file): if '\n' % filename else: new = new + 'value=\'\'/>\n' tmp_buffer.append(new) else: tmp_buffer.append(line) write_prefs = open(prefs_file, 'w') for line in tmp_buffer: write_prefs.write(line) write_prefs.close() # = chfn functions ============================================ # def get_chfn_details_updated(self): """Return True if chfn-related details have been modified.""" logger.debug('Checking if chfn details have been modified.') modified = False if self.first_name != self.first_name_entry.get_text().strip(): modified = True if self.last_name != self.last_name_entry.get_text().strip(): modified = True if self.home_phone != self.home_phone_entry.get_text().strip(): modified = True if self.office_phone != self.office_phone_entry.get_text().strip(): modified = True if modified: logger.debug('chfn details have been modified.') return True else: logger.debug('chfn details have NOT been modified.') return False def process_terminal_password(self, command, password): """Handle password prompts from the interactive chfn commands.""" # Force the C language for guaranteed english strings in the script. logger.debug('Executing: %s' % command) child = SudoDialog.env_spawn(command, 5) child.write_to_stdout = True try: child.expect([".*ssword.*", pexpect.EOF]) child.sendline(password) child.expect([pexpect.EOF]) except pexpect.TIMEOUT: logger.warning('Timeout reached, password was likely incorrect.') child.close(True) return child.exitstatus == 0 def save_chfn_details(self): """Commit changes to chfn-related details. For full name, changes must be performed as root. Other changes are done with the user password. Return TRUE if successful.""" success = True # Get the password for sudo sudo_dialog = SudoDialog.SudoDialog( icon=None, name=_("Mugshot"), retries=3) sudo_dialog.format_primary_text(_("Enter your password to change user " "details.")) sudo_dialog.format_secondary_text(_("This is a security measure to " "prevent unwanted updates\n" "to your personal information.")) response = sudo_dialog.run() sudo_dialog.hide() password = sudo_dialog.get_password() sudo_dialog.destroy() if not password: return (False, response) sudo = which('sudo') chfn = which('chfn') # Get each of the updated values. first_name = get_entry_value(self.first_name_entry) last_name = get_entry_value(self.last_name_entry) full_name = "%s %s" % (first_name, last_name) full_name = full_name.strip() office_phone = get_entry_value(self.office_phone_entry) if office_phone == '': office_phone = 'none' home_phone = get_entry_value(self.home_phone_entry) if home_phone == '': home_phone = 'none' # Full name can only be modified by root. Try using sudo to modify. if SudoDialog.check_dependencies(['chfn']): logger.debug('Updating Full Name...') command = "%s %s -f \"%s\" %s" % (sudo, chfn, full_name, username) if self.process_terminal_password(command, password): self.first_name = first_name self.last_name = last_name else: success = False logger.debug('Updating Home Phone...') command = "%s -h \"%s\" %s" % (chfn, home_phone, username) if self.process_terminal_password(command, password): self.home_phone = home_phone else: success = False logger.debug('Updating Office Phone...') command = "%s -w \"%s\" %s" % (chfn, office_phone, username) if self.process_terminal_password(command, password): self.office_phone = office_phone else: success = False return (success, response) # = LibreOffice ========================================================= # def get_libreoffice_details_updated(self): """Return True if LibreOffice settings need to be updated.""" # Return False if there is no preferences file. if not os.path.isfile(libreoffice_prefs): logger.debug('LibreOffice is not installed or has not been opened.' ' Not updating.') return False # Compare the current entries to the existing LibreOffice data. data = self.get_libreoffice_data() if data['first_name'] != get_entry_value(self.first_name_entry): return True if data['last_name'] != get_entry_value(self.last_name_entry): return True if data['initials'] != get_entry_value(self.initials_entry): return True if data['email'] != get_entry_value(self.email_entry): return True if data['home_phone'] != get_entry_value(self.home_phone_entry): return True if data['office_phone'] != get_entry_value(self.office_phone_entry): return True if data['fax'] != get_entry_value(self.fax_entry): return True logger.debug('LibreOffice details do not need to be updated.') return False def get_user_details(self): """Use the various methods to get the most up-to-date version of the user details.""" # Start with LibreOffice, as users may have configured that first. data = self.get_libreoffice_data() # Next is passwd, where we override name values with system values. pwd_data = self.get_passwd_data() data['first_name'] = pwd_data['first_name'] data['last_name'] = pwd_data['last_name'] data['initials'] = pwd_data['initials'] if len(data['home_phone']) == 0: data['home_phone'] = pwd_data['home_phone'] if len(data['office_phone']) == 0: data['office_phone'] = pwd_data['office_phone'] # Then get data from dconf initials = self.settings['initials'] if len(initials) > 0: data['initials'] = initials email = self.settings['email'] if len(data['email']) == 0: data['email'] = email if len(data['fax']) == 0: data['fax'] = self.settings['fax'] # Return all of the finalized information. return data def get_passwd_data(self): """Get user details from passwd""" # Use getent for current user's details. try: line = subprocess.check_output(['getent', 'passwd', username]) if isinstance(line, bytes): line = line.decode('utf-8') line = line.strip() logger.debug('Found details: %s' % line.strip()) details = line.split(':')[4].split(',', 3) while len(details) < 4: details.append("") # Extract the user details name, office, office_phone, home_phone = details except subprocess.CalledProcessError: logger.warning("User %s not found in /etc/passwd. " "Mugshot may not function correctly." % username) office = "" office_phone = "" home_phone = "" # Use GLib to get the actual name. name = GLib.get_real_name() # Expand the user's fullname into first, last, and initials. initials = name[0] try: first_name, last_name = name.split(' ', 1) initials += last_name[0] except: first_name = name last_name = '' # If the variables are defined as 'none', use blank for cleanliness. if home_phone == 'none': home_phone = '' if office_phone == 'none': office_phone = '' # Pack the data data = {'first_name': first_name, 'last_name': last_name, 'home_phone': home_phone, 'office_phone': office_phone, 'initials': initials, 'email': '', 'fax': ''} return data def get_libreoffice_data(self): """Get each of the preferences from the LibreOffice registymodifications preferences file. Return a dict with the details.""" prefs_file = libreoffice_prefs data = {'first_name': '', 'last_name': '', 'initials': '', 'email': '', 'home_phone': '', 'office_phone': '', 'fax': ''} if os.path.isfile(prefs_file): logger.debug('Getting settings from %s' % prefs_file) for line in open(prefs_file): if "UserProfile/Data" in line: try: value = line.split('')[1].split('')[0] except IndexError: continue value = value.strip() # First Name if 'name="givenname"' in line: data['first_name'] = value # Last Name elif 'name="sn"' in line: data['last_name'] = value # Initials elif 'name="initials"' in line: data['initials'] = value # Email elif 'name="mail"' in line: data['email'] = value # Home Phone elif 'name="homephone"' in line: data['home_phone'] = value # Office Phone elif 'name="telephonenumber"' in line: data['office_phone'] = value # Fax Number elif 'name="facsimiletelephonenumber"' in line: data['fax'] = value else: pass return data def set_libreoffice_data(self): """Update the LibreOffice registymodifications preferences file.""" prefs_file = libreoffice_prefs if os.path.isfile(prefs_file): logger.debug('Prompting user to update LibreOffice details.') update_libreoffice = \ get_confirmation_dialog(self, _("Update LibreOffice user details?"), _("Would you also like to update your " "user details in LibreOffice?"), 'libreoffice-startcenter') if update_libreoffice: logger.debug('Confirm: Updating details.') first_name = get_entry_value(self.first_name_entry) first_name_updated = False last_name = get_entry_value(self.last_name_entry) last_name_updated = False initials = get_entry_value(self.initials_entry) initials_updated = False email = get_entry_value(self.email_entry) email_updated = False home_phone = get_entry_value(self.home_phone_entry) home_phone_updated = False office_phone = get_entry_value(self.office_phone_entry) office_phone_updated = False fax = get_entry_value(self.fax_entry) fax_updated = False tmp_buffer = [] for line in open(prefs_file): new = None if "UserProfile/Data" in line: new = line.split('')[0] # First Name if 'name="givenname"' in line: new = new + '%s\n' % \ first_name first_name_updated = True # Last Name elif 'name="sn"' in line: new = new + '%s\n' % \ last_name last_name_updated = True # Initials elif 'name="initials"' in line: new = new + '%s\n' % \ initials initials_updated = True # Email elif 'name="mail"' in line: new = new + '%s\n' % \ email email_updated = True # Home Phone elif 'name="homephone"' in line: new = new + '%s\n' % \ home_phone home_phone_updated = True # Office Phone elif 'name="telephonenumber"' in line: new = new + '%s\n' % \ office_phone office_phone_updated = True # Fax Number elif 'name="facsimiletelephonenumber"' in line: new = new + '%s\n' % \ fax fax_updated = True else: new = line tmp_buffer.append(new) elif '' in line: pass else: tmp_buffer.append(line) open_prefs = open(prefs_file, 'w') for line in tmp_buffer: open_prefs.write(line) if not first_name_updated: string = \ '' '' '%s\n' % first_name open_prefs.write(string) if not last_name_updated: string = \ '' '' '%s\n' % last_name open_prefs.write(string) if not initials_updated: string = \ '' '' '%s\n' % initials open_prefs.write(string) if not email_updated: string = \ '' '' '%s\n' % email open_prefs.write(string) if not home_phone_updated: string = \ '' '' '%s\n' % home_phone open_prefs.write(string) if not office_phone_updated: string = \ '' '' '%s\n' % office_phone open_prefs.write(string) if not fax_updated: string = \ '' '' '%s\n' % fax open_prefs.write(string) open_prefs.write('') open_prefs.close() else: logger.debug('Reject: Not updating.') # = Stock Browser ======================================================= # def on_image_from_stock_activate(self, widget): """When the 'Select image from stock' menu item is clicked, load and display the stock photo browser.""" self.load_stock_browser() self.stock_browser.show_all() def load_stock_browser(self): """Load the stock photo browser.""" # Check if the photos have already been loaded. model = self.iconview.get_model() if len(model) != 0: logger.debug("Stock browser already loaded.") return # If they have not, load each photo from faces_dir. logger.debug("Loading stock browser photos.") for filename in os.listdir(faces_dir): full_path = os.path.join(faces_dir, filename) if os.path.isfile(full_path): pixbuf = GdkPixbuf.Pixbuf.new_from_file(full_path) scaled = pixbuf.scale_simple(90, 90, GdkPixbuf.InterpType.HYPER) model.append([full_path, scaled]) def on_stock_iconview_selection_changed(self, widget): """Enable stock submission only when an item is selected.""" selected_items = self.iconview.get_selected_items() is_sensitive = len(selected_items) > 0 self.builder.get_object('stock_ok').set_sensitive(is_sensitive) def on_stock_browser_delete_event(self, widget, event): """Hide the stock browser instead of deleting it.""" widget.hide() return True def on_stock_cancel_clicked(self, widget): """Hide the stock browser when Cancel is clicked.""" self.stock_browser.hide() def on_stock_ok_clicked(self, widget): """When the stock browser OK button is clicked, get the currently selected photo and set it to the user profile image.""" selected_items = self.iconview.get_selected_items() if len(selected_items) != 0: # Get the filename from the stock browser iconview. path = int(selected_items[0].to_string()) filename = self.iconview.get_model()[path][0] logger.debug("Selected %s" % filename) # Update variables and widgets, then hide. self.set_user_image(filename) self.updated_image = filename self.stock_browser.hide() def on_stock_iconview_item_activated(self, widget, path): """Allow selecting a stock photo with Enter.""" self.on_stock_ok_clicked(widget) # = Image Browser ======================================================= # def on_image_from_browse_activate(self, widget): """Browse for a user profile image.""" # Run the dialog, grab the filename if confirmed, then hide the dialog. response = self.chooser.run() if response == Gtk.ResponseType.APPLY: # Update the user image, store the path for committing later. self.updated_image = helpers.new_tempfile('browse') self.filechooser_preview_pixbuf.savev(self.updated_image, "png", [], []) logger.debug("Selected %s" % self.updated_image) self.set_user_image(self.updated_image) self.chooser.hide() def on_filechooserdialog_update_preview(self, widget): """Update the preview image used in the file chooser.""" filename = widget.get_filename() if not filename: self.file_chooser_preview.set_from_icon_name('folder', 128) return if not os.path.isfile(filename): self.file_chooser_preview.set_from_icon_name('folder', 128) return filechooser_pixbuf = GdkPixbuf.Pixbuf.new_from_file(filename) # Get the image dimensions. height = filechooser_pixbuf.get_height() width = filechooser_pixbuf.get_width() start_x = 0 start_y = 0 if self.crop_center.get_active(): # Calculate a balanced center. if width > height: start_x = (width - height) / 2 width = height else: start_y = (height - width) / 2 height = width elif self.crop_left.get_active(): start_x = 0 if width > height: width = height else: start_y = (height - width) / 2 height = width elif self.crop_right.get_active(): if width > height: start_x = width - height width = height else: start_y = (height - width) / 2 height = width # Create a new cropped pixbuf. self.filechooser_preview_pixbuf = \ filechooser_pixbuf.new_subpixbuf(start_x, start_y, width, height) scaled = self.filechooser_preview_pixbuf.scale_simple( 128, 128, GdkPixbuf.InterpType.HYPER) self.file_chooser_preview.set_from_pixbuf(scaled) def on_crop_changed(self, widget, data=None): """Update the preview image when crop style is modified.""" if widget.get_active(): self.on_filechooserdialog_update_preview(self.chooser) mugshot-0.2.5/data/0000775000175000017500000000000012401206322014005 5ustar seansean00000000000000mugshot-0.2.5/data/appdata/0000775000175000017500000000000012401206322015417 5ustar seansean00000000000000mugshot-0.2.5/data/appdata/mugshot.appdata.xml.in0000664000175000017500000000703312401206244021653 0ustar seansean00000000000000 mugshot.desktop CC0-1.0 GPL-3.0+ Mugshot <_summary>Lightweight user configuration <_p> Mugshot enables users to easily update personal contact information. With Mugshot, users are able to:
    <_li>Set the account photo displayed at login and optionally synchronize this photo with their Pidgin buddy icon <_li>Set account details stored in /etc/passwd (usable with the finger command) and optionally synchronize with their LibreOffice contact information
http://screenshots.smdavis.us/mugshot/mugshot.png http://screenshots.smdavis.us/mugshot/mugshot-pidgin-sync.png https://launchpad.net/mugshot/ https://bugs.launchpad.net/mugshot/ http://wiki.smdavis.us/doku.php?id=mugshot-docs smd-seandavis@ubuntu.com mugshot <_p>This stable release improves Mugshot functionality for LDAP users, and includes the latest SudoDialog, improving the appearance and usability of the password dialog. <_p>This stable release improves the user configuration (chfn) backend and prevents Mugshot from locking up. Mugshot also no longer depends on AccountsService, but can leverage it to better support some systems. A critical bug that prevented some users from starting Mugshot was also addressed. <_p>This stable release improved AccountsService functionality and overall usability. Users without admin rights can no longer attempt to change their name, and initials are automatically populated when the name is entered. <_p>This stable release fixed a crash that occured when saving user details in a non-English locale. This release also included an updated translation template and new translations. <_p>This stable release fixed several bugs related to profile image management, introduced an improved password dialog, and transitioned to using GLib to more reliably determine user and environment settings. <_p>The first stable release introduced simplified packaging, replaced the Help functionality with the online help documents, and transitioned to using Python 3.
mugshot-0.2.5/data/appdata/mugshot.appdata.xml0000664000175000017500000001073312401206322021244 0ustar seansean00000000000000 mugshot.desktop CC0-1.0 GPL-3.0+ Mugshot Lightweight user configuration Einfache Nutzerkonfiguration

Mugshot enables users to easily update personal contact information. With Mugshot, users are able to:

  • Set the account photo displayed at login and optionally synchronize this photo with their Pidgin buddy icon
  • Das Profil-Photo, das beim Login angezeigt wird, einstellen und es optional mit dem Pidgin buddy icon synchronisieren.
  • Set account details stored in /etc/passwd (usable with the finger command) and optionally synchronize with their LibreOffice contact information
  • Nutzerkonto-Details, die in /etc/passwd gespeichert werden verändern und optional mit den LibreOffice Kontaktinformationen synchronisieren.
http://screenshots.smdavis.us/mugshot/mugshot.png http://screenshots.smdavis.us/mugshot/mugshot-pidgin-sync.png https://launchpad.net/mugshot/ https://bugs.launchpad.net/mugshot/ http://wiki.smdavis.us/doku.php?id=mugshot-docs smd-seandavis@ubuntu.com mugshot

This stable release improves Mugshot functionality for LDAP users, and includes the latest SudoDialog, improving the appearance and usability of the password dialog.

Dieser stabile Release verbessert die LDAP Funktionalität und beinhaltet den aktuellsten SudoDialog, wodurch das Erscheinungsbild und die Nutzerfreundlichkeit des Passwort-Dialogs verbessert wird.

This stable release improves the user configuration (chfn) backend and prevents Mugshot from locking up. Mugshot also no longer depends on AccountsService, but can leverage it to better support some systems. A critical bug that prevented some users from starting Mugshot was also addressed.

Dieser stabile Release verbessert die Benutzerkonfiguration (chfn) und verhindert, dass Mugshot abstürzt. Mugshot hängt nun nicht mehr von AccountsService ab, kann es aber besser zur Unterstützung von bestimmten System einsetzen. Ein kritischer Fehler, der manche Nutzer am Start von Mugshot hinderte ist ebenso behoben.

This stable release improved AccountsService functionality and overall usability. Users without admin rights can no longer attempt to change their name, and initials are automatically populated when the name is entered.

Dieser stabile Release verbessert die AccountsService Funktionalität und die allgemeine Nutzerfreundlichkeit. Anwender ohne Administrator-Rechte können ihren Namen nicht mehr ändern und die Initialen werden automatisch ergänzt, wenn der Name eingegeben wurde.

This stable release fixed a crash that occured when saving user details in a non-English locale. This release also included an updated translation template and new translations.

This stable release fixed several bugs related to profile image management, introduced an improved password dialog, and transitioned to using GLib to more reliably determine user and environment settings.

The first stable release introduced simplified packaging, replaced the Help functionality with the online help documents, and transitioned to using Python 3.

mugshot-0.2.5/data/ui/0000775000175000017500000000000012401206322014422 5ustar seansean00000000000000mugshot-0.2.5/data/ui/CameraMugshotDialog.ui0000664000175000017500000001211412401206244020642 0ustar seansean00000000000000 230 300 False Capture - Mugshot False 230 300 mugshot normal True False vertical 12 True False True True center gtk-cancel True False True True False True 0 gtk-media-record True False False True True False True 1 True gtk-apply True False False True True False True 2 False True end 0 True False vertical True True 1 camera_cancel camera_record camera_apply mugshot-0.2.5/data/ui/MugshotWindow.ui0000664000175000017500000011646112401206244017613 0ustar seansean00000000000000 True False vertical 12 True False 0 none True False 12 128 128 True False 64 image-loading True False <b>Preview</b> True False True 0 True False 0 none True False 12 True False vertical Center True False False 0 True True False True 0 Left True False False 0 True True crop_center False True 1 Right True False False 0 True True crop_center False True 2 True False <b>Crop</b> True False True 1 True False 16 insert-image True False 16 camera-photo True False 16 document-open True False Select from stock… True False image1 False Capture from camera… True False image2 False Browse… True False image3 False True False gtk-remove True False True True False Mugshot False mugshot True False 12 vertical True False 12 128 128 True True True half True False 128 avatar-default False False 0 True False vertical 6 True False 6 True False 0 none True False 2 True True name True False <b>First Name</b> True True True 0 True False 0 none True False 2 True True name True False <b>Last Name</b> True True True 1 True False 0 none True False 2 True True 4 4 alpha True False <b>Initials</b> True False True 2 False True 0 True False 6 True True False 0 none True False 2 True True phone True False <b>Home Phone</b> True True True 0 True False 0 none True False 2 True True email True False <b>Email Address</b> True False True 1 False True 1 True False 6 True True False 0 none True False 2 True True phone True False <b>Office Phone</b> True True True 0 True False 0 none True False 2 True True True phone True False <b>Fax</b> True False True 1 False True 2 True True 2 False True 0 True False 12 6 end gtk-help True True True True False True 0 True gtk-cancel True True True True False True 1 gtk-apply True True True True True True False True 2 False True end 2 False 5 Select a photo… GtkFileChooserDialog True mugshot dialog mugshot_window False False box8 False False vertical 2 False end gtk-cancel True False True True False True 0 gtk-apply True True True True True True False True 1 False True end 0 button1 button2 False Select a photo… True center-on-parent 600 480 True mugshot dialog mugshot_window True False 12 vertical 12 True False in True True 0 liststore1 1 True True 0 True False gtk-cancel True True False True False True 0 gtk-ok True False True True True False True 1 False True end 1 mugshot-0.2.5/data/ui/camera_mugshot_dialog.xml0000664000175000017500000000061512401206244021466 0ustar seansean00000000000000 mugshot-0.2.5/data/ui/mugshot_window.xml0000664000175000017500000000055512401206244020231 0ustar seansean00000000000000 mugshot-0.2.5/data/glib-2.0/0000775000175000017500000000000012401206322015217 5ustar seansean00000000000000mugshot-0.2.5/data/glib-2.0/schemas/0000775000175000017500000000000012401206322016642 5ustar seansean00000000000000mugshot-0.2.5/data/glib-2.0/schemas/apps.mugshot.gschema.xml0000664000175000017500000000122112401206244023421 0ustar seansean00000000000000 '' Initials Initials representing the user's name. '' Email Address The user's email address. '' Fax The user's fax number. mugshot-0.2.5/data/media/0000775000175000017500000000000012401206322015064 5ustar seansean00000000000000mugshot-0.2.5/data/media/mugshot_22.svg0000664000175000017500000014234012401206244017605 0ustar seansean00000000000000 image/svg+xml 1829102 mugshot-0.2.5/data/media/mugshot.svg0000664000175000017500000013152412401206244017304 0ustar seansean00000000000000 image/svg+xml 1829102 mugshot-0.2.5/data/media/mugshot_24.svg0000664000175000017500000014444612401206244017620 0ustar seansean00000000000000 image/svg+xml 1829102 mugshot-0.2.5/data/media/mugshot_16.svg0000664000175000017500000014273212401206244017615 0ustar seansean00000000000000 image/svg+xml 1829102 mugshot-0.2.5/data/media/mugshot_48.svg0000664000175000017500000015210612401206244017616 0ustar seansean00000000000000 image/svg+xml 1829102 mugshot-0.2.5/data/media/mugshot_64.svg0000664000175000017500000013152412401206244017615 0ustar seansean00000000000000 image/svg+xml 1829102 mugshot-0.2.5/PKG-INFO0000664000175000017500000000135012401206322014170 0ustar seansean00000000000000Metadata-Version: 1.1 Name: mugshot Version: 0.2.5 Summary: lightweight user configuration utility Home-page: https://launchpad.net/mugshot Author: Sean Davis Author-email: smd.seandavis@gmail.com License: GPL-3+ Description: A lightweight user configuration utility. It allows you to easily set profile image and user details for your user profile and any supported applications. Platform: UNKNOWN Requires: cairo Requires: dbus Requires: gi Requires: gi.repository.GLib Requires: gi.repository.GObject Requires: gi.repository.GdkPixbuf Requires: gi.repository.GdkX11 Requires: gi.repository.Gio Requires: gi.repository.Gst Requires: gi.repository.GstVideo Requires: gi.repository.Gtk Requires: pexpect Provides: mugshot Provides: mugshot_lib mugshot-0.2.5/mugshot_lib/0000775000175000017500000000000012401206322015410 5ustar seansean00000000000000mugshot-0.2.5/mugshot_lib/helpers.py0000664000175000017500000001105712401206244017433 0ustar seansean00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Mugshot - Lightweight user configuration utility # Copyright (C) 2013-2014 Sean Davis # # 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 warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . """Helpers for an Ubuntu application.""" import logging import os import tempfile from . mugshotconfig import get_data_file from . Builder import Builder def get_builder(builder_file_name): """Return a fully-instantiated Gtk.Builder instance from specified ui file :param builder_file_name: The name of the builder file, without extension. Assumed to be in the 'ui' directory under the data path. """ # Look for the ui file that describes the user interface. ui_filename = get_data_file('ui', '%s.ui' % (builder_file_name,)) if not os.path.exists(ui_filename): ui_filename = None builder = Builder() builder.set_translation_domain('mugshot') builder.add_from_file(ui_filename) return builder def get_media_file(media_file_name): """Retrieve the filename for the specified file.""" media_filename = get_data_file('media', '%s' % (media_file_name,)) if not os.path.exists(media_filename): media_filename = None return "file:///" + media_filename class NullHandler(logging.Handler): """Handle NULL""" def emit(self, record): """Do not emit anything.""" pass def set_up_logging(opts): """Set up the logging formatter.""" # add a handler to prevent basicConfig root = logging.getLogger() null_handler = NullHandler() root.addHandler(null_handler) formatter = logging.Formatter("%(levelname)s:%(name)s:" " %(funcName)s() '%(message)s'") logger = logging.getLogger('mugshot') logger_sh = logging.StreamHandler() logger_sh.setFormatter(formatter) logger.addHandler(logger_sh) lib_logger = logging.getLogger('mugshot_lib') lib_logger_sh = logging.StreamHandler() lib_logger_sh.setFormatter(formatter) lib_logger.addHandler(lib_logger_sh) # Set the logging level to show debug messages. if opts.verbose: logger.setLevel(logging.DEBUG) logger.debug('logging enabled') if opts.verbose > 1: lib_logger.setLevel(logging.DEBUG) def show_uri(parent, link): """Open the URI.""" from gi.repository import Gtk # pylint: disable=E0611 screen = parent.get_screen() Gtk.show_uri(screen, link, Gtk.get_current_event_time()) def alias(alternative_function_name): '''see http://www.drdobbs.com/web-development/184406073#l9''' def decorator(function): '''attach alternative_function_name(s) to function''' if not hasattr(function, 'aliases'): function.aliases = [] function.aliases.append(alternative_function_name) return function return decorator # = Temporary File Management ============================================ # temporary_files = {} def new_tempfile(identifier): """Create a new temporary file, register it, and return the filename.""" remove_tempfile(identifier) temporary_file = tempfile.NamedTemporaryFile(delete=False) temporary_file.close() filename = temporary_file.name temporary_files[identifier] = filename return filename def get_tempfile(identifier): """Retrieve the specified temporary filename.""" if identifier in list(temporary_files.keys()): return temporary_files[identifier] return None def remove_tempfile(identifier): """Remove the specified temporary file from the system.""" if identifier in list(temporary_files.keys()): filename = temporary_files[identifier] if os.path.isfile(filename): os.remove(filename) temporary_files.pop(identifier) def clear_tempfiles(): """Remove all temporary files registered to Mugshot.""" for identifier in list(temporary_files.keys()): remove_tempfile(identifier) mugshot-0.2.5/mugshot_lib/mugshotconfig.py0000664000175000017500000000426112401206244020644 0ustar seansean00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Mugshot - Lightweight user configuration utility # Copyright (C) 2013-2014 Sean Davis # # 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 warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . __all__ = [ 'project_path_not_found', 'get_data_file', 'get_data_path', ] # Where your project will look for your data (for instance, images and ui # files). By default, this is ../data, relative your trunk layout __mugshot_data_directory__ = '../data/' __license__ = 'GPL-3+' __version__ = '0.2.5' import os class project_path_not_found(Exception): """Raised when we can't find the project directory.""" def get_data_file(*path_segments): """Get the full path to a data file. Returns the path to a file underneath the data directory (as defined by `get_data_path`). Equivalent to os.path.join(get_data_path(), *path_segments). """ return os.path.join(get_data_path(), *path_segments) def get_data_path(): """Retrieve mugshot data path This path is by default /../data/ in trunk and /usr/share/mugshot in an installed version but this path is specified at installation time. """ # Get pathname absolute or relative. path = os.path.join( os.path.dirname(__file__), __mugshot_data_directory__) abs_data_path = os.path.abspath(path) if not os.path.exists(abs_data_path): raise project_path_not_found return abs_data_path def get_version(): """Return the program version.""" return __version__ mugshot-0.2.5/mugshot_lib/__init__.py0000664000175000017500000000213612401206244017526 0ustar seansean00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Mugshot - Lightweight user configuration utility # Copyright (C) 2013-2014 Sean Davis # # 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 warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . '''facade - makes mugshot_lib package easy to refactor while keeping its api constant''' # lint:disable from . helpers import set_up_logging from . Window import Window from . mugshotconfig import get_version # lint:enable mugshot-0.2.5/mugshot_lib/CameraDialog.py0000664000175000017500000000442212401206244020277 0ustar seansean00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Mugshot - Lightweight user configuration utility # Copyright (C) 2013-2014 Sean Davis # # 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 warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . from gi.repository import Gtk # pylint: disable=E0611 import logging logger = logging.getLogger('mugshot_lib') from . helpers import get_builder class CameraDialog(Gtk.Dialog): """Camera Dialog""" __gtype_name__ = "CameraDialog" def __new__(cls): """Special static method that's automatically called by Python when constructing a new instance of this class. Returns a fully instantiated PreferencesDialog object. """ builder = get_builder('CameraMugshotDialog') new_object = builder.get_object("camera_mugshot_dialog") new_object.finish_initializing(builder) return new_object def finish_initializing(self, builder): """Called while initializing this instance in __new__ finish_initalizing should be called after parsing the ui definition and creating a PreferencesDialog object with it in order to finish initializing the start of the new PerferencesMugshotDialog instance. Put your initialization code in here and leave __init__ undefined. """ # Get a reference to the builder and set up the signals. self.builder = builder self.ui = builder.get_ui(self, True) # code for other initialization actions should be added here def on_btn_close_clicked(self, widget, data=None): """Destroy the dialog when closed.""" self.destroy() mugshot-0.2.5/mugshot_lib/Builder.py0000664000175000017500000002672612401206244017370 0ustar seansean00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Mugshot - Lightweight user configuration utility # Copyright (C) 2013-2014 Sean Davis # # 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 warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . '''Enhances builder connections, provides object to access glade objects''' from gi.repository import GObject, Gtk # pylint: disable=E0611 import inspect import functools import logging logger = logging.getLogger('mugshot_lib') from xml.etree.cElementTree import ElementTree # this module is big so uses some conventional prefixes and postfixes # *s list, except self.widgets is a dictionary # *_dict dictionary # *name string # ele_* element in a ElementTree # pylint: disable=R0904 # the many public methods is a feature of Gtk.Builder class Builder(Gtk.Builder): ''' extra features connects glade defined handler to default_handler if necessary auto connects widget to handler with matching name or alias auto connects several widgets to a handler via multiple aliases allow handlers to lookup widget name logs every connection made, and any on_* not made ''' def __init__(self): """Initialize the builder.""" Gtk.Builder.__init__(self) self.widgets = {} self.glade_handler_dict = {} self.connections = [] self._reverse_widget_dict = {} # pylint: disable=R0201 # this is a method so that a subclass of Builder can redefine it def default_handler(self, handler_name, filename, *args, **kwargs): '''helps the apprentice guru glade defined handlers that do not exist come here instead. An apprentice guru might wonder which signal does what he wants, now he can define any likely candidates in glade and notice which ones get triggered when he plays with the project. this method does not appear in Gtk.Builder''' logger.debug('''tried to call non-existent function:%s() expected in %s args:%s kwargs:%s''', handler_name, filename, args, kwargs) # pylint: enable=R0201 def get_name(self, widget): ''' allows a handler to get the name (id) of a widget this method does not appear in Gtk.Builder''' return self._reverse_widget_dict.get(widget) def add_from_file(self, filename): '''parses xml file and stores wanted details''' Gtk.Builder.add_from_file(self, filename) # extract data for the extra interfaces tree = ElementTree() tree.parse(filename) ele_widgets = tree.getiterator("object") for ele_widget in ele_widgets: name = ele_widget.attrib['id'] widget = self.get_object(name) # populate indexes - a dictionary of widgets self.widgets[name] = widget # populate a reversed dictionary self._reverse_widget_dict[widget] = name # populate connections list ele_signals = ele_widget.findall("signal") connections = [ (name, ele_signal.attrib['name'], ele_signal.attrib['handler']) for ele_signal in ele_signals] if connections: self.connections.extend(connections) ele_signals = tree.getiterator("signal") for ele_signal in ele_signals: self.glade_handler_dict.update( {ele_signal.attrib["handler"]: None}) def connect_signals(self, callback_obj): '''connect the handlers defined in glade reports successful and failed connections and logs call to missing handlers''' filename = inspect.getfile(callback_obj.__class__) callback_handler_dict = dict_from_callback_obj(callback_obj) connection_dict = {} connection_dict.update(self.glade_handler_dict) connection_dict.update(callback_handler_dict) for item in list(connection_dict.items()): if item[1] is None: # the handler is missing so reroute to default_handler handler = functools.partial( self.default_handler, item[0], filename) connection_dict[item[0]] = handler # replace the run time warning logger.warn("expected handler '%s' in %s", item[0], filename) # connect glade define handlers Gtk.Builder.connect_signals(self, connection_dict) # let's tell the user how we applied the glade design for connection in self.connections: widget_name, signal_name, handler_name = connection logger.debug("connect builder by design '%s', '%s', '%s'", widget_name, signal_name, handler_name) def get_ui(self, callback_obj=None, by_name=True): '''Creates the ui object with widgets as attributes connects signals by 2 methods this method does not appear in Gtk.Builder''' result = UiFactory(self.widgets) # Hook up any signals the user defined in glade if callback_obj is not None: # connect glade define handlers self.connect_signals(callback_obj) if by_name: auto_connect_by_name(callback_obj, self) return result # pylint: disable=R0903 # this class deliberately does not provide any public interfaces # apart from the glade widgets class UiFactory(): ''' provides an object with attributes as glade widgets''' def __init__(self, widget_dict): """Initialize the UiFactory.""" self._widget_dict = widget_dict for (widget_name, widget) in list(widget_dict.items()): setattr(self, widget_name, widget) # Mangle any non-usable names (like with spaces or dashes) # into pythonic ones cannot_message = """cannot bind ui.%s, name already exists consider using a pythonic name instead of design name '%s'""" consider_message = """consider using a pythonic name instead of design name '%s'""" for (widget_name, widget) in list(widget_dict.items()): pyname = make_pyname(widget_name) if pyname != widget_name: if hasattr(self, pyname): logger.debug(cannot_message, pyname, widget_name) else: logger.debug(consider_message, widget_name) setattr(self, pyname, widget) def iterator(): '''Support 'for o in self' ''' return iter(list(widget_dict.values())) setattr(self, '__iter__', iterator) def __getitem__(self, name): 'access as dictionary where name might be non-pythonic' return self._widget_dict[name] # pylint: enable=R0903 def make_pyname(name): ''' mangles non-pythonic names into pythonic ones''' pyname = '' for character in name: if (character.isalpha() or character == '_' or (pyname and character.isdigit())): pyname += character else: pyname += '_' return pyname # Until bug https://bugzilla.gnome.org/show_bug.cgi?id=652127 is fixed, we # need to reimplement inspect.getmembers. GObject introspection doesn't # play nice with it. def getmembers(obj, check): """Reimplementation of getmembers""" members = [] for k in dir(obj): try: attr = getattr(obj, k) except: continue if check(attr): members.append((k, attr)) members.sort() return members def dict_from_callback_obj(callback_obj): '''a dictionary interface to callback_obj''' methods = getmembers(callback_obj, inspect.ismethod) aliased_methods = [x[1] for x in methods if hasattr(x[1], 'aliases')] # a method may have several aliases # ~ @alias('on_btn_foo_clicked') # ~ @alias('on_tool_foo_activate') # ~ on_menu_foo_activate(): # ~ pass alias_groups = [(x.aliases, x) for x in aliased_methods] aliases = [] for item in alias_groups: for alias in item[0]: aliases.append((alias, item[1])) dict_methods = dict(methods) dict_aliases = dict(aliases) results = {} results.update(dict_methods) results.update(dict_aliases) return results def auto_connect_by_name(callback_obj, builder): '''finds handlers like on__ and connects them i.e. find widget,signal pair in builder and call widget.connect(signal, on__)''' callback_handler_dict = dict_from_callback_obj(callback_obj) for item in list(builder.widgets.items()): (widget_name, widget) = item signal_ids = [] try: widget_type = type(widget) while widget_type: signal_ids.extend(GObject.signal_list_ids(widget_type)) widget_type = GObject.type_parent(widget_type) except RuntimeError: # pylint wants a specific error pass signal_names = [GObject.signal_name(sid) for sid in signal_ids] # Now, automatically find any the user didn't specify in glade for sig in signal_names: # using convention suggested by glade sig = sig.replace("-", "_") handler_names = ["on_%s_%s" % (widget_name, sig)] # Using the convention that the top level window is not # specified in the handler name. That is use # on_destroy() instead of on_windowname_destroy() if widget is callback_obj: handler_names.append("on_%s" % sig) do_connect(item, sig, handler_names, callback_handler_dict, builder.connections) log_unconnected_functions(callback_handler_dict, builder.connections) def do_connect(item, signal_name, handler_names, callback_handler_dict, connections): '''connect this signal to an unused handler''' widget_name, widget = item for handler_name in handler_names: target = handler_name in list(callback_handler_dict.keys()) connection = (widget_name, signal_name, handler_name) duplicate = connection in connections if target and not duplicate: widget.connect(signal_name, callback_handler_dict[handler_name]) connections.append(connection) logger.debug("connect builder by name '%s','%s', '%s'", widget_name, signal_name, handler_name) def log_unconnected_functions(callback_handler_dict, connections): '''log functions like on_* that we could not connect''' connected_functions = [x[2] for x in connections] handler_names = list(callback_handler_dict.keys()) unconnected = [x for x in handler_names if x.startswith('on_')] for handler_name in connected_functions: try: unconnected.remove(handler_name) except ValueError: pass for handler_name in unconnected: logger.debug("Not connected to builder '%s'", handler_name) mugshot-0.2.5/mugshot_lib/SudoDialog.py0000664000175000017500000002671512401206244020032 0ustar seansean00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Mugshot - Lightweight user configuration utility # Copyright (C) 2013-2014 Sean Davis # # 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 warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . from gi.repository import Gtk, GdkPixbuf import os from locale import gettext as _ import pexpect gtk_version = (Gtk.get_major_version(), Gtk.get_minor_version(), Gtk.get_micro_version()) def check_gtk_version(major_version, minor_version, micro=0): """Return true if running gtk >= requested version""" return gtk_version >= (major_version, minor_version, micro) # Check if the LANG variable needs to be set use_env = False def check_dependencies(commands=[]): """Check for the existence of required commands, and sudo access""" # Check for sudo if pexpect.which("sudo") is None: return False # Check for required commands for command in commands: if pexpect.which(command) is None: return False # Check for LANG requirements child = env_spawn('sudo -v', 1) if child.expect([".*ssword.*", "Sorry", pexpect.EOF, pexpect.TIMEOUT]) == 3: global use_env use_env = True child.close() # Check for sudo rights child = env_spawn('sudo -v', 1) try: index = child.expect([".*ssword.*", "Sorry", pexpect.EOF, pexpect.TIMEOUT]) child.close() if index == 0 or index == 2: # User in sudoers, or already admin return True elif index == 1 or index == 3: # User not in sudoers return False except: # Something else went wrong. child.close() return False def env_spawn(command, timeout): """Use pexpect.spawn, adapt for timeout and env requirements.""" env = os.environ env["LANG"] = "C" if use_env: child = pexpect.spawn(command, env) else: child = pexpect.spawn(command) child.timeout = timeout return child class SudoDialog(Gtk.Dialog): ''' Creates a new SudoDialog. This is a replacement for using gksudo which provides additional flexibility when performing sudo commands. Only used to verify password by issuing 'sudo /bin/true'. Keyword arguments: - parent: Optional parent Gtk.Window - icon: Optional icon name or path to image file. - message: Optional message to be displayed instead of the defaults. - name: Optional name to be displayed, for when message is not used. - retries: Optional maximum number of password attempts. -1 is unlimited. Signals emitted by run(): - NONE: Dialog closed. - CANCEL: Dialog cancelled. - REJECT: Password invalid. - ACCEPT: Password valid. ''' def __init__(self, title=None, parent=None, icon=None, message=None, name=None, retries=-1): """Initialize the SudoDialog.""" # initialize the dialog super(SudoDialog, self).__init__(title=title, transient_for=parent, modal=True, destroy_with_parent=True) # self.connect("show", self.on_show) if title is None: title = _("Password Required") self.set_title(title) self.set_border_width(5) # Content Area content_area = self.get_content_area() grid = Gtk.Grid.new() grid.set_row_spacing(6) grid.set_column_spacing(12) grid.set_margin_left(5) grid.set_margin_right(5) content_area.add(grid) # Icon self.dialog_icon = Gtk.Image.new_from_icon_name("dialog-password", Gtk.IconSize.DIALOG) grid.attach(self.dialog_icon, 0, 0, 1, 2) # Text self.primary_text = Gtk.Label.new("") self.primary_text.set_use_markup(True) self.primary_text.set_halign(Gtk.Align.START) self.secondary_text = Gtk.Label.new("") self.secondary_text.set_use_markup(True) self.secondary_text.set_halign(Gtk.Align.START) self.secondary_text.set_margin_top(6) grid.attach(self.primary_text, 1, 0, 1, 1) grid.attach(self.secondary_text, 1, 1, 1, 1) # Infobar self.infobar = Gtk.InfoBar.new() self.infobar.set_margin_top(12) self.infobar.set_message_type(Gtk.MessageType.WARNING) content_area = self.infobar.get_content_area() infobar_icon = Gtk.Image.new_from_icon_name("dialog-warning", Gtk.IconSize.BUTTON) label = Gtk.Label.new(_("Incorrect password... try again.")) content_area.add(infobar_icon) content_area.add(label) grid.attach(self.infobar, 0, 2, 2, 1) content_area.show_all() self.infobar.set_no_show_all(True) # Password label = Gtk.Label.new("") label.set_use_markup(True) label.set_markup("%s" % _("Password:")) label.set_halign(Gtk.Align.START) label.set_margin_top(12) self.password_entry = Gtk.Entry() self.password_entry.set_visibility(False) self.password_entry.set_activates_default(True) self.password_entry.set_margin_top(12) grid.attach(label, 0, 3, 1, 1) grid.attach(self.password_entry, 1, 3, 1, 1) # Buttons button = self.add_button(_("Cancel"), Gtk.ResponseType.CANCEL) button_box = button.get_parent() button_box.set_margin_top(24) ok_button = Gtk.Button.new_with_label(_("OK")) ok_button.connect("clicked", self.on_ok_clicked) ok_button.set_receives_default(True) ok_button.set_can_default(True) ok_button.set_sensitive(False) self.set_default(ok_button) if check_gtk_version(3, 12): button_box.pack_start(ok_button, True, True, 0) else: button_box.pack_start(ok_button, False, False, 0) self.password_entry.connect("changed", self.on_password_changed, ok_button) self.set_dialog_icon(icon) # add primary and secondary text if message: primary_text = message secondary_text = None else: primary_text = _("Enter your password to\n" "perform administrative tasks.") secondary_text = _("The application '%s' lets you\n" "modify essential parts of your system." % name) self.format_primary_text(primary_text) self.format_secondary_text(secondary_text) self.attempted_logins = 0 self.max_attempted_logins = retries self.show_all() def on_password_changed(self, widget, button): """Set the apply button sensitivity based on password input.""" button.set_sensitive(len(widget.get_text()) > 0) def format_primary_text(self, message_format): ''' Format the primary text widget. ''' self.primary_text.set_markup("%s" % message_format) def format_secondary_text(self, message_format): ''' Format the secondary text widget. ''' self.secondary_text.set_markup(message_format) def set_dialog_icon(self, icon=None): ''' Set the icon for the dialog. If the icon variable is an absolute path, the icon is from an image file. Otherwise, set the icon from an icon name. ''' # default icon size is dialog. icon_size = Gtk.IconSize.DIALOG if icon: if os.path.isfile(os.path.abspath(icon)): # icon is a filename, so load it into a pixbuf to an image pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(icon, icon_size, icon_size) self.dialog_icon.set_from_pixbuf(pixbuf) self.set_icon_from_file(icon) else: # icon is an named icon, so load it directly to an image self.dialog_icon.set_from_icon_name(icon, icon_size) self.set_icon_name(icon) else: # fallback on password icon self.dialog_icon.set_from_icon_name('dialog-password', icon_size) self.set_icon_name('dialog-password') def on_show(self, widget): '''When the dialog is displayed, clear the password.''' self.set_password('') self.password_valid = False def on_ok_clicked(self, widget): ''' When the OK button is clicked, attempt to use sudo with the currently entered password. If successful, emit the response signal with ACCEPT. If unsuccessful, try again until reaching maximum attempted logins, then emit the response signal with REJECT. ''' if self.attempt_login(): self.password_valid = True self.emit("response", Gtk.ResponseType.ACCEPT) else: self.password_valid = False # Adjust the dialog for attactiveness. self.infobar.show() self.password_entry.grab_focus() if self.attempted_logins == self.max_attempted_logins: self.attempted_logins = 0 self.emit("response", Gtk.ResponseType.REJECT) def get_password(self): '''Return the currently entered password, or None if blank.''' if not self.password_valid: return None password = self.password_entry.get_text() if password == '': return None return password def set_password(self, text=None): '''Set the password entry to the defined text.''' if text is None: text = '' self.password_entry.set_text(text) self.password_valid = False def attempt_login(self): ''' Try to use sudo with the current entered password. Return True if successful. ''' # Set the pexpect variables and spawn the process. child = env_spawn('sudo /bin/true', 1) try: # Check for password prompt or program exit. child.expect([".*ssword.*", pexpect.EOF]) child.sendline(self.password_entry.get_text()) child.expect(pexpect.EOF) except pexpect.TIMEOUT: # If we timeout, that means the password was unsuccessful. pass # Close the child process if it is still open. child.close() # Exit status 0 means success, anything else is an error. if child.exitstatus == 0: self.attempted_logins = 0 return True else: self.attempted_logins += 1 return False mugshot-0.2.5/mugshot_lib/Window.py0000664000175000017500000000754012401206244017242 0ustar seansean00000000000000#!/usr/bin/python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Mugshot - Lightweight user configuration utility # Copyright (C) 2013-2014 Sean Davis # # 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 warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . from gi.repository import Gio, Gtk # pylint: disable=E0611 import logging logger = logging.getLogger('mugshot_lib') import os from . helpers import get_builder, show_uri class Window(Gtk.Window): """This class is meant to be subclassed by MugshotWindow. It provides common functions and some boilerplate.""" __gtype_name__ = "Window" # To construct a new instance of this method, the following notable # methods are called in this order: # __new__(cls) # __init__(self) # finish_initializing(self, builder) # __init__(self) # # For this reason, it's recommended you leave __init__ empty and put # your initialization code in finish_initializing def __new__(cls): """Special static method that's automatically called by Python when constructing a new instance of this class. Returns a fully instantiated BaseMugshotWindow object. """ builder = get_builder('MugshotWindow') new_object = builder.get_object("mugshot_window") new_object.finish_initializing(builder) return new_object def finish_initializing(self, builder): """Called while initializing this instance in __new__ finish_initializing should be called after parsing the UI definition and creating a MugshotWindow object with it in order to finish initializing the start of the new MugshotWindow instance. """ # Get a reference to the builder and set up the signals. self.builder = builder self.ui = builder.get_ui(self, True) self.CameraDialog = None # class self.camera_dialog = None # instance self.settings = Gio.Settings.new("apps.mugshot") self.settings.connect('changed', self.on_preferences_changed) def on_help_activate(self, widget, data=None): """Show the Help documentation when Help is clicked.""" show_uri(self, "http://wiki.smdavis.us/doku.php?id=mugshot-docs") def on_menu_camera_activate(self, widget, data=None): """Display the camera window for mugshot.""" if self.camera_dialog is not None: logger.debug('show existing camera_dialog') self.camera_dialog.show() elif self.CameraDialog is not None: logger.debug('create new camera_dialog') self.camera_dialog = self.CameraDialog() # pylint: disable=E1102 self.camera_dialog.connect('apply', self.on_camera_dialog_apply) self.camera_dialog.show() def on_destroy(self, widget, data=None): """Called when the MugshotWindow is closed.""" # Clean up code for saving application state should be added here. if self.tmpfile and os.path.isfile(self.tmpfile.name): os.remove(self.tmpfile.name) Gtk.main_quit() def on_preferences_changed(self, settings, key, data=None): """Log preference updates.""" logger.debug('preference changed: %s = %s' % (key, str(settings.get_value(key)))) mugshot-0.2.5/mugshot.desktop.in0000664000175000017500000000043612401206244016570 0ustar seansean00000000000000[Desktop Entry] _Name=About Me _Comment=Configure your profile image and contact details Categories=GNOME;GTK;Settings;X-GNOME-Settings-Panel;X-GNOME-PersonalSettings;DesktopSettings;X-XFCE; Keywords=Configuration;Profile;User; Exec=mugshot Icon=mugshot Terminal=false Type=Application mugshot-0.2.5/mugshot.10000664000175000017500000000167212401206244014655 0ustar seansean00000000000000.de URL \\$2 \(laURL: \\$1 \(ra\\$3 .. .if \n[.g] .mso www.tmac .TH MUGSHOT "1" "August 2014" "mugshot 0.2" "User Commands" .SH NAME mugshot \- lightweight user configuration utility .SH DESCRIPTION Mugshot is a lightweight user configuration utility. Mugshot allows you to easily set profile image and user details for your user profile and any supported applications. .SH SYNOPSIS .B mugshot [\fIoptions\fR] .SH OPTIONS .TP \fB\-\-version\fR show program's version number and exit .TP \fB\-h\fR, \fB\-\-help\fR show this help message and exit .TP \fB\-v\fR, \fB\-\-verbose\fR Show debug messages (\fB\-vv\fR debugs mugshot_lib also) .SH "SEE ALSO" The full documentation for .B mugshot is maintained online at .URL "http://wiki.smdavis.us/doku.php?id=mugshot-docs" "the authors documentation portal" "." .SH BUGS Please report bugs at .URL "https://bugs.launchpad.net/mugshot" "the Mugshot Bugs page" "." .SH AUTHOR Sean Davis (smd.seandavis@gmail.com)mugshot-0.2.5/po/0000775000175000017500000000000012401206322013512 5ustar seansean00000000000000mugshot-0.2.5/po/pt_BR.po0000664000175000017500000002005012401206244015060 0ustar seansean00000000000000# Brazilian Portuguese translation for mugshot # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the mugshot package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: mugshot\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2014-08-31 21:40-0400\n" "PO-Revision-Date: 2014-03-25 21:36+0000\n" "Last-Translator: Raphael David François \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-09-01 07:34+0000\n" "X-Generator: Launchpad (build 17176)\n" #: ../mugshot.desktop.in.h:1 msgid "About Me" msgstr "Sobre Mim" #: ../mugshot.desktop.in.h:2 msgid "Configure your profile image and contact details" msgstr "Configure sua imagem de perfil e dados da conta" #: ../data/ui/CameraMugshotDialog.ui.h:1 msgid "Capture - Mugshot" msgstr "Captura - Mugshot" #: ../data/ui/MugshotWindow.ui.h:1 msgid "Preview" msgstr "Visualizar" #: ../data/ui/MugshotWindow.ui.h:2 msgid "Center" msgstr "Centralizado" #: ../data/ui/MugshotWindow.ui.h:3 msgid "Left" msgstr "À Esquerda" #: ../data/ui/MugshotWindow.ui.h:4 msgid "Right" msgstr "À Direita" #: ../data/ui/MugshotWindow.ui.h:5 msgid "Crop" msgstr "Cortar" #: ../data/ui/MugshotWindow.ui.h:6 msgid "Select from stock…" msgstr "Escolha uma foto..." #: ../data/ui/MugshotWindow.ui.h:7 msgid "Capture from camera…" msgstr "Câmera..." #: ../data/ui/MugshotWindow.ui.h:8 msgid "Browse…" msgstr "Procurar nos arquivos..." #: ../data/ui/MugshotWindow.ui.h:9 ../mugshot/MugshotWindow.py:588 msgid "Mugshot" msgstr "Mugshot" #: ../data/ui/MugshotWindow.ui.h:10 msgid "First Name" msgstr "Nome" #: ../data/ui/MugshotWindow.ui.h:11 msgid "Last Name" msgstr "Sobrenome" #: ../data/ui/MugshotWindow.ui.h:12 msgid "Initials" msgstr "Iniciais" #: ../data/ui/MugshotWindow.ui.h:13 msgid "Home Phone" msgstr "Telefone Residencial" #: ../data/ui/MugshotWindow.ui.h:14 msgid "Email Address" msgstr "Email" #: ../data/ui/MugshotWindow.ui.h:15 msgid "Office Phone" msgstr "Telefone Comercial" #: ../data/ui/MugshotWindow.ui.h:16 msgid "Fax" msgstr "Fax" #: ../data/ui/MugshotWindow.ui.h:17 msgid "Select a photo…" msgstr "Escolha uma foto..." #: ../mugshot/__init__.py:35 msgid "Show debug messages (-vv debugs mugshot_lib also)" msgstr "Mostrar mensagens de depuração (-vv debugs mugshot_lib also)" #: ../mugshot/CameraMugshotDialog.py:107 #, python-format msgid "Camera failed to load. Devices: %s" msgstr "Falha ao carregar a câmera. Dispositivos: %s" #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:125 msgid "" "Sorry, but your camera\n" "failed to initialize." msgstr "" "Desculpe, sua câmera\n" "falhou ao iniciar." #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:132 msgid "" "Please wait while your\n" "camera is initialized." msgstr "" "Por favor aguarde enquanto\n" "sua câmera é iniciada." #: ../mugshot/CameraMugshotDialog.py:152 msgid "Cannot display camera output. Ignoring play command" msgstr "" #. Set the record button to retry, and disable it until the capture #. finishes. #: ../mugshot/CameraMugshotDialog.py:279 msgid "Retry" msgstr "Repetir" #: ../mugshot/MugshotWindow.py:321 msgid "Authentication cancelled." msgstr "" #: ../mugshot/MugshotWindow.py:324 msgid "Authentication failed." msgstr "" #: ../mugshot/MugshotWindow.py:327 msgid "An error occurred when saving changes." msgstr "" #: ../mugshot/MugshotWindow.py:329 msgid "User details were not updated." msgstr "Informações do usuário não foram atualizadas." #: ../mugshot/MugshotWindow.py:498 msgid "Update Pidgin buddy icon?" msgstr "Atualizar imagem do Pidgin?" #: ../mugshot/MugshotWindow.py:499 msgid "Would you also like to update your Pidgin buddy icon?" msgstr "Gostaria também de atualizar sua imagem do Pidgin?" #: ../mugshot/MugshotWindow.py:589 msgid "Enter your password to change user details." msgstr "Insira sua senha para alterar as informações de usuário." #: ../mugshot/MugshotWindow.py:591 msgid "" "This is a security measure to prevent unwanted updates\n" "to your personal information." msgstr "" "Essa é uma medida de segurança para prevenir mudanças indesejadas\n" "em suas informações pessoais." #: ../mugshot/MugshotWindow.py:796 msgid "Update LibreOffice user details?" msgstr "Atualizar dados de usuário do LibreOffice?" #: ../mugshot/MugshotWindow.py:797 msgid "Would you also like to update your user details in LibreOffice?" msgstr "Gostaria também de atualizar seus dados de usuário no LibreOffice?" #: ../mugshot_lib/SudoDialog.py:122 msgid "Password Required" msgstr "" #: ../mugshot_lib/SudoDialog.py:159 msgid "Incorrect password... try again." msgstr "Senha incorreta... tente novamente." #: ../mugshot_lib/SudoDialog.py:169 msgid "Password:" msgstr "Senha:" #. Buttons #: ../mugshot_lib/SudoDialog.py:180 msgid "Cancel" msgstr "Cancelar" #: ../mugshot_lib/SudoDialog.py:183 msgid "OK" msgstr "OK" #: ../mugshot_lib/SudoDialog.py:204 msgid "" "Enter your password to\n" "perform administrative tasks." msgstr "" "Insira sua senha para\n" "realizar tarefas administrativas." #: ../mugshot_lib/SudoDialog.py:206 #, python-format msgid "" "The application '%s' lets you\n" "modify essential parts of your system." msgstr "" "A aplicação '%s' permite que você\n" "modifique partes essenciais do sistema." #: ../data/appdata/mugshot.appdata.xml.in.h:1 msgid "Lightweight user configuration" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:2 msgid "" "Mugshot enables users to easily update personal contact information. With " "Mugshot, users are able to:" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:3 msgid "" "Set the account photo displayed at login and optionally synchronize this " "photo with their Pidgin buddy icon" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:4 msgid "" "Set account details stored in /etc/passwd (usable with the finger command) " "and optionally synchronize with their LibreOffice contact information" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:5 msgid "" "This stable release improves Mugshot functionality for LDAP users, and " "includes the latest SudoDialog, improving the appearance and usability of " "the password dialog." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:6 msgid "" "This stable release improves the user configuration (chfn) backend and " "prevents Mugshot from locking up. Mugshot also no longer depends on " "AccountsService, but can leverage it to better support some systems. A " "critical bug that prevented some users from starting Mugshot was also " "addressed." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:7 msgid "" "This stable release improved AccountsService functionality and overall " "usability. Users without admin rights can no longer attempt to change their " "name, and initials are automatically populated when the name is entered." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:8 msgid "" "This stable release fixed a crash that occured when saving user details in a " "non-English locale. This release also included an updated translation " "template and new translations." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:9 msgid "" "This stable release fixed several bugs related to profile image management, " "introduced an improved password dialog, and transitioned to using GLib to " "more reliably determine user and environment settings." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:10 msgid "" "The first stable release introduced simplified packaging, replaced the Help " "functionality with the online help documents, and transitioned to using " "Python 3." msgstr "" #~ msgid "Cannot display camera output.Ignoring play command" #~ msgstr "Não é possível mostrar saída da câmera. Ignorando comando play" mugshot-0.2.5/po/en_AU.po0000664000175000017500000001701312401206244015046 0ustar seansean00000000000000# English (Australia) translation for mugshot # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the mugshot package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: mugshot\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2014-08-31 21:40-0400\n" "PO-Revision-Date: 2013-07-19 10:01+0000\n" "Last-Translator: Jackson Doak \n" "Language-Team: English (Australia) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-09-01 07:34+0000\n" "X-Generator: Launchpad (build 17176)\n" #: ../mugshot.desktop.in.h:1 msgid "About Me" msgstr "About Me" #: ../mugshot.desktop.in.h:2 msgid "Configure your profile image and contact details" msgstr "Configure your profile image and contact details" #: ../data/ui/CameraMugshotDialog.ui.h:1 msgid "Capture - Mugshot" msgstr "Capture - Mugshot" #: ../data/ui/MugshotWindow.ui.h:1 msgid "Preview" msgstr "Preview" #: ../data/ui/MugshotWindow.ui.h:2 msgid "Center" msgstr "Centre" #: ../data/ui/MugshotWindow.ui.h:3 msgid "Left" msgstr "Left" #: ../data/ui/MugshotWindow.ui.h:4 msgid "Right" msgstr "Right" #: ../data/ui/MugshotWindow.ui.h:5 msgid "Crop" msgstr "Crop" #: ../data/ui/MugshotWindow.ui.h:6 msgid "Select from stock…" msgstr "Select from stock…" #: ../data/ui/MugshotWindow.ui.h:7 msgid "Capture from camera…" msgstr "Capture from camera…" #: ../data/ui/MugshotWindow.ui.h:8 msgid "Browse…" msgstr "Browse…" #: ../data/ui/MugshotWindow.ui.h:9 ../mugshot/MugshotWindow.py:588 msgid "Mugshot" msgstr "Mugshot" #: ../data/ui/MugshotWindow.ui.h:10 msgid "First Name" msgstr "First Name" #: ../data/ui/MugshotWindow.ui.h:11 msgid "Last Name" msgstr "Last Name" #: ../data/ui/MugshotWindow.ui.h:12 msgid "Initials" msgstr "Initials" #: ../data/ui/MugshotWindow.ui.h:13 msgid "Home Phone" msgstr "Home Phone" #: ../data/ui/MugshotWindow.ui.h:14 msgid "Email Address" msgstr "Email Address" #: ../data/ui/MugshotWindow.ui.h:15 msgid "Office Phone" msgstr "Office Phone" #: ../data/ui/MugshotWindow.ui.h:16 msgid "Fax" msgstr "Fax" #: ../data/ui/MugshotWindow.ui.h:17 msgid "Select a photo…" msgstr "Select a photo…" #: ../mugshot/__init__.py:35 msgid "Show debug messages (-vv debugs mugshot_lib also)" msgstr "Show debug messages (-vv debugs mugshot_lib also)" #: ../mugshot/CameraMugshotDialog.py:107 #, python-format msgid "Camera failed to load. Devices: %s" msgstr "Camera failed to load. Devices: %s" #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:125 msgid "" "Sorry, but your camera\n" "failed to initialize." msgstr "" "Sorry, but your camera\n" "failed to initialise." #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:132 msgid "" "Please wait while your\n" "camera is initialized." msgstr "" "Please wait while your\n" "camera is initialised." #: ../mugshot/CameraMugshotDialog.py:152 msgid "Cannot display camera output. Ignoring play command" msgstr "" #. Set the record button to retry, and disable it until the capture #. finishes. #: ../mugshot/CameraMugshotDialog.py:279 msgid "Retry" msgstr "Retry" #: ../mugshot/MugshotWindow.py:321 msgid "Authentication cancelled." msgstr "" #: ../mugshot/MugshotWindow.py:324 msgid "Authentication failed." msgstr "" #: ../mugshot/MugshotWindow.py:327 msgid "An error occurred when saving changes." msgstr "" #: ../mugshot/MugshotWindow.py:329 msgid "User details were not updated." msgstr "" #: ../mugshot/MugshotWindow.py:498 msgid "Update Pidgin buddy icon?" msgstr "Update Pidgin buddy icon?" #: ../mugshot/MugshotWindow.py:499 msgid "Would you also like to update your Pidgin buddy icon?" msgstr "Would you also like to update your Pidgin buddy icon?" #: ../mugshot/MugshotWindow.py:589 msgid "Enter your password to change user details." msgstr "" #: ../mugshot/MugshotWindow.py:591 msgid "" "This is a security measure to prevent unwanted updates\n" "to your personal information." msgstr "" "This is a security measure to prevent unwanted updates\n" "to your personal information." #: ../mugshot/MugshotWindow.py:796 msgid "Update LibreOffice user details?" msgstr "Update LibreOffice user details?" #: ../mugshot/MugshotWindow.py:797 msgid "Would you also like to update your user details in LibreOffice?" msgstr "Would you also like to update your user details in LibreOffice?" #: ../mugshot_lib/SudoDialog.py:122 msgid "Password Required" msgstr "" #: ../mugshot_lib/SudoDialog.py:159 msgid "Incorrect password... try again." msgstr "" #: ../mugshot_lib/SudoDialog.py:169 msgid "Password:" msgstr "Password:" #. Buttons #: ../mugshot_lib/SudoDialog.py:180 msgid "Cancel" msgstr "" #: ../mugshot_lib/SudoDialog.py:183 msgid "OK" msgstr "" #: ../mugshot_lib/SudoDialog.py:204 msgid "" "Enter your password to\n" "perform administrative tasks." msgstr "" #: ../mugshot_lib/SudoDialog.py:206 #, python-format msgid "" "The application '%s' lets you\n" "modify essential parts of your system." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:1 msgid "Lightweight user configuration" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:2 msgid "" "Mugshot enables users to easily update personal contact information. With " "Mugshot, users are able to:" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:3 msgid "" "Set the account photo displayed at login and optionally synchronize this " "photo with their Pidgin buddy icon" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:4 msgid "" "Set account details stored in /etc/passwd (usable with the finger command) " "and optionally synchronize with their LibreOffice contact information" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:5 msgid "" "This stable release improves Mugshot functionality for LDAP users, and " "includes the latest SudoDialog, improving the appearance and usability of " "the password dialog." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:6 msgid "" "This stable release improves the user configuration (chfn) backend and " "prevents Mugshot from locking up. Mugshot also no longer depends on " "AccountsService, but can leverage it to better support some systems. A " "critical bug that prevented some users from starting Mugshot was also " "addressed." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:7 msgid "" "This stable release improved AccountsService functionality and overall " "usability. Users without admin rights can no longer attempt to change their " "name, and initials are automatically populated when the name is entered." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:8 msgid "" "This stable release fixed a crash that occured when saving user details in a " "non-English locale. This release also included an updated translation " "template and new translations." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:9 msgid "" "This stable release fixed several bugs related to profile image management, " "introduced an improved password dialog, and transitioned to using GLib to " "more reliably determine user and environment settings." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:10 msgid "" "The first stable release introduced simplified packaging, replaced the Help " "functionality with the online help documents, and transitioned to using " "Python 3." msgstr "" mugshot-0.2.5/po/gl.po0000664000175000017500000001552312401206244014465 0ustar seansean00000000000000# Galician translation for mugshot # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the mugshot package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: mugshot\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2014-08-31 21:40-0400\n" "PO-Revision-Date: 2014-07-14 23:37+0000\n" "Last-Translator: Adolfo Jayme \n" "Language-Team: Galician \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-09-01 07:34+0000\n" "X-Generator: Launchpad (build 17176)\n" #: ../mugshot.desktop.in.h:1 msgid "About Me" msgstr "Acerca de min" #: ../mugshot.desktop.in.h:2 msgid "Configure your profile image and contact details" msgstr "Configure a imaxe do seu perfil e a información de contacto" #: ../data/ui/CameraMugshotDialog.ui.h:1 msgid "Capture - Mugshot" msgstr "" #: ../data/ui/MugshotWindow.ui.h:1 msgid "Preview" msgstr "Previsualización" #: ../data/ui/MugshotWindow.ui.h:2 msgid "Center" msgstr "" #: ../data/ui/MugshotWindow.ui.h:3 msgid "Left" msgstr "" #: ../data/ui/MugshotWindow.ui.h:4 msgid "Right" msgstr "" #: ../data/ui/MugshotWindow.ui.h:5 msgid "Crop" msgstr "" #: ../data/ui/MugshotWindow.ui.h:6 msgid "Select from stock…" msgstr "" #: ../data/ui/MugshotWindow.ui.h:7 msgid "Capture from camera…" msgstr "" #: ../data/ui/MugshotWindow.ui.h:8 msgid "Browse…" msgstr "" #: ../data/ui/MugshotWindow.ui.h:9 ../mugshot/MugshotWindow.py:588 msgid "Mugshot" msgstr "" #: ../data/ui/MugshotWindow.ui.h:10 msgid "First Name" msgstr "" #: ../data/ui/MugshotWindow.ui.h:11 msgid "Last Name" msgstr "" #: ../data/ui/MugshotWindow.ui.h:12 msgid "Initials" msgstr "" #: ../data/ui/MugshotWindow.ui.h:13 msgid "Home Phone" msgstr "" #: ../data/ui/MugshotWindow.ui.h:14 msgid "Email Address" msgstr "" #: ../data/ui/MugshotWindow.ui.h:15 msgid "Office Phone" msgstr "" #: ../data/ui/MugshotWindow.ui.h:16 msgid "Fax" msgstr "" #: ../data/ui/MugshotWindow.ui.h:17 msgid "Select a photo…" msgstr "" #: ../mugshot/__init__.py:35 msgid "Show debug messages (-vv debugs mugshot_lib also)" msgstr "" #: ../mugshot/CameraMugshotDialog.py:107 #, python-format msgid "Camera failed to load. Devices: %s" msgstr "" #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:125 msgid "" "Sorry, but your camera\n" "failed to initialize." msgstr "" #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:132 msgid "" "Please wait while your\n" "camera is initialized." msgstr "" #: ../mugshot/CameraMugshotDialog.py:152 msgid "Cannot display camera output. Ignoring play command" msgstr "" #. Set the record button to retry, and disable it until the capture #. finishes. #: ../mugshot/CameraMugshotDialog.py:279 msgid "Retry" msgstr "" #: ../mugshot/MugshotWindow.py:321 msgid "Authentication cancelled." msgstr "" #: ../mugshot/MugshotWindow.py:324 msgid "Authentication failed." msgstr "" #: ../mugshot/MugshotWindow.py:327 msgid "An error occurred when saving changes." msgstr "" #: ../mugshot/MugshotWindow.py:329 msgid "User details were not updated." msgstr "" #: ../mugshot/MugshotWindow.py:498 msgid "Update Pidgin buddy icon?" msgstr "" #: ../mugshot/MugshotWindow.py:499 msgid "Would you also like to update your Pidgin buddy icon?" msgstr "" #: ../mugshot/MugshotWindow.py:589 msgid "Enter your password to change user details." msgstr "" #: ../mugshot/MugshotWindow.py:591 msgid "" "This is a security measure to prevent unwanted updates\n" "to your personal information." msgstr "" #: ../mugshot/MugshotWindow.py:796 msgid "Update LibreOffice user details?" msgstr "" #: ../mugshot/MugshotWindow.py:797 msgid "Would you also like to update your user details in LibreOffice?" msgstr "" #: ../mugshot_lib/SudoDialog.py:122 msgid "Password Required" msgstr "" #: ../mugshot_lib/SudoDialog.py:159 msgid "Incorrect password... try again." msgstr "" #: ../mugshot_lib/SudoDialog.py:169 msgid "Password:" msgstr "" #. Buttons #: ../mugshot_lib/SudoDialog.py:180 msgid "Cancel" msgstr "" #: ../mugshot_lib/SudoDialog.py:183 msgid "OK" msgstr "" #: ../mugshot_lib/SudoDialog.py:204 msgid "" "Enter your password to\n" "perform administrative tasks." msgstr "" #: ../mugshot_lib/SudoDialog.py:206 #, python-format msgid "" "The application '%s' lets you\n" "modify essential parts of your system." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:1 msgid "Lightweight user configuration" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:2 msgid "" "Mugshot enables users to easily update personal contact information. With " "Mugshot, users are able to:" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:3 msgid "" "Set the account photo displayed at login and optionally synchronize this " "photo with their Pidgin buddy icon" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:4 msgid "" "Set account details stored in /etc/passwd (usable with the finger command) " "and optionally synchronize with their LibreOffice contact information" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:5 msgid "" "This stable release improves Mugshot functionality for LDAP users, and " "includes the latest SudoDialog, improving the appearance and usability of " "the password dialog." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:6 msgid "" "This stable release improves the user configuration (chfn) backend and " "prevents Mugshot from locking up. Mugshot also no longer depends on " "AccountsService, but can leverage it to better support some systems. A " "critical bug that prevented some users from starting Mugshot was also " "addressed." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:7 msgid "" "This stable release improved AccountsService functionality and overall " "usability. Users without admin rights can no longer attempt to change their " "name, and initials are automatically populated when the name is entered." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:8 msgid "" "This stable release fixed a crash that occured when saving user details in a " "non-English locale. This release also included an updated translation " "template and new translations." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:9 msgid "" "This stable release fixed several bugs related to profile image management, " "introduced an improved password dialog, and transitioned to using GLib to " "more reliably determine user and environment settings." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:10 msgid "" "The first stable release introduced simplified packaging, replaced the Help " "functionality with the online help documents, and transitioned to using " "Python 3." msgstr "" mugshot-0.2.5/po/ca.po0000664000175000017500000002026612401206244014446 0ustar seansean00000000000000# Catalan translation for mugshot # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the mugshot package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: mugshot\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2014-08-31 21:40-0400\n" "PO-Revision-Date: 2014-03-03 00:13+0000\n" "Last-Translator: Adolfo Jayme \n" "Language-Team: Catalan \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-09-01 07:33+0000\n" "X-Generator: Launchpad (build 17176)\n" #: ../mugshot.desktop.in.h:1 msgid "About Me" msgstr "Quant a mi" #: ../mugshot.desktop.in.h:2 msgid "Configure your profile image and contact details" msgstr "Configureu l'imatge del perfil i les dades de contacte" #: ../data/ui/CameraMugshotDialog.ui.h:1 msgid "Capture - Mugshot" msgstr "Captació d'imatges - Mugshot" #: ../data/ui/MugshotWindow.ui.h:1 msgid "Preview" msgstr "Previsualització" #: ../data/ui/MugshotWindow.ui.h:2 msgid "Center" msgstr "Al centre" #: ../data/ui/MugshotWindow.ui.h:3 msgid "Left" msgstr "A l'esquerra" #: ../data/ui/MugshotWindow.ui.h:4 msgid "Right" msgstr "A la dreta" #: ../data/ui/MugshotWindow.ui.h:5 msgid "Crop" msgstr "Escapça" #: ../data/ui/MugshotWindow.ui.h:6 msgid "Select from stock…" msgstr "Selecciona des de mostrari..." #: ../data/ui/MugshotWindow.ui.h:7 msgid "Capture from camera…" msgstr "Captura des d'una càmera..." #: ../data/ui/MugshotWindow.ui.h:8 msgid "Browse…" msgstr "Explora..." #: ../data/ui/MugshotWindow.ui.h:9 ../mugshot/MugshotWindow.py:588 msgid "Mugshot" msgstr "Mugshot" #: ../data/ui/MugshotWindow.ui.h:10 msgid "First Name" msgstr "Nom" #: ../data/ui/MugshotWindow.ui.h:11 msgid "Last Name" msgstr "Cognom" #: ../data/ui/MugshotWindow.ui.h:12 msgid "Initials" msgstr "Inicials" #: ../data/ui/MugshotWindow.ui.h:13 msgid "Home Phone" msgstr "Telèfon de casa" #: ../data/ui/MugshotWindow.ui.h:14 msgid "Email Address" msgstr "Adreça electrònica" #: ../data/ui/MugshotWindow.ui.h:15 msgid "Office Phone" msgstr "Telèfon de l'oficina" #: ../data/ui/MugshotWindow.ui.h:16 msgid "Fax" msgstr "Fax" #: ../data/ui/MugshotWindow.ui.h:17 msgid "Select a photo…" msgstr "Seleccioneu una imatge..." #: ../mugshot/__init__.py:35 msgid "Show debug messages (-vv debugs mugshot_lib also)" msgstr "Mostra missatges de depuració (-vv també depura mugshot_lib)" #: ../mugshot/CameraMugshotDialog.py:107 #, python-format msgid "Camera failed to load. Devices: %s" msgstr "S'ha produït un error en carregar la càmera. Dispositius: %s" #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:125 msgid "" "Sorry, but your camera\n" "failed to initialize." msgstr "" "S'ha produït un error en\n" "inicialitzar la càmera." #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:132 msgid "" "Please wait while your\n" "camera is initialized." msgstr "" "Espereu mentre la\n" "càmera és inicialitzada." #: ../mugshot/CameraMugshotDialog.py:152 msgid "Cannot display camera output. Ignoring play command" msgstr "" #. Set the record button to retry, and disable it until the capture #. finishes. #: ../mugshot/CameraMugshotDialog.py:279 msgid "Retry" msgstr "Reintenta" #: ../mugshot/MugshotWindow.py:321 msgid "Authentication cancelled." msgstr "" #: ../mugshot/MugshotWindow.py:324 msgid "Authentication failed." msgstr "" #: ../mugshot/MugshotWindow.py:327 msgid "An error occurred when saving changes." msgstr "" #: ../mugshot/MugshotWindow.py:329 msgid "User details were not updated." msgstr "No s’han actualitzat els detalls de l’usuari." #: ../mugshot/MugshotWindow.py:498 msgid "Update Pidgin buddy icon?" msgstr "Actualitzar la icona de l'amic en Pidgin?" #: ../mugshot/MugshotWindow.py:499 msgid "Would you also like to update your Pidgin buddy icon?" msgstr "Desitgeu també actualitzar la icona de l'amic en Pidgin?" #: ../mugshot/MugshotWindow.py:589 msgid "Enter your password to change user details." msgstr "" "Escriviu la vostra contrasenya per modificar els detalls de l’usuari." #: ../mugshot/MugshotWindow.py:591 msgid "" "This is a security measure to prevent unwanted updates\n" "to your personal information." msgstr "" "Aquesta és una mesura de seguretat per prevenir actualitzacions\n" "no desitjades de la informació personal." #: ../mugshot/MugshotWindow.py:796 msgid "Update LibreOffice user details?" msgstr "Actualitzar les dades d'usuari en LibreOffice?" #: ../mugshot/MugshotWindow.py:797 msgid "Would you also like to update your user details in LibreOffice?" msgstr "Desitgeu també actualitzar les dades d'usuari en LibreOffice?" #: ../mugshot_lib/SudoDialog.py:122 msgid "Password Required" msgstr "" #: ../mugshot_lib/SudoDialog.py:159 msgid "Incorrect password... try again." msgstr "La contrasenya és incorrecta. Intenteu-ho de nou." #: ../mugshot_lib/SudoDialog.py:169 msgid "Password:" msgstr "Contrasenya:" #. Buttons #: ../mugshot_lib/SudoDialog.py:180 msgid "Cancel" msgstr "Cancel·la" #: ../mugshot_lib/SudoDialog.py:183 msgid "OK" msgstr "D’acord" #: ../mugshot_lib/SudoDialog.py:204 msgid "" "Enter your password to\n" "perform administrative tasks." msgstr "" "Escriviu la vostra contrasenya per\n" "fer tasques administratives." #: ../mugshot_lib/SudoDialog.py:206 #, python-format msgid "" "The application '%s' lets you\n" "modify essential parts of your system." msgstr "" "L’aplicació «%s» us permet\n" "modificar parts essencials del sistema." #: ../data/appdata/mugshot.appdata.xml.in.h:1 msgid "Lightweight user configuration" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:2 msgid "" "Mugshot enables users to easily update personal contact information. With " "Mugshot, users are able to:" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:3 msgid "" "Set the account photo displayed at login and optionally synchronize this " "photo with their Pidgin buddy icon" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:4 msgid "" "Set account details stored in /etc/passwd (usable with the finger command) " "and optionally synchronize with their LibreOffice contact information" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:5 msgid "" "This stable release improves Mugshot functionality for LDAP users, and " "includes the latest SudoDialog, improving the appearance and usability of " "the password dialog." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:6 msgid "" "This stable release improves the user configuration (chfn) backend and " "prevents Mugshot from locking up. Mugshot also no longer depends on " "AccountsService, but can leverage it to better support some systems. A " "critical bug that prevented some users from starting Mugshot was also " "addressed." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:7 msgid "" "This stable release improved AccountsService functionality and overall " "usability. Users without admin rights can no longer attempt to change their " "name, and initials are automatically populated when the name is entered." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:8 msgid "" "This stable release fixed a crash that occured when saving user details in a " "non-English locale. This release also included an updated translation " "template and new translations." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:9 msgid "" "This stable release fixed several bugs related to profile image management, " "introduced an improved password dialog, and transitioned to using GLib to " "more reliably determine user and environment settings." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:10 msgid "" "The first stable release introduced simplified packaging, replaced the Help " "functionality with the online help documents, and transitioned to using " "Python 3." msgstr "" #~ msgid "Cannot display camera output.Ignoring play command" #~ msgstr "" #~ "No s’ha pogut mostrar la sortida de la càmera. S’ha ignorat l’ordre " #~ "«reprodueix»." mugshot-0.2.5/po/POTFILES.in0000664000175000017500000000223212401206244015271 0ustar seansean00000000000000### BEGIN LICENSE # Copyright (C) 2013 Sean Davis # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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 . ### END LICENSE # Desktop File mugshot.desktop.in # Glade Files [type: gettext/glade]data/ui/CameraMugshotDialog.ui [type: gettext/glade]data/ui/MugshotWindow.ui # Python Files mugshot/__init__.py mugshot/CameraMugshotDialog.py mugshot/MugshotWindow.py mugshot_lib/Builder.py mugshot_lib/CameraDialog.py mugshot_lib/mugshotconfig.py mugshot_lib/__init__.py mugshot_lib/helpers.py mugshot_lib/SudoDialog.py mugshot_lib/Window.py # XML Files [type: gettext/xml]data/appdata/mugshot.appdata.xml.inmugshot-0.2.5/po/es.po0000664000175000017500000002014312401206244014464 0ustar seansean00000000000000# Spanish translation for mugshot # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the mugshot package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: mugshot\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2014-08-31 21:40-0400\n" "PO-Revision-Date: 2014-03-02 23:58+0000\n" "Last-Translator: Adolfo Jayme \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-09-01 07:34+0000\n" "X-Generator: Launchpad (build 17176)\n" #: ../mugshot.desktop.in.h:1 msgid "About Me" msgstr "Acerca de mí" #: ../mugshot.desktop.in.h:2 msgid "Configure your profile image and contact details" msgstr "Configure su imagen de perfil y datos de contacto" #: ../data/ui/CameraMugshotDialog.ui.h:1 msgid "Capture - Mugshot" msgstr "Capturar - Mugshot" #: ../data/ui/MugshotWindow.ui.h:1 msgid "Preview" msgstr "Previsualización" #: ../data/ui/MugshotWindow.ui.h:2 msgid "Center" msgstr "Centro" #: ../data/ui/MugshotWindow.ui.h:3 msgid "Left" msgstr "Izquierda" #: ../data/ui/MugshotWindow.ui.h:4 msgid "Right" msgstr "Derecha" #: ../data/ui/MugshotWindow.ui.h:5 msgid "Crop" msgstr "Cortar" #: ../data/ui/MugshotWindow.ui.h:6 msgid "Select from stock…" msgstr "Seleccionar prediseñadas…" #: ../data/ui/MugshotWindow.ui.h:7 msgid "Capture from camera…" msgstr "Capturar con la cámara…" #: ../data/ui/MugshotWindow.ui.h:8 msgid "Browse…" msgstr "Examinar…" #: ../data/ui/MugshotWindow.ui.h:9 ../mugshot/MugshotWindow.py:588 msgid "Mugshot" msgstr "Mugshot" #: ../data/ui/MugshotWindow.ui.h:10 msgid "First Name" msgstr "Nombre" #: ../data/ui/MugshotWindow.ui.h:11 msgid "Last Name" msgstr "Apellidos" #: ../data/ui/MugshotWindow.ui.h:12 msgid "Initials" msgstr "Iniciales" #: ../data/ui/MugshotWindow.ui.h:13 msgid "Home Phone" msgstr "Teléfono de casa" #: ../data/ui/MugshotWindow.ui.h:14 msgid "Email Address" msgstr "Correo electrónico" #: ../data/ui/MugshotWindow.ui.h:15 msgid "Office Phone" msgstr "Teléfono de la oficina" #: ../data/ui/MugshotWindow.ui.h:16 msgid "Fax" msgstr "Fax" #: ../data/ui/MugshotWindow.ui.h:17 msgid "Select a photo…" msgstr "Seleccionar una foto…" #: ../mugshot/__init__.py:35 msgid "Show debug messages (-vv debugs mugshot_lib also)" msgstr "Mostrar mensajes de depuración (-vv depura mugshot_lib también)" #: ../mugshot/CameraMugshotDialog.py:107 #, python-format msgid "Camera failed to load. Devices: %s" msgstr "Falló la carga de la cámara. Dispositivos: %s" #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:125 msgid "" "Sorry, but your camera\n" "failed to initialize." msgstr "" "Falló la inicialización\n" "de la cámara." #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:132 msgid "" "Please wait while your\n" "camera is initialized." msgstr "" "Espere mientras se\n" "inicializa la cámara." #: ../mugshot/CameraMugshotDialog.py:152 msgid "Cannot display camera output. Ignoring play command" msgstr "" #. Set the record button to retry, and disable it until the capture #. finishes. #: ../mugshot/CameraMugshotDialog.py:279 msgid "Retry" msgstr "Reintentar" #: ../mugshot/MugshotWindow.py:321 msgid "Authentication cancelled." msgstr "" #: ../mugshot/MugshotWindow.py:324 msgid "Authentication failed." msgstr "" #: ../mugshot/MugshotWindow.py:327 msgid "An error occurred when saving changes." msgstr "" #: ../mugshot/MugshotWindow.py:329 msgid "User details were not updated." msgstr "No se actualizaron los datos del usuario." #: ../mugshot/MugshotWindow.py:498 msgid "Update Pidgin buddy icon?" msgstr "¿Actualizar el icono de amigo de Pidgin?" #: ../mugshot/MugshotWindow.py:499 msgid "Would you also like to update your Pidgin buddy icon?" msgstr "¿Quiere actualizar también el icono de amigo de Pidgin?" #: ../mugshot/MugshotWindow.py:589 msgid "Enter your password to change user details." msgstr "Escriba su contraseña para cambiar los detalles del usuario." #: ../mugshot/MugshotWindow.py:591 msgid "" "This is a security measure to prevent unwanted updates\n" "to your personal information." msgstr "" "Esta es una medida de seguridad para prevenir actualizaciones\n" " no deseadas de su información personal." #: ../mugshot/MugshotWindow.py:796 msgid "Update LibreOffice user details?" msgstr "¿Actualizar los detalles de usuario de LibreOffice?" #: ../mugshot/MugshotWindow.py:797 msgid "Would you also like to update your user details in LibreOffice?" msgstr "¿Quiere actualizar también los detalles de usuario de LibreOffice?" #: ../mugshot_lib/SudoDialog.py:122 msgid "Password Required" msgstr "" #: ../mugshot_lib/SudoDialog.py:159 msgid "Incorrect password... try again." msgstr "Contraseña incorrecta. Inténtelo de nuevo." #: ../mugshot_lib/SudoDialog.py:169 msgid "Password:" msgstr "Contraseña:" #. Buttons #: ../mugshot_lib/SudoDialog.py:180 msgid "Cancel" msgstr "Cancelar" #: ../mugshot_lib/SudoDialog.py:183 msgid "OK" msgstr "Aceptar" #: ../mugshot_lib/SudoDialog.py:204 msgid "" "Enter your password to\n" "perform administrative tasks." msgstr "" "Escriba su contraseña para\n" "realizar tareas administrativas." #: ../mugshot_lib/SudoDialog.py:206 #, python-format msgid "" "The application '%s' lets you\n" "modify essential parts of your system." msgstr "" "La aplicación «%s» le permite\n" "modificar partes esenciales del sistema." #: ../data/appdata/mugshot.appdata.xml.in.h:1 msgid "Lightweight user configuration" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:2 msgid "" "Mugshot enables users to easily update personal contact information. With " "Mugshot, users are able to:" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:3 msgid "" "Set the account photo displayed at login and optionally synchronize this " "photo with their Pidgin buddy icon" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:4 msgid "" "Set account details stored in /etc/passwd (usable with the finger command) " "and optionally synchronize with their LibreOffice contact information" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:5 msgid "" "This stable release improves Mugshot functionality for LDAP users, and " "includes the latest SudoDialog, improving the appearance and usability of " "the password dialog." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:6 msgid "" "This stable release improves the user configuration (chfn) backend and " "prevents Mugshot from locking up. Mugshot also no longer depends on " "AccountsService, but can leverage it to better support some systems. A " "critical bug that prevented some users from starting Mugshot was also " "addressed." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:7 msgid "" "This stable release improved AccountsService functionality and overall " "usability. Users without admin rights can no longer attempt to change their " "name, and initials are automatically populated when the name is entered." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:8 msgid "" "This stable release fixed a crash that occured when saving user details in a " "non-English locale. This release also included an updated translation " "template and new translations." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:9 msgid "" "This stable release fixed several bugs related to profile image management, " "introduced an improved password dialog, and transitioned to using GLib to " "more reliably determine user and environment settings." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:10 msgid "" "The first stable release introduced simplified packaging, replaced the Help " "functionality with the online help documents, and transitioned to using " "Python 3." msgstr "" #~ msgid "Cannot display camera output.Ignoring play command" #~ msgstr "" #~ "No se puede mostrar la salida de la cámara. Se ignoró la orden «reproducir»" mugshot-0.2.5/po/fi.po0000664000175000017500000002017612401206244014461 0ustar seansean00000000000000# Finnish translation for mugshot # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the mugshot package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: mugshot\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2014-08-31 21:40-0400\n" "PO-Revision-Date: 2014-08-31 15:05+0000\n" "Last-Translator: Pasi Lallinaho \n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-09-01 07:33+0000\n" "X-Generator: Launchpad (build 17176)\n" #: ../mugshot.desktop.in.h:1 msgid "About Me" msgstr "Omat tiedot" #: ../mugshot.desktop.in.h:2 msgid "Configure your profile image and contact details" msgstr "Muuta profiilikuvaasi ja yhteystietojasi" #: ../data/ui/CameraMugshotDialog.ui.h:1 msgid "Capture - Mugshot" msgstr "Kuvankaappaus - Mugshot" #: ../data/ui/MugshotWindow.ui.h:1 msgid "Preview" msgstr "Esikatselu" #: ../data/ui/MugshotWindow.ui.h:2 msgid "Center" msgstr "Keskitetty" #: ../data/ui/MugshotWindow.ui.h:3 msgid "Left" msgstr "Vasen" #: ../data/ui/MugshotWindow.ui.h:4 msgid "Right" msgstr "Oikea" #: ../data/ui/MugshotWindow.ui.h:5 msgid "Crop" msgstr "Rajaus" #: ../data/ui/MugshotWindow.ui.h:6 msgid "Select from stock…" msgstr "Valitse oletuskuvista..." #: ../data/ui/MugshotWindow.ui.h:7 msgid "Capture from camera…" msgstr "Kuvankaappaus kamerasta..." #: ../data/ui/MugshotWindow.ui.h:8 msgid "Browse…" msgstr "Selaa…" #: ../data/ui/MugshotWindow.ui.h:9 ../mugshot/MugshotWindow.py:588 msgid "Mugshot" msgstr "Valokuva" #: ../data/ui/MugshotWindow.ui.h:10 msgid "First Name" msgstr "Etunimi" #: ../data/ui/MugshotWindow.ui.h:11 msgid "Last Name" msgstr "Sukunimi" #: ../data/ui/MugshotWindow.ui.h:12 msgid "Initials" msgstr "Nimikirjaimet" #: ../data/ui/MugshotWindow.ui.h:13 msgid "Home Phone" msgstr "Kotipuhelin" #: ../data/ui/MugshotWindow.ui.h:14 msgid "Email Address" msgstr "Sähköpostiosoite" #: ../data/ui/MugshotWindow.ui.h:15 msgid "Office Phone" msgstr "Työpuhelin" #: ../data/ui/MugshotWindow.ui.h:16 msgid "Fax" msgstr "Faksi" #: ../data/ui/MugshotWindow.ui.h:17 msgid "Select a photo…" msgstr "Valitse kuva..." #: ../mugshot/__init__.py:35 msgid "Show debug messages (-vv debugs mugshot_lib also)" msgstr "" "Näytä virheilmoituset (-vv näyttää myös mugshot_libin virheilmoitukset)" #: ../mugshot/CameraMugshotDialog.py:107 #, python-format msgid "Camera failed to load. Devices: %s" msgstr "Kameraa ei voitu valmistella. Laitteet: %s" #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:125 msgid "" "Sorry, but your camera\n" "failed to initialize." msgstr "" "Anteeksi, mutta kameraasi\n" "ei voitu valmistella." #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:132 msgid "" "Please wait while your\n" "camera is initialized." msgstr "" "Ole hyvä ja odota,\n" "kameraasi valmistellaan." #: ../mugshot/CameraMugshotDialog.py:152 msgid "Cannot display camera output. Ignoring play command" msgstr "" #. Set the record button to retry, and disable it until the capture #. finishes. #: ../mugshot/CameraMugshotDialog.py:279 msgid "Retry" msgstr "Yritä uudelleen" #: ../mugshot/MugshotWindow.py:321 msgid "Authentication cancelled." msgstr "Todennus keskeytetty." #: ../mugshot/MugshotWindow.py:324 msgid "Authentication failed." msgstr "Tunnistus epäonnistui." #: ../mugshot/MugshotWindow.py:327 msgid "An error occurred when saving changes." msgstr "Muutoksia tallennettaessa tapahtui virhe." #: ../mugshot/MugshotWindow.py:329 msgid "User details were not updated." msgstr "Käyttäjätietoja ei päivitetty." #: ../mugshot/MugshotWindow.py:498 msgid "Update Pidgin buddy icon?" msgstr "Päivitä Pidginin tuttavakuvake?" #: ../mugshot/MugshotWindow.py:499 msgid "Would you also like to update your Pidgin buddy icon?" msgstr "Haluatko päivittää myös Pidginin tuttavakuvakkeen?" #: ../mugshot/MugshotWindow.py:589 msgid "Enter your password to change user details." msgstr "Syötä salasanasi muuttaaksesi käyttäjätietojasi." #: ../mugshot/MugshotWindow.py:591 msgid "" "This is a security measure to prevent unwanted updates\n" "to your personal information." msgstr "" "Tämä on turvallisuustoimenpide, jolla estetään ei-toivotut päivitykset\n" "henkilökohtaisiin tietoihisi." #: ../mugshot/MugshotWindow.py:796 msgid "Update LibreOffice user details?" msgstr "Päivitä LibreOfficen käyttäjätiedot?" #: ../mugshot/MugshotWindow.py:797 msgid "Would you also like to update your user details in LibreOffice?" msgstr "Haluatko päivittää myös LibreOfficen käyttäjätietosi?" #: ../mugshot_lib/SudoDialog.py:122 msgid "Password Required" msgstr "Salasana vaaditaan" #: ../mugshot_lib/SudoDialog.py:159 msgid "Incorrect password... try again." msgstr "Väärä salasana... yritä uudelleen." #: ../mugshot_lib/SudoDialog.py:169 msgid "Password:" msgstr "Salasana:" #. Buttons #: ../mugshot_lib/SudoDialog.py:180 msgid "Cancel" msgstr "Peruuta" #: ../mugshot_lib/SudoDialog.py:183 msgid "OK" msgstr "OK" #: ../mugshot_lib/SudoDialog.py:204 msgid "" "Enter your password to\n" "perform administrative tasks." msgstr "" "Syötä salasanasi\n" "suorittaaksesi ylläpidollisia toimia." #: ../mugshot_lib/SudoDialog.py:206 #, python-format msgid "" "The application '%s' lets you\n" "modify essential parts of your system." msgstr "" "Sovellus '%s' sallii sinun\n" "muokata järjestelmäsi olennaisia osia." #: ../data/appdata/mugshot.appdata.xml.in.h:1 msgid "Lightweight user configuration" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:2 msgid "" "Mugshot enables users to easily update personal contact information. With " "Mugshot, users are able to:" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:3 msgid "" "Set the account photo displayed at login and optionally synchronize this " "photo with their Pidgin buddy icon" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:4 msgid "" "Set account details stored in /etc/passwd (usable with the finger command) " "and optionally synchronize with their LibreOffice contact information" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:5 msgid "" "This stable release improves Mugshot functionality for LDAP users, and " "includes the latest SudoDialog, improving the appearance and usability of " "the password dialog." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:6 msgid "" "This stable release improves the user configuration (chfn) backend and " "prevents Mugshot from locking up. Mugshot also no longer depends on " "AccountsService, but can leverage it to better support some systems. A " "critical bug that prevented some users from starting Mugshot was also " "addressed." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:7 msgid "" "This stable release improved AccountsService functionality and overall " "usability. Users without admin rights can no longer attempt to change their " "name, and initials are automatically populated when the name is entered." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:8 msgid "" "This stable release fixed a crash that occured when saving user details in a " "non-English locale. This release also included an updated translation " "template and new translations." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:9 msgid "" "This stable release fixed several bugs related to profile image management, " "introduced an improved password dialog, and transitioned to using GLib to " "more reliably determine user and environment settings." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:10 msgid "" "The first stable release introduced simplified packaging, replaced the Help " "functionality with the online help documents, and transitioned to using " "Python 3." msgstr "" #~ msgid "Cannot display camera output.Ignoring play command" #~ msgstr "" #~ "Ei voida näyttää kameran ulostuloa. Jätetään toistamiskomento huomioimatta" mugshot-0.2.5/po/pt.po0000664000175000017500000001747312401206244014514 0ustar seansean00000000000000# Portuguese translation for mugshot # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the mugshot package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: mugshot\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2014-08-31 21:40-0400\n" "PO-Revision-Date: 2014-02-24 18:23+0000\n" "Last-Translator: David Pires \n" "Language-Team: Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-09-01 07:34+0000\n" "X-Generator: Launchpad (build 17176)\n" #: ../mugshot.desktop.in.h:1 msgid "About Me" msgstr "Sobre Mim" #: ../mugshot.desktop.in.h:2 msgid "Configure your profile image and contact details" msgstr "Configure a sua imagem de perfil e detalhes de contato" #: ../data/ui/CameraMugshotDialog.ui.h:1 msgid "Capture - Mugshot" msgstr "Captura - Mugshot" #: ../data/ui/MugshotWindow.ui.h:1 msgid "Preview" msgstr "Pré-visualização" #: ../data/ui/MugshotWindow.ui.h:2 msgid "Center" msgstr "Centrar" #: ../data/ui/MugshotWindow.ui.h:3 msgid "Left" msgstr "Esquerda" #: ../data/ui/MugshotWindow.ui.h:4 msgid "Right" msgstr "Direita" #: ../data/ui/MugshotWindow.ui.h:5 msgid "Crop" msgstr "Cortar" #: ../data/ui/MugshotWindow.ui.h:6 msgid "Select from stock…" msgstr "Selecione a partir do stock..." #: ../data/ui/MugshotWindow.ui.h:7 msgid "Capture from camera…" msgstr "Capturar a partir da câmera..." #: ../data/ui/MugshotWindow.ui.h:8 msgid "Browse…" msgstr "Procurar..." #: ../data/ui/MugshotWindow.ui.h:9 ../mugshot/MugshotWindow.py:588 msgid "Mugshot" msgstr "Mugshot" #: ../data/ui/MugshotWindow.ui.h:10 msgid "First Name" msgstr "Nome" #: ../data/ui/MugshotWindow.ui.h:11 msgid "Last Name" msgstr "Apelido" #: ../data/ui/MugshotWindow.ui.h:12 msgid "Initials" msgstr "Initiciais" #: ../data/ui/MugshotWindow.ui.h:13 msgid "Home Phone" msgstr "Telefone de casa" #: ../data/ui/MugshotWindow.ui.h:14 msgid "Email Address" msgstr "Endereço de email" #: ../data/ui/MugshotWindow.ui.h:15 msgid "Office Phone" msgstr "Telefone do escritório" #: ../data/ui/MugshotWindow.ui.h:16 msgid "Fax" msgstr "Fax" #: ../data/ui/MugshotWindow.ui.h:17 msgid "Select a photo…" msgstr "Selecione uma fotografia..." #: ../mugshot/__init__.py:35 msgid "Show debug messages (-vv debugs mugshot_lib also)" msgstr "Mostrar mensagens de depuração (-vv debugs mugshot_lib also)" #: ../mugshot/CameraMugshotDialog.py:107 #, python-format msgid "Camera failed to load. Devices: %s" msgstr "Falha ao carregar a câmera. Dispositivos: %s" #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:125 msgid "" "Sorry, but your camera\n" "failed to initialize." msgstr "" "Desculpe, mas a sua câmera\n" "não inicializou." #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:132 msgid "" "Please wait while your\n" "camera is initialized." msgstr "" "Por favor aguarde enquanto a sua\n" "câmera é inicializada." #: ../mugshot/CameraMugshotDialog.py:152 msgid "Cannot display camera output. Ignoring play command" msgstr "" #. Set the record button to retry, and disable it until the capture #. finishes. #: ../mugshot/CameraMugshotDialog.py:279 msgid "Retry" msgstr "Tentar novamente" #: ../mugshot/MugshotWindow.py:321 msgid "Authentication cancelled." msgstr "" #: ../mugshot/MugshotWindow.py:324 msgid "Authentication failed." msgstr "" #: ../mugshot/MugshotWindow.py:327 msgid "An error occurred when saving changes." msgstr "" #: ../mugshot/MugshotWindow.py:329 msgid "User details were not updated." msgstr "" #: ../mugshot/MugshotWindow.py:498 msgid "Update Pidgin buddy icon?" msgstr "Atualize o ícone buddy do Pidgin" #: ../mugshot/MugshotWindow.py:499 msgid "Would you also like to update your Pidgin buddy icon?" msgstr "Gostaria também de atualizar o seu ícone buddy do Pidgin?" #: ../mugshot/MugshotWindow.py:589 msgid "Enter your password to change user details." msgstr "" #: ../mugshot/MugshotWindow.py:591 msgid "" "This is a security measure to prevent unwanted updates\n" "to your personal information." msgstr "" "É uma medida de segurança para evitar alterações indesejadas\n" "às suas informações pessoais." #: ../mugshot/MugshotWindow.py:796 msgid "Update LibreOffice user details?" msgstr "Atualizar os detalhes de utilizador do LibreOffice?" #: ../mugshot/MugshotWindow.py:797 msgid "Would you also like to update your user details in LibreOffice?" msgstr "" "Gostaria também de atualizar os seus detalhes de utilizador do LibreOffice?" #: ../mugshot_lib/SudoDialog.py:122 msgid "Password Required" msgstr "" #: ../mugshot_lib/SudoDialog.py:159 msgid "Incorrect password... try again." msgstr "" #: ../mugshot_lib/SudoDialog.py:169 msgid "Password:" msgstr "Senha:" #. Buttons #: ../mugshot_lib/SudoDialog.py:180 msgid "Cancel" msgstr "" #: ../mugshot_lib/SudoDialog.py:183 msgid "OK" msgstr "" #: ../mugshot_lib/SudoDialog.py:204 msgid "" "Enter your password to\n" "perform administrative tasks." msgstr "" #: ../mugshot_lib/SudoDialog.py:206 #, python-format msgid "" "The application '%s' lets you\n" "modify essential parts of your system." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:1 msgid "Lightweight user configuration" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:2 msgid "" "Mugshot enables users to easily update personal contact information. With " "Mugshot, users are able to:" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:3 msgid "" "Set the account photo displayed at login and optionally synchronize this " "photo with their Pidgin buddy icon" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:4 msgid "" "Set account details stored in /etc/passwd (usable with the finger command) " "and optionally synchronize with their LibreOffice contact information" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:5 msgid "" "This stable release improves Mugshot functionality for LDAP users, and " "includes the latest SudoDialog, improving the appearance and usability of " "the password dialog." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:6 msgid "" "This stable release improves the user configuration (chfn) backend and " "prevents Mugshot from locking up. Mugshot also no longer depends on " "AccountsService, but can leverage it to better support some systems. A " "critical bug that prevented some users from starting Mugshot was also " "addressed." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:7 msgid "" "This stable release improved AccountsService functionality and overall " "usability. Users without admin rights can no longer attempt to change their " "name, and initials are automatically populated when the name is entered." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:8 msgid "" "This stable release fixed a crash that occured when saving user details in a " "non-English locale. This release also included an updated translation " "template and new translations." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:9 msgid "" "This stable release fixed several bugs related to profile image management, " "introduced an improved password dialog, and transitioned to using GLib to " "more reliably determine user and environment settings." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:10 msgid "" "The first stable release introduced simplified packaging, replaced the Help " "functionality with the online help documents, and transitioned to using " "Python 3." msgstr "" #~ msgid "Cannot display camera output.Ignoring play command" #~ msgstr "" #~ "Não é possível exibir o comando de reprodução output.Ignoring da câmera" mugshot-0.2.5/po/nl.po0000664000175000017500000001774512401206244014504 0ustar seansean00000000000000# Dutch translation for mugshot # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the mugshot package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: mugshot\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2014-08-31 21:40-0400\n" "PO-Revision-Date: 2014-03-14 20:41+0000\n" "Last-Translator: Pjotr12345 \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-09-01 07:33+0000\n" "X-Generator: Launchpad (build 17176)\n" #: ../mugshot.desktop.in.h:1 msgid "About Me" msgstr "Over mij" #: ../mugshot.desktop.in.h:2 msgid "Configure your profile image and contact details" msgstr "Stel uw profielafbeelding en contactdetails in" #: ../data/ui/CameraMugshotDialog.ui.h:1 msgid "Capture - Mugshot" msgstr "Pasfoto maken" #: ../data/ui/MugshotWindow.ui.h:1 msgid "Preview" msgstr "Voorbeeld" #: ../data/ui/MugshotWindow.ui.h:2 msgid "Center" msgstr "Midden" #: ../data/ui/MugshotWindow.ui.h:3 msgid "Left" msgstr "Links" #: ../data/ui/MugshotWindow.ui.h:4 msgid "Right" msgstr "Rechts" #: ../data/ui/MugshotWindow.ui.h:5 msgid "Crop" msgstr "Bijsnijden" #: ../data/ui/MugshotWindow.ui.h:6 msgid "Select from stock…" msgstr "Kies uit voorraad..." #: ../data/ui/MugshotWindow.ui.h:7 msgid "Capture from camera…" msgstr "Maak opname met camera..." #: ../data/ui/MugshotWindow.ui.h:8 msgid "Browse…" msgstr "Bladeren…" #: ../data/ui/MugshotWindow.ui.h:9 ../mugshot/MugshotWindow.py:588 msgid "Mugshot" msgstr "Pasfoto" #: ../data/ui/MugshotWindow.ui.h:10 msgid "First Name" msgstr "Voornaam" #: ../data/ui/MugshotWindow.ui.h:11 msgid "Last Name" msgstr "Achternaam" #: ../data/ui/MugshotWindow.ui.h:12 msgid "Initials" msgstr "Voorletters" #: ../data/ui/MugshotWindow.ui.h:13 msgid "Home Phone" msgstr "Telefoon thuis" #: ../data/ui/MugshotWindow.ui.h:14 msgid "Email Address" msgstr "E-mailadres" #: ../data/ui/MugshotWindow.ui.h:15 msgid "Office Phone" msgstr "Telefoon op werk" #: ../data/ui/MugshotWindow.ui.h:16 msgid "Fax" msgstr "Fax" #: ../data/ui/MugshotWindow.ui.h:17 msgid "Select a photo…" msgstr "Kies een foto..." #: ../mugshot/__init__.py:35 msgid "Show debug messages (-vv debugs mugshot_lib also)" msgstr "Toon foutopsporingsberichten (-vv toont die ook voor mugshot_lib)" #: ../mugshot/CameraMugshotDialog.py:107 #, python-format msgid "Camera failed to load. Devices: %s" msgstr "Camera kon niet laden. Apparaten: %s" #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:125 msgid "" "Sorry, but your camera\n" "failed to initialize." msgstr "" "Helaas, uw camera kon\n" "niet in werking treden." #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:132 msgid "" "Please wait while your\n" "camera is initialized." msgstr "" "Wacht a.u.b. tot uw\n" "camera het doet." #: ../mugshot/CameraMugshotDialog.py:152 msgid "Cannot display camera output. Ignoring play command" msgstr "" #. Set the record button to retry, and disable it until the capture #. finishes. #: ../mugshot/CameraMugshotDialog.py:279 msgid "Retry" msgstr "Probeer opnieuw" #: ../mugshot/MugshotWindow.py:321 msgid "Authentication cancelled." msgstr "" #: ../mugshot/MugshotWindow.py:324 msgid "Authentication failed." msgstr "" #: ../mugshot/MugshotWindow.py:327 msgid "An error occurred when saving changes." msgstr "" #: ../mugshot/MugshotWindow.py:329 msgid "User details were not updated." msgstr "Gebruikersdetails werden niet bijgewerkt." #: ../mugshot/MugshotWindow.py:498 msgid "Update Pidgin buddy icon?" msgstr "Pictogram voor Pidgin-vriend bijwerken?" #: ../mugshot/MugshotWindow.py:499 msgid "Would you also like to update your Pidgin buddy icon?" msgstr "Wilt u ook uw pictogram bijwerken voor Pidgin-vriend?" #: ../mugshot/MugshotWindow.py:589 msgid "Enter your password to change user details." msgstr "Voer uw wachtwoord in om gebruikersdetails te wijzigen." #: ../mugshot/MugshotWindow.py:591 msgid "" "This is a security measure to prevent unwanted updates\n" "to your personal information." msgstr "" "Dit is een veiligheidsmaatregel ter voorkoming van\n" "ongewenste wijzigingen in uw persoonlijke informatie." #: ../mugshot/MugshotWindow.py:796 msgid "Update LibreOffice user details?" msgstr "Gebruikerdetails voor Libre Office bijwerken?" #: ../mugshot/MugshotWindow.py:797 msgid "Would you also like to update your user details in LibreOffice?" msgstr "Wilt u ook uw gebruikerdetails bijwerken voor Libre Office?" #: ../mugshot_lib/SudoDialog.py:122 msgid "Password Required" msgstr "" #: ../mugshot_lib/SudoDialog.py:159 msgid "Incorrect password... try again." msgstr "Onjuist wachtwoord.... Probeer het a.u.b. opnieuw." #: ../mugshot_lib/SudoDialog.py:169 msgid "Password:" msgstr "Wachtwoord:" #. Buttons #: ../mugshot_lib/SudoDialog.py:180 msgid "Cancel" msgstr "Annuleren" #: ../mugshot_lib/SudoDialog.py:183 msgid "OK" msgstr "OK" #: ../mugshot_lib/SudoDialog.py:204 msgid "" "Enter your password to\n" "perform administrative tasks." msgstr "" "Voer uw wachtwoord in\n" "om beheerstaken uit te\n" "voeren." #: ../mugshot_lib/SudoDialog.py:206 #, python-format msgid "" "The application '%s' lets you\n" "modify essential parts of your system." msgstr "" "De toepassing '%s' laat u\n" "essentiele delen van uw\n" "systeem wijzigen." #: ../data/appdata/mugshot.appdata.xml.in.h:1 msgid "Lightweight user configuration" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:2 msgid "" "Mugshot enables users to easily update personal contact information. With " "Mugshot, users are able to:" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:3 msgid "" "Set the account photo displayed at login and optionally synchronize this " "photo with their Pidgin buddy icon" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:4 msgid "" "Set account details stored in /etc/passwd (usable with the finger command) " "and optionally synchronize with their LibreOffice contact information" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:5 msgid "" "This stable release improves Mugshot functionality for LDAP users, and " "includes the latest SudoDialog, improving the appearance and usability of " "the password dialog." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:6 msgid "" "This stable release improves the user configuration (chfn) backend and " "prevents Mugshot from locking up. Mugshot also no longer depends on " "AccountsService, but can leverage it to better support some systems. A " "critical bug that prevented some users from starting Mugshot was also " "addressed." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:7 msgid "" "This stable release improved AccountsService functionality and overall " "usability. Users without admin rights can no longer attempt to change their " "name, and initials are automatically populated when the name is entered." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:8 msgid "" "This stable release fixed a crash that occured when saving user details in a " "non-English locale. This release also included an updated translation " "template and new translations." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:9 msgid "" "This stable release fixed several bugs related to profile image management, " "introduced an improved password dialog, and transitioned to using GLib to " "more reliably determine user and environment settings." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:10 msgid "" "The first stable release introduced simplified packaging, replaced the Help " "functionality with the online help documents, and transitioned to using " "Python 3." msgstr "" #~ msgid "Cannot display camera output.Ignoring play command" #~ msgstr "Kan camera-uitvoer niet weergeven. Afspeelopdracht wordt genegeerd." mugshot-0.2.5/po/ca@valencia.po0000664000175000017500000001731512401206244016252 0ustar seansean00000000000000# Catalan (Valencian) translation for mugshot # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the mugshot package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: mugshot\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2014-08-31 21:40-0400\n" "PO-Revision-Date: 2013-07-22 19:12+0000\n" "Last-Translator: Sergio Baldoví \n" "Language-Team: Catalan (Valencian) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-09-01 07:34+0000\n" "X-Generator: Launchpad (build 17176)\n" #: ../mugshot.desktop.in.h:1 msgid "About Me" msgstr "Quant a mi" #: ../mugshot.desktop.in.h:2 msgid "Configure your profile image and contact details" msgstr "Configureu l'imatge del perfil i les dades de contacte" #: ../data/ui/CameraMugshotDialog.ui.h:1 msgid "Capture - Mugshot" msgstr "Captura d'imatges - Mugshot" #: ../data/ui/MugshotWindow.ui.h:1 msgid "Preview" msgstr "Previsualització" #: ../data/ui/MugshotWindow.ui.h:2 msgid "Center" msgstr "Al centre" #: ../data/ui/MugshotWindow.ui.h:3 msgid "Left" msgstr "A l'esquerra" #: ../data/ui/MugshotWindow.ui.h:4 msgid "Right" msgstr "A la dreta" #: ../data/ui/MugshotWindow.ui.h:5 msgid "Crop" msgstr "Retalla" #: ../data/ui/MugshotWindow.ui.h:6 msgid "Select from stock…" msgstr "Selecciona des de mostrari..." #: ../data/ui/MugshotWindow.ui.h:7 msgid "Capture from camera…" msgstr "Captura des d'una càmera..." #: ../data/ui/MugshotWindow.ui.h:8 msgid "Browse…" msgstr "Explora..." #: ../data/ui/MugshotWindow.ui.h:9 ../mugshot/MugshotWindow.py:588 msgid "Mugshot" msgstr "Mugshot" #: ../data/ui/MugshotWindow.ui.h:10 msgid "First Name" msgstr "Nom" #: ../data/ui/MugshotWindow.ui.h:11 msgid "Last Name" msgstr "Cognom" #: ../data/ui/MugshotWindow.ui.h:12 msgid "Initials" msgstr "Inicials" #: ../data/ui/MugshotWindow.ui.h:13 msgid "Home Phone" msgstr "Telèfon de casa" #: ../data/ui/MugshotWindow.ui.h:14 msgid "Email Address" msgstr "Correu electrònic" #: ../data/ui/MugshotWindow.ui.h:15 msgid "Office Phone" msgstr "Telèfon de l'oficina" #: ../data/ui/MugshotWindow.ui.h:16 msgid "Fax" msgstr "Fax" #: ../data/ui/MugshotWindow.ui.h:17 msgid "Select a photo…" msgstr "Seleccioneu una imatge..." #: ../mugshot/__init__.py:35 msgid "Show debug messages (-vv debugs mugshot_lib also)" msgstr "Mostra missatges de depuració (-vv també depura mugshot_lib)" #: ../mugshot/CameraMugshotDialog.py:107 #, python-format msgid "Camera failed to load. Devices: %s" msgstr "S'ha produït un error en carregar la càmera. Dispositius: %s" #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:125 msgid "" "Sorry, but your camera\n" "failed to initialize." msgstr "" "S'ha produït un error en\n" "inicialitzar la càmera." #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:132 msgid "" "Please wait while your\n" "camera is initialized." msgstr "" "Espereu mentre la\n" "càmera és inicialitzada." #: ../mugshot/CameraMugshotDialog.py:152 msgid "Cannot display camera output. Ignoring play command" msgstr "" #. Set the record button to retry, and disable it until the capture #. finishes. #: ../mugshot/CameraMugshotDialog.py:279 msgid "Retry" msgstr "Reintenta" #: ../mugshot/MugshotWindow.py:321 msgid "Authentication cancelled." msgstr "" #: ../mugshot/MugshotWindow.py:324 msgid "Authentication failed." msgstr "" #: ../mugshot/MugshotWindow.py:327 msgid "An error occurred when saving changes." msgstr "" #: ../mugshot/MugshotWindow.py:329 msgid "User details were not updated." msgstr "" #: ../mugshot/MugshotWindow.py:498 msgid "Update Pidgin buddy icon?" msgstr "Actualitzar la icona de l'amic en Pidgin?" #: ../mugshot/MugshotWindow.py:499 msgid "Would you also like to update your Pidgin buddy icon?" msgstr "Desitgeu també actualitzar la icona de l'amic en Pidgin?" #: ../mugshot/MugshotWindow.py:589 msgid "Enter your password to change user details." msgstr "" #: ../mugshot/MugshotWindow.py:591 msgid "" "This is a security measure to prevent unwanted updates\n" "to your personal information." msgstr "" "Esta és una mesura de seguretat per a previndre actualitzacions\n" "no desitjades de la informació personal." #: ../mugshot/MugshotWindow.py:796 msgid "Update LibreOffice user details?" msgstr "Actualitzar les dades d'usuari en LibreOffice?" #: ../mugshot/MugshotWindow.py:797 msgid "Would you also like to update your user details in LibreOffice?" msgstr "Desitgeu també actualitzar les dades d'usuari en LibreOffice?" #: ../mugshot_lib/SudoDialog.py:122 msgid "Password Required" msgstr "" #: ../mugshot_lib/SudoDialog.py:159 msgid "Incorrect password... try again." msgstr "" #: ../mugshot_lib/SudoDialog.py:169 msgid "Password:" msgstr "Contrasenya:" #. Buttons #: ../mugshot_lib/SudoDialog.py:180 msgid "Cancel" msgstr "" #: ../mugshot_lib/SudoDialog.py:183 msgid "OK" msgstr "" #: ../mugshot_lib/SudoDialog.py:204 msgid "" "Enter your password to\n" "perform administrative tasks." msgstr "" #: ../mugshot_lib/SudoDialog.py:206 #, python-format msgid "" "The application '%s' lets you\n" "modify essential parts of your system." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:1 msgid "Lightweight user configuration" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:2 msgid "" "Mugshot enables users to easily update personal contact information. With " "Mugshot, users are able to:" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:3 msgid "" "Set the account photo displayed at login and optionally synchronize this " "photo with their Pidgin buddy icon" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:4 msgid "" "Set account details stored in /etc/passwd (usable with the finger command) " "and optionally synchronize with their LibreOffice contact information" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:5 msgid "" "This stable release improves Mugshot functionality for LDAP users, and " "includes the latest SudoDialog, improving the appearance and usability of " "the password dialog." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:6 msgid "" "This stable release improves the user configuration (chfn) backend and " "prevents Mugshot from locking up. Mugshot also no longer depends on " "AccountsService, but can leverage it to better support some systems. A " "critical bug that prevented some users from starting Mugshot was also " "addressed." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:7 msgid "" "This stable release improved AccountsService functionality and overall " "usability. Users without admin rights can no longer attempt to change their " "name, and initials are automatically populated when the name is entered." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:8 msgid "" "This stable release fixed a crash that occured when saving user details in a " "non-English locale. This release also included an updated translation " "template and new translations." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:9 msgid "" "This stable release fixed several bugs related to profile image management, " "introduced an improved password dialog, and transitioned to using GLib to " "more reliably determine user and environment settings." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:10 msgid "" "The first stable release introduced simplified packaging, replaced the Help " "functionality with the online help documents, and transitioned to using " "Python 3." msgstr "" mugshot-0.2.5/po/eo.po0000664000175000017500000001545712401206244014474 0ustar seansean00000000000000# Esperanto translation for mugshot # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the mugshot package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: mugshot\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2014-08-31 21:40-0400\n" "PO-Revision-Date: 2014-07-15 00:02+0000\n" "Last-Translator: Adolfo Jayme \n" "Language-Team: Esperanto \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-09-01 07:33+0000\n" "X-Generator: Launchpad (build 17176)\n" #: ../mugshot.desktop.in.h:1 msgid "About Me" msgstr "Pri mi" #: ../mugshot.desktop.in.h:2 msgid "Configure your profile image and contact details" msgstr "" #: ../data/ui/CameraMugshotDialog.ui.h:1 msgid "Capture - Mugshot" msgstr "" #: ../data/ui/MugshotWindow.ui.h:1 msgid "Preview" msgstr "Antaŭrigardo" #: ../data/ui/MugshotWindow.ui.h:2 msgid "Center" msgstr "" #: ../data/ui/MugshotWindow.ui.h:3 msgid "Left" msgstr "" #: ../data/ui/MugshotWindow.ui.h:4 msgid "Right" msgstr "" #: ../data/ui/MugshotWindow.ui.h:5 msgid "Crop" msgstr "" #: ../data/ui/MugshotWindow.ui.h:6 msgid "Select from stock…" msgstr "" #: ../data/ui/MugshotWindow.ui.h:7 msgid "Capture from camera…" msgstr "" #: ../data/ui/MugshotWindow.ui.h:8 msgid "Browse…" msgstr "Foliumi…" #: ../data/ui/MugshotWindow.ui.h:9 ../mugshot/MugshotWindow.py:588 msgid "Mugshot" msgstr "" #: ../data/ui/MugshotWindow.ui.h:10 msgid "First Name" msgstr "" #: ../data/ui/MugshotWindow.ui.h:11 msgid "Last Name" msgstr "" #: ../data/ui/MugshotWindow.ui.h:12 msgid "Initials" msgstr "" #: ../data/ui/MugshotWindow.ui.h:13 msgid "Home Phone" msgstr "" #: ../data/ui/MugshotWindow.ui.h:14 msgid "Email Address" msgstr "" #: ../data/ui/MugshotWindow.ui.h:15 msgid "Office Phone" msgstr "" #: ../data/ui/MugshotWindow.ui.h:16 msgid "Fax" msgstr "Faksilo" #: ../data/ui/MugshotWindow.ui.h:17 msgid "Select a photo…" msgstr "" #: ../mugshot/__init__.py:35 msgid "Show debug messages (-vv debugs mugshot_lib also)" msgstr "" #: ../mugshot/CameraMugshotDialog.py:107 #, python-format msgid "Camera failed to load. Devices: %s" msgstr "" #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:125 msgid "" "Sorry, but your camera\n" "failed to initialize." msgstr "" #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:132 msgid "" "Please wait while your\n" "camera is initialized." msgstr "" #: ../mugshot/CameraMugshotDialog.py:152 msgid "Cannot display camera output. Ignoring play command" msgstr "" #. Set the record button to retry, and disable it until the capture #. finishes. #: ../mugshot/CameraMugshotDialog.py:279 msgid "Retry" msgstr "" #: ../mugshot/MugshotWindow.py:321 msgid "Authentication cancelled." msgstr "" #: ../mugshot/MugshotWindow.py:324 msgid "Authentication failed." msgstr "" #: ../mugshot/MugshotWindow.py:327 msgid "An error occurred when saving changes." msgstr "" #: ../mugshot/MugshotWindow.py:329 msgid "User details were not updated." msgstr "" #: ../mugshot/MugshotWindow.py:498 msgid "Update Pidgin buddy icon?" msgstr "" #: ../mugshot/MugshotWindow.py:499 msgid "Would you also like to update your Pidgin buddy icon?" msgstr "" #: ../mugshot/MugshotWindow.py:589 msgid "Enter your password to change user details." msgstr "" #: ../mugshot/MugshotWindow.py:591 msgid "" "This is a security measure to prevent unwanted updates\n" "to your personal information." msgstr "" #: ../mugshot/MugshotWindow.py:796 msgid "Update LibreOffice user details?" msgstr "" #: ../mugshot/MugshotWindow.py:797 msgid "Would you also like to update your user details in LibreOffice?" msgstr "" #: ../mugshot_lib/SudoDialog.py:122 msgid "Password Required" msgstr "" #: ../mugshot_lib/SudoDialog.py:159 msgid "Incorrect password... try again." msgstr "" #: ../mugshot_lib/SudoDialog.py:169 msgid "Password:" msgstr "Pasvorto:" #. Buttons #: ../mugshot_lib/SudoDialog.py:180 msgid "Cancel" msgstr "" #: ../mugshot_lib/SudoDialog.py:183 msgid "OK" msgstr "" #: ../mugshot_lib/SudoDialog.py:204 msgid "" "Enter your password to\n" "perform administrative tasks." msgstr "" #: ../mugshot_lib/SudoDialog.py:206 #, python-format msgid "" "The application '%s' lets you\n" "modify essential parts of your system." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:1 msgid "Lightweight user configuration" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:2 msgid "" "Mugshot enables users to easily update personal contact information. With " "Mugshot, users are able to:" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:3 msgid "" "Set the account photo displayed at login and optionally synchronize this " "photo with their Pidgin buddy icon" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:4 msgid "" "Set account details stored in /etc/passwd (usable with the finger command) " "and optionally synchronize with their LibreOffice contact information" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:5 msgid "" "This stable release improves Mugshot functionality for LDAP users, and " "includes the latest SudoDialog, improving the appearance and usability of " "the password dialog." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:6 msgid "" "This stable release improves the user configuration (chfn) backend and " "prevents Mugshot from locking up. Mugshot also no longer depends on " "AccountsService, but can leverage it to better support some systems. A " "critical bug that prevented some users from starting Mugshot was also " "addressed." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:7 msgid "" "This stable release improved AccountsService functionality and overall " "usability. Users without admin rights can no longer attempt to change their " "name, and initials are automatically populated when the name is entered." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:8 msgid "" "This stable release fixed a crash that occured when saving user details in a " "non-English locale. This release also included an updated translation " "template and new translations." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:9 msgid "" "This stable release fixed several bugs related to profile image management, " "introduced an improved password dialog, and transitioned to using GLib to " "more reliably determine user and environment settings." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:10 msgid "" "The first stable release introduced simplified packaging, replaced the Help " "functionality with the online help documents, and transitioned to using " "Python 3." msgstr "" mugshot-0.2.5/po/pl.po0000664000175000017500000002017012401206244014470 0ustar seansean00000000000000# Polish translation for mugshot # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the mugshot package. # Michał Olber , 2014. # Piotr Sokół , 2014. # msgid "" msgstr "" "Project-Id-Version: mugshot\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2014-08-31 21:40-0400\n" "PO-Revision-Date: 2014-04-19 21:57+0000\n" "Last-Translator: Piotr Sokół \n" "Language-Team: polski <>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-09-01 07:34+0000\n" "X-Generator: Launchpad (build 17176)\n" #: ../mugshot.desktop.in.h:1 msgid "About Me" msgstr "Informacje o użytkowniku" #: ../mugshot.desktop.in.h:2 msgid "Configure your profile image and contact details" msgstr "Konfiguruje obraz użytkownika i szczegóły kontaktu" #: ../data/ui/CameraMugshotDialog.ui.h:1 msgid "Capture - Mugshot" msgstr "Przechwytywanie - Mugshot" #: ../data/ui/MugshotWindow.ui.h:1 msgid "Preview" msgstr "Podgląd" #: ../data/ui/MugshotWindow.ui.h:2 msgid "Center" msgstr "Wyśrodkowane" #: ../data/ui/MugshotWindow.ui.h:3 msgid "Left" msgstr "Do lewej" #: ../data/ui/MugshotWindow.ui.h:4 msgid "Right" msgstr "Do prawej" #: ../data/ui/MugshotWindow.ui.h:5 msgid "Crop" msgstr "Kadrowanie" #: ../data/ui/MugshotWindow.ui.h:6 msgid "Select from stock…" msgstr "Wybierz z galerii…" #: ../data/ui/MugshotWindow.ui.h:7 msgid "Capture from camera…" msgstr "Przechwyć z kamery…" #: ../data/ui/MugshotWindow.ui.h:8 msgid "Browse…" msgstr "Przeglądaj…" #: ../data/ui/MugshotWindow.ui.h:9 ../mugshot/MugshotWindow.py:588 msgid "Mugshot" msgstr "Mugshot" #: ../data/ui/MugshotWindow.ui.h:10 msgid "First Name" msgstr "Imię" #: ../data/ui/MugshotWindow.ui.h:11 msgid "Last Name" msgstr "Nazwisko" #: ../data/ui/MugshotWindow.ui.h:12 msgid "Initials" msgstr "Inicjały" #: ../data/ui/MugshotWindow.ui.h:13 msgid "Home Phone" msgstr "Telefon domowy" #: ../data/ui/MugshotWindow.ui.h:14 msgid "Email Address" msgstr "Adres email" #: ../data/ui/MugshotWindow.ui.h:15 msgid "Office Phone" msgstr "Telefon służbowy" #: ../data/ui/MugshotWindow.ui.h:16 msgid "Fax" msgstr "Faks" #: ../data/ui/MugshotWindow.ui.h:17 msgid "Select a photo…" msgstr "Wybór obrazu" #: ../mugshot/__init__.py:35 msgid "Show debug messages (-vv debugs mugshot_lib also)" msgstr "" "Wypisuje informacje diagnozowania błędów (-vv diagnozuje błędy mugshot_lib)" #: ../mugshot/CameraMugshotDialog.py:107 #, python-format msgid "Camera failed to load. Devices: %s" msgstr "Nie udało się uruchomić kamery. Urządzenia: %s" #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:125 msgid "" "Sorry, but your camera\n" "failed to initialize." msgstr "" "Przepraszamy, nie udało się\n" "zainicjować kamery." #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:132 msgid "" "Please wait while your\n" "camera is initialized." msgstr "" "Proszę czekać.\n" "Trwa inicjowanie kamery." #: ../mugshot/CameraMugshotDialog.py:152 msgid "Cannot display camera output. Ignoring play command" msgstr "" #. Set the record button to retry, and disable it until the capture #. finishes. #: ../mugshot/CameraMugshotDialog.py:279 msgid "Retry" msgstr "Ponów" #: ../mugshot/MugshotWindow.py:321 msgid "Authentication cancelled." msgstr "" #: ../mugshot/MugshotWindow.py:324 msgid "Authentication failed." msgstr "" #: ../mugshot/MugshotWindow.py:327 msgid "An error occurred when saving changes." msgstr "" #: ../mugshot/MugshotWindow.py:329 msgid "User details were not updated." msgstr "Informacje o użytkowniku nie zostały uaktualnione." #: ../mugshot/MugshotWindow.py:498 msgid "Update Pidgin buddy icon?" msgstr "Ikona użytkownika programu Pidgin" #: ../mugshot/MugshotWindow.py:499 msgid "Would you also like to update your Pidgin buddy icon?" msgstr "Uaktualnić także ikonę użytkownika w programie Pidgin?" #: ../mugshot/MugshotWindow.py:589 msgid "Enter your password to change user details." msgstr "Proszę wprowadzić hasło, aby zmienić informacje o użytkowniku." #: ../mugshot/MugshotWindow.py:591 msgid "" "This is a security measure to prevent unwanted updates\n" "to your personal information." msgstr "" "Jest to krok zabezpieczający przed niechcianymi uaktualnieniami\n" "osobistej bazy danych." #: ../mugshot/MugshotWindow.py:796 msgid "Update LibreOffice user details?" msgstr "Informacje użytkownika programu LibreOffice" #: ../mugshot/MugshotWindow.py:797 msgid "Would you also like to update your user details in LibreOffice?" msgstr "Uaktualnić także informacje użytkownika w programie LibreOffice?" #: ../mugshot_lib/SudoDialog.py:122 msgid "Password Required" msgstr "" #: ../mugshot_lib/SudoDialog.py:159 msgid "Incorrect password... try again." msgstr "Nieprawidłowe hasło. Proszę spróbować ponownie." #: ../mugshot_lib/SudoDialog.py:169 msgid "Password:" msgstr "Hasło:" #. Buttons #: ../mugshot_lib/SudoDialog.py:180 msgid "Cancel" msgstr "Anuluj" #: ../mugshot_lib/SudoDialog.py:183 msgid "OK" msgstr "OK" #: ../mugshot_lib/SudoDialog.py:204 msgid "" "Enter your password to\n" "perform administrative tasks." msgstr "Proszę wprowadzić hasło, aby wykonać zadania administracyjne." #: ../mugshot_lib/SudoDialog.py:206 #, python-format msgid "" "The application '%s' lets you\n" "modify essential parts of your system." msgstr "" "Program „%s” pozwala na\n" "modyfikowanie istotnych elementów systemu." #: ../data/appdata/mugshot.appdata.xml.in.h:1 msgid "Lightweight user configuration" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:2 msgid "" "Mugshot enables users to easily update personal contact information. With " "Mugshot, users are able to:" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:3 msgid "" "Set the account photo displayed at login and optionally synchronize this " "photo with their Pidgin buddy icon" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:4 msgid "" "Set account details stored in /etc/passwd (usable with the finger command) " "and optionally synchronize with their LibreOffice contact information" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:5 msgid "" "This stable release improves Mugshot functionality for LDAP users, and " "includes the latest SudoDialog, improving the appearance and usability of " "the password dialog." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:6 msgid "" "This stable release improves the user configuration (chfn) backend and " "prevents Mugshot from locking up. Mugshot also no longer depends on " "AccountsService, but can leverage it to better support some systems. A " "critical bug that prevented some users from starting Mugshot was also " "addressed." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:7 msgid "" "This stable release improved AccountsService functionality and overall " "usability. Users without admin rights can no longer attempt to change their " "name, and initials are automatically populated when the name is entered." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:8 msgid "" "This stable release fixed a crash that occured when saving user details in a " "non-English locale. This release also included an updated translation " "template and new translations." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:9 msgid "" "This stable release fixed several bugs related to profile image management, " "introduced an improved password dialog, and transitioned to using GLib to " "more reliably determine user and environment settings." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:10 msgid "" "The first stable release introduced simplified packaging, replaced the Help " "functionality with the online help documents, and transitioned to using " "Python 3." msgstr "" #~ msgid "Cannot display camera output.Ignoring play command" #~ msgstr "" #~ "Nie można wyświetlić obrazu z kamery. Ignorowanie polecenia odtwarzania" mugshot-0.2.5/po/ja.po0000664000175000017500000002051512401206244014452 0ustar seansean00000000000000# Japanese translation for mugshot # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the mugshot package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: mugshot\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2014-08-31 21:40-0400\n" "PO-Revision-Date: 2014-03-30 02:53+0000\n" "Last-Translator: Ikuya Awashiro \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-09-01 07:34+0000\n" "X-Generator: Launchpad (build 17176)\n" #: ../mugshot.desktop.in.h:1 msgid "About Me" msgstr "個人情報" #: ../mugshot.desktop.in.h:2 msgid "Configure your profile image and contact details" msgstr "プロファイルの画像と連絡先の詳細を設定" #: ../data/ui/CameraMugshotDialog.ui.h:1 msgid "Capture - Mugshot" msgstr "キャプチャ - Mugshot" #: ../data/ui/MugshotWindow.ui.h:1 msgid "Preview" msgstr "プレビュー" #: ../data/ui/MugshotWindow.ui.h:2 msgid "Center" msgstr "中央" #: ../data/ui/MugshotWindow.ui.h:3 msgid "Left" msgstr "左" #: ../data/ui/MugshotWindow.ui.h:4 msgid "Right" msgstr "右" #: ../data/ui/MugshotWindow.ui.h:5 msgid "Crop" msgstr "切り抜き" #: ../data/ui/MugshotWindow.ui.h:6 msgid "Select from stock…" msgstr "ストックから選択..." #: ../data/ui/MugshotWindow.ui.h:7 msgid "Capture from camera…" msgstr "カメラでキャプチャ..." #: ../data/ui/MugshotWindow.ui.h:8 msgid "Browse…" msgstr "参照…" #: ../data/ui/MugshotWindow.ui.h:9 ../mugshot/MugshotWindow.py:588 msgid "Mugshot" msgstr "Mugshot" #: ../data/ui/MugshotWindow.ui.h:10 msgid "First Name" msgstr "" #: ../data/ui/MugshotWindow.ui.h:11 msgid "Last Name" msgstr "" #: ../data/ui/MugshotWindow.ui.h:12 msgid "Initials" msgstr "イニシャル" #: ../data/ui/MugshotWindow.ui.h:13 msgid "Home Phone" msgstr "電話番号" #: ../data/ui/MugshotWindow.ui.h:14 msgid "Email Address" msgstr "メールアドレス" #: ../data/ui/MugshotWindow.ui.h:15 msgid "Office Phone" msgstr "勤務先の電話番号" #: ../data/ui/MugshotWindow.ui.h:16 msgid "Fax" msgstr "FAX" #: ../data/ui/MugshotWindow.ui.h:17 msgid "Select a photo…" msgstr "写真の選択..." #: ../mugshot/__init__.py:35 msgid "Show debug messages (-vv debugs mugshot_lib also)" msgstr "デバッグメッセージの表示 (-vv debugs mugshot_lib でも可)" #: ../mugshot/CameraMugshotDialog.py:107 #, python-format msgid "Camera failed to load. Devices: %s" msgstr "%s のカメラのロードに失敗しました。" #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:125 msgid "" "Sorry, but your camera\n" "failed to initialize." msgstr "" "申し訳ございません、カメラ\n" "の読み込みに失敗しました。" #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:132 msgid "" "Please wait while your\n" "camera is initialized." msgstr "" "カメラの初期化が終わるまで\n" "お待ちください。" #: ../mugshot/CameraMugshotDialog.py:152 msgid "Cannot display camera output. Ignoring play command" msgstr "" #. Set the record button to retry, and disable it until the capture #. finishes. #: ../mugshot/CameraMugshotDialog.py:279 msgid "Retry" msgstr "再試行" #: ../mugshot/MugshotWindow.py:321 msgid "Authentication cancelled." msgstr "" #: ../mugshot/MugshotWindow.py:324 msgid "Authentication failed." msgstr "" #: ../mugshot/MugshotWindow.py:327 msgid "An error occurred when saving changes." msgstr "" #: ../mugshot/MugshotWindow.py:329 msgid "User details were not updated." msgstr "ユーザーの詳細はアップデートされませんでした。" #: ../mugshot/MugshotWindow.py:498 msgid "Update Pidgin buddy icon?" msgstr "Pigdinの仲間アイコン" #: ../mugshot/MugshotWindow.py:499 msgid "Would you also like to update your Pidgin buddy icon?" msgstr "Pigdinの仲間アイコンもアップデートしますか?" #: ../mugshot/MugshotWindow.py:589 msgid "Enter your password to change user details." msgstr "ユーザーの詳細を変更するためにパスワードを入力してください。" #: ../mugshot/MugshotWindow.py:591 msgid "" "This is a security measure to prevent unwanted updates\n" "to your personal information." msgstr "" "個人情報を希望していないのにアップデート\n" "されないようにするセキュリティの方針です。" #: ../mugshot/MugshotWindow.py:796 msgid "Update LibreOffice user details?" msgstr "LibreOfficeのユーザー詳細" #: ../mugshot/MugshotWindow.py:797 msgid "Would you also like to update your user details in LibreOffice?" msgstr "LibreOfficeのユーザー詳細もアップデートしますか?" #: ../mugshot_lib/SudoDialog.py:122 msgid "Password Required" msgstr "" #: ../mugshot_lib/SudoDialog.py:159 msgid "Incorrect password... try again." msgstr "パスワードが正しくありません... 再入力してください。" #: ../mugshot_lib/SudoDialog.py:169 msgid "Password:" msgstr "パスワード:" #. Buttons #: ../mugshot_lib/SudoDialog.py:180 msgid "Cancel" msgstr "キャンセル" #: ../mugshot_lib/SudoDialog.py:183 msgid "OK" msgstr "OK" #: ../mugshot_lib/SudoDialog.py:204 msgid "" "Enter your password to\n" "perform administrative tasks." msgstr "" "管理者権限が必要な操作を実行するため\n" "パスワードを入力してください。" #: ../mugshot_lib/SudoDialog.py:206 #, python-format msgid "" "The application '%s' lets you\n" "modify essential parts of your system." msgstr "" "アプリケーション '%s' はシステムの\n" "主要な部分を修正しました。" #: ../data/appdata/mugshot.appdata.xml.in.h:1 msgid "Lightweight user configuration" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:2 msgid "" "Mugshot enables users to easily update personal contact information. With " "Mugshot, users are able to:" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:3 msgid "" "Set the account photo displayed at login and optionally synchronize this " "photo with their Pidgin buddy icon" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:4 msgid "" "Set account details stored in /etc/passwd (usable with the finger command) " "and optionally synchronize with their LibreOffice contact information" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:5 msgid "" "This stable release improves Mugshot functionality for LDAP users, and " "includes the latest SudoDialog, improving the appearance and usability of " "the password dialog." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:6 msgid "" "This stable release improves the user configuration (chfn) backend and " "prevents Mugshot from locking up. Mugshot also no longer depends on " "AccountsService, but can leverage it to better support some systems. A " "critical bug that prevented some users from starting Mugshot was also " "addressed." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:7 msgid "" "This stable release improved AccountsService functionality and overall " "usability. Users without admin rights can no longer attempt to change their " "name, and initials are automatically populated when the name is entered." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:8 msgid "" "This stable release fixed a crash that occured when saving user details in a " "non-English locale. This release also included an updated translation " "template and new translations." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:9 msgid "" "This stable release fixed several bugs related to profile image management, " "introduced an improved password dialog, and transitioned to using GLib to " "more reliably determine user and environment settings." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:10 msgid "" "The first stable release introduced simplified packaging, replaced the Help " "functionality with the online help documents, and transitioned to using " "Python 3." msgstr "" #~ msgid "Cannot display camera output.Ignoring play command" #~ msgstr "カメラの出力を表示できませんでした。再生コマンドが無視されました。" mugshot-0.2.5/po/fr.po0000664000175000017500000002037312401206244014471 0ustar seansean00000000000000# French translation for mugshot # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the mugshot package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: mugshot\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2014-08-31 21:40-0400\n" "PO-Revision-Date: 2014-05-19 20:17+0000\n" "Last-Translator: Jean Marc \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-09-01 07:33+0000\n" "X-Generator: Launchpad (build 17176)\n" #: ../mugshot.desktop.in.h:1 msgid "About Me" msgstr "À mon sujet" #: ../mugshot.desktop.in.h:2 msgid "Configure your profile image and contact details" msgstr "Configurer les informations de contact et la photo de votre profil" #: ../data/ui/CameraMugshotDialog.ui.h:1 msgid "Capture - Mugshot" msgstr "Prendre une photo - Mugshot" #: ../data/ui/MugshotWindow.ui.h:1 msgid "Preview" msgstr "Aperçu" #: ../data/ui/MugshotWindow.ui.h:2 msgid "Center" msgstr "Au centre" #: ../data/ui/MugshotWindow.ui.h:3 msgid "Left" msgstr "À gauche" #: ../data/ui/MugshotWindow.ui.h:4 msgid "Right" msgstr "À droite" #: ../data/ui/MugshotWindow.ui.h:5 msgid "Crop" msgstr "Recadrer" #: ../data/ui/MugshotWindow.ui.h:6 msgid "Select from stock…" msgstr "Sélectionner dans la collection..." #: ../data/ui/MugshotWindow.ui.h:7 msgid "Capture from camera…" msgstr "Prendre une photo..." #: ../data/ui/MugshotWindow.ui.h:8 msgid "Browse…" msgstr "Parcourir…" #: ../data/ui/MugshotWindow.ui.h:9 ../mugshot/MugshotWindow.py:588 msgid "Mugshot" msgstr "Mugshot" #: ../data/ui/MugshotWindow.ui.h:10 msgid "First Name" msgstr "Prénom" #: ../data/ui/MugshotWindow.ui.h:11 msgid "Last Name" msgstr "Nom" #: ../data/ui/MugshotWindow.ui.h:12 msgid "Initials" msgstr "Initiales" #: ../data/ui/MugshotWindow.ui.h:13 msgid "Home Phone" msgstr "Téléphone domicile" #: ../data/ui/MugshotWindow.ui.h:14 msgid "Email Address" msgstr "Courriel" #: ../data/ui/MugshotWindow.ui.h:15 msgid "Office Phone" msgstr "Téléphone bureau" #: ../data/ui/MugshotWindow.ui.h:16 msgid "Fax" msgstr "Fax" #: ../data/ui/MugshotWindow.ui.h:17 msgid "Select a photo…" msgstr "Sélectionner une photo..." #: ../mugshot/__init__.py:35 msgid "Show debug messages (-vv debugs mugshot_lib also)" msgstr "Afficher les messages de débogage (-vv débogue aussi mugshot_lib)" #: ../mugshot/CameraMugshotDialog.py:107 #, python-format msgid "Camera failed to load. Devices: %s" msgstr "Impossible d’activer la caméra. Périphériques : %s" #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:125 msgid "" "Sorry, but your camera\n" "failed to initialize." msgstr "" "Désolé, votre caméra n’a\n" "pu être initialisée." #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:132 msgid "" "Please wait while your\n" "camera is initialized." msgstr "" "Veuillez patienter pendant\n" "l’initialisation de votre caméra." #: ../mugshot/CameraMugshotDialog.py:152 msgid "Cannot display camera output. Ignoring play command" msgstr "" #. Set the record button to retry, and disable it until the capture #. finishes. #: ../mugshot/CameraMugshotDialog.py:279 msgid "Retry" msgstr "Réessayer" #: ../mugshot/MugshotWindow.py:321 msgid "Authentication cancelled." msgstr "" #: ../mugshot/MugshotWindow.py:324 msgid "Authentication failed." msgstr "" #: ../mugshot/MugshotWindow.py:327 msgid "An error occurred when saving changes." msgstr "" #: ../mugshot/MugshotWindow.py:329 msgid "User details were not updated." msgstr "Les informations utilisateur n’ont pas été mises à jour." #: ../mugshot/MugshotWindow.py:498 msgid "Update Pidgin buddy icon?" msgstr "Mettre à jour l’avatar dans Pidgin ?" #: ../mugshot/MugshotWindow.py:499 msgid "Would you also like to update your Pidgin buddy icon?" msgstr "Souhaitez-vous également mettre à jour votre avatar dans Pidgin ?" #: ../mugshot/MugshotWindow.py:589 msgid "Enter your password to change user details." msgstr "" "Saisissez votre mot de passe afin de modifier les informations utilisateur." #: ../mugshot/MugshotWindow.py:591 msgid "" "This is a security measure to prevent unwanted updates\n" "to your personal information." msgstr "" "Il s’agit d’une mesure de sécurité visant à prévenir les\n" "modifications indésirées de vos informations personnelles." #: ../mugshot/MugshotWindow.py:796 msgid "Update LibreOffice user details?" msgstr "Mettre à jour les informations utilisateur de LibreOffice ?" #: ../mugshot/MugshotWindow.py:797 msgid "Would you also like to update your user details in LibreOffice?" msgstr "" "Souhaitez-vous également mettre à jour les informations utilisateur dans " "LibreOffice ?" #: ../mugshot_lib/SudoDialog.py:122 msgid "Password Required" msgstr "" #: ../mugshot_lib/SudoDialog.py:159 msgid "Incorrect password... try again." msgstr "Mot de passe incorrect... Veuillez réessayer." #: ../mugshot_lib/SudoDialog.py:169 msgid "Password:" msgstr "Mot de passe :" #. Buttons #: ../mugshot_lib/SudoDialog.py:180 msgid "Cancel" msgstr "Annuler" #: ../mugshot_lib/SudoDialog.py:183 msgid "OK" msgstr "OK" #: ../mugshot_lib/SudoDialog.py:204 msgid "" "Enter your password to\n" "perform administrative tasks." msgstr "" "Saisissez votre mot de passe afin\n" "d’effectuer des tâches administratives." #: ../mugshot_lib/SudoDialog.py:206 #, python-format msgid "" "The application '%s' lets you\n" "modify essential parts of your system." msgstr "" "L’application « %s » vous permet de modifier\n" "des éléments essentiels de votre système." #: ../data/appdata/mugshot.appdata.xml.in.h:1 msgid "Lightweight user configuration" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:2 msgid "" "Mugshot enables users to easily update personal contact information. With " "Mugshot, users are able to:" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:3 msgid "" "Set the account photo displayed at login and optionally synchronize this " "photo with their Pidgin buddy icon" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:4 msgid "" "Set account details stored in /etc/passwd (usable with the finger command) " "and optionally synchronize with their LibreOffice contact information" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:5 msgid "" "This stable release improves Mugshot functionality for LDAP users, and " "includes the latest SudoDialog, improving the appearance and usability of " "the password dialog." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:6 msgid "" "This stable release improves the user configuration (chfn) backend and " "prevents Mugshot from locking up. Mugshot also no longer depends on " "AccountsService, but can leverage it to better support some systems. A " "critical bug that prevented some users from starting Mugshot was also " "addressed." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:7 msgid "" "This stable release improved AccountsService functionality and overall " "usability. Users without admin rights can no longer attempt to change their " "name, and initials are automatically populated when the name is entered." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:8 msgid "" "This stable release fixed a crash that occured when saving user details in a " "non-English locale. This release also included an updated translation " "template and new translations." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:9 msgid "" "This stable release fixed several bugs related to profile image management, " "introduced an improved password dialog, and transitioned to using GLib to " "more reliably determine user and environment settings." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:10 msgid "" "The first stable release introduced simplified packaging, replaced the Help " "functionality with the online help documents, and transitioned to using " "Python 3." msgstr "" #~ msgid "Cannot display camera output.Ignoring play command" #~ msgstr "Impossible d’afficher la sortie caméra. Lecture annulée" mugshot-0.2.5/po/de.po0000664000175000017500000002320412401206244014446 0ustar seansean00000000000000# German translation for mugshot # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the mugshot package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: mugshot\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2014-08-31 21:40-0400\n" "PO-Revision-Date: 2014-08-31 22:34+0000\n" "Last-Translator: Simon Steinbeiß \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-09-01 07:34+0000\n" "X-Generator: Launchpad (build 17176)\n" #: ../mugshot.desktop.in.h:1 msgid "About Me" msgstr "Persönliche Informationen" #: ../mugshot.desktop.in.h:2 msgid "Configure your profile image and contact details" msgstr "Profilbild und Kontaktdetails konfigurieren" #: ../data/ui/CameraMugshotDialog.ui.h:1 msgid "Capture - Mugshot" msgstr "Aufnahme - Mugshot" #: ../data/ui/MugshotWindow.ui.h:1 msgid "Preview" msgstr "Vorschau" #: ../data/ui/MugshotWindow.ui.h:2 msgid "Center" msgstr "Mitte" #: ../data/ui/MugshotWindow.ui.h:3 msgid "Left" msgstr "Links" #: ../data/ui/MugshotWindow.ui.h:4 msgid "Right" msgstr "Rechts" #: ../data/ui/MugshotWindow.ui.h:5 msgid "Crop" msgstr "Zuschneiden" #: ../data/ui/MugshotWindow.ui.h:6 msgid "Select from stock…" msgstr "Aus den Vorlagen auswählen …" #: ../data/ui/MugshotWindow.ui.h:7 msgid "Capture from camera…" msgstr "Mit der Kamera aufnehmen …" #: ../data/ui/MugshotWindow.ui.h:8 msgid "Browse…" msgstr "Durchsuchen …" #: ../data/ui/MugshotWindow.ui.h:9 ../mugshot/MugshotWindow.py:588 msgid "Mugshot" msgstr "Benutzerfoto" #: ../data/ui/MugshotWindow.ui.h:10 msgid "First Name" msgstr "Vorname" #: ../data/ui/MugshotWindow.ui.h:11 msgid "Last Name" msgstr "Nachname" #: ../data/ui/MugshotWindow.ui.h:12 msgid "Initials" msgstr "Initialien" #: ../data/ui/MugshotWindow.ui.h:13 msgid "Home Phone" msgstr "Private Telefonnummer" #: ../data/ui/MugshotWindow.ui.h:14 msgid "Email Address" msgstr "E-Mail-Adresse" #: ../data/ui/MugshotWindow.ui.h:15 msgid "Office Phone" msgstr "Geschäftstelefon" #: ../data/ui/MugshotWindow.ui.h:16 msgid "Fax" msgstr "Fax" #: ../data/ui/MugshotWindow.ui.h:17 msgid "Select a photo…" msgstr "Foto auswählen …" #: ../mugshot/__init__.py:35 msgid "Show debug messages (-vv debugs mugshot_lib also)" msgstr "Fehlerdiagnosenachrichten anzeigen (auch -vv debugs mugshot_lib)" #: ../mugshot/CameraMugshotDialog.py:107 #, python-format msgid "Camera failed to load. Devices: %s" msgstr "Kamera konnte nicht geladen werden. Geräte: %s" #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:125 msgid "" "Sorry, but your camera\n" "failed to initialize." msgstr "" "Die Kamera konnte leider\n" "nicht initialisiert werden." #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:132 msgid "" "Please wait while your\n" "camera is initialized." msgstr "" "Bitten warten während die\n" "Kamera initialisiert wird." #: ../mugshot/CameraMugshotDialog.py:152 msgid "Cannot display camera output. Ignoring play command" msgstr "" #. Set the record button to retry, and disable it until the capture #. finishes. #: ../mugshot/CameraMugshotDialog.py:279 msgid "Retry" msgstr "Erneut versuchen" #: ../mugshot/MugshotWindow.py:321 msgid "Authentication cancelled." msgstr "Authentifizierung abgebrochen." #: ../mugshot/MugshotWindow.py:324 msgid "Authentication failed." msgstr "Authentifizierung fehlgeschlagen." #: ../mugshot/MugshotWindow.py:327 msgid "An error occurred when saving changes." msgstr "Beim Speichern der Änderungen ist ein Fehler aufgetreten." #: ../mugshot/MugshotWindow.py:329 msgid "User details were not updated." msgstr "Benutzerdatails wurden nicht aktualisiert." #: ../mugshot/MugshotWindow.py:498 msgid "Update Pidgin buddy icon?" msgstr "Pidgin-Freundesymbol aktualisieren?" #: ../mugshot/MugshotWindow.py:499 msgid "Would you also like to update your Pidgin buddy icon?" msgstr "Soll das Pidgin-Freundesymbol auch aktualisiert werden?" #: ../mugshot/MugshotWindow.py:589 msgid "Enter your password to change user details." msgstr "Passwort eingeben um die Nutzerdaten zu verändern." #: ../mugshot/MugshotWindow.py:591 msgid "" "This is a security measure to prevent unwanted updates\n" "to your personal information." msgstr "" "Dies ist eine Sicherheitsmaßnahme um ungewollte Aktualisierungen\n" "der persönlichen Informationen zu verhindern." #: ../mugshot/MugshotWindow.py:796 msgid "Update LibreOffice user details?" msgstr "LibreOffice-Benutzerdaten aktualisieren?" #: ../mugshot/MugshotWindow.py:797 msgid "Would you also like to update your user details in LibreOffice?" msgstr "Sollen die LibreOffice-Benutzerdaten auch aktualisiert werden?" #: ../mugshot_lib/SudoDialog.py:122 msgid "Password Required" msgstr "Passwort erforderlich" #: ../mugshot_lib/SudoDialog.py:159 msgid "Incorrect password... try again." msgstr "Falsches Passwort … bitte erneut versuchen." #: ../mugshot_lib/SudoDialog.py:169 msgid "Password:" msgstr "Passwort:" #. Buttons #: ../mugshot_lib/SudoDialog.py:180 msgid "Cancel" msgstr "Abbrechen" #: ../mugshot_lib/SudoDialog.py:183 msgid "OK" msgstr "OK" #: ../mugshot_lib/SudoDialog.py:204 msgid "" "Enter your password to\n" "perform administrative tasks." msgstr "" "Passwort eingeben, um\n" "administrative Aufgaben durchzuführen." #: ../mugshot_lib/SudoDialog.py:206 #, python-format msgid "" "The application '%s' lets you\n" "modify essential parts of your system." msgstr "" "Die Anwendung »%s« ermöglicht die\n" "Veränderung von wesentlichen Teilen Ihres Betriebssystems." #: ../data/appdata/mugshot.appdata.xml.in.h:1 msgid "Lightweight user configuration" msgstr "Einfache Nutzerkonfiguration" #: ../data/appdata/mugshot.appdata.xml.in.h:2 msgid "" "Mugshot enables users to easily update personal contact information. With " "Mugshot, users are able to:" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:3 msgid "" "Set the account photo displayed at login and optionally synchronize this " "photo with their Pidgin buddy icon" msgstr "" "Das Profil-Photo, das beim Login angezeigt wird, einstellen und es optional " "mit dem Pidgin buddy icon synchronisieren." #: ../data/appdata/mugshot.appdata.xml.in.h:4 msgid "" "Set account details stored in /etc/passwd (usable with the finger command) " "and optionally synchronize with their LibreOffice contact information" msgstr "" "Nutzerkonto-Details, die in /etc/passwd gespeichert werden verändern und " "optional mit den LibreOffice Kontaktinformationen synchronisieren." #: ../data/appdata/mugshot.appdata.xml.in.h:5 msgid "" "This stable release improves Mugshot functionality for LDAP users, and " "includes the latest SudoDialog, improving the appearance and usability of " "the password dialog." msgstr "" "Dieser stabile Release verbessert die LDAP Funktionalität und beinhaltet den " "aktuellsten SudoDialog, wodurch das Erscheinungsbild und die " "Nutzerfreundlichkeit des Passwort-Dialogs verbessert wird." #: ../data/appdata/mugshot.appdata.xml.in.h:6 msgid "" "This stable release improves the user configuration (chfn) backend and " "prevents Mugshot from locking up. Mugshot also no longer depends on " "AccountsService, but can leverage it to better support some systems. A " "critical bug that prevented some users from starting Mugshot was also " "addressed." msgstr "" "Dieser stabile Release verbessert die Benutzerkonfiguration (chfn) und " "verhindert, dass Mugshot abstürzt. Mugshot hängt nun nicht mehr von " "AccountsService ab, kann es aber besser zur Unterstützung von bestimmten " "System einsetzen. Ein kritischer Fehler, der manche Nutzer am Start von " "Mugshot hinderte ist ebenso behoben." #: ../data/appdata/mugshot.appdata.xml.in.h:7 msgid "" "This stable release improved AccountsService functionality and overall " "usability. Users without admin rights can no longer attempt to change their " "name, and initials are automatically populated when the name is entered." msgstr "" "Dieser stabile Release verbessert die AccountsService Funktionalität und die " "allgemeine Nutzerfreundlichkeit. Anwender ohne Administrator-Rechte können " "ihren Namen nicht mehr ändern und die Initialen werden automatisch ergänzt, " "wenn der Name eingegeben wurde." #: ../data/appdata/mugshot.appdata.xml.in.h:8 msgid "" "This stable release fixed a crash that occured when saving user details in a " "non-English locale. This release also included an updated translation " "template and new translations." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:9 msgid "" "This stable release fixed several bugs related to profile image management, " "introduced an improved password dialog, and transitioned to using GLib to " "more reliably determine user and environment settings." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:10 msgid "" "The first stable release introduced simplified packaging, replaced the Help " "functionality with the online help documents, and transitioned to using " "Python 3." msgstr "" #~ msgid "" #~ "Mugshot enables users to easily updates personal contact information. With " #~ "Mugshot, users are able to:" #~ msgstr "" #~ "Mugshot ermöglicht es Nutzern ihre persönlichen Kontaktinformationen einfach " #~ "zu verändern. Nutzer können mit Mugshot:" #~ msgid "Cannot display camera output.Ignoring play command" #~ msgstr "" #~ "Die Kamera-Ausgabe kann nicht angezeigt werden. Der Abspielbefehl wird " #~ "ignoriert." mugshot-0.2.5/po/it.po0000664000175000017500000001631112401206244014473 0ustar seansean00000000000000# Italian translation for mugshot # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the mugshot package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: mugshot\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2014-08-31 21:40-0400\n" "PO-Revision-Date: 2013-08-14 22:31+0000\n" "Last-Translator: Edoardo Maria Elidoro \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-09-01 07:34+0000\n" "X-Generator: Launchpad (build 17176)\n" #: ../mugshot.desktop.in.h:1 msgid "About Me" msgstr "Informazioni personali" #: ../mugshot.desktop.in.h:2 msgid "Configure your profile image and contact details" msgstr "Configura l'immagine del profilo e i dettagli del contatto" #: ../data/ui/CameraMugshotDialog.ui.h:1 msgid "Capture - Mugshot" msgstr "Cattura - Mugshot" #: ../data/ui/MugshotWindow.ui.h:1 msgid "Preview" msgstr "Anteprima" #: ../data/ui/MugshotWindow.ui.h:2 msgid "Center" msgstr "Centra" #: ../data/ui/MugshotWindow.ui.h:3 msgid "Left" msgstr "Sinistra" #: ../data/ui/MugshotWindow.ui.h:4 msgid "Right" msgstr "Destra" #: ../data/ui/MugshotWindow.ui.h:5 msgid "Crop" msgstr "Ritaglia" #: ../data/ui/MugshotWindow.ui.h:6 msgid "Select from stock…" msgstr "Seleziona tra le immagini stock..." #: ../data/ui/MugshotWindow.ui.h:7 msgid "Capture from camera…" msgstr "Cattura dalla webcam..." #: ../data/ui/MugshotWindow.ui.h:8 msgid "Browse…" msgstr "Esplora..." #: ../data/ui/MugshotWindow.ui.h:9 ../mugshot/MugshotWindow.py:588 msgid "Mugshot" msgstr "" #: ../data/ui/MugshotWindow.ui.h:10 msgid "First Name" msgstr "Nome" #: ../data/ui/MugshotWindow.ui.h:11 msgid "Last Name" msgstr "Cognome" #: ../data/ui/MugshotWindow.ui.h:12 msgid "Initials" msgstr "Iniziali" #: ../data/ui/MugshotWindow.ui.h:13 msgid "Home Phone" msgstr "Telefono di casa" #: ../data/ui/MugshotWindow.ui.h:14 msgid "Email Address" msgstr "Indirizzo Email" #: ../data/ui/MugshotWindow.ui.h:15 msgid "Office Phone" msgstr "Telefono dell'ufficio" #: ../data/ui/MugshotWindow.ui.h:16 msgid "Fax" msgstr "Fax" #: ../data/ui/MugshotWindow.ui.h:17 msgid "Select a photo…" msgstr "Seleziona una foto..." #: ../mugshot/__init__.py:35 msgid "Show debug messages (-vv debugs mugshot_lib also)" msgstr "" #: ../mugshot/CameraMugshotDialog.py:107 #, python-format msgid "Camera failed to load. Devices: %s" msgstr "" #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:125 msgid "" "Sorry, but your camera\n" "failed to initialize." msgstr "" #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:132 msgid "" "Please wait while your\n" "camera is initialized." msgstr "" #: ../mugshot/CameraMugshotDialog.py:152 msgid "Cannot display camera output. Ignoring play command" msgstr "" #. Set the record button to retry, and disable it until the capture #. finishes. #: ../mugshot/CameraMugshotDialog.py:279 msgid "Retry" msgstr "Riprova" #: ../mugshot/MugshotWindow.py:321 msgid "Authentication cancelled." msgstr "" #: ../mugshot/MugshotWindow.py:324 msgid "Authentication failed." msgstr "" #: ../mugshot/MugshotWindow.py:327 msgid "An error occurred when saving changes." msgstr "" #: ../mugshot/MugshotWindow.py:329 msgid "User details were not updated." msgstr "" #: ../mugshot/MugshotWindow.py:498 msgid "Update Pidgin buddy icon?" msgstr "" #: ../mugshot/MugshotWindow.py:499 msgid "Would you also like to update your Pidgin buddy icon?" msgstr "" #: ../mugshot/MugshotWindow.py:589 msgid "Enter your password to change user details." msgstr "" #: ../mugshot/MugshotWindow.py:591 msgid "" "This is a security measure to prevent unwanted updates\n" "to your personal information." msgstr "" "Questa è una misura di sicurezza per evitare aggiornamenti\n" "indesiderati alle tue informazioni." #: ../mugshot/MugshotWindow.py:796 msgid "Update LibreOffice user details?" msgstr "" #: ../mugshot/MugshotWindow.py:797 msgid "Would you also like to update your user details in LibreOffice?" msgstr "" #: ../mugshot_lib/SudoDialog.py:122 msgid "Password Required" msgstr "" #: ../mugshot_lib/SudoDialog.py:159 msgid "Incorrect password... try again." msgstr "" #: ../mugshot_lib/SudoDialog.py:169 msgid "Password:" msgstr "Password:" #. Buttons #: ../mugshot_lib/SudoDialog.py:180 msgid "Cancel" msgstr "" #: ../mugshot_lib/SudoDialog.py:183 msgid "OK" msgstr "" #: ../mugshot_lib/SudoDialog.py:204 msgid "" "Enter your password to\n" "perform administrative tasks." msgstr "" #: ../mugshot_lib/SudoDialog.py:206 #, python-format msgid "" "The application '%s' lets you\n" "modify essential parts of your system." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:1 msgid "Lightweight user configuration" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:2 msgid "" "Mugshot enables users to easily update personal contact information. With " "Mugshot, users are able to:" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:3 msgid "" "Set the account photo displayed at login and optionally synchronize this " "photo with their Pidgin buddy icon" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:4 msgid "" "Set account details stored in /etc/passwd (usable with the finger command) " "and optionally synchronize with their LibreOffice contact information" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:5 msgid "" "This stable release improves Mugshot functionality for LDAP users, and " "includes the latest SudoDialog, improving the appearance and usability of " "the password dialog." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:6 msgid "" "This stable release improves the user configuration (chfn) backend and " "prevents Mugshot from locking up. Mugshot also no longer depends on " "AccountsService, but can leverage it to better support some systems. A " "critical bug that prevented some users from starting Mugshot was also " "addressed." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:7 msgid "" "This stable release improved AccountsService functionality and overall " "usability. Users without admin rights can no longer attempt to change their " "name, and initials are automatically populated when the name is entered." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:8 msgid "" "This stable release fixed a crash that occured when saving user details in a " "non-English locale. This release also included an updated translation " "template and new translations." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:9 msgid "" "This stable release fixed several bugs related to profile image management, " "introduced an improved password dialog, and transitioned to using GLib to " "more reliably determine user and environment settings." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:10 msgid "" "The first stable release introduced simplified packaging, replaced the Help " "functionality with the online help documents, and transitioned to using " "Python 3." msgstr "" mugshot-0.2.5/po/sr.po0000664000175000017500000002141012401206244014477 0ustar seansean00000000000000# Serbian translation for mugshot # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the mugshot package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: mugshot\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2014-08-31 21:40-0400\n" "PO-Revision-Date: 2014-04-16 18:33+0000\n" "Last-Translator: Саша Петровић \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-09-01 07:34+0000\n" "X-Generator: Launchpad (build 17176)\n" #: ../mugshot.desktop.in.h:1 msgid "About Me" msgstr "О мени" #: ../mugshot.desktop.in.h:2 msgid "Configure your profile image and contact details" msgstr "Подесите своју слику и податке о налогу" #: ../data/ui/CameraMugshotDialog.ui.h:1 msgid "Capture - Mugshot" msgstr "" #: ../data/ui/MugshotWindow.ui.h:1 msgid "Preview" msgstr "Преглед" #: ../data/ui/MugshotWindow.ui.h:2 msgid "Center" msgstr "Средина" #: ../data/ui/MugshotWindow.ui.h:3 msgid "Left" msgstr "Лево" #: ../data/ui/MugshotWindow.ui.h:4 msgid "Right" msgstr "Десно" #: ../data/ui/MugshotWindow.ui.h:5 msgid "Crop" msgstr "Опсеци" #: ../data/ui/MugshotWindow.ui.h:6 msgid "Select from stock…" msgstr "" #: ../data/ui/MugshotWindow.ui.h:7 msgid "Capture from camera…" msgstr "Сними камерицом..." #: ../data/ui/MugshotWindow.ui.h:8 msgid "Browse…" msgstr "Разгледај…" #: ../data/ui/MugshotWindow.ui.h:9 ../mugshot/MugshotWindow.py:588 msgid "Mugshot" msgstr "" #: ../data/ui/MugshotWindow.ui.h:10 msgid "First Name" msgstr "Име" #: ../data/ui/MugshotWindow.ui.h:11 msgid "Last Name" msgstr "Презиме" #: ../data/ui/MugshotWindow.ui.h:12 msgid "Initials" msgstr "почетна слова" #: ../data/ui/MugshotWindow.ui.h:13 msgid "Home Phone" msgstr "Кућни телефон" #: ../data/ui/MugshotWindow.ui.h:14 msgid "Email Address" msgstr "Адреса е-поште" #: ../data/ui/MugshotWindow.ui.h:15 msgid "Office Phone" msgstr "Телефон на послу" #: ../data/ui/MugshotWindow.ui.h:16 msgid "Fax" msgstr "Факс" #: ../data/ui/MugshotWindow.ui.h:17 msgid "Select a photo…" msgstr "Изаберите слику..." #: ../mugshot/__init__.py:35 msgid "Show debug messages (-vv debugs mugshot_lib also)" msgstr "" "Прикажи поруке о грешкама (-vv приказује и грешке библиотеке mugshot_lib)" #: ../mugshot/CameraMugshotDialog.py:107 #, python-format msgid "Camera failed to load. Devices: %s" msgstr "Нисам успео да покренем камерицу. Уређаји: %s" #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:125 msgid "" "Sorry, but your camera\n" "failed to initialize." msgstr "" "Жао ми је, нисам успео\n" "да покренем камерицу." #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:132 msgid "" "Please wait while your\n" "camera is initialized." msgstr "" "Молим, сачекајте да\n" "се камерица покрене." #: ../mugshot/CameraMugshotDialog.py:152 msgid "Cannot display camera output. Ignoring play command" msgstr "" #. Set the record button to retry, and disable it until the capture #. finishes. #: ../mugshot/CameraMugshotDialog.py:279 msgid "Retry" msgstr "Покушај поново" #: ../mugshot/MugshotWindow.py:321 msgid "Authentication cancelled." msgstr "" #: ../mugshot/MugshotWindow.py:324 msgid "Authentication failed." msgstr "" #: ../mugshot/MugshotWindow.py:327 msgid "An error occurred when saving changes." msgstr "" #: ../mugshot/MugshotWindow.py:329 msgid "User details were not updated." msgstr "Кориснички подаци нису освежени." #: ../mugshot/MugshotWindow.py:498 msgid "Update Pidgin buddy icon?" msgstr "Да ли да освежим иконицу другара Пиџина?" #: ../mugshot/MugshotWindow.py:499 msgid "Would you also like to update your Pidgin buddy icon?" msgstr "Да ли желите да освежите своју иконицу другара у Пиџину?" #: ../mugshot/MugshotWindow.py:589 msgid "Enter your password to change user details." msgstr "Унесите своју лозинку ради промене корисничких података." #: ../mugshot/MugshotWindow.py:591 msgid "" "This is a security measure to prevent unwanted updates\n" "to your personal information." msgstr "" "Ово је безбедносна мера ради спречавања нежељених промена\n" "личних података." #: ../mugshot/MugshotWindow.py:796 msgid "Update LibreOffice user details?" msgstr "Да ли да освежим корисничке податке Либре Офиса?" #: ../mugshot/MugshotWindow.py:797 msgid "Would you also like to update your user details in LibreOffice?" msgstr "Да ли би желели да освежите своје корисничке податке у Либре Офису?" #: ../mugshot_lib/SudoDialog.py:122 msgid "Password Required" msgstr "" #: ../mugshot_lib/SudoDialog.py:159 msgid "Incorrect password... try again." msgstr "Лозинка је нетачна... Покушајте поново." #: ../mugshot_lib/SudoDialog.py:169 msgid "Password:" msgstr "Лозинка:" #. Buttons #: ../mugshot_lib/SudoDialog.py:180 msgid "Cancel" msgstr "Откажи" #: ../mugshot_lib/SudoDialog.py:183 msgid "OK" msgstr "У реду" #: ../mugshot_lib/SudoDialog.py:204 msgid "" "Enter your password to\n" "perform administrative tasks." msgstr "" "Унесите своју лозинку ради\n" "обављања управачких задатака." #: ../mugshot_lib/SudoDialog.py:206 #, python-format msgid "" "The application '%s' lets you\n" "modify essential parts of your system." msgstr "" "Програм „%s“ омогућава\n" "измену кључних делова система." #: ../data/appdata/mugshot.appdata.xml.in.h:1 msgid "Lightweight user configuration" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:2 msgid "" "Mugshot enables users to easily update personal contact information. With " "Mugshot, users are able to:" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:3 msgid "" "Set the account photo displayed at login and optionally synchronize this " "photo with their Pidgin buddy icon" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:4 msgid "" "Set account details stored in /etc/passwd (usable with the finger command) " "and optionally synchronize with their LibreOffice contact information" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:5 msgid "" "This stable release improves Mugshot functionality for LDAP users, and " "includes the latest SudoDialog, improving the appearance and usability of " "the password dialog." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:6 msgid "" "This stable release improves the user configuration (chfn) backend and " "prevents Mugshot from locking up. Mugshot also no longer depends on " "AccountsService, but can leverage it to better support some systems. A " "critical bug that prevented some users from starting Mugshot was also " "addressed." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:7 msgid "" "This stable release improved AccountsService functionality and overall " "usability. Users without admin rights can no longer attempt to change their " "name, and initials are automatically populated when the name is entered." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:8 msgid "" "This stable release fixed a crash that occured when saving user details in a " "non-English locale. This release also included an updated translation " "template and new translations." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:9 msgid "" "This stable release fixed several bugs related to profile image management, " "introduced an improved password dialog, and transitioned to using GLib to " "more reliably determine user and environment settings." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:10 msgid "" "The first stable release introduced simplified packaging, replaced the Help " "functionality with the online help documents, and transitioned to using " "Python 3." msgstr "" #~ msgid "Cannot display camera output.Ignoring play command" #~ msgstr "" #~ "Нисам успео да прикажем излаз камерице. Занемарујем наредбу приказивања" mugshot-0.2.5/po/eu.po0000664000175000017500000001543512401206244014476 0ustar seansean00000000000000# Basque translation for mugshot # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the mugshot package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: mugshot\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2014-08-31 21:40-0400\n" "PO-Revision-Date: 2014-07-14 23:39+0000\n" "Last-Translator: Adolfo Jayme \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-09-01 07:33+0000\n" "X-Generator: Launchpad (build 17176)\n" #: ../mugshot.desktop.in.h:1 msgid "About Me" msgstr "Niri buruz" #: ../mugshot.desktop.in.h:2 msgid "Configure your profile image and contact details" msgstr "" #: ../data/ui/CameraMugshotDialog.ui.h:1 msgid "Capture - Mugshot" msgstr "" #: ../data/ui/MugshotWindow.ui.h:1 msgid "Preview" msgstr "" #: ../data/ui/MugshotWindow.ui.h:2 msgid "Center" msgstr "Erdian" #: ../data/ui/MugshotWindow.ui.h:3 msgid "Left" msgstr "Ezkerrean" #: ../data/ui/MugshotWindow.ui.h:4 msgid "Right" msgstr "Eskuinean" #: ../data/ui/MugshotWindow.ui.h:5 msgid "Crop" msgstr "" #: ../data/ui/MugshotWindow.ui.h:6 msgid "Select from stock…" msgstr "" #: ../data/ui/MugshotWindow.ui.h:7 msgid "Capture from camera…" msgstr "" #: ../data/ui/MugshotWindow.ui.h:8 msgid "Browse…" msgstr "" #: ../data/ui/MugshotWindow.ui.h:9 ../mugshot/MugshotWindow.py:588 msgid "Mugshot" msgstr "" #: ../data/ui/MugshotWindow.ui.h:10 msgid "First Name" msgstr "" #: ../data/ui/MugshotWindow.ui.h:11 msgid "Last Name" msgstr "" #: ../data/ui/MugshotWindow.ui.h:12 msgid "Initials" msgstr "" #: ../data/ui/MugshotWindow.ui.h:13 msgid "Home Phone" msgstr "" #: ../data/ui/MugshotWindow.ui.h:14 msgid "Email Address" msgstr "" #: ../data/ui/MugshotWindow.ui.h:15 msgid "Office Phone" msgstr "" #: ../data/ui/MugshotWindow.ui.h:16 msgid "Fax" msgstr "" #: ../data/ui/MugshotWindow.ui.h:17 msgid "Select a photo…" msgstr "" #: ../mugshot/__init__.py:35 msgid "Show debug messages (-vv debugs mugshot_lib also)" msgstr "" #: ../mugshot/CameraMugshotDialog.py:107 #, python-format msgid "Camera failed to load. Devices: %s" msgstr "" #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:125 msgid "" "Sorry, but your camera\n" "failed to initialize." msgstr "" #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:132 msgid "" "Please wait while your\n" "camera is initialized." msgstr "" #: ../mugshot/CameraMugshotDialog.py:152 msgid "Cannot display camera output. Ignoring play command" msgstr "" #. Set the record button to retry, and disable it until the capture #. finishes. #: ../mugshot/CameraMugshotDialog.py:279 msgid "Retry" msgstr "Saiatu berriz" #: ../mugshot/MugshotWindow.py:321 msgid "Authentication cancelled." msgstr "" #: ../mugshot/MugshotWindow.py:324 msgid "Authentication failed." msgstr "" #: ../mugshot/MugshotWindow.py:327 msgid "An error occurred when saving changes." msgstr "" #: ../mugshot/MugshotWindow.py:329 msgid "User details were not updated." msgstr "" #: ../mugshot/MugshotWindow.py:498 msgid "Update Pidgin buddy icon?" msgstr "" #: ../mugshot/MugshotWindow.py:499 msgid "Would you also like to update your Pidgin buddy icon?" msgstr "" #: ../mugshot/MugshotWindow.py:589 msgid "Enter your password to change user details." msgstr "" #: ../mugshot/MugshotWindow.py:591 msgid "" "This is a security measure to prevent unwanted updates\n" "to your personal information." msgstr "" #: ../mugshot/MugshotWindow.py:796 msgid "Update LibreOffice user details?" msgstr "" #: ../mugshot/MugshotWindow.py:797 msgid "Would you also like to update your user details in LibreOffice?" msgstr "" #: ../mugshot_lib/SudoDialog.py:122 msgid "Password Required" msgstr "" #: ../mugshot_lib/SudoDialog.py:159 msgid "Incorrect password... try again." msgstr "" #: ../mugshot_lib/SudoDialog.py:169 msgid "Password:" msgstr "" #. Buttons #: ../mugshot_lib/SudoDialog.py:180 msgid "Cancel" msgstr "" #: ../mugshot_lib/SudoDialog.py:183 msgid "OK" msgstr "" #: ../mugshot_lib/SudoDialog.py:204 msgid "" "Enter your password to\n" "perform administrative tasks." msgstr "" #: ../mugshot_lib/SudoDialog.py:206 #, python-format msgid "" "The application '%s' lets you\n" "modify essential parts of your system." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:1 msgid "Lightweight user configuration" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:2 msgid "" "Mugshot enables users to easily update personal contact information. With " "Mugshot, users are able to:" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:3 msgid "" "Set the account photo displayed at login and optionally synchronize this " "photo with their Pidgin buddy icon" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:4 msgid "" "Set account details stored in /etc/passwd (usable with the finger command) " "and optionally synchronize with their LibreOffice contact information" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:5 msgid "" "This stable release improves Mugshot functionality for LDAP users, and " "includes the latest SudoDialog, improving the appearance and usability of " "the password dialog." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:6 msgid "" "This stable release improves the user configuration (chfn) backend and " "prevents Mugshot from locking up. Mugshot also no longer depends on " "AccountsService, but can leverage it to better support some systems. A " "critical bug that prevented some users from starting Mugshot was also " "addressed." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:7 msgid "" "This stable release improved AccountsService functionality and overall " "usability. Users without admin rights can no longer attempt to change their " "name, and initials are automatically populated when the name is entered." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:8 msgid "" "This stable release fixed a crash that occured when saving user details in a " "non-English locale. This release also included an updated translation " "template and new translations." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:9 msgid "" "This stable release fixed several bugs related to profile image management, " "introduced an improved password dialog, and transitioned to using GLib to " "more reliably determine user and environment settings." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:10 msgid "" "The first stable release introduced simplified packaging, replaced the Help " "functionality with the online help documents, and transitioned to using " "Python 3." msgstr "" mugshot-0.2.5/po/ru.po0000664000175000017500000002146312401206244014511 0ustar seansean00000000000000# Russian translation for mugshot # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the mugshot package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: mugshot\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2014-08-31 21:40-0400\n" "PO-Revision-Date: 2014-03-04 18:28+0000\n" "Last-Translator: Sergey Shlyapugin \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2014-09-01 07:34+0000\n" "X-Generator: Launchpad (build 17176)\n" #: ../mugshot.desktop.in.h:1 msgid "About Me" msgstr "Обо мне" #: ../mugshot.desktop.in.h:2 msgid "Configure your profile image and contact details" msgstr "Настроить изображение профиля и контактную информацию" #: ../data/ui/CameraMugshotDialog.ui.h:1 msgid "Capture - Mugshot" msgstr "Захват - Mugshot" #: ../data/ui/MugshotWindow.ui.h:1 msgid "Preview" msgstr "Предварительный просмотр" #: ../data/ui/MugshotWindow.ui.h:2 msgid "Center" msgstr "По центру" #: ../data/ui/MugshotWindow.ui.h:3 msgid "Left" msgstr "Слева" #: ../data/ui/MugshotWindow.ui.h:4 msgid "Right" msgstr "Справа" #: ../data/ui/MugshotWindow.ui.h:5 msgid "Crop" msgstr "Обрезать" #: ../data/ui/MugshotWindow.ui.h:6 msgid "Select from stock…" msgstr "Выбрать из набора..." #: ../data/ui/MugshotWindow.ui.h:7 msgid "Capture from camera…" msgstr "Захватить с камеры..." #: ../data/ui/MugshotWindow.ui.h:8 msgid "Browse…" msgstr "Обзор…" #: ../data/ui/MugshotWindow.ui.h:9 ../mugshot/MugshotWindow.py:588 msgid "Mugshot" msgstr "Mugshot" #: ../data/ui/MugshotWindow.ui.h:10 msgid "First Name" msgstr "Имя" #: ../data/ui/MugshotWindow.ui.h:11 msgid "Last Name" msgstr "Фамилия" #: ../data/ui/MugshotWindow.ui.h:12 msgid "Initials" msgstr "Инициалы" #: ../data/ui/MugshotWindow.ui.h:13 msgid "Home Phone" msgstr "Домашний телефон" #: ../data/ui/MugshotWindow.ui.h:14 msgid "Email Address" msgstr "Электронная почта" #: ../data/ui/MugshotWindow.ui.h:15 msgid "Office Phone" msgstr "Рабочий телефон" #: ../data/ui/MugshotWindow.ui.h:16 msgid "Fax" msgstr "Факс" #: ../data/ui/MugshotWindow.ui.h:17 msgid "Select a photo…" msgstr "Выбрать фото..." #: ../mugshot/__init__.py:35 msgid "Show debug messages (-vv debugs mugshot_lib also)" msgstr "Показывать сообщения отладки (-vv покажет сообщения mugshot_lib)" #: ../mugshot/CameraMugshotDialog.py:107 #, python-format msgid "Camera failed to load. Devices: %s" msgstr "Ошибка загрузки камеры. Устройства: %s" #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:125 msgid "" "Sorry, but your camera\n" "failed to initialize." msgstr "" "Приносим извинения, но\n" "инициализировать вашу\n" "камеру не удалось." #. Translators: Please include newlines, as required to fit the message. #: ../mugshot/CameraMugshotDialog.py:132 msgid "" "Please wait while your\n" "camera is initialized." msgstr "Идет инициализация камеры. Пожалуйста, подождите..." #: ../mugshot/CameraMugshotDialog.py:152 msgid "Cannot display camera output. Ignoring play command" msgstr "" #. Set the record button to retry, and disable it until the capture #. finishes. #: ../mugshot/CameraMugshotDialog.py:279 msgid "Retry" msgstr "Повторить" #: ../mugshot/MugshotWindow.py:321 msgid "Authentication cancelled." msgstr "" #: ../mugshot/MugshotWindow.py:324 msgid "Authentication failed." msgstr "" #: ../mugshot/MugshotWindow.py:327 msgid "An error occurred when saving changes." msgstr "" #: ../mugshot/MugshotWindow.py:329 msgid "User details were not updated." msgstr "Данные пользователя не были обновлены." #: ../mugshot/MugshotWindow.py:498 msgid "Update Pidgin buddy icon?" msgstr "Обновить аватар в Pidgin?" #: ../mugshot/MugshotWindow.py:499 msgid "Would you also like to update your Pidgin buddy icon?" msgstr "Обновить также ваш аватар в Pidgin?" #: ../mugshot/MugshotWindow.py:589 msgid "Enter your password to change user details." msgstr "Введите ваг пароль для изменения данных пользователя." #: ../mugshot/MugshotWindow.py:591 msgid "" "This is a security measure to prevent unwanted updates\n" "to your personal information." msgstr "" "Это мера безопасности для предотвращения нежелательных\n" "обновлений вашей персональной информации." #: ../mugshot/MugshotWindow.py:796 msgid "Update LibreOffice user details?" msgstr "Обновить данные пользователя в LibreOffice?" #: ../mugshot/MugshotWindow.py:797 msgid "Would you also like to update your user details in LibreOffice?" msgstr "Обновить также ваши данные пользователя в LibreOffice?" #: ../mugshot_lib/SudoDialog.py:122 msgid "Password Required" msgstr "" #: ../mugshot_lib/SudoDialog.py:159 msgid "Incorrect password... try again." msgstr "Неверный пароль... Попробуйте еще." #: ../mugshot_lib/SudoDialog.py:169 msgid "Password:" msgstr "Пароль:" #. Buttons #: ../mugshot_lib/SudoDialog.py:180 msgid "Cancel" msgstr "Отмена" #: ../mugshot_lib/SudoDialog.py:183 msgid "OK" msgstr "OK" #: ../mugshot_lib/SudoDialog.py:204 msgid "" "Enter your password to\n" "perform administrative tasks." msgstr "" "Введите ваш пароль для выполнения\n" "административных задач." #: ../mugshot_lib/SudoDialog.py:206 #, python-format msgid "" "The application '%s' lets you\n" "modify essential parts of your system." msgstr "" "Приложения %s' позволит вам\n" "модифицировать серьезную часть системы." #: ../data/appdata/mugshot.appdata.xml.in.h:1 msgid "Lightweight user configuration" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:2 msgid "" "Mugshot enables users to easily update personal contact information. With " "Mugshot, users are able to:" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:3 msgid "" "Set the account photo displayed at login and optionally synchronize this " "photo with their Pidgin buddy icon" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:4 msgid "" "Set account details stored in /etc/passwd (usable with the finger command) " "and optionally synchronize with their LibreOffice contact information" msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:5 msgid "" "This stable release improves Mugshot functionality for LDAP users, and " "includes the latest SudoDialog, improving the appearance and usability of " "the password dialog." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:6 msgid "" "This stable release improves the user configuration (chfn) backend and " "prevents Mugshot from locking up. Mugshot also no longer depends on " "AccountsService, but can leverage it to better support some systems. A " "critical bug that prevented some users from starting Mugshot was also " "addressed." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:7 msgid "" "This stable release improved AccountsService functionality and overall " "usability. Users without admin rights can no longer attempt to change their " "name, and initials are automatically populated when the name is entered." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:8 msgid "" "This stable release fixed a crash that occured when saving user details in a " "non-English locale. This release also included an updated translation " "template and new translations." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:9 msgid "" "This stable release fixed several bugs related to profile image management, " "introduced an improved password dialog, and transitioned to using GLib to " "more reliably determine user and environment settings." msgstr "" #: ../data/appdata/mugshot.appdata.xml.in.h:10 msgid "" "The first stable release introduced simplified packaging, replaced the Help " "functionality with the online help documents, and transitioned to using " "Python 3." msgstr "" #~ msgid "Cannot display camera output.Ignoring play command" #~ msgstr "Невозможно показать вывод камеры. Игнорирование команды проигрывания" mugshot-0.2.5/AUTHORS0000664000175000017500000000034612401206244014152 0ustar seansean00000000000000Copyright (C) 2013-2014 Sean Davis Artwork Copyright (C) 2013-2014 Simon Steinbeiß Camera functionality based on web_cam_box Copyright (C) 2010 Rick Spencer mugshot-0.2.5/COPYING0000664000175000017500000010451312401206244014136 0ustar seansean00000000000000 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 .